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");
69 currentLevel.
DeclareInput(
"Nullspace", GetFactory(nspName_).get(),
this);
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;
83 RCP<Matrix> A = Get< RCP<Matrix> >(currentLevel,
"A");
84 RCP<MultiVector> Coords = Get< RCP<MultiVector> >(currentLevel,
"Coordinates");
85 GetOStream(
Runtime1) <<
"Generating nullspace for structural acoustics: dimension = " << numPDEs_ << 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_) {
108 if( xmap->getGlobalElement(j) >= lastAcousticDOF_ ) {
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));
145 nullspace = currentLevel.
Get< RCP<MultiVector> >(
"Nullspace", GetFactory(nspName_).get());
147 Set(currentLevel,
"Nullspace", nullspace);
150 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
152 GetOStream(
Runtime1) <<
"Generating nullspace for structural acoustics: dimension = " << numPDEs_ << std::endl;
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_) {
175 if( xmap->getGlobalElement(j) >= lastAcousticDOF_ ) {
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
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.
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()
Namespace for MueLu classes and methods.
@ Runtime1
Description of what is happening (more verbose)