Commit 9868bfd7 authored by ehsan's avatar ehsan Committed by Spencer Sherwin

Add

parent 8d1655eb
# Files to ignore for export
.gitignore export-ignore
.gitattributes export-ignore
.gitmodules export-ignore
/docs/tutorial export-ignore
/library/Demos/MultiRegions/ExtraDemos/ export-ignore
/solvers/ImageWarpingSolver/ export-ignore
/solvers/VortexWaveInteraction/ export-ignore
/solvers/CardiacEPSolver/Utilities/CellMLToNektar/ export-ignore
/solvers/IncNavierStokesSolver/Utilities/HybridPerformanceModel/ export-ignore
/utilities/Extras/ export-ignore
# Attempt union merges with CHANGELOG to avoid conflicts.
CHANGELOG.md merge=union
.*
!.gitignore
!.gitattributes
!.clang-format
# Ignore builds and ThirdParty directories
build
......
......@@ -74,6 +74,9 @@ v5.0.0
- Fixed bug in ReOrientQuadFacePhysMap (!1003)
- Add NekPy Python interface (!962, !990, !989, !1004)
- Fix edge case for ThirdPartyScotch and FindScoth (!1009)
- Fix to populate m_elmtToExpId map if not already set up in GetExpIndex (!1019)
- Added flag to skip periodic BCs while filling Dirichlet BCs in
ContField3D.cpp (!1018)
**NekMesh**:
- Add feature to read basic 2D geo files as CAD (!731)
......@@ -110,6 +113,7 @@ v5.0.0
- Add support for Gmsh 4.0 mesh file format (!964)
- Fix issue with extracting 1D curved surface from 2D file (!984)
- Fix surface extraction, added regression test (!994)
- Fix 2D meshing running out of memory due to missing else (!1012)
**FieldConvert**:
- Add input module for Semtex field files (!777)
......@@ -151,6 +155,7 @@ v5.0.0
- Made Sutherland's law non-dimensional (!972)
- Modified pressure outlet BCs to allow for the reference static pressure to be
set from the VALUE fields (!981)
- hp scaling for Laplacian AV (!1013)
**AcousticSolver:**
- Added two new boundary conditions to the APE system: RiemannInvariantBC
......
......@@ -6,6 +6,12 @@ RelWithDebInfo MinSizeRel.")
PROJECT(Nektar++ C CXX)
CMAKE_POLICY(SET CMP0022 NEW)
# Defer to use _ROOT variables to avoid Zlib warning
IF (POLICY CMP0074)
CMAKE_POLICY(SET CMP0074 OLD)
ENDIF()
# Nektar++ requires C++11. Try to infer this for older CMake versions (less than
# 3.1.0)
IF ("${CMAKE_VERSION}" VERSION_LESS "3.1")
......@@ -102,17 +108,30 @@ INCLUDE(GetGitRevisionDescription)
get_git_head_revision(GIT_REFSPEC GIT_SHA1)
# Set library, binary, include, share and doc paths.
SET(LIB_DIR "lib/nektar++-${NEKTAR_VERSION}")
SET(LIB_DIR "lib")
IF( CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" AND NOT APPLE )
SET(LIB_DIR "lib64/nektar++-${NEKTAR_VERSION}")
SET(LIB_DIR "lib64")
ENDIF()
SET(CMAKE_INCLUDE_SYSTEM_FLAG_CXX "-isystem ")
SET(NEKTAR_BIN_DIR bin)
SET(NEKTAR_LIB_DIR ${LIB_DIR})
SET(NEKTAR_INCLUDE_DIR include/nektar++-${NEKTAR_VERSION})
SET(NEKTAR_SHARE_DIR share/nektar++-${NEKTAR_VERSION})
SET(NEKTAR_DOC_DIR share/doc/nektar++-${NEKTAR_VERSION})
SET(NEKTAR_INCLUDE_DIR include/nektar++)
SET(NEKTAR_SHARE_DIR share/nektar++)
SET(NEKTAR_DOC_DIR share/doc/nektar++)
SET(NEKTAR_CMAKE_DIR ${LIB_DIR}/nektar++/cmake)
# Set ThirdParty locations.
SET(TPSRC ${CMAKE_SOURCE_DIR}/ThirdParty)
SET(TPBUILD ${CMAKE_BINARY_DIR}/ThirdParty)
SET(TPDIST ${CMAKE_BINARY_DIR}/ThirdParty/dist)
SET(TPINC ${CMAKE_INSTALL_PREFIX}/include/ThirdParty)
SET(TPLIB ${CMAKE_INSTALL_PREFIX}/${NEKTAR_LIB_DIR}/nektar++/thirdparty)
# Create ThirdParty source directory if it doesn't exist already.
IF (NOT EXISTS ${TPSRC})
FILE(MAKE_DIRECTORY ${TPSRC})
ENDIF ()
# Build shared libraries.
SET(NEKTAR_LIBRARY_TYPE "SHARED")
......@@ -120,18 +139,18 @@ SET(NEKTAR_LIBRARY_TYPE "SHARED")
# Set up RPATH
SET(CMAKE_SKIP_BUILD_RPATH FALSE)
SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
SET(CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${LIB_DIR}")
LIST(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES
"${CMAKE_INSTALL_PREFIX}/${LIB_DIR}" isSystemDir)
"${CMAKE_INSTALL_PREFIX}/${LIB_DIR}" isSystemDir)
IF("${isSystemDir}" STREQUAL "-1")
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LIB_DIR}")
ENDIF("${isSystemDir}" STREQUAL "-1")
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${LIB_DIR}" "${TPLIB}/")
ELSE()
SET(CMAKE_INSTALL_RPATH "${TPLIB}")
ENDIF()
# Get rid of OS X RPATH warnings -- we should set this to 1 once we reach
# required minimum cmake version of 3.0.0 and configure it in a more sane
# fashion.
# Enable the use of @rpath in macOS install names so that we can use multiple
# third-party directories.
IF(NOT DEFINED CMAKE_MACOSX_RPATH)
SET(CMAKE_MACOSX_RPATH 0)
SET(CMAKE_MACOSX_RPATH 1)
ENDIF()
# Components of the Nektar++ package to build
......@@ -177,6 +196,12 @@ IF (NEKTAR_USE_THREAD_SAFETY)
ADD_DEFINITIONS(-DNEKTAR_USE_THREAD_SAFETY)
ENDIF()
# Disable backups
OPTION(NEKTAR_DISABLE_BACKUPS "Disable automatic backup file creation" OFF)
IF (NEKTAR_DISABLE_BACKUPS)
ADD_DEFINITIONS(-DNEKTAR_DISABLE_BACKUPS)
ENDIF()
IF (MSVC)
# Needed for M_PI to be visible in visual studio.
ADD_DEFINITIONS(-D_USE_MATH_DEFINES)
......@@ -197,17 +222,6 @@ ELSE()
SET(TPURL http://www.nektar.info/thirdparty)
ENDIF()
SET(TPSRC ${CMAKE_SOURCE_DIR}/ThirdParty)
SET(TPBUILD ${CMAKE_BINARY_DIR}/ThirdParty)
SET(TPDIST ${CMAKE_BINARY_DIR}/ThirdParty/dist)
SET(TPINC ${CMAKE_INSTALL_PREFIX}/include/ThirdParty)
SET(TPLIB ${CMAKE_INSTALL_PREFIX}/${NEKTAR_LIB_DIR})
# Create ThirdParty source directory if it doesn't exist already.
IF (NOT EXISTS ${TPSRC})
FILE(MAKE_DIRECTORY ${TPSRC})
ENDIF ()
# Find ThirdParty libraries and headers.
# --------------------------------------
......@@ -281,7 +295,7 @@ IF (NEKTAR_BUILD_LIBRARY)
SET(NEKTAR++_LIBRARIES "" CACHE INTERNAL "")
ADD_SUBDIRECTORY(library)
INSTALL(EXPORT Nektar++Libraries DESTINATION ${LIB_DIR}/cmake COMPONENT dev)
INSTALL(EXPORT Nektar++Libraries DESTINATION ${NEKTAR_CMAKE_DIR} COMPONENT dev)
ENDIF (NEKTAR_BUILD_LIBRARY)
IF (NEKTAR_BUILD_TESTS)
......@@ -309,9 +323,15 @@ CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/cmake/Nektar++Config.cmake.in
# Install Nektar++ CMake configuration file
INSTALL(FILES ${CMAKE_BINARY_DIR}/Nektar++Config.cmake
DESTINATION ${NEKTAR_LIB_DIR}/cmake/
DESTINATION ${NEKTAR_CMAKE_DIR}
COMPONENT dev)
INSTALL(CODE "FILE(GLOB tplibs ${TPDIST}/lib/*${CMAKE_SHARED_LIBRARY_SUFFIX}*)
IF (NOT tplibs STREQUAL \"\")
FILE(INSTALL \${tplibs} DESTINATION ${TPLIB})
ENDIF()
")
# Install ThirdParty headers to subdirectory of ${NEKTAR_INCLUDE_DIR}
INSTALL(DIRECTORY ${TPDIST}/include/
DESTINATION ${NEKTAR_INCLUDE_DIR}/ThirdParty
......@@ -319,14 +339,6 @@ INSTALL(DIRECTORY ${TPDIST}/include/
OPTIONAL
)
# Install ThirdParty libraries into ${NEKTAR_LIB_DIR}. These are shipped with
# the LibUtilities library.
INSTALL(DIRECTORY ${TPDIST}/lib/
DESTINATION ${NEKTAR_LIB_DIR}
COMPONENT libutilities
OPTIONAL
)
ADD_SUBDIRECTORY(docs)
IF(NEKTAR_BUILD_PACKAGES)
......
......@@ -256,8 +256,7 @@ ENDMACRO(ADD_NEKTAR_TEST)
# Adds a new NekPy library with the given sources.
#
MACRO(ADD_NEKPY_LIBRARY name)
CMAKE_PARSE_ARGUMENTS(NEKPY "" "" "SOURCES" ${ARGN})
SET(NEKPY_NAME ${name})
CMAKE_PARSE_ARGUMENTS(NEKPY "" "DEPENDS" "SOURCES" ${ARGN})
# Create library.
ADD_LIBRARY(_${name} SHARED ${NEKPY_SOURCES})
......@@ -277,8 +276,13 @@ MACRO(ADD_NEKPY_LIBRARY name)
${name})
# Install __init__.py files.
CONFIGURE_FILE(${CMAKE_SOURCE_DIR}/cmake/python/init.py.in
${CMAKE_BINARY_DIR}/NekPy/${name}/__init__.py)
SET(TMPOUT "")
IF (NEKPY_DEPENDS)
SET(TMPOUT "from ..${NEKPY_DEPENDS} import _${NEKPY_DEPENDS}\n")
ENDIF()
SET(TMPOUT "${TMPOUT}from ._${name} import *")
FILE(WRITE ${CMAKE_BINARY_DIR}/NekPy/${name}/__init__.py ${TMPOUT})
INSTALL(TARGETS _${name} DESTINATION ${CMAKE_BINARY_DIR}/NekPy/${name})
ENDMACRO()
......
......@@ -176,6 +176,8 @@ IF (THIRDPARTY_BUILD_BOOST)
SET(Boost_LIBRARY_DIRS ${TPSRC}/dist/lib)
SET(Boost_CONFIG_LIBRARY_DIR ${TPLIB})
INCLUDE_DIRECTORIES(${TPDIST}/include)
STRING(REPLACE ";" ", " NEEDED_BOOST_LIBS_STRING "${NEEDED_BOOST_LIBS}")
MESSAGE(STATUS "Build boost libs: ${NEEDED_BOOST_LIBS_STRING}")
ELSE (THIRDPARTY_BUILD_BOOST)
......
from ._${NEKPY_NAME} import *
@inproceedings{persson2006sub,
title={Sub-cell shock capturing for {D}iscontinuous {G}alerkin methods},
author={Persson, P.-O. and Peraire, J.},
booktitle={44th AIAA Aerospace Sciences Meeting and Exhibit},
pages={112},
year={2006}
}
@inbook{MenDeG14,
Annote = {doi:10.2514/6.2014-2923},
Author = {Gianmarco Mengaldo and Daniele De Grazia and Freddie Witherden and Antony Farrington and Peter Vincent and Spencer Sherwin and Joaquim Peiro},
......
......@@ -541,6 +541,15 @@ Components of the \nekpp package can be selected using the following options:
Compiles utilities for pre- and post-processing simulation data.
\item \inlsh{NEKTAR\_DISABLE\_BACKUPS}
By default, Nektar++ solvers and the FieldConvert utility will not overwrite
any generated field files or output files they find an existing file with
the same name. Instead, the existing file will be either moved to a backup
file or you will be prompted to overwrite them. If you do not want this
behaviour, then enabling this option will cause all pre-existing output to
be overwritten silently.
\item \inlsh{NEKTAR\_SOLVER\_X}
Enabled compilation of the 'X' solver.
......
......@@ -444,22 +444,39 @@ Under the two following sections it is possible to define the initial conditions
\section{Examples}
\subsection{Shock capturing}
Compressible flow is characterised by abrupt changes in density within the flow domain often referred to as shocks. These discontinuities lead to numerical instabilities (Gibbs phenomena). This problem is prevented by locally adding a diffusion term to the equations to damp the numerical fluctuations. These fluctuations in an element are identified using a sensor algorithm which quantifies the smoothness of the solution within an element. The value of the sensor in an element is defined as
\begin{equation}\label{eq:sensor}
S_e=\frac{||\rho^p_e-\rho^{p-1}_e||_{L_2}}{||\rho_e^p||_{L_2}}
\end{equation}
Compressible flows can be characterised by abrupt changes in density within the flow domain often referred to as shocks. These discontinuities lead to numerical instabilities (Gibbs phenomena). This problem is prevented by locally adding a diffusion term to the equations to damp the numerical oscillations.
An artificial diffusion term is introduced locally to the Euler equations to deal with flow discontinuity and the consequential numerical oscillations. Two models are implemented, a non-smooth and a smooth artificial viscosity model.
\subsubsection{Non-smooth artificial viscosity model}
For the non-smooth artificial viscosity model the added artificial viscosity is constant in each element and discontinuous between the elements. The Euler system is augmented by an added laplacian term on right hand side of equation \ref{eq:euler}. The diffusivity of the system is controlled by a variable viscosity coefficient $\epsilon$. The value of $\epsilon$ is dependent on $\epsilon_0$, which is the maximum viscosity that is dependent on the polynomial order ($p$), the mesh size ($h$) and the maximum wave speed and the local sensor value. Based on pre-defined sensor threshold values, the variable viscosity is set accordingly
For the non-smooth artificial viscosity model the added artificial viscosity is constant in each element and discontinuous between the elements. The Euler system is augmented by an added Laplacian term on right hand side of equation \ref{eq:euler} \cite{persson2006sub}.
The diffusivity of the system is controlled by a variable viscosity coefficient $\varepsilon$.
For consistency $\varepsilon$ is proportional to the element size and inversely proportional to the polynomial order.
Finally, from physical considerations $\varepsilon$ needs to be proportional to the maximum characteristic speed of the problem.
The final form of the artificial viscosity is
\begin{equation}
\epsilon
=\epsilon_0\left \{ \begin{array}{l}
0\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \mbox{if}\ \ s_e<s_\kappa-\kappa\\
0.5\left(1+\sin{\frac{\pi\left(S_e-s_\kappa\right)}{2\kappa}}\right)\ \ \ \ \ \ \mbox{if}\ \ s_\kappa-\kappa<S_e<s_\kappa+\kappa\\
1\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \mbox{if}\ \ s_e > s_\kappa+\kappa
\varepsilon = \varepsilon_0 \frac{h}{p} \lambda_{max} S,
\end{equation}
where $S$ is a sensor.
As shock sensor, a modal resolution-based indicator is used
\begin{equation}\label{eq:sensor}
s_e = log_{10}\left( \frac{\langle q - \tilde{q}, q - \tilde{q} \rangle}{\langle q, q \rangle} \right) ,
\end{equation}
where $\langle \cdot, \cdot \rangle$ represents a $L^2$ inner product, $q$ and $\tilde{q}$ are the full and truncated expansions of a state variable (in our case density)
\begin{equation}
q(x) = \sum_{i=1}^{N(P)} \hat{q}_i \phi_i , \quad \tilde{q}(x) = \sum_{i=1}^{N(P-1)} \hat{q}_i \phi_i ,
\end{equation}
then the constant element-wise sensor is computed as follows
\begin{equation}
S_\varepsilon
= \left \{ \begin{array}{lll}
0 & \mbox{if} & s_e<s_0-\kappa \\
\frac{1}{2}\left(1+\sin{\frac{\pi\left(s_e-s_0\right)}{2\kappa}}\right) & \mbox{if} & | s_e - s_0| \le \kappa\\
1 & \mbox{if} & s_e > s_0+\kappa
\end{array}
\right.
\right.,
\end{equation}
where $s_0 = s_\kappa - 4.25\;log_{10}(p)$.
To enable the non-smooth viscosity model, the following line has to be added to the \inltt{SOLVERINFO} section:
\begin{lstlisting}[style=XmlStyle]
......@@ -467,22 +484,20 @@ To enable the non-smooth viscosity model, the following line has to be added to
<I PROPERTY="ShockCaptureType" VALUE="NonSmooth" />
<SOLVERINFO>
\end{lstlisting}
The diffusivity is controlled by the following parameters:
The diffusivity and the sensor can be controlled by the following parameters:
\begin{lstlisting}[style=XmlStyle]
<PARAMETERS>
<P> Skappa = -1.3 </P>
<P> Kappa = 0.2 </P>
<P> mu0 = 1.0 </P>
<P> mu0 = 1.0 </P>
</PARAMETERS>
\end{lstlisting}
where mu0 is the maximum values for the viscosity coefficient,
Kappa is half of the width of the transition interval and Skappa is
the value of the centre of the interval.
\begin{figure}[!htbp]
\begin{center}
\includegraphics[width = 0.47 \textwidth]{img/Mach_P4.pdf}
\includegraphics[width = 0.47 \textwidth]{img/ArtVisc_P4.pdf}
\caption{(a) Steady state solution for $M=0.8$ flow at $\alpha = 1.25^\circ$ past a NACA 0012 profile, (b) Artificial viscosity ($\epsilon$) distribution}
\caption{(a) Steady state solution for $M=0.8$ flow at $\alpha = 1.25^\circ$ past a NACA 0012 profile, (b) Artificial viscosity ($\varepsilon$) distribution}
\label{fig:}
\end{center}
\end{figure}
......@@ -569,7 +584,7 @@ Q_{min}= P_{exp}+\frac{max(2P_{exp},P_{geom})}{2} + \frac{3}{2}
where $Q_{min}$ is the minimum required number of quadrature
points to exactly integrate the highest-degree of nonlinearity,
$P_{exp}$ being the order of the polynomial expansion and $P_{geom}$
being the geometric order of the mesh. Bear in mind thatwe are
being the geometric order of the mesh. Bear in mind that we are
using a discontinuous discretisation, meaning that aliasing
effect are not fully controlled, since the boundary terms
introduce non-polynomial functions into the problem.
......
......@@ -648,6 +648,8 @@ GeometrySharedPtr CreateGeom(vector<NekDouble> coords, ShapeType shapeType)
volume = MemoryManager<HexGeom>::AllocateSharedPtr(0, &tmp2[0]);
break;
}
default:
break;
}
return volume;
......
......@@ -30,7 +30,9 @@ ADD_NEKTAR_EXECUTABLE(SteadyAdvectionDiffusionReaction2D
COMPONENT demos DEPENDS MultiRegions SOURCES SteadyAdvectionDiffusionReaction2D.cpp)
# Add ExtraDemos subdirectory.
ADD_SUBDIRECTORY(ExtraDemos)
IF (IS_DIRECTORY ExtraDemos)
ADD_SUBDIRECTORY(ExtraDemos)
ENDIF()
ADD_NEKTAR_TEST(Helmholtz1D_CG_P8)
ADD_NEKTAR_TEST(Helmholtz1D_CG_P8_periodic)
......
<?xml version="1.0" encoding="utf-8"?>
<!-- This file contains the elemental optimisation parameters.
The flags in these files can be set in such a way that the
evaluation of an operator inside the elemental libraries
(i.e. StdRegions and LocalRegions) is directed to one
of the two implementation choices
- evaluation using a matrix operation
- evaluation using the sum-factorisation technique
depending on the polynomial order of the expansion.
Although the optimal break-even point between the
two approaches is computer specific and would ideally
require some 'self-tuning' optimisation suite (cfr ATLAS),
use the following rule of thums to set the parameters:
The most efficient way of elementally evaluating an
operator depends on the complexity of the operator
in the sum-factorisation approach.
# For simple operators (such as BwdTrans and IProductWRTBase)
set DO_MAT_OP to TRUE (VALUE=1) for low orders (e.g. P<=4)
set DO_MAT_OP to FALSE (VALUE=0) in the other case
# For more complex operators (such as MassMatrixOp)
set DO_MAT_OP to TRUE for low and intermediate orders (e.g. P<=8)
set DO_MAT_OP to FALSE in the other case
# For very complex operators (such as HelmholtzMatrixOp)
always set DO_MAT_OP to TRUE
In general, the break-even point between the elemental matrix approach
and the sum-factorisation technique is higher for triangles than
for quadrilaterals. That is why you for exmaple may want to set
following flags for the IProductWRTBase operator:
(quadrilaterals) set DO_MAT_OP to TRUE if P<=4
(triangles) set DO_MAT_OP to TRUE if P<=6
-->
<NEKTAR>
<ELEMENTALOPTIMIZATIONPARAMETERS>
<QuadExp>
<BwdTrans>
<DO_MAT_OP NUMMODES0="2" NUMMODES1="2" VALUE="1" />
<DO_MAT_OP NUMMODES0="3" NUMMODES1="3" VALUE="1" />
<DO_MAT_OP NUMMODES0="4" NUMMODES1="4" VALUE="1" />
<DO_MAT_OP NUMMODES0="5" NUMMODES1="5" VALUE="1" />
</BwdTrans>
<IProductWRTBase>
<DO_MAT_OP NUMMODES0="2" NUMMODES1="2" VALUE="1" />
<DO_MAT_OP NUMMODES0="3" NUMMODES1="3" VALUE="1" />
<DO_MAT_OP NUMMODES0="4" NUMMODES1="4" VALUE="1" />
<DO_MAT_OP NUMMODES0="5" NUMMODES1="5" VALUE="1" />
</IProductWRTBase>
<MassMatrixOp>
<DO_MAT_OP NUMMODES0="2" NUMMODES1="2" VALUE="1" />
<DO_MAT_OP NUMMODES0="3" NUMMODES1="3" VALUE="1" />
<DO_MAT_OP NUMMODES0="4" NUMMODES1="4" VALUE="1" />
<DO_MAT_OP NUMMODES0="5" NUMMODES1="5" VALUE="1" />
<DO_MAT_OP NUMMODES0="6" NUMMODES1="6" VALUE="1" />
<DO_MAT_OP NUMMODES0="7" NUMMODES1="7" VALUE="1" />
<DO_MAT_OP NUMMODES0="8" NUMMODES1="8" VALUE="1" />
<DO_MAT_OP NUMMODES0="9" NUMMODES1="9" VALUE="1" />
</MassMatrixOp>
<HelmholtzMatrixOp>
<DO_MAT_OP NUMMODES0="2" NUMMODES1="2" VALUE="1" />
<DO_MAT_OP NUMMODES0="3" NUMMODES1="3" VALUE="1" />
<DO_MAT_OP NUMMODES0="4" NUMMODES1="4" VALUE="1" />
<DO_MAT_OP NUMMODES0="5" NUMMODES1="5" VALUE="1" />
<DO_MAT_OP NUMMODES0="6" NUMMODES1="6" VALUE="1" />
<DO_MAT_OP NUMMODES0="7" NUMMODES1="7" VALUE="1" />
<DO_MAT_OP NUMMODES0="8" NUMMODES1="8" VALUE="1" />
<DO_MAT_OP NUMMODES0="9" NUMMODES1="9" VALUE="1" />
<DO_MAT_OP NUMMODES0="10" NUMMODES1="10" VALUE="1" />
<DO_MAT_OP NUMMODES0="11" NUMMODES1="11" VALUE="1" />
<DO_MAT_OP NUMMODES0="12" NUMMODES1="12" VALUE="1" />
<DO_MAT_OP NUMMODES0="13" NUMMODES1="13" VALUE="1" />
<DO_MAT_OP NUMMODES0="14" NUMMODES1="14" VALUE="1" />
<DO_MAT_OP NUMMODES0="15" NUMMODES1="15" VALUE="1" />
<DO_MAT_OP NUMMODES0="16" NUMMODES1="16" VALUE="1" />
<DO_MAT_OP NUMMODES0="17" NUMMODES1="17" VALUE="1" />
</HelmholtzMatrixOp>
</QuadExp>
<TriExp>
<BwdTrans>
<DO_MAT_OP NUMMODES0="2" NUMMODES1="2" VALUE="1" />
<DO_MAT_OP NUMMODES0="3" NUMMODES1="3" VALUE="1" />
<DO_MAT_OP NUMMODES0="4" NUMMODES1="4" VALUE="1" />
<DO_MAT_OP NUMMODES0="5" NUMMODES1="5" VALUE="1" />
<DO_MAT_OP NUMMODES0="6" NUMMODES1="6" VALUE="1" />
<DO_MAT_OP NUMMODES0="7" NUMMODES1="7" VALUE="1" />
</BwdTrans>
<IProductWRTBase>
<DO_MAT_OP NUMMODES0="2" NUMMODES1="2" VALUE="1" />
<DO_MAT_OP NUMMODES0="3" NUMMODES1="3" VALUE="1" />
<DO_MAT_OP NUMMODES0="4" NUMMODES1="4" VALUE="1" />
<DO_MAT_OP NUMMODES0="5" NUMMODES1="5" VALUE="1" />
<DO_MAT_OP NUMMODES0="6" NUMMODES1="6" VALUE="1" />
<DO_MAT_OP NUMMODES0="7" NUMMODES1="7" VALUE="1" />
</IProductWRTBase>
<MassMatrixOp>
<DO_MAT_OP NUMMODES0="2" NUMMODES1="2" VALUE="1" />
<DO_MAT_OP NUMMODES0="3" NUMMODES1="3" VALUE="1" />
<DO_MAT_OP NUMMODES0="4" NUMMODES1="4" VALUE="1" />
<DO_MAT_OP NUMMODES0="5" NUMMODES1="5" VALUE="1" />
<DO_MAT_OP NUMMODES0="6" NUMMODES1="6" VALUE="1" />
<DO_MAT_OP NUMMODES0="7" NUMMODES1="7" VALUE="1" />
<DO_MAT_OP NUMMODES0="8" NUMMODES1="8" VALUE="1" />
<DO_MAT_OP NUMMODES0="9" NUMMODES1="9" VALUE="1" />
<DO_MAT_OP NUMMODES0="10" NUMMODES1="10" VALUE="1" />
<DO_MAT_OP NUMMODES0="11" NUMMODES1="11" VALUE="1" />
</MassMatrixOp>
<HelmholtzMatrixOp>
<DO_MAT_OP NUMMODES0="2" NUMMODES1="2" VALUE="1" />
<DO_MAT_OP NUMMODES0="3" NUMMODES1="3" VALUE="1" />
<DO_MAT_OP NUMMODES0="4" NUMMODES1="4" VALUE="1" />
<DO_MAT_OP NUMMODES0="5" NUMMODES1="5" VALUE="1" />
<DO_MAT_OP NUMMODES0="6" NUMMODES1="6" VALUE="1" />
<DO_MAT_OP NUMMODES0="7" NUMMODES1="7" VALUE="1" />
<DO_MAT_OP NUMMODES0="8" NUMMODES1="8" VALUE="1" />
<DO_MAT_OP NUMMODES0="9" NUMMODES1="9" VALUE="1" />
<DO_MAT_OP NUMMODES0="10" NUMMODES1="10" VALUE="1" />
<DO_MAT_OP NUMMODES0="11" NUMMODES1="11" VALUE="1" />
<DO_MAT_OP NUMMODES0="12" NUMMODES1="12" VALUE="1" />
<DO_MAT_OP NUMMODES0="13" NUMMODES1="13" VALUE="1" />
<DO_MAT_OP NUMMODES0="14" NUMMODES1="14" VALUE="1" />
<DO_MAT_OP NUMMODES0="15" NUMMODES1="15" VALUE="1" />
<DO_MAT_OP NUMMODES0="16" NUMMODES1="16" VALUE="1" />
<DO_MAT_OP NUMMODES0="17" NUMMODES1="17" VALUE="1" />
</HelmholtzMatrixOp>
</TriExp>
</ELEMENTALOPTIMIZATIONPARAMETERS>
</NEKTAR>
<?xml version="1.0" encoding="utf-8"?>
<NEKTAR>
<GEOMETRY DIM="1" SPACE="2">
<VERTEX>
<!-- Always must have four values per entry. -->
<V ID="0"> 0.0 0.0 0.0 </V>
<V ID="1"> 0.0625 0.0 0.0 </V>
<V ID="2"> 0.125 0.0 0.0 </V>
<V ID="3"> 0.1875 0.0 0.0 </V>
<V ID="4"> 0.25 0.0 0.0 </V>
<V ID="5"> 0.3125 0.0 0.0 </V>
<V ID="6"> 0.375 0.0 0.0 </V>
<V ID="7"> 0.4375 0.0 0.0 </V>
<V ID="8"> 0.5 0.0 0.0 </V>
<V ID="9"> 0.5625 0.0 0.0 </V>
<V ID="10"> 0.625 0.0 0.0 </V>
<V ID="11"> 0.6875 0.0 0.0 </V>
<V ID="12"> 0.75 0.0 0.0 </V>
<V ID="13"> 0.8125 0.0 0.0 </V>
<V ID="14"> 0.875 0.0 0.0 </V>
<V ID="15"> 0.9375 0.0 0.0 </V>
<V ID="16"> 1.0 0.0 0.0 </V>
</VERTEX>
<!-- Q - quads, T - triangles, S - segments, E - tet, P - pyramid, R - prism, H - hex -->
<!-- Only certain element types are appropriate for the given dimension (dim on mesh) -->
<!-- Can also use faces to define 3-D elements. Specify with F[1] for face 1, for example. -->
<ELEMENT>
<S ID="0"> 0 1 </S>