void save(Archive & ar, const unsigned int version) const
      {
        if (!mesh_pointer)
          throw bad_serialization_state_exception( "Mesh not loaded into serialzer object" );

        MeshT const & mesh_obj = *mesh_pointer;

        // -----------------------------------------------
        // the geometry is read and transmitted
        //
        std::size_t point_size = viennagrid::vertices(mesh_obj).size();
        ar & point_size;
        ConstVertexRange vertices(mesh_obj);
        for (ConstVertexIterator vit = vertices.begin();
             vit != vertices.end(); ++vit)
        {
          for(int d = 0; d < DIMG; d++)
            ar & viennagrid::point(*vit)[d];
        }


        // -----------------------------------------------
        // the specific cells are read and transmitted
        //
        ConstCellRange cells(mesh_obj);

        std::size_t cell_size = viennagrid::cells(mesh_obj).size();
        ar & cell_size;

        for (ConstCellIterator cit = cells.begin();
        cit != cells.end(); ++cit)
        {
          ConstVertexOnCellRange vertices_on_cell(*cit);

          for (ConstVertexOnCellIterator vocit = vertices_on_cell.begin();
          vocit != vertices_on_cell.end();
          ++vocit)
          {
            std::size_t id = vocit->id().get();
            ar & id;
          }
        }
        // -----------------------------------------------
      }
  void project_mesh_impl( InputMeshT const & input_mesh, InputSegmentationT const & input_segmentation,
                          OutputMeshT & output_mesh, OutputSegmentationT & output_segmentation )
  {
    typedef typename viennagrid::result_of::point<InputMeshT>::type InputPointType;
    typedef typename viennagrid::result_of::point<OutputMeshT>::type OutputPointType;

    typedef typename viennagrid::result_of::cell<InputMeshT>::type InputCellType;
    typedef typename viennagrid::result_of::cell_id<InputMeshT>::type InputCellIDType;

    typedef typename viennagrid::result_of::cell_handle<OutputMeshT>::type OutputCellHandleType;

    typedef typename viennagrid::result_of::vertex_id<InputMeshT>::type InputVertexIDType;
    typedef typename viennagrid::result_of::vertex_handle<OutputMeshT>::type OutputVertexHandleType;

    std::map<InputVertexIDType, OutputVertexHandleType> vertex_map;

    typedef typename viennagrid::result_of::const_vertex_range<InputMeshT>::type ConstInputVertexRangeType;
    typedef typename viennagrid::result_of::iterator<ConstInputVertexRangeType>::type ConstInputVertexIteratorType;

    ConstInputVertexRangeType vertices(input_mesh);
    for (ConstInputVertexIteratorType vit = vertices.begin(); vit != vertices.end(); ++vit)
    {
      InputPointType in_point = viennagrid::point(*vit);
      OutputPointType out_point;
      for (unsigned int i = 0; i != out_point.size(); ++i)
        out_point[i] = in_point[i];

      vertex_map[ vit->id() ] = viennagrid::make_vertex( output_mesh, out_point );
    }

    std::map<InputCellIDType, OutputCellHandleType> cell_map;

    typedef typename viennagrid::result_of::segment_handle<InputSegmentationT>::type InputSegmentHandleType;
    typedef typename viennagrid::result_of::segment_handle<OutputSegmentationT>::type OutputSegmentHandleType;

    for (typename InputSegmentationT::const_iterator sit = input_segmentation.begin(); sit != input_segmentation.end(); ++sit)
    {
      OutputSegmentHandleType & output_segment = output_segmentation.get_make_segment( sit->id() );

      typedef typename viennagrid::result_of::const_cell_range<InputSegmentHandleType>::type ConstInputCellRangeType;
      typedef typename viennagrid::result_of::iterator<ConstInputCellRangeType>::type ConstInputCellIteratorType;

      ConstInputCellRangeType cells(*sit);
      for (ConstInputCellIteratorType cit = cells.begin(); cit != cells.end(); ++cit)
      {
        typedef typename viennagrid::result_of::const_vertex_range<InputCellType>::type ConstVertexOnInputCellRangeType;
        typedef typename viennagrid::result_of::iterator<ConstVertexOnInputCellRangeType>::type ConstVertexOnInputCellIteratorType;

        typename std::map<InputCellIDType, OutputCellHandleType>::iterator cmit = cell_map.find( cit->id() );
        if (cmit != cell_map.end())
        {
          viennagrid::add( output_segment, viennagrid::dereference_handle(output_mesh, cmit->second) );
        }
        else
        {
          ConstVertexOnInputCellRangeType vertices_on_cell( *cit );
          std::vector<OutputVertexHandleType> vertex_handles;
          for (ConstVertexOnInputCellIteratorType vit = vertices_on_cell.begin(); vit != vertices_on_cell.end(); ++vit)
            vertex_handles.push_back( vertex_map[vit->id()] );

          cell_map[ cit->id() ] = viennagrid::make_cell( output_segment, vertex_handles.begin(), vertex_handles.end() );
        }
      }
    }
  }
Beispiel #3
0
      static void apply1(ElementType const & element_in, MeshTypeOut & segment_out,
                         EdgeRefinementFlagAccessor const edge_refinement_flag_accessor, VertexToVertexHandleAccessor const vertex_to_vertex_handle_accessor, EdgeToVertexHandleAccessor const edge_to_vertex_handle_accessor)
      {
        typedef typename viennagrid::result_of::const_element_range<ElementType, viennagrid::vertex_tag>::type            VertexOnCellRange;
        typedef typename viennagrid::result_of::iterator<VertexOnCellRange>::type         VertexOnCellIterator;
        typedef typename viennagrid::result_of::const_element_range<ElementType, viennagrid::line_tag>::type            EdgeOnCellRange;
        typedef typename viennagrid::result_of::iterator<EdgeOnCellRange>::type           EdgeOnCellIterator;

        typedef typename viennagrid::result_of::handle<MeshTypeOut, viennagrid::vertex_tag>::type             VertexHandleType;
        typedef typename viennagrid::result_of::element<MeshTypeOut, viennagrid::line_tag>::type             EdgeType;

        const unsigned int num_vertices = boundary_elements<triangle_tag, vertex_tag>::num;
        static_array<VertexHandleType, num_vertices+1> vertex_handles;


        //
        // Step 1: Get vertices on the new mesh
        //

        //grab existing vertices:
        VertexOnCellRange vertices_on_cell(element_in);
        VertexOnCellIterator vocit = vertices_on_cell.begin();
        vertex_handles[0] = vertex_to_vertex_handle_accessor(*vocit); ++vocit;
        vertex_handles[1] = vertex_to_vertex_handle_accessor(*vocit); ++vocit;
        vertex_handles[2] = vertex_to_vertex_handle_accessor(*vocit);

        //add vertices from edge
        EdgeOnCellRange edges_on_cell(element_in);
        std::size_t offset = 0;
        EdgeOnCellIterator eocit = edges_on_cell.begin();
        EdgeType const & e0 = *eocit; ++eocit;
        EdgeType const & e1 = *eocit; ++eocit;
        EdgeType const & e2 = *eocit;

        if ( edge_refinement_flag_accessor(e0) )
        {
          vertex_handles[3] = edge_to_vertex_handle_accessor(e0);
          offset = 0;
        }
        else if ( edge_refinement_flag_accessor(e1) )
        {
          vertex_handles[3] = edge_to_vertex_handle_accessor(e1);
          offset = 2;
        }
        else if ( edge_refinement_flag_accessor(e2) )
        {
          vertex_handles[3] = edge_to_vertex_handle_accessor(e2);
          offset = 1;
        }
        else
        {
          assert( (2 < 2) && "Logic error: Triangle does not have an edges for bisection!");
        }

        //
        // Step 2: Add new cells to new mesh:
        //
        //0-3-2
        make_refinement_element<ElementType>( segment_out, vertex_handles, (offset + 0) % num_vertices, 3, (offset + 2) % num_vertices );

        //3-1-2:
        make_refinement_element<ElementType>( segment_out, vertex_handles, 3, (offset + 1) % num_vertices, (offset + 2) % num_vertices );
      } //apply1()