30 #define __MeshMover_H 1
41 template<
typename MeshType>
51 typedef MeshType mesh_type;
52 typedef boost::shared_ptr<mesh_type> mesh_ptrtype;
54 typedef typename mesh_type::value_type value_type;
56 typedef typename mesh_type::gm_type gm_type;
57 typedef boost::shared_ptr<gm_type> gm_ptrtype;
59 typedef typename mesh_type::element_iterator element_iterator;
60 typedef typename mesh_type::element_const_iterator element_const_iterator;
108 template<
typename DisplType>
109 value_type tryit( DisplType
const& u );
111 template<
typename DisplType>
113 void apply( mesh_ptrtype& imesh, DisplType
const& u );
122 template<
typename MeshType>
123 template<
typename DisplType>
124 typename MeshMover<MeshType>::value_type
132 template<
typename MeshType>
133 template<
typename DisplType>
137 MeshMover<MeshType>::apply( mesh_ptrtype& imesh, DisplType
const& u )
142 DVLOG(2) <<
"[Dof::generateDofPoints] generating dof coordinates\n";
143 typedef typename mesh_type::element_type element_type;
144 typedef typename gm_type::template Context<vm::POINT, element_type> gm_context_type;
145 typedef boost::shared_ptr<gm_context_type> gm_context_ptrtype;
147 typedef typename DisplType::functionspace_type::fe_type fe_type;
148 typedef typename fe_type::template Context<vm::POINT, fe_type, gm_type, element_type> fecontext_type;
151 gm_ptrtype gm(
new gm_type );
158 typename gm_type::precompute_ptrtype __geopc(
new typename gm_type::precompute_type( gm, gm->points() ) );
164 element_iterator it_elt = imesh->beginElementWithProcessId( imesh->worldComm().localRank() );
165 element_iterator en_elt = imesh->endElementWithProcessId( imesh->worldComm().localRank() );
166 typedef typename DisplType::pc_type pc_type;
167 typedef boost::shared_ptr<pc_type> pc_ptrtype;
168 pc_ptrtype __pc(
new pc_type( u.functionSpace()->fe(), gm->points() ) );
169 gm_context_ptrtype __c(
new gm_context_type( gm, *it_elt, __geopc ) );
171 typedef typename mesh_type::element_type geoelement_type;
172 typedef typename fe_type::template Context<0, fe_type, gm_type, geoelement_type,gm_context_type::context> fectx_type;
173 typedef boost::shared_ptr<fectx_type> fectx_ptrtype;
174 fectx_ptrtype __ctx(
new fectx_type( u.functionSpace()->fe(),
177 typedef typename fectx_type::id_type m_type;
178 typedef boost::multi_array<m_type,1> array_type;
179 array_type uvalues( u.idExtents( *__ctx ) );
180 std::fill( uvalues.data(), uvalues.data()+uvalues.num_elements(), m_type::Zero() );
181 u.id( *__ctx, uvalues );
186 std::map<int,bool> points_done;
189 u.updateGlobalValues();
192 uint16_type nptsperelem = gm->points().size2();
193 ublas::vector<value_type>
val( fe_type::nComponents );
195 for ( ; it_elt != en_elt; ++it_elt )
197 __c->update( *it_elt );
198 __ctx->update( __c );
199 std::fill( uvalues.data(), uvalues.data()+uvalues.num_elements(), m_type::Zero() );
200 u.id( *__ctx, uvalues );
202 for ( uint16_type l =0; l < nptsperelem; ++l )
204 for ( uint16_type comp = 0; comp < fe_type::nComponents; ++comp )
206 val[ comp ] = uvalues[l]( comp,0 );
209 if ( points_done.find( it_elt->point( l ).id() ) == points_done.end() )
212 imesh->elements().modify( it_elt,
213 lambda::bind( &element_type::applyDisplacement,
217 points_done[it_elt->point( l ).id()] =
true;
223 imesh->elements().modify( it_elt,
224 lambda::bind( &element_type::applyDisplacementG,
232 imesh->gm()->initCache( imesh.get() );
233 imesh->gm1()->initCache( imesh.get() );
235 imesh->meshChanged( MESH_CHANGES_POINTS_COORDINATES );
238 imesh->tool_localization()->reset();
241 template<
typename MeshType,
typename DisplType>
242 boost::shared_ptr<MeshType>
243 meshMove( boost::shared_ptr<MeshType>& m, DisplType
const& u )
245 MeshMover<MeshType> mover( m );