00001
00002
00003
00004
00005
00006 #ifndef synaps_solve_Newmac_H
00007 #define synaps_solve_Newmac_H
00008
00010
00011 #include <sstream>
00012 #include <synaps/init.h>
00013 #include <complex>
00014 #include <synaps/linalg/MatrDse.h>
00015 #include <synaps/linalg/sparse.h>
00016 #include <synaps/msolve/newmac/mynumexp.h>
00017 #include <synaps/msolve/newmac/solve.h>
00018
00019
00020 __BEGIN_NAMESPACE_SYNAPS
00021
00026 template<typename T, typename OUT=Seq<VectDse<std::complex<long double> > > >
00027 struct Newmac
00028 {
00029 typedef OUT sol_t;
00030 };
00031
00032
00039 template<typename T, typename CF_T, typename OUT>
00040 OUT solve(const T &t, const Newmac<CF_T,OUT> & N)
00041 {
00042
00043
00044 typedef typename T::value_type Poly;
00045 typedef typename Poly::monom_t mon;
00046 typedef mon Mon;
00047 serveur<mon> serv;
00048 std::list<Poly> dummy;
00049 std::list<mon> stockmon;
00050 MatrDse<std::complex< long double> > tmp(0,0);
00051 std::list<sparse::rep2d<CF_T> > lmat;
00052 std::list<dumpstruct<pol<mon,CF_T> > > dump;
00053 sparse::rep2d<CF_T> m;
00054 Base<predicat<mon> > b;
00055
00056 algo<T,std::list<pol<mon,CF_T> >,std::list<dumpstruct<pol<mon,CF_T> > >
00057 ,Base<predicat<mon> >, sparse::rep2d >(t,dump,b,serv);
00058 #ifdef TRACE_PROG
00059 std::cout<<"apres algo "<<dump.size()<<std::endl;
00060 #endif
00061 if (dump.size())
00062 {
00063 computestockmon(stockmon,b,dump);
00064 for(int i=0;i<b.nbvar();i++)
00065 {
00066 matmul(m,i,dump,b,stockmon,serv);
00067 lmat.push_back(m);
00068 }
00069 realsolve2(lmat,b,tmp);
00070 }
00071 forget(b,dump,0,dummy);
00072 OUT res;
00073 using let::assign; assign(res,tmp);
00074 return res;
00075 }
00076
00077 __END_NAMESPACE_SYNAPS
00078
00079 #endif // synaps_solve_Newmac_H
00080