Commit 5403d9b5 authored by allens's avatar allens

added Integral Curve operator and continued clean up the FTLE and Poincare operators

git-svn-id: http://visit.ilight.com/svn/visit/trunk/src@21690 18c085ea-50e0-402c-830e-de6fd14e8384
parent f2b2b63e
......@@ -96,6 +96,7 @@ FiveFoldTetSubdivision
Flux
FTLE
IndexSelect
IntegralCurve
InverseGhostZone
Isosurface
Isovolume
......
This diff is collapsed.
......@@ -42,6 +42,8 @@
#include <AttributeSubject.h>
// Forward declarations
class FTLEAttributes;
class QLabel;
class QGroupBox;
class QListWidget;
......@@ -58,7 +60,6 @@ class QvisOpacitySlider;
class QPushButton;
class QButtonGroup;
class QRadioButton;
class FTLEAttributes;
// ****************************************************************************
// Class: QvisFTLEWindow
......@@ -87,7 +88,10 @@ class QvisFTLEWindow : public QvisOperatorWindow
virtual void CreateWindowContents();
protected:
void CreateAdvancedTab(QWidget *);
void CreateIntegrationTab(QWidget *);
void CreateAppearanceTab(QWidget *);
void CreateAdvancedTab(QWidget *);
void UpdateWindow(bool doAll);
void GetCurrentValues(int which_widget);
void UpdateAlgorithmAttributes();
......
......@@ -51,15 +51,18 @@
#include <vtkFloatArray.h>
#include <vtkPointData.h>
#include <vtkStreamer.h>
#include <InvalidVariableException.h>
#include <limits>
#include <cmath>
#include <avtParallel.h>
#include <avtCallback.h>
#include <avtFTLEIC.h>
#include <avtOriginatingSource.h>
#include <vtkVisItScalarTree.h>
#include <avtGradientExpression.h>
#include <vtkVisItScalarTree.h>
#include <avtParallel.h>
#include <limits>
#include <cmath>
// ****************************************************************************
// Method: avtFTLEFilter constructor
......@@ -1248,6 +1251,7 @@ avtFTLEFilter::PreExecute(void)
global_resolution[2] = res[2];
if (global_bounds[4] == global_bounds[5])
global_resolution[2] = 1;
avtPICSFilter::PreExecute();
}
......@@ -1278,9 +1282,126 @@ avtFTLEFilter::Execute(void)
SetOutputDataTree(dt);
return;
}
else
{
debug1 << "FTLE: no cached version, must re-execute" << std::endl;
avtPICSFilter::Execute();
std::vector<avtIntegralCurve *> ics;
GetTerminatedIntegralCurves(ics);
ReportWarnings( ics );
}
}
// ****************************************************************************
// Method: avtFTLEFilter::ReportWarnings()
//
// Purpose:
// Reports any potential integration warnings
//
// Programmer: Allen Sanderson
// Creation: 20 August 2013
//
// Modifications:
//
// ****************************************************************************
debug1 << "FTLE: no cached version, must re-execute" << std::endl;
avtPICSFilter::Execute();
void
avtFTLEFilter::ReportWarnings(std::vector<avtIntegralCurve *> &ics)
{
if (ics.size() == 0)
return;
int numICs = ics.size();
// int numPts = 0;
int numEarlyTerminators = 0;
int numStiff = 0;
int numCritPts = 0;
if (DebugStream::Level5())
debug5 << "::CreateIntegralCurveOutput " << ics.size() << endl;
//See how many pts, ics we have so we can preallocate everything.
for (int i = 0; i < numICs; i++)
{
avtFTLEIC *ic = dynamic_cast<avtFTLEIC*>(ics[i]);
// NOT USED ??????????????????????????
// size_t numSamps = (ic ? ic->GetNumberOfSamples() : 0);
// if (numSamps > 1)
// numPts += numSamps;
if (ic->TerminatedBecauseOfMaxSteps())
{
// Calculated only with avtStateRecorderIntegralCurve
// if (ic->SpeedAtTermination() <= criticalPointThreshold)
// numCritPts++;
// else
numEarlyTerminators++;
}
if (ic->EncounteredNumericalProblems())
numStiff++;
}
if ((doDistance || doTime) && issueWarningForMaxStepsTermination)
{
SumIntAcrossAllProcessors(numEarlyTerminators);
if (numEarlyTerminators > 0)
{
char str[1024];
SNPRINTF(str, 1024,
"%d of your streamlines terminated because they "
"reached the maximum number of steps. This may be indicative of your "
"time or distance criteria being too large or of other attributes being "
"set incorrectly (example: your step size is too small). If you are "
"confident in your settings and want the particles to advect farther, "
"you should increase the maximum number of steps. If you want to disable "
"this message, you can do this under the Advaced tab of the streamline plot."
" Note that this message does not mean that an error has occurred; it simply "
"means that VisIt stopped advecting particles because it reached the maximum "
"number of steps. (That said, this case happens most often when other attributes "
"are set incorrectly.)", numEarlyTerminators);
avtCallback::IssueWarning(str);
}
}
if (issueWarningForCriticalPoints)
{
SumIntAcrossAllProcessors(numCritPts);
if (numCritPts > 0)
{
char str[1024];
SNPRINTF(str, 1024,
"%d of your streamlines circled round and round a critical point (a zero"
" velocity location). Normally, VisIt is able to advect the particle "
"to the critical point location and terminate. However, VisIt was not able "
"to do this for these particles due to numerical issues. In all likelihood, "
"additional steps will _not_ help this problem and only cause execution to "
"take longer. If you want to disable this message, you can do this under "
"the Advanced tab of the streamline plot.", numCritPts);
avtCallback::IssueWarning(str);
}
}
if (issueWarningForStiffness)
{
SumIntAcrossAllProcessors(numStiff);
if (numStiff > 0)
{
char str[1024];
SNPRINTF(str, 1024,
"%d of your streamlines were unable to advect because of \"stiffness\". "
"When one component of a velocity field varies quickly and another stays "
"relatively constant, then it is not possible to choose step sizes that "
"remain within tolerances. This condition is referred to as stiffness and "
"VisIt stops advecting in this case. If you want to disable this message, "
"you can do this under the Advanced tab of the streamline plot.", numStiff);
avtCallback::IssueWarning(str);
}
}
}
// ****************************************************************************
......
......@@ -51,6 +51,7 @@
/** included attributes for FTLE */
#include <FTLEAttributes.h>
#include <vector>
class vtkDataSet;
class vtkRectilinearGrid;
......@@ -121,6 +122,8 @@ class avtFTLEFilter : public virtual avtPluginFilter,
virtual void UpdateDataObjectInfo(void);
virtual void ReportWarnings(std::vector<avtIntegralCurve *> &ics);
//helper functions
size_t ComputeBoundsAndResolution(vtkDataSet* in_ds, double bounds[6],int resolution[3]);
std::string CreateResampledCacheString(void);
......@@ -187,5 +190,4 @@ class avtFTLEFilter : public virtual avtPluginFilter,
virtual avtContract_p ModifyContract(avtContract_p);
};
#endif
# DO NOT EDIT THIS FILE! THIS FILE IS AUTOMATICALLY GENERATED BY xml2cmake
PROJECT(IntegralCurve)
INCLUDE(${VISIT_SOURCE_DIR}/CMake/PluginMacros.cmake)
SET(COMMON_SOURCES
IntegralCurvePluginInfo.C
IntegralCurveCommonPluginInfo.C
IntegralCurveAttributes.C
)
SET(LIBI_SOURCES
IntegralCurvePluginInfo.C
)
SET(LIBG_SOURCES
IntegralCurveGUIPluginInfo.C
QvisIntegralCurveWindow.C
${COMMON_SOURCES}
)
SET(LIBG_MOC_SOURCES
QvisIntegralCurveWindow.h
)
SET(LIBV_SOURCES
IntegralCurveViewerPluginInfo.C
${COMMON_SOURCES}
)
SET(LIBE_SOURCES
IntegralCurveEnginePluginInfo.C
avtIntegralCurveFilter.C
${COMMON_SOURCES}
)
IF(VISIT_PYTHON_SCRIPTING)
SET(PYINCLUDES ${PYTHON_INCLUDE_PATH} ${VISIT_INCLUDE_DIR}/visitpy/visitpy)
ENDIF(VISIT_PYTHON_SCRIPTING)
INCLUDE_DIRECTORIES(
${CMAKE_CURRENT_SOURCE_DIR}
${VISIT_COMMON_INCLUDES}
${VISIT_INCLUDE_DIR}/avt/DBAtts/MetaData
${VISIT_INCLUDE_DIR}/avt/DBAtts/SIL
${VISIT_INCLUDE_DIR}/avt/Database/Database
${VISIT_INCLUDE_DIR}/avt/Expressions/Abstract
${VISIT_INCLUDE_DIR}/avt/Expressions/CMFE
${VISIT_INCLUDE_DIR}/avt/Expressions/Conditional
${VISIT_INCLUDE_DIR}/avt/Expressions/Derivations
${VISIT_INCLUDE_DIR}/avt/Expressions/General
${VISIT_INCLUDE_DIR}/avt/Expressions/ImageProcessing
${VISIT_INCLUDE_DIR}/avt/Expressions/Management
${VISIT_INCLUDE_DIR}/avt/Expressions/Math
${VISIT_INCLUDE_DIR}/avt/Expressions/MeshQuality
${VISIT_INCLUDE_DIR}/avt/Expressions/TimeIterators
${VISIT_INCLUDE_DIR}/avt/FileWriter
${VISIT_INCLUDE_DIR}/avt/Filters
${VISIT_INCLUDE_DIR}/avt/IVP
${VISIT_INCLUDE_DIR}/avt/Math
${VISIT_INCLUDE_DIR}/avt/Pipeline/AbstractFilters
${VISIT_INCLUDE_DIR}/avt/Pipeline/Data
${VISIT_INCLUDE_DIR}/avt/Pipeline/Pipeline
${VISIT_INCLUDE_DIR}/avt/Pipeline/Sinks
${VISIT_INCLUDE_DIR}/avt/Pipeline/Sources
${VISIT_INCLUDE_DIR}/avt/Plotter
${VISIT_INCLUDE_DIR}/avt/QtVisWindow
${VISIT_INCLUDE_DIR}/avt/View
${VISIT_INCLUDE_DIR}/avt/VisWindow/Colleagues
${VISIT_INCLUDE_DIR}/avt/VisWindow/Interactors
${VISIT_INCLUDE_DIR}/avt/VisWindow/Proxies
${VISIT_INCLUDE_DIR}/avt/VisWindow/Tools
${VISIT_INCLUDE_DIR}/avt/VisWindow/VisWindow
${VISIT_INCLUDE_DIR}/gui
${VISIT_INCLUDE_DIR}/mdserver/proxy
${VISIT_INCLUDE_DIR}/mdserver/rpc
${VISIT_INCLUDE_DIR}/viewer/main
${VISIT_INCLUDE_DIR}/viewer/proxy
${VISIT_INCLUDE_DIR}/viewer/rpc
${VISIT_INCLUDE_DIR}/winutil
${VISIT_INCLUDE_DIR}/visit_vtk/full
${VISIT_INCLUDE_DIR}/visit_vtk/lightweight
${QT_INCLUDE_DIR}
${QT_QTCORE_INCLUDE_DIR}
${QT_QTGUI_INCLUDE_DIR}
${VTK_INCLUDE_DIRS}
${PYINCLUDES}
)
LINK_DIRECTORIES(${VISIT_LIBRARY_DIR} ${QT_LIBRARY_DIR} ${GLEW_LIBRARY_DIR} ${VTK_LIBRARY_DIRS} )
ADD_LIBRARY(IIntegralCurveOperator ${LIBI_SOURCES})
TARGET_LINK_LIBRARIES(IIntegralCurveOperator visitcommon)
SET(INSTALLTARGETS IIntegralCurveOperator)
IF(NOT VISIT_SERVER_COMPONENTS_ONLY AND NOT VISIT_ENGINE_ONLY AND NOT VISIT_DBIO_ONLY)
QT_WRAP_CPP(GIntegralCurveOperator LIBG_SOURCES ${LIBG_MOC_SOURCES})
ADD_LIBRARY(GIntegralCurveOperator ${LIBG_SOURCES})
TARGET_LINK_LIBRARIES(GIntegralCurveOperator visitcommon gui )
ADD_LIBRARY(VIntegralCurveOperator ${LIBV_SOURCES})
TARGET_LINK_LIBRARIES(VIntegralCurveOperator visitcommon viewer )
SET(INSTALLTARGETS ${INSTALLTARGETS} GIntegralCurveOperator VIntegralCurveOperator)
IF(VISIT_PYTHON_SCRIPTING)
SET(LIBS_SOURCES
IntegralCurveScriptingPluginInfo.C
PyIntegralCurveAttributes.C
${COMMON_SOURCES}
)
ADD_LIBRARY(SIntegralCurveOperator ${LIBS_SOURCES})
TARGET_LINK_LIBRARIES(SIntegralCurveOperator visitcommon visitpy ${PYTHON_LIBRARY})
SET(INSTALLTARGETS ${INSTALLTARGETS} SIntegralCurveOperator)
ENDIF(VISIT_PYTHON_SCRIPTING)
IF(VISIT_JAVA)
ADD_CUSTOM_TARGET(JavaIntegralCurve ALL ${CMAKE_Java_COMPILER} ${CMAKE_Java_FLAGS} -d ${VISIT_BINARY_DIR}/java -classpath ${VISIT_BINARY_DIR}/java IntegralCurveAttributes.java)
ADD_DEPENDENCIES(JavaIntegralCurve JavaClient)
ENDIF(VISIT_JAVA)
ENDIF(NOT VISIT_SERVER_COMPONENTS_ONLY AND NOT VISIT_ENGINE_ONLY AND NOT VISIT_DBIO_ONLY)
ADD_LIBRARY(EIntegralCurveOperator_ser ${LIBE_SOURCES})
TARGET_LINK_LIBRARIES(EIntegralCurveOperator_ser visitcommon avtexpressions_ser avtfilters_ser avtpipeline_ser )
SET(INSTALLTARGETS ${INSTALLTARGETS} EIntegralCurveOperator_ser)
IF(VISIT_PARALLEL)
ADD_PARALLEL_LIBRARY(EIntegralCurveOperator_par ${LIBE_SOURCES})
TARGET_LINK_LIBRARIES(EIntegralCurveOperator_par visitcommon avtexpressions_par avtfilters_par avtpipeline_par )
SET(INSTALLTARGETS ${INSTALLTARGETS} EIntegralCurveOperator_par)
ENDIF(VISIT_PARALLEL)
VISIT_INSTALL_OPERATOR_PLUGINS(${INSTALLTARGETS})
VISIT_PLUGIN_TARGET_RTOD(operators ${INSTALLTARGETS})
VISIT_PLUGIN_TARGET_FOLDER(operators IntegralCurve ${INSTALLTARGETS})
This diff is collapsed.
This diff is collapsed.
/* XPM */
static const char * IntegralCurve_xpm[] = {
"32 32 40 1",
"2 c None",
". c #053C7F",
"+ c #295684",
"@ c #931804",
"# c #559319",
"$ c #99650D",
"% c #769E20",
"& c #098229",
"* c #8EA196",
"= c #98A89C",
"- c #279112",
"; c #0B9838",
"> c #A2AEA5",
", c #086186",
"' c #927C35",
") c #537186",
"! c #306F82",
"~ c #25963D",
"{ c #089590",
"] c #609E2A",
"^ c #ADB0AC",
"/ c #066E8A",
"( c #5E9E3C",
"_ c #A6524E",
": c #0548C6",
"< c #789A48",
"[ c #993F14",
"} c #027CD8",
"| c #B1866F",
"1 c #31897F",
"3 c #02A5D3",
"4 c #5B828B",
"5 c #5C968B",
"6 c #04548F",
"7 c #798B92",
"8 c #025ECE",
"9 c #789E90",
"0 c #34A082",
"a c #088183",
"b c #8B8214",
"22222222222222222222222222222222",
"22222222222222222222222222222222",
"22222222222222222222222222222*02",
"222222222222222222222222222|$b#>",
"222222222222222222222222^|[@@@$2",
"2222222222222222222222^|[[@@@@[2",
"22222222222222222222==b'$[[@@@_2",
"22222222222222222>(~]#%<bb'$[[|2",
"22222222222222>(;;(5~]<]<<<7b$^2",
"22222222222>90;099;~99-<*#>#=b^2",
"2222222^90{{09=5;~9>~;**-*<]*%b^",
"299=90{{{19=90{~9^5;1^9&9^&=49#>",
"933/a15*=50{{5=^5{1*25&921~2&=->",
">3a/751{{a5*2=5{a52^1&*25&^*&2&>",
"2^{3/a15=2*5{{19225a1>29&92!5^&^",
"225{,1751aaa5=2^5aa5227a52=&>*&2",
"222933,a15=22*1aa5^224a522!124~2",
"222^{{+4^>71/aa5^229/a9224a>2!52",
"2222^4}}6//a5=2227!/1^224/92*,>2",
"222229{{,9>222*4,/!*222)/522!122",
"2222224!++)7!,/,1=222*+,5227,*22",
"2222222>8},6,!92222*!6/*22*61222",
"2222222^/},72222^4+6642227./^222",
"222222229!7)+74+6664^222).,^2222",
"2222222222)88.66!72222*+.+^22222",
"2222222222!88:7^2222*+..)2222222",
"2222222222=+67^7227+..+*22222222",
"2222222222222*......+72222222222",
"2222222222222+::..+7222222222222",
"2222222222222)::.*22222222222222",
"2222222222222^+:7222222222222222",
"22222222222222222222222222222222"};
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
/*****************************************************************************
*
* Copyright (c) 2000 - 2012, Lawrence Livermore National Security, LLC
* Produced at the Lawrence Livermore National Laboratory
* LLNL-CODE-442911
* All rights reserved.
*
* This file is part of VisIt. For details, see https://visit.llnl.gov/. The
* full copyright notice is contained in the file COPYRIGHT located at the root
* of the VisIt distribution or at http://www.llnl.gov/visit/copyright.html.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the disclaimer below.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the disclaimer (as noted below) in the
* documentation and/or other materials provided with the distribution.
* - Neither the name of the LLNS/LLNL nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL LAWRENCE LIVERMORE NATIONAL SECURITY,
* LLC, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*
*****************************************************************************/
// ************************************************************************* //
// File: IntegralCurveCommonPluginInfo.C
// ************************************************************************* //
#include <IntegralCurvePluginInfo.h>
#include <IntegralCurveAttributes.h>
#include <Expression.h>
#include <ExpressionList.h>
#include <avtDatabaseMetaData.h>
#include <avtMeshMetaData.h>
#include <avtSubsetsMetaData.h>
#include <avtScalarMetaData.h>
#include <avtVectorMetaData.h>
#include <avtTensorMetaData.h>
#include <avtSymmetricTensorMetaData.h>
#include <avtArrayMetaData.h>
#include <avtMaterialMetaData.h>
#include <avtSpeciesMetaData.h>
#include <avtCurveMetaData.h>
#include <avtLabelMetaData.h>
// ****************************************************************************
// Method: IntegralCurveCommonPluginInfo::AllocAttributes
//
// Purpose:
// Return a pointer to a newly allocated attribute subject.
//
// Returns: A pointer to the newly allocated attribute subject.
//
// Programmer: generated by xml2info
// Creation: omitted
//
// ****************************************************************************
AttributeSubject *
IntegralCurveCommonPluginInfo::AllocAttributes()
{
return new IntegralCurveAttributes;
}
// ****************************************************************************
// Method: IntegralCurveCommonPluginInfo::CopyAttributes
//
// Purpose:
// Copy a IntegralCurve attribute subject.
//
// Arguments:
// to The destination attribute subject.
// from The source attribute subject.
//
// Programmer: generated by xml2info
// Creation: omitted
//
// ****************************************************************************
void
IntegralCurveCommonPluginInfo::CopyAttributes(AttributeSubject *to,
AttributeSubject *from)
{
*((IntegralCurveAttributes *) to) = *((IntegralCurveAttributes *) from);
}
// ****************************************************************************
// Method: IntegralCurveCommonPluginInfo::GetCreatedExpressions
//
// Purpose:
// Gets the expressions created by this operator.
//
// Programmer: generated by xml2info
// Creation: omitted
//
// ****************************************************************************
ExpressionList *
IntegralCurveCommonPluginInfo::GetCreatedExpressions(const avtDatabaseMetaData *md)
{
int i;
char name[1024], defn[1024];
ExpressionList *el = new ExpressionList;
int numVectors = md->GetNumVectors();
for (i = 0 ; i < numVectors ; i++)
{
const avtVectorMetaData *mmd = md->GetVector(i);
{
Expression e2;
sprintf(name, "operators/IntegralCurve/%s", mmd->name.c_str());
e2.SetName(name);
e2.SetType(Expression::ScalarMeshVar);
e2.SetFromOperator(true);
e2.SetOperatorName("IntegralCurve");
sprintf(defn, "cell_constant(%s, 0.)", mmd->name.c_str());
e2.SetDefinition(defn);
el->AddExpressions(e2);
}
}
const ExpressionList &oldEL = md->GetExprList();
for (i = 0 ; i < oldEL.GetNumExpressions() ; i++)
{
const Expression &e = oldEL.GetExpressions(i);
if (e.GetType() == Expression::VectorMeshVar)
{
{
if (e.GetFromOperator())
continue; // weird ordering behavior otherwise
Expression e2;
sprintf(name, "operators/IntegralCurve/%s", e.GetName().c_str());
e2.SetName(name);
e2.SetType(Expression::ScalarMeshVar);
e2.SetFromOperator(true);
e2.SetOperatorName("IntegralCurve");
sprintf(defn, "cell_constant(%s, 0.)", e.GetName().c_str());
e2.SetDefinition(defn);
el->AddExpressions(e2);
}
}
}
return el;
}
/*****************************************************************************
*
* Copyright (c) 2000 - 2012, Lawrence Livermore National Security, LLC
* Produced at the Lawrence Livermore National Laboratory
* LLNL-CODE-442911
* All rights reserved.
*
* This file is part of VisIt. For details, see https://visit.llnl.gov/. The
* full copyright notice is contained in the file COPYRIGHT located at the root
* of the VisIt distribution or at http://www.llnl.gov/visit/copyright.html.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* - Redistributions of source code must retain the above copyright notice,
* this list of conditions and the disclaimer below.
* - Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the disclaimer (as noted below) in the
* documentation and/or other materials provided with the distribution.
* - Neither the name of the LLNS/LLNL nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL LAWRENCE LIVERMORE NATIONAL SECURITY,
* LLC, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*