/*============================================================================ * Append sections to a nodal representation associated with a mesh *============================================================================*/ /* This file is part of the "Finite Volume Mesh" library, intended to provide finite volume mesh and associated fields I/O and manipulation services. Copyright (C) 2004-2006 EDF This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ /*---------------------------------------------------------------------------- * Standard C library headers *----------------------------------------------------------------------------*/ #include #include #include #include /*---------------------------------------------------------------------------- * BFT library headers *----------------------------------------------------------------------------*/ #include #include /*---------------------------------------------------------------------------- * Local headers *----------------------------------------------------------------------------*/ #include #include #include #include #include #include /*---------------------------------------------------------------------------- * Header for the current file *----------------------------------------------------------------------------*/ #include /*----------------------------------------------------------------------------*/ #ifdef __cplusplus extern "C" { #if 0 } /* Fake brace to force back Emacs auto-indentation back to column 0 */ #endif #endif /* __cplusplus */ /*============================================================================ * Static global variables *============================================================================*/ /*============================================================================ * Private function definitions *============================================================================*/ /*---------------------------------------------------------------------------- * Create new section, transferring ownership of the given connectivity * and optional parent number arrays to that section. * * parameters: * n_elements <-- number of elements in section * type <-- type of elements to add * face_index <-- polyhedron -> faces index (O to n-1) * size: n_elements + 1 * face_num <-- polyhedron -> face numbers (1 to n, signed, * > 0 for outwards pointing face normal * < 0 for inwards pointing face normal); * size: face_index[n_elements] * vertex_index <-- polygon face -> vertices index (O to n-1) * size: face_index[n_elements] * vertex_num <-- element -> vertex connectivity * parent_element_num <-- element -> parent element number (1 to n) if non * trivial (i.e. if element definitions correspond * to a subset of the parent mesh), NULL otherwise *----------------------------------------------------------------------------*/ static fvm_nodal_section_t * _transfer_to_section(fvm_lnum_t n_elements, fvm_element_t type, fvm_lnum_t face_index[], fvm_lnum_t face_num[], fvm_lnum_t vertex_index[], fvm_lnum_t vertex_num[], fvm_lnum_t parent_element_num[]) { fvm_nodal_section_t *this_section = NULL; this_section = fvm_nodal_section_create(type); this_section->n_elements = n_elements; /* Connectivity */ if (type == FVM_CELL_POLY) { this_section->_face_index = face_index; this_section->_face_num = face_num; } if (type == FVM_FACE_POLY || type == FVM_CELL_POLY) this_section->_vertex_index = vertex_index; this_section->_vertex_num = vertex_num; this_section->_parent_element_num = parent_element_num; /* Shared arrays */ this_section->face_index = this_section->_face_index; this_section->face_num = this_section->_face_num; this_section->vertex_index = this_section->_vertex_index; this_section->vertex_num = this_section->_vertex_num; this_section->parent_element_num = this_section->_parent_element_num; /* Connectivity size */ if (this_section->stride != 0) this_section->connectivity_size = this_section->n_elements * this_section->stride; else if (this_section->type == FVM_FACE_POLY) this_section->connectivity_size = this_section->vertex_index[this_section->n_elements] - 1; else if (this_section->type == FVM_CELL_POLY) { fvm_lnum_t i, _face_num; for (i = 0; i < this_section->face_index[this_section->n_elements]; i++) { _face_num = FVM_ABS(this_section->face_num[i]); if (_face_num > this_section->n_faces) this_section->n_faces = _face_num; } this_section->connectivity_size = this_section->vertex_index[this_section->n_faces] - 1; } return this_section; } /*============================================================================ * Public function definitions *============================================================================*/ /*---------------------------------------------------------------------------- * Append a new section to an existing fvm_nodal mesh, and transfer * ownership of the given connectivity and optional parent number arrays to * that section. * * parameters: * this_nodal <-> nodal mesh structure * n_elements <-- number of elements to add * type <-- type of elements to add * face_index <-- polyhedron -> faces index (O to n-1) * size: n_elements + 1 * face_num <-- polyhedron -> face numbers (1 to n, signed, * > 0 for outwards pointing face normal * < 0 for inwards pointing face normal); * size: face_index[n_elements] * vertex_index <-- polygon face -> vertices index (O to n-1) * size: face_index[n_elements] * vertex_num <-- element -> vertex connectivity * parent_element_num <-- element -> parent element number (1 to n) if non * trivial (i.e. if element definitions correspond * to a subset of the parent mesh), NULL otherwise *----------------------------------------------------------------------------*/ void fvm_nodal_append_by_transfer(fvm_nodal_t *this_nodal, fvm_lnum_t n_elements, fvm_element_t type, fvm_lnum_t face_index[], fvm_lnum_t face_num[], fvm_lnum_t vertex_index[], fvm_lnum_t vertex_num[], fvm_lnum_t parent_element_num[]) { fvm_nodal_section_t *new_section = NULL; int n_sections = 0; assert(this_nodal != NULL); n_sections = this_nodal->n_sections; /* Create new section */ BFT_REALLOC(this_nodal->sections, n_sections + 1, fvm_nodal_section_t *); new_section = _transfer_to_section(n_elements, type, face_index, face_num, vertex_index, vertex_num, parent_element_num); this_nodal->sections[n_sections] = new_section; this_nodal->n_sections += 1; /* Update main structure information */ switch(new_section->entity_dim) { case 3: this_nodal->n_cells += n_elements; break; case 2: this_nodal->n_faces += n_elements; break; case 1: this_nodal->n_edges += n_elements; break; default: assert(0); } } /*----------------------------------------------------------------------------*/ #ifdef __cplusplus } #endif /* __cplusplus */