heavysideFunction::nodes_type heavysideFunction::transformToReal( nodes_type const& Gt ) const { gm_ptrtype _gm_ptr( new gm_type ); gm_type::precompute_ptrtype __geopc( new gm_type::precompute_type( _gm_ptr, Gt ) ); gm_type::Context<vm::POINT, element_type> gmc( _gm_ptr, *M_elt, __geopc ); return gmc.xReal(); }
typename Evaluator<iDim, Iterator, Pset, ExprT>::eval_element_type Evaluator<iDim, Iterator, Pset, ExprT>::operator()( mpl::size_t<MESH_FACES> ) const { boost::timer __timer; VLOG(2) << "evaluator(MESH_FACES) " << "\n"; // // a few typedefs // // mesh element typedef typename mesh_element_type::entity_type geoelement_type; //typedef typename geoelement_type::face_type face_type; typedef mesh_element_type face_type; // geometric mapping context typedef typename geoelement_type::gm_type gm_type; typedef boost::shared_ptr<gm_type> gm_ptrtype; typedef typename geoelement_type::gm1_type gm1_type; typedef boost::shared_ptr<gm1_type> gm1_ptrtype; typedef typename gm_type::template Context<context, geoelement_type> gmc_type; typedef boost::shared_ptr<gmc_type> gmc_ptrtype; typedef fusion::map<fusion::pair<vf::detail::gmc<0>, gmc_ptrtype> > map_gmc_type; typedef typename gm1_type::template Context<context, geoelement_type> gmc1_type; typedef boost::shared_ptr<gmc1_type> gmc1_ptrtype; typedef fusion::map<fusion::pair<vf::detail::gmc<0>, gmc1_ptrtype> > map_gmc1_type; // expression //typedef typename expression_type::template tensor<map_gmc_type,fecontext_type> t_expr_type; //typedef decltype( basis_type::isomorphism( M_expr ) ) the_expression_type; typedef expression_type the_expression_type; typedef typename boost::remove_reference<typename boost::remove_const<the_expression_type>::type >::type iso_expression_type; typedef typename iso_expression_type::template tensor<map_gmc_type> t_expr_type; typedef typename iso_expression_type::template tensor<map_gmc1_type> t_expr1_type; typedef typename t_expr_type::shape shape; // // start // iterator_type __face_it, __face_en; boost::tie( boost::tuples::ignore, __face_it, __face_en ) = M_range; int npoints = M_pset.fpoints(0,1).size2(); element_type __v( M_pset.fpoints(0,1).size2()*std::distance( __face_it, __face_en )*shape::M ); node_type __p( mesh_element_type::nRealDim, M_pset.fpoints(0,1).size2()*std::distance( __face_it, __face_en ) ); __v.setZero(); __p.setZero(); VLOG(2) << "pset: " << M_pset.fpoints(0,1); VLOG(2) << "Checking trivial result..."; if ( __face_it == __face_en ) return boost::make_tuple( __v, __p ); gm_ptrtype __gm( new gm_type ); gm1_ptrtype __gm1( new gm1_type ); // // Precompute some data in the reference element for // geometric mapping and reference finite element // typedef typename geoelement_type::permutation_type permutation_type; typedef typename gm_type::precompute_ptrtype geopc_ptrtype; typedef typename gm_type::precompute_type geopc_type; typedef typename gm1_type::precompute_ptrtype geopc1_ptrtype; typedef typename gm1_type::precompute_type geopc1_type; std::vector<std::map<permutation_type, geopc_ptrtype> > __geopc( M_pset.nFaces() ); std::vector<std::map<permutation_type, geopc1_ptrtype> > __geopc1( M_pset.nFaces() ); VLOG(2) << "computing geopc..."; for ( uint16_type __f = 0; __f < M_pset.nFaces(); ++__f ) { for ( permutation_type __p( permutation_type::IDENTITY ); __p < permutation_type( permutation_type::N_PERMUTATIONS ); ++__p ) { __geopc[__f][__p] = geopc_ptrtype( new geopc_type( __gm, M_pset.fpoints(__f, __p.value() ) ) ); __geopc1[__f][__p] = geopc1_ptrtype( new geopc1_type( __gm1, M_pset.fpoints(__f, __p.value() ) ) ); DVLOG(2) << "pset " << __f << " : " << M_pset.fpoints(__f, __p.value() ); CHECK( __geopc[__f][__p]->nPoints() ) << "invalid number of points for geopc"; CHECK( __geopc1[__f][__p]->nPoints() ) << "invalid number of points for geopc1"; } } uint16_type __face_id = __face_it->pos_first(); gmc_ptrtype __c( new gmc_type( __gm, __face_it->element( 0 ), __geopc, __face_id ) ); gmc1_ptrtype __c1( new gmc1_type( __gm1, __face_it->element( 0 ), __geopc1, __face_id ) ); map_gmc_type mapgmc( fusion::make_pair<vf::detail::gmc<0> >( __c ) ); t_expr_type expr( M_expr, mapgmc ); map_gmc1_type mapgmc1( fusion::make_pair<vf::detail::gmc<0> >( __c1 ) ); t_expr1_type expr1( M_expr, mapgmc1 ); size_type nbFaceDof = invalid_size_type_value; for ( int e = 0; __face_it != __face_en; ++__face_it, ++e ) { FEELPP_ASSERT( __face_it->isOnBoundary() && !__face_it->isConnectedTo1() ) ( __face_it->marker() ) ( __face_it->isOnBoundary() ) ( __face_it->ad_first() ) ( __face_it->pos_first() ) ( __face_it->ad_second() ) ( __face_it->pos_second() ) ( __face_it->id() ).warn( "inconsistent data face" ); DVLOG(2) << "[evaluator] FACE_ID = " << __face_it->id() << " element id= " << __face_it->ad_first() << " pos in elt= " << __face_it->pos_first() << " marker: " << __face_it->marker() << "\n"; DVLOG(2) << "[evaluator] FACE_ID = " << __face_it->id() << " real pts=" << __face_it->G() << "\n"; uint16_type __face_id = __face_it->pos_first(); switch ( M_geomap_strategy ) { default: case GeomapStrategyType::GEOMAP_OPT: case GeomapStrategyType::GEOMAP_HO: { __c->update( __face_it->element( 0 ), __face_id ); DVLOG(2) << "[evaluator::GEOMAP_HO|GEOMAP_OPT] FACE_ID = " << __face_it->id() << " ref pts=" << __c->xRefs() << "\n"; DVLOG(2) << "[evaluator::GEOMAP_HO|GEOMAP_OPT] FACE_ID = " << __face_it->id() << " real pts=" << __c->xReal() << "\n"; map_gmc_type mapgmc( fusion::make_pair<vf::detail::gmc<0> >( __c ) ); expr.update( mapgmc ); for ( uint16_type p = 0; p < npoints; ++p ) { for ( uint16_type c1 = 0; c1 < mesh_element_type::nRealDim; ++c1 ) { __p(c1, e*npoints+p) = __c->xReal(p)[c1]; } for ( uint16_type c1 = 0; c1 < shape::M; ++c1 ) { __v( e*npoints*shape::M+shape::M*p+c1) = expr.evalq( c1, 0, p ); } } } break; case GeomapStrategyType::GEOMAP_O1: { __c1->update( __face_it->element( 0 ), __face_id ); DVLOG(2) << "[evaluator::GEOMAP_O1] FACE_ID = " << __face_it->id() << " ref pts=" << __c1->xRefs() << "\n"; DVLOG(2) << "[evaluator::GEOMAP_O1] FACE_ID = " << __face_it->id() << " real pts=" << __c1->xReal() << "\n"; map_gmc1_type mapgmc1( fusion::make_pair<vf::detail::gmc<0> >( __c1 ) ); expr1.update( mapgmc1 ); for ( uint16_type p = 0; p < npoints; ++p ) { for ( uint16_type c1 = 0; c1 < mesh_element_type::nRealDim; ++c1 ) { __p(c1, e*npoints+p) = __c1->xReal(p)[c1]; } for ( uint16_type c1 = 0; c1 < shape::M; ++c1 ) { __v( e*npoints*shape::M+shape::M*p+c1) = expr1.evalq( c1, 0, p ); } } } break; } } // face_it return boost::make_tuple( __v, __p ); }
void modifVec(std::list<ElementRange> const& __r, eltType const& u,vectorType & UnVec,ExprType const& expr, size_type rowstart, int ComponentShiftFactor, mpl::int_<MESH_FACES> /**/ ) { //using namespace Feel::vf; typedef typename eltType::functionspace_type::mesh_type mesh_type; typedef typename mesh_type::face_iterator face_iterator; typedef typename mesh_type::face_const_iterator face_const_iterator; typedef typename mesh_type::element_type geoelement_type; typedef typename geoelement_type::face_type face_type; // basis typedef typename eltType::functionspace_type::fe_type fe_type; typedef typename eltType::functionspace_type::dof_type dof_type; const size_type context = ExprType::context|vm::POINT; // geometric mapping context typedef typename mesh_type::gm_type gm_type; typedef boost::shared_ptr<gm_type> gm_ptrtype; typedef typename gm_type::template Context<context, geoelement_type> gmc_type; typedef boost::shared_ptr<gmc_type> gmc_ptrtype; typedef fusion::map<fusion::pair<vf::detail::gmc<0>, gmc_ptrtype> > map_gmc_type; typedef typename ExprType::template tensor<map_gmc_type> t_expr_type; if ( __r.size() == 0 ) return; auto __face_it = __r.begin()->template get<1>(); auto __face_en = __r.begin()->template get<2>(); //if ( __face_it == __face_en ) return; bool findAFace = false; for( auto lit = __r.begin(), len = __r.end(); lit != len; ++lit ) { __face_it = lit->template get<1>(); __face_en = lit->template get<2>(); if ( __face_it != __face_en ) { findAFace=true; break; } } if ( !findAFace ) return; // get the first face properly connected bool findAFaceToInit=false; for( auto lit = __r.begin(), len = __r.end(); lit != len; ++lit ) { __face_it = lit->template get<1>(); __face_en = lit->template get<2>(); for( ; __face_it != __face_en; ++__face_it ) { if ( boost::unwrap_ref(*__face_it).isConnectedTo0() ) { findAFaceToInit=true; break; } } if ( findAFaceToInit ) break; } CHECK( findAFaceToInit ) << "not find a face to init\n"; size_type nbFaceDof = invalid_size_type_value; if ( !fe_type::is_modal ) nbFaceDof = ( face_type::numVertices * fe_type::nDofPerVertex + face_type::numEdges * fe_type::nDofPerEdge + face_type::numFaces * fe_type::nDofPerFace ); else nbFaceDof = face_type::numVertices * fe_type::nDofPerVertex; //dof_type const* __dof = u.functionSpace()->dof().get(); fe_type const* __fe = u.functionSpace()->fe().get(); gm_ptrtype __gm( new gm_type ); // // Precompute some data in the reference element for // geometric mapping and reference finite element // typedef typename geoelement_type::permutation_type permutation_type; typedef typename gm_type::precompute_ptrtype geopc_ptrtype; typedef typename gm_type::precompute_type geopc_type; std::vector<std::map<permutation_type, geopc_ptrtype> > __geopc( geoelement_type::numTopologicalFaces ); for ( uint16_type __f = 0; __f < geoelement_type::numTopologicalFaces; ++__f ) { permutation_type __p( permutation_type::IDENTITY ); __geopc[__f][__p] = geopc_ptrtype( new geopc_type( __gm, __fe->points( __f ) ) ); } uint16_type __face_id = __face_it->pos_first(); gmc_ptrtype __c( new gmc_type( __gm, __face_it->element(0), __geopc, __face_id ) ); map_gmc_type mapgmc( fusion::make_pair<vf::detail::gmc<0> >( __c ) ); t_expr_type LExpr( expr, mapgmc ); std::vector<bool> dofdone( u.functionSpace()->dof()->nLocalDofWithGhost(), false ); //face_const_iterator __face_it, __face_en; for( auto lit = __r.begin(), len = __r.end(); lit != len; ++lit ) { __face_it = lit->template get<1>(); __face_en = lit->template get<2>(); for ( ; __face_it != __face_en; ++__face_it ) { uint16_type __face_id = __face_it->pos_first(); __c->update( __face_it->element(0), __face_id ); map_gmc_type mapgmc( fusion::make_pair<vf::detail::gmc<0> >( __c ) ); LExpr.update( mapgmc ); for (uint c1=0;c1<eltType::nComponents1;c1++) for (uint c2=0;c2<eltType::nComponents2;c2++) { for ( uint16_type l = 0; l < nbFaceDof; ++l ) { size_type index = boost::get<0>(u.functionSpace()->dof()->faceLocalToGlobal( __face_it->id(), l, c1 )); if ( dofdone[index] ) continue; size_type thedof = u.start() + ComponentShiftFactor*index; double __value=LExpr.evalq( c1, c2, l ); //u( thedof ) = __value; UnVec->set(rowstart+thedof,__value); dofdone[index] = true; } } } } //UnVec->close(); } // modifVec