Amesos2 - Direct Sparse Solver Interfaces  Version of the Day
Amesos2_Umfpack_FunctionMap.hpp
1 // @HEADER
2 //
3 // ***********************************************************************
4 //
5 // Amesos2: Templated Direct Sparse Solver Package
6 // Copyright 2011 Sandia Corporation
7 //
8 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact Sivasankaran Rajamanickam (srajama@sandia.gov)
39 //
40 // ***********************************************************************
41 //
42 // @HEADER
43 
44 #ifndef AMESOS2_UMFPACK_FUNCTIONMAP_HPP
45 #define AMESOS2_UMFPACK_FUNCTIONMAP_HPP
46 
47 #ifdef HAVE_TEUCHOS_COMPLEX
48 #include <complex>
49 #endif
50 
51 #include "Amesos2_FunctionMap.hpp"
52 #include "Amesos2_Umfpack_TypeMap.hpp"
53 
54 namespace UMFPACK {
55 
56  extern "C" {
57  #include "umfpack.h"
58 
59  // general definitions
60 
61  // double-precision real definitions
62  extern int
63  umfpack_di_solve(int, const int *, const int *, const double *, double *,
64  const double *, void *, const double *, double *);
65  extern int
66  umfpack_di_numeric(const int *, const int *, const double *, void *,
67  void **, const double Control [UMFPACK_CONTROL],
68  double Info [UMFPACK_INFO]);
69  extern int
70  umfpack_di_symbolic(int, int, const int *, const int *, const double *,
71  void **, const double Control [UMFPACK_CONTROL],
72  double Info [UMFPACK_INFO]);
73 
74 #ifdef HAVE_TEUCHOS_COMPLEX
75  // double-precision complex definitions
76  extern int
77  umfpack_zi_solve(int, const int *, const int *, const double *,
78  const double *, double *, double *, const double *, const double *,
79  void *, const double Control [UMFPACK_CONTROL],
80  double Info [UMFPACK_INFO]);
81  extern int
82  umfpack_zi_numeric(const int *, const int *, const double *,
83  const double *, void *, void **, const double Control [UMFPACK_CONTROL],
84  double Info [UMFPACK_INFO]);
85  extern int
86  umfpack_zi_symbolic(int, int, const int *, const int *,
87  const double *, const double *, void **,
88  const double Control [UMFPACK_CONTROL],
89  double Info [UMFPACK_INFO]);
90  extern void
91  umfpack_zi_defaults(double Control [UMFPACK_CONTROL]);
92  extern void
93  umfpack_zi_free_numeric(void **);
94  extern void
95  umfpack_zi_free_symbolic(void **);
96 #endif // HAVE_TEUCHOS_COMPLEX
97 
98  } // end extern "C"
99 
100 } // end namespace UMFPACK
101 
102 namespace Amesos2 {
103 
104  /* ==================== Specializations ====================
105  *
106  * \cond Umfpack_function_specializations
107  */
108 
109  template <>
110  struct FunctionMap<Umfpack,double>
111  {
112  typedef TypeMap<Umfpack,double> type_map;
113 
118  static int umfpack_solve(
119  int sys,
120  const int Ap [ ],
121  const int Ai [ ],
122  const double Ax [ ],
123  double X [ ],
124  const double B [ ],
125  void *Numeric,
126  const double Control [UMFPACK_CONTROL],
127  double Info [UMFPACK_INFO])
128  {
129  return UMFPACK::umfpack_di_solve(sys, Ap, Ai, Ax, X, B, Numeric, Control, Info);
130  }
131 
132  static int umfpack_numeric(
133  const int Ap [ ],
134  const int Ai [ ],
135  const double Ax [ ],
136  void *Symbolic,
137  void **Numeric,
138  const double Control [UMFPACK_CONTROL],
139  double Info [UMFPACK_INFO])
140  {
141  return UMFPACK::umfpack_di_numeric(Ap, Ai, Ax, Symbolic, Numeric, Control, Info);
142  }
143 
144  static int umfpack_symbolic(
145  int n_row,
146  int n_col,
147  const int Ap [ ],
148  const int Ai [ ],
149  const double Ax [ ],
150  void **Symbolic,
151  const double Control [UMFPACK_CONTROL],
152  double Info [UMFPACK_INFO])
153  {
154  return UMFPACK::umfpack_di_symbolic(n_row, n_col, Ap, Ai, Ax, Symbolic, Control, Info);
155  }
156 
157  static void umfpack_defaults(
158  double Control [UMFPACK_CONTROL])
159  {
160  UMFPACK::umfpack_di_defaults(Control);
161  }
162 
163  static void umfpack_free_numeric(void **Numeric)
164  {
165  return UMFPACK::umfpack_di_free_numeric(Numeric);
166  }
167 
168  static void umfpack_free_symbolic(void **Symbolic)
169  {
170  return UMFPACK::umfpack_di_free_symbolic(Symbolic);
171  }
172  };
173 
174 
175 #ifdef HAVE_TEUCHOS_COMPLEX
176 
177  template <>
178  struct FunctionMap<Umfpack,std::complex<double>>
179  {
180  typedef TypeMap<Umfpack,std::complex<double>> type_map;
181 
186  static double * stdComplexToUmfpackDoubleConversion(
187  const std::complex<double> v [ ])
188  {
189  return (double*)(&v[0]);
190  }
191 
192  static int umfpack_solve(
193  int sys,
194  const int Ap [ ],
195  const int Ai [ ],
196  const std::complex<double> Ax [ ],
197  std::complex<double> X [ ],
198  const std::complex<double> B [ ],
199  void *Numeric,
200  const double Control [UMFPACK_CONTROL],
201  double Info [UMFPACK_INFO])
202  {
203  return UMFPACK::umfpack_zi_solve(sys, Ap, Ai,
204  stdComplexToUmfpackDoubleConversion(Ax), NULL,
205  stdComplexToUmfpackDoubleConversion(X), NULL,
206  stdComplexToUmfpackDoubleConversion(B), NULL,
207  Numeric, Control, Info);
208  }
209 
210  static int umfpack_numeric(
211  const int Ap [ ],
212  const int Ai [ ],
213  const std::complex<double> Ax [ ],
214  void *Symbolic,
215  void **Numeric,
216  const double Control[UMFPACK_CONTROL],
217  double Info[UMFPACK_INFO])
218  {
219  return UMFPACK::umfpack_zi_numeric(Ap, Ai, stdComplexToUmfpackDoubleConversion(Ax), NULL, Symbolic, Numeric, Control, Info);
220  }
221 
222  static int umfpack_symbolic(
223  int n_row,
224  int n_col,
225  const int Ap [ ],
226  const int Ai [ ],
227  const std::complex<double> Ax [ ],
228  void **Symbolic,
229  const double Control [UMFPACK_CONTROL],
230  double Info [UMFPACK_INFO])
231  {
232  return UMFPACK::umfpack_zi_symbolic(n_row, n_col, Ap, Ai, stdComplexToUmfpackDoubleConversion(Ax), NULL, Symbolic, Control, Info);
233  }
234 
235  static void umfpack_defaults(double Control [UMFPACK_CONTROL])
236  {
237  UMFPACK::umfpack_zi_defaults(Control);
238  }
239 
240  static void umfpack_free_numeric(void **Numeric)
241  {
242  UMFPACK::umfpack_zi_free_numeric(Numeric);
243  }
244 
245  static void umfpack_free_symbolic(void **Symbolic)
246  {
247  UMFPACK::umfpack_zi_free_symbolic(Symbolic);
248  }
249  };
250 
251 #endif // HAVE_TEUCHOS_COMPLEX
252 
253  /* \endcond Umfpack_function_specializations */
254 
255 
256 } // end namespace Amesos2
257 
258 #endif // AMESOS2_UMFPACK_FUNCTIONMAP_HPP
Declaration of Function mapping class for Amesos2.
Definition: Amesos2_AbstractConcreteMatrixAdapter.hpp:48
Definition: Amesos2_Umfpack_FunctionMap.hpp:54