IFPACK Development
Loading...
Searching...
No Matches
Ifpack_OverlapFactor.cpp
1/*@HEADER
2// ***********************************************************************
3//
4// Ifpack: Object-Oriented Algebraic Preconditioner Package
5// Copyright (2002) Sandia Corporation
6//
7// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8// license for use of this work by or on behalf of the U.S. Government.
9//
10// Redistribution and use in source and binary forms, with or without
11// modification, are permitted provided that the following conditions are
12// met:
13//
14// 1. Redistributions of source code must retain the above copyright
15// notice, this list of conditions and the following disclaimer.
16//
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// 3. Neither the name of the Corporation nor the names of the
22// contributors may be used to endorse or promote products derived from
23// this software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36//
37// Questions? Contact Michael A. Heroux (maherou@sandia.gov)
38//
39// ***********************************************************************
40//@HEADER
41*/
42
43#include "Ifpack_OverlapFactor.h"
44#include "Epetra_Comm.h"
45#include "Epetra_Map.h"
46#include "Epetra_CrsGraph.h"
47#include "Epetra_CrsMatrix.h"
48#include "Epetra_VbrMatrix.h"
49#include "Epetra_RowMatrix.h"
50#include "Epetra_Vector.h"
51#include "Epetra_MultiVector.h"
52
53//==============================================================================
54Ifpack_OverlapFactor::Ifpack_OverlapFactor(const Ifpack_OverlapGraph * OverlapGraph)
55 : Factored_(false),
56 Allocated_(false),
57 ValuesInitialized_(false),
58 OverlapGraph_(OverlapGraph),
59 UserMatrix_(0)
60{
61}
62//==============================================================================
63Ifpack_OverlapFactor::Ifpack_OverlapFactor(const Epetra_RowMatrix * UserMatrix)
64 : Factored_(false),
65 Allocated_(false),
66 ValuesInitialized_(false),
67 OverlapGraph_(0),
68 UserMatrix_(UserMatrix)
69{
70}
71//==============================================================================
72Ifpack_OverlapFactor::Ifpack_OverlapFactor(const Ifpack_OverlapFactor & Source)
73 : Factored_(Source.Factored_),
74 Allocated_(Source.Allocated_),
75 ValuesInitialized_(Source.ValuesInitialized_),
76 OverlapGraph_(Source.OverlapGraph_),
77 UserMatrix_(Source.UserMatrix_)
78{
79}
80//==============================================================================
81int Ifpack_OverlapFactor::InitValues(const Epetra_RowMatrix * UserMatrix) {
82
83
84 if (OverlapGraph_!=0) {
85
86 Epetra_CrsMatrix * CrsMatrix = dynamic_cast<Epetra_CrsMatrix *>(UserMatrix);
87 if (CrsMatrix!=0)
88 if (!Allocated()) EPETRA_CHK_ERR(-1); //Must be allocated
89 if (ValuesInitialized()) EPETRA_CHK_ERR(1); // Values already init'ed, warn caller
90
91 EPETRA_CHK_ERR(DerivedFactor()); // Call Derived class factorization
92 SetValuesInitialized(false);
93 SetFactored(true);
94 return(0);
95}
96//==============================================================================
97int Ifpack_OverlapFactor::Factor() {
98
99 if (!ValuesInitialized()) EPETRA_CHK_ERR(-1); // Values must be initialized
100 if (Factored()) EPETRA_CHK_ERR(1); // Return with a warning that factor already done
101
102 EPETRA_CHK_ERR(DerivedFactor()); // Call Derived class factorization
103 SetValuesInitialized(false);
104 SetFactored(true);
105 return(0);
106}
Ifpack_OverlapGraph: Constructs a graph for use with Ifpack preconditioners.