template struct create_preconditioner { static Mc create_preconditioner::create(const Ma&A, const iterate_method& method, const Mc& conditioner) { if (method == ITERATE_OWN) return conditioner ; Mc ret(A.size1(),A.size2()) ; typename Ma::const_iterator it(A.begin1()) ; switch(method) { case ITERATE_RUMP: for(;it!=A.end1();++it) { ret(it.index1(),it.index2()) = *it.center(); } break ; case ITERATE_JACOBI: for(;it!=A.end1();++it) { if (it.index1() == it.index2()) ret(it.index1(),it.index2()) = *it.center(); } break ; case ITERATE_GAUSS_LOWER: for(;it!=A.end1();++it) { if (it.index1() >= it.index2()) ret(it.index1(),it.index2()) = *it.center(); } break ; case ITERATE_GAUSS_UPPER: for(;it!=A.end1();++it) { if (it.index1() <= it.index2()) ret(it.index1(),it.index2()) = *it.center(); } break ; default: throw runtime_error("unknown iterate method") ; } return ret ; } } ; template struct create_preconditioner { static M create(const M&A, const iterate_method& method, const M& conditioner) { if (method == ITERATE_OWN) return conditioner ; M ret(A.size1(),A.size2()) ; typename M::const_iterator it(A.begin1()) ; switch(method) { case ITERATE_RUMP: for(;it!=A.end1();++it) { ret(it.index1(),it.index2()) = *it; } break ; case ITERATE_JACOBI: for(;it!=A.end1();++it) { if (it.index1() == it.index2()) ret(it.index1(),it.index2()) = *it; } break ; case ITERATE_GAUSS_LOWER: for(;it!=A.end1();++it) { if (it.index1() >= it.index2()) ret(it.index1(),it.index2()) = *it; } break ; case ITERATE_GAUSS_UPPER: for(;it!=A.end1();++it) { if (it.index1() <= it.index2()) ret(it.index1(),it.index2()) = *it; } break ; default: throw runtime_error("unknown iterate method") ; } return ret ; } } ;