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
......
......@@ -143,9 +143,43 @@ QvisFTLEWindow::CreateWindowContents()
// ----------------------------------------------------------------------
QWidget *integrationTab = new QWidget(central);
propertyTabs->addTab(integrationTab, tr("Integration"));
QGridLayout *mainLayout = new QGridLayout(integrationTab);
CreateIntegrationTab(integrationTab);
// ----------------------------------------------------------------------
// Appearance tab
// ----------------------------------------------------------------------
QWidget *appearanceTab = new QWidget(central);
propertyTabs->addTab(appearanceTab, tr("Appearance"));
CreateAppearanceTab(appearanceTab);
// ----------------------------------------------------------------------
// Advanced tab
// ----------------------------------------------------------------------
QWidget *advancedTab = new QWidget(central);
propertyTabs->addTab(advancedTab, tr("Advanced"));
CreateAdvancedTab(advancedTab);
}
// ****************************************************************************
// Method: QvisFTLEWindow::IntegrationTab
//
// Purpose:
// Populates the integration tab.
//
// Programmer: Dave Pugmire
// Creation: Tue Dec 29 14:37:53 EST 2009
//
// Modifications:
//
// ****************************************************************************
void
QvisFTLEWindow::CreateIntegrationTab(QWidget *pageIntegration)
{
QGridLayout *mainLayout = new QGridLayout(pageIntegration);
mainLayout->setMargin(5);
mainLayout->setSpacing(10);
// Create the source group box.
QGroupBox *sourceGroup = new QGroupBox(central);
......@@ -156,7 +190,6 @@ QvisFTLEWindow::CreateWindowContents()
sourceLayout->setMargin(5);
sourceLayout->setSpacing(10);
// Create the source type combo box.
sourceLayout->addWidget(new QLabel(tr("Source type"), sourceGroup), 0, 0);
sourceType = new QComboBox(sourceGroup);
......@@ -380,16 +413,90 @@ QvisFTLEWindow::CreateWindowContents()
connect(maxSteps, SIGNAL(returnPressed()),
this, SLOT(maxStepsProcessText()));
terminationLayout->addWidget(maxSteps, 2,1);
// ----------------------------------------------------------------------
// Parallel tab
// ----------------------------------------------------------------------
QWidget *advancedTab = new QWidget(central);
propertyTabs->addTab(advancedTab, tr("Advanced"));
CreateAdvancedTab(advancedTab);
}
// ****************************************************************************
// Method: QvisFTLEWindow::CreateAdvancedTab
//
// Purpose:
// Populates the appearance tab.
//
// Programmer: Dave Pugmire
// Creation: Tue Dec 29 14:37:53 EST 2009
//
// Modifications:
//
// ****************************************************************************
void
QvisFTLEWindow::CreateAppearanceTab(QWidget *pageAppearance)
{
QGridLayout *mainLayout = new QGridLayout(pageAppearance);
mainLayout->setMargin(5);
mainLayout->setSpacing(10);
// Streamlines/Pathline Group.
QGroupBox *icGrp = new QGroupBox(pageAppearance);
icGrp->setTitle(tr("Streamlines vs Pathlines"));
mainLayout->addWidget(icGrp, 1, 0);
QGridLayout *icGrpLayout = new QGridLayout(icGrp);
icGrpLayout->setSpacing(10);
icGrpLayout->setColumnStretch(1,10);
icButtonGroup = new QButtonGroup(icGrp);
QRadioButton *streamlineButton = new QRadioButton(tr("Streamline\n Compute trajectories in an (instantaneous) snapshot of the vector field.\n Uses and loads vector data from only the current time slice."), icGrp);
QRadioButton *pathlineButton = new QRadioButton(tr("Pathline \n Compute trajectories in the time-varying vector field.\n Uses and loads vector data from all relevant time slices."), icGrp);
streamlineButton->setChecked(true);
icButtonGroup->addButton(streamlineButton, 0);
icButtonGroup->addButton(pathlineButton, 1);
icGrpLayout->addWidget(streamlineButton, 1, 0);
icGrpLayout->addWidget(pathlineButton, 2, 0);
connect(icButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(icButtonGroupChanged(int)));
// Pathline Options
QGroupBox *pathlineOptionsGrp = new QGroupBox(icGrp);
pathlineOptionsGrp->setTitle(tr("Pathlines Options"));
icGrpLayout->addWidget(pathlineOptionsGrp, 3, 0);
QGridLayout *pathlineOptionsGrpLayout = new QGridLayout(pathlineOptionsGrp);
pathlineOptionsGrpLayout->setSpacing(10);
pathlineOptionsGrpLayout->setColumnStretch(1,10);
pathlineOverrideStartingTimeFlag = new QCheckBox(tr("Override Starting Time"), pathlineOptionsGrp);
connect(pathlineOverrideStartingTimeFlag, SIGNAL(toggled(bool)),
this, SLOT(pathlineOverrideStartingTimeFlagChanged(bool)));
pathlineOptionsGrpLayout->addWidget(pathlineOverrideStartingTimeFlag, 1, 0);
QLabel *pathlineOverrideStartingTimeLabel = new QLabel(tr("Time"), pathlineOptionsGrp);
pathlineOverrideStartingTimeLabel->setAlignment(Qt::AlignRight | Qt::AlignCenter);
pathlineOptionsGrpLayout->addWidget(pathlineOverrideStartingTimeLabel, 1, 1);
pathlineOverrideStartingTime = new QLineEdit(pathlineOptionsGrp);
connect(pathlineOverrideStartingTime, SIGNAL(returnPressed()),
this, SLOT(pathlineOverrideStartingTimeProcessText()));
pathlineOptionsGrpLayout->addWidget(pathlineOverrideStartingTime, 1, 2);
QGroupBox *cmfeOptionsGrp = new QGroupBox(pathlineOptionsGrp);
cmfeOptionsGrp->setTitle(tr("How to perform interpolation over time"));
pathlineOptionsGrpLayout->addWidget(cmfeOptionsGrp, 2, 0);
QGridLayout *cmfeOptionsGrpLayout = new QGridLayout(cmfeOptionsGrp);
cmfeOptionsGrpLayout->setSpacing(10);
cmfeOptionsGrpLayout->setColumnStretch(1,10);
pathlineCMFEButtonGroup = new QButtonGroup(cmfeOptionsGrp);
QRadioButton *connButton = new QRadioButton(tr("Mesh is static over time (fast, but special purpose)"), cmfeOptionsGrp);
QRadioButton *posButton = new QRadioButton(tr("Mesh changes over time (slow, but robust)"), cmfeOptionsGrp);
posButton->setChecked(true);
pathlineCMFEButtonGroup->addButton(connButton, 0);
pathlineCMFEButtonGroup->addButton(posButton, 1);
cmfeOptionsGrpLayout->addWidget(connButton, 2, 0);
cmfeOptionsGrpLayout->addWidget(posButton, 3, 0);
connect(pathlineCMFEButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(pathlineCMFEButtonGroupChanged(int)));
}
// ****************************************************************************
// Method: QvisFTLEWindow::CreateAdvancedTab
//
......@@ -416,14 +523,13 @@ void
QvisFTLEWindow::CreateAdvancedTab(QWidget *pageAdvanced)
{
int row = 0;
QGridLayout *advGLayout = new QGridLayout(pageAdvanced);
advGLayout->setMargin(5);
advGLayout->setSpacing(5);
QGridLayout *mainLayout = new QGridLayout(pageAdvanced);
mainLayout->setMargin(5);
mainLayout->setSpacing(5);
QGroupBox *algoGrp = new QGroupBox(pageAdvanced);
algoGrp->setTitle(tr("Parallel integration options"));
//advGLayout->addWidget(algoGrp, 0, 0, 1, 4);
advGLayout->addWidget(algoGrp, 0, 0);
mainLayout->addWidget(algoGrp, 0, 0);
// Algorithm group.
QGridLayout *algoGLayout = new QGridLayout(algoGrp);
......@@ -468,72 +574,10 @@ QvisFTLEWindow::CreateAdvancedTab(QWidget *pageAdvanced)
algoGLayout->addWidget( workGroupSizeLabel, 4,0);
algoGLayout->addWidget( workGroupSize, 4,1);
// Pathline Advance Group.
QGroupBox *icGrp = new QGroupBox(pageAdvanced);
icGrp->setTitle(tr("Streamlines vs Pathlines"));
//advGLayout->addWidget(icGrp, 1, 0, 1, 4);
advGLayout->addWidget(icGrp, 1, 0);
QGridLayout *icGrpLayout = new QGridLayout(icGrp);
icGrpLayout->setSpacing(10);
icGrpLayout->setColumnStretch(1,10);
icButtonGroup = new QButtonGroup(icGrp);
QRadioButton *streamlineButton = new QRadioButton(tr("Streamline\n Compute trajectories in an (instantaneous) snapshot of the vector field.\n Uses and loads vector data from only the current time slice."), icGrp);
QRadioButton *pathlineButton = new QRadioButton(tr("Pathline \n Compute trajectories in the time-varying vector field.\n Uses and loads vector data from all relevant time slices."), icGrp);
streamlineButton->setChecked(true);
icButtonGroup->addButton(streamlineButton, 0);
icButtonGroup->addButton(pathlineButton, 1);
icGrpLayout->addWidget(streamlineButton, 1, 0);
icGrpLayout->addWidget(pathlineButton, 2, 0);
connect(icButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(icButtonGroupChanged(int)));
// Pathline Options
QGroupBox *pathlineOptionsGrp = new QGroupBox(icGrp);
pathlineOptionsGrp->setTitle(tr("Pathlines Options"));
icGrpLayout->addWidget(pathlineOptionsGrp, 3, 0);
QGridLayout *pathlineOptionsGrpLayout = new QGridLayout(pathlineOptionsGrp);
pathlineOptionsGrpLayout->setSpacing(10);
pathlineOptionsGrpLayout->setColumnStretch(1,10);
pathlineOverrideStartingTimeFlag = new QCheckBox(tr("Override Starting Time"), pathlineOptionsGrp);
connect(pathlineOverrideStartingTimeFlag, SIGNAL(toggled(bool)),
this, SLOT(pathlineOverrideStartingTimeFlagChanged(bool)));
pathlineOptionsGrpLayout->addWidget(pathlineOverrideStartingTimeFlag, 1, 0);
QLabel *pathlineOverrideStartingTimeLabel = new QLabel(tr("Time"), pathlineOptionsGrp);
pathlineOverrideStartingTimeLabel->setAlignment(Qt::AlignRight | Qt::AlignCenter);
pathlineOptionsGrpLayout->addWidget(pathlineOverrideStartingTimeLabel, 1, 1);
pathlineOverrideStartingTime = new QLineEdit(pathlineOptionsGrp);
connect(pathlineOverrideStartingTime, SIGNAL(returnPressed()),
this, SLOT(pathlineOverrideStartingTimeProcessText()));
pathlineOptionsGrpLayout->addWidget(pathlineOverrideStartingTime, 1, 2);
QGroupBox *cmfeOptionsGrp = new QGroupBox(pathlineOptionsGrp);
cmfeOptionsGrp->setTitle(tr("How to perform interpolation over time"));
pathlineOptionsGrpLayout->addWidget(cmfeOptionsGrp, 2, 0);
QGridLayout *cmfeOptionsGrpLayout = new QGridLayout(cmfeOptionsGrp);
cmfeOptionsGrpLayout->setSpacing(10);
cmfeOptionsGrpLayout->setColumnStretch(1,10);
pathlineCMFEButtonGroup = new QButtonGroup(cmfeOptionsGrp);
QRadioButton *connButton = new QRadioButton(tr("Mesh is static over time (fast, but special purpose)"), cmfeOptionsGrp);
QRadioButton *posButton = new QRadioButton(tr("Mesh changes over time (slow, but robust)"), cmfeOptionsGrp);
posButton->setChecked(true);
pathlineCMFEButtonGroup->addButton(connButton, 0);
pathlineCMFEButtonGroup->addButton(posButton, 1);
cmfeOptionsGrpLayout->addWidget(connButton, 2, 0);
cmfeOptionsGrpLayout->addWidget(posButton, 3, 0);
connect(pathlineCMFEButtonGroup, SIGNAL(buttonClicked(int)), this, SLOT(pathlineCMFEButtonGroupChanged(int)));
// Warnings group.
QGroupBox *warningsGrp = new QGroupBox(pageAdvanced);
warningsGrp->setTitle(tr("Warnings"));
//advGLayout->addWidget(warningsGrp, 2, 0, 1, 4);
advGLayout->addWidget(warningsGrp, 2, 0);
mainLayout->addWidget(warningsGrp, 1, 0);
QGridLayout *warningsGLayout = new QGridLayout(warningsGrp);
warningsGLayout->setSpacing(10);
......
......@@ -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})