42 #ifndef TPETRA_FECRSMATRIX_DEF_HPP
43 #define TPETRA_FECRSMATRIX_DEF_HPP
45 #include "Tpetra_CrsMatrix.hpp"
49 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
50 FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
51 FECrsMatrix(
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 bool start_owned =
false;
75 if (! params.is_null ()) {
76 if (params->isParameter (
"start owned")) {
77 start_owned = params->get<
bool>(
"start owned", start_owned);
81 activeCrsMatrix_ = Teuchos::rcp(
new FEWhichActive(FE_ACTIVE_OWNED));
83 activeCrsMatrix_ = Teuchos::rcp(
new FEWhichActive(FE_ACTIVE_OWNED_PLUS_SHARED));
87 if(!graph->inactiveCrsGraph_.is_null() ) {
90 inactiveCrsMatrix_ = Teuchos::rcp(
new crs_matrix_type(*
this,graph));
93 fillState_ = Teuchos::rcp(
new FillState(FillState::closed));
98 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
99 void FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::doOwnedPlusSharedToOwned(
const CombineMode CM) {
100 if(!inactiveCrsMatrix_.is_null() && *activeCrsMatrix_ == FE_ACTIVE_OWNED_PLUS_SHARED) {
102 this->doExport(*
this,*feGraph_->ownedRowsImporter_,CM,
true);
103 inactiveCrsMatrix_->fillComplete();
105 crs_matrix_type::fillComplete();
109 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
110 void FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::doOwnedToOwnedPlusShared(
const CombineMode ) {
114 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
115 void FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::switchActiveCrsMatrix() {
116 if(*activeCrsMatrix_ == FE_ACTIVE_OWNED_PLUS_SHARED)
117 *activeCrsMatrix_ = FE_ACTIVE_OWNED;
119 *activeCrsMatrix_ = FE_ACTIVE_OWNED_PLUS_SHARED;
121 if(inactiveCrsMatrix_.is_null())
return;
123 this->swap(*inactiveCrsMatrix_);
128 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
129 void FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::endFill() {
130 if(*activeCrsMatrix_ == FE_ACTIVE_OWNED_PLUS_SHARED) {
132 switchActiveCrsMatrix();
135 throw std::runtime_error(
"FECrsMatrix: Local CrsMatrix already active. Cannot endFill()");
138 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
139 void FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::beginFill() {
142 if(*activeCrsMatrix_ == FE_ACTIVE_OWNED) {
144 switchActiveCrsMatrix();
149 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
150 void FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::beginAssembly() {
151 const char tfecfFuncName[] =
"FECrsMatrix::beginAssembly: ";
152 if (*fillState_ != FillState::closed)
154 std::ostringstream errmsg;
155 errmsg <<
"Cannot begin assembly, matrix is not in a closed state "
156 <<
"but is currently open for "
157 << (*fillState_ == FillState::open ?
"assembly" :
"modification");
158 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
true, std::logic_error, errmsg.str());
160 *fillState_ = FillState::open;
164 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
165 void FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::endAssembly() {
166 const char tfecfFuncName[] =
"FECrsMatrix::endAssembly: ";
167 if (*fillState_ != FillState::open)
169 std::ostringstream errmsg;
170 errmsg <<
"Cannot end assembly, matrix is not open for assembly "
171 <<
"but is currently "
172 << (*fillState_ == FillState::closed ?
"closed" :
"open for modification");
173 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
true, std::logic_error, errmsg.str());
175 *fillState_ = FillState::closed;
179 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
180 void FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::beginModify() {
181 const char tfecfFuncName[] =
"FECrsMatrix::beginModify: ";
182 if (*fillState_ != FillState::closed)
184 std::ostringstream errmsg;
185 errmsg <<
"Cannot begin modifying, matrix is not in a closed state "
186 <<
"but is currently open for "
187 << (*fillState_ == FillState::open ?
"assembly" :
"modification");
188 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
true, std::logic_error, errmsg.str());
190 *fillState_ = FillState::modify;
194 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
195 void FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::endModify() {
196 const char tfecfFuncName[] =
"FECrsMatrix::endModify: ";
197 if (*fillState_ != FillState::modify)
199 std::ostringstream errmsg;
200 errmsg <<
"Cannot end modifying, matrix is not open to modify but is currently "
201 << (*fillState_ == FillState::open ?
"open for assembly" :
"closed");
202 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
true, std::logic_error, errmsg.str());
204 *fillState_ = FillState::closed;
205 this->fillComplete();
208 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
210 FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::replaceGlobalValuesImpl(
211 impl_scalar_type rowVals[],
212 const crs_graph_type& graph,
213 const RowInfo& rowInfo,
214 const GlobalOrdinal inds[],
215 const impl_scalar_type newVals[],
216 const LocalOrdinal numElts)
218 const char tfecfFuncName[] =
"FECrsMatrix::replaceGlobalValues: ";
219 if (*fillState_ != FillState::open)
221 std::ostringstream errmsg;
222 errmsg <<
"Cannot replace global values, matrix is not open for assembly "
223 <<
"but is currently "
224 << (*fillState_ == FillState::modify ?
"open for modification" :
"closed");
225 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
true, std::logic_error, errmsg.str());
227 return crs_matrix_type::replaceGlobalValuesImpl(rowVals, graph, rowInfo, inds, newVals, numElts);
230 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
232 FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::replaceLocalValuesImpl(
233 impl_scalar_type rowVals[],
234 const crs_graph_type& graph,
235 const RowInfo& rowInfo,
236 const LocalOrdinal inds[],
237 const impl_scalar_type newVals[],
238 const LocalOrdinal numElts)
240 const char tfecfFuncName[] =
"FECrsMatrix::replaceLocalValues: ";
241 if (*fillState_ != FillState::open && *fillState_ != FillState::modify)
243 std::ostringstream errmsg;
244 errmsg <<
"Cannot replace local values, matrix is not open to fill/modify. "
245 <<
"The matrix is currently closed";
246 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
true, std::logic_error, errmsg.str());
248 return crs_matrix_type::replaceLocalValuesImpl(rowVals, graph, rowInfo, inds, newVals, numElts);
251 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
253 FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::sumIntoGlobalValuesImpl(
254 impl_scalar_type rowVals[],
255 const crs_graph_type& graph,
256 const RowInfo& rowInfo,
257 const GlobalOrdinal inds[],
258 const impl_scalar_type newVals[],
259 const LocalOrdinal numElts,
262 const char tfecfFuncName[] =
"FECrsMatrix::sumIntoGlobalValues: ";
263 if (*fillState_ != FillState::open)
265 std::ostringstream errmsg;
266 errmsg <<
"Cannot sum in to global values, matrix is not open for assembly. "
267 <<
"The matrix is currently "
268 << (*fillState_ == FillState::modify ?
"open for modification" :
"closed");
269 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
true, std::logic_error, errmsg.str());
271 return crs_matrix_type::sumIntoGlobalValuesImpl(
272 rowVals, graph, rowInfo, inds, newVals, numElts, atomic
276 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
278 FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::sumIntoLocalValuesImpl(
279 impl_scalar_type rowVals[],
280 const crs_graph_type& graph,
281 const RowInfo& rowInfo,
282 const LocalOrdinal inds[],
283 const impl_scalar_type newVals[],
284 const LocalOrdinal numElts,
287 const char tfecfFuncName[] =
"FECrsMatrix::sumIntoLocalValues: ";
288 if (*fillState_ != FillState::open)
290 std::ostringstream errmsg;
291 errmsg <<
"Cannot sum in to local values, matrix is not open for assembly. "
292 <<
"The matrix is currently "
293 << (*fillState_ == FillState::modify ?
"open for modification" :
"closed");
294 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
true, std::logic_error, errmsg.str());
296 return crs_matrix_type::sumIntoLocalValuesImpl(
297 rowVals, graph, rowInfo, inds, newVals, numElts, atomic
301 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
303 FECrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::insertGlobalValuesImpl(
304 crs_graph_type& graph,
306 const GlobalOrdinal gblColInds[],
307 const impl_scalar_type vals[],
308 const size_t numInputEnt)
310 const char tfecfFuncName[] =
"FECrsMatrix::insertGlobalValues: ";
311 if (*fillState_ != FillState::open)
313 std::ostringstream errmsg;
314 errmsg <<
"Cannot insert global values, matrix is not open for assembly. "
315 <<
"The matrix is currently "
316 << (*fillState_ == FillState::modify ?
"open for modification" :
"closed");
317 TEUCHOS_TEST_FOR_EXCEPTION_CLASS_FUNC(
true, std::logic_error, errmsg.str());
319 return crs_matrix_type::insertGlobalValuesImpl(graph, rowInfo, gblColInds, vals, numInputEnt);
330 #define TPETRA_FECRSMATRIX_INSTANT(SCALAR,LO,GO,NODE) \
331 template class FECrsMatrix<SCALAR, LO, GO, NODE>;
335 #endif // TPETRA_FECRSMATRIX_DEF
CombineMode
Rule for combining data in an Import or Export.