42#ifndef TPETRA_FECRSMATRIX_DEF_HPP
43#define TPETRA_FECRSMATRIX_DEF_HPP
45#include "Tpetra_CrsMatrix.hpp"
49template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
50FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
51FECrsMatrix(
const Teuchos::RCP<const fe_crs_graph_type>& graph,
52 const Teuchos::RCP<Teuchos::ParameterList>& params) :
55 crs_matrix_type( graph->inactiveCrsGraph_.is_null() ? Teuchos::rcp_const_cast<crs_graph_type>(Teuchos::rcp_dynamic_cast<const crs_graph_type>(graph)) : graph->inactiveCrsGraph_,params),
59 const char tfecfFuncName[] =
"FECrsMatrix(RCP<const FECrsGraph>[, RCP<ParameterList>]): ";
61 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC
62 (graph.is_null (), std::runtime_error,
"Input graph is null.");
63 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC
64 (!graph->isFillComplete (), std::runtime_error,
"Input graph is not "
65 "fill complete. You must call fillComplete on the graph before using "
66 "it to construct a FECrsMatrix. Note that calling resumeFill on the "
67 "graph makes it not fill complete, even if you had previously called "
68 "fillComplete. In that case, you must call fillComplete on the graph "
70 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC
71 ( *graph->activeCrsGraph_!= fe_crs_graph_type::FE_ACTIVE_OWNED,std::runtime_error,
72 "Input graph must be in FE_ACTIVE_OWNED mode when this constructor is called.");
74 activeCrsMatrix_ = Teuchos::rcp(
new FEWhichActive(FE_ACTIVE_OWNED_PLUS_SHARED));
77 if(!graph->inactiveCrsGraph_.is_null() ) {
80 inactiveCrsMatrix_ = Teuchos::rcp(
new crs_matrix_type(*
this,graph));
83 fillState_ = Teuchos::rcp(
new FillState(FillState::closed));
88template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
89void FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::doOwnedPlusSharedToOwned(
const CombineMode CM) {
90 if(!inactiveCrsMatrix_.is_null() && *activeCrsMatrix_ == FE_ACTIVE_OWNED_PLUS_SHARED) {
92 this->doExport(*
this,*feGraph_->ownedRowsImporter_,CM,
true);
93 inactiveCrsMatrix_->fillComplete();
95 crs_matrix_type::fillComplete();
99template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
100void FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::doOwnedToOwnedPlusShared(
const CombineMode ) {
104template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
105void FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::switchActiveCrsMatrix() {
106 if(*activeCrsMatrix_ == FE_ACTIVE_OWNED_PLUS_SHARED)
107 *activeCrsMatrix_ = FE_ACTIVE_OWNED;
109 *activeCrsMatrix_ = FE_ACTIVE_OWNED_PLUS_SHARED;
111 if(inactiveCrsMatrix_.is_null())
return;
113 this->swap(*inactiveCrsMatrix_);
118template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
119void FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::endFill() {
120 if(*activeCrsMatrix_ == FE_ACTIVE_OWNED_PLUS_SHARED) {
122 switchActiveCrsMatrix();
125 throw std::runtime_error(
"FECrsMatrix: Local CrsMatrix already active. Cannot endFill()");
128template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
129void FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::beginFill() {
132 if(*activeCrsMatrix_ == FE_ACTIVE_OWNED) {
134 switchActiveCrsMatrix();
139template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
140void FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::beginAssembly() {
141 const char tfecfFuncName[] =
"FECrsMatrix::beginAssembly: ";
142 if (*fillState_ != FillState::closed)
144 std::ostringstream errmsg;
145 errmsg <<
"Cannot begin assembly, matrix is not in a closed state "
146 <<
"but is currently open for "
147 << (*fillState_ == FillState::open ?
"assembly" :
"modification");
148 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
true, std::logic_error, errmsg.str());
150 *fillState_ = FillState::open;
154template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
155void FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::endAssembly() {
156 const char tfecfFuncName[] =
"FECrsMatrix::endAssembly: ";
157 if (*fillState_ != FillState::open)
159 std::ostringstream errmsg;
160 errmsg <<
"Cannot end assembly, matrix is not open for assembly "
161 <<
"but is currently "
162 << (*fillState_ == FillState::closed ?
"closed" :
"open for modification");
163 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
true, std::logic_error, errmsg.str());
165 *fillState_ = FillState::closed;
169template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
170void FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::beginModify() {
171 const char tfecfFuncName[] =
"FECrsMatrix::beginModify: ";
172 if (*fillState_ != FillState::closed)
174 std::ostringstream errmsg;
175 errmsg <<
"Cannot begin modifying, matrix is not in a closed state "
176 <<
"but is currently open for "
177 << (*fillState_ == FillState::open ?
"assembly" :
"modification");
178 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
true, std::logic_error, errmsg.str());
180 *fillState_ = FillState::modify;
184template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
185void FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::endModify() {
186 const char tfecfFuncName[] =
"FECrsMatrix::endModify: ";
187 if (*fillState_ != FillState::modify)
189 std::ostringstream errmsg;
190 errmsg <<
"Cannot end modifying, matrix is not open to modify but is currently "
191 << (*fillState_ == FillState::open ?
"open for assembly" :
"closed");
192 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
true, std::logic_error, errmsg.str());
194 *fillState_ = FillState::closed;
195 this->fillComplete();
198template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
200FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::replaceGlobalValuesImpl(
201 impl_scalar_type rowVals[],
202 const crs_graph_type& graph,
203 const RowInfo& rowInfo,
204 const GlobalOrdinal inds[],
205 const impl_scalar_type newVals[],
206 const LocalOrdinal numElts)
208 const char tfecfFuncName[] =
"FECrsMatrix::replaceGlobalValues: ";
209 if (*fillState_ != FillState::open)
211 std::ostringstream errmsg;
212 errmsg <<
"Cannot replace global values, matrix is not open for assembly "
213 <<
"but is currently "
214 << (*fillState_ == FillState::modify ?
"open for modification" :
"closed");
215 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
true, std::logic_error, errmsg.str());
217 return crs_matrix_type::replaceGlobalValuesImpl(rowVals, graph, rowInfo, inds, newVals, numElts);
220template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
222FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::replaceLocalValuesImpl(
223 impl_scalar_type rowVals[],
224 const crs_graph_type& graph,
225 const RowInfo& rowInfo,
226 const LocalOrdinal inds[],
227 const impl_scalar_type newVals[],
228 const LocalOrdinal numElts)
230 const char tfecfFuncName[] =
"FECrsMatrix::replaceLocalValues: ";
231 if (*fillState_ != FillState::open && *fillState_ != FillState::modify)
233 std::ostringstream errmsg;
234 errmsg <<
"Cannot replace local values, matrix is not open to fill/modify. "
235 <<
"The matrix is currently closed";
236 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
true, std::logic_error, errmsg.str());
238 return crs_matrix_type::replaceLocalValuesImpl(rowVals, graph, rowInfo, inds, newVals, numElts);
241template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
243FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::sumIntoGlobalValuesImpl(
244 impl_scalar_type rowVals[],
245 const crs_graph_type& graph,
246 const RowInfo& rowInfo,
247 const GlobalOrdinal inds[],
248 const impl_scalar_type newVals[],
249 const LocalOrdinal numElts,
252 const char tfecfFuncName[] =
"FECrsMatrix::sumIntoGlobalValues: ";
253 if (*fillState_ != FillState::open)
255 std::ostringstream errmsg;
256 errmsg <<
"Cannot sum in to global values, matrix is not open for assembly. "
257 <<
"The matrix is currently "
258 << (*fillState_ == FillState::modify ?
"open for modification" :
"closed");
259 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
true, std::logic_error, errmsg.str());
261 return crs_matrix_type::sumIntoGlobalValuesImpl(
262 rowVals, graph, rowInfo, inds, newVals, numElts, atomic
266template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
268FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::sumIntoLocalValuesImpl(
269 impl_scalar_type rowVals[],
270 const crs_graph_type& graph,
271 const RowInfo& rowInfo,
272 const LocalOrdinal inds[],
273 const impl_scalar_type newVals[],
274 const LocalOrdinal numElts,
277 const char tfecfFuncName[] =
"FECrsMatrix::sumIntoLocalValues: ";
278 if (*fillState_ != FillState::open)
280 std::ostringstream errmsg;
281 errmsg <<
"Cannot sum in to local values, matrix is not open for assembly. "
282 <<
"The matrix is currently "
283 << (*fillState_ == FillState::modify ?
"open for modification" :
"closed");
284 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
true, std::logic_error, errmsg.str());
286 return crs_matrix_type::sumIntoLocalValuesImpl(
287 rowVals, graph, rowInfo, inds, newVals, numElts, atomic
291template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
293FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::insertGlobalValuesImpl(
294 crs_graph_type& graph,
296 const GlobalOrdinal gblColInds[],
297 const impl_scalar_type vals[],
298 const size_t numInputEnt)
300 const char tfecfFuncName[] =
"FECrsMatrix::insertGlobalValues: ";
301 if (*fillState_ != FillState::open)
303 std::ostringstream errmsg;
304 errmsg <<
"Cannot insert global values, matrix is not open for assembly. "
305 <<
"The matrix is currently "
306 << (*fillState_ == FillState::modify ?
"open for modification" :
"closed");
307 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
true, std::logic_error, errmsg.str());
309 return crs_matrix_type::insertGlobalValuesImpl(graph, rowInfo, gblColInds, vals, numInputEnt);
320#define TPETRA_FECRSMATRIX_INSTANT(SCALAR,LO,GO,NODE) \
321 template class FECrsMatrix<SCALAR, LO, GO, NODE>;
Namespace Tpetra contains the class and methods constituting the Tpetra library.
CombineMode
Rule for combining data in an Import or Export.