From 08e399c0fcb71dc93f691f30898023fddf2f25d5 Mon Sep 17 00:00:00 2001 From: Ovidiu Mircescu Date: Fri, 12 Aug 2016 15:52:40 +0200 Subject: [PATCH] Deal with the fact that MEDCoupling is now an extern tool. --- Examples/hxx1/CALCUL/src/CALCUL.cxx | 57 +++++++ Examples/hxx1/CALCUL/src/CALCUL.hxx | 21 +++ Examples/hxx1/CALCUL/src/CMakeLists.txt | 20 +++ Examples/hxx1/CALCUL/src/main.cxx | 11 ++ Examples/hxx1/ICOCO/src/CMakeLists.txt | 46 ++++++ Examples/hxx1/ICOCO/src/ICOCO.cxx | 202 ++++++++++++++++++++++++ Examples/hxx1/ICOCO/src/ICOCO.hxx | 40 +++++ Examples/hxx1/ICOCO/src/main.cxx | 11 ++ Examples/hxx1/Makefile | 2 +- Examples/hxx1/build.sh | 19 ++- Examples/hxx1/cpp_component.tgz | Bin 15824 -> 0 bytes module_generator/gener.py | 25 ++- module_generator/hxx_awk.py | 60 +++---- module_generator/hxx_para_tmpl.py | 2 +- module_generator/hxxparacompo.py | 12 +- 15 files changed, 480 insertions(+), 48 deletions(-) create mode 100644 Examples/hxx1/CALCUL/src/CALCUL.cxx create mode 100644 Examples/hxx1/CALCUL/src/CALCUL.hxx create mode 100644 Examples/hxx1/CALCUL/src/CMakeLists.txt create mode 100644 Examples/hxx1/CALCUL/src/main.cxx create mode 100644 Examples/hxx1/ICOCO/src/CMakeLists.txt create mode 100644 Examples/hxx1/ICOCO/src/ICOCO.cxx create mode 100644 Examples/hxx1/ICOCO/src/ICOCO.hxx create mode 100644 Examples/hxx1/ICOCO/src/main.cxx delete mode 100644 Examples/hxx1/cpp_component.tgz diff --git a/Examples/hxx1/CALCUL/src/CALCUL.cxx b/Examples/hxx1/CALCUL/src/CALCUL.cxx new file mode 100644 index 0000000..703a469 --- /dev/null +++ b/Examples/hxx1/CALCUL/src/CALCUL.cxx @@ -0,0 +1,57 @@ +#include "CALCUL.hxx" + +int CALCUL::add(int i1, int i2) +{ + return i1+i2; +} + +int CALCUL::mul(int i1, int i2) +{ + return i1*i2; +} + +double CALCUL::addi(double i1, double i2) +{ + return i1+i2; +} + +double CALCUL::multi(double i1, double i2) +{ + return i1*i2; +} + +double CALCUL::sqr(double i1) +{ + return i1*i1; +} + +double CALCUL::sqr2(double i1,double& result) +{ + result=i1*i1; + return result; +} + +void CALCUL::return_3_int(int n, int& f1, int& f2, int& f3) +{ + f1=n+1; + f2=n+2; + f3=n+3; +} + +unsigned CALCUL::fact(unsigned n) +{ + int factorielle=1; + for (unsigned i=n; i!=1; --i) + factorielle*=i; + return factorielle; +} + +bool CALCUL::And(bool i1, bool i2) +{ + return i1&&i2; +} + +bool CALCUL::Or(bool i1, bool i2) +{ + return i1||i2; +} diff --git a/Examples/hxx1/CALCUL/src/CALCUL.hxx b/Examples/hxx1/CALCUL/src/CALCUL.hxx new file mode 100644 index 0000000..42469f2 --- /dev/null +++ b/Examples/hxx1/CALCUL/src/CALCUL.hxx @@ -0,0 +1,21 @@ +#ifndef _CALCUL_HXX_ +#define _CALCUL_HXX_ + + +class CALCUL +{ +// Méthodes publiques +public: + int add(int i1, int i2); + int mul(int i1, int i2); + unsigned fact(unsigned n); + double addi(double i1, double i2); + double multi(double i1, double i2); + double sqr(double i1); + double sqr2(double i1,double& result); + void return_3_int(int n, int& f1, int& f2, int& f3); + bool And(bool i1, bool i2); + bool Or(bool i1, bool i2); +}; + +#endif diff --git a/Examples/hxx1/CALCUL/src/CMakeLists.txt b/Examples/hxx1/CALCUL/src/CMakeLists.txt new file mode 100644 index 0000000..c350410 --- /dev/null +++ b/Examples/hxx1/CALCUL/src/CMakeLists.txt @@ -0,0 +1,20 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.8.8 FATAL_ERROR) +PROJECT(CALCUL C CXX) + + +SET(BUILD_SHARED_LIBS TRUE) + +SET(_lib_HEADERS + CALCUL.hxx +) + +SET(_lib_SOURCES + CALCUL.cxx +) + +ADD_LIBRARY(CALCULCXX ${_lib_SOURCES}) +TARGET_LINK_LIBRARIES(CALCULCXX ) + +INSTALL(TARGETS CALCULCXX DESTINATION lib) +INSTALL(FILES ${_lib_HEADERS} DESTINATION include) + diff --git a/Examples/hxx1/CALCUL/src/main.cxx b/Examples/hxx1/CALCUL/src/main.cxx new file mode 100644 index 0000000..26e5c81 --- /dev/null +++ b/Examples/hxx1/CALCUL/src/main.cxx @@ -0,0 +1,11 @@ +#include "CALCUL.hxx" +#include + +using namespace std; +int main(int argc, char ** argv) +{ + if (getenv("SALOME_trace") == NULL ) + setenv("SALOME_trace","local",0); + CALCUL myCalc; + // test myCalc component ... +} diff --git a/Examples/hxx1/ICOCO/src/CMakeLists.txt b/Examples/hxx1/ICOCO/src/CMakeLists.txt new file mode 100644 index 0000000..2ca0a2f --- /dev/null +++ b/Examples/hxx1/ICOCO/src/CMakeLists.txt @@ -0,0 +1,46 @@ +CMAKE_MINIMUM_REQUIRED(VERSION 2.8.8 FATAL_ERROR) +PROJECT(MEDExample C CXX) + +# =================== +SET(CONFIGURATION_ROOT_DIR $ENV{CONFIGURATION_ROOT_DIR} CACHE PATH "Path to the Salome CMake configuration files") +IF(EXISTS ${CONFIGURATION_ROOT_DIR}) + LIST(APPEND CMAKE_MODULE_PATH "${CONFIGURATION_ROOT_DIR}/cmake") + INCLUDE(SalomeMacros) +ELSE() + MESSAGE(FATAL_ERROR "We absolutely need the Salome CMake configuration files, please define CONFIGURATION_ROOT_DIR !") +ENDIF() + +# Find MEDCoupling (required) +# ========================== +SET(MEDCOUPLING_ROOT_DIR $ENV{MEDCOUPLING_ROOT_DIR} CACHE PATH "Path to the MEDCoupling tool") +IF(EXISTS ${MEDCOUPLING_ROOT_DIR}) + LIST(APPEND CMAKE_MODULE_PATH "${MEDCOUPLING_ROOT_DIR}/cmake_files") + FIND_PACKAGE(SalomeMEDCoupling REQUIRED) # will reload HDF5, MEDFile, XDR, etc ... +ELSE(EXISTS ${MEDCOUPLING_ROOT_DIR}) + MESSAGE(FATAL_ERROR "We absolutely need the MEDCoupling tool, please define MEDCOUPLING_ROOT_DIR !") +ENDIF(EXISTS ${MEDCOUPLING_ROOT_DIR}) + +SET(BUILD_SHARED_LIBS TRUE) +INCLUDE_DIRECTORIES( + ${MEDCOUPLING_INCLUDE_DIRS} +) + +SET(_link_LIBRARIES + ${MEDCoupling_medcoupling} + ${MEDCoupling_interpkernel} +) + +SET(_lib_HEADERS + ICOCO.hxx +) + +SET(_lib_SOURCES + ICOCO.cxx +) + +ADD_LIBRARY(ICOCOCXX ${_lib_SOURCES}) +TARGET_LINK_LIBRARIES(ICOCOCXX ${_link_LIBRARIES} ) + +INSTALL(TARGETS ICOCOCXX DESTINATION lib) +INSTALL(FILES ${_lib_HEADERS} DESTINATION include) + diff --git a/Examples/hxx1/ICOCO/src/ICOCO.cxx b/Examples/hxx1/ICOCO/src/ICOCO.cxx new file mode 100644 index 0000000..a1dcaee --- /dev/null +++ b/Examples/hxx1/ICOCO/src/ICOCO.cxx @@ -0,0 +1,202 @@ +#include "ICOCO.hxx" + +#include "MEDCouplingUMesh.hxx" +#include "MEDCouplingMemArray.hxx" +#include "MEDCouplingFieldDouble.hxx" +#include +#include + +using namespace std; + +const char ICOCO::FIELD_NAME1[]="SourceField"; +const char ICOCO::FIELD_NAME2[]="TargetField"; + +ICOCO::ICOCO():_field_source(0),_field_target(0) +{ +} + +ICOCO::~ICOCO() +{ + if(_field_source) + _field_source->decrRef(); + if(_field_target) + _field_target->decrRef(); +} + +bool ICOCO::solve() +{ + if(!_field_source) + _field_source=buildSourceField(); + else + { + double *values=_field_source->getArray()->getPointer(); + int nbOfValues=_field_source->getNumberOfTuples()*_field_source->getNumberOfComponents(); + std::transform(values,values+nbOfValues,values,std::bind2nd(std::multiplies(),2.)); + _field_source->declareAsNew(); + } + if(!_field_target) + _field_target=buildTargetField(); + else + { + double *values=_field_target->getArray()->getPointer(); + int nbOfValues=_field_target->getNumberOfTuples()*_field_target->getNumberOfComponents(); + std::transform(values,values+nbOfValues,values,std::bind2nd(std::multiplies(),3.)); + _field_target->declareAsNew(); + } +} + +void ICOCO::initialize() +{ + if(_field_source) + _field_source->decrRef(); + _field_source=0; + if(_field_target) + _field_target->decrRef(); + _field_target=0; +} + +std::vector ICOCO::getInputFieldsNames() +{ + std::vector ret; + ret.push_back(FIELD_NAME1); + ret.push_back(FIELD_NAME2); + return ret; +} + +MEDCoupling::MEDCouplingUMesh *ICOCO::getInputFieldTemplate(const char *name) +{ + std::string nameCpp(name); + if(nameCpp==FIELD_NAME1) + return buildSourceUMesh(); + if(nameCpp==FIELD_NAME2) + return buildTargetUMesh(); + return 0; +} + +MEDCoupling::MEDCouplingFieldDouble *ICOCO::getOutputField(const char *fieldName) +{ + std::string fieldNameCpp(fieldName); + if(fieldNameCpp==FIELD_NAME1) + { + if(_field_source) + _field_source->incrRef(); + return _field_source; + } + if(fieldNameCpp==FIELD_NAME2) + { + if(_field_target) + _field_target->incrRef(); + return _field_target; + } + return 0; +} + +void ICOCO::printField(const MEDCoupling::MEDCouplingFieldDouble *field) +{ + std::copy(field->getArray()->getConstPointer(),field->getArray()->getConstPointer()+field->getArray()->getNbOfElems(),std::ostream_iterator(cout," ")); + std::cout << endl; +} + +void ICOCO::setInputField(const char *name, const MEDCoupling::MEDCouplingFieldDouble *field) +{ + std::string nameCpp(name); + if(nameCpp==FIELD_NAME1) + { + if(_field_source) + _field_source->decrRef(); + _field_source=(MEDCoupling::MEDCouplingFieldDouble *)field; + if(_field_source) + _field_source->incrRef(); + } + if(nameCpp==FIELD_NAME2) + { + if(_field_target) + _field_target->decrRef(); + _field_target=(MEDCoupling::MEDCouplingFieldDouble *)field; + if(_field_target) + _field_target->incrRef(); + } +} + +MEDCoupling::MEDCouplingUMesh *ICOCO::buildSourceUMesh() +{ + double sourceCoords[27]={ 0.0, 0.0, 200.0, 0.0, 0.0, 0.0, 0.0, 200.0, 200.0, 0.0, 200.0, 0.0, 200.0, 0.0, 200.0, + 200.0, 0.0, 0.0, 200.0, 200.0, 200.0, 200.0, 200.0, 0.0, 100.0, 100.0, 100.0 }; + int sourceConn[48]={8,1,7,3, 6,0,8,2, 7,4,5,8, 6,8,4,7, 6,8,0,4, 6,8,7,3, 8,1,3,0, 4,1,5,8, 1,7,5,8, 0,3,8,2, 8,1,0,4, 3,6,8,2}; + MEDCoupling::MEDCouplingUMesh *sourceMesh=MEDCoupling::MEDCouplingUMesh::New(); + sourceMesh->setMeshDimension(3); + sourceMesh->allocateCells(12); + sourceMesh->insertNextCell(INTERP_KERNEL::NORM_TETRA4,4,sourceConn); + sourceMesh->insertNextCell(INTERP_KERNEL::NORM_TETRA4,4,sourceConn+4); + sourceMesh->insertNextCell(INTERP_KERNEL::NORM_TETRA4,4,sourceConn+8); + sourceMesh->insertNextCell(INTERP_KERNEL::NORM_TETRA4,4,sourceConn+12); + sourceMesh->insertNextCell(INTERP_KERNEL::NORM_TETRA4,4,sourceConn+16); + sourceMesh->insertNextCell(INTERP_KERNEL::NORM_TETRA4,4,sourceConn+20); + sourceMesh->insertNextCell(INTERP_KERNEL::NORM_TETRA4,4,sourceConn+24); + sourceMesh->insertNextCell(INTERP_KERNEL::NORM_TETRA4,4,sourceConn+28); + sourceMesh->insertNextCell(INTERP_KERNEL::NORM_TETRA4,4,sourceConn+32); + sourceMesh->insertNextCell(INTERP_KERNEL::NORM_TETRA4,4,sourceConn+36); + sourceMesh->insertNextCell(INTERP_KERNEL::NORM_TETRA4,4,sourceConn+40); + sourceMesh->insertNextCell(INTERP_KERNEL::NORM_TETRA4,4,sourceConn+44); + sourceMesh->finishInsertingCells(); + MEDCoupling::DataArrayDouble *myCoords=MEDCoupling::DataArrayDouble::New(); + myCoords->alloc(9,3); + std::copy(sourceCoords,sourceCoords+27,myCoords->getPointer()); + sourceMesh->setCoords(myCoords); + myCoords->decrRef(); + return sourceMesh; +} + +MEDCoupling::MEDCouplingUMesh *ICOCO::buildTargetUMesh() +{ + double targetCoords[81]={ 0., 0., 0., 50., 0., 0. , 200., 0., 0. , 0., 50., 0., 50., 50., 0. , 200., 50., 0., 0., 200., 0., 50., 200., 0. , 200., 200., 0. , + 0., 0., 50., 50., 0., 50. , 200., 0., 50. , 0., 50., 50., 50., 50., 50. , 200., 50., 50., 0., 200., 50., 50., 200., 50. , 200., 200., 50. , + 0., 0., 200., 50., 0., 200. , 200., 0., 200. , 0., 50., 200., 50., 50., 200. , 200., 50., 200., 0., 200., 200., 50., 200., 200. , 200., 200., 200. }; + int targetConn[64]={0,1,4,3,9,10,13,12, 1,2,5,4,10,11,14,13, 3,4,7,6,12,13,16,15, 4,5,8,7,13,14,17,16, + 9,10,13,12,18,19,22,21, 10,11,14,13,19,20,23,22, 12,13,16,15,21,22,25,24, 13,14,17,16,22,23,26,25}; + MEDCoupling::MEDCouplingUMesh *targetMesh=MEDCoupling::MEDCouplingUMesh::New(); + targetMesh->setMeshDimension(3); + targetMesh->allocateCells(12); + for(int i=0;i<8;i++) + targetMesh->insertNextCell(INTERP_KERNEL::NORM_HEXA8,8,targetConn+8*i); + targetMesh->finishInsertingCells(); + MEDCoupling::DataArrayDouble *myCoords=MEDCoupling::DataArrayDouble::New(); + myCoords->alloc(27,3); + std::copy(targetCoords,targetCoords+81,myCoords->getPointer()); + targetMesh->setCoords(myCoords); + myCoords->decrRef(); + return targetMesh; +} + +MEDCoupling::MEDCouplingFieldDouble *ICOCO::buildSourceField() +{ + MEDCoupling::MEDCouplingUMesh *mesh=buildSourceUMesh(); + MEDCoupling::MEDCouplingFieldDouble *fieldOnCells=MEDCoupling::MEDCouplingFieldDouble::New(MEDCoupling::ON_CELLS); + fieldOnCells->setMesh(mesh); + MEDCoupling::DataArrayDouble *array=MEDCoupling::DataArrayDouble::New(); + array->alloc(mesh->getNumberOfCells(),1); + fieldOnCells->setArray(array); + double *values=array->getPointer(); + for(int i=0;igetNumberOfCells();i++) + values[i]=2.*((double)i); + mesh->decrRef(); + array->decrRef(); + return fieldOnCells; +} + +MEDCoupling::MEDCouplingFieldDouble *ICOCO::buildTargetField() +{ + MEDCoupling::MEDCouplingUMesh *mesh=buildTargetUMesh(); + MEDCoupling::MEDCouplingFieldDouble *fieldOnCells=MEDCoupling::MEDCouplingFieldDouble::New(MEDCoupling::ON_CELLS); + fieldOnCells->setMesh(mesh); + MEDCoupling::DataArrayDouble *array=MEDCoupling::DataArrayDouble::New(); + array->alloc(mesh->getNumberOfCells(),1); + fieldOnCells->setArray(array); + double *values=array->getPointer(); + for(int i=0;igetNumberOfCells();i++) + values[i]=7.*((double)i); + mesh->decrRef(); + array->decrRef(); + return fieldOnCells; +} + diff --git a/Examples/hxx1/ICOCO/src/ICOCO.hxx b/Examples/hxx1/ICOCO/src/ICOCO.hxx new file mode 100644 index 0000000..93aa815 --- /dev/null +++ b/Examples/hxx1/ICOCO/src/ICOCO.hxx @@ -0,0 +1,40 @@ +#ifndef _ICOCO_HXX_ +#define _ICOCO_HXX_ + +// forward declaration +#include +#include + +namespace MEDCoupling +{ + class MEDCouplingUMesh; + class MEDCouplingFieldDouble; +} + +class ICOCO +{ +// Méthodes publiques +public: + ICOCO(); + ~ICOCO(); + void initialize(); + bool solve(); + std::vector getInputFieldsNames(); + MEDCoupling::MEDCouplingUMesh *getInputFieldTemplate(const char *name); + MEDCoupling::MEDCouplingFieldDouble *getOutputField(const char *fieldName); + void printField(const MEDCoupling::MEDCouplingFieldDouble *field); + void setInputField(const char *name, const MEDCoupling::MEDCouplingFieldDouble *field); +private: + MEDCoupling::MEDCouplingUMesh *buildSourceUMesh(); + MEDCoupling::MEDCouplingUMesh *buildTargetUMesh(); + MEDCoupling::MEDCouplingFieldDouble *buildSourceField(); + MEDCoupling::MEDCouplingFieldDouble *buildTargetField(); +private: + MEDCoupling::MEDCouplingFieldDouble *_field_source; + MEDCoupling::MEDCouplingFieldDouble *_field_target; +private: + static const char FIELD_NAME1[]; + static const char FIELD_NAME2[]; +}; + +#endif diff --git a/Examples/hxx1/ICOCO/src/main.cxx b/Examples/hxx1/ICOCO/src/main.cxx new file mode 100644 index 0000000..b7b3b0f --- /dev/null +++ b/Examples/hxx1/ICOCO/src/main.cxx @@ -0,0 +1,11 @@ +#include "ICOCO.hxx" +#include + +using namespace std; +int main(int argc, char ** argv) +{ + if (getenv("SALOME_trace") == NULL ) + setenv("SALOME_trace","local",0); + ICOCO myCalc; + // test myCalc component ... +} diff --git a/Examples/hxx1/Makefile b/Examples/hxx1/Makefile index 9034fee..eed0de1 100644 --- a/Examples/hxx1/Makefile +++ b/Examples/hxx1/Makefile @@ -18,4 +18,4 @@ # clean: - rm -rf parse_* appli install hxxcompos_* COMPONENTCPP_* *.bak *.err *.log + rm -rf parse_* appli install hxxcompos_* COMPONENTCPP_* *.bak *.err *.log *_build diff --git a/Examples/hxx1/build.sh b/Examples/hxx1/build.sh index 23792fd..734de46 100755 --- a/Examples/hxx1/build.sh +++ b/Examples/hxx1/build.sh @@ -1,15 +1,18 @@ - # build COMPONENTCPP lib -tar -xzvf cpp_component.tgz -mkdir COMPONENTCPP_BUILD -export HXXTESTPATH=`pwd` -cd COMPONENTCPP_SRC -../../exec.sh ./build_configure -cd ../COMPONENTCPP_BUILD -../../exec.sh ../COMPONENTCPP_SRC/configure --prefix=$HXXTESTPATH/COMPONENTCPP_INSTALL +mkdir CALCUL_build +cd CALCUL_build +../../exec.sh cmake -DCMAKE_INSTALL_PREFIX:PATH=../COMPONENTCPP_INSTALL ../CALCUL/src/ +../../exec.sh make +../../exec.sh make install +cd .. + +mkdir ICOCO_build +cd ICOCO_build +../../exec.sh cmake -DCMAKE_INSTALL_PREFIX:PATH=../COMPONENTCPP_INSTALL ../ICOCO/src/ ../../exec.sh make ../../exec.sh make install cd .. + # build & test SALOME component ../exec.sh python component.py diff --git a/Examples/hxx1/cpp_component.tgz b/Examples/hxx1/cpp_component.tgz deleted file mode 100644 index 92c7422f9f355e9d13389ffb664ce794bec0203f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15824 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

qaGSdJfN3YMC&6?2oE2&^GnNAvE%C71N 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 a*ZNvt>uY_jul4oc^7_AdgBTD17y$sHA4})} diff --git a/module_generator/gener.py b/module_generator/gener.py index dc63939..d164938 100644 --- a/module_generator/gener.py +++ b/module_generator/gener.py @@ -484,8 +484,29 @@ class Generator(object): prefix = os.path.abspath(self.module.prefix) component_libs = "".join(map(lambda x: x.libraryName()+" ", module.components)) - add_modules = "".join(map(lambda x:cmake_find_module.substitute(module=x), - self.used_modules)) + add_modules = "" + for x in self.used_modules: + cmake_text = cmake_find_module.substitute(module=x) + if x == "MED": + cmake_text = cmake_text + """ +##################################### +# FIND MEDCOUPLING +##################################### +SET(MEDCOUPLING_ROOT_DIR $ENV{MEDCOUPLING_ROOT_DIR} CACHE PATH "Path to MEDCOUPLING module") +IF(EXISTS ${MEDCOUPLING_ROOT_DIR}) + LIST(APPEND CMAKE_MODULE_PATH "${MEDCOUPLING_ROOT_DIR}/cmake_files") + FIND_PACKAGE(SalomeMEDCoupling REQUIRED) + ADD_DEFINITIONS(${MEDCOUPLING_DEFINITIONS}) + INCLUDE_DIRECTORIES(${MEDCOUPLING_INCLUDE_DIRS}) +ELSE(EXISTS ${MEDCOUPLING_ROOT_DIR}) + MESSAGE(FATAL_ERROR "We absolutely need MEDCOUPLING module, please define MEDCOUPLING_ROOT_DIR") +ENDIF(EXISTS ${MEDCOUPLING_ROOT_DIR}) +##################################### + +""" + add_modules = add_modules + cmake_text + pass + self.makeFiles({"CMakeLists.txt":cmake_root_cpp.substitute( module=self.module.name, module_min=self.module.name.lower(), diff --git a/module_generator/hxx_awk.py b/module_generator/hxx_awk.py index a850248..df7c7ea 100644 --- a/module_generator/hxx_awk.py +++ b/module_generator/hxx_awk.py @@ -51,10 +51,10 @@ cpp2idl_mapping["const MEDMEM::FIELD&"]="in SALOME_MED::FIELDINT" cpp2idl_mapping["MEDMEM::FIELD*&"]="out SALOME_MED::FIELDINT" cpp2idl_mapping["const std::vector&"]="in %(module)s::intvec" cpp2idl_mapping["std::vector*&"]="out %(module)s::intvec" -cpp2idl_mapping["const ParaMEDMEM::MEDCouplingFieldDouble*"]="in SALOME_MED::MEDCouplingFieldDoubleCorbaInterface" -cpp2idl_mapping["const ParaMEDMEM::MEDCouplingFieldDouble&"]="in SALOME_MED::MEDCouplingFieldDoubleCorbaInterface" -cpp2idl_mapping["ParaMEDMEM::MEDCouplingFieldDouble*&"]="out SALOME_MED::MEDCouplingFieldDoubleCorbaInterface" -cpp2idl_mapping["const ParaMEDMEM::MEDCouplingUMesh*"]="in SALOME_MED::MEDCouplingUMeshCorbaInterface" +cpp2idl_mapping["const MEDCoupling::MEDCouplingFieldDouble*"]="in SALOME_MED::MEDCouplingFieldDoubleCorbaInterface" +cpp2idl_mapping["const MEDCoupling::MEDCouplingFieldDouble&"]="in SALOME_MED::MEDCouplingFieldDoubleCorbaInterface" +cpp2idl_mapping["MEDCoupling::MEDCouplingFieldDouble*&"]="out SALOME_MED::MEDCouplingFieldDoubleCorbaInterface" +cpp2idl_mapping["const MEDCoupling::MEDCouplingUMesh*"]="in SALOME_MED::MEDCouplingUMeshCorbaInterface" # ['stringvec', 'string', 'double', 'long', 'dblevec', 'file', 'intvec', 'dataref', 'GEOM_Object', 'SMESH_Mesh', 'SMESH_Hypothesis', 'SALOME_MED/MED', 'SALOME_MED/MESH', 'SALOME_MED/SUPPORT', 'SALOME_MED/FIELD', 'SALOME_MED/FIELDDOUBLE', 'SALOME_MED/FIELDINT'] cpp2yacs_mapping={} @@ -111,13 +111,13 @@ cpp2yacs_mapping["std::vector*"]="intvec" cpp2yacs_mapping["std::vector >*"]="SALOME/Matrix" cpp2yacs_mapping["std::vector"]="stringvec" -cpp2yacs_mapping["const ParaMEDMEM::MEDCouplingFieldDouble*"]="SALOME_MED/MEDCouplingFieldDoubleCorbaInterface" -cpp2yacs_mapping["const ParaMEDMEM::MEDCouplingFieldDouble&"]="SALOME_MED/MEDCouplingFieldDoubleCorbaInterface" -cpp2yacs_mapping["const ParaMEDMEM::MEDCouplingUMesh*"]="SALOME_MED/MEDCouplingUMeshCorbaInterface" -cpp2yacs_mapping["ParaMEDMEM::MEDCouplingFieldDouble*&"]="SALOME_MED/MEDCouplingFieldDoubleCorbaInterface" -cpp2yacs_mapping["ParaMEDMEM::MEDCouplingUMesh*"]="SALOME_MED/MEDCouplingUMeshCorbaInterface" -cpp2yacs_mapping["ParaMEDMEM::MEDCouplingFieldDouble*"]="SALOME_MED/MEDCouplingFieldDoubleCorbaInterface" -cpp2yacs_mapping["ParaMEDMEM::DataArrayDouble*"]="SALOME_MED/DataArrayDoubleCorbaInterface" +cpp2yacs_mapping["const MEDCoupling::MEDCouplingFieldDouble*"]="SALOME_MED/MEDCouplingFieldDoubleCorbaInterface" +cpp2yacs_mapping["const MEDCoupling::MEDCouplingFieldDouble&"]="SALOME_MED/MEDCouplingFieldDoubleCorbaInterface" +cpp2yacs_mapping["const MEDCoupling::MEDCouplingUMesh*"]="SALOME_MED/MEDCouplingUMeshCorbaInterface" +cpp2yacs_mapping["MEDCoupling::MEDCouplingFieldDouble*&"]="SALOME_MED/MEDCouplingFieldDoubleCorbaInterface" +cpp2yacs_mapping["MEDCoupling::MEDCouplingUMesh*"]="SALOME_MED/MEDCouplingUMeshCorbaInterface" +cpp2yacs_mapping["MEDCoupling::MEDCouplingFieldDouble*"]="SALOME_MED/MEDCouplingFieldDoubleCorbaInterface" +cpp2yacs_mapping["MEDCoupling::DataArrayDouble*"]="SALOME_MED/DataArrayDoubleCorbaInterface" # table for c++ code generation : argument's processing cpp_impl_a={} cpp_impl_a["int"]="\tint _%(arg)s(%(arg)s);\n" @@ -158,11 +158,11 @@ cpp_impl_a["const std::vector&"]="\tlong _%(arg)s_size=%(arg)s.length();\n" "\tstd::vector _%(arg)s(_%(arg)s_size);\n"\ "\tfor (int i=0; i!=_%(arg)s_size; ++i)\n\t _%(arg)s[i]=%(arg)s[i];" cpp_impl_a["std::vector*&"]="\tstd::vector* _%(arg)s;\n" -cpp_impl_a["const ParaMEDMEM::MEDCouplingFieldDouble*"]="\tParaMEDMEM::MEDCouplingFieldDouble* _%(arg)s=ParaMEDMEM::MEDCouplingFieldDoubleClient::New(%(arg)s);\n" -cpp_impl_a["const ParaMEDMEM::MEDCouplingFieldDouble&"]="\tParaMEDMEM::MEDCouplingFieldDouble* __%(arg)s=ParaMEDMEM::MEDCouplingFieldDoubleClient::New(%(arg)s);\n"\ - "\tParaMEDMEM::MEDCouplingFieldDouble& _%(arg)s=*__%(arg)s;\n" -cpp_impl_a["ParaMEDMEM::MEDCouplingFieldDouble*&"]="\tParaMEDMEM::MEDCouplingFieldDouble* _%(arg)s;\n" -cpp_impl_a["const ParaMEDMEM::MEDCouplingUMesh*"]="\tParaMEDMEM::MEDCouplingUMesh* _%(arg)s=ParaMEDMEM::MEDCouplingUMeshClient::New(%(arg)s);\n" +cpp_impl_a["const MEDCoupling::MEDCouplingFieldDouble*"]="\tMEDCoupling::MEDCouplingFieldDouble* _%(arg)s=MEDCoupling::MEDCouplingFieldDoubleClient::New(%(arg)s);\n" +cpp_impl_a["const MEDCoupling::MEDCouplingFieldDouble&"]="\tMEDCoupling::MEDCouplingFieldDouble* __%(arg)s=MEDCoupling::MEDCouplingFieldDoubleClient::New(%(arg)s);\n"\ + "\tMEDCoupling::MEDCouplingFieldDouble& _%(arg)s=*__%(arg)s;\n" +cpp_impl_a["MEDCoupling::MEDCouplingFieldDouble*&"]="\tMEDCoupling::MEDCouplingFieldDouble* _%(arg)s;\n" +cpp_impl_a["const MEDCoupling::MEDCouplingUMesh*"]="\tMEDCoupling::MEDCouplingUMesh* _%(arg)s=MEDCoupling::MEDCouplingUMeshClient::New(%(arg)s);\n" # table for c++ code generation : returned value processing @@ -215,13 +215,13 @@ cpp_impl_b["std::vector"]="""\t%(module)s::stringvec * _rtn_ior = n \t_rtn_ior->length(_rtn_cpp_length); \tfor (int i=0; i<_rtn_cpp_length; ++i) \t (*_rtn_ior)[i] = _rtn_cpp[i].c_str();\n""" -cpp_impl_b["ParaMEDMEM::MEDCouplingFieldDouble*"]="""\tParaMEDMEM::MEDCouplingFieldDoubleServant * _rtn_field_i = new ParaMEDMEM::MEDCouplingFieldDoubleServant(_rtn_cpp); +cpp_impl_b["MEDCoupling::MEDCouplingFieldDouble*"]="""\tMEDCoupling::MEDCouplingFieldDoubleServant * _rtn_field_i = new MEDCoupling::MEDCouplingFieldDoubleServant(_rtn_cpp); \t_rtn_cpp->decrRef(); \tSALOME_MED::MEDCouplingFieldDoubleCorbaInterface_ptr _rtn_ior = _rtn_field_i->_this();\n""" -cpp_impl_b["ParaMEDMEM::MEDCouplingUMesh*"]="""\tParaMEDMEM::MEDCouplingUMeshServant * _rtn_mesh_i = new ParaMEDMEM::MEDCouplingUMeshServant(_rtn_cpp); +cpp_impl_b["MEDCoupling::MEDCouplingUMesh*"]="""\tMEDCoupling::MEDCouplingUMeshServant * _rtn_mesh_i = new MEDCoupling::MEDCouplingUMeshServant(_rtn_cpp); \t_rtn_cpp->decrRef(); \tSALOME_MED::MEDCouplingUMeshCorbaInterface_ptr _rtn_ior = _rtn_mesh_i->_this();\n""" -cpp_impl_b["ParaMEDMEM::DataArrayDouble*"]="""\tParaMEDMEM::DataArrayDoubleServant * _rtn_field_i = new ParaMEDMEM::DataArrayDoubleServant(_rtn_cpp); +cpp_impl_b["MEDCoupling::DataArrayDouble*"]="""\tMEDCoupling::DataArrayDoubleServant * _rtn_field_i = new MEDCoupling::DataArrayDoubleServant(_rtn_cpp); \t_rtn_cpp->decrRef(); \tSALOME_MED::DataArrayDoubleCorbaInterface_ptr _rtn_ior = _rtn_field_i->_this();\n""" # @@ -250,10 +250,10 @@ cpp_impl_c["const MEDMEM::MESH&"]="\t_%(arg)s->removeReference();\n" cpp_impl_c["const MEDMEM::MESH*"]="\t_%(arg)s->removeReference();\n" cpp_impl_c["const MEDMEM::SUPPORT&"]="\t_%(arg)s->removeReference();\n" cpp_impl_c["const MEDMEM::SUPPORT*"]="\t_%(arg)s->removeReference();\n" -cpp_impl_c["const ParaMEDMEM::MEDCouplingFieldDouble*"]="\t_%(arg)s->decrRef();\n" -cpp_impl_c["const ParaMEDMEM::MEDCouplingUMesh*"]="\t_%(arg)s->decrRef();\n" -cpp_impl_c["const ParaMEDMEM::MEDCouplingFieldDouble&"]="\t__%(arg)s->decrRef();\n" -cpp_impl_c["ParaMEDMEM::MEDCouplingFieldDouble*&"]="""\tParaMEDMEM::MEDCouplingFieldDoubleServant * %(arg)s_out=new ParaMEDMEM::MEDCouplingFieldDoubleServant(_%(arg)s); +cpp_impl_c["const MEDCoupling::MEDCouplingFieldDouble*"]="\t_%(arg)s->decrRef();\n" +cpp_impl_c["const MEDCoupling::MEDCouplingUMesh*"]="\t_%(arg)s->decrRef();\n" +cpp_impl_c["const MEDCoupling::MEDCouplingFieldDouble&"]="\t__%(arg)s->decrRef();\n" +cpp_impl_c["MEDCoupling::MEDCouplingFieldDouble*&"]="""\tMEDCoupling::MEDCouplingFieldDoubleServant * %(arg)s_out=new MEDCoupling::MEDCouplingFieldDoubleServant(_%(arg)s); \t_%(arg)s->decrRef(); \t%(arg)s = %(arg)s_out->_this();\n""" @@ -375,10 +375,10 @@ BEGIN { idl_arg_type["MEDMEM::FIELD*&"]="out SALOME_MED::FIELDINT" idl_arg_type["const std::vector&"]="in SALOME::vectorOfLong" idl_arg_type["std::vector*&"]="out SALOME::vectorOfLong" - idl_arg_type["const ParaMEDMEM::MEDCouplingFieldDouble*"]="in SALOME_MED::MEDCouplingFieldDoubleCorbaInterface" - idl_arg_type["const ParaMEDMEM::MEDCouplingFieldDouble&"]="in SALOME_MED::MEDCouplingFieldDoubleCorbaInterface" - idl_arg_type["ParaMEDMEM::MEDCouplingFieldDouble*&"]="out SALOME_MED::MEDCouplingFieldDoubleCorbaInterface" - idl_arg_type["const ParaMEDMEM::MEDCouplingUMesh*"]="in SALOME_MED::MEDCouplingUMeshCorbaInterface" + idl_arg_type["const MEDCoupling::MEDCouplingFieldDouble*"]="in SALOME_MED::MEDCouplingFieldDoubleCorbaInterface" + idl_arg_type["const MEDCoupling::MEDCouplingFieldDouble&"]="in SALOME_MED::MEDCouplingFieldDoubleCorbaInterface" + idl_arg_type["MEDCoupling::MEDCouplingFieldDouble*&"]="out SALOME_MED::MEDCouplingFieldDoubleCorbaInterface" + idl_arg_type["const MEDCoupling::MEDCouplingUMesh*"]="in SALOME_MED::MEDCouplingUMeshCorbaInterface" # # # mapping for returned types @@ -411,9 +411,9 @@ BEGIN { idl_rtn_type["const MEDMEM::FIELD&"]="SALOME_MED::FIELDINT" idl_rtn_type["std::vector*"]="SALOME::vectorOfLong" idl_rtn_type["std::vector"]="StrSeq" - idl_rtn_type["ParaMEDMEM::MEDCouplingUMesh*"]="SALOME_MED::MEDCouplingUMeshCorbaInterface" - idl_rtn_type["ParaMEDMEM::MEDCouplingFieldDouble*"]="SALOME_MED::MEDCouplingFieldDoubleCorbaInterface" - idl_rtn_type["ParaMEDMEM::DataArrayDouble*"]="SALOME_MED::DataArrayDoubleServantCorbaInterface" + idl_rtn_type["MEDCoupling::MEDCouplingUMesh*"]="SALOME_MED::MEDCouplingUMeshCorbaInterface" + idl_rtn_type["MEDCoupling::MEDCouplingFieldDouble*"]="SALOME_MED::MEDCouplingFieldDoubleCorbaInterface" + idl_rtn_type["MEDCoupling::DataArrayDouble*"]="SALOME_MED::DataArrayDoubleServantCorbaInterface" # # # record sep is ");\\n" whith blanks all around, and optional "(" at the beginning diff --git a/module_generator/hxx_para_tmpl.py b/module_generator/hxx_para_tmpl.py index f2558ba..1496c8c 100644 --- a/module_generator/hxx_para_tmpl.py +++ b/module_generator/hxx_para_tmpl.py @@ -131,7 +131,7 @@ class ${component}; // forward declaration class ${component}_i: ${inheritedclass} public POA_${module}_ORB::${component}_Gen, - public ParaMEDMEM::ParaMEDMEMComponent_i + public MEDCoupling::ParaMEDMEMComponent_i { public: diff --git a/module_generator/hxxparacompo.py b/module_generator/hxxparacompo.py index dacd623..059dbce 100644 --- a/module_generator/hxxparacompo.py +++ b/module_generator/hxxparacompo.py @@ -103,10 +103,10 @@ class HXX2SALOMEParaComponent(Component): # The information relative to a service (called service_name) is stored in the dictionnary service_definition[service_name] from hxx_awk import cpp2idl_mapping from hxx_awk import cpp2yacs_mapping - cpp2yacs_mapping["const ParaMEDMEM::MEDCouplingFieldDouble*"]="SALOME_MED/MPIMEDCouplingFieldDoubleCorbaInterface" - cpp2yacs_mapping["const ParaMEDMEM::MEDCouplingFieldDouble&"]="SALOME_MED/MPIMEDCouplingFieldDoubleCorbaInterface" - cpp2yacs_mapping["ParaMEDMEM::MEDCouplingFieldDouble*&"]="SALOME_MED/MPIMEDCouplingFieldDoubleCorbaInterface" - cpp2yacs_mapping["ParaMEDMEM::MEDCouplingFieldDouble*"]="SALOME_MED/MPIMEDCouplingFieldDoubleCorbaInterface" + cpp2yacs_mapping["const MEDCoupling::MEDCouplingFieldDouble*"]="SALOME_MED/MPIMEDCouplingFieldDoubleCorbaInterface" + cpp2yacs_mapping["const MEDCoupling::MEDCouplingFieldDouble&"]="SALOME_MED/MPIMEDCouplingFieldDoubleCorbaInterface" + cpp2yacs_mapping["MEDCoupling::MEDCouplingFieldDouble*&"]="SALOME_MED/MPIMEDCouplingFieldDoubleCorbaInterface" + cpp2yacs_mapping["MEDCoupling::MEDCouplingFieldDouble*"]="SALOME_MED/MPIMEDCouplingFieldDoubleCorbaInterface" list_of_services=[] service_definition={} result_parsing=open("parse_type_result","r") @@ -147,10 +147,10 @@ class HXX2SALOMEParaComponent(Component): # store it in service_definition[serv]["impl"] # from hxx_awk import cpp_impl_a,cpp_impl_b,cpp_impl_c # these tables contain the part of code which depends upon c++ types - cpp_impl_b["ParaMEDMEM::MEDCouplingFieldDouble*"]="""\tParaMEDMEM::MPIMEDCouplingFieldDoubleServant * _rtn_field_i = new ParaMEDMEM::MPIMEDCouplingFieldDoubleServant(_orb,_poa,this,_rtn_cpp); + cpp_impl_b["MEDCoupling::MEDCouplingFieldDouble*"]="""\tMEDCoupling::MPIMEDCouplingFieldDoubleServant * _rtn_field_i = new MEDCoupling::MPIMEDCouplingFieldDoubleServant(_orb,_poa,this,_rtn_cpp); \t_rtn_cpp->decrRef(); \tSALOME_MED::MPIMEDCouplingFieldDoubleCorbaInterface_ptr _rtn_ior = _rtn_field_i->_this();\n""" - cpp_impl_a["const ParaMEDMEM::MEDCouplingFieldDouble*"]="\tParaMEDMEM::MEDCouplingFieldDouble* _%(arg)s=cppCompo_->getInputFieldTemplate();\n\t_setInputField(%(arg)s,_%(arg)s);\n\t_initializeCoupling(%(arg)s);\n" + cpp_impl_a["const MEDCoupling::MEDCouplingFieldDouble*"]="\tMEDCoupling::MEDCouplingFieldDouble* _%(arg)s=cppCompo_->getInputFieldTemplate();\n\t_setInputField(%(arg)s,_%(arg)s);\n\t_initializeCoupling(%(arg)s);\n" from yacstypes import corbaTypes,corbaOutTypes format_thread_signature="void * th_%s(void * st);" # this thread declaration will be included in servant's header -- 2.39.2