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);
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));
void DeclareInput(const std::string &ename, const FactoryBase *factory, const FactoryBase *requestedBy=NoFactory::get())
Callback from FactoryBase::CallDeclareInput() and FactoryBase::DeclareInput()
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access)....