46#ifndef MUELU_COUPLEDRBMFACTORY_DEF_HPP
47#define MUELU_COUPLEDRBMFACTORY_DEF_HPP
49#include <Xpetra_Matrix.hpp>
50#include <Xpetra_MultiVectorFactory.hpp>
51#include <Xpetra_VectorFactory.hpp>
59 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
62 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
65 Input(currentLevel,
"A");
73 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
75 FactoryMonitor m(*
this,
"Structural acoustics nullspace factory", currentLevel);
76 RCP<MultiVector> nullspace;
80 GetOStream(
Runtime1) <<
"Use user-given rigid body modes " <<
nspName_ <<
": nullspace dimension=" << nullspace->getNumVectors() <<
" nullspace length=" << nullspace->getGlobalLength() << std::endl;
86 RCP<const Map> xmap=A->getDomainMap();
87 nullspace = MultiVectorFactory::Build(xmap, 6);
89 nullspace -> putScalar(zero);
90 ArrayRCP<Scalar> xnodes, ynodes, znodes;
92 ArrayRCP<Scalar> nsValues0, nsValues1, nsValues2, nsValues3, nsValues4, nsValues5;
93 int nDOFs=xmap->getLocalNumElements();
94 xnodes = Coords->getDataNonConst(0);
95 ynodes = Coords->getDataNonConst(1);
96 znodes = Coords->getDataNonConst(2);
97 cx = Coords->getVector(0)->meanValue();
98 cy = Coords->getVector(1)->meanValue();
99 cz = Coords->getVector(2)->meanValue();
100 nsValues0 = nullspace->getDataNonConst(0);
101 nsValues1 = nullspace->getDataNonConst(1);
102 nsValues2 = nullspace->getDataNonConst(2);
103 nsValues3 = nullspace->getDataNonConst(3);
104 nsValues4 = nullspace->getDataNonConst(4);
105 nsValues5 = nullspace->getDataNonConst(5);
106 for (
int j=0; j<nDOFs; j+=
numPDEs_) {
109 Scalar xdiff = xnodes[j]-cx;
110 Scalar ydiff = ynodes[j]-cy;
111 Scalar zdiff = znodes[j]-cz;
113 nsValues0[j+0] = one;
114 nsValues1[j+1] = one;
115 nsValues2[j+2] = one;
117 nsValues3[j+0] = -ydiff;
118 nsValues3[j+1] = xdiff;
120 nsValues4[j+1] = -zdiff;
121 nsValues4[j+2] = ydiff;
123 nsValues5[j+0] = zdiff;
124 nsValues5[j+2] = -xdiff;
128 nsValues0[j+0] = one;
130 nsValues1[j+1] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
131 nsValues1[j+2] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
132 nsValues2[j+1] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
133 nsValues2[j+2] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
134 nsValues3[j+1] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
135 nsValues3[j+2] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
136 nsValues4[j+1] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
137 nsValues4[j+2] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
138 nsValues5[j+1] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
139 nsValues5[j+2] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
147 Set(currentLevel,
"Nullspace", nullspace);
150 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
153 RCP<const Map> xmap=A->getDomainMap();
154 nullspace = MultiVectorFactory::Build(xmap, 6);
156 nullspace -> putScalar(zero);
157 ArrayRCP<Scalar> xnodes, ynodes, znodes;
159 ArrayRCP<Scalar> nsValues0, nsValues1, nsValues2, nsValues3, nsValues4, nsValues5;
160 int nDOFs=xmap->getLocalNumElements();
161 xnodes = Coords->getDataNonConst(0);
162 ynodes = Coords->getDataNonConst(1);
163 znodes = Coords->getDataNonConst(2);
164 cx = Coords->getVector(0)->meanValue();
165 cy = Coords->getVector(1)->meanValue();
166 cz = Coords->getVector(2)->meanValue();
167 nsValues0 = nullspace->getDataNonConst(0);
168 nsValues1 = nullspace->getDataNonConst(1);
169 nsValues2 = nullspace->getDataNonConst(2);
170 nsValues3 = nullspace->getDataNonConst(3);
171 nsValues4 = nullspace->getDataNonConst(4);
172 nsValues5 = nullspace->getDataNonConst(5);
173 for (
int j=0; j<nDOFs; j+=
numPDEs_) {
176 Scalar xdiff = xnodes[j]-cx;
177 Scalar ydiff = ynodes[j]-cy;
178 Scalar zdiff = znodes[j]-cz;
180 nsValues0[j+0] = one;
181 nsValues1[j+1] = one;
182 nsValues2[j+2] = one;
184 nsValues3[j+0] = -ydiff;
185 nsValues3[j+1] = xdiff;
187 nsValues4[j+1] = -zdiff;
188 nsValues4[j+2] = ydiff;
190 nsValues5[j+0] = zdiff;
191 nsValues5[j+2] = -xdiff;
195 nsValues0[j+0] = one;
197 nsValues1[j+1] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
198 nsValues1[j+2] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
199 nsValues2[j+1] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
200 nsValues2[j+2] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
201 nsValues3[j+1] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
202 nsValues3[j+2] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
203 nsValues4[j+1] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
204 nsValues4[j+2] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
205 nsValues5[j+1] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
206 nsValues5[j+2] = (
Scalar) (((
double) rand()) / ((
double) RAND_MAX));
213#define MUELU_COUPLEDRBMFACTORY_SHORT
MueLu::DefaultScalar Scalar
std::string nspName_
name of nullspace vector on finest level
void BuildRBM(RCP< Matrix > &A, RCP< MultiVector > &Coords, RCP< MultiVector > &nullspace) const
void Build(Level ¤tLevel) const
Build an object with this factory.
virtual ~CoupledRBMFactory()
Destructor.
void DeclareInput(Level ¤tLevel) const
Specifies the data that this class needs, and the factories that generate that data.
Timer to be used in factories. Similar to Monitor but with additional timers.
void Input(Level &level, const std::string &varName) const
T Get(Level &level, const std::string &varName) const
void Set(Level &level, const std::string &varName, const T &data) const
const RCP< const FactoryBase > GetFactory(const std::string &varName) const
Default implementation of FactoryAcceptor::GetFactory()
Class that holds all level-specific information.
bool IsAvailable(const std::string &ename, const FactoryBase *factory=NoFactory::get()) const
Test whether a need's value has been saved.
void DeclareInput(const std::string &ename, const FactoryBase *factory, const FactoryBase *requestedBy=NoFactory::get())
Callback from FactoryBase::CallDeclareInput() and FactoryBase::DeclareInput()
int GetLevelID() const
Return level number.
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access)....
static const NoFactory * get()
Teuchos::FancyOStream & GetOStream(MsgType type, int thisProcRankOnly=0) const
Get an output stream for outputting the input message type.
Namespace for MueLu classes and methods.
@ Runtime1
Description of what is happening (more verbose)