long create_mapping(LinPdeSysT & pde_system, std::size_t pde_index, DomainType const & domain, QuantityContainerT & quantities, long start_index = 0) { typedef typename viennagrid::result_of::cell<DomainType>::type CellTag; typedef typename viennagrid::result_of::const_element_range<DomainType, CellTag>::type CellContainer; typedef typename viennagrid::result_of::iterator<CellContainer>::type CellIterator; typedef typename QuantityContainerT::value_type QuantityType; long map_index = start_index; long unknown_id = pde_system.unknown(pde_index)[0].id(); QuantityType & quan = quantities.at(unknown_id); CellContainer cells(domain); for (CellIterator cit = cells.begin(); cit != cells.end(); ++cit) { if (quan.get_unknown_mask(*cit)) // quantity is set to unknown here, so it gets an unknown index assigned { quan.set_unknown_index(*cit, map_index); map_index += pde_system.unknown(pde_index).size(); } else quan.set_unknown_index(*cit, -1); } return map_index; }
void operator()(LinPdeSysT const & pde_system, SegmentT const & segment, StorageType & storage, MatrixT & system_matrix, VectorT & load_vector) { typedef viennamath::equation equ_type; typedef viennamath::expr expr_type; typedef typename expr_type::interface_type interface_type; typedef typename expr_type::numeric_type numeric_type; typedef typename viennagrid::result_of::cell_tag<SegmentT>::type CellTag; std::size_t map_index = viennafvm::create_mapping(pde_system, segment, storage); system_matrix.clear(); system_matrix.resize(map_index, map_index, false); load_vector.clear(); load_vector.resize(map_index); for (std::size_t pde_index = 0; pde_index < pde_system.size(); ++pde_index) { #ifdef VIENNAFVM_DEBUG std::cout << std::endl; std::cout << "//" << std::endl; std::cout << "// Equation " << pde_index << std::endl; std::cout << "//" << std::endl; #endif assemble(pde_system, pde_index, segment, storage, system_matrix, load_vector); } // for pde_index } // functor
long create_mapping(LinPdeSysT & pde_system, DomainType const & domain, QuantityContainerT & quantities) { long next_index = 0; for (std::size_t pde_index = 0; pde_index < pde_system.size(); ++pde_index) { next_index = create_mapping(pde_system, pde_index, domain, quantities, next_index); } return next_index; }