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
* 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) {
// 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 );
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
//
// 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);
+ }
+ for (int i=0; i<nbsmesh; i++) {
+ jobParameters->in_files[nbcmesh+i] = CORBA::string_dup(listSteelBarMesh[i].file_name);
}
- jobParameters->in_files[1+listSteelBarMesh.size()] = CORBA::string_dup(dataFilename);
+ 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());
#
# 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
#
-# 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")
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
time.sleep(0.5)
nbiter+=1
+
+#
+# =======================================================================
+# Submit the job and start the supervision
+# =======================================================================
#
# Start the execution of the job identified by its job id.
#