/** Generate elements */ static void makeElements( const SURF& surf, std::vector<Element>& elements ) { const unsigned n1 = surf.numIntervals1(); const unsigned n2 = surf.numIntervals2(); for ( unsigned j = 0; j < n2; j++ ) { for ( unsigned i = 0; i < n1; i++ ) { // following indices with boundary periodicity const std::size_t iNext = ( i < n1 - 1 ? i+1 : (surf.periodic1() ? 0 : i+1) ); const std::size_t jNext = ( j < n2 - 1 ? j+1 : (surf.periodic2() ? 0 : j+1) ); // index shift to next line const unsigned stride = n1 + static_cast<unsigned>(not surf.periodic1()); // the four vertices of a quadrilateral const std::size_t i1 = j * stride + i; const std::size_t i2 = j * stride + iNext; const std::size_t i4 = jNext * stride + i; const std::size_t i3 = jNext * stride + iNext; if ( surf.withTriangles() ) { // generate two triangles Element tri1, tri2; tri1.push_back( i1 ); tri1.push_back( i2 ); tri1.push_back( i3 ); tri2.push_back( i3 ); tri2.push_back( i4 ); tri2.push_back( i1 ); elements.push_back( tri1 ); elements.push_back( tri2 ); } else { // generate a quadrilateral Element quad; quad.push_back( i1 ); quad.push_back( i2 ); quad.push_back( i3 ); quad.push_back( i4 ); elements.push_back( quad ); } } } return; }
/** Generate points */ static void makePoints( const SURF& surf, std::vector<Point>& points ) { const unsigned n1 = surf.numIntervals1() + (surf.periodic1() ? 0 : 1 ); const unsigned n2 = surf.numIntervals2() + (surf.periodic2() ? 0 : 1 ); for ( unsigned j = 0; j < n2; j++ ) { for ( unsigned i = 0; i < n1; i++ ) { points.push_back( surf.makePoint( i, j ) ); } } }