64 int nc =
min(2 * nroot, nroot + 8);
68 std :: vector< FloatArray > z(nc, nn), zz(nc, nn), x(nc, nn);
73 for (
int j = 0; j < nc; j++ ) {
79 for (
int i = 1; i <= nn; i++ ) {
80 ad.at(i) = fabs(a.
at(i, i));
81 bd.
at(i) = fabs(b.
at(i, i));
85 std :: sort(order.
begin(), order.
end(), [&ad, &bd](
int a,
int b) { return bd.at(a) * ad.at(b) > bd.at(b) * ad.at(a); });
86 for (
int i = 0; i < nc; i++ ) {
87 x[i].at(order[i]) = 1.0;
89 ww.at(i + 1) = z[i].dotProduct(x[i]);
95 for ( it = 0; it <
nitem; it++ ) {
97 for (
int j = 0; j < nc; j++ ) {
102 for (
int j = 0; j < nc; j++ ) {
103 solver->solve(a, z[j], x[j]);
107 for (
int j = 0; j < nc; j++ ) {
108 w.at(j + 1) = zz[j].dotProduct(x[j]);
111 for (
int j = 0; j < nc; j++ ) {
115 for (
int j = 0; j < nc; j++ ) {
116 w.at(j + 1) /= z[j].dotProduct(x[j]);
121 for (
int j = 1; j <= nc; j++ ) {
122 if ( fabs( ww.at(j) - w.at(j) ) <= fabs( w.at(j) * rtol ) ) {
133 for (
int j = 0; j < nc; j++ ) {
138 for (
int ii = 0; ii < j; ii++ ) {
139 x[j].add( -x[ii].dotProduct(t), x[ii] );
143 x[j].times( 1.0 / sqrt( x[j].dotProduct(t) ) );
151 for (
int j = 0; j < nc; j++ ) {
159 std :: sort(order.
begin(), order.
end(), [&w](
int a,
int b) { return w.at(a) < w.at(b); });
163 for (
int i = 1; i <= nroot; i++ ) {
164 eigv.
at(i) = w.at(order.
at(i));
169 OOFEM_LOG_INFO(
"InverseIt info: convergence reached in %d iterations\n", it);
171 OOFEM_WARNING(
"convergence not reached after %d iterations\n", it);
#define REGISTER_GeneralizedEigenValueSolver(class, type)
std::unique_ptr< SparseLinearSystemNM > createSparseLinSolver(LinSystSolverType st, Domain *d, EngngModel *m)
void resize(Index rows, Index cols)
void setColumn(const FloatArray &src, int c)
std::vector< int >::iterator end()
void enumerate(int maxVal)
std::vector< int >::iterator begin()
int nitem
Max number of iterations.
Domain * domain
Pointer to domain.
EngngModel * engngModel
Pointer to engineering model.
SparseGeneralEigenValueSystemNM(Domain *d, EngngModel *m)
Constructor.
virtual double & at(int i, int j)=0
Returns coefficient at position (i,j).
int giveNumberOfColumns() const
Returns number of columns of receiver.
virtual void times(const FloatArray &x, FloatArray &answer) const
#define OOFEM_WARNING(...)
#define OOFEM_LOG_INFO(...)
FloatArrayF< N > min(const FloatArrayF< N > &a, const FloatArrayF< N > &b)
ClassFactory & GiveClassFactory()