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