30 #ifndef _FSFUNCTIONALLINEAR_HPP_
31 #define _FSFUNCTIONALLINEAR_HPP_
42 class FsFunctionalLinear :
public FsFunctional<Space>
47 typedef FsFunctionalLinear<Space> this_type;
48 typedef FsFunctional<Space> super_type;
50 typedef Space space_type;
52 typedef boost::shared_ptr<space_type> space_ptrtype;
53 typedef typename space_type::element_type element_type;
55 typedef typename space_type::value_type value_type;
57 typedef Backend<value_type> backend_type;
58 typedef boost::shared_ptr<backend_type> backend_ptrtype;
60 typedef typename backend_type::vector_type vector_type;
61 typedef typename backend_type::vector_ptrtype vector_ptrtype;
63 FsFunctionalLinear( space_ptrtype space ) :
65 M_backend( backend_type::build( BACKEND_PETSC ) ),
66 M_vector( M_backend->newVector( space ) ),
67 M_name(
"functionallinear" )
71 FsFunctionalLinear( space_ptrtype space, backend_ptrtype backend ) :
74 M_vector( M_backend->newVector( space ) ),
75 M_name(
"functionallinear" )
79 void setName( std::string name ) { M_name = name; }
80 std::string name()
const {
return M_name ; }
84 operator()(
const element_type& x )
const
87 return M_backend->dot( *M_vector, x.container() );
91 vector_type
const& container()
const
96 vector_type& container()
102 virtual vector_ptrtype
const& containerPtr()
const
107 virtual vector_ptrtype& containerPtr()
112 virtual void containerPtr( vector_ptrtype & vector )
117 virtual void container( vector_type & vector )
123 template<
typename ExprT>
126 form1( _test=this->space(), _vector=M_vector ) = e;
131 template<
typename ExprT>
132 this_type& operator+=( ExprT
const& e )
134 form1( _test=this->space(), _vector=M_vector ) += e;
140 if ( ! M_vector->closed() )
147 add( this_type
const& f )
149 M_vector->add( f.container() );
153 backend_ptrtype M_backend;
154 vector_ptrtype M_vector;
161 template<
typename Args>
162 struct compute_functionalLinear_return
164 typedef typename boost::remove_reference<typename parameter::binding<Args, tag::space>::type>::type::element_type space_type;
166 typedef FsFunctionalLinear<space_type> type;
167 typedef boost::shared_ptr<FsFunctionalLinear<space_type> > ptrtype;
171 BOOST_PARAMETER_FUNCTION(
172 (
typename Feel::detail::compute_functionalLinear_return<Args>::ptrtype ),
176 ( space, *( boost::is_convertible<mpl::_,boost::shared_ptr<FunctionSpaceBase> > ) )
179 ( backend, *, Backend<
typename Feel::detail::compute_functionalLinear_return<Args>::domain_space_type::value_type>::build() )
184 Feel::detail::ignore_unused_variable_warning( args );
185 typedef typename Feel::detail::compute_functionalLinear_return<Args>::type functional_type;
186 typedef typename Feel::detail::compute_functionalLinear_return<Args>::ptrtype functional_ptrtype;
187 return functional_ptrtype (
new functional_type( space , backend ) );