| /** | |
| * @defgroup Gem Gem class | |
| * @brief The geometry manager object. | |
| */ | |
| /** | |
| * @file gem.h | |
| * @ingroup Gem | |
| * @brief Class Gem: the geometry manager object. | |
| * @author Michael Holst | |
| * @note None | |
| * @version $Id: gem.h,v 1.43 2010/08/12 05:19:05 fetk Exp $ | |
| * | |
| * @attention | |
| * @verbatim | |
| * | |
| * MC = < Manifold Code > | |
| * Copyright (C) 1994-- Michael Holst | |
| * | |
| * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| * | |
| * @endverbatim | |
| */ | |
| /** @brief Class Gem: Parameters and datatypes */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Contains public data memebers for Gem class | |
| * @author Michael Holst | |
| */ | |
| struct sGem { | |
| /** @brief Intrinsic spatial dim (2 for sphere) */ | |
| int dim; | |
| /** @brief Imbedded spatial dim (3 for sphere) */ | |
| int dimII; | |
| /** @brief Number of vertices in a dim-simplex */ | |
| int dimVV; | |
| /** @brief Number of edges in a dim-simplex */ | |
| int dimEE; | |
| /** @brief Initial count of the number of vertices */ | |
| int numVV0; | |
| /** @brief Last count of the number of vertices */ | |
| int numVV; | |
| /** @brief Last count of the number of edges */ | |
| int numEE; | |
| /** @brief Last count of the number of faces */ | |
| int numFF; | |
| /** @brief Last count of the number of simplices */ | |
| int numSS; | |
| /** @brief Last count of boundary vertices */ | |
| int numBV; | |
| /** @brief Last count of boundary faces */ | |
| int numBF; | |
| /** @brief the memory manager */ | |
| Vmem *vmem; | |
| /** @brief did i make vmem or was it inherited */ | |
| int iMadeVmem; | |
| /** @brief the set of vertices */ | |
| Vset *vertices; | |
| /** @brief the set of edges */ | |
| Vset *edges; | |
| /** @brief the set of simplices */ | |
| Vset *simplices; | |
| /** @brief refinement/conformity/flipping simplex Qs */ | |
| Vset *sQueM[VMAXSQ]; | |
| /** @brief did I have to make a fake PDE object? */ | |
| int iMadePDE; | |
| /** @brief container for various user-provided functions*/ | |
| PDE *pde; | |
| /** @brief Hook for external structure updating */ | |
| int xUpFlag; | |
| /** @brief Hook for external structure updating */ | |
| void (*xUp)(SS **sms, int numS); | |
| }; | |
| /** | |
| * @brief Declaration of the Gem class as the Gem structure | |
| * @ingroup Gem | |
| * @author Michael Holst | |
| * @return None | |
| */ | |
| typedef struct sGem Gem; | |
| /* | |
| * *************************************************************************** | |
| * Class Gem: Inlineable methods (gem.c) | |
| * *************************************************************************** | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the extrinsic spatial dimension. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the extrinsic spatial dimension. | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC int Gem_dim(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the extrinsic spatial dimension. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the extrinsic spatial dimension. | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC int Gem_dimII(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the number of vertices in a simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the number of vertices in a simplex | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC int Gem_dimVV(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the number of edges in a simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the number of edges in a simplex | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC int Gem_dimEE(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the logical number of vertices in the mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the logical number of vertices in the mesh. | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC int Gem_numVirtVV(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the logical number of edges in the mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the logical number of edges in the mesh. | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC int Gem_numVirtEE(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the logical number of faces in the mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the logical number of faces in the mesh. | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC int Gem_numVirtFF(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the logical number of simplices in the mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the logical number of simplices in the mesh. | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC int Gem_numVirtSS(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Set the logical number of vertices in the mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param i index for the logical number of vertices | |
| */ | |
| VEXTERNC void Gem_setNumVirtVV(Gem *thee, int i); | |
| /** | |
| * @ingroup Gem | |
| * @brief Set the logical number of edges in the mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param i index for the logical number of edges | |
| */ | |
| VEXTERNC void Gem_setNumVirtEE(Gem *thee, int i); | |
| /** | |
| * @ingroup Gem | |
| * @brief Geometry manager constructor. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param i index for the logical number of faces | |
| */ | |
| VEXTERNC void Gem_setNumVirtFF(Gem *thee, int i); | |
| /** | |
| * @ingroup Gem | |
| * @brief Set the logical number of simplices in the mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param i index for the logical number of simplices | |
| */ | |
| VEXTERNC void Gem_setNumVirtSS(Gem *thee, int i); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the number of vertices in the mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the number of vertices in the mesh. | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC int Gem_numVV(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return a given vertex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return a given vertex. | |
| * @param thee Pointer to class Gem | |
| * @param i index for a given vertex | |
| */ | |
| VEXTERNC VV* Gem_VV(Gem *thee, int i); | |
| /** | |
| * @ingroup Gem | |
| * @brief Create a new vertex (becoming the new last vertex). | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return Pointer to the new created vertex | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC VV* Gem_createVV(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the first vertex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the first vertex | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC VV* Gem_firstVV(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the last vertex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the last vertex | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC VV* Gem_lastVV(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the next vertex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the next vertex | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC VV* Gem_nextVV(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the previous vertex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the previous vertex | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC VV* Gem_prevVV(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Peek at the first vertex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return Pointer to the first vertex in the list | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC VV* Gem_peekFirstVV(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Peek at the last vertex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return Pointer to the last vertex in the list | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC VV* Gem_peekLastVV(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Destroy the last vertex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_destroyVV(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Destroy all of the vertices. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_resetVV(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the number of edge. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the number of edges. | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC int Gem_numEE(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return a given edge. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return a given edge | |
| * @param thee Pointer to class Gem | |
| * @param i index for a given edge | |
| */ | |
| VEXTERNC EE* Gem_EE(Gem *thee, int i); | |
| /** | |
| * @ingroup Gem | |
| * @brief Create a new edge (becoming the new last edge). | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return Pointer to the new created edge | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC EE* Gem_createEE(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the first edge. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the first edge | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC EE* Gem_firstEE(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the last edge. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the last edge | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC EE* Gem_lastEE(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the next edge. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the next edge | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC EE* Gem_nextEE(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the previous edge. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the previous edge | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC EE* Gem_prevEE(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Peek at the first edge. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return Pointer to the first edge in the list | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC EE* Gem_peekFirstEE(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Peek at the last edge. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return Pointer to the last edge in the list | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC EE* Gem_peekLastEE(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Destroy the last edge. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_destroyEE(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Destroy all of the edges. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_resetEE(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the number of simplices. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the number of simplicies | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC int Gem_numSS(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return a given simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return a given simplex | |
| * @param thee Pointer to class Gem | |
| * @param i Pointer to a given simplex | |
| */ | |
| VEXTERNC SS* Gem_SS(Gem *thee, int i); | |
| /** | |
| * @ingroup Gem | |
| * @brief Create a new simplex (becoming the new last simplex). | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return a new simplex (becoming the new last simplex). | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC SS* Gem_createSS(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the first simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the first simplex | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC SS* Gem_firstSS(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the last simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the last simplex | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC SS* Gem_lastSS(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the next simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the next simplex | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC SS* Gem_nextSS(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the previous simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the previous simplex | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC SS* Gem_prevSS(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Peek at the first simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return Pointer to the first simplex in the list | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC SS* Gem_peekFirstSS(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Peek at the last simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return Pointer to the last simplex in the list | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC SS* Gem_peekLastSS(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Destroy the last simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_destroySS(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Destroy all of the simplices. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_resetSS(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the number of simplices in a given queue. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the number of simplices in a given queue. | |
| * @param thee Pointer to class Gem | |
| * @param currentQ index of a given queue | |
| */ | |
| VEXTERNC int Gem_numSQ(Gem *thee, int currentQ); | |
| /** | |
| * @ingroup Gem | |
| * @brief Release all of the simplices in a given queue. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param currentQ index of a given queue | |
| */ | |
| VEXTERNC void Gem_resetSQ(Gem *thee, int currentQ); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the number of boundary faces. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the number of boundary faces. | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC int Gem_numBF(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the number of boundary vertices. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return the number of boundary vertices | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC int Gem_numBV(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Set the number of boundary faces. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param val value for boundary faces | |
| */ | |
| VEXTERNC void Gem_setNumBF(Gem *thee, int val); | |
| /** | |
| * @ingroup Gem | |
| * @brief Set the number of boundary vertices. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param val value for boundary vertices | |
| */ | |
| VEXTERNC void Gem_setNumBV(Gem *thee, int val); | |
| /** | |
| * @ingroup Gem | |
| * @brief Increment the number of boundary faces by a given integer. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param val Value for incrementing the number of boundary faces | |
| */ | |
| VEXTERNC void Gem_addToNumBF(Gem *thee, int val); | |
| /** | |
| * @ingroup Gem | |
| * @brief Increment the number of boundary vertices by a given integer. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param val value for incrementing the number of boundary vertices | |
| */ | |
| VEXTERNC void Gem_addToNumBV(Gem *thee, int val); | |
| /** | |
| * @ingroup Gem | |
| * @brief Increment the number of boundary faces by 1. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_numBFpp(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Increment the number of boundary vertices by 1. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_numBVpp(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Decrement the number of boundary faces by 1. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_numBFmm(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Decrement the number of boundary vertices by 1. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if !defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_numBVmm(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the extrinsic spatial dimension. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the extrinsic spatial dimension. | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the extrinsic spatial dimension. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the extrinsic spatial dimension. | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the number of vertices in a simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the number of vertices in a simplex | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the number of edges in a simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the number of edges in a simplex | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the logical number of vertices in the mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the logical number of vertices in the mesh. | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the logical number of edges in the mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the logical number of edges in the mesh. | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the logical number of faces in the mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the logical number of faces in the mesh. | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the logical number of simplices in the mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the logical number of simplices in the mesh. | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Set the logical number of vertices in the mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param i index for the logical number of vertices | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Set the logical number of edges in the mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param i index for the logical number of edges | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Geometry manager constructor. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param i index for the logical number of faces | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Set the logical number of simplices in the mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param i index for the logical number of simplices | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the number of vertices in the mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the number of vertices in the mesh. | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return a given vertex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return a given vertex. | |
| * @param thee Pointer to class Gem | |
| * @param i index for a given vertex | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Create a new vertex (becoming the new last vertex). | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return Pointer to the new created vertex | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the first vertex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the first vertex | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the last vertex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the last vertex | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the next vertex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the next vertex | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the previous vertex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the previous vertex | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Peek at the first vertex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return Pointer to the first vertex in the list | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Peek at the last vertex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return Pointer to the last vertex in the list | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Destroy the last vertex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Destroy all of the vertices. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the number of edge. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the number of edges. | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return a given edge. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return a given edge | |
| * @param thee Pointer to class Gem | |
| * @param i index for a given edge | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Create a new edge (becoming the new last edge). | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return Pointer to the new created edge | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the first edge. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the first edge | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the last edge. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the last edge | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the next edge. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the next edge | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the previous edge. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the previous edge | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Peek at the first edge. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return Pointer to the first edge in the list | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Peek at the last edge. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return Pointer to the last edge in the list | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Destroy the last edge. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Destroy all of the edges. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the number of simplices. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the number of simplicies | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return a given simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return a given simplex | |
| * @param thee Pointer to class Gem | |
| * @param i Pointer to a given simplex | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Create a new simplex (becoming the new last simplex). | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return a new simplex (becoming the new last simplex). | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the first simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the first simplex | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the last simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the last simplex | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the next simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the next simplex | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the previous simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the previous simplex | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Peek at the first simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return Pointer to the first simplex in the list | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Peek at the last simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return Pointer to the last simplex in the list | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Destroy the last simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Destroy all of the simplices. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the number of simplices in a given queue. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the number of simplices in a given queue. | |
| * @param thee Pointer to class Gem | |
| * @param currentQ index of a given queue | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Release all of the simplices in a given queue. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param currentQ index of a given queue | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the number of boundary faces. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the number of boundary faces. | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the number of boundary vertices. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return the number of boundary vertices | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Set the number of boundary faces. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param val value for boundary faces | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Set the number of boundary vertices. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param val value for boundary vertices | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Increment the number of boundary faces by a given integer. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param val Value for incrementing the number of boundary faces | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Increment the number of boundary vertices by a given integer. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param val value for incrementing the number of boundary vertices | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Increment the number of boundary faces by 1. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Increment the number of boundary vertices by 1. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Decrement the number of boundary faces by 1. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Decrement the number of boundary vertices by 1. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) if defined(VINLINE_GEM) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Geometry manager constructor. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) | |
| * @return Pointer to a newly allocated (empty) Gem class | |
| * @param vmem Memory management object | |
| * @param tpde Pointer to the PDE object | |
| */ | |
| VEXTERNC Gem* Gem_ctor(Vmem *vmem, PDE *tpde); | |
| /** | |
| * @ingroup Gem | |
| * @brief Geometry manager destructor. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_dtor(Gem **thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Reset all of the geometry datastructures. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param dim the extrinsic spatial dimension | |
| * @param dimII the intrinsic spatial dimension | |
| */ | |
| VEXTERNC void Gem_reset(Gem *thee, int dim, int dimII); | |
| /** | |
| * @ingroup Gem | |
| * @brief Create and initialize a new vertex; return a point to it. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) | |
| * @return a point to the newly created and initialized vertex | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC VV* Gem_createAndInitVV(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Create and initialize a new edge; return a point to it. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) | |
| * @return a point to the newly created and initialized edge | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC EE* Gem_createAndInitEE(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Create and initialize a new simplex; return a point to it. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) | |
| * @return a point to the newly created and initialized simplex | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC SS* Gem_createAndInitSS(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Return the simplex at a particular location in the simplex Q. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) | |
| * @return the simplex at a particular location in the simplex Q. | |
| * @param thee Pointer to class Gem | |
| * @param currentQ index of a given queue | |
| * @param i index for the number of simplices in a given queue | |
| */ | |
| VEXTERNC SS* Gem_SQ(Gem *thee, int currentQ, int i); | |
| /** | |
| * @ingroup Gem | |
| * @brief Append a simplex to the end of a simplex Q. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param currentQ index of a given queue | |
| * @param qsm Pointer to the simplex | |
| */ | |
| VEXTERNC void Gem_appendSQ(Gem *thee, int currentQ, SS *qsm); | |
| /** | |
| * @ingroup Gem | |
| * @brief Create all of the simplex rings. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_createSimplexRings(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Destroy all of the simplex rings. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_destroySimplexRings(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Look for a common edges between two vertices. | |
| * If it doesn't yet exist, we create it, and then note that | |
| * we did so. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) | |
| * @return Pointer to the common edges between two vertices. | |
| * @param thee Pointer to class Gem | |
| * @param v0 Pointer to the first vertex | |
| * @param v1 Pointer to the second vertex | |
| * @param iDid index for creating an edge | |
| */ | |
| VEXTERNC EE* Gem_findOrCreateEdge(Gem *thee, VV *v0, VV *v1, int *iDid); | |
| /** | |
| * @ingroup Gem | |
| * @brief Create all of the edges. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c)\n | |
| * Based on a simplex traversal. | |
| * We also set the edge numbers in the simplices while we we | |
| * are doing the edge creation. | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_createEdges(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Destroy all of the edges. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_destroyEdges(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Count all vertices, edges, faces, simplices, and do it | |
| * is cheaply as possible. Also do a form check. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_countChk(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Count all of the faces without actually creating them. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c)\n | |
| * Keep track of the global face numbers in each element. | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_countFaces(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Clear all of the edge numbers in each simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_clearEdges(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Count up all of the edges without actually creating them, and | |
| * keep track of the global edge numbers in each element. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c)\n | |
| * Based on a simplex traversal. | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_countEdges(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Make some specified hacked fix to a given mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Inlineable methods (gem.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param key 0 --> ? | |
| */ | |
| VEXTERNC void Gem_formFix(Gem *thee, int key); | |
| /** | |
| * @ingroup Gem | |
| * @brief Hook for external structure updating | |
| * @author Michael Holst | |
| * @note We intentionally do not define these three prototypes. | |
| * These three routines may be present in the library depending | |
| * on how it was compiled. Users of these three functions must | |
| * provide their own prototypes if they have built the library | |
| * to enable them. | |
| * @return index for hooking for external structure updating | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC int Gem_externalUpdateFlag(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Hook for external structure updating | |
| * @author Michael Holst | |
| * @note We intentionally do not define these three prototypes. | |
| * These three routines may be present in the library depending | |
| * on how it was compiled. Users of these three functions must | |
| * provide their own prototypes if they have built the library | |
| * to enable them. | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param fl index for hooking for external structure updating | |
| */ | |
| VEXTERNC void Gem_setExternalUpdateFlag(Gem *thee, int fl); | |
| /** | |
| * @ingroup Gem | |
| * @brief Hook for external structure updating | |
| * @author Michael Holst | |
| * @note We intentionally do not define these three prototypes. | |
| * These three routines may be present in the library depending | |
| * on how it was compiled. Users of these three functions must | |
| * provide their own prototypes if they have built the library | |
| * to enable them. | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_setExternalUpdateFunction(Gem *thee, | |
| void (*xUp)(SS **sms, int numS)); | |
| /** | |
| * @ingroup Gem | |
| * @brief Build the basic master-to-element transformation information. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c) \n\n | |
| * gchart ==> unified common chart for vertex coordinates\n | |
| * chart[4] ==> individual charts for vertex coordinates\n | |
| * \n | |
| * D ==> jacobian determinant of the transformation\n | |
| * Dcook ==> jacobian determinant of cooked trans\n | |
| * faceD[4] ==> face jacobian determinants\n | |
| * \n | |
| * ff[3][3], bb[3] ==> affine trans from master to arbitrary el\n | |
| * gg[3][3], cc[3] ==> affine trans from arbitrary el to master\n | |
| * \n | |
| * loc[4][3] ==> local ordering of vertices for each face\n | |
| * vx[4][3] ==> vertex coordinate labels\n | |
| * nvec[4][3] ==> normal vectors to the faces\n | |
| * evec[6][3] ==> edge vectors\n | |
| * elen[6] ==> edge vector lengths\n | |
| * \n | |
| * dimV ==> number of vertices in the d-simplex\n | |
| * dimE ==> number of edges in the d-simplex\n | |
| * dimF ==> number of faces in the d-simplex\n | |
| * dimS ==> number of simplices in the d-simplex (=1)\n | |
| * \n | |
| * sid ==> global simplex ID\n | |
| * vid[4] ==> global vertex IDs\n | |
| * fid[4] ==> global face IDs\n | |
| * eid[6] ==> global edge IDs\n | |
| * \n | |
| * stype ==> global simplex type\n | |
| * vtype[4] ==> global vertex types\n | |
| * ftype[4] ==> global face types\n | |
| * etype[6] ==> LOCAL edge types\n | |
| * \n | |
| * *s ==> pointer to the simplex\n | |
| * *v[4] ==> pointers to vertices of the simplex | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sm Pointer to a simplex | |
| * @param t Pointer to class TT | |
| */ | |
| VEXTERNC void Gem_simplexInfo(Gem *thee, SS *sm, TT *t); | |
| /** | |
| * @ingroup Gem | |
| * @brief Build the complete master-to-element transformatio. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c) \n | |
| * We just call Gem_simplexInfo to build the basic information, | |
| * and then we compute the transformation and some additional | |
| * things like the inverse transformations and various determinants. | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sm Pointer to a simplex | |
| * @param t Pointer to class TT | |
| */ | |
| VEXTERNC void Gem_buildVolumeTrans(Gem *thee, SS *sm, TT *t); | |
| /** | |
| * @ingroup Gem | |
| * @brief Build the complete masterFace-to-elementFace transformation. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c) \n | |
| * We ASSUME that Gem_simplexInfo has already been called to build | |
| * the basic information in the TT structure we are given. | |
| * We then compute some additional things here for a SINGLE face | |
| * specified by "iface", such as the inverse transformations and | |
| * various determinants. | |
| * \n | |
| * We do not actually have to assume that Gem_buildVolumeTrans | |
| * has been previously called, only that Gem_simplexInfo has | |
| * been called. However, it seems that all situations that | |
| * occur result in Gem_buildVolumeTrans being called for an | |
| * element before Gem_buildSurfTrans is called on any face. | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param iface index for the faces in a simplex | |
| * @param t index for class TT | |
| */ | |
| VEXTERNC void Gem_buildSurfaceTrans(Gem *thee, int iface, TT *t); | |
| /** | |
| * @ingroup Gem | |
| * @brief Calculate the edge lengths of a simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c) | |
| * @return the edge lengths of a simplex | |
| * @param thee Pointer to class Gem | |
| * @param v0 Pointer to the first vertex | |
| * @param v1 Pointer to the second vertex | |
| */ | |
| VEXTERNC double Gem_edgeLength(Gem *thee, VV *v0, VV *v1); | |
| /** | |
| * @ingroup Gem | |
| * @brief Determine the edge of a simplex opposite the newest vertex. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c) | |
| * @return The permutation map of the edge of a simplex opposite the newest | |
| * vertex | |
| * @param thee Pointer to class Gem | |
| * @param sm Pointer to the simplex | |
| * @param face index for the face | |
| * @param len Pointer to the current longest edge length | |
| */ | |
| VEXTERNC int Gem_newestVertex(Gem *thee, SS *sm, int face, double *len); | |
| /** | |
| * @ingroup Gem | |
| * @brief Determine the longest edge of a simplex or a simplex face. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c) \n | |
| * It is critical to have a consistent tie-breaking rule in order | |
| * to guarantee that recursive refinement procedures: \n | |
| * (1) produce conforming meshes (two simplices will refine the | |
| * same edge of a shared face) \n | |
| * (2) terminate in finite steps (due to (1)). | |
| * @return The permutation map of the longest edge of a simplex or a simplex face. | |
| * @param thee Pointer to class Gem | |
| * @param sm Pointer to the simplex | |
| * @param face index for the face | |
| * @param len Pointer to the current longest edge length | |
| */ | |
| VEXTERNC int Gem_longestEdge(Gem *thee, SS *sm, int face, double *len); | |
| /** | |
| * @ingroup Gem | |
| * @brief Determine the shortest edge of a simplex or a simplex face. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c) \n | |
| * It is critical to have a consistent tie-breaking rule in order | |
| * to guarantee that recursive refinement procedures: \n | |
| * (1) produce conforming meshes (two simplices will refine the | |
| * same edge of a shared face) \n | |
| * (2) terminate in finite steps (due to (1)). | |
| * @return The permutation map of the shortest edge of a simplex or a simplex face. | |
| * @param thee Pointer to class Gem | |
| * @param sm Pointer to the simplex | |
| * @param face index for the face | |
| * @param len Pointer to the current longest edge length | |
| */ | |
| VEXTERNC int Gem_shortestEdge(Gem *thee, SS *sm, int face, double *len); | |
| /** | |
| * @ingroup Gem | |
| * @brief Calculate the shape quality measure for this simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c) \n | |
| * @verbatim | |
| * Let |s| denote the volume (which may be negative) of a given | |
| * d-simplex "s", let v_i (i=0,...,d) denote the vertices of s, | |
| * and let e_{ij} denote the d-vectors representing the 3 or 6 edges | |
| * of s that connect v_i to v_j. We compute the following shape | |
| * quality measure for the simplex s: | |
| * | |
| * f(s,d) 2^{2(1-1/d)} * 3^{(d-1)/2} * |s|^{2/d} | |
| * meas(s,d) = ------ = -------------------------------------- | |
| * g(s,d) \sum_{0<=i<j<=d} |e_{ij}|^2 | |
| * | |
| * 2D Notes: The shape function meas(s,2) is (nearly) the same one used by | |
| * Randy Bank and Kent Smith in their joint paper on mesh smoothing: | |
| * | |
| * f(s,2) 2 * 3^{1/2} * |s| | |
| * meas(s,2) = ------ = --------------------------- | |
| * g(s,2) \sum_{0<=i<j<=2} |e_{ij}|^2 | |
| * | |
| * It has the property that its maximal value of 1 is obtained | |
| * for an equilateral triangle, and it is scaling invariant, i.e., | |
| * we don't have to worry about the size of the triangle. | |
| * Their original function was normalized (their numerator was | |
| * 2*f(s,2) above) to yield a value of 1 for a equalateral triangle | |
| * (with volume 1); this is modified to yield a maximal value | |
| * of 1 for the unit triangle (with volume 1/2) to work better with | |
| * the unit triangle code. To effect this slightly different | |
| * normalization, the numerator of the quality function was changed | |
| * to 2(3)^{1/2}|s|. | |
| * | |
| * 3D Notes: The shape function meas(s,3) is (nearly) the same one used by | |
| * Joe and Liu in their paper on quality measures for tetrahedra: | |
| * | |
| * f(s,3) 2^{4/3} * 3 * |s|^{2/3} | |
| * meas(s,3) = ------ = --------------------------- | |
| * g(s,3) \sum_{0<=i<j<=3} |e_{ij}|^2 | |
| * | |
| * It is also scaling invariant, so we don't have to worry about | |
| * the size of the tetrahedron. Their original function was | |
| * normalized (their numerator was 12(3|s|)^{2/3}) to yield a | |
| * maximal value of 1 for a regular tetrahedron (with volume 1); | |
| * this was modified to yield a maximal value of 1 for the unit | |
| * tetrahedron (with volume 1/6) to work better with the unit | |
| * tetrahedron code. To effect this slightly different | |
| * normalization, the numerator of the quality function was changed | |
| * to f(s,3) = 12(3|s|/6)^{2/3} = 2^{4/3}*3*|s|^{2/3}, as above. | |
| * @endverbatim | |
| * @return the shape quality measure for this simplex | |
| * @param thee Pointer to class Gem | |
| * @param sm Pointer to the simplex | |
| * @param f Pointer to volume scaling | |
| * @param g Pointer to the sum of d-vectors representing the 3 or 6 edges | |
| */ | |
| VEXTERNC double Gem_shapeMeasure(Gem *thee, SS *sm, double *f, double *g); | |
| /** | |
| * @ingroup Gem | |
| * @brief Calculate gradient of the shape quality measure for this simplex, | |
| * where the last vertex (vertex d) is treated as the set of | |
| * independent variables. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sm Pointer to the simplex | |
| * @param vmap the array of the map | |
| * @param dm gradient of the shape quality measure for this simplex | |
| */ | |
| VEXTERNC void Gem_shapeMeasureGrad(Gem *thee, SS *sm, int vmap[], double dm[]); | |
| /** | |
| * @ingroup Gem | |
| * @brief Calculate ratio of longest-to-shortest edge of a simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c) | |
| * @return ratio of longest-to-shortest edge of a simplex. | |
| * @param thee Pointer to class Gem | |
| * @param sm Pointer to the simplex | |
| */ | |
| VEXTERNC double Gem_edgeRatio(Gem *thee, SS *sm); | |
| /** | |
| * @ingroup Gem | |
| * @brief Calculate the determinant of the transformation from the | |
| * master element to this element. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c) \n | |
| * We just call Gem_simplexInfo to build the basic information, | |
| * and then we build the transformation and compute the determinant | |
| * here. \n | |
| * For a manifold, we need to know the orientation of the manifold | |
| * in order to decide what is counter-clock-wise, and what is | |
| * clockwise, in terms of vertex orderings. One will lead to a | |
| * positive volume, and the other to a negative volume, when we | |
| * compute volume using the determinant of the jacobian of the | |
| * affine transformation to the master element. We assume here | |
| * that the uniform chart computed by Gem_simplexInfo is such that | |
| * the orientation in the chart reflects the correct orientation | |
| * of the manifold (locally). | |
| * @return the determinant of the transformation from the master element to this | |
| * element. | |
| * @param thee Pointer to class Gem | |
| * @param sm Pointer to the simplex | |
| */ | |
| VEXTERNC double Gem_simplexVolume(Gem *thee, SS *sm); | |
| /** | |
| * @ingroup Gem | |
| * @brief Traverse the simplices and check their shapes. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_shapeChk(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Produce the initial edge markings in all of the simplices. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_markEdges(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Go through simplices and enforce a vertex ordering that | |
| * will produce a positive determinant. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c)\n | |
| * This relies on an embedding of R2 into R3 (or R3 into R4) | |
| * and breaks e.g. if this is a non-orientable 2-manifold, etc. | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_reorderSV(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Smooth the mesh using simple Laplace smoothing. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c)\n | |
| * We don't need the simplex rings here, but we need the edge rings. | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_smoothMeshLaplace(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Smooth the mesh using simple Laplace smoothing. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c)\n | |
| * We don't need the simplex rings here, but we need the edge rings. | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_smoothMesh(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Smooth the boundary mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_smoothMeshBnd(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Smooth the mesh using a volume optimization approach. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_smoothMeshOpt(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Unify the charts of vertices. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_buildCharts(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Unify the charts of vertices. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemg.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_clearCharts(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Print the exact current malloc usage. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemchk.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_memChk(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Print the exact current malloc usage: vertices. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemchk.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param num the global "T" counter -- how many "T"s in list | |
| * @param size size of the object in bytes | |
| * @param vecUse total object size in the the global "T" counter | |
| * @param vecMal total size of allocated blocks | |
| * @param vecOhd max size of blocks | |
| */ | |
| VEXTERNC void Gem_memChkVV(Gem *thee, int *num, | |
| int *size, int *vecUse, int *vecMal, int *vecOhd); | |
| /** | |
| * @ingroup Gem | |
| * @brief Print the exact current malloc usage: edges. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemchk.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param tnum the global "T" counter -- how many "T"s in list | |
| * @param size size of the object in bytes | |
| * @param vecUse total object size in the the global "T" counter | |
| * @param vecMal total size of allocated blocks | |
| * @param vecOhd max size of blocks | |
| */ | |
| VEXTERNC void Gem_memChkEE(Gem *thee, int *tnum, | |
| int *size, int *vecUse, int *vecMal, int *vecOhd); | |
| /** | |
| * @ingroup Gem | |
| * @brief Print the exact current malloc usage: simplices. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemchk.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param tnum the global "T" counter -- how many "T"s in list | |
| * @param size size of the object in bytes | |
| * @param vecUse total object size in the the global "T" counter | |
| * @param vecMal total size of allocated blocks | |
| * @param vecOhd max size of blocks | |
| */ | |
| VEXTERNC void Gem_memChkSS(Gem *thee, int *tnum, | |
| int *size, int *vecUse, int *vecMal, int *vecOhd); | |
| /** | |
| * @ingroup Gem | |
| * @brief Print the exact current malloc usage: simplex queues. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemchk.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param currentQ index of a given queue | |
| * @param tnum the global "T" counter -- how many "T"s in list | |
| * @param tsize size of the object in bytes | |
| * @param tVecUse total object size in the the global "T" counter | |
| * @param tVecMal total size of allocated blocks | |
| * @param tVecOhd max size of blocks | |
| */ | |
| VEXTERNC void Gem_memChkSQ(Gem *thee, int currentQ, | |
| int *tnum, int *tsize, int *tVecUse, int *tVecMal, int *tVecOhd); | |
| /** | |
| * @ingroup Gem | |
| * @brief Estimate the current RAM usage. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemchk.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_memChkMore(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Calculate the cost to traverse the various structures. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemchk.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_speedChk(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Check the self-consistency of the geometry datastructures. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemchk.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param key 0 --> check: min (just vertices and simplices) \n | |
| * 1 --> check: min + simplex ring \n | |
| * 2 --> check: min + simplex ring + edge ring \n | |
| * 3 --> check: min + simplex ring + edge ring + conform | |
| */ | |
| VEXTERNC void Gem_formChk(Gem *thee, int key); | |
| /** | |
| * @ingroup Gem | |
| * @brief Print out contents of all geometry structures. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemchk.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_contentChk(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Check some structures. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemchk.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param key 0 --> check: min (just vertices and simplices) \n | |
| * 1 --> check: min + simplex ring \n | |
| * 2 --> check: min + simplex ring + edge ring \n | |
| */ | |
| VEXTERNC void Gem_ramClear(Gem *thee, int key); | |
| /** | |
| * @ingroup Gem | |
| * @brief Force naborless faces to become boundary faces. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemchk.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param btype 0 --> create interior boundary faces \n | |
| * 1 --> create boundary faces of type "1"\n | |
| * 2 --> create boundary faces of type "2" | |
| */ | |
| VEXTERNC void Gem_makeBnd(Gem *thee, int btype); | |
| /** | |
| * @ingroup Gem | |
| * @brief Mark selected boundary faces in a special way. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemchk.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param key index for selected boundary faces | |
| * key==0 --> check: min (just vertices and simplices) | |
| * key==1 --> check: min + simplex ring | |
| * key==2 --> check: min + simplex ring + edge ring | |
| * key==3 --> check: min + simplex ring + edge ring + conform | |
| */ | |
| VEXTERNC void Gem_makeBndExt(Gem *thee, int key); | |
| /** | |
| * @ingroup Gem | |
| * @brief Incremental flip Delaunay generator. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemgen.c)\n | |
| * @verbatim | |
| * We use an incremental flip Delaunay mesh generator. | |
| * In 2D, this is based on the standard edge-flipping. | |
| * In 3D, this is based on 2-to-3 flips (shared face-to-edge flip), | |
| * and 3-to-2 flips (a restricted edge-to-face flip). | |
| * | |
| * The 2D version of the algorithm here is similar to several | |
| * edge-flip-based Delaunay algorithms in the literature. | |
| * | |
| * The 3D version of the algorithm here is similar to Barry Joe's | |
| * and Ernst Mucke's. However, the ringed-vertex datastructure used | |
| * here leads to a more concise implementation, as compared to | |
| * implementations using e.g. Mucke's edge-facet datastructure. | |
| * | |
| * Both this algorithm and similar incremental flip algorithms in | |
| * the 3D case are based on several recent theoretical results | |
| * due to Barry Joe, which guarantee the following: | |
| * | |
| * (1) The flipping algorithm to re-establish Delaunay-ness | |
| * always terminates in a finite number of steps. | |
| * | |
| * (2) The algorithm works regardless of the flipping order. | |
| * | |
| * (3) Only the exterior faces of the star region of the new | |
| * vertex (what Mucke calls "link facets", because these | |
| * "facets" link two triangles or tets together), and in the | |
| * 3D case the three edges which make up those faces, need | |
| * be tested and then possibly flipped. | |
| * | |
| * The algorithm is as follows: | |
| * | |
| * (1) Given N inputs points, a single enclosing simplex is | |
| * formed by adding d+1 additional points, and then forming | |
| * that single simplex. | |
| * | |
| * (2) The N points are then added to the mesh one at a time | |
| * by locating the simplex containing each point, adding | |
| * the point, and splitting the containing simplex into | |
| * d+1 children (note that unless the points are in | |
| * "general" position, this may give rise to degenerate | |
| * simplices). | |
| * | |
| * (3) The link-facets of the newly added vertex are checked | |
| * for Delaunayness. The link-facets are the faces | |
| * opposite the new vertex in each simplex that uses | |
| * the new vertex. (This is the boundary of the support | |
| * region for a finite element basis function, for example.) | |
| * If a non-Delaunay face is located, we attempt to flip | |
| * one of the three edges of the face using a 3-to-2 | |
| * (edge-to-face) flip. We only flip such as edge if the | |
| * simplex ring about the edge has length three. If no | |
| * such edge flips are possible, we do a 2-to-3 flip | |
| * (face-to-edge) if this is possible (it is only possible | |
| * if the two tets sharing the face form a convex region). | |
| * If no flipping is possible, we temporarily ignore this | |
| * non-Delaunay face and move on to the next face. | |
| * | |
| * (4) Step (3) above terminates in a finite number of steps | |
| * thanks to the theoretical results of Barry Joe. | |
| * @endverbatim | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_delaunay(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Edge or face flip for the incremental flip algorithm. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemgen.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param vx Pointer to the vertex | |
| */ | |
| VEXTERNC void Gem_flip(Gem *thee, VV *vx); | |
| /** | |
| * @ingroup Gem | |
| * @brief Find a simplex containing a given vertex. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemgen.c) | |
| * @return Pointer to the simplex | |
| * @param thee Pointer to class Gem | |
| * @param vx Pointer to the vertex | |
| */ | |
| VEXTERNC SS* Gem_findSimplex(Gem *thee, VV *vx); | |
| /** | |
| * @ingroup Gem | |
| * @brief Initialize the geometric predicates. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemgen.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_predinit(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Determine the orientation of the vertices in a simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemgen.c) | |
| * @return Success enumeration | |
| * @param thee Pointer to class Gem | |
| * @param sm Pointer to the simplex | |
| */ | |
| VEXTERNC int Gem_orient(Gem *thee, SS *sm); | |
| /** | |
| * @ingroup Gem | |
| * @brief Determine if a vertex lies in a sphere of other vertices. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemgen.c) | |
| * @return Success enumeration | |
| * @param thee Pointer to class Gem | |
| * @param sm pointer to the simplex | |
| * @param sm_facet index for the face | |
| * @param vx pointer to the vertex | |
| * @param vxnb pointer to the given vertex | |
| */ | |
| VEXTERNC int Gem_inSphere(Gem *thee, SS *sm, int sm_facet, VV *vx, VV *vxnb); | |
| /** | |
| * @ingroup Gem | |
| * @brief Determine whether or a not a point is in a simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemgen.c) | |
| * @return Success enumeration | |
| * @param thee Pointer to class Gem | |
| * @param sm Pointer to the simplex | |
| * @param x arrary of the point position | |
| */ | |
| VEXTERNC int Gem_pointInSimplex(Gem *thee, SS *sm, double x[]); | |
| /** | |
| * @ingroup Gem | |
| * @brief Evaluate basis functions at a point in a simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemgen.c) | |
| * @return Success enumeration | |
| * @param thee Pointer to class Gem | |
| * @param sm Pointer to the simplex | |
| * @param x arrary of the point position | |
| * @param phi basis functions at a point in a simplex | |
| * @param phix derivs of basis functions at a point in a simplex | |
| */ | |
| VEXTERNC int Gem_pointInSimplexVal(Gem *thee, SS *sm, double x[], | |
| double phi[], double phix[][3]); | |
| /** | |
| * @ingroup Gem | |
| * @brief Edge or face flip for the incremental flip algorithm. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemgen.c) | |
| * @return Success enumeration | |
| * @param thee Pointer to class Gem | |
| * @param dimX the intrinsic spatial dimension | |
| * @param defX Pointer to vertex deformation or displacement values | |
| */ | |
| VEXTERNC int Gem_deform(Gem *thee, int dimX, double *defX[MAXV]); | |
| /** | |
| * @ingroup Gem | |
| * @brief Mark simplices to be refined. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemref.c) | |
| * @return number of marked simplices | |
| * @param thee Pointer to class Gem | |
| * @param key If (key == -1) Clear all simplex refinement flags.\n | |
| * If (key == 0) Mark all simplices for refinement.\n | |
| * If (key == 1) Mark special simplices for a testcase | |
| * refinement. | |
| * @param color the chart of the simplex | |
| */ | |
| VEXTERNC int Gem_markRefine(Gem *thee, int key, int color); | |
| /** | |
| * @ingroup Gem | |
| * @brief Refine the manifold and also build a prolongation operator that | |
| * can interpolate functions from the original manifold to the | |
| * new manifold. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemref.c)\n | |
| * Longest Edge, Newest Vertex, or Newest Pair, is used to bisect | |
| * a single simplex in an asymptotically non-degenerate way in the | |
| * "bisect[LE,NV,NP]" routines which are called from this routine. | |
| * Marked simplices are subdivided into 2/4/8 child simplices. | |
| * A closure algorithm is performed which continues subdivision | |
| * until a conforming mesh is produced. Boundary | |
| * nodes/edges[faces] are correctly refined. | |
| * \n\n | |
| * We purposely do the following trick in order to facilitate the | |
| * construction of a prolongation operator after refinement, | |
| * if it is so desired. We begin the refinement with no edges; | |
| * only the conforming mesh as described by the list of vertices | |
| * and the list of simplices using the vertices. When a simplex | |
| * is to be subdivided, the refinement edge (or edges) is then | |
| * identified, and then created on the fly. The new vertex which | |
| * is created by the refinement, namely the midpoint of the edge, | |
| * is then stored with the newly created edge. The edge is added | |
| * to the ring of edges around each of its two vertices. This | |
| * allows our refinement algorithm to easily detect whether or | |
| * not an edge has already been refined by a naboring simplex by | |
| * simply traversing the edge lists of the two vertices on the | |
| * refinement edge. If the edge exists, then it must have already | |
| * been refined, since it is only created in order to refine it. | |
| * Moreover, the new vertex at the midpoint of the edge is then | |
| * also directly available from the edge structure for use in | |
| * building the children simplices, without having to search for it. | |
| * (The edge datastructure can be viewed as simply a holding cell | |
| * for the newly created vertices so that they can be found without | |
| * any searching.) | |
| * \n\n | |
| * How does this help us to later build an appropriate prolongation | |
| * operator between the original mesh and the final refined mesh? | |
| * While we begin the refinement with no edges, we end with a | |
| * list of edges that is precisely the set of edges that were | |
| * refined. Let us order the function values of a mesh function | |
| * on the fine mesh (with function values at vertices) in the | |
| * following order: vertices common to the coarse mesh in the same | |
| * order as the coarse mesh, followed by vertices at the midpoints | |
| * of the refined mesh, in the order of the edges in the edge list. | |
| * The linear prolongation operator (for example) which would | |
| * linearly interpolate a function from the original coarse mesh | |
| * to the refined mesh is then a block 2x1 matrix. The upper block | |
| * is a square identity matrix with number of rows/columns equal | |
| * to the number of vertices in the original mesh; it is completely | |
| * clear how to build this upper block. The lower block is a | |
| * (generally) rectangular matrix, with number of rows equal to the | |
| * number of edges that were refined. Since we finish refinement | |
| * with precisely the refined edges in the edge list, he can | |
| * simply traverse the edge list to build the lower block of the | |
| * prolongation matrix. In particular, in the linear interpolation | |
| * case, each row of the lower block will be zero, except for two | |
| * columns, corresponding to the vertex numbers of the two coarse | |
| * mesh vertices which lie on the ends of the edge that was refined. | |
| * A value of 0.5 is then placed in those two columns. | |
| * \n\n | |
| * In the case of linear prolongation, the lower block of the | |
| * prolongation matrix has exactly one row for each edge that was | |
| * refined, with zeros as every entry except for the two columns | |
| * corresponding to the vertex numbers that were on each end of the | |
| * edge that was bisected. | |
| * \n\n | |
| * There is an opportunity for a problem with this approach; if an | |
| * edge is multiply refined, then we must keep track of all of the | |
| * resulting edges and their parent-child relationships, in order | |
| * to build the correct interpolation. The lower block of the | |
| * prolongation matrix will now be slightly more complicated than | |
| * described above. | |
| * @return number of refined simplices | |
| * @param thee Pointer to class Gem | |
| * @param rkey If (rkey==0) Perform recursive simplex bisection until | |
| * conformity\n | |
| * If (rkey==1) Perform first quadra-[octa-]-section, followed | |
| * by recursive simplex bisection until conformity.\n | |
| * IMPORTANT NOTE: In 2D, (rkey==1) WILL generate | |
| * a conforming mesh. However, in 3D, this procedure | |
| * will in general produce nonconforming simplices. | |
| * To produce a conforming mesh in 3D would require an | |
| * implementation covering all possible face refinement | |
| * combinations (something like 169 cases). This has | |
| * been done e.g. by Jurgen Bey in AGM, but we are | |
| * not that patient; use (rkey==0) above if you want | |
| * a conforming mesh...\n | |
| * If (rkey==2) As a test of the conformity procedure, | |
| * perform quadra-[octa-]-section until conformity, which | |
| * should produce a uniformly regularly refined mesh. | |
| * (In 2D, each triangle should be divided into four | |
| * children, and in 3D each tetrahedron should be | |
| * divided into eight children.) | |
| * @param bkey Boolean sets the bkey type for bisecting the mesh | |
| * If (bkey==0) Bisection type: Longest Edge | |
| * If (bkey==1) Bisection type: Newest Vertex | |
| * If (bkey==2) Bisection type: Newest Pair | |
| * @param pkey Boolean sets the pkey type to prolongate a vector | |
| */ | |
| VEXTERNC int Gem_refine(Gem *thee, int rkey, int bkey, int pkey); | |
| /** | |
| * @ingroup Gem | |
| * @brief We do three things in this routine:\n | |
| * (1) Find the midpoint of existing edge, or create it\n | |
| * (2) Tell simplices using edge that they are now nonconforming\n | |
| * (3) Determine the "type" of the new point by using the type | |
| * of the edge. The edge type must itself be calculated | |
| * on the fly, because we allow the use of lazy edge creation. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemref.c)\n\n | |
| * Note that we MUST determine the type of the new point | |
| * (interior or boundary) based effectively on EDGE types | |
| * rather than vertex or face types. It is easy to construct | |
| * examples where typing based on vertex type can mark a new | |
| * interior point falsely as a boundary point. Note that typing by | |
| * the faces of a single simplex which uses the bisection edge | |
| * can also be fooled in 3D (it is foolproof in 2D). | |
| * For example, it may be the case in 3D that an edge of a tet | |
| * touches a boundary, but none of its faces are boundary faces. | |
| * In this case, the new point would be marked (incorrectly) | |
| * as an interior point. | |
| * \n\n | |
| * The solution to this problem is to determine the type of the | |
| * new point by using the type of the edge. The only problem we | |
| * then face is how to do this without actually having edges around. | |
| * In other words, we must determine the correct edge type on the | |
| * fly. This can be handled by looking at all faces of all simplices | |
| * which use the edge, and applying the following rules: | |
| * (1) If all faces are interior, the edge is interior | |
| * (3) If at least one face is boundary, the edge is boundary | |
| * \n\n | |
| * Note that since we must look at all simplices on the ring | |
| * around the edge anyway to handle the conformity situation, | |
| * we don't have to do any additional work to determine the | |
| * correct edge type. Therefore, we will take this approach | |
| * at determining the correct edge type on the fly, EVEN IF | |
| * the edges are always around and their correct types are | |
| * recorded correctly once and for all when a mesh is built. | |
| * \n\n | |
| * This way we can also do lazy edge creation; i.e., create an | |
| * edge only when it needs to be refined. The lazy edge is then | |
| * in principle simply a holder for the new point, allowing O(1) | |
| * access to the new point by other simplices, through the edge | |
| * rings around their vertices. | |
| * \n\n | |
| * Note that lazy edge creation has a serious performance benefit | |
| * to this routine in particular: if all edges are around, then to | |
| * find a particular edge, we then always have to search both edge | |
| * rings associated with each vertex for a common edge. This means | |
| * we look for the intersection of two sets of five elements on | |
| * average in 2D, and two sets of fifteen elements on average in 3D. | |
| * With lazy edge creation, we search only through lists of edges | |
| * that were created for refinement; these lists are usually a | |
| * much smaller. | |
| * \n\n | |
| * A final advantage of lazy edge creation is that having a list | |
| * of only the refined edges allows us to efficiently build a | |
| * prolongation operator between the original mesh and the refined | |
| * mesh. | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param currentQ index of a given queue | |
| * @param sm pointer to the simplex | |
| * @param v pointer to the vertex | |
| * @param vAB pointer to the midpoint of the edge | |
| * @param A index for a vertex in a simplex | |
| * @param B index for a vertex in a simplex | |
| */ | |
| VEXTERNC void Gem_refineEdge(Gem *thee, int currentQ, | |
| SS *sm, VV *v[4], VV **vAB, int A, int B); | |
| /** | |
| * @ingroup Gem | |
| * @brief Uniform regular (quadrasection) refinement of a single simplex. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemref.c)\n | |
| * Boundary nodes/edges[faces] are correctly refined. | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sm pointer to the simplex | |
| * @param currentQ index of a given queue | |
| */ | |
| VEXTERNC void Gem_octsect(Gem *thee, SS *sm, int currentQ); | |
| /** | |
| * @ingroup Gem | |
| * @brief Bisection refinement of a single simplex by longest edge. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemref.c)\n | |
| * Boundary nodes/edges[faces] are correctly refined.\n | |
| * "Face Type rule": Boundary faces rule over Interior faces.\n | |
| * In other words, if an edge is shared between a boundary face and | |
| * an interior face, and the edge gets refined, the new point will | |
| * be a boundary point. | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sm pointer to the simplex | |
| * @param currentQ index of a given queue | |
| */ | |
| VEXTERNC void Gem_bisectLE(Gem *thee, SS *sm, int currentQ); | |
| /** | |
| * @ingroup Gem | |
| * @brief Bisection refinement of a single simplex by newest vertex. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemref.c)\n\n | |
| * @verbatim | |
| * Boundary nodes/edges[faces] are correctly refined. | |
| * | |
| * "Face Type rule": Boundary faces rule over Interior faces. | |
| * | |
| * In other words, if an edge is shared between a boundary face and | |
| * an interior face, and the edge gets refined, the new point will | |
| * be a boundary point. | |
| * | |
| * We use "newest vertex" approach to selecting the refinement edge | |
| * choice generated by the Arnold-Mukherjee marking procedure. | |
| * Below is a mathematica program that demonstrates the marking | |
| * algorithm, courtesy of Doug Arnold and Arup Mukerjee. | |
| * | |
| * (* -- BEGIN MATHEMATICA CODE ----------------------------------------- *) | |
| * (* | |
| * * NOTE: The following mathematica program, courtesy of doug arnold | |
| * * and arup mukherjee, illustrates their particular edge choice, | |
| * * which is provably non-degenerate. The small comment at the | |
| * * beginning, just following my comment here, is from Arup. | |
| * * We implement their marking procedure in MC with our MC geometry | |
| * * datastructures (as an alternative to longest edge choice) by | |
| * * allocating a few bits to indicate both the marked edges on each face | |
| * * and then the refinement edge choice. -mike | |
| * *) | |
| * (* | |
| * * Arup's Comment: I am also including a mathematica script for the | |
| * * bisection. Given a tet and its "type" it does the bisection upto a | |
| * * required bisection level and lists the total number of similarity | |
| * * classes produced in the process (it uses a Liu-Joe indicator given on | |
| * * one of their papers ... the example at the end of Chap 3 in the | |
| * * thesis has the specific reference on this). The tetrahedron specified | |
| * * in the example attains the upper bound of 36 similarity classes. | |
| * *) | |
| * | |
| * (* SET the value of nlevels (number of bisection levels) | |
| * and the TYPE of t[0] p-uf, p-f, np-aa, etc ... | |
| * before input | |
| * to mathematica *) | |
| * | |
| * nlevels=8 | |
| * | |
| * SetAttributes[bisect,Listable] | |
| * (* these are the "bisection" rules | |
| * p-uf -- planar with flag off | |
| * v0-v1 is refinement edge and v0-v2 and v1-v2 are marked edges | |
| * the plane containing all marked edges is v0 v1 v2 | |
| * p-f -- planar with flag on | |
| * v0-v1 is refinement edge and v0-v2 and v1-v2 are marked edges | |
| * the plane containing all marked edges is v0 v1 v2 | |
| * np-aa -- non planar case with adjacent markings | |
| * v0-v1 is refinement edge and v0-v2 and v1-v3 are marked edges | |
| * np-oo -- opp-opp | |
| * v0-v1 is refinement edge and v2-v3 is the other marked edge | |
| * np-ao -- adj-opp | |
| * v0-v1 is the refinement edge and v0-v2 and v2-v3 are marked | |
| * *) | |
| * | |
| * bisect[Tetra[v0_,v1_,v2_,v3_,p-uf]]:= { | |
| * Tetra[v0,v2,v3,(v0+v1)/2,p-f], Tetra[v1,v2,v3,(v0+v1)/2,p-f] } | |
| * | |
| * bisect[Tetra[v0_,v1_,v2_,v3_,p-f]]:= { | |
| * Tetra[v0,v2,v3,(v0+v1)/2,np-aa], Tetra[v1,v2,v3,(v0+v1)/2,np-aa] } | |
| * | |
| * bisect[Tetra[v0_,v1_,v2_,v3_,np-aa]]:={ | |
| * Tetra[v0,v2,v3,(v0+v1)/2,p-uf], Tetra[v1,v3,v2,(v0+v1)/2,p-uf] } | |
| * | |
| * bisect[Tetra[v0_,v1_,v2_,v3_,np-oo]]:={ | |
| * Tetra[v2,v3,v0,(v0+v1)/2,p-uf], Tetra[v2,v3,v1,(v0+v1)/2,p-uf] } | |
| * | |
| * bisect[Tetra[v0_,v1_,v2_,v3_,np-ao]]:={ | |
| * Tetra[v0,v2,v3,(v0+v1)/2,p-uf], Tetra[v2,v3,v1,(v0+v1)/2,p-uf] } | |
| * | |
| * (* a "generic" tetrahedron *) | |
| * v0={0,0,0}; | |
| * v1={23,0,0}; | |
| * v2={7,0,11}; | |
| * v3={17,5,13}; | |
| * | |
| * Clear[t] | |
| * (* set t[0] to be pf, pt, or np-** as the case may be *) | |
| * t[0]={Tetra[v0,v1,v2,v3,p-uf]}; | |
| * t[n_]:=t[n]=bisect[t[n-1]] | |
| * | |
| * (* The Liu-Joe quality indicator *) | |
| * dist2[v0_,v1_] := (v0-v1).(v0-v1) | |
| * dist[v0_,v1_] := Sqrt[dist[v0,v1]] | |
| * SetAttributes[qual,Listable] | |
| * qual[Tetra[v0_,v1_,v2_,v3_,any_]] := | |
| * 12 Abs[Det[{v1-v0,v2-v0,v3-v0}]/2]^(2/3)/ | |
| * (dist2[v0,v1]+dist2[v0,v2]+dist2[v0,v3] | |
| * +dist2[v1,v2]+dist2[v1,v3]+dist2[v2,v3]) | |
| * | |
| * (* discretized Liu-Joe quality indicator *) | |
| * (* (scaled to [0,100000] and rounded to an integer *) | |
| * SetAttributes[dqual,Listable] | |
| * dqual[t_] := Round[100000 N[qual[t],10]] | |
| * | |
| * (* q[i] --- list of qualities for level i | |
| * qq[i] -- list of all qualities upto level i | |
| * newout[i] -- the "number" of different similarity classes at | |
| * level i | |
| * totout[i] -- the "number" of different similarity classes at | |
| * or below level i *) | |
| * Do[q[i]=dqual[t[i]],{i,0,nlevels}] | |
| * Do[qq[i]= Union@@Table[q[j],{j,0,i}],{i,0,nlevels}] | |
| * Do[newout[i]=Dimensions[Union[Flatten[q[i]]]],{i,0,nlevels}] | |
| * Do[totout[i]=Dimensions[Union[Flatten[qq[i]]]],{i,0,nlevels}] | |
| * Table[{i,newout[i],totout[i]},{i,0,nlevels}]//TableForm | |
| * (* -- END MATHEMATICA CODE ---------------------------------------- *) | |
| * @endverbatim | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sm pointer to the simplex | |
| * @param currentQ index of a given queue | |
| */ | |
| VEXTERNC void Gem_bisectNV(Gem *thee, SS *sm, int currentQ); | |
| /** | |
| * @ingroup Gem | |
| * @brief Bisection refinement by pairs. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemref.c)\n | |
| * Boundary nodes/edges[faces] are correctly refined.\n | |
| * "Face Type rule": Boundary faces rule over Interior faces.\n | |
| * In other words, if an edge is shared between a boundary face and | |
| * an interior face, and the edge gets refined, the new point will | |
| * be a boundary point. | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sm pointer to the simplex | |
| * @param currentQ index of a given queue | |
| */ | |
| VEXTERNC void Gem_bisectNP(Gem *thee, SS *sm, int currentQ); | |
| /** | |
| * @ingroup Gem | |
| * @brief Un-refine the mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemunref.c)\n | |
| * If (key==0) Simply toss out the marked simplices; this leaves | |
| * "holes", and we mark all neighbor faces that were | |
| * revealed as boundary faces. | |
| * @return number of unrefined mesh elements | |
| * @param thee Pointer to class Gem | |
| * @param rkey If (rkey==0) Perform recursive simplex bisection until | |
| * conformity\n | |
| * If (rkey==1) Perform first quadra-[octa-]-section, followed | |
| * by recursive simplex bisection until conformity.\n | |
| * IMPORTANT NOTE: In 2D, (rkey==1) WILL generate | |
| * a conforming mesh. However, in 3D, this procedure | |
| * will in general produce nonconforming simplices. | |
| * To produce a conforming mesh in 3D would require an | |
| * implementation covering all possible face refinement | |
| * combinations (something like 169 cases). This has | |
| * been done e.g. by Jurgen Bey in AGM, but we are | |
| * not that patient; use (rkey==0) above if you want | |
| * a conforming mesh...\n | |
| * If (rkey==2) As a test of the conformity procedure, | |
| * perform quadra-[octa-]-section until conformity, which | |
| * should produce a uniformly regularly refined mesh. | |
| * (In 2D, each triangle should be divided into four | |
| * children, and in 3D each tetrahedron should be | |
| * divided into eight children.) | |
| * @param pkey Boolean sets the pkey type to prolongate a vector | |
| */ | |
| VEXTERNC int Gem_unRefine(Gem *thee, int rkey, int pkey); | |
| /** | |
| * @ingroup Gem | |
| * @brief Delete a simplex cleanly, maintaining a consecutive list | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemunref.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sm pointer to the simplex | |
| * @param currentQ index of a given queue | |
| */ | |
| VEXTERNC void Gem_delSimplex(Gem *thee, SS *sm, int currentQ); | |
| /** | |
| * @ingroup Gem | |
| * @brief Toss out any hanging vertices. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemunref.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_unHangVertices(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Read in the user-specified initial vertex-simplex mesh. | |
| * provided to us in MC-Simplex-Format (MCSF), and transform | |
| * into our internal datastructures. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemio.c) | |
| * @verbatim | |
| * The user provides the following information about a domain and an | |
| * initial simplex-triangulation: | |
| * | |
| * D = DIMENSION = spatial dimension of problem (1, 2, or 3) | |
| * N = NVERTICES = total number of vertices in mesh | |
| * L = NSIMPLICES = total number of simplices in the mesh | |
| * | |
| * double vertex* = List of all vertex coordinates in the form: | |
| * | |
| * vertex[ N * (3+D) ] = { | |
| * { id1, chart1, v1_x1, ..., v1_xD }, | |
| * { id2, chart2, v2_x1, ..., v2_xD }, | |
| * ... | |
| * { idN, chartN, vN_x1, ..., vN_xD } | |
| * } | |
| * | |
| * Here, vj_xk is the kth component (float or double) of the vertex | |
| * with global vertex number j. The "idj" flag is a 32-bit integer | |
| * "name" for vertex j, "chartj" is a 32-bit number representing the | |
| * "chart" with which to interpret the coordinates vj_xk, in the sense | |
| * of the charts of an atlas of manifold domain. | |
| * | |
| * int simplex* = List of all simplices by vertex number in the form: | |
| * | |
| * simplex[ L * (2 + 2*(D+1)) ] = { | |
| * { id1, g1, m1, f1_1, ..., f1_{D+1}, s1_v1, ..., s1_v{D+1} }, | |
| * { id2, g2, m2, f2_1, ..., f2_{D+1}, s2_v1, ..., s2_v{D+1} }, | |
| * ... | |
| * { idL, gL, mL, fL_1, ..., f2_{D+1}, sL_v1, ..., sL_v{D+1} } | |
| * } | |
| * | |
| * Here, sj_vk is a 32-bit integer giving the global vertex number | |
| * making up the kth vertex of the simplex with global number j. The | |
| * "idj" flag is a 32-bit integer "name" for simplex j, "gj" is a | |
| * 32-bit group number associated with simplex j (for grouping subsets | |
| * of simplices together for various reasons), "mj" is a 32-bit integer | |
| * containing the information about the simplex j such as its material | |
| * type, and "fj_k" is a 32-bit integer containing the information | |
| * about each face k of simplex j such as their boundary types (each | |
| * face opposite vertex k in simplex j). | |
| * | |
| * Thus, in 2D, a simplex (triangle) is specified by 3 consecutive | |
| * vertex numbers, and in 3D a simplex (tetrahedra) is specified by 4 | |
| * consecutive vertex numbers. The physical coordinates of any vertex | |
| * k in the simplex array are given in the vertex array in the | |
| * appropriate row of the array. | |
| * | |
| * NOTE: The ordering of the vertices in a simplex is *extremely* | |
| * important here; see the note below. | |
| * | |
| * Ordering of the vertices in a simplex: | |
| * | |
| * 1D: Well, this is pretty straight-forward; we will order the vertices | |
| * from left-to-right in each simplex; this will produce the correct | |
| * sign in integration by parts. | |
| * | |
| * 2D: All closed triangles must be specified by three consecutive vertices | |
| * in simplex and must be counter-clockwise-ordered by their vertices, | |
| * as seen from the "up" side of the 2D body/shell/surface. This | |
| * produces the correct surface-normals from the right-hand-rule for | |
| * surface (line in 2D) integrals. | |
| * | |
| * 3D: All closed tetrahedra must be specified by four consecutive vertices | |
| * in "simplex" in the following way: The first three vertices must | |
| * represent any one of the four faces as a counter-clockwise-ordered | |
| * triangle, as seen from INSIDE the tetrahedra. I.e., you can think | |
| * about this first triangle as lying in the plane, and you are | |
| * standing on the plane looking down at it. The fourth vertex | |
| * specified following the first three in the simplex is then some | |
| * height above the plane containing the first counter-clockwise | |
| * ordered triangle. This specification allows the remaining three | |
| * (of the four) triangles making up any tetrahedra to be correctly | |
| * specified in a counter-clockwise, inward-facing manner, so that the | |
| * correct surface-normals can be calculated consistently. | |
| * @endverbatim | |
| * @return Success enumeration | |
| * @param thee Pointer to class Gem | |
| * @param key input format type\n | |
| * 0 ==> simplex format\n | |
| * 1 ==> edge format\n | |
| * 2 ==> simplex-nabor format | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| */ | |
| VEXTERNC int Gem_read(Gem *thee, int key, Vio *sock); | |
| /** | |
| * @ingroup Gem | |
| * @brief Toss out any hanging vertices. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemio.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param key output format type\n | |
| * 0 ==> simplex format\n | |
| * 1 ==> edge format\n | |
| * 2 ==> simplex-nabor format | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| * @param fkey simplex write option\n | |
| * 0 ==> write simplices\n | |
| * 1 ==> write only sipmlex boundary faces\n | |
| * 2 ==> write only simplices that have | |
| * at least one boundary face | |
| * (NOT IMPLEMENTED HERE) | |
| */ | |
| VEXTERNC void Gem_write(Gem *thee, int key, Vio *sock, int fkey); | |
| /** | |
| * @ingroup Gem | |
| * @brief Write out the faces of a 3-simplex mesh as a complete and legal | |
| * 2-simplex mesh in "MCSF" format (described above for Gem_read). | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemio.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| */ | |
| VEXTERNC void Gem_writeFace3d(Gem *thee, Vio *sock); | |
| /** | |
| * @ingroup Gem | |
| * @brief Read in the user-specified initial vertex-edge mesh | |
| * provided to us in MC-Edge-Format (MCEF), and transform | |
| * into our internal datastructures. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemio.c)\n | |
| * @verbatim | |
| * Notes: The user provides the following information about a domain and an | |
| * initial edge-based triangulation: | |
| * | |
| * D = DIMENSION = spatial dimension of problem (1, 2, or 3) | |
| * N = NVERTICES = total number of vertices in mesh | |
| * L = NEDGES = total number of edges in the mesh | |
| * | |
| * double vertex* = List of all vertex coordinates in the form: | |
| * | |
| * vertex[ N * (3+D) ] = { | |
| * { id1, proc1, info1, v1_x1, ..., v1_xD }, | |
| * { id2, proc2, info2, v2_x1, ..., v2_xD }, | |
| * ... | |
| * { idN, procN, infoN, vN_x1, ..., vN_xD } | |
| * } | |
| * | |
| * Here, vj_xk is the kth component (float or double) of the vertex | |
| * with global vertex number j. The "idj" flag is a 32-bit integer | |
| * "name" for vertex j, "procj" is a 32-bit color or processor number | |
| * associated with vertex j, and "infoj" is a 32-bit integer containing | |
| * information about vertex j. | |
| * | |
| * int edge* = List of all edges by vertex number in the form: | |
| * | |
| * edge[ L * (2 + 2*(D+1)) ] = { | |
| * { id1, proc1, info1, e1_v1, e1_v2 }, | |
| * { id2, proc2, info2, e2_v1, e2_v2 }, | |
| * ... | |
| * { idL, procL, infoL, eL_v1, eL_v2 } | |
| * } | |
| * | |
| * Here, ej_vk is a 32-bit integer giving the global vertex number | |
| * making up the kth vertex of the edge with global number j. The | |
| * "idj" flag is a 32-bit integer "name" for edge j, "procj" is a | |
| * 32-bit color or processor number associated with edge j, | |
| * "infoj" is a 32-bit integer containing the information about the | |
| * edge j. | |
| * | |
| * Notes: To recover a simplex (triangle) mesh from the vertices and edges, | |
| * we must traverse them and rebuild the simplex structure, and do it | |
| * all in linear time. | |
| * | |
| * The three-step simplex recovery algorithm is as follows: | |
| * | |
| * (1) Definite vertices and edges from the input data. | |
| * | |
| * (2) Create all possible simplices as follows: | |
| * | |
| * For (vx=firstVV; vx!=lastVV; vx=nextVV) { | |
| * | Build all simplices which use vx as a vertex as follows: | |
| * | 2D CASE: For each distinct pair of vertices connected | |
| * | by an edge with vx, if this pair are also | |
| * | connected by an edge, then the three make a | |
| * | triangle. If the triangle has not already | |
| * | been created, then do so and add to the | |
| * | simplex rings for each of the three vertices. | |
| * | 3D CASE: For each distinct trio of vertices connected | |
| * | by an edge with vx, if this trio forms a triangle, | |
| * | then the foursome make a tetrahedron. If the | |
| * | tetrahedron has not already been created, then do | |
| * | so and add to the simplex rings for each of the | |
| * | four vertices. | |
| * EndFor | |
| * | |
| * (3) Remove a few "bad" simplices which were created incorrectly | |
| * in Step (2) above as follows: | |
| * | |
| * For (sm=firstSS; sm!=lastSS; sm=nextSS) { | |
| * | Remove all "bad" simplices, defined to be those satisfying: | |
| * | 2D CASE: All interior edges have multiple nabors, and | |
| * | all boundary edges have at least one nabor. | |
| * | 3D CASE: All interior faces have multiple nabors, and | |
| * | all boundary faces have at least one nabor. | |
| * EndFor | |
| * | |
| * NOTE: The crucial Step (3) of the above algorithm only works | |
| * correctly if we correctly identify the boundary faces of the | |
| * simplices, which is only possible if the input edge-based mesh | |
| * was given with boundary edge information. (We can construct | |
| * correct face types from the types of the one or three edges | |
| * forming the face in 2D or 3D respectively.) | |
| * | |
| * We attempt to recover simplex face types from the given | |
| * edge types. However, (at least) one degenerate cases is not | |
| * recoverable: an isolated Neumann face surounded by Dirichlet faces | |
| * will appear simply as three Dirichlet edges in the edge-based mesh, | |
| * and we turn this into a Dirichlet face. Note that if a Neumann | |
| * face consists of more than one simplex face, then it will be | |
| * recovered correctly from the edge types. | |
| * | |
| * Note also that if a non-simplex mesh is provided as input in | |
| * as an edge-based mesh, we will build the edges as specified, | |
| * but our attempt to build simplices will only recover those | |
| * simplices which actually exist in the edge mesh. Any other | |
| * non-simplex polyedra will appear as holes in the final | |
| * simplex mesh. | |
| * @endverbatim | |
| * @return Success enumeration | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| */ | |
| VEXTERNC int Gem_readEdge(Gem *thee, Vio *sock); | |
| /** | |
| * @ingroup Gem | |
| * @brief Write out the edges of a 2- or 3-simplex mesh | |
| * in "MCEF" (MC-Edge-Format). | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemio.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| */ | |
| VEXTERNC void Gem_writeEdge(Gem *thee, Vio *sock); | |
| /** | |
| * @ingroup Gem | |
| * @brief Build a vertex-simplex mesh from a vertex-edge mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemio.c)\n | |
| * @verbatim | |
| * Notes: Below is an email I sent to R. Bank outlining the idea of the | |
| * algorithm. I wanted to do this completely topologically, using | |
| * no geometry information, so that it would work for abstract | |
| * simplex manifolds. | |
| * | |
| * --------------------------------------------------------------------------- | |
| * Randy, | |
| * | |
| * I realized on the drive that your 2-manifold example is not actually | |
| * a problem after all. | |
| * | |
| * Consider first the planar situation we were worrying about, e.g., take a tet | |
| * and push the fourth vertex down into the plane of the other three vertices, | |
| * and you have the three (good) triangles inside one (bad) triangle. | |
| * As we agreed, any situation like this in the plane is managable (e.g. we can | |
| * detect the "bad" triangle) as long as we known what the boundary edges are | |
| * for the entire mesh. | |
| * | |
| * I conjecture that the "bad" simplices in this case and other 2D cases, as | |
| * well as the 3D case, are precisely those whose faces (edges in 2D) satisfy | |
| * both of the following conditions. (If this is a theorem, then everything | |
| * in this note is rigorous.) | |
| * (a) All interior faces are shared with >1 other simplex | |
| * (b) All boundary faces are shared with >0 other simplex | |
| * | |
| * Consider now your example, e.g. the four surface triangles of a tetrahedron | |
| * as a 2-manifold without boundary. We would like to be able to recover all | |
| * four surface triangles from the six edges, and we don't want to toss out one | |
| * of the triangles as we did above. The key difference is that above, the | |
| * problem triangle either has one or more boundary edges, OR it is imbedded in | |
| * the interior of a mesh, so its interior edges have neighoring triangles. | |
| * | |
| * That doesn't happen for the tet surface example. We would first build all | |
| * possible triangles from triples of edges. According to the above | |
| * "bad simplex" rule, all four of the triangles are "good", since they all | |
| * have exactly one naboring triangle sharing each edge. So we get the correct | |
| * triangulation of the surface of the tet. | |
| * | |
| * I conjecture that the following algorithm will rebuild d-simplices | |
| * (d=2 or d=3) from edges, using only topological information, with no | |
| * geometry information (and no floating point arithmetic at all, for that | |
| * matter). The edge-based input mesh has to satisfy three properties: | |
| * | |
| * 1. The dimension "d" of the mesh is specified (either d=2 or d=3) | |
| * 2. The edge-based mesh was built from an underlying d-simplex mesh | |
| * 3. The boundary edges are marked as such | |
| * | |
| * The two-step simplex reconstruction algorithm is then as follows: | |
| * | |
| * 1. For each vertex "v" do: | |
| * For all vertices connected to "v" by a single edge do: | |
| * Build every possible d-simplex | |
| * EndFor | |
| * EndFor | |
| * 2. For each simplex "s" that was built in step 1 do: | |
| * 3. If d=3, calculate all "face" types of "s" based on edge types | |
| * 4. Remove simplex "s" from list of simplices if (a) AND (b) hold: | |
| * (a) ALL inter faces (edges if d=2) shared by >1 other simplices | |
| * (b) ALL bndry faces (edges if d=2) shared by >0 other simplices | |
| * EndFor | |
| * | |
| * If you can come up with a triangulation of any 2-manifold, with or without | |
| * boundary, with or without holes, etc, which can't be turned into an edge | |
| * mesh and then recovered correctly using the above algorithm, then I'll | |
| * give you a dollar... -mike | |
| * @endverbatim | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_buildSfromE(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Write out the boundary edges or boundary faces of a | |
| * 2-simplex or 3-simplex mesh in a "BREP" format for input | |
| * into Barry Joe's 2D/3D Geompak. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemio.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| */ | |
| VEXTERNC void Gem_writeBrep(Gem *thee, Vio *sock); | |
| /** | |
| * @ingroup Gem | |
| * @brief Write out boundary edges of a 2-simplex mesh | |
| * in a "BREP" format for input into Barry Joe's 2D Geompak. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemio.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| */ | |
| VEXTERNC void Gem_writeBrep2(Gem *thee, Vio *sock); | |
| /** | |
| * @ingroup Gem | |
| * @brief Write out boundary faces of a 3-simplex mesh | |
| * in a "BREP" format for input into Barry Joe's 3D Geompak. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemio.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| */ | |
| VEXTERNC void Gem_writeBrep3(Gem *thee, Vio *sock); | |
| /** | |
| * @ingroup Gem | |
| * @brief Write out triangles of a 2-manifold as a 3-simplex boundary mesh | |
| * in a "BREP" format for input into Barry Joe's 3D Geompak. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemio.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| */ | |
| VEXTERNC void Gem_writeBrep2to3(Gem *thee, Vio *sock); | |
| /** | |
| * @ingroup Gem | |
| * @brief Write a finite element mesh or mesh function in some format. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemdisp.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| * @param defKey defKey == 0 ==> draw mesh as it is | |
| * defKey == 1 ==> use "def??" as new vertex coords (deformation) | |
| * defKey == 2 ==> add "def??" to old vertex coords (displacement) | |
| * | |
| * @param colKey colKey == 0 ==> color simplices all same default color | |
| * colKey == 1 ==> color simplices based on their chart | |
| * colKey == 2 ==> color boundary simplices based on type | |
| * | |
| * @param chartKey chartKey < 0 ==> draw all simplices | |
| * chartKey >= 0 ==> draw only simplices with chart chartKey | |
| * | |
| * @param gluVal gluVal == 1. ==> draw all simplices glued together | |
| * 0. < gluVal < 1. ==> draw simplices with some separation | |
| * | |
| * @param fkey fkey == 0 ==> draw simplices | |
| * fkey == 1 ==> draw only simplex boundary faces | |
| * fkey == 2 ==> draw only simplices with a boundary face | |
| * @param defX Pointer to vertex deformation or displacement values | |
| * @param format Pointer to GV/MATH format | |
| */ | |
| VEXTERNC void Gem_writeGEOM(Gem *thee, Vio *sock, | |
| int defKey, int colKey, int chartKey, double gluVal, int fkey, | |
| double *defX[MAXV], char *format); | |
| /** | |
| * @ingroup Gem | |
| * @brief Write a finite element mesh or mesh function in some format. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemdisp.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| * @param fldKey index for drawing the mesh | |
| * fldKey == 0 ==> draw mesh as it is | |
| * fldKey == 1 ==> write field[] as a scalar field over the mesh | |
| * fldKey == 2 ==> write field[] as a 2-vector field over the mesh | |
| * fldKey == 3 ==> write field[] as a 3-vector field over the mesh | |
| * fldKey == 4 ==> etc | |
| * @param defX Pointer to vertex deformation or displacement values | |
| * @param format Pointer to GV/MATH format | |
| */ | |
| VEXTERNC void Gem_writeSOL(Gem *thee, Vio *sock, | |
| int fldKey, | |
| double *defX[MAXV], char *format); | |
| /** | |
| * @ingroup Gem | |
| * @brief Produce an OFF file header for a volume mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemdisp.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| */ | |
| VEXTERNC void Gem_writeVolHeaderOFF(Gem *thee, Vio *sock); | |
| /** | |
| * @ingroup Gem | |
| * @brief Produce an OFF file header for a boundary mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemdisp.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| */ | |
| VEXTERNC void Gem_writeBndHeaderOFF(Gem *thee, Vio *sock); | |
| /** | |
| * @ingroup Gem | |
| * @brief Produce an OFF file trailer. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemdisp.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| */ | |
| VEXTERNC void Gem_writeTrailerOFF(Gem *thee, Vio *sock); | |
| /** | |
| * @ingroup Gem | |
| * @brief Write out a mesh in "Geomview OFF" format to a file or socket. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemdisp.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| * @param defKey 0 ==> draw mesh as it is\n | |
| * 1 ==> use "def??" as new vertex coords (deformation)\n | |
| * 2 ==> add "def??" to old vertex coords (displacement) | |
| * @param colKey 0 ==> color simplices all same default color\n | |
| * 1 ==> color simplices based on their chart\n | |
| * 2 ==> color boundary simplices based on type | |
| * @param chartKey < 0 ==> draw all simplices\n | |
| * >= 0 ==> draw only simplices with chart chartKey | |
| * @param gluVal gluVal == 1. ==> draw all simplices glued together\n | |
| * 0. < gluVal < 1. ==> draw simplices with some separation | |
| * @param fkey 0 ==> draw simplices\n | |
| * 1 ==> draw only simplex boundary faces\n | |
| * 2 ==> draw only simplices with a boundary face | |
| * @param defX defX[][MAXV] ==> vertex deformation or displacement values | |
| */ | |
| VEXTERNC void Gem_writeGV(Gem *thee, Vio *sock, | |
| int defKey, int colKey, int chartKey, double gluVal, int fkey, | |
| double *defX[MAXV]); | |
| /** | |
| * @ingroup Gem | |
| * @brief Write out the faces of a 2-simplex mesh as a complete and legal | |
| * 1-simplex mesh in "Geomview SKEL" format. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemdisp.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| * @param defKey 0 ==> draw mesh as it is\n | |
| * 1 ==> use "def??" as new vertex coords (deformation)\n | |
| * 2 ==> add "def??" to old vertex coords (displacement) | |
| * @param colKey 0 ==> color simplices all same default color\n | |
| * 1 ==> color simplices based on their chart\n | |
| * 2 ==> color boundary simplices based on type | |
| * @param chartKey < 0 ==> draw all simplices\n | |
| * >= 0 ==> draw only simplices with chart chartKey | |
| * @param gluVal gluVal == 1. ==> draw all simplices glued together\n | |
| * 0. < gluVal < 1. ==> draw simplices with some separation | |
| * @param defX defX[][MAXV] ==> vertex deformation or displacement values | |
| */ | |
| VEXTERNC void Gem_writeFace2dGV(Gem *thee, Vio *sock, | |
| int defKey, int colKey, int chartKey, double gluVal, | |
| double *defX[MAXV]); | |
| /** | |
| * @ingroup Gem | |
| * @brief Write out the faces of a 3-simplex mesh as a complete and legal | |
| * 2-simplex mesh in "Geomview OFF" format. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemdisp.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| * @param defKey 0 ==> draw mesh as it is\n | |
| * 1 ==> use "def??" as new vertex coords (deformation)\n | |
| * 2 ==> add "def??" to old vertex coords (displacement) | |
| * @param colKey 0 ==> color simplices all same default color\n | |
| * 1 ==> color simplices based on their chart\n | |
| * 2 ==> color boundary simplices based on type | |
| * @param chartKey < 0 ==> draw all simplices\n | |
| * >= 0 ==> draw only simplices with chart chartKey | |
| * @param gluVal gluVal == 1. ==> draw all simplices glued together\n | |
| * 0. < gluVal < 1. ==> draw simplices with some separation | |
| * @param defX defX[][MAXV] ==> vertex deformation or displacement values | |
| */ | |
| VEXTERNC void Gem_writeFace3dGV(Gem *thee, Vio *sock, | |
| int defKey, int colKey, int chartKey, double gluVal, | |
| double *defX[MAXV]); | |
| /** | |
| * @ingroup Gem | |
| * @brief Produce an MATH file header for a volume mesh. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemdisp.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| */ | |
| VEXTERNC void Gem_writeHeaderMATH(Gem *thee, Vio *sock); | |
| /** | |
| * @ingroup Gem | |
| * @brief Produce an MATH file trailer. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemdisp.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| */ | |
| VEXTERNC void Gem_writeTrailerMATH(Gem *thee, Vio *sock); | |
| /** | |
| * @ingroup Gem | |
| * @brief Write out a mesh in "Mathematica" format to a file or socket. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemdisp.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| * @param defKey 0 ==> draw mesh as it is\n | |
| * 1 ==> use "def??" as new vertex coords (deformation)\n | |
| * 2 ==> add "def??" to old vertex coords (displacement) | |
| * @param colKey 0 ==> color simplices all same default color\n | |
| * 1 ==> color simplices based on their chart\n | |
| * 2 ==> color boundary simplices based on type | |
| * @param chartKey < 0 ==> draw all simplices\n | |
| * >= 0 ==> draw only simplices with chart chartKey | |
| * @param gluVal gluVal == 1. ==> draw all simplices glued together\n | |
| * 0. < gluVal < 1. ==> draw simplices with some separation | |
| * @param fkey 0 ==> draw simplices\n | |
| * 1 ==> draw only simplex boundary faces\n | |
| * 2 ==> draw only simplices with a boundary face | |
| * @param defX defX[][MAXV] ==> vertex deformation or displacement values | |
| */ | |
| VEXTERNC void Gem_writeMATH(Gem *thee, Vio *sock, | |
| int defKey, int colKey, int chartKey, double gluVal, int fkey, | |
| double *defX[MAXV]); | |
| /** | |
| * @ingroup Gem | |
| * @brief Write out a scalar or vector function over a simplex mesh | |
| * in "GMV" (General Mesh Viewer) format. | |
| * @author Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemdisp.c) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| * @param fldKey 0 ==> draw mesh as it is \n | |
| * 1 ==> write field[] as a scalar field over the mesh \n | |
| * 2 ==> write field[] as a 2-vector field over the mesh\n | |
| * 3 ==> write field[] as a 3-vector field over the mesh\n | |
| * 4 ==> etc | |
| * @param defX defX[][MAXV] ==> possible scalar or vector field | |
| */ | |
| VEXTERNC void Gem_writeGMV(Gem *thee, Vio *sock, | |
| int fldKey, double *defX[MAXV]); | |
| /** | |
| * @ingroup Gem | |
| * @brief Write out a scalar or vector function over a simplex mesh | |
| * in "UCD" (Unstructured Cell Data) format for AVS 5.0 | |
| * @authors Amit Majumdar and Stephen Bond | |
| * (created using Mike Holst's Gem_writeGMV as template) | |
| * @note Class Gem: Non-inlineable methods (gemdisp.c)\n | |
| * Format: Our particular use of the UCD format is as follows\n | |
| * \n | |
| * PART 1.1: [# NODES] [# CELLS] [DIM NODEDAT] [DIM CELLDAT] [0]\n | |
| * PART 1.2: [NODE ID] [X COORD] [Y COORD] [Z COORD]\n | |
| * (REPEATED FOR EACH NODE)\n | |
| * PART 1.3: [CELL ID] [MATERIAL] [CELL TYPE] [LIST OF NODE IDS]\n | |
| * (REPEATED FOR EACH CELL)\n | |
| * PART 2.1: [NUM NODE FIELD COMPONENTS] [LIST OF COMPONENT SIZES]\n | |
| * PART 2.2: [COMPONENT LABEL], [COMPONENT UNITS]\n | |
| * (REPEATED FOR EACH NODE DATA COMPONENT)\n | |
| * PART 2.3: [NODE ID] [DATA VALUES]\n | |
| * (REPEATED FOR EACH NODE)\n | |
| * \n | |
| * PART 3.1: [NUM CELL FIELD COMPONENTS] [LIST OF COMPONENT SIZES]\n | |
| * PART 3.2: [COMPONENT LABEL], [COMPONENT UNITS]\n | |
| * (REPEATED FOR EACH CELL DATA COMPONENT)\n | |
| * PART 3.3: [CELL ID] [DATA VALUES]\n | |
| * (REPEATED FOR EACH CELL) | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| * @param fldKey 0 ==> draw mesh as it is \n | |
| * 1 ==> write field[] as a scalar field over the mesh \n | |
| * 2 ==> write field[] as a 2-vector field over the mesh\n | |
| * 3 ==> write field[] as a 3-vector field over the mesh\n | |
| * 4 ==> etc | |
| * @param defX defX[][MAXV] ==> possible scalar or vector field | |
| */ | |
| VEXTERNC void Gem_writeUCD(Gem *thee, Vio *sock, | |
| int fldKey, double *defX[MAXV]); | |
| /** | |
| * @ingroup Gem | |
| * @brief Write out a scalar or vector function over a simplex mesh | |
| * in "DX" (www.opendx.org) format. | |
| * @authors Nathan Baker, Stephen Bond, and Michael Holst | |
| * (created using Mike Holst's Gem_writeGMV as template) | |
| * @note Class Gem: Non-inlineable methods (gemdisp.c)\n | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| * @param fldKey 0 ==> draw mesh as it is \n | |
| * 1 ==> write field[] as a scalar field over the mesh \n | |
| * 2 ==> write field[] as a 2-vector field over the mesh\n | |
| * 3 ==> write field[] as a 3-vector field over the mesh\n | |
| * 4 ==> etc | |
| * @param defX defX[][MAXV] ==> possible scalar or vector field | |
| */ | |
| VEXTERNC void Gem_writeDX(Gem *thee, Vio *sock, | |
| int fldKey, double *defX[MAXV]); | |
| /** | |
| * @ingroup Gem | |
| * @brief Write out a scalar or vector function over a simplex mesh | |
| * in "TEC" (www.opendx.org) format. | |
| * @authors Nathan Baker, Jason Suen, and Michael Holst | |
| * (created using Mike Holst's Gem_writeGMV as template) | |
| * @note Class Gem: Non-inlineable methods (gemdisp.c)\n | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| * @param sock socket for reading/writing a finite element mesh or mesh function | |
| * @param fldKey 0 ==> draw mesh as it is \n | |
| * 1 ==> write field[] as a scalar field over the mesh \n | |
| * 2 ==> write field[] as a 2-vector field over the mesh\n | |
| * 3 ==> write field[] as a 3-vector field over the mesh\n | |
| * 4 ==> etc | |
| * @param defX defX[][MAXV] ==> possible scalar or vector field | |
| */ | |
| VEXTERNC void Gem_writeTEC(Gem *thee, Vio *sock, | |
| int fldKey, double *defX[MAXV]); | |
| /* | |
| * *************************************************************************** | |
| * Class Gem: Non-inlineable methods (gemext.c) | |
| * *************************************************************************** | |
| */ | |
| /* | |
| * *************************************************************************** | |
| * Class Gem: Non-inlineable methods (gemcube.c) | |
| * *************************************************************************** | |
| */ | |
| /** | |
| * @ingroup Gem | |
| * @brief Generate a unit cube domain. | |
| * @authors Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemcube.c)\n | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_makeCube(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Generate a unit octahedron domain. | |
| * @authors Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemcube.c)\n | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_makeOctahedron(Gem *thee); | |
| /** | |
| * @ingroup Gem | |
| * @brief Generate a unit icosahedron domain. | |
| * @authors Michael Holst | |
| * @note Class Gem: Non-inlineable methods (gemcube.c)\n | |
| * @return None | |
| * @param thee Pointer to class Gem | |
| */ | |
| VEXTERNC void Gem_makeIcosahedron(Gem *thee); | |