11 #include "gsl/gsl_vector.h"
12 #include "gsl/gsl_multimin.h"
13 #include "gsl/gsl_math.h"
14 #include "gsl/gsl_matrix.h"
15 #include "gsl/gsl_linalg.h"
16 #include "gsl/gsl_blas.h"
17 #include "gsl/gsl_errno.h"
42 const size_t N = funcs.size () ;
43 for(
size_t i = 0 ;
i <
N ; ++
i )
46 for(
size_t j = 0 ; j <
N ; ++j )
48 Genfun::GENFUNCTION fij = funcs[
i]->partial(j);
49 last.push_back( fij.clone() ) ;
51 m_jac.push_back( last );
59 while( !
m_jac.empty() )
62 while( !last.empty() )
76 const std::string&
name,
95 using namespace Genfun;
99 int fun_gsl (
const gsl_vector* v ,
108 {
for (
unsigned int i = 0;
i < v->size; ++
i)
110 arg[
i] = gsl_vector_get (v,
i);
114 {
for (
unsigned int i = 0;
i < v->size; ++
i)
116 gsl_vector_set(f,
i, (*eqs[
i])(arg));
125 int dfun_gsl (
const gsl_vector* v ,
132 Argument& arg = local -> argument() ;
134 {
for (
unsigned int i = 0;
i < v->size; ++
i)
136 arg[
i] = gsl_vector_get (v,
i);
140 {
for(
unsigned int i = 0 ;
i < v->size ; ++
i )
142 for (
unsigned int j = 0; j < v->size; ++j)
144 Genfun::GENFUNCTION f = *(jac[
i][j]) ;
145 gsl_matrix_set ( df ,
i , j , f ( arg ) ) ;
155 int fdfun_gsl (
const gsl_vector* v ,
166 {
for (
unsigned int i = 0;
i < v->size; ++
i)
168 arg[
i] = gsl_vector_get (v,
i);
172 {
for(
unsigned int i = 0 ;
i < v->size ; ++
i )
174 gsl_vector_set(f,
i, (*eqs[
i])(arg ) ) ;
175 for (
unsigned int j = 0; j < v->size; ++j)
177 Genfun::GENFUNCTION f1 = *(jac[
i][j]) ;
178 gsl_matrix_set ( df , i , j , f1(arg) ) ;
195 using namespace Genfun;
197 gsl_vector_view vect = gsl_vector_view_array ( &arg[0] ,
203 const gsl_multiroot_fdfsolver_type *T = m_type;
204 gsl_multiroot_fdfsolver *
s;
208 gsl_multiroot_function_fdf
function;
210 function.f = &fun_gsl;
211 function.df = &dfun_gsl;
212 function.fdf = &fdfun_gsl;
213 function.n = vect.vector.size;
214 function.params = (
void*) &local;
216 s = gsl_multiroot_fdfsolver_alloc(T, vect.vector.size);
217 gsl_multiroot_fdfsolver_set (
s, &
function, &vect.vector);
219 for (iter = 0; iter < m_max_iter; ++iter)
221 status = gsl_multiroot_fdfsolver_iterate (
s);
225 (
"Error from gsl_gsl_multiroot_fdfsolver_iterate '"
226 + std::string(gsl_strerror(status)) +
"'") ;
229 status = gsl_multiroot_test_residual (
s->f,
232 if ( status != GSL_CONTINUE ) {
break; }
235 for (
unsigned int i = 0;
i < vect.vector.size; ++
i)
237 gsl_vector_set (&vect.vector,
i, gsl_vector_get (
s->x,
i));
240 if (status == GSL_SUCCESS)
243 <<
"We stopped in the method on the " << iter
244 <<
" iteration (we have maximum " << m_max_iter
245 <<
" iterations)" <<
endmsg;
247 else if (status == GSL_CONTINUE && iter <= m_max_iter )
249 return Error (
"Method finished with '"
250 + std::string(gsl_strerror(status))
255 return Error (
"Method finished with '" +
256 std::string(gsl_strerror(status))
260 gsl_multiroot_fdfsolver_free (
s);
264 return Error (
"Method finished with '"
265 + std::string(gsl_strerror(status))
282 return Error (
"Could not initiliaze base class GaudiTool", sc);
289 m_type = gsl_multiroot_fdfsolver_hybridsj ;
291 <<
"Root findind algoritms to be used: "
292 <<
"'gsl_multiroot_fdfsolver_hybridsj'"
295 else if (
"fdfsolver_hybridj" ==
m_algType )
297 m_type = gsl_multiroot_fdfsolver_hybridj ;
299 <<
"Root findind algoritms to be used: "
300 <<
"'gsl_multiroot_fdfsolver_hybridj'"
303 else if (
"fdfsolver_newton" ==
m_algType )
305 m_type = gsl_multiroot_fdfsolver_newton ;
307 <<
"Root findind algoritms to be used: "
308 <<
"'gsl_multiroot_fdfsolver_newton'"
311 else if (
"fdfsolver_gnewton" ==
m_algType )
313 m_type = gsl_multiroot_fdfsolver_gnewton ;
315 <<
"Root findind algoritms to be used: "
316 <<
"'gsl_multiroot_fdfsolver_gnewton'"
321 return Error(
" Unknown algorith type '"
336 return Error(
"Could not finaliaze base class GaudiTool", sc);
std::vector< Equations > Jacobi
virtual StatusCode solver(const Equations &funcs, Arg &arg) const
Solving nonlinear system with N equations in N unknowns of the function "GenFunc".
Definition of the MsgStream class used to transmit messages.
EqSolver()
default constructor is private
StatusCode Error(const std::string &msg, const StatusCode st=StatusCode::FAILURE, const size_t mx=10) const
Print the error message and return with the given StatusCode.
Genfun::Argument Arg
Argument of function "GenFunc" (.
const Jacobi & jacobi() const
bool isFailure() const
Test for a status code of FAILURE.
#define DECLARE_COMPONENT(type)
The simplest concrete implementation of IEqSolver interface.
const Arg & argument() const
This class is used for returning status codes from appropriate routines.
const Equations * equations() const
Definition of the basic interface.
Base class used to extend a class implementing other interfaces.
virtual ~EqSolver()
Destructor.
std::vector< const GenFunc * > Equations
Vector of the function "GenFunc" which we solver.
const gsl_multiroot_fdfsolver_type * m_type
virtual StatusCode finalize()
standard finalization method
virtual StatusCode initialize()
Overriding initialize.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.