Commit 8383a49c authored by hrchilds's avatar hrchilds

Update from August 12, 2003

git-svn-id: http://visit.ilight.com/svn/visit/trunk/src@56 18c085ea-50e0-402c-830e-de6fd14e8384
parent 331086ea
......@@ -246,6 +246,10 @@ class MakeMovie:
# Programmer: Brad Whitlock
# Date: Mon Jul 28 13:58:06 PST 2003
#
# Modifications:
# Brad Whitlock, Tue Aug 12 09:57:05 PDT 2003
# Added a note about Windows.
#
###########################################################################
def PrintUsage(self):
......@@ -255,35 +259,49 @@ class MakeMovie:
print "OPTIONS"
print " The following options are recognized by visit -movie"
print ""
print " -format fmt The format option allows you to set the output format"
print " for your movie. The supported values for fmt are:"
print " -format fmt The format option allows you to set the output"
print " format for your movie. The supported values "
print " for fmt are:"
print ""
print " mpeg : MPEG 2 movie."
print " qt : Quicktime movie."
print " sm : Streaming movie format (popular for powerwall demos)."
print " ppm : Save raw movie frames as individual PPM files."
print " tiff : Save raw movie frames as individual TIFF files."
print " jpeg : Save raw movie frames as individual JPEG files."
print " bmp : Save raw movie frames as individual BMP"
print " (Windows Bitmap) files."
print " rgb : Save raw movie frames as individual RGB"
print " (SGI format) files."
print " sm : Streaming movie format"
print " (popular for powerwall demos)."
print " ppm : Save raw movie frames as individual"
print " PPM files."
print " tiff : Save raw movie frames as individual"
print " TIFF files."
print " jpeg : Save raw movie frames as individual"
print " JPEG files."
print " bmp : Save raw movie frames as individual"
print " BMP (Windows Bitmap) files."
print " rgb : Save raw movie frames as individual"
print " RGB (SGI format) files."
print ""
print " *** Important Note ***"
print " The mpeg, qt, and sm formats are not supported"
print " on the Windows platform."
print ""
print " -geometry size The geometry option allows you to set the movie resolution."
print " The size argument is of the form WxH where W is the width of"
print " the image and H is the height of the image. For example, if"
print " you want an image that is 1024 pixels wide and 768 pixels"
print " tall, you would provide: -geometry 1024x768."
print " -geometry size The geometry option allows you to set the movie"
print " resolution. The size argument is of the form"
print " WxH where W is the width of the image and H is"
print " the height of the image. For example, if you "
print " want an image that is 1024 pixels wide and 768"
print " pixels tall, you would provide:"
print " -geometry 1024x768."
print ""
print " -sessionfile name The sessionfile option lets you pick the name of the VisIt"
print " session to use as input for your movie. The VisIt session "
print " is a file that describes the movie that you want to make "
print " and it is created when you save your session from within "
print " VisIt's GUI after you set up your plots how you want them."
print " -sessionfile name The sessionfile option lets you pick the name"
print " of the VisIt session to use as input for your"
print " movie. The VisIt session is a file that describes"
print " the movie that you want to make and it is created"
print " when you save your session from within VisIt's "
print " GUI after you set up your plots how you want them."
print ""
print " -framestep step The number of frames to advance when going to the next frame."
print " -framestep step The number of frames to advance when going to "
print " the next frame."
print ""
print " -output moviename The output option lets you set the name of your movie."
print " -output moviename The output option lets you set the name of "
print " your movie."
print ""
###########################################################################
......@@ -308,6 +326,10 @@ class MakeMovie:
# Programmer: Brad Whitlock
# Date: Mon Jul 28 13:58:06 PST 2003
#
# Modifications:
# Brad Whitlock, Tue Aug 12 09:57:31 PDT 2003
# Prevented use of mpeg, qt, and sm on Windows.
#
###########################################################################
def ProcessArguments(self):
......@@ -317,14 +339,26 @@ class MakeMovie:
if((i+1) < len(sys.argv)):
format = sys.argv[i+1]
if(format == "mpeg"):
self.movieFormat = self.MPEG_MOVIE
self.outputFormat = self.OUTPUT_PPM
if(sys.platform != "win32"):
self.movieFormat = self.MPEG_MOVIE
self.outputFormat = self.OUTPUT_PPM
else:
self.PrintUsage();
sys.exit(-1)
elif(format == "qt"):
self.movieFormat = self.QUICKTIME_MOVIE
self.outputFormat = self.OUTPUT_TIFF
if(sys.platform != "win32"):
self.movieFormat = self.QUICKTIME_MOVIE
self.outputFormat = self.OUTPUT_TIFF
else:
self.PrintUsage();
sys.exit(-1)
elif(format == "sm"):
self.movieFormat = self.STREAMING_MOVIE
self.outputFormat = self.OUTPUT_TIFF
if(sys.platform != "win32"):
self.movieFormat = self.STREAMING_MOVIE
self.outputFormat = self.OUTPUT_TIFF
else:
self.PrintUsage();
sys.exit(-1)
elif(format == "ppm"):
self.movieFormat = self.JUST_FRAMES_MOVIE
self.outputFormat = self.OUTPUT_PPM
......@@ -523,6 +557,10 @@ class MakeMovie:
# Programmer: Brad Whitlock
# Date: Mon Jul 28 13:58:06 PST 2003
#
# Modifications:
# Brad Whitlock, Tue Aug 12 09:37:37 PDT 2003
# Passed the desired version to mpeg_encode.
#
###########################################################################
def EncodeMPEGMovie(self):
......@@ -560,7 +598,7 @@ class MakeMovie:
f.close();
# Create the movie
command = "visit -mpeg_encode %s" % paramFile
command = "visit -v %s -mpeg_encode %s" % (Version(), paramFile)
r = os.system(command)
# Remove the param file.
......
......@@ -45,7 +45,7 @@ static const char usage[] =
/*
* Prototypes
*/
char *AddEnvironment(void);
char *AddEnvironment(int);
void AddPath(char *, const char *);
/******************************************************************************
......@@ -77,6 +77,9 @@ void AddPath(char *, const char *);
* Brad Whitlock, Wed May 7 09:49:59 PDT 2003
* I added the vcl component.
*
* Brad Whitlock, Tue Aug 12 09:41:07 PDT 2003
* I added some support for movie making.
*
*****************************************************************************/
int
......@@ -85,6 +88,7 @@ main(int argc, char *argv[])
int nComponentArgs = 0;
char *componentArgs[100], *command, *printCommand, *visitpath, *cptr, *cptr2;
int i, size = 0, retval = 0, printRunInfo = 1, skipping = 0;
int addMovieArguments = 0, useShortFileName = 0;
/*
* Default values.
......@@ -131,6 +135,19 @@ main(int argc, char *argv[])
{
strcpy(component, "vcl");
}
else if(ARG("-movie"))
{
strcpy(component, "cli");
addMovieArguments = 1;
useShortFileName = 1;
}
else if(ARG("-mpeg_encode"))
{
fprintf(stderr, "The mpeg_encode component is not supported "
"on Windows! You can only generate sequences "
"of still images.\n");
return -1;
}
else if(ARG("-v"))
{
/* Skip the next argument too. */
......@@ -145,19 +162,36 @@ main(int argc, char *argv[])
/*
* Add some stuff to the environment.
*/
visitpath = AddEnvironment();
visitpath = AddEnvironment(useShortFileName);
/*
* Create a command to execute
* Figure out the length of the command string.
*/
size = strlen(visitpath) + strlen(component) + 4;
for(i = 0; i < nComponentArgs; ++i)
size += (strlen(componentArgs[i]) + 1);
if(addMovieArguments)
{
size += strlen("-s") + 1;
size += 1 + strlen(visitpath) + 1 + strlen("makemovie.py") + 2;
size += strlen("-nowin") + 1;
}
/*
* Create the command to execute and the string that we print.
*/
command = (char *)malloc(size);
printCommand = (char *)malloc(size);
sprintf(command, "\"%s\\%s\"", visitpath, component);
sprintf(printCommand, "\"%s\\%s\"", visitpath, component);
if(useShortFileName)
{
sprintf(command, "%s\\%s", visitpath, component);
sprintf(printCommand, "%s\\%s", visitpath, component);
}
else
{
sprintf(command, "\"%s\\%s\"", visitpath, component);
sprintf(printCommand, "\"%s\\%s\"", visitpath, component);
}
cptr = command + strlen(command);
cptr2 = printCommand + strlen(printCommand);
for(i = 0; i < nComponentArgs; ++i)
......@@ -174,6 +208,11 @@ main(int argc, char *argv[])
cptr2 += (strlen(componentArgs[i]) + 1);
}
}
if(addMovieArguments)
{
sprintf(cptr, " -s \"%s\\makemovie.py\" -nowin", visitpath);
sprintf(cptr2, " -s \"%s\\makemovie.py\" -nowin", visitpath);
}
command[size-1] = '\0';
printCommand[size-1] = '\0';
......@@ -269,10 +308,15 @@ ReadKey(const char *key, char **keyval)
* Brad Whitlock, Wed Apr 23 09:28:44 PDT 2003
* I added VISITSYSTEMCONFIG to the environment.
*
* Brad Whitlock, Tue Aug 12 10:47:16 PDT 2003
* I added an option that lets us return VisIt's path as the short system
* name version of the path so we can effectively do visit -movie from
* the command line.
*
*****************************************************************************/
char *
AddEnvironment(void)
AddEnvironment(int useShortFileName)
{
char *tmp, *visitpath = 0, *ssh = 0, *sshargs = 0, *visitsystemconfig = 0;
int haveVISITHOME = 0, haveSSH = 0, haveSSHARGS = 0,
......@@ -294,6 +338,15 @@ AddEnvironment(void)
strcpy(visitpath, defaultVisItPath);
}
/* Turn the long VisIt path into the shortened system path. */
if(useShortFileName)
{
char *vp2 = (char *)malloc(512);
GetShortPathName(visitpath, vp2, 512);
free(visitpath);
visitpath = vp2;
}
tmp = (char *)malloc(10000);
/* Add VisIt's home directory to the path */
......
......@@ -55,6 +55,7 @@ hyper=false
gps=true
riptide=true
frost=true
pengra=true
dist=undefined
......@@ -73,6 +74,7 @@ do
gps=false
riptide=false
frost=false
pengra=false
shift
;;
-kickit)
......@@ -123,6 +125,14 @@ do
frost=true
shift
;;
-pengra)
pengra=false
shift
;;
+pengra)
pengra=true
shift
;;
-d)
dist=$2
shift 2
......@@ -412,10 +422,53 @@ then
fi
fi
#
# Build on pengra.
#
rm -f pengra
cat <<EOF > pengra
#!/bin/sh
if test ! -d /usr/tmp/$user ; then
mkdir /usr/tmp/$user
fi
if test ! -d /usr/tmp/$user/pengra ; then
mkdir /usr/tmp/$user/pengra
fi
rm -rf /usr/tmp/$user/pengra/visitbuild
mkdir /usr/tmp/$user/pengra/visitbuild
mv pengra_$dist.tar.gz /usr/tmp/$user/pengra/visitbuild/$dist.tar.gz
cd /usr/tmp/$user/pengra/visitbuild
gunzip -c $dist.tar.gz | tar xvf - > buildlog 2>&1
cd $dist
ver=\`cat VERSION\`
ver2=\`echo \$ver | tr "." "_"\`
env CXXFLAGS=-O2 ./configure --enable-parallel >> ../buildlog 2>&1
make -j 3 >> ../buildlog 2>&1
clearcase_bin/visit-bin-dist >> ../buildlog 2>&1
mv visit\$ver2.linux.tar.gz ..
cd ..
rm -f resultlog
echo " build of visit on pengra" > resultlog 2>&1
echo " --------------------------" >> resultlog 2>&1
echo "" >> resultlog 2>&1
ls -l >> resultlog 2>&1
mail $emailName < resultlog
EOF
if [ $pengra = true ]
then
if [ $test = no ]
then
scp1 pengra pengra0:pengra_buildit
scp1 $dist.tar.gz pengra0:pengra_$dist.tar.gz
ssh1 pengra0 "chmod 750 pengra_buildit;./pengra_buildit" &
fi
fi
#
# Clean up.
#
if [ $test = no ]
then
rm -f kickit sunspot hyper gps riptide frost
rm -f kickit sunspot hyper gps riptide frost pengra
fi
......@@ -16,7 +16,7 @@
<Field name="id" type="stringVector">Streamline_1.0 </Field>
<Field name="enabled" type="intVector">0 </Field>
</Object>
<Object name="HostProfileList" childObjects="15">
<Object name="HostProfileList" childObjects="17">
<Object name="HostProfile" childObjects="0">
<Field name="profileName" type="string">serial</Field>
<Field name="host" type="string">blue.llnl.gov</Field>
......@@ -321,7 +321,7 @@
<Field name="launchMethod" type="string">prun</Field>
<Field name="forceStatic" type="bool">true</Field>
<Field name="forceDynamic" type="bool">false</Field>
<Field name="active" type="bool">true</Field>
<Field name="active" type="bool">false</Field>
<Field name="arguments" type="stringVector">-dir /usr/gapps/visit</Field>
<Field name="parallel" type="bool">true</Field>
</Object>
......@@ -334,7 +334,7 @@
<Field name="numNodesSet" type="bool">true</Field>
<Field name="numNodes" type="int">2</Field>
<Field name="partitionSet" type="bool">true</Field>
<Field name="partition" type="string">pdebug</Field>
<Field name="partition" type="string">pengra,pbatch</Field>
<Field name="bankSet" type="bool">true</Field>
<Field name="bank" type="string">bdivp</Field>
<Field name="timeLimitSet" type="bool">false</Field>
......@@ -343,7 +343,51 @@
<Field name="launchMethod" type="string">psub/prun</Field>
<Field name="forceStatic" type="bool">true</Field>
<Field name="forceDynamic" type="bool">false</Field>
<Field name="active" type="bool">false</Field>
<Field name="arguments" type="stringVector">-dir /usr/gapps/visit</Field>
<Field name="parallel" type="bool">true</Field>
</Object>
<Object name="HostProfile" childObjects="0">
<Field name="profileName" type="string">serial</Field>
<Field name="host" type="string">pvc.llnl.gov</Field>
<Field name="hostAliases" type="string">pvc?.llnl.gov pvc??.llnl.gov pvc? pvc?? pvc???</Field>
<Field name="timeout" type="int">240</Field>
<Field name="numProcessors" type="int">1</Field>
<Field name="numNodesSet" type="bool">false</Field>
<Field name="numNodes" type="int">1</Field>
<Field name="partitionSet" type="bool">false</Field>
<Field name="partition" type="string"></Field>
<Field name="bankSet" type="bool">false</Field>
<Field name="bank" type="string"></Field>
<Field name="timeLimitSet" type="bool">false</Field>
<Field name="timeLimit" type="string"></Field>
<Field name="launchMethodSet" type="bool">false</Field>
<Field name="launchMethod" type="string"></Field>
<Field name="forceStatic" type="bool">true</Field>
<Field name="forceDynamic" type="bool">false</Field>
<Field name="active" type="bool">true</Field>
<Field name="arguments" type="stringVector">-dir /usr/gapps/visit </Field>
<Field name="parallel" type="bool">false</Field>
</Object>
<Object name="HostProfile" childObjects="0">
<Field name="profileName" type="string">parallel pbatch</Field>
<Field name="host" type="string">pvc.llnl.gov</Field>
<Field name="hostAliases" type="string">pvc?.llnl.gov pvc??.llnl.gov pvc? pvc?? pvc???</Field>
<Field name="timeout" type="int">240</Field>
<Field name="numProcessors" type="int">4</Field>
<Field name="numNodesSet" type="bool">true</Field>
<Field name="numNodes" type="int">2</Field>
<Field name="partitionSet" type="bool">true</Field>
<Field name="partition" type="string">pbatch</Field>
<Field name="bankSet" type="bool">true</Field>
<Field name="bank" type="string">bdivp</Field>
<Field name="timeLimitSet" type="bool">false</Field>
<Field name="timeLimit" type="string"></Field>
<Field name="launchMethodSet" type="bool">true</Field>
<Field name="launchMethod" type="string">psub/prun</Field>
<Field name="forceStatic" type="bool">true</Field>
<Field name="forceDynamic" type="bool">false</Field>
<Field name="active" type="bool">false</Field>
<Field name="arguments" type="stringVector">-dir /usr/gapps/visit</Field>
<Field name="parallel" type="bool">true</Field>
</Object>
......
......@@ -396,7 +396,8 @@ if [ $pengra = true ]
then
if [ $test = no ]
then
scp visit$ver2.linux.tar.gz gps15:
scp1 pengra0:/usr/tmp/brugger/pengra/visitbuild/visit$ver2.linux.tar.gz visit$ver2.linux_chaos.tar.gz
scp visit$ver2.linux_chaos.tar.gz gps15:visit$ver2.linux.tar.gz
scp visit-install gps15:
scp pengra gps15:pengra_install
ssh gps15 "chmod 750 pengra_install;./pengra_install"
......
......@@ -82,6 +82,9 @@
# Eric Brugger, Thu Jul 3 17:15:39 PDT 2003
# Make the building of the BOV reader required.
#
# Hank Childs, Mon Aug 11 15:51:54 PDT 2003
# Add PLOT2D.
#
##############################################################################
@SET_MAKE@
......@@ -96,7 +99,7 @@ MILI=Mili
PDB=KullLite PDB
SAF=SAF
SAMPLES=Rect Hex
REQUIRED=BOV Curve2D EnSight Lines PLOT3D Point3D STL Silo Spheral VTK WavefrontOBJ
REQUIRED=BOV Curve2D EnSight Lines PLOT2D PLOT3D Point3D STL Silo Spheral VTK WavefrontOBJ
OPTIONAL=
......
<?xml version="1.0"?>
<Plugin name="PLOT2D" label="PLOT2D" type="database" dbtype="STSD" version="1.0">
<Extensions> p2d </Extensions>
</Plugin>
#include <PLOT2DPluginInfo.h>
#include <avtPLOT2DFileFormat.h>
#include <avtSTSDFileFormatInterface.h>
#include <avtGenericDatabase.h>
// ****************************************************************************
// Method: PLOT2DCommonPluginInfo::GetDatabaseType
//
// Purpose:
// Returns the type of a PLOT2D database.
//
// Programmer: childs -- generated by xml2info
// Creation: Mon Aug 11 15:53:41 PST 2003
//
// ****************************************************************************
DatabaseType
PLOT2DCommonPluginInfo::GetDatabaseType()
{
return DB_TYPE_STSD;
}
// ****************************************************************************
// Method: PLOT2DCommonPluginInfo::GetDefaultExtensions
//
// Purpose:
// Returns the default extensions for a PLOT2D database.
//
// Programmer: childs -- generated by xml2info
// Creation: Mon Aug 11 15:53:41 PST 2003
//
// ****************************************************************************
std::vector<std::string>
PLOT2DCommonPluginInfo::GetDefaultExtensions()
{
std::vector<std::string> defaultExtensions;
defaultExtensions.push_back("p2d");
return defaultExtensions;
}
// ****************************************************************************
// Method: PLOT2DCommonPluginInfo::SetUpPLOT2DDatabase
//
// Purpose:
// Sets up a PLOT2D database.
//
// Arguments:
// list A list of file names.
// nList The number of timesteps in list.
// nBlocks The number of blocks in the list.
//
// Returns: A PLOT2D database from list.
//
// Programmer: childs -- generated by xml2info
// Creation: Mon Aug 11 15:53:41 PST 2003
//
// ****************************************************************************
avtDatabase *
PLOT2DCommonPluginInfo::SetupDatabase(const char *const *list,
int nList, int nBlock)
{
avtSTSDFileFormat ***ffl = new avtSTSDFileFormat**[nList];
int nTimestep = nList / nBlock;
for (int i = 0 ; i < nTimestep ; i++)
{
ffl[i] = new avtSTSDFileFormat*[nBlock];
for (int j = 0 ; j < nBlock ; j++)
{
ffl[i][j] = new avtPLOT2DFileFormat(list[i*nBlock + j]);
}
}
avtSTSDFileFormatInterface *inter
= new avtSTSDFileFormatInterface(ffl, nTimestep, nBlock);
return new avtGenericDatabase(inter);
}
#include <PLOT2DPluginInfo.h>
// ****************************************************************************
// Function: GetEngineInfo
//
// Purpose:
// Return a new EnginePluginInfo for the PLOT2D database.
//
// Programmer: childs -- generated by xml2info
// Creation: Mon Aug 11 15:53:41 PST 2003
//
// ****************************************************************************
extern "C" EngineDatabasePluginInfo* GetEngineInfo()
{
return new PLOT2DEnginePluginInfo;
}
// this makes compilers happy... remove if we ever have functions here
void PLOT2DEnginePluginInfo::dummy()
{
}
#include <PLOT2DPluginInfo.h>
// ****************************************************************************
// Function: GetMDServerInfo
//
// Purpose:
// Return a new MDServerPluginInfo for the PLOT2D database.
//
// Programmer: childs -- generated by xml2info
// Creation: Mon Aug 11 15:53:41 PST 2003
//
// ****************************************************************************
extern "C" MDServerDatabasePluginInfo* GetMDServerInfo()
{
return new PLOT2DMDServerPluginInfo;
}
// this makes compilers happy... remove if we ever have functions here
void PLOT2DMDServerPluginInfo::dummy()
{
}
// ************************************************************************* //
// File: PLOT2DPluginInfo.C
// ************************************************************************* //
#include <PLOT2DPluginInfo.h>
// ****************************************************************************
// Function: GetGeneralInfo
//
// Purpose:
// Return a new GeneralPluginInfo for the PLOT2D database.
//
// Programmer: childs -- generated by xml2info
// Creation: Mon Aug 11 15:53:41 PST 2003
//
// ****************************************************************************
extern "C" GeneralDatabasePluginInfo* GetGeneralInfo()
{
return new PLOT2DGeneralPluginInfo;
}
// ****************************************************************************
// Method: PLOT2DGeneralPluginInfo::GetName
//
// Purpose:
// Return the name of the database plugin.
//
// Returns: A pointer to the name of the database plugin.
//
// Programmer: childs -- generated by xml2info
// Creation: Mon Aug 11 15:53:41 PST 2003
//
// ****************************************************************************
char *
PLOT2DGeneralPluginInfo::GetName() const
{
return "PLOT2D";
}
// ****************************************************************************
// Method: PLOT2DGeneralPluginInfo::GetVersion
//
// Purpose:
// Return the version of the database plugin.
//
// Returns: A pointer to the version of the database plugin.
//
// Programmer: childs -- generated by xml2info
// Creation: Mon Aug 11 15:53:41 PST 2003
//
// ****************************************************************************
char *
PLOT2DGeneralPluginInfo::GetVersion() const
{
return "1.0";
}
// ****************************************************************************
// Method: PLOT2DGeneralPluginInfo::GetID
//
// Purpose:
// Return the id of the database plugin.
//
// Returns: A pointer to the id of the database plugin.
//
// Programmer: childs -- generated by xml2info
// Creation: Mon Aug 11 15:53:41 PST 2003
//
// ****************************************************************************
char *
PLOT2DGeneralPluginInfo::GetID() const
{
return "PLOT2D_1.0";
}
// ****************************************************************************
// PLOT2DPluginInfo.h
// ****************************************************************************
#ifndef PLOT2D_PLUGIN_INFO_H
#define PLOT2D_PLUGIN_INFO_H
#include <DatabasePluginInfo.h>
#include <database_plugin_exports.h>
class avtDatabase;
// ****************************************************************************
// Class: PLOT2DDatabasePluginInfo
//
// Purpose:
// Classes that provide all the information about the PLOT2D plugin.
// Portions are separated into pieces relevant to the appropriate
// components of VisIt.
//
// Programmer: childs -- generated by xml2info
// Creation: Mon Aug 11 15:53:41 PST 2003
//
// Modifications:
//
// ****************************************************************************
class PLOT2DGeneralPluginInfo : public virtual GeneralDatabasePluginInfo
{
public:
virtual char *GetName() const;
virtual char *GetVersion() const;
virtual char *GetID() const;
};
class PLOT2DCommonPluginInfo : public virtual CommonDatabasePluginInfo, public virtual PLOT2DGeneralPluginInfo
{
public:
virtual DatabaseType GetDatabaseType();
virtual std::vector<std::string> GetDefaultExtensions();
virtual avtDatabase *SetupDatabase(const char * const *list,
int nList, int nBlock);
};
class PLOT2DMDServerPluginInfo : public virtual MDServerDatabasePluginInfo, public virtual PLOT2DCommonPluginInfo
{
public:
// this makes compilers happy... remove if we ever have functions here
virtual void dummy();
};
class PLOT2DEnginePluginInfo : public virtual EngineDatabasePluginInfo, public virtual PLOT2DCommonPluginInfo
{
public:
// this makes compilers happy... remove if we ever have functions here
virtual void dummy();
};
#endif