46 #ifndef MUELU_STRUCTUREDLINEDETECTIONFACTORY_DEF_HPP
47 #define MUELU_STRUCTUREDLINEDETECTIONFACTORY_DEF_HPP
49 #include <Xpetra_Matrix.hpp>
53 #include "MueLu_FactoryManager.hpp"
59 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
61 RCP<ParameterList> validParamList = rcp(
new ParameterList());
63 validParamList->set< RCP<const FactoryBase> >(
"A", Teuchos::null,
"Generating factory of the matrix A");
64 validParamList->set< std::string > (
"orientation",
"Z",
"Lines orientation");
65 validParamList->set< RCP<const FactoryBase> >(
"lNodesPerDim", Teuchos::null,
"Number of nodes per spatial dimension provided by CoordinatesTransferFactory.");
67 return validParamList;
70 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
72 Input(currentLevel,
"A");
80 "lNodesPerDim was not provided by the user on level0!");
83 Input(currentLevel,
"lNodesPerDim");
87 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
92 Teuchos::ArrayRCP<LO> VertLineId = Teuchos::arcp<LO>(0);
95 const ParameterList& pL = GetParameterList();
96 const std::string lineOrientation = pL.get<std::string>(
"orientation");
99 RCP<Matrix> A = Get< RCP<Matrix> >(currentLevel,
"A");
100 Array<LO> lNodesPerDir = Get<Array<LO> > (currentLevel,
"lNodesPerDim");
101 LO numNodes = lNodesPerDir[0]*lNodesPerDir[1]*lNodesPerDir[2];
102 VertLineId.resize(numNodes);
103 if(lineOrientation ==
"X") {
104 NumZDir = lNodesPerDir[0];
105 }
else if(lineOrientation ==
"Y") {
106 NumZDir = lNodesPerDir[1];
107 }
else if(lineOrientation ==
"Z") {
108 NumZDir = lNodesPerDir[2];
111 for(LO k = 0; k < lNodesPerDir[2]; ++k) {
112 for(LO j = 0; j < lNodesPerDir[1]; ++j) {
113 for(LO i = 0; i < lNodesPerDir[0]; ++i) {
114 if(lineOrientation ==
"X") {
115 VertLineId[k*lNodesPerDir[1]*lNodesPerDir[0] + j*lNodesPerDir[0] + i] = k*lNodesPerDir[1] + j;
116 }
else if(lineOrientation ==
"Y") {
117 VertLineId[k*lNodesPerDir[1]*lNodesPerDir[0] + j*lNodesPerDir[0] + i] = k*lNodesPerDir[0] + i;
118 }
else if(lineOrientation ==
"Z") {
119 VertLineId[k*lNodesPerDir[1]*lNodesPerDir[0] + j*lNodesPerDir[0] + i] = j*lNodesPerDir[0] + i;
125 Set(currentLevel,
"CoarseNumZLayers", NumZDir);
126 Set(currentLevel,
"LineDetection_VertLineIds", VertLineId);
131 #endif // MUELU_STRUCTUREDLINEDETECTIONFACTORY_DEF_HPP