PADDER FIX: run with the plugin all the unit tests of the executable programs (SpherePadder).

This commit is contained in:
boulant 2012-11-26 08:26:46 +00:00
parent a6bc2b5a1c
commit ee5cb3d25c
4 changed files with 100 additions and 41 deletions

View File

@ -67,6 +67,21 @@ static bool myStartsWith(const std::string& text,const std::string& token){
return (text.compare(0, token.length(), token) == 0);
}
/*!
* This function returns true if the file exists on the local file
* system.
*/
#include <iostream>
#include <fstream>
static bool fexists(const char *filename)
{
std::ifstream ifile(filename);
if ((bool)ifile && ifile.good()) {
return true;
}
return false;
}
//
// ====================================================================
// Constructor/Destructor
@ -134,7 +149,16 @@ static std::string REMOTE_WORKDIR("/tmp/spadder.remote.workdir."+USER);
* input data (list of filenames and groupnames) and returns the path
* of the created file. This function is the one that knows the format
* of the padder input file. If the input file format changes, then
* this function (and only this one) should be updated.
* this function (and only this one) should be updated. The file
* format is the following ([] means that the variable is optional):
*
* [<concreteMeshFile> <concreteGroupName>]
* nbSteelBarMeshes <N>
* <steelBarMeshFile_1> <steelBarGroupName_1>
* <steelBarMeshFile_2> <steelBarGroupName_2>
* ...
* <steelBarMeshFile_N> <steelBarGroupName_N>
* <outputMedFile>
*/
const char * MeshJobManager_i::_writeDataFile(std::vector<MESHJOB::MeshJobParameter> listConcreteMesh,
std::vector<MESHJOB::MeshJobParameter> listSteelBarMesh) {
@ -147,27 +171,29 @@ const char * MeshJobManager_i::_writeDataFile(std::vector<MESHJOB::MeshJobParame
// Make it static so that it's allocated once (constant name)
static std::string * dataFilename = new std::string(LOCAL_INPUTDIR+"/"+DATAFILE);
std::ofstream dataFile(dataFilename->c_str());
// We first specify the concrete mesh data (filename and groupname)
// Note that we use here the basename of the files because the files
// are supposed to be copied in the REMOTE_WORKDIR for execution.
std::string line;
// We first specify the concrete mesh data (filename and groupname)
if ( listConcreteMesh.size() > 0 ) {
#ifdef WIN32
char fname[ _MAX_FNAME ];
_splitpath( listConcreteMesh[0].file_name, NULL, NULL, fname, NULL );
char* bname = &fname[0];
char fname[ _MAX_FNAME ];
_splitpath( listConcreteMesh[0].file_name, NULL, NULL, fname, NULL );
char* bname = &fname[0];
#else
char* bname = basename(listConcreteMesh[0].file_name);
char* bname = basename(listConcreteMesh[0].file_name);
#endif
line = std::string(bname) + " " + std::string(listConcreteMesh[0].group_name);
dataFile << line.c_str() << std::endl;
// Note that we use here the basename because the files are supposed
// to be copied in the REMOTE_WORKDIR for execution.
// The, we can specify the steelbar mesh data, starting by the
line = std::string(bname) + " " + std::string(listConcreteMesh[0].group_name);
dataFile << line.c_str() << std::endl;
}
// Then, we can specify the steelbar mesh data, starting by the
// number of meshes
int nbSteelBarMesh=listSteelBarMesh.size();
line = std::string("nbSteelbarMesh") + SEPARATOR + ToString(nbSteelBarMesh);
int nbSteelBarMeshes=listSteelBarMesh.size();
line = std::string("nbSteelBarMeshes") + SEPARATOR + ToString(nbSteelBarMeshes);
dataFile << line.c_str() << std::endl;
for (int i=0; i<nbSteelBarMesh; i++) {
for (int i=0; i<nbSteelBarMeshes; i++) {
#ifdef WIN32
char fname[ _MAX_FNAME ];
_splitpath( listSteelBarMesh[i].file_name, NULL, NULL, fname, NULL );
@ -252,9 +278,6 @@ CORBA::Long MeshJobManager_i::initialize(const MESHJOB::MeshJobParameterList & m
const char * configId)
{
beginService("MeshJobManager_i::initialize");
std::cerr << "##################################### initialize" << std::endl;
std::cerr << "#####################################" << std::endl;
//
// We first analyse the CORBA sequence to store data in C++ vectors
//
@ -350,24 +373,37 @@ CORBA::Long MeshJobManager_i::initialize(const MESHJOB::MeshJobParameterList & m
// We specify the input files that are required to execute the
// job_file. If basenames are specified, then the files are supposed
// to be located in local_directory.
int nbFiles = listSteelBarMesh.size()+2;
int nbcmesh = listConcreteMesh.size();
int nbsmesh = listSteelBarMesh.size();
int nbFiles = nbsmesh+nbcmesh+1;
// The number of input file is:
// (nb. of steelbar meshfile)
// + (1 concrete meshfile)
// + (1 or 0 concrete meshfile)
// + (1 padder input file)
// = nb steelbar meshfile + 2
jobParameters->in_files.length(nbFiles);
jobParameters->in_files[0] = CORBA::string_dup(listConcreteMesh[0].file_name);
for (int i=0; i<listSteelBarMesh.size(); i++) {
jobParameters->in_files[1+i] = CORBA::string_dup(listSteelBarMesh[i].file_name);
for (int i=0; i<nbcmesh; i++) {
jobParameters->in_files[i] = CORBA::string_dup(listConcreteMesh[i].file_name);
}
jobParameters->in_files[1+listSteelBarMesh.size()] = CORBA::string_dup(dataFilename);
for (int i=0; i<nbsmesh; i++) {
jobParameters->in_files[nbcmesh+i] = CORBA::string_dup(listSteelBarMesh[i].file_name);
}
jobParameters->in_files[nbcmesh+nbsmesh] = CORBA::string_dup(dataFilename);
// Note that all these input files will be copied in the
// REMOTE_WORKDIR on the remote host
// Then, we have to specify the existance of an output
// filenames. The path is supposed to be a path on the remote
// resource, i.e. where the job is executed.
// REMOTE_WORKDIR on the remote host. At this step, they should
// all exist, so we can check their presence on the local
// filesystem.
for (int i=0; i<nbFiles; i++) {
if ( fexists(jobParameters->in_files[i]) != true ) {
_lastErrorMessage = std::string("The input file ") + std::string(jobParameters->in_files[i]);
_lastErrorMessage+= std::string(" does not exists. Can't initialize the job");
LOG(_lastErrorMessage);
return JOBID_UNDEFINED;
}
}
// Then, we have to specify the existance of an output filename. The
// path is supposed to be a path on the remote resource, i.e. where
// the job is executed.
jobParameters->out_files.length(1);
std::string outputfile_name = std::string(jobPaths->remote_workdir)+"/"+OUTPUTFILE;
jobParameters->out_files[0] = CORBA::string_dup(outputfile_name.c_str());

View File

@ -312,8 +312,8 @@ class InputDialog(GenericDialog):
This function checks if the data are valid, from the dialog
window point of view.
"""
if self.__nbConcreteMesh < 1:
self.checkDataMessage = "You must define at least one CONCRETE mesh"
if self.__nbConcreteMesh == 0 and self.__nbSteelbarMesh == 0:
self.checkDataMessage = "You must define at least one mesh (CONCRETE or STEELBAR)"
return False
if self.__nbConcreteMesh > 1:
self.checkDataMessage = "You define multiple CONCRETE meshes."
@ -321,9 +321,7 @@ class InputDialog(GenericDialog):
# just warn the user, but don't block
QMessageBox.information(self, "Info", self.checkDataMessage)
return True
if self.__nbSteelbarMesh < 1:
self.checkDataMessage = "You must define at least one STEELBAR mesh"
return False
return True

View File

@ -33,3 +33,9 @@ envpath = /usr/local/share/envPadder.sh
resname = nepal@nepal
binpath = /usr/local/bin/padder.exe
envpath = /usr/local/share/envPadder.sh
[devel]
resname = localhost
binpath = /opt/programs/padder/subversion/trunk/padder.exe
envpath = /opt/programs/padder/subversion/trunk/padder.env

View File

@ -21,10 +21,13 @@
#
# This script illustrates the standard use case of the component
# MeshJobManager from within a SALOME script.
# MeshJobManager from within a SALOME script. It could be used as a
# unit test of the component.
#
# =======================================================================
# Preparing the configuration parameters
# =======================================================================
#
import sys
import os
@ -58,8 +61,16 @@ component.configure(configId,config)
#
# Prepare the job parameters and initialize the job
# =======================================================================
# Define several datasets for the different use cases
# =======================================================================
#
# We define several functions that create each a dataset of med files
# for testing the component. The test function number corresponds to
# the number of the test defined in the SpherePadder installation
# directory.
def test00_parameters():
"""Test using a concrete mesh and a single steelbar mesh"""
file_concrete=os.path.join(spadder.getTestDataDir(),"concrete.med")
@ -127,13 +138,16 @@ def test03_parameters():
return meshJobParameterList
#
# Choose here the use case
# =======================================================================
# Prepare the job parameters and initialize the job
# =======================================================================
#
# Choose here the use case
#meshJobParameterList = test00_parameters()
#meshJobParameterList = test01_parameters()
meshJobParameterList = test02_parameters()
#meshJobParameterList = test03_parameters()
#meshJobParameterList = test02_parameters()
meshJobParameterList = test03_parameters()
#
# Prepare, start and follow-up the job
@ -154,6 +168,11 @@ while not created:
time.sleep(0.5)
nbiter+=1
#
# =======================================================================
# Submit the job and start the supervision
# =======================================================================
#
# Start the execution of the job identified by its job id.
#