xref: /petsc/src/ksp/pc/impls/sor/sor.c (revision 29c1d7e0c8ee034336f40d6bb7e2e7cf2637a76b)
1dba47a55SKris Buschelman #define PETSCKSP_DLL
2dba47a55SKris Buschelman 
34b9ad928SBarry Smith /*
44b9ad928SBarry Smith    Defines a  (S)SOR  preconditioner for any Mat implementation
54b9ad928SBarry Smith */
66356e834SBarry Smith #include "private/pcimpl.h"               /*I "petscpc.h" I*/
74b9ad928SBarry Smith 
84b9ad928SBarry Smith typedef struct {
9c1ac3661SBarry Smith   PetscInt    its;        /* inner iterations, number of sweeps */
10c1ac3661SBarry Smith   PetscInt    lits;       /* local inner iterations, number of sweeps applied by the local matrix mat->A */
114b9ad928SBarry Smith   MatSORType  sym;        /* forward, reverse, symmetric etc. */
124b9ad928SBarry Smith   PetscReal   omega;
13*29c1d7e0SHong Zhang   PetscReal   fshift;
144b9ad928SBarry Smith } PC_SOR;
154b9ad928SBarry Smith 
164b9ad928SBarry Smith #undef __FUNCT__
174b9ad928SBarry Smith #define __FUNCT__ "PCDestroy_SOR"
186849ba73SBarry Smith static PetscErrorCode PCDestroy_SOR(PC pc)
194b9ad928SBarry Smith {
204b9ad928SBarry Smith   PC_SOR         *jac = (PC_SOR*)pc->data;
21dfbe8321SBarry Smith   PetscErrorCode ierr;
224b9ad928SBarry Smith 
234b9ad928SBarry Smith   PetscFunctionBegin;
244b9ad928SBarry Smith   ierr = PetscFree(jac);CHKERRQ(ierr);
254b9ad928SBarry Smith   PetscFunctionReturn(0);
264b9ad928SBarry Smith }
274b9ad928SBarry Smith 
284b9ad928SBarry Smith #undef __FUNCT__
294b9ad928SBarry Smith #define __FUNCT__ "PCApply_SOR"
306849ba73SBarry Smith static PetscErrorCode PCApply_SOR(PC pc,Vec x,Vec y)
314b9ad928SBarry Smith {
324b9ad928SBarry Smith   PC_SOR         *jac = (PC_SOR*)pc->data;
33dfbe8321SBarry Smith   PetscErrorCode ierr;
34c1ac3661SBarry Smith   PetscInt       flag = jac->sym | SOR_ZERO_INITIAL_GUESS;
354b9ad928SBarry Smith 
364b9ad928SBarry Smith   PetscFunctionBegin;
3796fc60bcSBarry Smith   ierr = MatRelax(pc->pmat,x,jac->omega,(MatSORType)flag,jac->fshift,jac->its,jac->lits,y);CHKERRQ(ierr);
384b9ad928SBarry Smith   PetscFunctionReturn(0);
394b9ad928SBarry Smith }
404b9ad928SBarry Smith 
414b9ad928SBarry Smith #undef __FUNCT__
424b9ad928SBarry Smith #define __FUNCT__ "PCApplyRichardson_SOR"
4370441072SBarry Smith static PetscErrorCode PCApplyRichardson_SOR(PC pc,Vec b,Vec y,Vec w,PetscReal rtol,PetscReal abstol, PetscReal dtol,PetscInt its)
444b9ad928SBarry Smith {
454b9ad928SBarry Smith   PC_SOR         *jac = (PC_SOR*)pc->data;
46dfbe8321SBarry Smith   PetscErrorCode ierr;
474b9ad928SBarry Smith 
484b9ad928SBarry Smith   PetscFunctionBegin;
49ae15b995SBarry Smith   ierr = PetscInfo1(pc,"Warning, convergence critera ignored, using %D iterations\n",its);CHKERRQ(ierr);
504b9ad928SBarry Smith   its  = its*jac->its;
5196fc60bcSBarry Smith   ierr = MatRelax(pc->pmat,b,jac->omega,(MatSORType)jac->sym,jac->fshift,its,jac->lits,y);CHKERRQ(ierr);
524b9ad928SBarry Smith   PetscFunctionReturn(0);
534b9ad928SBarry Smith }
544b9ad928SBarry Smith 
554b9ad928SBarry Smith #undef __FUNCT__
564b9ad928SBarry Smith #define __FUNCT__ "PCSetFromOptions_SOR"
57dfbe8321SBarry Smith PetscErrorCode PCSetFromOptions_SOR(PC pc)
584b9ad928SBarry Smith {
594b9ad928SBarry Smith   PC_SOR         *jac = (PC_SOR*)pc->data;
60dfbe8321SBarry Smith   PetscErrorCode ierr;
614b9ad928SBarry Smith   PetscTruth     flg;
624b9ad928SBarry Smith 
634b9ad928SBarry Smith   PetscFunctionBegin;
644b9ad928SBarry Smith   ierr = PetscOptionsHead("(S)SOR options");CHKERRQ(ierr);
654b9ad928SBarry Smith     ierr = PetscOptionsReal("-pc_sor_omega","relaxation factor (0 < omega < 2)","PCSORSetOmega",jac->omega,&jac->omega,0);CHKERRQ(ierr);
6696fc60bcSBarry Smith     ierr = PetscOptionsReal("-pc_sor_diagonal_shift","Add to the diagonal entries","",jac->fshift,&jac->fshift,0);CHKERRQ(ierr);
674b9ad928SBarry Smith     ierr = PetscOptionsInt("-pc_sor_its","number of inner SOR iterations","PCSORSetIterations",jac->its,&jac->its,0);CHKERRQ(ierr);
684b9ad928SBarry Smith     ierr = PetscOptionsInt("-pc_sor_lits","number of local inner SOR iterations","PCSORSetIterations",jac->lits,&jac->lits,0);CHKERRQ(ierr);
694dc4c822SBarry Smith     ierr = PetscOptionsTruthGroupBegin("-pc_sor_symmetric","SSOR, not SOR","PCSORSetSymmetric",&flg);CHKERRQ(ierr);
704b9ad928SBarry Smith     if (flg) {ierr = PCSORSetSymmetric(pc,SOR_SYMMETRIC_SWEEP);CHKERRQ(ierr);}
714dc4c822SBarry Smith     ierr = PetscOptionsTruthGroup("-pc_sor_backward","use backward sweep instead of forward","PCSORSetSymmetric",&flg);CHKERRQ(ierr);
724b9ad928SBarry Smith     if (flg) {ierr = PCSORSetSymmetric(pc,SOR_BACKWARD_SWEEP);CHKERRQ(ierr);}
73a9510f2eSBarry Smith     ierr = PetscOptionsTruthGroup("-pc_sor_forward","use forward sweep","PCSORSetSymmetric",&flg);CHKERRQ(ierr);
74a9510f2eSBarry Smith     if (flg) {ierr = PCSORSetSymmetric(pc,SOR_FORWARD_SWEEP);CHKERRQ(ierr);}
75a8c7a070SBarry Smith     ierr = PetscOptionsTruthGroup("-pc_sor_local_symmetric","use SSOR separately on each processor","PCSORSetSymmetric",&flg);CHKERRQ(ierr);
764b9ad928SBarry Smith     if (flg) {ierr = PCSORSetSymmetric(pc,SOR_LOCAL_SYMMETRIC_SWEEP);CHKERRQ(ierr);}
774dc4c822SBarry Smith     ierr = PetscOptionsTruthGroup("-pc_sor_local_backward","use backward sweep locally","PCSORSetSymmetric",&flg);CHKERRQ(ierr);
784b9ad928SBarry Smith     if (flg) {ierr = PCSORSetSymmetric(pc,SOR_LOCAL_BACKWARD_SWEEP);CHKERRQ(ierr);}
794dc4c822SBarry Smith     ierr = PetscOptionsTruthGroupEnd("-pc_sor_local_forward","use forward sweep locally","PCSORSetSymmetric",&flg);CHKERRQ(ierr);
804b9ad928SBarry Smith     if (flg) {ierr = PCSORSetSymmetric(pc,SOR_LOCAL_FORWARD_SWEEP);CHKERRQ(ierr);}
814b9ad928SBarry Smith   ierr = PetscOptionsTail();CHKERRQ(ierr);
824b9ad928SBarry Smith   PetscFunctionReturn(0);
834b9ad928SBarry Smith }
844b9ad928SBarry Smith 
854b9ad928SBarry Smith #undef __FUNCT__
864b9ad928SBarry Smith #define __FUNCT__ "PCView_SOR"
87dfbe8321SBarry Smith PetscErrorCode PCView_SOR(PC pc,PetscViewer viewer)
884b9ad928SBarry Smith {
894b9ad928SBarry Smith   PC_SOR         *jac = (PC_SOR*)pc->data;
904b9ad928SBarry Smith   MatSORType     sym = jac->sym;
912fc52814SBarry Smith   const char     *sortype;
92dfbe8321SBarry Smith   PetscErrorCode ierr;
9332077d6dSBarry Smith   PetscTruth     iascii;
944b9ad928SBarry Smith 
954b9ad928SBarry Smith   PetscFunctionBegin;
9632077d6dSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr);
9732077d6dSBarry Smith   if (iascii) {
984b9ad928SBarry Smith     if (sym & SOR_ZERO_INITIAL_GUESS) {ierr = PetscViewerASCIIPrintf(viewer,"  SOR:  zero initial guess\n");CHKERRQ(ierr);}
994b9ad928SBarry Smith     if (sym == SOR_APPLY_UPPER)              sortype = "apply_upper";
1004b9ad928SBarry Smith     else if (sym == SOR_APPLY_LOWER)         sortype = "apply_lower";
1014b9ad928SBarry Smith     else if (sym & SOR_EISENSTAT)            sortype = "Eisenstat";
1024b9ad928SBarry Smith     else if ((sym & SOR_SYMMETRIC_SWEEP) == SOR_SYMMETRIC_SWEEP)
1034b9ad928SBarry Smith                                              sortype = "symmetric";
1044b9ad928SBarry Smith     else if (sym & SOR_BACKWARD_SWEEP)       sortype = "backward";
1054b9ad928SBarry Smith     else if (sym & SOR_FORWARD_SWEEP)        sortype = "forward";
1064b9ad928SBarry Smith     else if ((sym & SOR_LOCAL_SYMMETRIC_SWEEP) == SOR_LOCAL_SYMMETRIC_SWEEP)
1074b9ad928SBarry Smith                                              sortype = "local_symmetric";
1084b9ad928SBarry Smith     else if (sym & SOR_LOCAL_FORWARD_SWEEP)  sortype = "local_forward";
1094b9ad928SBarry Smith     else if (sym & SOR_LOCAL_BACKWARD_SWEEP) sortype = "local_backward";
1104b9ad928SBarry Smith     else                                     sortype = "unknown";
111a83599f4SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  SOR: type = %s, iterations = %D, omega = %G\n",sortype,jac->its,jac->omega);CHKERRQ(ierr);
1124b9ad928SBarry Smith   } else {
11379a5c55eSBarry Smith     SETERRQ1(PETSC_ERR_SUP,"Viewer type %s not supported for PCSOR",((PetscObject)viewer)->type_name);
1144b9ad928SBarry Smith   }
1154b9ad928SBarry Smith   PetscFunctionReturn(0);
1164b9ad928SBarry Smith }
1174b9ad928SBarry Smith 
1184b9ad928SBarry Smith 
1194b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/
1204b9ad928SBarry Smith EXTERN_C_BEGIN
1214b9ad928SBarry Smith #undef __FUNCT__
1224b9ad928SBarry Smith #define __FUNCT__ "PCSORSetSymmetric_SOR"
123dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCSORSetSymmetric_SOR(PC pc,MatSORType flag)
1244b9ad928SBarry Smith {
1254b9ad928SBarry Smith   PC_SOR *jac;
1264b9ad928SBarry Smith 
1274b9ad928SBarry Smith   PetscFunctionBegin;
1284b9ad928SBarry Smith   jac = (PC_SOR*)pc->data;
1294b9ad928SBarry Smith   jac->sym = flag;
1304b9ad928SBarry Smith   PetscFunctionReturn(0);
1314b9ad928SBarry Smith }
1324b9ad928SBarry Smith EXTERN_C_END
1334b9ad928SBarry Smith 
1344b9ad928SBarry Smith EXTERN_C_BEGIN
1354b9ad928SBarry Smith #undef __FUNCT__
1364b9ad928SBarry Smith #define __FUNCT__ "PCSORSetOmega_SOR"
137dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCSORSetOmega_SOR(PC pc,PetscReal omega)
1384b9ad928SBarry Smith {
1394b9ad928SBarry Smith   PC_SOR *jac;
1404b9ad928SBarry Smith 
1414b9ad928SBarry Smith   PetscFunctionBegin;
1424b9ad928SBarry Smith   if (omega >= 2.0 || omega <= 0.0) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Relaxation out of range");
1434b9ad928SBarry Smith   jac        = (PC_SOR*)pc->data;
1444b9ad928SBarry Smith   jac->omega = omega;
1454b9ad928SBarry Smith   PetscFunctionReturn(0);
1464b9ad928SBarry Smith }
1474b9ad928SBarry Smith EXTERN_C_END
1484b9ad928SBarry Smith 
1494b9ad928SBarry Smith EXTERN_C_BEGIN
1504b9ad928SBarry Smith #undef __FUNCT__
1514b9ad928SBarry Smith #define __FUNCT__ "PCSORSetIterations_SOR"
152dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCSORSetIterations_SOR(PC pc,PetscInt its,PetscInt lits)
1534b9ad928SBarry Smith {
1544b9ad928SBarry Smith   PC_SOR *jac;
1554b9ad928SBarry Smith 
1564b9ad928SBarry Smith   PetscFunctionBegin;
1574b9ad928SBarry Smith   jac      = (PC_SOR*)pc->data;
1584b9ad928SBarry Smith   jac->its = its;
1594b9ad928SBarry Smith   jac->lits = lits;
1604b9ad928SBarry Smith   PetscFunctionReturn(0);
1614b9ad928SBarry Smith }
1624b9ad928SBarry Smith EXTERN_C_END
1634b9ad928SBarry Smith 
1644b9ad928SBarry Smith /* ------------------------------------------------------------------------------*/
1654b9ad928SBarry Smith #undef __FUNCT__
1664b9ad928SBarry Smith #define __FUNCT__ "PCSORSetSymmetric"
1674b9ad928SBarry Smith /*@
1684b9ad928SBarry Smith    PCSORSetSymmetric - Sets the SOR preconditioner to use symmetric (SSOR),
1694b9ad928SBarry Smith    backward, or forward relaxation.  The local variants perform SOR on
1704b9ad928SBarry Smith    each processor.  By default forward relaxation is used.
1714b9ad928SBarry Smith 
1724b9ad928SBarry Smith    Collective on PC
1734b9ad928SBarry Smith 
1744b9ad928SBarry Smith    Input Parameters:
1754b9ad928SBarry Smith +  pc - the preconditioner context
1764b9ad928SBarry Smith -  flag - one of the following
1774b9ad928SBarry Smith .vb
1784b9ad928SBarry Smith     SOR_FORWARD_SWEEP
1794b9ad928SBarry Smith     SOR_BACKWARD_SWEEP
1804b9ad928SBarry Smith     SOR_SYMMETRIC_SWEEP
1814b9ad928SBarry Smith     SOR_LOCAL_FORWARD_SWEEP
1824b9ad928SBarry Smith     SOR_LOCAL_BACKWARD_SWEEP
1834b9ad928SBarry Smith     SOR_LOCAL_SYMMETRIC_SWEEP
1844b9ad928SBarry Smith .ve
1854b9ad928SBarry Smith 
1864b9ad928SBarry Smith    Options Database Keys:
1874b9ad928SBarry Smith +  -pc_sor_symmetric - Activates symmetric version
1884b9ad928SBarry Smith .  -pc_sor_backward - Activates backward version
1894b9ad928SBarry Smith .  -pc_sor_local_forward - Activates local forward version
1904b9ad928SBarry Smith .  -pc_sor_local_symmetric - Activates local symmetric version
1914b9ad928SBarry Smith -  -pc_sor_local_backward - Activates local backward version
1924b9ad928SBarry Smith 
1934b9ad928SBarry Smith    Notes:
1944b9ad928SBarry Smith    To use the Eisenstat trick with SSOR, employ the PCEISENSTAT preconditioner,
1954b9ad928SBarry Smith    which can be chosen with the option
1964b9ad928SBarry Smith .  -pc_type eisenstat - Activates Eisenstat trick
1974b9ad928SBarry Smith 
1984b9ad928SBarry Smith    Level: intermediate
1994b9ad928SBarry Smith 
2004b9ad928SBarry Smith .keywords: PC, SOR, SSOR, set, relaxation, sweep, forward, backward, symmetric
2014b9ad928SBarry Smith 
2024b9ad928SBarry Smith .seealso: PCEisenstatSetOmega(), PCSORSetIterations(), PCSORSetOmega()
2034b9ad928SBarry Smith @*/
204dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCSORSetSymmetric(PC pc,MatSORType flag)
2054b9ad928SBarry Smith {
206dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,MatSORType);
2074b9ad928SBarry Smith 
2084b9ad928SBarry Smith   PetscFunctionBegin;
2094482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
2104b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCSORSetSymmetric_C",(void (**)(void))&f);CHKERRQ(ierr);
2114b9ad928SBarry Smith   if (f) {
2124b9ad928SBarry Smith     ierr = (*f)(pc,flag);CHKERRQ(ierr);
2134b9ad928SBarry Smith   }
2144b9ad928SBarry Smith   PetscFunctionReturn(0);
2154b9ad928SBarry Smith }
2164b9ad928SBarry Smith 
2174b9ad928SBarry Smith #undef __FUNCT__
2184b9ad928SBarry Smith #define __FUNCT__ "PCSORSetOmega"
2194b9ad928SBarry Smith /*@
2204b9ad928SBarry Smith    PCSORSetOmega - Sets the SOR relaxation coefficient, omega
2214b9ad928SBarry Smith    (where omega = 1.0 by default).
2224b9ad928SBarry Smith 
2234b9ad928SBarry Smith    Collective on PC
2244b9ad928SBarry Smith 
2254b9ad928SBarry Smith    Input Parameters:
2264b9ad928SBarry Smith +  pc - the preconditioner context
2274b9ad928SBarry Smith -  omega - relaxation coefficient (0 < omega < 2).
2284b9ad928SBarry Smith 
2294b9ad928SBarry Smith    Options Database Key:
2304b9ad928SBarry Smith .  -pc_sor_omega <omega> - Sets omega
2314b9ad928SBarry Smith 
2324b9ad928SBarry Smith    Level: intermediate
2334b9ad928SBarry Smith 
2344b9ad928SBarry Smith .keywords: PC, SOR, SSOR, set, relaxation, omega
2354b9ad928SBarry Smith 
2364b9ad928SBarry Smith .seealso: PCSORSetSymmetric(), PCSORSetIterations(), PCEisenstatSetOmega()
2374b9ad928SBarry Smith @*/
238dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCSORSetOmega(PC pc,PetscReal omega)
2394b9ad928SBarry Smith {
240dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscReal);
2414b9ad928SBarry Smith 
2424b9ad928SBarry Smith   PetscFunctionBegin;
2434b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCSORSetOmega_C",(void (**)(void))&f);CHKERRQ(ierr);
2444b9ad928SBarry Smith   if (f) {
2454b9ad928SBarry Smith     ierr = (*f)(pc,omega);CHKERRQ(ierr);
2464b9ad928SBarry Smith   }
2474b9ad928SBarry Smith   PetscFunctionReturn(0);
2484b9ad928SBarry Smith }
2494b9ad928SBarry Smith 
2504b9ad928SBarry Smith #undef __FUNCT__
2514b9ad928SBarry Smith #define __FUNCT__ "PCSORSetIterations"
2524b9ad928SBarry Smith /*@
2534b9ad928SBarry Smith    PCSORSetIterations - Sets the number of inner iterations to
2544b9ad928SBarry Smith    be used by the SOR preconditioner. The default is 1.
2554b9ad928SBarry Smith 
2564b9ad928SBarry Smith    Collective on PC
2574b9ad928SBarry Smith 
2584b9ad928SBarry Smith    Input Parameters:
2594b9ad928SBarry Smith +  pc - the preconditioner context
2604b9ad928SBarry Smith .  lits - number of local iterations, smoothings over just variables on processor
2614b9ad928SBarry Smith -  its - number of parallel iterations to use; each parallel iteration has lits local iterations
2624b9ad928SBarry Smith 
2634b9ad928SBarry Smith    Options Database Key:
2644b9ad928SBarry Smith +  -pc_sor_its <its> - Sets number of iterations
2654b9ad928SBarry Smith -  -pc_sor_lits <lits> - Sets number of local iterations
2664b9ad928SBarry Smith 
2674b9ad928SBarry Smith    Level: intermediate
2684b9ad928SBarry Smith 
2694b9ad928SBarry Smith    Notes: When run on one processor the number of smoothings is lits*its
2704b9ad928SBarry Smith 
2714b9ad928SBarry Smith .keywords: PC, SOR, SSOR, set, iterations
2724b9ad928SBarry Smith 
2734b9ad928SBarry Smith .seealso: PCSORSetOmega(), PCSORSetSymmetric()
2744b9ad928SBarry Smith @*/
275dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCSORSetIterations(PC pc,PetscInt its,PetscInt lits)
2764b9ad928SBarry Smith {
277c1ac3661SBarry Smith   PetscErrorCode ierr,(*f)(PC,PetscInt,PetscInt);
2784b9ad928SBarry Smith 
2794b9ad928SBarry Smith   PetscFunctionBegin;
2804482741eSBarry Smith   PetscValidHeaderSpecific(pc,PC_COOKIE,1);
2814b9ad928SBarry Smith   ierr = PetscObjectQueryFunction((PetscObject)pc,"PCSORSetIterations_C",(void (**)(void))&f);CHKERRQ(ierr);
2824b9ad928SBarry Smith   if (f) {
2834b9ad928SBarry Smith     ierr = (*f)(pc,its,lits);CHKERRQ(ierr);
2844b9ad928SBarry Smith   }
2854b9ad928SBarry Smith   PetscFunctionReturn(0);
2864b9ad928SBarry Smith }
2874b9ad928SBarry Smith 
2884b9ad928SBarry Smith /*MC
2894b9ad928SBarry Smith      PCSOR - (S)SOR (successive over relaxation, Gauss-Seidel) preconditioning
2904b9ad928SBarry Smith 
2914b9ad928SBarry Smith    Options Database Keys:
2924b9ad928SBarry Smith +  -pc_sor_symmetric - Activates symmetric version
2934b9ad928SBarry Smith .  -pc_sor_backward - Activates backward version
294a9510f2eSBarry Smith .  -pc_sor_forward - Activates forward version
2954b9ad928SBarry Smith .  -pc_sor_local_forward - Activates local forward version
296a9510f2eSBarry Smith .  -pc_sor_local_symmetric - Activates local symmetric version  (default version)
2974b9ad928SBarry Smith .  -pc_sor_local_backward - Activates local backward version
2984b9ad928SBarry Smith .  -pc_sor_omega <omega> - Sets omega
299a9510f2eSBarry Smith .  -pc_sor_its <its> - Sets number of iterations   (default 1)
300a9510f2eSBarry Smith -  -pc_sor_lits <lits> - Sets number of local iterations  (default 1)
3014b9ad928SBarry Smith 
3024b9ad928SBarry Smith    Level: beginner
3034b9ad928SBarry Smith 
3044b9ad928SBarry Smith   Concepts: SOR, preconditioners, Gauss-Seidel
3054b9ad928SBarry Smith 
30637a17b4dSBarry Smith    Notes: Only implemented for the AIJ  and SeqBAIJ matrix formats.
3074b9ad928SBarry Smith           Not a true parallel SOR, in parallel this implementation corresponds to block
3084b9ad928SBarry Smith           Jacobi with SOR on each block.
3094b9ad928SBarry Smith 
31037a17b4dSBarry Smith           For SeqBAIJ matrices this implements point-block SOR, but the omega, its, lits options are not supported.
31137a17b4dSBarry Smith 
3124b9ad928SBarry Smith .seealso:  PCCreate(), PCSetType(), PCType (for list of available types), PC,
3134b9ad928SBarry Smith            PCSORSetIterations(), PCSORSetSymmetric(), PCSORSetOmega(), PCEISENSTAT
3144b9ad928SBarry Smith M*/
3154b9ad928SBarry Smith 
3164b9ad928SBarry Smith EXTERN_C_BEGIN
3174b9ad928SBarry Smith #undef __FUNCT__
3184b9ad928SBarry Smith #define __FUNCT__ "PCCreate_SOR"
319dba47a55SKris Buschelman PetscErrorCode PETSCKSP_DLLEXPORT PCCreate_SOR(PC pc)
3204b9ad928SBarry Smith {
321dfbe8321SBarry Smith   PetscErrorCode ierr;
3224b9ad928SBarry Smith   PC_SOR         *jac;
3234b9ad928SBarry Smith 
3244b9ad928SBarry Smith   PetscFunctionBegin;
3254b9ad928SBarry Smith   ierr = PetscNew(PC_SOR,&jac);CHKERRQ(ierr);
32652e6d16bSBarry Smith   ierr = PetscLogObjectMemory(pc,sizeof(PC_SOR));CHKERRQ(ierr);
3274b9ad928SBarry Smith 
3284b9ad928SBarry Smith   pc->ops->apply           = PCApply_SOR;
3294b9ad928SBarry Smith   pc->ops->applyrichardson = PCApplyRichardson_SOR;
3304b9ad928SBarry Smith   pc->ops->setfromoptions  = PCSetFromOptions_SOR;
3314b9ad928SBarry Smith   pc->ops->setup           = 0;
3324b9ad928SBarry Smith   pc->ops->view            = PCView_SOR;
3334b9ad928SBarry Smith   pc->ops->destroy         = PCDestroy_SOR;
3344b9ad928SBarry Smith   pc->data                 = (void*)jac;
335d9bc8e36SBarry Smith   jac->sym                 = SOR_LOCAL_SYMMETRIC_SWEEP;
3364b9ad928SBarry Smith   jac->omega               = 1.0;
33796fc60bcSBarry Smith   jac->fshift              = 0.0;
3384b9ad928SBarry Smith   jac->its                 = 1;
3394b9ad928SBarry Smith   jac->lits                = 1;
3404b9ad928SBarry Smith 
3414b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCSORSetSymmetric_C","PCSORSetSymmetric_SOR",
3424b9ad928SBarry Smith                     PCSORSetSymmetric_SOR);CHKERRQ(ierr);
3434b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCSORSetOmega_C","PCSORSetOmega_SOR",
3444b9ad928SBarry Smith                     PCSORSetOmega_SOR);CHKERRQ(ierr);
3454b9ad928SBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)pc,"PCSORSetIterations_C","PCSORSetIterations_SOR",
3464b9ad928SBarry Smith                     PCSORSetIterations_SOR);CHKERRQ(ierr);
3474b9ad928SBarry Smith 
3484b9ad928SBarry Smith   PetscFunctionReturn(0);
3494b9ad928SBarry Smith }
3504b9ad928SBarry Smith EXTERN_C_END
3514b9ad928SBarry Smith 
3524b9ad928SBarry Smith 
3534b9ad928SBarry Smith 
3544b9ad928SBarry Smith 
3554b9ad928SBarry Smith 
356