33 #include <boost/lambda/lambda.hpp>
34 #include <boost/lambda/bind.hpp>
38 #include <feel/feeldiscr/functionspace.hpp>
43 namespace lambda = boost::lambda;
48 template<
typename SpaceType,
typename Expr>
49 typename SpaceType::element_type
50 region( boost::shared_ptr<SpaceType>
const& space,
53 BOOST_STATIC_ASSERT( SpaceType::fe_type::nOrder == 0 );
54 typedef typename SpaceType::element_type element_type;
55 element_type v( space,
"field" );
56 VLOG(1) <<
"[region] saving region with pid:\n";
57 int pid = space->mesh()->comm().rank();
58 VLOG(1) <<
"[region] saving region with pid: " << pid <<
"\n";
59 auto it = space->mesh()->beginElementWithProcessId( pid );
60 auto en = space->mesh()->endElementWithProcessId( pid );
61 VLOG(1) <<
"[region] nb elements in region: " << std::distance( it, en ) <<
"\n";
62 for ( ; it != en; ++it )
64 size_type dof_id = boost::get<0>( space->dof()->localToGlobal( it->id(),0, 0 ) );
66 if ( dof_id >= v.firstLocalIndex() &&
67 dof_id < v.lastLocalIndex() )
68 v ( dof_id ) = expr( *it );
82 template<
typename SpaceType,
typename Expr>
83 typename SpaceType::element_type
84 regionv( boost::shared_ptr<SpaceType>
const& space,
87 BOOST_STATIC_ASSERT( SpaceType::fe_type::nOrder == 0 );
88 typedef typename SpaceType::element_type element_type;
89 element_type v( space,
"field" );
91 int pid = space->mesh()->comm().rank();
92 typename SpaceType::mesh_type::element_const_iterator it = space->mesh()->beginElementWithProcessId( pid );
93 typename SpaceType::mesh_type::element_const_iterator en = space->mesh()->endElementWithProcessId( pid );
95 for ( ; it != en; ++it )
97 size_type dof_id = boost::get<0>( space->dof()->localToGlobal( it->id(),0, 0 ) );
99 if ( dof_id >= v.firstLocalIndex() &&
100 dof_id < v.lastLocalIndex() )
101 v ( dof_id ) = expr( *it ).value();
111 template<
typename SpaceType>
112 typename SpaceType::element_type
113 regionProcess( boost::shared_ptr<SpaceType>
const& space )
115 return region( space, lambda::bind( &SpaceType::mesh_type::element_type::processId, lambda::_1 ) );
124 template<
typename SpaceType>
125 typename SpaceType::element_type
126 apply( boost::shared_ptr<SpaceType>
const& space )
128 return regionProcess( space );
136 template<
typename SpaceType>
137 typename SpaceType::element_type
138 regionMarker( boost::shared_ptr<SpaceType>
const& space )
140 return region( space, lambda::bind( &SpaceType::mesh_type::element_type::marker, lambda::_1 ) );
148 template<
typename SpaceType>
149 typename SpaceType::element_type
150 apply( boost::shared_ptr<SpaceType>
const& space )
152 return regionMarker( space );
160 template<
typename SpaceType>
161 typename SpaceType::element_type
162 regionMarker2( boost::shared_ptr<SpaceType>
const& space )
164 return region( space, lambda::bind( &SpaceType::mesh_type::element_type::marker2, lambda::_1 ) );
173 template<
typename SpaceType>
174 typename SpaceType::element_type
175 apply( boost::shared_ptr<SpaceType>
const& space )
177 return regionMarker2( space );
185 template<
typename SpaceType>
186 typename SpaceType::element_type
187 regionMarker3( boost::shared_ptr<SpaceType>
const& space )
189 return region( space, lambda::bind( &SpaceType::mesh_type::element_type::marker3, lambda::_1 ) );
198 template<
typename SpaceType>
199 typename SpaceType::element_type
200 apply( boost::shared_ptr<SpaceType>
const& space )
202 return regionMarker3( space );