Commit 024b0176 authored by Chris Cantwell's avatar Chris Cantwell
Browse files

Merge branch 'master' into new-tests

parents 139472c5 5589154b
......@@ -74,9 +74,9 @@ MARK_AS_ADVANCED(NEKTAR_USE_DIRECT_BLAS_CALLS)
SET(NEKTAR_FULL_DEBUG OFF CACHE BOOL
"Enable Full Debugging.")
MARK_AS_ADVANCED(NEKTAR_FULL_DEBUG)
SET(NEKTAR_USE_PRECOMPILED_HEADERS OFF CACHE BOOL
"Enable the use of precompiled headers.")
MARK_AS_ADVANCED(NEKTAR_USE_PRECOMPILED_HEADERS)
#SET(NEKTAR_USE_PRECOMPILED_HEADERS OFF CACHE BOOL
# "Enable the use of precompiled headers.")
#MARK_AS_ADVANCED(NEKTAR_USE_PRECOMPILED_HEADERS)
IF (${CMAKE_COMPILER_IS_GNUCXX})
SET(NEKTAR_ENABLE_PROFILE OFF CACHE BOOL
......@@ -165,7 +165,6 @@ IF( NEKTAR_USE_MKL )
SET(NEKTAR_USING_BLAS TRUE)
SET(NEKTAR_USING_LAPACK TRUE)
SET(NEKTAR_USING_MKL TRUE)
ADD_DEFINITIONS(-DNEKTAR_USING_LAPACK -DNEKTAR_USING_BLAS)
ENDIF( NEKTAR_USE_MKL )
IF( NEKTAR_USE_ACCELERATE_FRAMEWORK )
......@@ -182,8 +181,7 @@ IF( NEKTAR_USE_ACML )
SET(NEKTAR_USING_BLAS TRUE)
SET(NEKTAR_USING_LAPACK TRUE)
SET(NEKTAR_USING_ACML TRUE)
ADD_DEFINITIONS(-DNEKTAR_USING_LAPACK -DNEKTAR_USING_BLAS -DUSE_ACML)
ADD_DEFINITIONS(-DNEKTAR_USING_LAPACK -DNEKTAR_USING_BLAS)
ADD_DEFINITIONS(-DUSE_ACML)
ENDIF( NEKTAR_USE_ACML )
IF( NEKTAR_USE_WIN32_LAPACK )
......@@ -192,9 +190,13 @@ ENDIF( NEKTAR_USE_WIN32_LAPACK )
IF( NEKTAR_USE_SYSTEM_BLAS_LAPACK )
INCLUDE(FindNativeBlasLapack)
SET(NEKTAR_USING_BLAS TRUE)
SET(NEKTAR_USING_LAPACK TRUE)
ENDIF( NEKTAR_USE_SYSTEM_BLAS_LAPACK )
IF( NEKTAR_USE_BLAS_LAPACK )
SET(NEKTAR_USING_BLAS TRUE)
SET(NEKTAR_USING_LAPACK TRUE)
ADD_DEFINITIONS( -DNEKTAR_USING_LAPACK -DNEKTAR_USING_BLAS )
ENDIF( NEKTAR_USE_BLAS_LAPACK )
......@@ -228,11 +230,11 @@ ENDIF( )
# Set up include directories
INCLUDE_DIRECTORIES( ${CMAKE_SOURCE_DIR} ${Boost_INCLUDE_DIRS} ${LOKI_INCLUDE_DIR} ${TINYXML_BASE})
IF( NEKTAR_USE_PRECOMPILED_HEADERS )
ADD_DEFINITIONS(-DNEKTAR_USE_PRECOMPILED_HEADERS)
ELSE( NEKTAR_USE_PRECOMPILED_HEADERS )
REMOVE_DEFINITIONS(-DNEKTAR_USE_PRECOMPILED_HEADERS)
ENDIF( NEKTAR_USE_PRECOMPILED_HEADERS )
#IF( NEKTAR_USE_PRECOMPILED_HEADERS )
# ADD_DEFINITIONS(-DNEKTAR_USE_PRECOMPILED_HEADERS)
#ELSE( NEKTAR_USE_PRECOMPILED_HEADERS )
# REMOVE_DEFINITIONS(-DNEKTAR_USE_PRECOMPILED_HEADERS)
#ENDIF( NEKTAR_USE_PRECOMPILED_HEADERS )
# Build active components
IF (NEKTAR_BUILD_LIBRARY)
......
......@@ -162,3 +162,7 @@ ENDIF(NEKTAR_USE_ARPACK)
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIR} ${LOKI_INCLUDE_DIR} ${TINYXML_BASE} ${NIST_SPARSE_BLAS_INCLUDE_DIR})
SET(NEKTAR_PACKAGE_GENERATOR "@NEKTAR_PACKAGE_GENERATOR@")
SET(NEKTAR_USING_BLAS "@NEKTAR_USING_BLAS@")
SET(NEKTAR_USING_LAPACK "@NEKTAR_USING_LAPACK@")
SET(NEKTAR_USING_MKL "@NEKTAR_USING_MKL@")
SET(NEKTAR_USING_ACML "@NEKTAR_USING_ACML@")
......@@ -5,20 +5,16 @@ MACRO(CHANGE_EXTENSION output var new_ext)
ENDMACRO()
MACRO(SET_LAPACK_LINK_LIBRARIES name)
IF( NEKTAR_USE_BLAS_LAPACK )
# Link FFTW before MKL to ensure FFTW original implementation used.
IF( NEKTAR_USE_FFTW )
TARGET_LINK_LIBRARIES(${name} optimized ${FFTW_LIB} debug ${FFTW_LIB})
ENDIF( NEKTAR_USE_FFTW )
# Link FFTW before MKL to ensure FFTW original implementation used.
IF( NEKTAR_USE_FFTW )
TARGET_LINK_LIBRARIES(${name} optimized ${FFTW_LIB} debug ${FFTW_LIB})
ENDIF( NEKTAR_USE_FFTW )
IF( NEKTAR_USE_BLAS_LAPACK )
IF( NEKTAR_USE_MKL AND MKL_FOUND )
TARGET_LINK_LIBRARIES(${name} ${MKL} )
ENDIF( NEKTAR_USE_MKL AND MKL_FOUND )
IF( NEKTAR_USE_NIST_SPARSE_BLAS_TOOLKIT AND NIST_SPARSE_BLAS_FOUND )
TARGET_LINK_LIBRARIES(${name} ${NIST_SPARSE_BLAS} )
ENDIF( NEKTAR_USE_NIST_SPARSE_BLAS_TOOLKIT AND NIST_SPARSE_BLAS_FOUND )
IF( NEKTAR_USE_ACML AND ACML_FOUND )
TARGET_LINK_LIBRARIES(${name} ${ACML_TARGET_LINK_LIBRARIES} )
ENDIF( NEKTAR_USE_ACML AND ACML_FOUND )
......@@ -38,20 +34,24 @@ MACRO(SET_LAPACK_LINK_LIBRARIES name)
ENDIF( NEKTAR_USE_WIN32_LAPACK )
IF( NEKTAR_USE_SYSTEM_BLAS_LAPACK )
TARGET_LINK_LIBRARIES(${name} ${NATIVE_LAPACK} ${NATIVE_BLAS})
TARGET_LINK_LIBRARIES(${name} ${NATIVE_LAPACK} ${NATIVE_BLAS})
ENDIF( NEKTAR_USE_SYSTEM_BLAS_LAPACK )
IF( NEKTAR_USE_METIS )
TARGET_LINK_LIBRARIES(${name} optimized ${METIS_LIB} debug ${METIS_LIB} )
ENDIF( NEKTAR_USE_METIS )
IF( NEKTAR_USE_ARPACK )
TARGET_LINK_LIBRARIES(${name} optimized ${ARPACK_LIB} debug
${ARPACK_LIB} )
ENDIF( NEKTAR_USE_ARPACK )
ENDIF( NEKTAR_USE_BLAS_LAPACK )
IF( NEKTAR_USE_NIST_SPARSE_BLAS_TOOLKIT AND NIST_SPARSE_BLAS_FOUND )
TARGET_LINK_LIBRARIES(${name} ${NIST_SPARSE_BLAS} )
ENDIF( NEKTAR_USE_NIST_SPARSE_BLAS_TOOLKIT AND NIST_SPARSE_BLAS_FOUND )
IF( NEKTAR_USE_METIS )
TARGET_LINK_LIBRARIES(${name} optimized ${METIS_LIB} debug
${METIS_LIB} )
ENDIF( NEKTAR_USE_METIS )
IF( NEKTAR_USE_ARPACK )
TARGET_LINK_LIBRARIES(${name} optimized ${ARPACK_LIB} debug
${ARPACK_LIB} )
ENDIF( NEKTAR_USE_ARPACK )
ENDMACRO(SET_LAPACK_LINK_LIBRARIES name)
MACRO(SET_COMMON_PROPERTIES name)
......@@ -61,32 +61,32 @@ MACRO(SET_COMMON_PROPERTIES name)
SET_TARGET_PROPERTIES(${name} PROPERTIES MINSIZEREL_POSTFIX -ms)
SET_TARGET_PROPERTIES(${name} PROPERTIES RELWITHDEBINFO_POSTFIX -rg)
IF( MSVC )
# Disable the warnings about duplicate copy/assignment methods
# (4521, 4522)
# Disable the warning that arrays are default intialized (4351)
# Disable "forcing value to bool 'true' or 'false' (performance
# warning)" warning (4800)
IF( MSVC )
# Disable the warnings about duplicate copy/assignment methods
# (4521, 4522)
# Disable the warning that arrays are default intialized (4351)
# Disable "forcing value to bool 'true' or 'false' (performance
# warning)" warning (4800)
# 4250 - Inheritance via dominance. Nektar appears to be handling the
# diamond correctly.
# /Za is necessary to prevent temporaries being bound to reference
# parameters.
SET_TARGET_PROPERTIES(${name} PROPERTIES COMPILE_FLAGS
"/wd4521 /wd4522 /wd4351 /wd4018 /wd4800 /wd4250")
# /Za is necessary to prevent temporaries being bound to reference
# parameters.
SET_TARGET_PROPERTIES(${name} PROPERTIES COMPILE_FLAGS
"/wd4521 /wd4522 /wd4351 /wd4018 /wd4800 /wd4250")
# Enable source level parallel builds.
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
ENDIF( )
# Enable source level parallel builds.
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
ENDIF( MSVC )
IF( ${CMAKE_COMPILER_IS_GNUCXX} )
IF( ${CMAKE_COMPILER_IS_GNUCXX} )
IF(NEKTAR_ENABLE_PROFILE)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pg")
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -pg")
SET(LINK_FLAGS "${LINK_FLAGS} -pg")
ENDIF()
ENDIF()
SET(LINK_FLAGS "${LINK_FLAGS} -pg")
ENDIF(NEKTAR_ENABLE_PROFILE)
ENDIF( ${CMAKE_COMPILER_IS_GNUCXX} )
# Prevent including these common flags multiple times.
IF (NOT ${CMAKE_CXX_FLAGS_DEBUG} MATCHES ".*DNEKTAR_DEBUG.*")
......@@ -95,19 +95,19 @@ MACRO(SET_COMMON_PROPERTIES name)
IF ( NEKTAR_FULL_DEBUG )
SET(CMAKE_CXX_FLAGS_DEBUG
"${CMAKE_CXX_FLAGS_DEBUG} -DNEKTAR_FULLDEBUG")
ENDIF()
ENDIF( NEKTAR_FULL_DEBUG)
IF( NOT MSVC )
SET(CMAKE_CXX_FLAGS_DEBUG
"${CMAKE_CXX_FLAGS_DEBUG} -fpermissive -Wno-deprecated")
SET(CMAKE_CXX_FLAGS_RELEASE
SET(CMAKE_CXX_FLAGS_RELEASE
"${CMAKE_CXX_FLAGS_RELEASE} -Wno-deprecated")
ENDIF()
ENDIF( NOT MSVC)
SET(CMAKE_CXX_FLAGS_RELEASE
"${CMAKE_CXX_FLAGS_RELEASE} -DNEKTAR_RELEASE")
ENDIF( )
ENDIF(NOT ${CMAKE_CXX_FLAGS_DEBUG} MATCHES ".*DNEKTAR_DEBUG.*")
IF( CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" )
# The static libraries must be compiled with position independent
......
......@@ -37,7 +37,12 @@ IF (THIRDPARTY_BUILD_BOOST)
INSTALL_COMMAND ""
BUILD_IN_SOURCE 1
)
# If building ThirdParty zlib, force zlib build before boost
IF (THIRDPARTY_BUILD_ZLIB)
ADD_DEPENDENCIES(boost zlib)
ENDIF(THIRDPARTY_BUILD_ZLIB)
# Set up CMake variables
SET(Boost_DATE_TIME_LIBRARY boost_date_time)
SET(Boost_DATE_TIME_LIBRARY_DEBUG boost_date_time)
......@@ -75,8 +80,9 @@ IF (THIRDPARTY_BUILD_BOOST)
)
ENDIF ()
ELSE (THIRDPARTY_BUILD_BOOST)
SET(Boost_DEBUG 1)
SET(Boost_USE_MULTITHREAD ON)
SET(Boost_ADDITIONAL_VERSIONS "1.48" "1.48.0" "1.47.0" "1.47" "1.46" "1.46. 1" "1.40" "1.40.0" "1.35.0" "1.35")
SET(Boost_ADDITIONAL_VERSIONS "1.49" "1.49.0" "1.48" "1.48.0" "1.47.0" "1.47" "1.46" "1.46. 1" "1.40" "1.40.0" "1.35.0" "1.35")
SET(Boost_NO_BOOST_CMAKE ON)
IF( NOT BOOST_ROOT )
......
////////////////////////////////////////////////////////////////////////////////
//
// File:
//
// 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:
//
//
////////////////////////////////////////////////////////////////////////////////
\tikzstyle{class}=[rectangle, draw=black, rounded corners, fill=blue!40, drop
shadow, text centered, anchor=north, text=white, minimum width=3cm,
rectangle split, rectangle split parts=3]
\tikzstyle{routine}=[rectangle, draw=black, rounded corners, fill=green, drop
shadow, text centered, anchor=north, text=white, text width=5cm, node
distance=1cm]
\tikzstyle{proposed}=[rectangle, draw=black, rounded corners,
fill=red!50, drop shadow, text centered, anchor=north, text=white, text
width=5cm, node distance=1cm]
\tikzstyle{myarrow}=[->, >=open triangle 90, thick]
\tikzstyle{line}=[-, thick]
\documentclass{article}
\usepackage[a4paper,top=1cm,left=1cm,right=1cm,bottom=2cm]{geometry}
\usepackage{bm}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{algorithm}
\usepackage{algorithmic}
\usepackage{tikz}
\usetikzlibrary{positioning,shapes,shadows,arrows,matrix}
\title{Nektar++: Incorporating iterative solvers}
\author{C. D. Cantwell}
\date{\today}
\begin{document}
\maketitle
\input{classdiagram}
\section{Specification}
Implement the necessary framework of classes and interfaces to:
\begin{itemize}
\item Implement the conjugate gradient method for solving global systems
iteratively.
\item Provide a unified interface for linking to other iterative
and/or parallel iterative solver libraries.
\item Encapsulate the underlying interaction with external libraries into a
common interface shared across the framework.
\item Ensure Nektar++ is not fixed-dependent on additional libraries (they
can be optionally enabled at CMake).
\end{itemize}
\section{Modifications to existing global solve}
To minimise code dependencies it is proposed to restructure the
\texttt{GlobalLinSys} class into a family of classes instantiated through a
class factory. We maintain the \texttt{GlobalLinSys} class as a base class, providing
virtual functions such as \texttt{solve()}. Additionally we provide,
for example, the following derived classes which implement linear system solvers
using various internal algorithms or external libraries (see Figure
\ref{f:globallinsys}).
\begin{itemize}
\item GlobalLinSysDirect - a full matrix, direct solve using LAPACK.
\item GlobalLinSysStaticCond - direct solve using substructuring
techniques to reduce storage requirements.
\item GlobalLinSysCG - implementation of a basic in-library conjugant
gradient solver.
\item GlobalLinSysPetSc - parallel iterative solver library interface.
\end{itemize}
The choice of solver to use will be selected using a \texttt{SOLVERINFO}
session file option, \texttt{GLOBAL\_SOLVE\_METHOD}, and if the specified
solver is unavailable the factory will inform the user by producing an error
message. This will encapsulate and decouple all aspects related to a
particular solve method and maintain clean code.
Additional types of solves can be implemented to provide other iterative
options. The encapsulation and code isolation allows the iterative algorithms
to utilise the NekMatrix level objects in the case of an in-house iterative
solver, or use non-native data types when utilising external libraries, as
considered appropriate.
\tikzset{my node/.code=\ifpgfmatrix\else\tikzset{matrix of nodes}\fi}
\begin{figure}
\begin{center}
\begin{tikzpicture}[node distance=2cm]%[every node/.style={my node}]
\node (GlobalLinSys) [class]
{
\textbf{GlobalLinSys}
\nodepart{second}{Base class}
\nodepart{third}{No dependencies}
%\nodepart{second}
%GlobalLinSys();\\virtual ~GlobalLinSys();\\virtual void solve();\\
%\nodepart{third}{
% string className;
%}
};
\node (GlobalLinSysDirect)[class, below of=GlobalLinSys, xshift=5cm]
{
\textbf{GlobalLinSysDirect}
\nodepart{second}{Derived}
\nodepart{third}{No dependencies}
};
\node (GlobalLinSysStaticCond)[class, below of=GlobalLinSysDirect]
{
\textbf{GlobalLinSysStaticCond}
\nodepart{second}{Derived}
\nodepart{third}{No dependencies}
};
\node (GlobalLinSysCG)[class, below of=GlobalLinSysStaticCond]
{
\textbf{GlobalLinSysCG}
\nodepart{second}{Derived}
\nodepart{third}{No dependencies}
};
\node (GlobalLinSysPetSc)[class, below of=GlobalLinSysCG]
{
\textbf{GlobalLinSysPetSc}
\nodepart{second}{Derived}
\nodepart{third}{PetSc Library}
};
\draw[myarrow] (GlobalLinSys.south) |- (GlobalLinSysDirect.west);
\draw[myarrow] (GlobalLinSys.south) |- (GlobalLinSysStaticCond.west);
\draw[myarrow] (GlobalLinSys.south) |- (GlobalLinSysCG.west);
\draw[myarrow] (GlobalLinSys.south) |- (GlobalLinSysPetSc.west);
\end{tikzpicture}
\end{center}
\caption{Class structure for GlobalLinSys.}
\label{f:globallinsys}
\end{figure}
\subsection{Instantiation of GlobalLinSys objects}
At present the GlobalLinSys class is instantiated in ExpList::GenGlobalLinSys.
We propose to use the factory pattern to instantiate the required derived
GlobalLinSys class. Possible issues here are:
\begin{itemize}
\item Currently the global matrix system are assembled before they are
passed to the GlobalLinSys object. To resolve this one could:
\begin{itemize}
\item Pass the list of expansions to the GlobalLinSys object and
encapsulate the construction within there (recommended). Unfortunately,
this couples the GlobalLinSys class to the expansions and the underlying
structure, although maybe this isn't of too much concern.
\item Restructure the GlobalMatrix class in a similar way to the
GlobalLinSys class and generate the appropriate GlobalMatrix to pass to
the GlobalLinSys for solving. This would allow the use of arbitrary
matrices with the GlobalLinSys solvers.
\end{itemize}
\textbf{Note:} GenGlobalMatrixFull and GenLinSysFull appear to duplicate
significant portions of code. This may provide an opportunity to tidy things
up.
\item In the current form, the static condensation GlobalLinSys class must
be changed to instead receive the 4 matrices in the form of a single block
matrix to remain constructor-compatible with the base class and Factory.
\end{itemize}
\section{Iterative Solvers}
The framework will provide a number of options for iterative solvers, allowing
the flexibility to utilise optimised external libraries and/or parallel
implementations or use an in-built conjugant gradient solver. In all cases,
each module in the framework will provide an implementation to solve a
matrix system:
\begin{align}
\bm{Ax}=\bm{b}
\end{align}
for known $\bm{b}$ and unknown $\bm{x}$.
\subsection{Conjugant Gradient Method}
The conjugate gradient algorithm proceeds as follows:
\begin{algorithm}
%\begin{algorithmic}
$r_0 = Ax_0$ \\
$z_0 = P^{-1}r_0$ \\
$w_0 = z_0$ \\
$j=0$ \\
while not converged \\
$\alpha_j = (r_j,z_j)/(Aw_j,w_j)$\\
$x_{j+1} = x_j + \alpha_j w_j$\\
$r_{j+1} = r_j - \alpha_j w_j$\\
$z_{j+1} = P^{-1} r_{j+1}$\\
$\beta_j = (r_{j+1},z_{j+1})/(r_j,z_j$\\
$w_{j+1} = z_{j+1} + \beta_j w_j$\\
continue
%\end{algorithmic}
\end{algorithm}
\section{Dependency minimisation}
We aim to minimise the number of additional dependencies introduced.
\begin{itemize}
\item Interfaces for external libraries should be optionally compiled and
included through the use of CMake switches: e.g.
\texttt{NEKTAR\_SUPPORT\_PETSC}. The corresponding \texttt{GlobalLinSys}
derived class would only then be linked into the library.
\item Choice of iterative solver to use should be selectable at run-time
(use of Factory pattern and decoupled code).
\end{itemize}
\end{document}
\ No newline at end of file
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="shortcut icon" href="images/favicon.ico" >
<!-- TemplateBeginEditable name="doctitle" -->
<title>Nektar++</title>
<!-- TemplateEndEditable -->
<style type="text/css">
<!--
html {
min-height: 101%; // force a scrollbar to always appear
}
body {
font: 100% Verdana, Arial, Helvetica, sans-serif;
background: #FFFFFF;
margin: 0;
padding: 0;
text-align: center;
color: #000000;
}
.twoColHybLt #container {
//max-width: 90em;
max-width: 60em;
width: 99%;
background: #FFFFFF;
margin: 0 auto;
text-align: left;
}
.twoColHybLt #sidebar1 {
float: left;
width: 13.7em;
background: #EBEBEB;
border: 1px solid #000000;
padding-top: 15px;
padding-right: 0;
padding-bottom: 15px;
padding-left: 0;
}
.twoColHybLt #sidebar1 h3, .twoColHybLt #sidebar1 p {
margin-left: 10px;
margin-right: 10px;
}
.twoColHybLt #mainContent {
margin-top: 0;
margin-right: 20px;
margin-bottom: 0;
margin-left: 14.5em;
}
.fltrt {
float: right;
margin-left: 8px;
}
.fltlft {
float: left;
margin-right: 8px;
}
.clearfloat {
clear:both;
height:0;
font-size: 1px;
line-height: 0px;
}
img {
border:0;
}
h1,h2,h3 {
margin-bottom: 0;
}
-->
</style>
<!-- TemplateBeginEditable name="CSS_Style" -->
<style type="text/css">
<!--
#menu_Nektar {
font-weight: bold;
}
-->
</style>
<!-- TemplateEndEditable -->
<!--[if IE]>
<style type="text/css">
.twoColHybLt #sidebar1 { padding-top: 30px; margin-top: 20px; }
.twoColHybLt #mainContent { zoom: 1; padding-top: 15px; }
</style>
<![endif]-->
<!-- TemplateParam name="LibraryMenu" type="boolean" value="false" -->
<!-- TemplateParam name="CompileMenu" type="boolean" value="false" -->
</head>
<body class="twoColHybLt">
<div id="container">
<div id="sidebar1">
<h3 style="text-align: center;"><a href="index.html" id="menu_Nektar"><img src="../images/nektar.png" alt="Nektar++" width="155" height="38" /></a></h3>
<p><a href="downloads.html" id="menu_Downloads">Downloads</a></p>
<p>
<a href="compile.html" id="menu_Compile">Compile Instructions</a>
<!-- TemplateBeginIf cond="CompileMenu" -->
<br/>
&nbsp;&nbsp;&nbsp;<a href="compile_linux.html" id="menu_CompileLinux">Linux</a><br/>
&nbsp;&nbsp;&nbsp;<a href="compile_windows.html" id="menu_CompileWindows">Windows</a><br/>
&nbsp;&nbsp;&nbsp;<a href="compile_osx.html" id="menu_CompileOSX">Mac OS X</a><br/>
<!-- TemplateEndIf -->
</p>
<p>
<a href="library.html" id="menu_Library">Library Overview</a>
<!-- TemplateBeginIf cond="LibraryMenu" -->
<br/>
&nbsp;&nbsp;&nbsp;<a href="library_LibUtilities.html" id="menu_LibraryLibUtilities">LibUtilities</a><br/>
&nbsp;&nbsp;&nbsp;<a href="library_StdRegions.html" id="menu_LibraryStdRegions">StdRegions</a><br/>
&nbsp;&nbsp;&nbsp;<a href="library_SpatialDomains.html" id="menu_LibrarySpatialDomains">SpatialDomains</a><br/>
&nbsp;&nbsp;&nbsp;<a href="library_LocalRegions.html" id="menu_LibraryLocalRegions">LocalRegions</a><br/>
&nbsp;&nbsp;&nbsp;<a href="library_MultiRegions.html" id="menu_LibraryMultiRegions">MultiRegions</a><br/>
<!-- TemplateEndIf -->
</p>
<p><a href="team.html" id="menu_Team">Team Members</a></p>
<!-- <p><a href="pre-processing.html" id="menu_PreProcessing">Pre-processing</a></p>-->
<!-- <p><a href="solvers.html" id="menu_Solvers">Solvers</a></p>-->
<p><a href="post-processing.html" id="menu_PostProcessing">Post-processing</a></p>
<!-- <p><a href="demos.html" id="menu_Demos">Demos</a></p>-->
<p><a href="http://www.nektar.info/2nd_edition/" target="_blank" id="menu_Book2ndEd">Spectral/hp element methods for CFD</a> (Karniadakis and Sherwin)</p>
<p><a href="educational_material.html" id="menu_EducationalMaterial">Educational Material</a></p>
<p><a href="license.html" id="menu_License">License</a></p>
<p><a href="acknowledgments.html" id="menu_Acknowledgments">Acknowledgments</a></p>
<p><a href="mailto:nektar-inquiry@sci.utah.edu" id="menu_Contact">Contact</a></p>
<p style="font-size:9px;">Last Revision:<br/>$Date: 2008/06/05 21:31:53 $</p>
</div>
<div id="mainContent">
<!-- TemplateBeginEditable name="Title" -->
<h1>Title</h1>
<!-- TemplateEndEditable -->
<hr/>
<!-- TemplateBeginEditable name="BodyText" -->
<p>Body Content</p>
<!-- TemplateEndEditable -->
<p><br class="clearfloat" /></p>
</div>
</div>
</body>