Commit f238a4b9 authored by Dave Moxey's avatar Dave Moxey
Browse files

Merge branch 'feature/nekmesh-check-links' into 'master'

Feature/nekmesh-check-links

Clears the existing element links in the mesh and reprocesses them. It then checks that all faces are linked to two elements or to one element and a boundary face.
Designed to be used with the bl split module to detect errors and user mistakes (creating hanging faces etc). Its been made into its own module so it can be used anywhere.

See merge request !691
parents e3022395 ce71808c
......@@ -51,6 +51,8 @@ v4.4.0
- Improvements to mesh linearisation module (!659)
- Add support for Gmsh high-order output (!679)
- Move CAD classes to factory format (!676)
- Add module to check topology of the mesh along with boundary connectivity
to detect problems such as hanging nodes (!691)
- Add option to `linearise` module to linearise only prisms (!688)
- Add option to `linearise` to use element quality (!690)
......
......@@ -618,6 +618,19 @@ may issue the command
module in combination with the splitting module described earlier.
\end{notebox}
\subsection{Link Checking}
It is quite possible that a mesh contains some sort of hanging entity or
element connectivity error. The check link module is a fast check that, a)
elements are correctly connected and b) the boundary entities (composites)
match the interior domain:
\begin{lstlisting}[style=BashInputStyle]
NekMesh -m linkcheck mesh.xml mesh2.xml
\end{lstlisting}
This module should be added to the module chain for any complex if the user
suspects there may be a mesh issue. The module will print a warning if there is.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
......
......@@ -18,6 +18,7 @@ SET(NekMeshHeaders
ProcessModules/ProcessExtractSurf.h
ProcessModules/ProcessExtractTetPrismInterface.h
ProcessModules/ProcessJac.h
ProcessModules/ProcessLinkCheck.h
ProcessModules/ProcessLinear.h
ProcessModules/ProcessPerAlign.h
ProcessModules/ProcessScalar.h
......@@ -47,6 +48,7 @@ SET(NekMeshSources
ProcessModules/ProcessExtractSurf.cpp
ProcessModules/ProcessExtractTetPrismInterface.cpp
ProcessModules/ProcessJac.cpp
ProcessModules/ProcessLinkCheck.cpp
ProcessModules/ProcessLinear.cpp
ProcessModules/ProcessPerAlign.cpp
ProcessModules/ProcessScalar.cpp
......
////////////////////////////////////////////////////////////////////////////////
//
// File: ProcessJac.cpp
//
// For more information, please see: http://www.nektar.info/
//
// The MIT License
//
// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
// Department of Aeronautics, Imperial College London (UK), and Scientific
// Computing and Imaging Institute, University of Utah (USA).
//
// License for the specific language governing rights and limitations under
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//
// Description: Calculate Jacobians of elements.
//
////////////////////////////////////////////////////////////////////////////////
#include <NekMeshUtils/MeshElements/Element.h>
#include "ProcessLinkCheck.h"
using namespace std;
using namespace Nektar::NekMeshUtils;
namespace Nektar
{
namespace Utilities
{
ModuleKey ProcessLinkCheck::className = GetModuleFactory().RegisterCreatorFunction(
ModuleKey(eProcessModule, "linkcheck"),
ProcessLinkCheck::create,
"Checks elemental links within elements.");
ProcessLinkCheck::ProcessLinkCheck(MeshSharedPtr m) : ProcessModule(m)
{
}
ProcessLinkCheck::~ProcessLinkCheck()
{
}
void ProcessLinkCheck::Process()
{
if (m_mesh->m_verbose)
{
cout << "ProcessLinkCheck: Checking links... " << endl;
}
//need to reset all links first to make sure there are no bugs!
ClearElementLinks();
ProcessVertices();
ProcessEdges();
ProcessFaces();
ProcessElements();
ProcessComposites();
int count = 0;
if(m_mesh->m_expDim == 2)
{
EdgeSet::iterator eit;
for(eit = m_mesh->m_edgeSet.begin();
eit != m_mesh->m_edgeSet.end(); eit++)
{
if((*eit)->m_elLink.size() != 2)
{
count++;
}
}
}
else
{
FaceSet::iterator fit;
for(fit = m_mesh->m_faceSet.begin();
fit != m_mesh->m_faceSet.end(); fit++)
{
if((*fit)->m_elLink.size() != 2)
{
count++;
}
}
}
if (count - m_mesh->m_element[m_mesh->m_expDim-1].size() != 0)
{
cout << "Link Check Error: mesh contains incorrectly connected"
<< " entities and is not valid: "
<< count - m_mesh->m_element[m_mesh->m_expDim-1].size()
<< endl;
}
}
}
}
////////////////////////////////////////////////////////////////////////////////
//
// File: ProcessJac.h
//
// For more information, please see: http://www.nektar.info/
//
// The MIT License
//
// Copyright (c) 2006 Division of Applied Mathematics, Brown University (USA),
// Department of Aeronautics, Imperial College London (UK), and Scientific
// Computing and Imaging Institute, University of Utah (USA).
//
// License for the specific language governing rights and limitations under
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included
// in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//
// Description: Calculate jacobians of elements.
//
////////////////////////////////////////////////////////////////////////////////
#ifndef UTILITIES_NEKMESH_PROCESSLINKCHECK
#define UTILITIES_NEKMESH_PROCESSLINKCHECK
#include "../Module.h"
namespace Nektar
{
namespace Utilities
{
/**
* @brief This processing module calculates the Jacobian of elements
* using %SpatialDomains::GeomFactors and the %Element::GetGeom
* method. For now it simply prints a list of elements which have
* negative Jacobian.
*/
class ProcessLinkCheck : public ProcessModule
{
public:
/// Creates an instance of this class
static boost::shared_ptr<Module> create(MeshSharedPtr m)
{
return MemoryManager<ProcessLinkCheck>::AllocateSharedPtr(m);
}
static ModuleKey className;
ProcessLinkCheck(MeshSharedPtr m);
virtual ~ProcessLinkCheck();
/// Write mesh to output file.
virtual void Process();
};
}
}
#endif
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment