From 0b4f10553c1233eaa005b80fe8eee38b7f7a6a21 Mon Sep 17 00:00:00 2001 From: jfa Date: Sat, 6 May 2006 08:25:41 +0000 Subject: [PATCH] Join modifications from branch CEAFor_V3_2_0 --- INSTALL | 6 +- Makefile.in | 12 +- adm_local/unix/config_files/check_Med.m4 | 23 +- adm_local/unix/make_commence.in | 51 +- adm_local/unix/make_conclude.in | 81 +- .../config_files/ac_linker_options.m4 | 57 + .../config_files/config.sub | 1268 +++++++++++++++++ .../config_files/production.m4 | 106 ++ bin/VERSION | 2 +- build_configure | 6 +- configure.in.base | 30 +- doc/MEDMEM/Makefile.in | 24 +- doc/salome/tui/MED/doxyfile | 7 +- doc/salome/tui/MED/sources/static/tree.js | 2 +- doc/salome/tui/Makefile.in | 11 + idl/Compo1Py.idl | 4 +- idl/Makefile.in | 2 +- resources/MEDCatalog.xml | 2 +- resources/SalomeApp.xml | 11 + resources/geomMesh21.med | Bin 0 -> 317676 bytes resources/geomMesh22.med | Bin 0 -> 308664 bytes .../DataTest/Data => resources}/maill.00.med | Bin .../Data => resources}/maill.00_nofield.med | Bin .../Data => resources}/maill.00_nomesh.med | Bin .../maill.00_without_seg2.med | Bin .../zzzz121b_without_tr6.med | Bin src/INTERPOLATION/MEDMEM_WrapperCells.hxx | 4 +- src/INTERPOLATION/Makefile.in | 12 +- src/MED/Makefile.in | 10 +- src/MED/Med_Gen_i.cxx | 2 +- src/MEDGUI/Makefile.in | 4 +- src/MEDMEM/MEDMEM_DriverFactory.cxx | 20 +- src/MEDMEM/MEDMEM_DriverFactory.hxx | 2 + src/MEDMEM/MEDMEM_Field.hxx | 17 + src/MEDMEM/MEDMEM_GaussLocalization.hxx | 7 +- src/MEDMEM/MEDMEM_GenDriver.cxx | 3 +- src/MEDMEM/MEDMEM_GibiMeshDriver.cxx | 356 +++-- src/MEDMEM/MEDMEM_Med.cxx | 2 + src/MEDMEM/MEDMEM_Med.hxx | 20 +- src/MEDMEM/MEDMEM_MedFieldDriver22.hxx | 50 +- src/MEDMEM/MEDMEM_MedMedDriver21.cxx | 6 +- src/MEDMEM/MEDMEM_MedMedDriver22.cxx | 6 +- src/MEDMEM/MEDMEM_MedMeshDriver21.cxx | 7 + src/MEDMEM/MEDMEM_MedMeshDriver22.cxx | 169 ++- src/MEDMEM/MEDMEM_Mesh.cxx | 72 +- src/MEDMEM/MEDMEM_Mesh.hxx | 1 + src/MEDMEM/MEDMEM_Support.cxx | 16 +- src/MEDMEM/MEDMEM_TopLevel.cxx | 43 + src/MEDMEM/MEDMEM_TopLevel.hxx | 53 + src/MEDMEM/Makefile.in | 16 +- src/MEDMEM/testAnalFile.cxx | 83 ++ src/MEDMEM_I/Makefile.in | 10 +- src/MEDMEM_SWIG/Makefile.in | 14 +- src/MEDMEM_SWIG/libMEDMEM_Swig.i | 221 ++- src/MEDMEM_SWIG/med_test3.py | 55 +- src/MEDMEM_SWIG/my_typemap.i | 29 +- src/MEDMEM_SWIG/testGaussLocalization.py | 116 ++ src/MEDMEM_SWIG/testMedObj.py | 114 ++ src/MEDMEM_SWIG/testWriteAndFam.py | 160 +++ src/MEDMEM_SWIG/test_profil_MedFieldDriver.py | 93 ++ src/MEDWrapper/Base/MED_Algorithm.cxx | 18 +- src/MEDWrapper/Base/MED_Common.hxx | 7 + src/MEDWrapper/Base/MED_CoordUtils.cxx | 2 + src/MEDWrapper/Base/MED_GaussUtils.cxx | 773 +++++++++- src/MEDWrapper/Base/MED_Structures.cxx | 320 +++++ src/MEDWrapper/Base/MED_Structures.hxx | 87 ++ src/MEDWrapper/Base/MED_TStructures.hxx | 112 ++ src/MEDWrapper/Base/MED_TWrapper.hxx | 74 + src/MEDWrapper/Base/MED_Wrapper.cxx | 152 ++ src/MEDWrapper/Base/MED_Wrapper.hxx | 122 ++ src/MEDWrapper/V2_2/MED_V2_2_Wrapper.cxx | 301 +++- src/MEDWrapper/V2_2/MED_V2_2_Wrapper.hxx | 36 + src/Makefile.in | 4 +- src/MedClient/src/CONNECTIVITYClient.cxx | 10 +- src/MedClient/src/Makefile.in | 10 +- src/MedClient/src/libMEDClient.i | 8 + src/MedClient/test/environ/csh/init1.in | 2 +- src/MedClient/test/environ/csh/init3.in | 2 +- .../test/environ/csh/runContainer.in | 16 +- .../test/environ/csh/stopContainer.in | 12 +- src/MedClient/test/environ/runTestMedCorba.in | 14 +- src/MedClient/test/test1/Compo1Py.py | 4 +- src/MedClient/test/test2/Makefile.in | 8 +- src/MedCorba_Swig/Makefile.in | 12 +- 84 files changed, 5149 insertions(+), 455 deletions(-) create mode 100644 adm_local_without_kernel/config_files/ac_linker_options.m4 create mode 100755 adm_local_without_kernel/config_files/config.sub create mode 100644 adm_local_without_kernel/config_files/production.m4 create mode 100644 resources/SalomeApp.xml create mode 100644 resources/geomMesh21.med create mode 100644 resources/geomMesh22.med rename {src/MEDMEM/DataTest/Data => resources}/maill.00.med (100%) rename {src/MEDMEM/DataTest/Data => resources}/maill.00_nofield.med (100%) rename {src/MEDMEM/DataTest/Data => resources}/maill.00_nomesh.med (100%) rename {src/MEDMEM/DataTest/Data => resources}/maill.00_without_seg2.med (100%) rename {src/MEDMEM/DataTest/Data => resources}/zzzz121b_without_tr6.med (100%) create mode 100644 src/MEDMEM/MEDMEM_TopLevel.cxx create mode 100644 src/MEDMEM/MEDMEM_TopLevel.hxx create mode 100644 src/MEDMEM/testAnalFile.cxx create mode 100644 src/MEDMEM_SWIG/testGaussLocalization.py create mode 100755 src/MEDMEM_SWIG/testMedObj.py create mode 100755 src/MEDMEM_SWIG/testWriteAndFam.py create mode 100644 src/MEDMEM_SWIG/test_profil_MedFieldDriver.py diff --git a/INSTALL b/INSTALL index 89f4f2411..ea43398f3 100644 --- a/INSTALL +++ b/INSTALL @@ -1,4 +1,4 @@ -This is the version 3.2.0a2 of MED +This is the version 3.2.0b1 of MED Compatible with : - - KERNEL 3.2.0a2 - - SALOMEGUI 3.2.0a2 + - KERNEL 3.2.0b1 + - SALOMEGUI 3.2.0b1 diff --git a/Makefile.in b/Makefile.in index 9e82a9312..82d3f2289 100644 --- a/Makefile.in +++ b/Makefile.in @@ -30,6 +30,7 @@ RESOURCES_FILES = \ MEDCatalog.xml \ MED_en.xml \ MED.config \ +SalomeApp.xml \ Data.png \ Infos.png \ Structure.png \ @@ -65,6 +66,13 @@ elle_3D_HPr_10x10x10_2.med \ elle_3D_HPr_2x2x2_2.med \ elle_3D_HPr_4x4x4_2.med \ test_2D.med \ +maill.00.med \ +maill.00_nofield.med \ +maill.00_nomesh.med \ +maill.00_without_seg2.med \ +zzzz121b_without_tr6.med \ +geomMesh21.med \ +geomMesh22.med \ Darcy3_3D_H_10x10x10.sauve \ dx200_dy1_avec_2couches.sauve \ elle_2D_QT_10x10.sauve \ @@ -112,8 +120,8 @@ titi.xyz BIN_SCRIPT= \ VERSION -LDFLAGS= -L$(top_builddir)/lib/salome -LDFLAGSFORBIN= -L$(top_builddir)/lib/salome +LDFLAGS= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome +LDFLAGSFORBIN= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome # copy header files in common directory include_list=include/salome/SALOMEconfig.h diff --git a/adm_local/unix/config_files/check_Med.m4 b/adm_local/unix/config_files/check_Med.m4 index 727bf4381..b741c5b9f 100644 --- a/adm_local/unix/config_files/check_Med.m4 +++ b/adm_local/unix/config_files/check_Med.m4 @@ -4,37 +4,46 @@ # AC_DEFUN([CHECK_MED],[ +AC_REQUIRE([AC_LINKER_OPTIONS])dnl AC_CHECKING(for Med) Med_ok=no +MED_LDFLAGS="" +MED_CXXFLAGS="" + AC_ARG_WITH(med, [ --with-med=DIR root directory path of MED installation ], MED_DIR="$withval",MED_DIR="") -if test "x$MED_DIR" == "x" ; then - +if test "x${MED_DIR}" == "x" ; then + AC_MSG_RESULT(for \${MED_ROOT_DIR}: ${MED_ROOT_DIR}) # no --with-med-dir option used - - if test "x$MED_ROOT_DIR" != "x" ; then + if test "x${MED_ROOT_DIR}" != "x" ; then # MED_ROOT_DIR environment variable defined - MED_DIR=$MED_ROOT_DIR + MED_DIR=${MED_ROOT_DIR} fi -# + fi if test -f ${MED_DIR}/idl/salome/MED.idl ; then - Med_ok=yes AC_MSG_RESULT(Using Med module distribution in ${MED_DIR}) + Med_ok=yes if test "x$MED_ROOT_DIR" == "x" ; then MED_ROOT_DIR=${MED_DIR} fi + AC_SUBST(MED_ROOT_DIR) + MED_LDFLAGS=-L${MED_DIR}/lib${LIB_LOCATION_SUFFIX}/salome + MED_CXXFLAGS=-I${MED_DIR}/include/salome + + AC_SUBST(MED_LDFLAGS) + AC_SUBST(MED_CXXFLAGS) else AC_MSG_WARN("Cannot find Med module sources") fi diff --git a/adm_local/unix/make_commence.in b/adm_local/unix/make_commence.in index 9f3ba60b5..476347b71 100644 --- a/adm_local/unix/make_commence.in +++ b/adm_local/unix/make_commence.in @@ -12,8 +12,8 @@ HAVE_SSTREAM=@HAVE_SSTREAM@ LIBS=@LIBS@ LIBSFORBIN=@LIBS@ -LDFLAGS=@LDFLAGS@ -L$(top_builddir)/lib/salome -LDFLAGSFORBIN=@LDFLAGS@ -L$(top_builddir)/lib/salome +LDFLAGS=@LDFLAGS@ -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome +LDFLAGSFORBIN=@LDFLAGS@ -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome # add libstdc++ to link c++ library with libtool ! LDFLAGS+= @STDLIB@ LDFLAGSFORBIN+= @STDLIB@ @@ -60,8 +60,8 @@ PYTHON_VERSION = @PYTHON_VERSION@ # Changes from the SalomePro V1.2c #PYTHON_SITE = @PYTHON_SITE@ #PYTHON_SITE_INSTALL = @PYTHON_SITE_INSTALL@ -PYTHON_SITE = $(prefix)/lib/python$(PYTHON_VERSION)/site-packages -PYTHON_SITE_INSTALL = $(prefix)/lib/python$(PYTHON_VERSION)/site-packages/salome +PYTHON_SITE = $(prefix)/lib@LIB_LOCATION_SUFFIX@/python$(PYTHON_VERSION)/site-packages +PYTHON_SITE_INSTALL = $(prefix)/lib@LIB_LOCATION_SUFFIX@/python$(PYTHON_VERSION)/site-packages/salome # QT @@ -127,6 +127,11 @@ CAS_MODELER=@CAS_MODELER@ CAS_DATAEXCHANGE=@CAS_DATAEXCHANGE@ CAS_LDPATH=@CAS_LDPATH@ +# CPPUNIT + +CPPUNIT_INCLUDES = @CPPUNIT_INCLUDES@ +CPPUNIT_LIBS = @CPPUNIT_LIBS@ + # MPICH MPICH_INCLUDES=@MPICH_INCLUDES@ @@ -186,6 +191,8 @@ ifeq ($(MED_WITH_KERNEL),yes) endif DOXYGEN = @DOXYGEN@ +DOXYGEN_WITH_PYTHON = @DOXYGEN_WITH_PYTHON@ +DOXYGEN_WITH_STL = @DOXYGEN_WITH_STL@ ## Shared libraries LT_STATIC_EXEC=@LT_STATIC_EXEC@ @@ -207,16 +214,26 @@ INSTALL_DATA=@INSTALL_DATA@ # create a symbolic link (or a copie ?) LN_S=@LN_S@ +KERNEL_ROOT_DIR=@KERNEL_ROOT_DIR@ +KERNEL_SITE_DIR=@KERNEL_SITE_DIR@ + +KERNEL_LDFLAGS=@KERNEL_LDFLAGS@ +KERNEL_CXXFLAGS=@KERNEL_CXXFLAGS@ + +GUI_ROOT_DIR=@GUI_ROOT_DIR@ +GUI_LDFLAGS=@GUI_LDFLAGS@ +GUI_CXXFLAGS=@GUI_CXXFLAGS@ + ## Installation points prefix=@prefix@ exec_prefix=@exec_prefix@ -bindir=@bindir@/salome -libdir=@libdir@/salome +bindir=@exec_prefix@/bin/salome +libdir=@exec_prefix@/lib@LIB_LOCATION_SUFFIX@/salome # warning : if user give this path in configure we could have salome/salome :-( includedir=@includedir@/salome datadir=@datadir@/salome -idldir=$(prefix)/idl/salome -sharedpydir=@libdir@/python$(PYTHON_VERSION)/site-packages/salome/shared_modules +idldir=${prefix}/idl/salome +sharedpydir=@exec_prefix@/lib@LIB_LOCATION_SUFFIX@/python$(PYTHON_VERSION)/site-packages/salome/shared_modules incmakedir=${prefix}/salome_adm/unix docdir=${prefix}/doc/salome @@ -244,7 +261,21 @@ all: Makefile: $(top_builddir)/config.status $(srcdir)/Makefile.in cd $(top_builddir) ; ./config.status -$(top_builddir)/config.status: $(top_srcdir)/configure +LOCAL_MAKE = make_commence make_conclude + +ifeq ($(MED_WITH_KERNEL),yes) + LOCAL_MAKE += make_omniorb +endif + +KERNEL_MAKE = make_module depend SALOMEconfig.h sstream + +ifeq ($(MED_WITH_KERNEL),yes) + KERNEL_MAKE += F77config.h envScript +endif + +$(top_builddir)/config.status: $(top_srcdir)/configure \ + $(LOCAL_MAKE:%=$(top_srcdir)/adm_local/unix/%.in) \ + $(KERNEL_MAKE:%=$(KERNEL_ROOT_DIR)/salome_adm/unix/%.in) cd $(top_builddir) ; ./config.status --recheck # VPATH contain $(srcdir), so make configure is good in top_srcdir and we must add target configure otherwise :-) @@ -281,6 +312,6 @@ check_GUI.m4 check_corba_in_GUI.m4 $(top_srcdir)/aclocal.m4: $(ACLOCAL_SRC:%=@KERNEL_ROOT_DIR@/salome_adm/unix/config_files/%) \ $(ACLOCAL_GUI:%=@GUI_ROOT_DIR@/adm_local/unix/config_files/%) - cd $(top_srcdir) ; aclocal --acdir=adm_local/unix/config_files -I @KERNEL_ROOT_DIR@/salome_adm/unix/config_files \ + cd $(top_srcdir) ; aclocal -I adm_local/unix/config_files -I @KERNEL_ROOT_DIR@/salome_adm/unix/config_files \ -I @GUI_ROOT_DIR@/adm_local/unix/config_files diff --git a/adm_local/unix/make_conclude.in b/adm_local/unix/make_conclude.in index 770153f86..e53acdf51 100644 --- a/adm_local/unix/make_conclude.in +++ b/adm_local/unix/make_conclude.in @@ -37,9 +37,9 @@ LIB_OBJ_F = $(patsubst %.f, %.lo, $(filter %.f, $(LIB_SRC))) # all libtool obj file in library LIB_OBJ = $(LIB_OBJ_CXX) $(LIB_OBJ_CC) $(LIB_OBJ_C) $(LIB_CLIENT_OBJ:%.o=%.lo) $(LIB_SERVER_OBJ:%.o=%.lo) $(LIB_SWIG_OBJ) $(LIB_OBJ_F) -# LIB_BUILD = $(LIB:%.la=$(top_builddir)/lib/salome/%.la) -LIB_BUILD = $(patsubst %.la, $(top_builddir)/lib/salome/%.la, $(filter %.la, $(LIB))) -LIB_BUILD_A = $(patsubst %.a, $(top_builddir)/lib/salome/%.a, $(filter %.a, $(LIB))) +# LIB_BUILD = $(LIB:%.la=$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome/%.la) +LIB_BUILD = $(patsubst %.la, $(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome/%.la, $(filter %.la, $(LIB))) +LIB_BUILD_A = $(patsubst %.a, $(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome/%.a, $(filter %.a, $(LIB))) ifneq ($(findstring cmodule.la,$(filter %.la, $(LIB))),) LIB_SWIG = $(patsubst %cmodule.la,%.so, $(filter %.la, $(LIB))) @@ -50,7 +50,7 @@ endif lib: $(LIB_BUILD) $(LIB_CLIENT_PY) # we don't build static library ! -$(LIB_BUILD): $(top_builddir)/lib/salome/%.la: %.la +$(LIB_BUILD): $(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome/%.la: %.la -$(RM) $@ -$(RM) $(patsubst %.la, %.so, $@) -$(RM) $(patsubst %.la, %.a, $@) @@ -61,10 +61,10 @@ $(LIB_BUILD): $(top_builddir)/lib/salome/%.la: %.la $(patsubst %.la, %.so, $@).0 || true if test "X$(LIB_SWIG)" != X; then \ - ln -sf $(patsubst %.la,%.so, $(CURDIR)/.libs/$<) $(top_builddir)/lib/salome/_$(LIB_SWIG) || true;\ + ln -sf $(patsubst %.la,%.so, $(CURDIR)/.libs/$<) $(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome/_$(LIB_SWIG) || true;\ fi; -$(LIB_BUILD_A): $(top_builddir)/lib/salome/%.a: %.a +$(LIB_BUILD_A): $(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome/%.a: %.a -$(RM) $@ ln -sf $(CURDIR)/$< $@ || true @@ -108,7 +108,7 @@ $(DEST_PYSCRIPTS): $(top_builddir)/bin/salome/%: % # copy pyqt files in $(PYTHON_SHARED_SITE) # -PYTHON_SHARED_SITE=$(top_builddir)/lib/python$(PYTHON_VERSION)/site-packages/salome/shared_modules +PYTHON_SHARED_SITE=$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/python$(PYTHON_VERSION)/site-packages/salome/shared_modules $(PYTHON_SHARED_SITE): $(INSTALL) -d $@ @@ -118,11 +118,65 @@ sharedpyscripts: $(PYTHON_SHARED_SITE) $(DEST_SHAREDPYSCRIPTS) $(DEST_SHAREDPYSCRIPTS): $(PYTHON_SHARED_SITE)/%: % cp -f $< $@ -check: test +#check: test !!!! version before AG changes + +#tests: test !!!! version before AG changes + +#test: $(LIB) $(TEST_PROGS:%=$(top_builddir)/bin/salome/%) !!!! version before AG changes + +check: tests + + + + + +runtest_%: + @( LD_LIBRARY_PATH=$(top_builddir)/src/MEDMEM/.libs:$(top_builddir)/src/MEDWrapper/V2_1/Core/.libs:$${LD_LIBRARY_PATH} ; \ + SALOME_trace=local ; \ + export SALOME_trace ; \ + x=$@ ; \ + x=$${x#runtest_*} ; \ + echo -n "Passing test : "$$x ; \ + ./$$x > /dev/null ; \ + if test $$? != "0"; then \ + echo $$'\033'[1\;31m [ FAILED ] $$'\033'[0m ; \ + exit 2; \ + else \ + echo $$'\033'[1\;32m [ OK ] $$'\033'[0m \ ; \ + fi; ) + +runpytest_%: + @( LD_LIBRARY_PATH=$(top_builddir)/src/MEDMEM/.libs:$(top_builddir)/src/MEDWrapper/V2_1/Core/.libs:$${LD_LIBRARY_PATH} ; \ + PYTHONPATH=$(top_builddir)/src/MEDMEM_SWIG:$${PYTHONPATH} ; \ + SALOME_trace=local ; \ + export SALOME_trace ; \ + x=$@ ; \ + x=$${x#runpytest_*} ; \ + echo -n "Passing python test : "$$x ; \ + python $(srcdir)/$$x > /dev/null ; \ + if test $$? != "0"; then \ + echo $$'\033'[1\;31m [ FAILED ] $$'\033'[0m ; \ + exit 2; \ + else \ + echo $$'\033'[1\;32m [ OK ] $$'\033'[0m \ ; \ + fi; ) + +ALL_CHECK_TARGETS = $(patsubst %, runtest_%, $(TEST_PROGS)) + +tests: $(LIB) $(TEST_PROGS) $(ALL_CHECK_TARGETS) + @ln -fs $(top_builddir)/src/MEDMEM_SWIG/.libs/libMEDMEM_Swigcmodule.so $(top_builddir)/src/MEDMEM_SWIG/_libMEDMEM_Swig.so ; \ + for f in $(TEST_PYSCRIPTS); do \ + if [ x"$${f#*test}" != x"$${f}" ]; then \ + $(MAKE) runpytest_$$f ; \ + if test $$? != "0"; then \ + rm -f $(top_builddir)/src/MEDMEM_SWIG/_libMEDMEM_Swig.so ; \ + exit 2; \ + fi; \ + fi; \ + done ; \ + rm -f $(top_builddir)/src/MEDMEM_SWIG/_libMEDMEM_Swig.so ; -tests: test -test: $(LIB) $(TEST_PROGS:%=$(top_builddir)/bin/salome/%) # copy header file in $(inc_builddir) @@ -141,6 +195,7 @@ $(libdir) $(includedir) $(bindir) $(datadir) $(idldir) $(sharedpydir): # Install the library, the public header files, and programs. install: $(LIB) $(BIN) $(TEST_PROGS) $(libdir) $(includedir) $(bindir) $(datadir) $(idldir) install-python install-sharedpyqt install-qm +#install: $(LIB) $(BIN) $(libdir) $(includedir) $(bindir) $(datadir) $(idldir) install-python install-sharedpyqt install-qm @for f in X $(LIB); do \ if test $$f != X; then \ ($(LT_INSTALL_LIB) $$f $(libdir)/. || exit 1); \ @@ -262,10 +317,10 @@ clean: mostlyclean -$(RM) $(LIB) $(TEST_PROGS) $(BIN) $(CLEAN) -$(RM) TAGS *~ *# core *.core -$(RM) -r .libs - -$(RM) $(top_builddir)/lib/salome/$(LIB) + -$(RM) $(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome/$(LIB) -$(RM) $(patsubst %,$(top_builddir)/bin/salome/%, $(BIN)) - -$(RM) $(patsubst %.la, %.so, $(top_builddir)/lib/salome/$(LIB)) - -$(RM) $(patsubst %.la, %.a, $(top_builddir)/lib/salome/$(LIB)) + -$(RM) $(patsubst %.la, %.so, $(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome/$(LIB)) + -$(RM) $(patsubst %.la, %.a, $(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome/$(LIB)) # remove idl generated files (sources) -$(RM) $(LIB_CLIENT_SRC) $(LIB_SERVER_SRC) $(BIN_CLIENT_SRC) $(BIN_SERVER_SRC) # remove idl generated files (headers) diff --git a/adm_local_without_kernel/config_files/ac_linker_options.m4 b/adm_local_without_kernel/config_files/ac_linker_options.m4 new file mode 100644 index 000000000..9006a46fe --- /dev/null +++ b/adm_local_without_kernel/config_files/ac_linker_options.m4 @@ -0,0 +1,57 @@ +dnl Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +dnl CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +dnl +dnl This library is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Lesser General Public +dnl License as published by the Free Software Foundation; either +dnl version 2.1 of the License. +dnl +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Lesser General Public License for more details. +dnl +dnl You should have received a copy of the GNU Lesser General Public +dnl License along with this library; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +dnl +dnl See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +dnl +dnl +dnl +dnl @synopsis AC_LINKER_OPTIONS +dnl +dnl Check warning flags for C++ compiler to control warning messages +dnl +dnl @author Bernard Secher (CEA) - 04/12/2003 +dnl +AC_DEFUN([AC_LINKER_OPTIONS],[ + + AC_CHECKING(for LIB_LOCATION_SUFFIX) + LIB_LOCATION_SUFFIX="" + case "$build_cpu" in + x86_64*) LIB_LOCATION_SUFFIX="64" ;; + *) LIB_LOCATION_SUFFIX="" ;; + esac + AC_SUBST(LIB_LOCATION_SUFFIX) + AC_MSG_RESULT(LIB_LOCATION_SUFFIX is $LIB_LOCATION_SUFFIX) + + for opt in "-Xlinker -export-dynamic" -transitive_link; do + AC_CXX_OPTION($opt,LDEXPDYNFLAGS,flag=yes,flag=no) + if test "$flag" = "yes"; then + break + fi + done + AC_SUBST(LDEXPDYNFLAGS) + +dnl + case $host_os in + osf*) + STDLIB="-lcxxstd" + ;; + *) + STDLIB="-lstdc++" + ;; + esac + AC_SUBST(STDLIB) +]) diff --git a/adm_local_without_kernel/config_files/config.sub b/adm_local_without_kernel/config_files/config.sub new file mode 100755 index 000000000..6218dd954 --- /dev/null +++ b/adm_local_without_kernel/config_files/config.sub @@ -0,0 +1,1268 @@ +#! /bin/sh +# Configuration validation subroutine script, version 1.1. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 +# Free Software Foundation, Inc. +# +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Written by Per Bothner . +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +if [ x$1 = x ] +then + echo Configuration name missing. 1>&2 + echo "Usage: $0 CPU-MFR-OPSYS" 1>&2 + echo "or $0 ALIAS" 1>&2 + echo where ALIAS is a recognized configuration type. 1>&2 + exit 1 +fi + +# First pass through any local machine types. +case $1 in + *local*) + echo $1 + exit 0 + ;; + *) + ;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc | arm \ + | arme[lb] | pyramid | mn10200 | mn10300 | tron | a29k \ + | 580 | i960 | h8300 \ + | x86 | ppcbe | mipsbe | mipsle | shbe | shle | armbe | armle \ + | hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \ + | hppa64 \ + | alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \ + | alphaev6[78] \ + | we32k | ns16k | clipper | i370 | sh | powerpc | powerpcle \ + | 1750a | dsp16xx | pdp11 | mips16 | mips64 | mipsel | mips64el \ + | mips64orion | mips64orionel | mipstx39 | mipstx39el \ + | mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \ + | mips64vr5000 | miprs64vr5000el | mcore \ + | sparc | sparclet | sparclite | sparc64 | sparcv9 | v850 | c4x \ + | thumb | d10v | fr30 | avr) + basic_machine=$basic_machine-unknown + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | h8500 | w65 | pj | pjl) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i[34567]86) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + # FIXME: clean up the formatting here. + vax-* | tahoe-* | i[34567]86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \ + | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \ + | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \ + | power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \ + | xmp-* | ymp-* \ + | x86-* | x86_64-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* | armbe-* | armle-* \ + | hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \ + | hppa2.0n-* | hppa64-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \ + | alphaev6[78]-* \ + | we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \ + | clipper-* | orion-* \ + | sparclite-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \ + | sparc64-* | sparcv9-* | sparc86x-* | mips16-* | mips64-* | mipsel-* \ + | mips64el-* | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \ + | mipstx39-* | mipstx39el-* | mcore-* \ + | f301-* | armv*-* | s390-* | sv1-* | t3e-* \ + | m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \ + | thumb-* | v850-* | d30v-* | tic30-* | c30-* | fr30-* \ + | bs2000-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-cbm + ;; + amigaos | amigados) + basic_machine=m68k-cbm + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-cbm + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | ymp) + basic_machine=ymp-cray + os=-unicos + ;; + cray2) + basic_machine=cray2-cray + os=-unicos + ;; + [ctj]90-cray) + basic_machine=c90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i[34567]86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i[34567]86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i[34567]86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i[34567]86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + i386-go32 | go32) + basic_machine=i386-unknown + os=-go32 + ;; + i386-mingw32 | mingw32) + basic_machine=i386-unknown + os=-mingw32 + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mipsel*-linux*) + basic_machine=mipsel-unknown + os=-linux-gnu + ;; + mips*-linux*) + basic_machine=mips-unknown + os=-linux-gnu + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + msdos) + basic_machine=i386-unknown + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexen) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexen-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=rs6000-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sparclite-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=t3e-cray + os=-unicos + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xmp) + basic_machine=xmp-cray + os=-unicos + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + mips) + if [ x$os = x-linux-gnu ]; then + basic_machine=mips-unknown + else + basic_machine=mips-mips + fi + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sparc | sparcv9) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + c4x*) + basic_machine=c4x-none + os=-coff + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i[34567]86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto*) + os=-nto-qnx + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -*MiNT) + os=-mint + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f301-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -*MiNT) + vendor=atari + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os diff --git a/adm_local_without_kernel/config_files/production.m4 b/adm_local_without_kernel/config_files/production.m4 new file mode 100644 index 000000000..8157d677d --- /dev/null +++ b/adm_local_without_kernel/config_files/production.m4 @@ -0,0 +1,106 @@ +dnl Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +dnl CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +dnl +dnl This library is free software; you can redistribute it and/or +dnl modify it under the terms of the GNU Lesser General Public +dnl License as published by the Free Software Foundation; either +dnl version 2.1 of the License. +dnl +dnl This library is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl Lesser General Public License for more details. +dnl +dnl You should have received a copy of the GNU Lesser General Public +dnl License along with this library; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +dnl +dnl See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org +dnl +dnl +dnl +dnl define macros : +dnl AC_ENABLE_PRODUCTION AC_DISABLE_PRODUCTION +dnl and +dnl AC_ENABLE_DEBUG AC_DISABLE_DEBUG +dnl +dnl version $Id$ +dnl author Patrick GOLDBRONN +dnl + +# AC_ENABLE_PRODUCTION +AC_DEFUN([AC_ENABLE_PRODUCTION], [dnl +define([AC_ENABLE_PRODUCTION_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(production, +changequote(<<, >>)dnl +<< --enable-production[=PKGS] build without debug information [default=>>AC_ENABLE_PRODUCTION_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case "$enableval" in +yes) enable_production=yes ;; +no) enable_production=no ;; +*) + enable_production=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_production=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_production=AC_ENABLE_PRODUCTION_DEFAULT)dnl + +AC_CXX_OPTION(-Wno-deprecated,CXXFLAGS) +AC_CXX_OPTION(-Wparentheses,CXXFLAGS) +AC_CXX_OPTION(-Wreturn-type,CXXFLAGS) +AC_CXX_OPTION(-Wmissing-declarations,CXXFLAGS) +AC_CXX_OPTION(-fmessage-length=0,CXXFLAGS) +AC_CXX_OPTION(-Wunused,CXXFLAGS) +AC_CXX_OPTION(-pipe,CXXFLAGS) + +if test "X$enable_production" = "Xyes"; then + CFLAGS="$CFLAGS -O" + AC_CXX_OPTION(-Wuninitialized,CXXFLAGS) + CXXFLAGS="$CXXFLAGS -O " +fi +]) + +# AC_DISABLE_PRODUCTION - set the default flag to --disable-production +AC_DEFUN([AC_DISABLE_PRODUCTION], [AC_ENABLE_PRODUCTION(no)]) + +# AC_ENABLE_DEBUG +AC_DEFUN([AC_ENABLE_DEBUG], [dnl +define([AC_ENABLE_DEBUG_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE(debug, +changequote(<<, >>)dnl +<< --enable-debug[=PKGS] build without debug information [default=>>AC_ENABLE_DEBUG_DEFAULT], +changequote([, ])dnl +[p=${PACKAGE-default} +case "$enableval" in +yes) enable_debug=yes ;; +no) enable_debug=no ;; +*) + enable_debug=no + # Look at the argument we got. We use all the common list separators. + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:," + for pkg in $enableval; do + if test "X$pkg" = "X$p"; then + enable_debug=yes + fi + done + IFS="$ac_save_ifs" + ;; +esac], +enable_debug=AC_ENABLE_DEBUG_DEFAULT)dnl + +if test "X$enable_debug" = "Xyes"; then + CFLAGS="$CFLAGS -g -D_DEBUG_ " + CXXFLAGS="$CXXFLAGS -g -D_DEBUG_ " +fi +]) + +# AC_DISABLE_DEBUG - set the default flag to --disable-debug +AC_DEFUN([AC_DISABLE_DEBUG], [AC_ENABLE_DEBUG(no)]) \ No newline at end of file diff --git a/bin/VERSION b/bin/VERSION index 28be3296b..f534ec466 100755 --- a/bin/VERSION +++ b/bin/VERSION @@ -1 +1 @@ -THIS IS SALOME - MED VERSION: 3.2.0a2 +THIS IS SALOME - MED VERSION: 3.2.0b1 diff --git a/build_configure b/build_configure index 561a09d78..6a1c282ca 100755 --- a/build_configure +++ b/build_configure @@ -181,7 +181,7 @@ echo 'if test $MED_WITH_KERNEL = yes; then' >> configure.in_tmp1 echo "{" >> configure.in_tmp1 echo "AC_OUTPUT([ \\" >> configure.in_tmp1 echo " ./salome_adm/unix/F77config.h \\" >> configure.in_tmp1 -echo " ./adm_local/unix/make_omniorb \\" >> configure.in_tmp1 +echo " ./adm_local/unix/make_omniorb:${ABS_CONF_DIR}/adm_local/unix/make_omniorb.in \\" >> configure.in_tmp1 echo " ./salome_adm/unix/envScript \\" >> configure.in_tmp1 echo " ])" >> configure.in_tmp1 echo "}" >> configure.in_tmp1 @@ -196,8 +196,8 @@ echo " ./salome_adm/unix/make_module \\" >> configure.in_tmp1 # salome_adm, par le make_conclude (resp. make_commence) du module, # c'est à dire le make_conclude (resp. make_commence) du répertoire # adm_local -echo " ./adm_local/unix/make_commence \\" >> configure.in_tmp1 -echo " ./adm_local/unix/make_conclude \\" >> configure.in_tmp1 +echo " ./adm_local/unix/make_commence:${ABS_CONF_DIR}/adm_local/unix/make_commence.in \\" >> configure.in_tmp1 +echo " ./adm_local/unix/make_conclude:${ABS_CONF_DIR}/adm_local/unix/make_conclude.in \\" >> configure.in_tmp1 \rm -f configure.in_tmp2 configure.in_tmp3 touch configure.in_tmp2 diff --git a/configure.in.base b/configure.in.base index 0891d9967..0f5c0952e 100644 --- a/configure.in.base +++ b/configure.in.base @@ -49,7 +49,7 @@ if test "x${old_with_kernel}" != "x${MED_WITH_KERNEL}"; then echo "Configuration changed: without KERNEL -> with KERNEL" echo -n "Updating 'configure' script ... " cd $ROOT_SRCDIR - aclocal --acdir=adm_local/unix/config_files -I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files + aclocal -I adm_local/unix/config_files -I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files if autoconf; then echo "done" else @@ -318,6 +318,23 @@ echo CHECK_MED2 +dnl +dnl --------------------------------------------- +dnl testing MPI +dnl --------------------------------------------- +dnl + +CHECK_MPI +CHECK_MPICH + +echo +echo ---------------------------------------------- +echo testing CPPUNIT only required for unit testing +echo ---------------------------------------------- +echo + +CHECK_CPPUNIT + echo "MED_WITH_KERNEL ${MED_WITH_KERNEL}" if test "${MED_WITH_KERNEL}" = "yes"; then @@ -331,15 +348,6 @@ if test "${MED_WITH_KERNEL}" = "yes"; then dnl CHECK_JAVA - dnl - dnl --------------------------------------------- - dnl testing MPI - dnl --------------------------------------------- - dnl - - CHECK_MPI - CHECK_MPICH - echo echo --------------------------------------------- echo testing omniORB @@ -508,7 +516,7 @@ else fi # make other build directories -for rep in salome_adm adm_local doc bin/salome include/salome lib/salome share/salome/resources idl +for rep in salome_adm adm_local doc bin/salome include/salome lib${LIB_LOCATION_SUFFIX}/salome share/salome/resources idl do # if test ! -d $rep ; then # eval mkdir $rep diff --git a/doc/MEDMEM/Makefile.in b/doc/MEDMEM/Makefile.in index 7595e14ff..b06d7820e 100644 --- a/doc/MEDMEM/Makefile.in +++ b/doc/MEDMEM/Makefile.in @@ -15,20 +15,28 @@ doxygen=@DOXYGEN@ # Executables targets BIN = MESHgeneral MESHcoordinates MESHconnectivities MESHINGexample FIELDcreate FIELDgeneral MEDMEM_InvokingDriverByAttachingItToAnObject MEDMEM_InvokingDriverFromStandardObjectMethod MEDMEM_InvokingDriverAtObjectCreationTime -CPPFLAGS+=$(MED2_INCLUDES) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome +LDFLAGS+= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome +LDFLAGSFORBIN+= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome -CXXFLAGS+=-ftemplate-depth-42 -I${KERNEL_ROOT_DIR}/include/salome +CPPFLAGS+=$(MED2_INCLUDES) $(HDF5_INCLUDES) +CXXFLAGS+=@CXXTMPDPTHFLAGS@ +#LDFLAGS+=$(MED2_LIBS) $(HDF5_LIBS) # change motivated by the bug KERNEL4778. -#LDFLAGS+=$(MED2_LIBS) $(HDF5_LIBS) -lSalomeLoggerServer -L${KERNEL_ROOT_DIR}/lib/salome -LDFLAGS+=$(MED2_LIBS) $(HDF5_LIBS) -L${KERNEL_ROOT_DIR}/lib/salome +LDFLAGS+=$(MED2_LIBS) $(HDF5_LIBS) -lmedmem -lmed_V2_1 $(STDLIB) -#LDFLAGSFORBIN+=$(MED2_LIBS) $(HDF5_LIBS) -lSalomeLoggerServer -L${KERNEL_ROOT_DIR}/lib/salome -lmedmem -LDFLAGSFORBIN+=$(MED2_LIBS) $(HDF5_LIBS) -lSALOMELocalTrace -L${KERNEL_ROOT_DIR}/lib/salome -lmedmem +#LDFLAGSFORBIN+=$(MED2_LIBS) $(HDF5_LIBS) +# change motivated by the bug KERNEL4778. +LDFLAGSFORBIN+=-lm $(MED2_LIBS) $(HDF5_LIBS) -lmedmem -lmed_V2_1 -LIBSFORBIN= +ifeq ($(MED_WITH_KERNEL),yes) + CPPFLAGS+= ${KERNEL_CXXFLAGS} + CXXFLAGS+= ${KERNEL_CXXFLAGS} + LDFLAGS+= ${KERNEL_LDFLAGS} -lSALOMELocalTrace + LDFLAGSFORBIN+= ${KERNEL_LDFLAGS} -lSALOMELocalTrace -lSALOMEBasics +endif -LDFLAGS= +LIBSFORBIN= LIBS= diff --git a/doc/salome/tui/MED/doxyfile b/doc/salome/tui/MED/doxyfile index a529e1b27..7b65febdb 100755 --- a/doc/salome/tui/MED/doxyfile +++ b/doc/salome/tui/MED/doxyfile @@ -3,7 +3,7 @@ #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- -PROJECT_NAME = "SALOME - MED - v.3.2.0a2" +PROJECT_NAME = "SALOME - MED - v.3.2.0b1" PROJECT_NUMBER = id#1.1 OUTPUT_DIRECTORY = ../ CREATE_SUBDIRS = NO @@ -71,8 +71,9 @@ WARN_LOGFILE = log.txt # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = ../../../share/salome/src \ - ../../../share/salome/idl -FILE_PATTERNS = *.idl *.h *.hh *.hxx *.c *.cc *.cxx *.ixx *.jxx + ../../../share/salome/idl \ + ../../../build/salome/bin +FILE_PATTERNS = *.idl *.h *.hh *.hxx *.c *.cc *.cxx *.ixx *.jxx python_extension_must_be_here RECURSIVE = YES EXCLUDE = EXCLUDE_SYMLINKS = NO diff --git a/doc/salome/tui/MED/sources/static/tree.js b/doc/salome/tui/MED/sources/static/tree.js index 46589c42c..6ea5bb6ca 100755 --- a/doc/salome/tui/MED/sources/static/tree.js +++ b/doc/salome/tui/MED/sources/static/tree.js @@ -1,4 +1,4 @@ -foldersTree = gFld("SALOME v.3.2.0a2 ", "", "") +foldersTree = gFld("SALOME v.3.2.0b1 ", "", "") insDoc(foldersTree, gLnk("Main Page", "", "main.html")) aux1 = insFld(foldersTree, gFld("TUI Reference Guide", "")) diff --git a/doc/salome/tui/Makefile.in b/doc/salome/tui/Makefile.in index 1c1967600..5434c5517 100644 --- a/doc/salome/tui/Makefile.in +++ b/doc/salome/tui/Makefile.in @@ -20,6 +20,17 @@ docs: cp -fr $(srcdir)/MED ./INPUT; \ cd INPUT; \ sed 's|../../../share/salome|$(root_srcdir)|' ./doxyfile > ./doxyfile1; \ + sed 's|../../build/salome|$(top_builddir)|' ./doxyfile1 > ./doxyfile2; \ + mv -f doxyfile2 doxyfile1; \ + echo "DOXYGEN SUPPORT PYTHON - @DOXYGEN_WITH_PYTHON@"; \ + if( test "x@DOXYGEN_WITH_PYTHON@" = "xyes"); then \ + sed 's|python_extension_must_be_here|*.py|' ./doxyfile1 > ./doxyfile2; \ + mv -f doxyfile2 doxyfile1; \ + $(doxygen) -u ./doxyfile1; \ + else \ + sed 's|python_extension_must_be_here||' ./doxyfile1 > ./doxyfile2; \ + mv -f doxyfile2 doxyfile1; \ + fi; \ mv -f doxyfile1 doxyfile; \ $(doxygen) ./doxyfile; \ cd ..; \ diff --git a/idl/Compo1Py.idl b/idl/Compo1Py.idl index 5b53f9db0..35b2fbd1a 100644 --- a/idl/Compo1Py.idl +++ b/idl/Compo1Py.idl @@ -20,10 +20,10 @@ #include "SALOME_Component.idl" #include "MED.idl" -module Engines +module Compo1Py_ORB { - interface Compo1Py : Component + interface Compo1Py : Engines::Component { void Initialise(in string medFile); SALOME_MED::MESH Calcul1(); diff --git a/idl/Makefile.in b/idl/Makefile.in index 076128e90..a0f1340a8 100644 --- a/idl/Makefile.in +++ b/idl/Makefile.in @@ -30,7 +30,7 @@ $(IDL_FILES:%=$(top_builddir)/idl/salome/%):$(IDL_FILES:%=$(top_srcdir)/idl/%) lib: pyidl -PYTHON_BUILD_SITE=$(top_builddir)/lib/python$(PYTHON_VERSION)/site-packages/@PACKAGE@ +PYTHON_BUILD_SITE=$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/python$(PYTHON_VERSION)/site-packages/@PACKAGE@ pyidl: $(PYTHON_BUILD_SITE) $(IDL_FILES:%.idl=$(PYTHON_BUILD_SITE)/%_idl.py) diff --git a/resources/MEDCatalog.xml b/resources/MEDCatalog.xml index 2c28419e0..d610f69eb 100644 --- a/resources/MEDCatalog.xml +++ b/resources/MEDCatalog.xml @@ -16,7 +16,7 @@ Med MESH Patrick GOLDBRONN - 3.2.0a2 + 3.2.0b1 MED memory component 1 ModuleMed.png diff --git a/resources/SalomeApp.xml b/resources/SalomeApp.xml new file mode 100644 index 000000000..8760c1bb3 --- /dev/null +++ b/resources/SalomeApp.xml @@ -0,0 +1,11 @@ + +
+ + + +
+
+ + +
+
diff --git a/resources/geomMesh21.med b/resources/geomMesh21.med new file mode 100644 index 0000000000000000000000000000000000000000..7f78a8e93b0f78db1c81018963b44207b0611494 GIT binary patch literal 317676 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

B^z1ncUzwVc#recfEBeu4&qNkd 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 KG=cxm1pW_@5Koo> literal 0 HcmV?d00001 diff --git a/resources/geomMesh22.med b/resources/geomMesh22.med new file mode 100644 index 0000000000000000000000000000000000000000..92879c15c7c17bbb202c69f24e2627ce197f00f0 GIT binary patch literal 308664 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 literal 0 HcmV?d00001 diff --git a/src/MEDMEM/DataTest/Data/maill.00.med b/resources/maill.00.med similarity index 100% rename from src/MEDMEM/DataTest/Data/maill.00.med rename to resources/maill.00.med diff --git a/src/MEDMEM/DataTest/Data/maill.00_nofield.med b/resources/maill.00_nofield.med similarity index 100% rename from src/MEDMEM/DataTest/Data/maill.00_nofield.med rename to resources/maill.00_nofield.med diff --git a/src/MEDMEM/DataTest/Data/maill.00_nomesh.med b/resources/maill.00_nomesh.med similarity index 100% rename from src/MEDMEM/DataTest/Data/maill.00_nomesh.med rename to resources/maill.00_nomesh.med diff --git a/src/MEDMEM/DataTest/Data/maill.00_without_seg2.med b/resources/maill.00_without_seg2.med similarity index 100% rename from src/MEDMEM/DataTest/Data/maill.00_without_seg2.med rename to resources/maill.00_without_seg2.med diff --git a/src/MEDMEM/DataTest/Data/zzzz121b_without_tr6.med b/resources/zzzz121b_without_tr6.med similarity index 100% rename from src/MEDMEM/DataTest/Data/zzzz121b_without_tr6.med rename to resources/zzzz121b_without_tr6.med diff --git a/src/INTERPOLATION/MEDMEM_WrapperCells.hxx b/src/INTERPOLATION/MEDMEM_WrapperCells.hxx index ab8af2996..c37fafc73 100644 --- a/src/INTERPOLATION/MEDMEM_WrapperCells.hxx +++ b/src/INTERPOLATION/MEDMEM_WrapperCells.hxx @@ -553,7 +553,7 @@ public : type=5; int pn[4] = {0,1,2,3}; - int sb[12] = {2,0,1,3,1,2,0,2,3,1,0,2}; + int sb[12] = {2,0,1,3,1,2,0,2,3,1,3,0}; int fa[8] = {0,1,1,2,2,3,3,0}; int po[5] = {0,2,4,6,8}; nbr_noeuds = 4; @@ -590,7 +590,7 @@ public : type=6; int pn[4] = {0,1,2,3}; - int sb[12] = {2,0,1,3,1,2,0,2,3,1,0,2}; + int sb[12] = {2,0,1,3,1,2,0,2,3,1,3,0}; int fa[8] = {0,1,1,2,2,3,3,0}; int po[5] = {0,2,4,6,8}; nbr_noeuds = 8; diff --git a/src/INTERPOLATION/Makefile.in b/src/INTERPOLATION/Makefile.in index 7e566ea9d..50683a716 100644 --- a/src/INTERPOLATION/Makefile.in +++ b/src/INTERPOLATION/Makefile.in @@ -88,13 +88,13 @@ LDFLAGS+=-lm $(MED2_LIBS) $(HDF5_LIBS) -lmed_V2_1 LDFLAGSFORBIN+=-lm $(MED2_LIBS) $(HDF5_LIBS) -L../.libs -lmedmem -lmed_V2_1 ifeq ($(MED_WITH_KERNEL),yes) - CPPFLAGS+= -I${KERNEL_ROOT_DIR}/include/salome - CXXFLAGS+= -I${KERNEL_ROOT_DIR}/include/salome - #LDFLAGS+= -lSalomeLoggerServer -L${KERNEL_ROOT_DIR}/lib/salome - LDFLAGS+= -lSALOMELocalTrace -L${KERNEL_ROOT_DIR}/lib/salome + CPPFLAGS+= ${KERNEL_CXXFLAGS} + CXXFLAGS+= ${KERNEL_CXXFLAGS} + #LDFLAGS+= -lSalomeLoggerServer ${KERNEL_LDFLAGS} + LDFLAGS+= -lSALOMELocalTrace ${KERNEL_LDFLAGS} - #LDFLAGSFORBIN+= -lSalomeLoggerServer -L${KERNEL_ROOT_DIR}/lib/salome - LDFLAGSFORBIN+= -lSALOMELocalTrace -lSALOMEBasics -L${KERNEL_ROOT_DIR}/lib/salome + #LDFLAGSFORBIN+= -lSalomeLoggerServer ${KERNEL_LDFLAGS} + LDFLAGSFORBIN+= -lSALOMELocalTrace -lSALOMEBasics ${KERNEL_LDFLAGS} endif LIBSFORBIN= diff --git a/src/MED/Makefile.in b/src/MED/Makefile.in index ce244f6ce..5a4598675 100644 --- a/src/MED/Makefile.in +++ b/src/MED/Makefile.in @@ -49,15 +49,15 @@ LIB_CLIENT_IDL = SALOMEDS.idl SALOMEDS_Attributes.idl SALOME_ModuleCatalog.idl S BIN = BIN_SRC = -LDFLAGS= -L$(top_builddir)/lib/salome -LDFLAGSFORBIN= -L$(top_builddir)/lib/salome +LDFLAGS= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome +LDFLAGSFORBIN= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome # additionnal information to compil and link file -CPPFLAGS += $(OCC_INCLUDES) $(MED2_INCLUDES) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -CXXFLAGS += $(OCC_CXXFLAGS) -I${KERNEL_ROOT_DIR}/include/salome +CPPFLAGS += $(OCC_INCLUDES) $(MED2_INCLUDES) $(HDF5_INCLUDES) ${KERNEL_CXXFLAGS} +CXXFLAGS += $(OCC_CXXFLAGS) ${KERNEL_CXXFLAGS} -LDFLAGS+= $(OCC_LIBS) $(HDF5_LIBS) -L${KERNEL_ROOT_DIR}/lib/salome \ +LDFLAGS+= $(OCC_LIBS) $(HDF5_LIBS) ${KERNEL_LDFLAGS} \ -lSalomeContainer -lSalomeHDFPersist -lSalomeDS -lSalomeNS -lRegistry -lOpUtil -lMEDMEMImpl MED.hh MEDSK.cc: MED.idl diff --git a/src/MED/Med_Gen_i.cxx b/src/MED/Med_Gen_i.cxx index cfa3c0429..e95211da5 100755 --- a/src/MED/Med_Gen_i.cxx +++ b/src/MED/Med_Gen_i.cxx @@ -407,7 +407,7 @@ throw (SALOME::SALOME_Exception) SCRUTE(myIteration.size()); } */ - myField = mymed->getField(fieldName,iter,ordre); + myField = mymed->getField(fieldName,ordre,iter); } catch (const std::exception & ex) { diff --git a/src/MEDGUI/Makefile.in b/src/MEDGUI/Makefile.in index f6fdb6d63..920db6059 100644 --- a/src/MEDGUI/Makefile.in +++ b/src/MEDGUI/Makefile.in @@ -58,9 +58,9 @@ LIB_SERVER_IDL = # additionnal information to compil and link file -CPPFLAGS += $(QT_INCLUDES) $(VTK_INCLUDES) $(OCC_INCLUDES) $(PYTHON_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -I${GUI_ROOT_DIR}/include/salome ${BOOST_CPPFLAGS} +CPPFLAGS += $(QT_INCLUDES) $(VTK_INCLUDES) $(OCC_INCLUDES) $(PYTHON_INCLUDES) ${KERNEL_CXXFLAGS} ${GUI_CXXFLAGS} ${BOOST_CPPFLAGS} -LDFLAGS += -lSalomeApp -lMEDMEMImpl -lmedmem -lMEDEngine -L${KERNEL_ROOT_DIR}/lib/salome -L${GUI_ROOT_DIR}/lib/salome +LDFLAGS += -lSalomeApp -lMEDMEMImpl -lmedmem -lMEDEngine ${KERNEL_LDFLAGS} ${GUI_LDFLAGS} MED.hh MEDSK.cc: MED.idl omniidl -bcxx -Wbtp -I$(top_builddir)/idl -I${KERNEL_ROOT_DIR}/idl/salome $^ diff --git a/src/MEDMEM/MEDMEM_DriverFactory.cxx b/src/MEDMEM/MEDMEM_DriverFactory.cxx index b75a172b6..ddcd4866a 100644 --- a/src/MEDMEM/MEDMEM_DriverFactory.cxx +++ b/src/MEDMEM/MEDMEM_DriverFactory.cxx @@ -61,6 +61,24 @@ void DRIVERFACTORY::setMedFileVersionForWriting(medFileVersion version) DRIVERFACTORY::globalMedFileVersionForWriting = version; } +driverTypes DRIVERFACTORY::deduceDriverTypeFromFileName(const std::string & fileName) +{ + string extension(fileName); + unsigned int pos=extension.rfind('.'); + if(pos==string::npos) + return NO_DRIVER; + extension.erase(0,pos+1); + if(extension=="med") + return MED_DRIVER; + if(extension=="sauve" || extension=="sauv") + return GIBI_DRIVER; + if(extension=="cnc" || extension=="inp" || extension=="xyz") + return PORFLOW_DRIVER; + if(extension=="vtk") + return VTK_DRIVER; + return NO_DRIVER; +} + GENDRIVER *DRIVERFACTORY::buildDriverForMesh(driverTypes driverType, const std::string & fileName, MESH *mesh, @@ -180,7 +198,7 @@ GENDRIVER *DRIVERFACTORY::buildDriverForMed(driverTypes driverType, break ; } case MED_REMP : { - ret=new MED_MED_RDONLY_DRIVER(fileName,med); + ret=new MED_MED_RDWR_DRIVER(fileName,med); break ; } default: diff --git a/src/MEDMEM/MEDMEM_DriverFactory.hxx b/src/MEDMEM/MEDMEM_DriverFactory.hxx index 90e524d74..8249ac830 100644 --- a/src/MEDMEM/MEDMEM_DriverFactory.hxx +++ b/src/MEDMEM/MEDMEM_DriverFactory.hxx @@ -47,6 +47,8 @@ namespace MEDMEM { void setMedFileVersionForWriting(MED_EN::medFileVersion version); + driverTypes deduceDriverTypeFromFileName(const std::string & fileName); + GENDRIVER * buildDriverForMesh(driverTypes driverType, const std::string & fileName, MESH *mesh,const string & driverName, diff --git a/src/MEDMEM/MEDMEM_Field.hxx b/src/MEDMEM/MEDMEM_Field.hxx index 32c17117a..5f06aafe9 100644 --- a/src/MEDMEM/MEDMEM_Field.hxx +++ b/src/MEDMEM/MEDMEM_Field.hxx @@ -739,6 +739,7 @@ public: const int getNumberOfGeometricTypes() const throw (MEDEXCEPTION); const GAUSS_LOCALIZATION & getGaussLocalization(MED_EN::medGeometryElement geomElement) const throw (MEDEXCEPTION); + const GAUSS_LOCALIZATION * getGaussLocalizationPtr(MED_EN::medGeometryElement geomElement) const throw (MEDEXCEPTION); const int * getNumberOfGaussPoints() const throw (MEDEXCEPTION); const int getNumberOfGaussPoints( MED_EN::medGeometryElement geomElement) const throw (MEDEXCEPTION); const int getNbGaussI(int i) const throw (MEDEXCEPTION); @@ -2592,6 +2593,22 @@ FIELD::getGaussLocalization(MED_EN::medGeometryElement geomEl }; +template const GAUSS_LOCALIZATION * +FIELD::getGaussLocalizationPtr(MED_EN::medGeometryElement geomElement) const throw (MEDEXCEPTION) +{ + const char * LOC ="getGaussLocalizationPtr(MED_EN::medGeometryElement geomElement) : "; + const GAUSS_LOCALIZATION_ * locPtr=0; + + locMap::const_iterator it; + if ( ( it = _gaussModel.find(geomElement)) != _gaussModel.end() ) { + locPtr = (*it).second; + return static_cast *>(locPtr); + } + else + throw MEDEXCEPTION(LOCALIZED(STRING(LOC)<<"Can't find any GaussLocalization on this geometric type" )); + +}; + /*! Returns number of Gauss points for this medGeometryElement. diff --git a/src/MEDMEM/MEDMEM_GaussLocalization.hxx b/src/MEDMEM/MEDMEM_GaussLocalization.hxx index b488cb304..8705bfbd7 100644 --- a/src/MEDMEM/MEDMEM_GaussLocalization.hxx +++ b/src/MEDMEM/MEDMEM_GaussLocalization.hxx @@ -73,8 +73,11 @@ namespace MEDMEM { inline MED_EN::medModeSwitch getInterlacingType() const { return _interlacingType;} }; - template GAUSS_LOCALIZATION::GAUSS_LOCALIZATION() throw (MEDEXCEPTION) : _typeGeo(MED_EN::MED_NONE), _nGauss(-1), - _interlacingType(_interlacingType( SET_INTERLACING_TYPE::_interlacingType)) {}; + template GAUSS_LOCALIZATION::GAUSS_LOCALIZATION() throw (MEDEXCEPTION) : + _typeGeo(MED_EN::MED_NONE), _nGauss(-1), + _interlacingType( SET_INTERLACING_TYPE::_interlacingType) + {}; + template GAUSS_LOCALIZATION::GAUSS_LOCALIZATION(const string & locName, const MED_EN::medGeometryElement typeGeo, const int nGauss, diff --git a/src/MEDMEM/MEDMEM_GenDriver.cxx b/src/MEDMEM/MEDMEM_GenDriver.cxx index 9b88dab9e..21a471548 100644 --- a/src/MEDMEM/MEDMEM_GenDriver.cxx +++ b/src/MEDMEM/MEDMEM_GenDriver.cxx @@ -160,7 +160,8 @@ bool MEDMEM::GENDRIVER::operator ==(const GENDRIVER &genDriver) const { MESSAGE(LOC); return ( _id == genDriver._id ) && - ( _driverType == genDriver._driverType ); + ( _driverType == genDriver._driverType ) && + (_accessMode == genDriver._accessMode); }; diff --git a/src/MEDMEM/MEDMEM_GibiMeshDriver.cxx b/src/MEDMEM/MEDMEM_GibiMeshDriver.cxx index 269383e31..779cafce5 100644 --- a/src/MEDMEM/MEDMEM_GibiMeshDriver.cxx +++ b/src/MEDMEM/MEDMEM_GibiMeshDriver.cxx @@ -225,21 +225,21 @@ bool GIBI_MESH_RDONLY_DRIVER::readFile (_intermediateMED* medi, bool readFields const char* s = " NIVEAU 15 NIVEAU ERREUR 0 DIMENSION"; space_dimension = atoi( ligne + strlen( s ) + 1 ); if ( !GIBI_EQUAL( ligne, " NIVEAU" ) || space_dimension < 1 ) { - INFOS( " Could not read file: syntax error in type 4 record"); + INFOS( " Could not read file: syntax error in type 4 record" << DUMP_LINE_NB ); return false; } } else if (numero_enregistrement == ENREG_TYPE_2 ) { if ( space_dimension == 0 ) { - INFOS( "Missing ENREGISTREMENT DE TYPE 4"); + INFOS( "Missing ENREGISTREMENT DE TYPE 4" << DUMP_LINE_NB ); return false; } // FORMAT(' PILE NUMERO',I4,'NBRE OBJETS NOMMES',I8,'NBRE OBJETS',I8) getNextLine(ligne); const char *s1 = " PILE NUMERO", *s2 = "NBRE OBJETS NOMMES", *s3 = "NBRE OBJETS"; if ( ! GIBI_EQUAL( ligne, s1 ) ) { - INFOS( " Could not read file: error in type 2 record. " << ligne); + INFOS( " Could not read file: error in type 2 record. " << ligne << DUMP_LINE_NB ); return false; } ligne = ligne + strlen(s1); @@ -249,7 +249,7 @@ bool GIBI_MESH_RDONLY_DRIVER::readFile (_intermediateMED* medi, bool readFields ligne = ligne + 8 + strlen(s3); nb_objets = atoi( ligne ); if ( nb_objets_nommes<0 || nb_objets<0 ) { - INFOS(" Could not read file: " << nb_objets << " " < medi->groupes.size() ) { - INFOS("Error of field reading: wrong mesh reference "<< support_ids[ i_sub ]); + INFOS("Error of field reading: wrong mesh reference "<< + support_ids[ i_sub ] << DUMP_LINE_NB ); return false; } nb_values[ i_sub ] = getInt(); next(); // (b) nb points total_nb_values += nb_values[ i_sub ]; if ( nb_values[ i_sub ] < 0 ) { - INFOS(" Wrong nb of points: " << nb_values[ i_sub ] ); + INFOS(" Wrong nb of points: " << nb_values[ i_sub ] << DUMP_LINE_NB ); return false; } nb_comps[ i_sub ] = getInt(); next(); // (c) nb of components in i_sub @@ -607,13 +611,17 @@ bool GIBI_MESH_RDONLY_DRIVER::readFile (_intermediateMED* medi, bool readFields if ( ignoreField ) INFOS("Skip non-named field " << objet+1 << DUMP_LINE_NB); #endif - initIntReading( 1 ); + initIntReading( 4 ); int i_sub, nb_sub = getInt(); // (1) 2 6 if ( nb_sub < 1 ) { - INFOS("Error of field reading: wrong nb of subcomponents " << nb_sub); + INFOS("Error of field reading: wrong nb of subcomponents " << + nb_sub << DUMP_LINE_NB ); return false; } - getNextLine( ligne ); // (2) title + next(); next(); next(); // skip (1) <nb_sub> 2 6 + int title_length = getInt(); // <title length> + if ( title_length ) + getNextLine( ligne ); // (2) title // look for a line starting with '-' : <reference to support> do { initIntReading( nb_sub * 9 ); @@ -629,11 +637,13 @@ bool GIBI_MESH_RDONLY_DRIVER::readFile (_intermediateMED* medi, bool readFields for ( i = 0; i < 6; ++i ) // ignore 6 ints, in example 0 0 0 -2 0 3 next(); if ( support_ids[ i_sub ] < 1 || support_ids[ i_sub ] > medi->groupes.size() ) { - INFOS("Error of field reading: wrong mesh reference "<< support_ids[ i_sub ]); + INFOS("Error of field reading: wrong mesh reference "<< + support_ids[ i_sub ] << DUMP_LINE_NB ); return false; } if ( nb_comp[ i_sub ] < 1 ) { - INFOS("Error of field reading: wrong nb of components " << nb_comp[ i_sub ]); + INFOS("Error of field reading: wrong nb of components " << + nb_comp[ i_sub ] << DUMP_LINE_NB ); return false; } total_nb_comp += nb_comp[ i_sub ]; @@ -665,7 +675,8 @@ bool GIBI_MESH_RDONLY_DRIVER::readFile (_intermediateMED* medi, bool readFields // component types must be the same if ( index() > 0 && comp_type[ index() ] != comp_type[ index() - 1] ) { INFOS( "Error of field reading: diff component types <" - << comp_type[ index() ] << "> != <" << comp_type[ index() - 1 ] << ">"); + << comp_type[ index() ] << "> != <" << comp_type[ index() - 1 ] + << ">" << DUMP_LINE_NB ); return false; } } @@ -1118,11 +1129,86 @@ static void getReverseVector (const medGeometryElement type, swapVec[4] = make_pair( 12, 15 ); swapVec[5] = make_pair( 13, 14 ); swapVec[6] = make_pair( 17, 19 ); + break; + case MED_TRIA6: + swapVec.resize(2); + swapVec[0] = make_pair( 1, 2 ); + swapVec[1] = make_pair( 3, 5 ); + break; + case MED_QUAD8: + swapVec.resize(3); + swapVec[0] = make_pair( 1, 3 ); + swapVec[1] = make_pair( 4, 7 ); + swapVec[2] = make_pair( 5, 6 ); + break; default:; } END_OF("void getReverseVector()"); } +//======================================================================= +//function : reverse +//purpose : inverse element orientation using vector of indices to swap +//======================================================================= + +static void reverse(const _maille & aMaille, const vector<pair<int,int> > & swapVec ) +{ + _maille* ma = (_maille*) & aMaille; + for ( int i = 0; i < swapVec.size(); ++i ) { + _maille::iter tmp = ma->sommets[ swapVec[i].first ]; + ma->sommets[ swapVec[i].first ] = ma->sommets[ swapVec[i].second ]; + ma->sommets[ swapVec[i].second ] = tmp; + } + if ( swapVec.empty() ) + ma->reverse = true; + else + ma->reverse = false; +} + +//======================================================================= +//function : getGibi2MedConnectivity +//purpose : return array of indices to transform GIBI connectivity to MED one +//======================================================================= + +static const int * getGibi2MedConnectivity( const medGeometryElement type ) +{ + static vector<const int*> conn; + static int hexa20 [] = {0,6,4,2, 12,18,16,14, 7,5,3,1, 19,17,15,13, 8,11,10,9}; + static int penta15[] = {0,2,4, 9,11,13, 1,3,5, 10,12,14, 6,7,3}; + static int pyra13 [] = {0,2,4,6, 12, 1,3,5,7, 8,9,10,11}; + static int tetra10[] = {0,2,4, 9, 1,3,5, 6,7,8}; + static int quad8 [] = {0,2,4,6, 1,3,5,7}; + static int tria6 [] = {0,2,4, 1,3,5}; + if ( conn.empty() ) { + conn.resize( MED_HEXA20 + 1, 0 ); + conn[ MED_HEXA20 ] = hexa20; + conn[ MED_PENTA15] = penta15; + conn[ MED_PYRA13 ] = pyra13; + conn[ MED_TETRA10] = tetra10; + conn[ MED_TRIA6 ] = tria6; + conn[ MED_QUAD8 ] = quad8; + } + return conn[ type ]; +} + +//======================================================================= +//function : fixConnectivity +//purpose : GIBI connectivity -> MED one +//======================================================================= + +static inline void fixConnectivity(const _maille & aMaille ) +{ + if ( const int * conn = getGibi2MedConnectivity( aMaille.geometricType )) { + _maille* ma = (_maille*) & aMaille; + //cout << "###### BEFORE fixConnectivity() " << *ma << endl; + vector< _maille::iter > newSommets( ma->sommets.size() ); + for ( int i = 0; i < newSommets.size(); ++i ) + newSommets[ i ] = ma->sommets[ conn[ i ]]; + ma->sommets = newSommets; + //cout << "###### AFTER fixConnectivity() " << *ma << endl; + } +} + //======================================================================= //function : orientElements //purpose : @@ -1133,6 +1219,9 @@ static void orientElements( _intermediateMED& medi ) MESSAGE("orientElements()"); set<_maille>::iterator elemIt = medi.maillage.begin(); + int type = -100; + vector< pair<int,int> > swapVec; + if ( elemIt->sommets[0]->second.coord.size() == 2 ) { // space dimension // -------------------------- @@ -1142,8 +1231,13 @@ static void orientElements( _intermediateMED& medi ) for ( ; elemIt != medi.maillage.end(); elemIt++ ) if ( elemIt->dimension() == 2 ) { + // fix connectivity of quadratic faces + fixConnectivity( *elemIt ); + // look for index of the most left node int iLeft = 0, iNode, nbNodes = elemIt->sommets.size(); + if ( nbNodes > 4 ) // quadratic face + nbNodes /= 2; double minX = elemIt->sommets[0]->second.coord[0]; for ( iNode = 1; iNode < nbNodes; ++iNode ) { @@ -1173,113 +1267,22 @@ static void orientElements( _intermediateMED& medi ) yLN /= modLN; // summury direction of neighboring links must be positive bool clockwise = ( yPL + yLN > 0 ); - elemIt->reverse = ( !clockwise ); + if ( !clockwise ) { + if ( elemIt->geometricType != type ) { + type = elemIt->geometricType; + getReverseVector( type, swapVec ); + } + reverse( *elemIt, swapVec ); + } } } } else { - int type = -100; - vector< pair<int,int> > swapVec; - for ( ; elemIt != medi.maillage.end(); elemIt++ ) { - if ( elemIt->dimension() == 3 ) - { - // --------------------------------------------------- - // Orient volumes according to MED conventions: - // normal of a bottom (first) face should be downward - // --------------------------------------------------- - - int nbBottomNodes = 0; - switch ( elemIt->geometricType ) { - case MED_TETRA4: - case MED_TETRA10: - case MED_PENTA6: - case MED_PENTA15: - nbBottomNodes = 3; break; - case MED_PYRA5: - case MED_PYRA13: - case MED_HEXA8: - case MED_HEXA20: - nbBottomNodes = 4; break; - default: continue; - } - // find a normal to the bottom face - const _noeud* n[4] = { - &elemIt->sommets[0]->second, // 3 bottom nodes - &elemIt->sommets[1]->second, - &elemIt->sommets[2]->second, - &elemIt->sommets[nbBottomNodes]->second };// a top node - double vec01 [3] = { // vector n[0]-n[1] - n[1]->coord[0] - n[0]->coord[0], - n[1]->coord[1] - n[0]->coord[1], - n[1]->coord[2] - n[0]->coord[2], }; - double vec02 [3] = { // vector n[0]-n[2] - n[2]->coord[0] - n[0]->coord[0], - n[2]->coord[1] - n[0]->coord[1], - n[2]->coord[2] - n[0]->coord[2] }; - double normal [3] = { // vec01 ^ vec02 - vec01[1] * vec02[2] - vec01[2] * vec02[1], - vec01[2] * vec02[0] - vec01[0] * vec02[2], - vec01[0] * vec02[1] - vec01[1] * vec02[0] }; - // check if the 102 angle is convex - if ( nbBottomNodes > 3 ) { - const _noeud* n3 = &elemIt->sommets[nbBottomNodes-1]->second;// last bottom node - double vec03 [3] = { // vector n[0]-n3 - n3->coord[0] - n[0]->coord[0], - n3->coord[1] - n[0]->coord[1], - n3->coord[2] - n[0]->coord[2], }; - if ( fabs( normal[0]+normal[1]+normal[2] ) <= DBL_MIN ) { // vec01 || vec02 - normal[0] = vec01[1] * vec03[2] - vec01[2] * vec03[1]; // vec01 ^ vec03 - normal[1] = vec01[2] * vec03[0] - vec01[0] * vec03[2]; - normal[2] = vec01[0] * vec03[1] - vec01[1] * vec03[0]; - } - else { - double vec [3] = { // normal ^ vec01 - normal[1] * vec01[2] - normal[2] * vec01[1], - normal[2] * vec01[0] - normal[0] * vec01[2], - normal[0] * vec01[1] - normal[1] * vec01[0] }; - double dot2 = vec[0]*vec03[0] + vec[1]*vec03[1] + vec[2]*vec03[2]; // vec*vec03 - if ( dot2 < 0 ) { // concave -> reverse normal - normal[0] *= -1; - normal[1] *= -1; - normal[2] *= -1; - } - } - } - // direction from top to bottom - vector<double> tbDir(3); - tbDir[0] = n[0]->coord[0] - n[3]->coord[0]; - tbDir[1] = n[0]->coord[1] - n[3]->coord[1]; - tbDir[2] = n[0]->coord[2] - n[3]->coord[2]; - // compare 2 directions: normal and top-bottom - double dot = normal[0]*tbDir[0] + normal[1]*tbDir[1] + normal[2]*tbDir[2]; - bool reverse = ( dot < 0. ); - if ( reverse ) { - if ( elemIt->geometricType != type ) { - type = elemIt->geometricType; - getReverseVector( type, swapVec ); -// INFOS("vec01: " <<vec01[0] << " " <<vec01[1] << " " << vec01[2]); -// INFOS("vec02: " <<vec02[0] << " " <<vec02[1] << " " << vec02[2]); -// INFOS("normal: " <<normal[0] << " " <<normal[1] << " " << normal[2]); -// INFOS("tb: " << tbDir[0] << " " <<tbDir[1] << " " << tbDir[2]); -// INFOS( *elemIt ); -// for ( vector< _maille::iter >::const_iterator si = elemIt->sommets.begin(); -// si != elemIt->sommets.end(); si++ ) -// INFOS( (*si)->second ); - } - _maille* ma = (_maille*) & (*elemIt); - for ( int i = 0; i < swapVec.size(); ++i ) { - _maille::iter tmp = ma->sommets[ swapVec[i].first ]; - ma->sommets[ swapVec[i].first ] = ma->sommets[ swapVec[i].second ]; - ma->sommets[ swapVec[i].second ] = tmp; - } - } - } // dimension() == 3 - } // loop on maillage - // -------------------------------------- // orient equally all connected 3D faces // -------------------------------------- + // quadratic faces will be reversed in the following fixConnectivity(); // fill map of links and their faces set<const _maille*> faces; @@ -1396,6 +1399,106 @@ static void orientElements( _intermediateMED& medi ) if ( !manifold ) INFOS(" -> Non manifold mesh, faces orientation may be incorrect"); + + // --------------------------------------------------- + // Orient volumes according to MED conventions: + // normal of a bottom (first) face should be downward, + // fix connectivity of quadratic elements + // --------------------------------------------------- + + for ( ; elemIt != medi.maillage.end(); elemIt++ ) { + + // GIBI connectivity -> MED one + fixConnectivity( *elemIt ); + + // reverse quadratic faces + if ( elemIt->reverse ) { + if ( elemIt->geometricType != type ) { + type = elemIt->geometricType; + getReverseVector( type, swapVec ); + } + reverse ( *elemIt, swapVec ); + } + + // treate volumes + if ( elemIt->dimension() == 3 ) + { + int nbBottomNodes = 0; + switch ( elemIt->geometricType ) { + case MED_TETRA4: + case MED_TETRA10: + case MED_PENTA6: + case MED_PENTA15: + nbBottomNodes = 3; break; + case MED_PYRA5: + case MED_PYRA13: + case MED_HEXA8: + case MED_HEXA20: + nbBottomNodes = 4; break; + default: continue; + } + + // find a normal to the bottom face + const _noeud* n[4] = { + &elemIt->sommets[0]->second, // 3 bottom nodes + &elemIt->sommets[1]->second, + &elemIt->sommets[2]->second, + &elemIt->sommets[nbBottomNodes]->second };// a top node + double vec01 [3] = { // vector n[0]-n[1] + n[1]->coord[0] - n[0]->coord[0], + n[1]->coord[1] - n[0]->coord[1], + n[1]->coord[2] - n[0]->coord[2], }; + double vec02 [3] = { // vector n[0]-n[2] + n[2]->coord[0] - n[0]->coord[0], + n[2]->coord[1] - n[0]->coord[1], + n[2]->coord[2] - n[0]->coord[2] }; + double normal [3] = { // vec01 ^ vec02 + vec01[1] * vec02[2] - vec01[2] * vec02[1], + vec01[2] * vec02[0] - vec01[0] * vec02[2], + vec01[0] * vec02[1] - vec01[1] * vec02[0] }; + // check if the 102 angle is convex + if ( nbBottomNodes > 3 ) { + const _noeud* n3 = &elemIt->sommets[nbBottomNodes-1]->second;// last bottom node + double vec03 [3] = { // vector n[0]-n3 + n3->coord[0] - n[0]->coord[0], + n3->coord[1] - n[0]->coord[1], + n3->coord[2] - n[0]->coord[2], }; + if ( fabs( normal[0]+normal[1]+normal[2] ) <= DBL_MIN ) { // vec01 || vec02 + normal[0] = vec01[1] * vec03[2] - vec01[2] * vec03[1]; // vec01 ^ vec03 + normal[1] = vec01[2] * vec03[0] - vec01[0] * vec03[2]; + normal[2] = vec01[0] * vec03[1] - vec01[1] * vec03[0]; + } + else { + double vec [3] = { // normal ^ vec01 + normal[1] * vec01[2] - normal[2] * vec01[1], + normal[2] * vec01[0] - normal[0] * vec01[2], + normal[0] * vec01[1] - normal[1] * vec01[0] }; + double dot2 = vec[0]*vec03[0] + vec[1]*vec03[1] + vec[2]*vec03[2]; // vec*vec03 + if ( dot2 < 0 ) { // concave -> reverse normal + normal[0] *= -1; + normal[1] *= -1; + normal[2] *= -1; + } + } + } + // direction from top to bottom + vector<double> tbDir(3); + tbDir[0] = n[0]->coord[0] - n[3]->coord[0]; + tbDir[1] = n[0]->coord[1] - n[3]->coord[1]; + tbDir[2] = n[0]->coord[2] - n[3]->coord[2]; + // compare 2 directions: normal and top-bottom + double dot = normal[0]*tbDir[0] + normal[1]*tbDir[1] + normal[2]*tbDir[2]; + if ( dot < 0. ) { // need reverse + if ( elemIt->geometricType != type ) { + type = elemIt->geometricType; + getReverseVector( type, swapVec ); + } + reverse( *elemIt, swapVec ); + } + } // dimension() == 3 + } // loop on maillage + + } // space dimension == 3 } @@ -1802,6 +1905,19 @@ void GIBI_MESH_WRONLY_DRIVER::writeElements (medGeometryElement geomType, char* zeroI8 = " 0"; // FORMAT(I8) int nbElemNodes = geomType % 100; + // indices to transform MED connectivity to GIBI one + vector< int > toGibiConn; + toGibiConn.reserve( nbElemNodes ); + if ( const int * toMedConn = getGibi2MedConnectivity( geomType )) { + toGibiConn.resize( nbElemNodes ); + for ( int i = 0; i < nbElemNodes; ++i ) + toGibiConn[ toMedConn[ i ]] = i; + } + else { + while ( toGibiConn.size() < nbElemNodes ) + toGibiConn.push_back( toGibiConn.size() ); + } + // count total nb of elements int nbElements = 0; list< typeData >::iterator td = typeDataList.begin(); @@ -1844,7 +1960,7 @@ void GIBI_MESH_WRONLY_DRIVER::writeElements (medGeometryElement geomType, { int nodeId = nodalConnectIndex[ iElem - 1 ] - 1; for ( int iNode = 0; iNode < nbElemNodes; ++iNode, fcount++ ) { - _gibi << setw(8) << nodalConnect[ nodeId++ ]; + _gibi << setw(8) << nodalConnect[ nodeId + toGibiConn[ iNode ]]; } } } @@ -2170,10 +2286,14 @@ void GIBI_MESH_WRONLY_DRIVER::writeSupportsAndMesh() _gibi.setf( ios_base::uppercase ); const double * coords = _ptrMesh->getCoordinates(MED_FULL_INTERLACE); int j = 0; + const double precision = 1.e-99; // PAL12077 for ( fcount.init(3),i = 0; i < nbNodes; ++i, j += dim ) { - for ( int iCoord = 0; iCoord < dim; ++iCoord, fcount++ ) - _gibi << setw(22) << coords[ j + iCoord ]; + for ( int iCoord = 0; iCoord < dim; ++iCoord, fcount++ ) { + double coo = coords[ j + iCoord ]; + bool zero = ( -precision < coo && coo < precision ); + _gibi << setw(22) << ( zero ? 0.0 : coo ); + } _gibi << setw(22) << 0.0; // densite fcount++; } diff --git a/src/MEDMEM/MEDMEM_Med.cxx b/src/MEDMEM/MEDMEM_Med.cxx index ec9cbaadf..b8359d72e 100644 --- a/src/MEDMEM/MEDMEM_Med.cxx +++ b/src/MEDMEM/MEDMEM_Med.cxx @@ -331,6 +331,8 @@ void MED::read (int index/*=0*/) const char * LOC = "MED::read (int index=0): "; BEGIN_OF(LOC); + SCRUTE(index); + if (_drivers[index]) { // open and close are made by all objects ! SCRUTE(index); diff --git a/src/MEDMEM/MEDMEM_Med.hxx b/src/MEDMEM/MEDMEM_Med.hxx index 44c711827..97974a304 100644 --- a/src/MEDMEM/MEDMEM_Med.hxx +++ b/src/MEDMEM/MEDMEM_Med.hxx @@ -30,7 +30,7 @@ # include "MEDMEM_define.hxx" # include "MEDMEM_Exception.hxx" # include "MEDMEM_GenDriver.hxx" - +# include "MEDMEM_Field.hxx" namespace MEDMEM { class MESH; @@ -127,6 +127,10 @@ public: deque<DT_IT_> getFieldIteration (const string & fieldName) const throw (MEDEXCEPTION) ; FIELD_ * getField ( const string & fieldName, const int dt, const int it) const throw (MEDEXCEPTION) ; + template<class T> + FIELD<T> * getFieldT ( const string & fieldName, + const int dt, const int it) const throw (MEDEXCEPTION) ; + FIELD_ * getField2 ( const string & fieldName, double time, int it=0) const throw (MEDEXCEPTION) ; @@ -141,7 +145,19 @@ public: //friend ostream & operator<<(ostream &os,const MED & med); }; -}; + +template<class T> +FIELD<T> * MED::getFieldT( const string & fieldName, const int dt, const int it) const throw (MEDEXCEPTION) +{ + const char *LOC="Unexpected type of field"; + FIELD_ retUp=getField(fieldName,dt,it); + FIELD<T> *ret=dynamic_cast< FIELD<T> * >(retUp); + if(!ret) + throw MED_EXCEPTION ( LOCALIZED( STRING(LOC) ) ); + return ret; +} + +} #endif diff --git a/src/MEDMEM/MEDMEM_MedFieldDriver22.hxx b/src/MEDMEM/MEDMEM_MedFieldDriver22.hxx index 97cff3838..9882667a1 100644 --- a/src/MEDMEM/MEDMEM_MedFieldDriver22.hxx +++ b/src/MEDMEM/MEDMEM_MedFieldDriver22.hxx @@ -887,18 +887,50 @@ template <class T> void MED_FIELD_RDONLY_DRIVER22<T>::read(void) this->getMeshGeometricTypeFromFile(id,meshName,entityType,meshGeoType, meshNbOfElOfType,meshNbOfElOfTypeC); + SCRUTE(meshGeoType.size()); + SCRUTE(MESHgeoType.size()); + SCRUTE(meshNbOfElOfTypeC.size()); + SCRUTE(MESHnbOfElOfTypeC.size()); + + if (meshGeoType.size() != MESHgeoType.size()) + { + for (int i = 0; i<meshGeoType.size();i++) + MESSAGE("debug meshGeotype " << meshGeoType[i]); + + for (int i = 0; i<MESHgeoType.size();i++) + MESSAGE("debug MESHgeoType. " << MESHgeoType[i]); + } + + if (meshNbOfElOfTypeC.size() == MESHnbOfElOfTypeC.size()) + { + for (int i = 0; i<meshNbOfElOfTypeC.size();i++) + MESSAGE("debug meshNbOfElOfTypeC " << meshNbOfElOfTypeC[i]); + + for (int i = 0; i<MESHnbOfElOfTypeC.size();i++) + MESSAGE("debug MESHnbOfElOfTypeC " << MESHnbOfElOfTypeC[i]); + } if (fileHasMesh && haveSupport ) if ( ( meshGeoType != MESHgeoType ) || (meshNbOfElOfTypeC != MESHnbOfElOfTypeC) ) - throw MEDEXCEPTION(LOCALIZED( STRING(LOC) <<": Error while getting mesh information from file for FIELD "<< fieldName - << " on entity " << MED_EN::entNames[entityType] - << " with (it,or) = (" - << MED_FIELD_DRIVER<T>::_ptrField->_iterationNumber << "," - << MED_FIELD_DRIVER<T>::_ptrField->_orderNumber << ")" - << " on mesh " << meshName - << " : geometric types or number of elements by type differs from MESH object !" - ) - ); + { + MESSAGE("Warning MedField driver 21 while getting mesh information from file for FIELD "<< fieldName + << " on entity " << MED_EN::entNames[entityType] + << " with (it,or) = (" + << MED_FIELD_DRIVER<T>::_ptrField->_iterationNumber << "," + << MED_FIELD_DRIVER<T>::_ptrField->_orderNumber << ")" + << " on mesh " << meshName + << " : geometric types or number of elements by type differs from MESH object !"); + +// throw MEDEXCEPTION(LOCALIZED( STRING(LOC) <<": Error while getting mesh information from file for FIELD "<< fieldName +// << " on entity " << MED_EN::entNames[entityType] +// << " with (it,or) = (" +// << MED_FIELD_DRIVER<T>::_ptrField->_iterationNumber << "," +// << MED_FIELD_DRIVER<T>::_ptrField->_orderNumber << ")" +// << " on mesh " << meshName +// << " : geometric types or number of elements by type differs from MESH object !" +// ) +// ); + } if ( !fileHasMesh && !haveSupport ) throw MEDEXCEPTION(LOCALIZED( STRING(LOC) <<": Error while getting mesh information for FIELD "<< fieldName diff --git a/src/MEDMEM/MEDMEM_MedMedDriver21.cxx b/src/MEDMEM/MEDMEM_MedMedDriver21.cxx index b17640a28..4fdcc7826 100644 --- a/src/MEDMEM/MEDMEM_MedMedDriver21.cxx +++ b/src/MEDMEM/MEDMEM_MedMedDriver21.cxx @@ -727,7 +727,7 @@ void MED_MED_WRONLY_DRIVER21::write(void ) const current = (*currentMesh).second->addDriver(MED_DRIVER,_fileName,(*currentMesh).second->getName()); // put right _id in Mesh driver (same as this._id) (*currentMesh).second->_drivers[current]->setId( getId() ); - //(*currentMesh).second->write(current) ; + (*currentMesh).second->write(current) ; } for ( currentField=_meshName.begin();currentField != _meshName.end(); currentField++ ) { @@ -735,11 +735,11 @@ void MED_MED_WRONLY_DRIVER21::write(void ) const current = (*currentField).first->addDriver(MED_DRIVER,_fileName,(*currentField).first->getName()); // put right _id in Field driver (same as this._id) (*currentField).first->_drivers[current]->setId( getId() ); - //(*currentField).first->write(current) ; + (*currentField).first->write(current) ; } // that's work, but it is more efficenty to write directly when we had driver, no ? - writeFrom(); + // writeFrom(); END_OF(LOC); diff --git a/src/MEDMEM/MEDMEM_MedMedDriver22.cxx b/src/MEDMEM/MEDMEM_MedMedDriver22.cxx index aec34b044..08cb41d03 100644 --- a/src/MEDMEM/MEDMEM_MedMedDriver22.cxx +++ b/src/MEDMEM/MEDMEM_MedMedDriver22.cxx @@ -808,7 +808,7 @@ void MED_MED_WRONLY_DRIVER22::write(void ) const current = (*currentMesh).second->addDriver(MED_DRIVER,_fileName,(*currentMesh).second->getName()); // put right _id in Mesh driver (same as this._id) (*currentMesh).second->_drivers[current]->setId( getId() ); - //(*currentMesh).second->write(current) ; + (*currentMesh).second->write(current) ; } for ( currentField=_meshName.begin();currentField != _meshName.end(); currentField++ ) { @@ -816,11 +816,11 @@ void MED_MED_WRONLY_DRIVER22::write(void ) const current = (*currentField).first->addDriver(MED_DRIVER,_fileName,(*currentField).first->getName()); // put right _id in Field driver (same as this._id) (*currentField).first->_drivers[current]->setId( getId() ); - //(*currentField).first->write(current) ; + (*currentField).first->write(current) ; } // that's work, but it is more efficenty to write directly when we had driver, no ? - writeFrom(); + //writeFrom(); END_OF(LOC); diff --git a/src/MEDMEM/MEDMEM_MedMeshDriver21.cxx b/src/MEDMEM/MEDMEM_MedMeshDriver21.cxx index 25d07bd20..cdd559c02 100644 --- a/src/MEDMEM/MEDMEM_MedMeshDriver21.cxx +++ b/src/MEDMEM/MEDMEM_MedMeshDriver21.cxx @@ -2471,6 +2471,13 @@ int MED_MESH_WRONLY_DRIVER21::writeFamilies(vector<FAMILY*> & families ) const { err =med_2_1::_MEDdatagroupOuvrir(_medIdt,const_cast <char *> (dataGroupFam.c_str()) ) ; if ( err < MED_VALID ) { SCRUTE(err); + if ( families[i]->getName().size() > MED_TAILLE_NOM ) + throw MEDEXCEPTION + ( LOCALIZED(STRING(LOC) << "The size of the name of the family |" << i+1 + << "| |" << families[i]->getName() + << "| with identifier |" << families[i]->getIdentifier() << "| is |" + << families[i]->getName().size() <<"| and is more than |" + << MED_TAILLE_NOM << "|")) ; MESSAGE(LOC<<"families[i]->getName().c_str() : "<<families[i]->getName().c_str()); MESSAGE(LOC<<"_meshName.c_str() : "<<_meshName.c_str()); diff --git a/src/MEDMEM/MEDMEM_MedMeshDriver22.cxx b/src/MEDMEM/MEDMEM_MedMeshDriver22.cxx index f7e8a0143..ded1a44bd 100644 --- a/src/MEDMEM/MEDMEM_MedMeshDriver22.cxx +++ b/src/MEDMEM/MEDMEM_MedMeshDriver22.cxx @@ -2432,6 +2432,7 @@ int MED_MESH_WRONLY_DRIVER22::writeConnectivities(medEntityMesh entity) const err = MEDconnEcr(_medIdt, const_cast <char *> ( _meshName.c_str()), _ptrMesh->_spaceDimension, connectivityArray, med_2_2::MED_FULL_INTERLACE , numberOfElements, +// (med_2_2::med_entite_maillage ) entity, because Med Memory works only in Nodal connectivity (med_2_2::med_entite_maillage ) MED_CELL, (med_2_2::med_geometrie_element) types[i], med_2_2::MED_NOD); @@ -2465,7 +2466,8 @@ int MED_MESH_WRONLY_DRIVER22::writeConnectivities(medEntityMesh entity) const tmp_PolygonsConnectivityIndex, _ptrMesh->getNumberOfPolygons()+1, tmp_PolygonsConnectivity, - (med_2_2::med_entite_maillage) entity, +// (med_2_2::med_entite_maillage) entity, because Med Memory works only in Nodal connectivity + (med_2_2::med_entite_maillage) MED_CELL, med_2_2::MED_NOD); delete [] tmp_PolygonsConnectivityIndex ; delete [] tmp_PolygonsConnectivity ; @@ -2475,7 +2477,8 @@ int MED_MESH_WRONLY_DRIVER22::writeConnectivities(medEntityMesh entity) const const_cast <med_int*> (_ptrMesh->getPolygonsConnectivityIndex(MED_NODAL,entity)), _ptrMesh->getNumberOfPolygons()+1, const_cast <med_int*> (_ptrMesh->getPolygonsConnectivity(MED_NODAL,entity)), - (med_2_2::med_entite_maillage) entity, +// (med_2_2::med_entite_maillage) entity, because Med Memory works only in Nodal connectivity + (med_2_2::med_entite_maillage) MED_CELL, med_2_2::MED_NOD); #endif @@ -2563,25 +2566,27 @@ int MED_MESH_WRONLY_DRIVER22::writeConnectivities(medEntityMesh entity) const for ( ii = 0 ; ii < numberOfElements ; ii++ ) tmp_Connectivity[ii] = connectivity[ii] ; err = med_2_2::MEDconnEcr(_medIdt, - const_cast <char *> ( _meshName.c_str()), - _ptrMesh->_spaceDimension, - tmp_Connectivity, - med_2_2::MED_FULL_INTERLACE, - numberOfElements, - (med_2_2::med_entite_maillage ) entity, - (med_2_2::med_geometrie_element) types[i], - med_2_2::MED_DESC ); + const_cast <char *> ( _meshName.c_str()), + _ptrMesh->_spaceDimension, + tmp_Connectivity, + med_2_2::MED_FULL_INTERLACE, + numberOfElements, +// (med_2_2::med_entite_maillage ) entity, because Med Memory works only in Nodal connectivity + (med_2_2::med_entite_maillage) MED_CELL, + (med_2_2::med_geometrie_element) types[i], + med_2_2::MED_DESC ); delete [] tmp_Connectivity ; #else err = med_2_2::MEDconnEcr(_medIdt, - const_cast <char *> ( _meshName.c_str()), - _ptrMesh->_spaceDimension, - const_cast <int *> (connectivity), - med_2_2::MED_FULL_INTERLACE, - numberOfElements, - (med_2_2::med_entite_maillage ) entity, - (med_2_2::med_geometrie_element) types[i], - med_2_2::MED_DESC ); + const_cast <char *> ( _meshName.c_str()), + _ptrMesh->_spaceDimension, + const_cast <int *> (connectivity), + med_2_2::MED_FULL_INTERLACE, + numberOfElements, +// (med_2_2::med_entite_maillage ) entity, because Med Memory works only in Nodal connectivity + (med_2_2::med_entite_maillage ) MED_CELL, + (med_2_2::med_geometrie_element) types[i], + med_2_2::MED_DESC ); #endif if (err<0) // ETENDRE LES EXPLICATIONS @@ -2604,14 +2609,15 @@ int MED_MESH_WRONLY_DRIVER22::writeConnectivities(medEntityMesh entity) const tmp_PolygonsConnectivityIndex[ii] = PolygonsConnectivityIndex[ii] ; med_2_2::med_int * tmp_PolygonsConnectivity = new med_2_2::med_int[_ptrMesh->getNumberOfPolygons()+1] ; const int * PolygonsConnectivity = _ptrMesh->getPolygonsConnectivity(MED_DESCENDING,entity) ; - for ( ii = 0 ; ii < _ptrMesh->getNumberOfPolygons()+1 ; ii++ ) - tmp_PolygonsConnectivity[ii] = PolygonsConnectivity[ii] ; + for ( ii = 0 ; ii < _ptrMesh->getNumberOfPolygons()+1 ; ii++ ) + tmp_PolygonsConnectivity[ii] = PolygonsConnectivity[ii] ; err = MEDpolygoneConnEcr(_medIdt, const_cast <char *> (_meshName.c_str()), tmp_PolygonsConnectivityIndex, _ptrMesh->getNumberOfPolygons()+1, tmp_PolygonsConnectivity, - (med_2_2::med_entite_maillage) entity, +// (med_2_2::med_entite_maillage) entity, because Med Memory works only in Nodal connectivity + (med_2_2::med_entite_maillage ) MED_CELL, med_2_2::MED_DESC); delete [] tmp_PolygonsConnectivityIndex ; delete [] tmp_PolygonsConnectivity ; @@ -2621,7 +2627,8 @@ int MED_MESH_WRONLY_DRIVER22::writeConnectivities(medEntityMesh entity) const const_cast <med_int*> (_ptrMesh->getPolygonsConnectivityIndex(MED_DESCENDING,entity)), _ptrMesh->getNumberOfPolygons()+1, const_cast <med_int*> (_ptrMesh->getPolygonsConnectivity(MED_DESCENDING,entity)), - (med_2_2::med_entite_maillage) entity, +// (med_2_2::med_entite_maillage) entity, because Med Memory works only in Nodal connectivity + (med_2_2::med_entite_maillage ) MED_CELL, med_2_2::MED_DESC); #endif @@ -2803,6 +2810,13 @@ int MED_MESH_WRONLY_DRIVER22::writeFamilyNumbers() const { } } + + + for (int i=0; i<NumberOfElements; i++) + SCRUTE(MEDArrayFamily[i]); + + + const int * typeCount = _ptrMesh->getGlobalNumberingIndex(entity) ; #if defined(IRIX64) || defined(OSF1) || defined(VPP5000) int lgth=NumberOfElements; @@ -2813,18 +2827,19 @@ int MED_MESH_WRONLY_DRIVER22::writeFamilyNumbers() const { for (int i=0; i<numberOfTypes; i++) { #if defined(IRIX64) || defined(OSF1) || defined(VPP5000) err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ), - temp+typeCount[i]-1,typeCount[i+1]-typeCount[i], -//CCRT med_2_2::MED_REMP , - (med_2_2::med_entite_maillage) entity, - (med_2_2::med_geometrie_element) types[i] -); + (temp+(typeCount[i]-1)),(typeCount[i+1]-typeCount[i]), + //CCRT med_2_2::MED_REMP , +// (med_2_2::med_entite_maillage) entity, because Med Memory works only in Nodal connectivity + (med_2_2::med_entite_maillage) MED_CELL, + (med_2_2::med_geometrie_element) types[i]); #else err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ), - (MEDArrayFamily+typeCount[i]-1), + (MEDArrayFamily+(typeCount[i]-1)), (typeCount[i+1]-typeCount[i]), - (med_2_2::med_entite_maillage) entity, +// (med_2_2::med_entite_maillage) entity, because Med Memory works only in Nodal connectivity + (med_2_2::med_entite_maillage) MED_CELL, (med_2_2::med_geometrie_element) types[i]); - +#endif MESSAGE("OK "<<i); if ( err != MED_VALID) throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't write family for the |"<< _ptrMesh->getNumberOfElements(entity, types[i]) @@ -2889,20 +2904,37 @@ int MED_MESH_WRONLY_DRIVER22::writeFamilyNumbers() const { } } + for (int i=0;i<numberOfElements;i++) + SCRUTE(familyArray[i]); + const int * typeCount = _ptrMesh->getGlobalNumberingIndex(entity) ; //CCRT Clutter -//CCRT#if defined(IRIX64) || defined(OSF1) || defined(VPP5000) -//CCRT int lgth=numberOfElements; -//CCRT med_2_2::med_int *temp=new med_2_2::med_int[lgth]; -//CCRT for(int i2=0;i2<lgth;i2++) -//CCRT temp[i2]=(med_2_2::med_int) (familyArray[i2]); -//CCRT#endif +#if defined(IRIX64) || defined(OSF1) || defined(VPP5000) + int lgth=numberOfElements; + med_2_2::med_int *temp=new med_2_2::med_int[lgth]; + for(int i2=0;i2<lgth;i2++) + temp[i2]=(med_2_2::med_int) (familyArray[i2]); +#endif + SCRUTE(numberOfTypes); + for (int i=0; i<numberOfTypes; i++) { int typeNumberOfElements = typeCount[i+1] - typeCount[i] ; + SCRUTE(typeNumberOfElements); + SCRUTE(typeCount[i+1]); + SCRUTE(typeCount[i]); +#if defined(IRIX64) || defined(OSF1) || defined(VPP5000) + err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ), + (temp+(typeCount[i]-1)), typeNumberOfElements, +// (med_2_2::med_entite_maillage) entity, because Med Memory works only in Nodal connectivity + (med_2_2::med_entite_maillage) MED_CELL, + (med_2_2::med_geometrie_element) types[i]); +#else + MESSAGE("On est bien la !!! entity = " << entity << " type " << types[i]); err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ), - familyArray+typeCount[i]-1, typeNumberOfElements, - (med_2_2::med_entite_maillage) entity, + (familyArray+(typeCount[i]-1)), typeNumberOfElements, +// (med_2_2::med_entite_maillage) entity, because Med Memory works only in Nodal connectivity + (med_2_2::med_entite_maillage) MED_CELL, (med_2_2::med_geometrie_element) types[i]); #endif if ( err != MED_VALID) @@ -2910,13 +2942,12 @@ int MED_MESH_WRONLY_DRIVER22::writeFamilyNumbers() const { << "| faces of geometric type |" << geoNames[types[i]] <<"|in mesh |" << _ptrMesh->_name.c_str() << "|" )); } -//CCRT there was "temp" for OSF and "familyArray" for Linux ... +//CCRT there was "temp" and "familyArray" for OSF, but only "familyArray" for Linux ... #if defined(IRIX64) || defined(OSF1) || defined(VPP5000) delete [] temp; //CCRT#endif -#else - delete[] familyArray ; #endif + delete[] familyArray ; //if (true == ToDestroy) { // int NumberOfFamilies = myFamilies->size(); // for (int i=0; i<NumberOfFamilies; i++) @@ -2935,8 +2966,8 @@ int MED_MESH_WRONLY_DRIVER22::writeFamilyNumbers() const { const medGeometryElement * types = _ptrMesh->getTypes (entity) ; int numberOfElements = _ptrMesh->getNumberOfElements(entity, MED_ALL_ELEMENTS) ; -//CCRT int * familyArray = new int[numberOfElements] ; - med_2_2::med_int * familyArray = new med_2_2::med_int[numberOfElements] ; + int * familyArray = new int[numberOfElements] ; + // med_2_2::med_int * familyArray = new int[numberOfElements] ; for (int i=0;i<numberOfElements;i++) familyArray[i]=0; @@ -2971,31 +3002,48 @@ int MED_MESH_WRONLY_DRIVER22::writeFamilyNumbers() const { } } + + for (int i=0;i<numberOfElements;i++) + SCRUTE(familyArray[i]); + + const int * typeCount = _ptrMesh->getGlobalNumberingIndex(entity) ; //CCRT : clutter : -//CCRT#if defined(IRIX64) || defined(OSF1) || defined(VPP5000) -//CCRT int lgth=numberOfElements; -//CCRT med_2_2::med_int *temp=new med_2_2::med_int[lgth]; -//CCRT for(int i2=0;i2<lgth;i2++) -//CCRT temp[i2]=(med_2_2::med_int) (familyArray[i2]); -//CCRT#endif +#if defined(IRIX64) || defined(OSF1) || defined(VPP5000) + int lgth=numberOfElements; + med_2_2::med_int *temp=new med_2_2::med_int[lgth]; + for(int i2=0;i2<lgth;i2++) + temp[i2]=(med_2_2::med_int) (familyArray[i2]); +#endif + SCRUTE(numberOfTypes); + for (int i=0; i<numberOfTypes; i++) { int typeNumberOfElements = typeCount[i+1] - typeCount[i] ; - + SCRUTE(typeNumberOfElements); + SCRUTE(typeCount[i+1]); + SCRUTE(typeCount[i]); +#if defined(IRIX64) || defined(OSF1) || defined(VPP5000) err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ), - familyArray+typeCount[i]-1, typeNumberOfElements, - (med_2_2::med_entite_maillage) entity, + (temp+(typeCount[i]-1)), typeNumberOfElements, +// (med_2_2::med_entite_maillage) entity, because Med Memory works only in Nodal connectivity + (med_2_2::med_entite_maillage) MED_CELL, (med_2_2::med_geometrie_element) types[i]); - +#else + err = MEDfamEcr(_medIdt, const_cast <char *> ( _meshName.c_str() ), + (familyArray+(typeCount[i]-1)), typeNumberOfElements, +// (med_2_2::med_entite_maillage) entity, because Med Memory works only in Nodal connectivity + (med_2_2::med_entite_maillage) MED_CELL, + (med_2_2::med_geometrie_element) types[i]); +#endif if ( err != MED_VALID) throw MEDEXCEPTION(LOCALIZED(STRING(LOC) << "Can't write family for the |"<< _ptrMesh->getNumberOfElements(entity, types[i]) << "| edges of geometric type |" << geoNames[types[i]] <<"|in mesh |" << _ptrMesh->_name.c_str() << "|" )); } -//CCRT : clutter : -//CCRT#if defined(IRIX64) || defined(OSF1) || defined(VPP5000) -//CCRT delete [] temp; -//CCRT#endif + +#if defined(IRIX64) || defined(OSF1) || defined(VPP5000) + delete [] temp; +#endif delete[] familyArray ; //if (true == ToDestroy) { // int NumberOfFamilies = myFamilies->size(); @@ -3068,6 +3116,13 @@ int MED_MESH_WRONLY_DRIVER22::writeFamilies(vector<FAMILY*> & families ) const err = med_2_2::_MEDdatagroupOuvrir(_medIdt,const_cast <char *> (dataGroupFam.c_str()) ) ; if ( err < MED_VALID ) { SCRUTE(err); + if ( families[i]->getName().size() > MED_TAILLE_NOM ) + throw MEDEXCEPTION + ( LOCALIZED(STRING(LOC) << "The size of the name of the family |" << i+1 + << "| |" << families[i]->getName() + << "| with identifier |" << families[i]->getIdentifier() << "| is |" + << families[i]->getName().size() <<"| and is more than |" + << MED_TAILLE_NOM << "|")) ; MESSAGE(LOC<<"families[i]->getName().c_str() : "<<families[i]->getName().c_str()); MESSAGE(LOC<<"_meshName.c_str() : "<<_meshName.c_str()); diff --git a/src/MEDMEM/MEDMEM_Mesh.cxx b/src/MEDMEM/MEDMEM_Mesh.cxx index f31061002..a3f055c3b 100644 --- a/src/MEDMEM/MEDMEM_Mesh.cxx +++ b/src/MEDMEM/MEDMEM_Mesh.cxx @@ -2158,6 +2158,8 @@ void MESH::createFamilies() medGeometryElement geometrictype=MED_NONE; vector<int> tab_index_types_geometriques; vector<int> tab_nombres_elements; + if ( fam->second.empty() ) + continue; // it is just a truncated long family name // scan family cells and fill the tab that are needed by the create a MED FAMILY for( int i=0; i!=fam->second.size(); ++i) @@ -2176,10 +2178,28 @@ void MESH::createFamilies() tab_nombres_elements.push_back(fam->second.size()+1-tab_index_types_geometriques.back()); tab_index_types_geometriques.push_back(fam->second.size()+1); - // create a empty MED FAMILY and fill it with the tabs we constructed + // family name sould not be longer than MED_TAILLE_NOM + string famName = fam->first; + if ( famName.size() > MED_TAILLE_NOM ) { + // try to cut off "FAM_" from the head + if ( famName.size() - 4 <= MED_TAILLE_NOM ) { + famName = famName.substr(4); + } + else { // try to make a unique name by cutting off char by char from the tail + famName.substr(0, MED_TAILLE_NOM); + map< string,vector<int> >::iterator foundName = tab_families.find( famName ); + while ( foundName != tab_families.end() && !famName.empty() ) { + famName = famName.substr( 0, famName.size() - 1 ); + foundName = tab_families.find( famName ); + } + } + tab_families[ famName ]; // add a new name in the table to assure uniqueness + } + + // create an empty MED FAMILY and fill it with the tabs we constructed FAMILY* newFam = new FAMILY(); newFam->setTotalNumberOfElements(fam->second.size()); - newFam->setName(fam->first); + newFam->setName(famName); newFam->setMesh(this); newFam->setNumberOfGeometricType(tab_types_geometriques.size()); newFam->setGeometricType(&tab_types_geometriques[0]); // we know the tab is not empy @@ -2258,28 +2278,52 @@ int MESH::getElementContainingPoint(const double *coord) { if(_spaceDimension==3) { - Meta_Wrapper<3> *fromWrapper=new Meta_Wrapper<3> (getNumberOfNodes(),const_cast<double *>(getCoordinates(MED_FULL_INTERLACE)), + Meta_Wrapper<3> fromWrapper(getNumberOfNodes(),const_cast<double *>(getCoordinates(MED_FULL_INTERLACE)), const_cast<CONNECTIVITY *>(getConnectivityptr())); - Meta_Wrapper<3> *toWrapper=new Meta_Wrapper<3> (1,const_cast<double *>(coord)); - Meta_Mapping<3> *mapping=new Meta_Mapping<3> (fromWrapper,toWrapper); - mapping->Cree_Mapping(1); - vector<int> vectormapping=mapping->Get_Mapping(); - return vectormapping[0]+1; + Meta_Wrapper<3> toWrapper(1,const_cast<double *>(coord)); + Meta_Mapping<3> mapping(&fromWrapper,&toWrapper); + mapping.Cree_Mapping(1); + return mapping.Get_Mapping()[0]+1; } else if(_spaceDimension==2) { - Meta_Wrapper<2> *fromWrapper=new Meta_Wrapper<2> (getNumberOfNodes(),const_cast<double *>(getCoordinates(MED_FULL_INTERLACE)), + Meta_Wrapper<2> fromWrapper(getNumberOfNodes(),const_cast<double *>(getCoordinates(MED_FULL_INTERLACE)), const_cast<CONNECTIVITY *>(getConnectivityptr())); - Meta_Wrapper<2> *toWrapper=new Meta_Wrapper<2> (1,const_cast<double *>(coord)); - Meta_Mapping<2> *mapping=new Meta_Mapping<2> (fromWrapper,toWrapper); - mapping->Cree_Mapping(1); - vector<int> vectormapping=mapping->Get_Mapping(); - return vectormapping[0]+1; + Meta_Wrapper<2> toWrapper(1,const_cast<double *>(coord)); + Meta_Mapping<2> mapping(&fromWrapper,&toWrapper); + mapping.Cree_Mapping(1); + return mapping.Get_Mapping()[0]+1; } else throw MEDEXCEPTION("MESH::getElementContainingPoint : invalid _spaceDimension must be equal to 2 or 3 !!!"); } +vector< vector<double> > MESH::getBoundingBox() const +{ + const double *myCoords=_coordinate->getCoordinates(MED_EN::MED_FULL_INTERLACE); + vector< vector<double> > ret(2); + int i,j; + ret[0].resize(_spaceDimension); + ret[1].resize(_spaceDimension); + for(i=0;i<_spaceDimension;i++) + { + ret[0][i]=1.e300; + ret[1][i]=-1.e300; + } + for(i=0;i<_coordinate->getNumberOfNodes();i++) + { + for(j=0;j<_spaceDimension;j++) + { + double tmp=myCoords[i*_spaceDimension+j]; + if(tmp<ret[0][j]) + ret[0][j]=tmp; + if(tmp>ret[1][j]) + ret[1][j]=tmp; + } + } + return ret; +} + //Presently disconnected in C++ void MESH::addReference() const { diff --git a/src/MEDMEM/MEDMEM_Mesh.hxx b/src/MEDMEM/MEDMEM_Mesh.hxx index dc2cf152f..0c51185a6 100644 --- a/src/MEDMEM/MEDMEM_Mesh.hxx +++ b/src/MEDMEM/MEDMEM_Mesh.hxx @@ -298,6 +298,7 @@ public : void fillSupportOnNodeFromElementList(const list<int>& listOfElt, SUPPORT *supportToFill) const throw (MEDEXCEPTION); SUPPORT *buildSupportOnElementsFromElementList(const list<int>& listOfElt, MED_EN::medEntityMesh entity) const throw (MEDEXCEPTION); int getElementContainingPoint(const double *coord); + vector< vector<double> > MESH::getBoundingBox() const; template<class T> static FIELD<T> * mergeFields(const vector< FIELD<T> * > & others, bool meshCompare=false); /*! diff --git a/src/MEDMEM/MEDMEM_Support.cxx b/src/MEDMEM/MEDMEM_Support.cxx index 167229385..49cac96a9 100644 --- a/src/MEDMEM/MEDMEM_Support.cxx +++ b/src/MEDMEM/MEDMEM_Support.cxx @@ -92,7 +92,7 @@ SUPPORT::SUPPORT(const SUPPORT & m) _totalNumberOfElements = m._totalNumberOfElements; - if (m._isOnAllElts == false) + if (m._isOnAllElts == false && m._number ) // m may be not filled SUPPORTClient _number = new MEDSKYLINEARRAY(* m._number); else _number = (MEDSKYLINEARRAY *) NULL; @@ -124,7 +124,10 @@ SUPPORT & SUPPORT::operator=(const SUPPORT & m) _totalNumberOfElements = m._totalNumberOfElements; if (m._isOnAllElts == false) { if (_number) delete _number; - _number = new MEDSKYLINEARRAY(* m._number); + if ( m._number ) // m may be not filled SUPPORTClient + _number = new MEDSKYLINEARRAY(* m._number); + else + _number = (MEDSKYLINEARRAY *) NULL; } else _number = (MEDSKYLINEARRAY *) NULL; @@ -165,7 +168,8 @@ ostream & MEDMEM::operator<<(ostream &os, const SUPPORT &my) os << "Is on all entities."<< endl; else { os << "Is not on all entities. "<< endl; - os << *my.getNumber(MED_ALL_ELEMENTS); + if ( my._number ) // m may be not filled SUPPORTClient + os << *my.getNumber(MED_ALL_ELEMENTS); } int numberoftypes = my._numberOfGeometricType ; os << "NumberOfTypes : "<<numberoftypes<<endl; @@ -204,10 +208,11 @@ void SUPPORT::update() _totalNumberOfElements=_numberOfElements[0]; } else - { // we duplicate information from _mesh + { // we duplicate information from _mesh _numberOfGeometricType=_mesh->getNumberOfTypesWithPoly(_entity); SCRUTE(_numberOfGeometricType); - _geometricType.set(_numberOfGeometricType,_mesh->getTypesWithPoly(_entity) ); + medGeometryElement * allType = _mesh->getTypesWithPoly(_entity); + _geometricType.set(_numberOfGeometricType,allType ); _numberOfElements.set(_numberOfGeometricType); _totalNumberOfElements=0; for (int i=0;i<_numberOfGeometricType;i++) @@ -215,6 +220,7 @@ void SUPPORT::update() _numberOfElements[i]=_mesh->getNumberOfElementsWithPoly(_entity,_geometricType[i]) ; _totalNumberOfElements+=_numberOfElements[i]; } + delete [] allType; } SCRUTE(_name); diff --git a/src/MEDMEM/MEDMEM_TopLevel.cxx b/src/MEDMEM/MEDMEM_TopLevel.cxx new file mode 100644 index 000000000..60c74e75b --- /dev/null +++ b/src/MEDMEM/MEDMEM_TopLevel.cxx @@ -0,0 +1,43 @@ +#include "MEDMEM_TopLevel.hxx" +#include "MEDMEM_Med.hxx" +#include "MEDMEM_Mesh.hxx" +#include "MEDMEM_Field.hxx" +#include "MEDMEM_DriverFactory.hxx" +#include "MEDMEM_MedMedDriver.hxx" + +using namespace MED_EN; +using namespace MEDMEM; + +MED *::MEDMEM::readMedInFile(const std::string& fileName) throw(MEDEXCEPTION) +{ + MED *myMedObj=new MED; + driverTypes type=DRIVERFACTORY::deduceDriverTypeFromFileName(fileName); + int id=myMedObj->addDriver(type,fileName,MED_REMP); + myMedObj->read(id); + return myMedObj; +} + +MESH *::MEDMEM::readMeshInFile(const std::string& fileName, const std::string& meshName) +{ + MESH *mesh=new MESH; + driverTypes type=DRIVERFACTORY::deduceDriverTypeFromFileName(fileName); + int id=mesh->addDriver(type,fileName,mesh->getName(),MED_REMP); + mesh->read(id); + return mesh; +} + +void ::MEDMEM::writeMedToFile(const MED *medObj, const std::string& fileName) +{ + MED *medObjNoC=(MED *)medObj;//MED::write should be a const method ... As it's not the case + driverTypes type=DRIVERFACTORY::deduceDriverTypeFromFileName(fileName); + int id=medObjNoC->addDriver(type,fileName,MED_REMP); + medObjNoC->write(id); +} + +void ::MEDMEM::writeMeshToFile(const MESH *meshObj, const std::string& fileName) +{ + MESH *meshObjNoC=(MESH *)meshObj;//MED::write should be a const method ... As it's not the case + driverTypes type=DRIVERFACTORY::deduceDriverTypeFromFileName(fileName); + int id=meshObjNoC->addDriver(type,fileName,meshObjNoC->getName(),MED_REMP); + meshObjNoC->write(id); +} diff --git a/src/MEDMEM/MEDMEM_TopLevel.hxx b/src/MEDMEM/MEDMEM_TopLevel.hxx new file mode 100644 index 000000000..5e96879d0 --- /dev/null +++ b/src/MEDMEM/MEDMEM_TopLevel.hxx @@ -0,0 +1,53 @@ +#ifndef __MEDMEM_TOPLEVEL_HXX__ +#define __MEDMEM_TOPLEVEL_HXX__ + +#include "MEDMEM_FieldForward.hxx" +#include "MEDMEM_Exception.hxx" +#include <string> + +namespace MEDMEM +{ + class MED; + class MESH; +} + +namespace MEDMEM +{ + //read part + MED *readMedInFile(const std::string& fileName) throw(MEDEXCEPTION); + MESH *readMeshInFile(const std::string& fileName, const std::string& meshName); + template<class T> + FIELD<T> *readFieldInFile(const std::string& fileName, const std::string& fieldName); + //write part + void writeMedToFile(const MED *medObj, const std::string& fileName); + void writeMeshToFile(const MESH *meshObj, const std::string& fileName); + template<class T> + void writeFieldToFile(const FIELD<T> *fieldObj, const std::string& fileName); +} + +#include "MEDMEM_Field.hxx" + +namespace MEDMEM +{ + template<class T> + FIELD<T> *readFieldInFile(const std::string& fileName, const std::string& fieldName) + { + FIELD<T> *ret=new FIELD<T>; + ret->setName(fieldName); + driverTypes type=DRIVERFACTORY::deduceDriverTypeFromFileName(fileName); + int id=ret->addDriver(type,fileName,fieldName); + ret->read(id); + return ret; + } + + template<class T> + void writeFieldToFile(const FIELD<T> *fieldObj, const std::string& fileName) + { + FIELD<T> *fieldObjNoC=(FIELD<T> *)fieldObj; + driverTypes type=DRIVERFACTORY::deduceDriverTypeFromFileName(fileName); + int id=fieldObj->addDriver(type, fileName, fieldObj->getName()); + fieldObjNoC->write(id); + } +} + +#endif diff --git a/src/MEDMEM/Makefile.in b/src/MEDMEM/Makefile.in index 401566816..9233a7582 100644 --- a/src/MEDMEM/Makefile.in +++ b/src/MEDMEM/Makefile.in @@ -82,6 +82,7 @@ MEDMEM_PolyhedronArray.hxx \ MEDMEM_MedFieldDriver22.hxx \ MEDMEM_MedMedDriver22.hxx \ MEDMEM_MedMeshDriver22.hxx \ +MEDMEM_TopLevel.hxx \ MEDMEM_Utilities.hxx \ MEDMEM_ArrayInterface.hxx \ MEDMEM_IndexCheckingPolicy.hxx \ @@ -135,6 +136,7 @@ MEDMEM_medimport_src.cxx \ MEDMEM_PolyhedronArray.cxx \ MEDMEM_MedMedDriver22.cxx \ MEDMEM_MedMeshDriver22.cxx \ +MEDMEM_TopLevel.cxx \ MEDMEM_MEDMEMgaussEcr.cxx \ MEDMEM_MEDMEMprofilEcr.cxx \ MEDMEM_MEDMEMchampLire.cxx @@ -158,10 +160,10 @@ TEST_PROGS = test_MEDMEM_ModulusArray test_MEDMEM_Array test_MEDMEM_SkyLineArray test_grid test_MEDMEM_PolyhedronArray test_MEDMEM_PolyConnectivity \ test_MEDMEM_PolyDriverMedMeshRead test_MEDMEM_PolyDriverMedMeshWrite \ test_MEDMEM_poly3D test_MEDMEM_nArray test_MEDMEM_Meshing_poly test_profil_MedFieldDriver \ - test_profil_gauss_MedFieldDriver test_GaussLocalization + test_profil_gauss_MedFieldDriver test_GaussLocalization testAnalFile -LDFLAGS+= -L$(top_builddir)/lib/salome -LDFLAGSFORBIN+= -L$(top_builddir)/lib/salome +LDFLAGS+= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome +LDFLAGSFORBIN+= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome CPPFLAGS+=$(MED2_INCLUDES) $(HDF5_INCLUDES) @@ -175,10 +177,10 @@ LDFLAGS+=$(MED2_LIBS) $(HDF5_LIBS) -lmed_V2_1 $(STDLIB) LDFLAGSFORBIN+=-lm $(MED2_LIBS) $(HDF5_LIBS) -lmed_V2_1 ifeq ($(MED_WITH_KERNEL),yes) - CPPFLAGS+= -I${KERNEL_ROOT_DIR}/include/salome - CXXFLAGS+= -I${KERNEL_ROOT_DIR}/include/salome - LDFLAGS+= -L${KERNEL_ROOT_DIR}/lib/salome -lSALOMELocalTrace - LDFLAGSFORBIN+= -L${KERNEL_ROOT_DIR}/lib/salome -lSALOMELocalTrace -lSALOMEBasics + CPPFLAGS+= ${KERNEL_CXXFLAGS} + CXXFLAGS+= ${KERNEL_CXXFLAGS} + LDFLAGS+= ${KERNEL_LDFLAGS} -lSALOMELocalTrace + LDFLAGSFORBIN+= ${KERNEL_LDFLAGS} -lSALOMELocalTrace -lSALOMEBasics endif LIBSFORBIN= diff --git a/src/MEDMEM/testAnalFile.cxx b/src/MEDMEM/testAnalFile.cxx new file mode 100644 index 000000000..420a61329 --- /dev/null +++ b/src/MEDMEM/testAnalFile.cxx @@ -0,0 +1,83 @@ +#include <string> +#include <deque> +#include <iostream> +#include "MEDMEM_MedMedDriver.hxx" +#include "MEDMEM_Med.hxx" +#include "MEDMEM_MedMeshDriver.hxx" +#include "MEDMEM_Mesh.hxx" +#include "MEDMEM_Field.hxx" +#include "MEDMEM_DriverFactory.hxx" + +using namespace std; +using namespace MEDMEM; +using namespace MED_EN; + +int main(int argc, char *argv[]) +{ + if (argc !=2) + { + cerr << "Usage : " << argv[0] + << " fileName.med where fileName.med should be a med file" << endl; + cerr << " It will then generate two med files fileNameAnal_V21.med (med V2.1 format)" << endl; + cerr << "and fileNameAnal_V21.med (med V2.2 format)" << endl << endl; + exit(-1); + } + + int i; + // This test program is more or less designed to work with file TimeStamps.med + // If you want to use it for other Med files, you have to alter the mounting in memory of the fields f1 and f2 + //string fileIn="/export/home/geay32/SALOME225/KERNEL_SRC/examples/TimeStamps.med"; + + string fileIn = argv[1] ; + const string ext=".med"; + string::size_type pos=fileIn.find(ext,0); + string baseName (fileIn, 0, pos); // nom sans extension + string fileOut21=baseName + "Anal_V21.med"; + string fileOut22=baseName + "Anal_V22.med"; + + MED *myMed=new MED; + MED_MED_RDONLY_DRIVER *driverIn=new MED_MED_RDONLY_DRIVER(fileIn,myMed); + driverIn->open(); + driverIn->readFileStruct(); + driverIn->close(); + int nbOfMeshes=myMed->getNumberOfMeshes(); + int nbOfFields=myMed->getNumberOfFields(); + cout << nbOfMeshes << " --- " << nbOfFields << endl; + deque<string> names=myMed->getMeshNames(); + for(i=0;i<nbOfMeshes;i++) + cout << names[i] << endl; + cout << "************* " << endl; + deque<string> names2=myMed->getFieldNames(); + for(i=0;i<nbOfFields;i++) + cout << names2[i] << endl; + MESH *mesh=myMed->getMesh(names[0]); + mesh->read(); + myMed->updateSupport(); + deque<DT_IT_> iterations=myMed->getFieldIteration(names2[2]); + cout << iterations.size() << endl; + FIELD_ *f1=myMed->getField(names2[2],iterations[0].dt,iterations[0].it); + FIELD_ *f2=myMed->getField(names2[2],iterations[1].dt,iterations[1].it); + FIELD<double> *f1s=(FIELD<double> *)f1; + f1s->read(); + FIELD<double> *f2s=(FIELD<double> *)f2; + f2s->read(); + DRIVERFACTORY::setMedFileVersionForWriting(V21); + int id=mesh->addDriver(MED_DRIVER,fileOut21,mesh->getName()); + mesh->write(id); + id=f1s->addDriver(MED_DRIVER, fileOut21, f1s->getName()); + f1s->write(id); + id=f2s->addDriver(MED_DRIVER, fileOut21, f2s->getName()); + f2s->write(id); + + DRIVERFACTORY::setMedFileVersionForWriting(V22); + id=mesh->addDriver(MED_DRIVER,fileOut22,mesh->getName()); + mesh->write(id); + id=f1s->addDriver(MED_DRIVER, fileOut22, f1s->getName()); + f1s->write(id); + id=f2s->addDriver(MED_DRIVER, fileOut22, f2s->getName()); + f2s->write(id); + + delete myMed; + return 0; +} + diff --git a/src/MEDMEM_I/Makefile.in b/src/MEDMEM_I/Makefile.in index e95ff91df..a71357bbe 100644 --- a/src/MEDMEM_I/Makefile.in +++ b/src/MEDMEM_I/Makefile.in @@ -61,12 +61,12 @@ BIN_SRC = BIN_SERVER_IDL = BIN_CLIENT_IDL = -LDFLAGS= -L$(top_builddir)/lib/salome -LDFLAGSFORBIN= -L$(top_builddir)/lib/salome +LDFLAGS= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome +LDFLAGSFORBIN= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome -CPPFLAGS+= $(MED2_INCLUDES) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -CXXFLAGS+= -I${KERNEL_ROOT_DIR}/include/salome -LDFLAGS+=$(MED2_LIBS) $(HDF5_LIBS) -lmedmem -L${KERNEL_ROOT_DIR}/lib/salome -lSALOMELocalTrace -lSalomeCommunication -lSalomeGenericObj +CPPFLAGS+= $(MED2_INCLUDES) $(HDF5_INCLUDES) ${KERNEL_CXXFLAGS} +CXXFLAGS+= ${KERNEL_CXXFLAGS} +LDFLAGS+=$(MED2_LIBS) $(HDF5_LIBS) -lmedmem ${KERNEL_LDFLAGS} -lSALOMELocalTrace -lSalomeCommunication -lSalomeGenericObj #LDFLAGS+=-lmedmem -L. -lSalomeContainer -lSalomeNS -lRegistry -lOpUtil -lSalomeNotification # does we put only -lSalomeContainer and compiler retrieves -lSalomeNS -lRegistry -lOpUtil ???? diff --git a/src/MEDMEM_SWIG/Makefile.in b/src/MEDMEM_SWIG/Makefile.in index 9034c4d33..3709e499f 100644 --- a/src/MEDMEM_SWIG/Makefile.in +++ b/src/MEDMEM_SWIG/Makefile.in @@ -82,12 +82,16 @@ EXPORT_PYSCRIPTS = libMEDMEM_Swig.py \ test_gibi.py \ test_porflow.py \ testDriverAscii.py \ + testGaussLocalization.py \ + testMedObj.py \ + test_profil_MedFieldDriver.py \ + testWriteAndFam.py \ testMedMemGeneral.py ############################################################################# -LDFLAGS= -L$(top_builddir)/lib/salome -LDFLAGSFORBIN= -L$(top_builddir)/lib/salome +LDFLAGS= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@//salome +LDFLAGSFORBIN= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome CPPFLAGS+= $(PYTHON_INCLUDES) $(MED2_INCLUDES) $(HDF5_INCLUDES) CXXFLAGS+= @CXXTMPDPTHFLAGS@ @@ -95,9 +99,9 @@ LIBS= $(PYTHON_LIBS) LDFLAGS+= -lmedmem $(MED2_LIBS) $(HDF5_LIBS) ifeq ($(MED_WITH_KERNEL),yes) - CPPFLAGS+= -I${KERNEL_ROOT_DIR}/include/salome - CXXFLAGS+= -I${KERNEL_ROOT_DIR}/include/salome - LDFLAGS+= -L${KERNEL_ROOT_DIR}/lib/salome -lSALOMELocalTrace + CPPFLAGS+= ${KERNEL_CXXFLAGS} + CXXFLAGS+= ${KERNEL_CXXFLAGS} + LDFLAGS+= ${KERNEL_LDFLAGS} -lSALOMELocalTrace endif ############################################################################# diff --git a/src/MEDMEM_SWIG/libMEDMEM_Swig.i b/src/MEDMEM_SWIG/libMEDMEM_Swig.i index a55f04363..f829c0fc7 100644 --- a/src/MEDMEM_SWIG/libMEDMEM_Swig.i +++ b/src/MEDMEM_SWIG/libMEDMEM_Swig.i @@ -48,6 +48,8 @@ #include "MEDMEM_Grid.hxx" #include "MEDMEM_Meshing.hxx" #include "MEDMEM_DriverFactory.hxx" +#include "MEDMEM_GaussLocalization.hxx" +#include "MEDMEM_ArrayInterface.hxx" #include "MEDMEM_SWIG_Templates.hxx" using namespace MEDMEM; @@ -78,6 +80,14 @@ typedef FIELD <int, NoInterlace> FIELDINTNOINTERLACE; %include "typemaps.i" %include "my_typemap.i" +%typecheck(SWIG_TYPECHECK_POINTER) double *, const double *, + const double * const, int *, const int *, const int * const, string *, + const string *, const string * const, medGeometryElement *, + const medGeometryElement *, const medGeometryElement * const +{ + $1 = ($input != 0); +} + /* mapping between stl string and python string */ @@ -349,6 +359,66 @@ typedef FIELD <int, NoInterlace> FIELDINTNOINTERLACE; $1 = $input; } +/* + MACRO converting C++ MEDMEM::FIELD_ pointer into a PyObject pointer rightly + casted following its value type (int or double) and its interlacing mode + (FullInterlace or NoInterlace) by calling the function SWIG_NewPointer with + the appropriate $descriptor(...) +*/ + +%define TYPEMAP_OUTPUT_FIELDT(myField) +{ + FIELD_ *arg1=myField; + PyObject *myResult=NULL; + if(arg1) + { + FIELD<double> *try1=dynamic_cast<FIELD<double> *>(arg1); + if(try1) + myResult = SWIG_NewPointerObj((void *) try1, $descriptor(FIELD<double, FullInterlace> *), 0); + else + { + FIELD<int> *try2=dynamic_cast<FIELD<int> *>(arg1); + if(try2) + myResult = SWIG_NewPointerObj((void *) try2, $descriptor(FIELD<int, FullInterlace> *), 0); + else + { + FIELD<double, NoInterlace> *try3=dynamic_cast<FIELD<double, NoInterlace> *>(arg1); + if(try3) + myResult = SWIG_NewPointerObj((void *) try3, $descriptor(FIELD<double, NoInterlace> *), 0); + else + { + FIELD<int, NoInterlace> *try4=dynamic_cast<FIELD<int, NoInterlace> *>(arg1); + if(try4) + myResult = SWIG_NewPointerObj((void *) try4, $descriptor(FIELD<int, NoInterlace> *), 0); + else + { + myResult = SWIG_NewPointerObj((void *) arg1, $descriptor(FIELD_ *), 0); + } + } + } + } + } + return myResult; +} +%enddef + +/* + MACRO to transforme a C++ deque<string> object into a proper Python List +*/ + +%define TYPEMAP_OUTPUT_DEQUE_STRING(myDeque) +{ + PyObject *py_list = PyList_New(myDeque.size()); + deque<string>::iterator iter4; + int i4=0; + for(iter4=myDeque.begin();iter4!=myDeque.end();iter4++,i4++) + { + PyList_SetItem(py_list, i4, PyString_FromString((*iter4).c_str())); + } + return py_list; +} +%enddef + /* MACRO converting C array <arrayvar> of length <size> into a PyList by calling type_converter() for each array element. @@ -510,6 +580,8 @@ class SUPPORT MESH * getMesh() const; + std::string getMeshName() const; + void setMesh(MESH * Mesh) const; medEntityMesh getEntity() const; @@ -760,6 +832,10 @@ public: const std::string& fileName, const std::string& fieldName, const int iterationNumber, const int orderNumber); + FIELD(driverTypes driverType, const std::string& fileName, + const std::string& fieldName, const int iterationNumber, + const int orderNumber); + void read(int index=0); T1 getValueIJ(int i,int j) const; @@ -800,6 +876,10 @@ public: void writeAppend(int index=0, const std::string& driverName=""); + bool getGaussPresence(); + + GAUSS_LOCALIZATION<INTERLACING_TAG> * getGaussLocalizationPtr(MED_EN::medGeometryElement geomElement); + %extend { PyObject * applyPyFunc( PyObject * func ) { @@ -925,7 +1005,7 @@ public: FIELD::getRow); } - // this method replaces getValueI() in NInterlace mode + // this method replaces getValueI() in NoInterlace mode /*%newobject getColum(int );*/ PyObject * getColumn(int index) { @@ -1487,6 +1567,8 @@ class MED void write (int index=0); + void read (int index=0); + void addField ( FIELD_ * const ptrField ); void addMesh ( MESH * const ptrMesh ); @@ -1504,6 +1586,12 @@ class MED return self->addDriver(driverType,string(fileName),access); } + PyObject *getMeshNames() + { + deque<string> list_string = self->getMeshNames(); + TYPEMAP_OUTPUT_DEQUE_STRING(list_string); + } + %newobject getMeshName(int ); const char * getMeshName(int i) { @@ -1513,6 +1601,12 @@ class MED return tmp; } + PyObject *getFieldNames() + { + deque<string> list_string = self->getFieldNames(); + TYPEMAP_OUTPUT_DEQUE_STRING(list_string); + } + %newobject getFieldName(int ); const char * getFieldName(int i) { @@ -1547,6 +1641,12 @@ class MED return self->getField(string(fieldName),dt,it); } + PyObject *getFieldT(char * fieldName, int dt, int it) + { + FIELD_ *ret=self->getField(string(fieldName),dt,it); + TYPEMAP_OUTPUT_FIELDT(ret); + } + FIELD_ * getField2(char * fieldName,double time, int it=0) { return self->getField2(string(fieldName),time,it); @@ -2163,7 +2263,7 @@ public: void read ( void ) ; %extend { - MED_FIELD_RDONLY_DRIVER(char * fileName, FIELD< T1 > * ptrField) + MED_FIELD_RDONLY_DRIVER(char * fileName, FIELD<T1, FullInterlace > * ptrField) { return new MED_FIELD_RDONLY_DRIVER< T1 >(string(fileName), ptrField); } @@ -2211,7 +2311,7 @@ public: void read ( void ) ; %extend { - MED_FIELD_WRONLY_DRIVER(char * fileName, FIELD< T1 > * ptrField) + MED_FIELD_WRONLY_DRIVER(char * fileName, FIELD<T1, FullInterlace> * ptrField) { return new MED_FIELD_WRONLY_DRIVER< T1 >(string(fileName), ptrField); } @@ -2259,7 +2359,7 @@ public: void read ( void ) ; %extend { - MED_FIELD_RDWR_DRIVER(char * fileName, FIELD< T1 > * ptrField) + MED_FIELD_RDWR_DRIVER(char * fileName, FIELD<T1, FullInterlace> * ptrField) { return new MED_FIELD_RDWR_DRIVER< T1 >(string(fileName), ptrField); } @@ -2304,15 +2404,96 @@ public: %extend { - ASCII_FIELD_DRIVER(const char *fileName, FIELD<T1> * ptrField, med_sort_direc direction, const char *priority) + ASCII_FIELD_DRIVER(const char *fileName, FIELD<T1, FullInterlace> * ptrField, med_sort_direc direction, const char *priority) { return new ASCII_FIELD_DRIVER<T1>(string(fileName), ptrField, (MED_EN::med_sort_direc)direction, priority); } } }; + %template (ASCII_FIELDDOUBLE_DRIVER) ASCII_FIELD_DRIVER< double >; %template (ASCII_FIELDINT_DRIVER) ASCII_FIELD_DRIVER< int >; +/* +*/ + + +template <class INTERLACING_TAG> class GAUSS_LOCALIZATION +{ + public: + + GAUSS_LOCALIZATION(); + + ~GAUSS_LOCALIZATION(); + + std::string getName() const ; + + medGeometryElement getType() const ; + + int getNbGauss() const ; + + medModeSwitch getInterlacingType() const; + + %extend { + GAUSS_LOCALIZATION<INTERLACING_TAG>(char * locName, + const medGeometryElement + typeGeo, + const int nGauss, + const double * cooRef, + const double * cooGauss, + const double * wg) + { + return new GAUSS_LOCALIZATION<INTERLACING_TAG>(string(locName), + typeGeo, nGauss, cooRef, + cooGauss, wg); + } + + %newobject __str__(); + const char* __str__() + { + ostringstream mess; + mess << "Python Printing GAUSS_LOCALIZATION : " << *self << endl; + return strdup(mess.str().c_str()); + } + + PyObject * getRefCoo () const + { + typedef MEDMEM_ArrayInterface<double,INTERLACING_TAG,NoGauss>::Array ArrayNoGauss; + + ArrayNoGauss cooRef = self->getRefCoo(); + int size = cooRef.getArraySize(); + double * cooRefPtr = cooRef.getPtr(); + TYPEMAP_OUTPUT_ARRAY(cooRefPtr, size, PyFloat_FromDouble, + GAUSS_LOCALIZATION::getRefCoo); + } + + PyObject * getGsCoo () const + { + typedef MEDMEM_ArrayInterface<double,INTERLACING_TAG,NoGauss>::Array ArrayNoGauss; + ArrayNoGauss cooGauss = self->getGsCoo(); + int size = cooGauss.getArraySize(); + double * cooGaussPtr = cooGauss.getPtr(); + TYPEMAP_OUTPUT_ARRAY(cooGaussPtr, size, PyFloat_FromDouble, + GAUSS_LOCALIZATION::getGsCoo); + } + + PyObject * getWeight () const + { + vector<double> wg = self->getWeight(); + int size = wg.size(); + double * wgPtr = new double [size]; + for (int index = 0; index<size; index++) + wgPtr[index] = wg[index]; + TYPEMAP_OUTPUT_ARRAY(wgPtr, size, PyFloat_FromDouble, + GAUSS_LOCALIZATION::getWeight); + delete wgPtr; + } + } +}; + +%template (GAUSS_LOCALIZATION_FULL) GAUSS_LOCALIZATION<FullInterlace> ; +%template (GAUSS_LOCALIZATION_NO) GAUSS_LOCALIZATION<NoInterlace> ; + %{ template <class T, class INTERLACING_TAG> FIELD<T, INTERLACING_TAG> * createFieldScalarProduct(FIELD<T, INTERLACING_TAG> * field1, @@ -2338,6 +2519,18 @@ public: MESSAGE("Its returns a proper cast of the input pointer :: FIELD_ --> FIELD<T>"); return (FIELD<T, INTERLACING_TAG> *) field; } + + template <class T> FIELD<T, FullInterlace> * + createTypedFieldConvertFullInterlace(const FIELD<T, NoInterlace> & field ) + { + return FieldConvert(field); + } + + template <class T> FIELD<T, NoInterlace> * + createTypedFieldConvertNoInterlace(const FIELD<T, FullInterlace> & field ) + { + return FieldConvert(field); + } %} template<class T, class INTERLACING_TAG> FIELD<T, INTERLACING_TAG> * createTypedFieldFromField(FIELD_ * field); @@ -2368,6 +2561,24 @@ template <class T, class INTERLACING_TAG> FIELD<T, INTERLACING_TAG> * createFiel template<class T, class INTERLACING_TAG> FIELD<T, INTERLACING_TAG> * createFieldFromAnalytic(SUPPORT * Support, int NumberOfComponents, PyObject * double_function); +template <class T> FIELD<T, FullInterlace> * createTypedFieldConvertFullInterlace(const FIELD<T, NoInterlace> & field ); + +%template (createFieldDoubleConvertFullInterlace) createTypedFieldConvertFullInterlace<double>; + +%template (createFieldIntConvertFullInterlace) createTypedFieldConvertFullInterlace<int>; + +template <class T> FIELD<T, NoInterlace> * createTypedFieldConvertNoInterlace(const FIELD<T, FullInterlace> & field ); + +%template (createFieldDoubleConvertNoInterlace) createTypedFieldConvertNoInterlace<double>; + +%template (createFieldIntConvertNoInterlace) createTypedFieldConvertNoInterlace<int>; + +%newobject createFieldDoubleConvertFullInterlace ; +%newobject createFieldIntConvertFullInterlace ; + +%newobject createFieldDoubleConvertNoInterlace ; +%newobject createFieldIntConvertNoInterlace ; + GRID * createGridFromMesh( MESH * aMesh ); %{ diff --git a/src/MEDMEM_SWIG/med_test3.py b/src/MEDMEM_SWIG/med_test3.py index 26c74f3c3..620d5df35 100644 --- a/src/MEDMEM_SWIG/med_test3.py +++ b/src/MEDMEM_SWIG/med_test3.py @@ -1,12 +1,7 @@ -# -# This script does not work at the moment !!! -# - - ################################################################################### # # This Python script is parsing a MED file using MED Memory from SALOME platform: -# It tests the setValue(I) function on MED fields +# It tests the setValue, setRow and setColum functions on MED fields # ################################################################################### @@ -202,57 +197,37 @@ if (nbMeshes>0): for k in range(nbOf*nbOfComp): print " Set/Get Entry * ",value[k]," / ",valueverif[k] print "" - print " Randomly set (via setValueI) and get (via getValueI) to check with the same mode ..!" + print " Randomly set (via setRow/setColumn) and get (via getRow/getColumn) to check with the same mode ..!" value = [] for k in range(nbOf*nbOfComp): value.append(randint(0,100)) - print " the mode is full interlace" mode = MED_FULL_INTERLACE + print " the mode is full interlace ", mode + print " the field interlacing mode ",fieldFamilyIntg.getInterlacingType() for k in range(nbOf): - fieldFamilyIntg.setRow((k+1),value[k*nbOfComp:(k+1)*nbOfComp]) + valInd = numberFamily[k] + fieldFamilyIntg.setRow(valInd,value[k*nbOfComp:(k+1)*nbOfComp]) valueverif = [] for k in range(nbOf): - valueverif.extend(fieldFamilyIntg.getRow((k+1))) + valInd = numberFamily[k] + valueverif.extend(fieldFamilyIntg.getRow(valInd)) for k in range(nbOf*nbOfComp): print " Set/Get Entry * ",value[k]," / ",valueverif[k] print "" value = [] for k in range(nbOf*nbOfComp): value.append(randint(0,100)) - print " the mode is no interlace" mode = MED_NO_INTERLACE - for k in range(nbOfComp): - fieldFamilyIntg.setColumn((k+1),value[k*nbOf:(k+1)*nbOf]) - valueverif = [] - for k in range(nbOfComp): - valueverif.extend(fieldFamilyIntg.getColumn((k+1))) - for k in range(nbOf*nbOfComp): - print " Set/Get Entry * ",value[k]," / ",valueverif[k] - print "" - print " Randomly set (via setValueI) and get (via getValueI) to check with different mode ..!" - value = [] - for k in range(nbOf*nbOfComp): - value.append(randint(0,100)) - print " the mode for set is full interlace and no interlace for get" - mode_full = MED_FULL_INTERLACE - mode_no = MED_NO_INTERLACE + print " the mode is no interlace ", mode + print " the field interlacing mode ",fieldFamilyIntg.getInterlacingType() for k in range(nbOf): - fieldFamilyIntg.setRow((k+1),value[k*nbOfComp:(k+1)*nbOfComp]) + valInd = numberFamily[k] + fieldFamilyIntg.setRow(valInd,value[k*nbOfComp:(k+1)*nbOfComp]) + fieldFamilyIntgOtherMode = createFieldIntConvertNoInterlace(fieldFamilyIntg) valueverif = [] for k in range(nbOfComp): - valueverif.extend(fieldFamilyIntg.getColumn((k+1))) - for k in range(nbOf*nbOfComp): - print " Set/Get Entry * ",value[k]," / ",valueverif[k] - print "" - value = [] - for k in range(nbOf*nbOfComp): - value.append(randint(0,100)) - print " the mode for set is no interlace and full interlace for get" - for k in range(nbOfComp): - fieldFamilyIntg.setColumn((k+1),value[k*nbOf:(k+1)*nbOf]) - valueverif = [] - for k in range(nbOf): - valueverif.extend(fieldFamilyIntg.getRow((k+1))) + valueverif.extend(fieldFamilyIntgOtherMode.getColumn(k+1)) for k in range(nbOf*nbOfComp): print " Set/Get Entry * ",value[k]," / ",valueverif[k] print "" +print "END of the Pyhton script ..... Ctrl D to exit" diff --git a/src/MEDMEM_SWIG/my_typemap.i b/src/MEDMEM_SWIG/my_typemap.i index 5eecb9c63..98e316886 100644 --- a/src/MEDMEM_SWIG/my_typemap.i +++ b/src/MEDMEM_SWIG/my_typemap.i @@ -21,8 +21,8 @@ #include <stdio.h> %} -%typemap(python,in) string * { - /* typemap in for string * */ +%typemap(python,in) string * , const string * , const string * const { + /* typemap in for string * , const string * , const string * const */ /* Check if is a list */ if (PyList_Check($input)) { int size = PyList_Size($input); @@ -46,9 +46,9 @@ } } -%typemap(python,in) double * +%typemap(python,in) double * , const double * , const double * const { - /* typemap in for double * */ + /* typemap in for double * , const double * , const double * const */ /* Check if is a list */ if (PyList_Check($input)) { int size = PyList_Size($input); @@ -72,9 +72,9 @@ } } -%typemap(python,in) int * +%typemap(python,in) int * , const int * , const int * const { - /* typemap in for int * */ + /* typemap in for int * , const int * , const int * const */ /* Check if is a list */ if (PyList_Check($input)) { int size = PyList_Size($input); @@ -99,9 +99,9 @@ } -%typemap(python,in) medGeometryElement * +%typemap(python,in) medGeometryElement * , const medGeometryElement * , const medGeometryElement * const { - /* typemap in for medGeometryElement * */ + /* typemap in for medGeometryElement * , const medGeometryElement * , const medGeometryElement * const */ /* Check if is a list */ if (PyList_Check($input)) { int size = PyList_Size($input); @@ -134,18 +134,17 @@ PyList_SetItem($result,i,PyString_FromString((*iL).c_str())); } -%typemap(freearg) int * { - /* free the memory allocated in the typemap in for int * */ +%typemap(freearg) int * , const int * , const int * const { + /* free the memory allocated in the typemap in for int * , const int * , const int * const */ free($1); } -%typemap(freearg) double * { - /* free the memory allocated in the typemap in for double * */ +%typemap(freearg) double * , const double * , const double * const { + /* free the memory allocated in the typemap in for double * , const double * , const double * const */ free($1); } -%typemap(freearg) medGeometryElement * { - /* free the memory allocated in the typemap in for medGeometryElement * */ +%typemap(freearg) medGeometryElement * , const medGeometryElement * , const medGeometryElement * const { + /* free the memory allocated in the typemap in for medGeometryElement * , const medGeometryElement * , const medGeometryElement * const */ free($1); } - diff --git a/src/MEDMEM_SWIG/testGaussLocalization.py b/src/MEDMEM_SWIG/testGaussLocalization.py new file mode 100644 index 000000000..ffc2959e2 --- /dev/null +++ b/src/MEDMEM_SWIG/testGaussLocalization.py @@ -0,0 +1,116 @@ +################################################################################### +# +# This Python script is to test the API of the C++ GAUSS_LOCALIZATION class +# defined in MEDMEM_GaussLocalization.hxx. This test is the Python equivalent +# of the test_GaussLocalization.cxx program. +# +################################################################################### + +from libMEDMEM_Swig import * + +a = 0.446948490915965 +b = 0.091576213509771 +p1 = 0.11169079483905 +p2 = 0.0549758718227661 + +typeGeo = MED_TRIA6 + +ngauss = 6 + +gaussLocName = "Model n1" + +refCoo = [-1.0,1.0, + -1.0,-1.0, + 1.0,-1.0, + -1.0,0.0, + 0.0,-1.0, + 0.0,0.0] + +gsCoo = [2*b-1, 1-4*b, + 2*b-1, 2*b-1, + 1-4*b, 2*b-1, + 1-4*a, 2*a-1, + 2*a-1, 1-4*a, + 2*a-1, 2*a-1] + +weight = [4*p2, 4*p2, 4*p2, 4*p1, 4*p1, 4*p1] + +interlacingType = MED_FULL_INTERLACE + +gaussLoc = GAUSS_LOCALIZATION_FULL(gaussLocName, typeGeo, ngauss, refCoo, + gsCoo, weight) + +print "Gauss Localization via the str operator: ", gaussLoc + +print "Gauss Localization via the get methods from the class API" + +typeGeoVerif = gaussLoc.getType() + +ngaussVerif = gaussLoc.getNbGauss() + +gaussLocNameVerif = gaussLoc.getName() + +refCooVerif = gaussLoc.getRefCoo() + +gsCooVerif = gaussLoc.getGsCoo() + +weightVerif = gaussLoc.getWeight() + +interlacingTypeVerif = gaussLoc.getInterlacingType() + +lenrefCoo = len(refCoo) +lenrefCooVerif = len(refCooVerif) + +lengsCoo = len(gsCoo) +lengsCooVerif = len(gsCooVerif) + +lenweight = len(weight) +lenweightVerif = len(weightVerif) + +if (typeGeo != typeGeoVerif): + print "the geometric type does not match" + print typeGeo, " verif ", typeGeo + pass + +if (ngauss != ngaussVerif): + print "the number of Gauss points does not match" + print ngauss, " verif ", ngaussVerif + pass + +if (interlacingType != interlacingTypeVerif): + print "the interlacing type does not match" + print interlacingType, " verif ", interlacingTypeVerif + pass + +if (gaussLocName != gaussLocNameVerif): + print "the Gauss Location name does not match" + print gaussLocName, " verif ", gaussLocNameVerif + pass + +if (lenrefCoo == lenrefCooVerif): + print "refCoo verification -- length ",lenrefCoo + for i in range(lenrefCoo): + if (refCoo[i] != refCooVerif[i]): + print " * ",i," ",refCoo[i], " --- ",refCooVerif[i] +else: + print "the array of referrence element coordinates does not match" + +if (lengsCoo == lengsCooVerif): + print "gsCoo verification -- length ",lengsCoo + for i in range(lengsCoo): + if (gsCoo[i] != gsCooVerif[i]): + print " * ",i," ",gsCoo[i], " --- ",gsCooVerif[i] +else: + print "the array of gauss points coordinates does not match" + +if (lenweight == lenweightVerif): + print "weight verification -- length ",lenweight + for i in range(lenweight): + if (weight[i] != weightVerif[i]): + print " * ",i," ",weight[i], " --- ",weightVerif[i] +else: + print "the array of gauss points weight does not match" + +print "seems to be OK" +print "" +print "END of the Pyhton script ..... Ctrl D to exit" diff --git a/src/MEDMEM_SWIG/testMedObj.py b/src/MEDMEM_SWIG/testMedObj.py new file mode 100755 index 000000000..a85882d17 --- /dev/null +++ b/src/MEDMEM_SWIG/testMedObj.py @@ -0,0 +1,114 @@ +################################################################################### +# +# This Python script is testing the mounting in memory of a med file, +# via the object MED and the writing of this object MED in Med file format +# V2.1 V2.2 +# +# Then from the 2 file produced before, a mounting and a writing of those files in +# different Med file format is tested +# +################################################################################### + +from libMEDMEM_Swig import * +import string +import os +# +#befor running this script, please be sure about the path the files +# +filePath=os.environ["MED_ROOT_DIR"] +filePath=filePath+"/share/salome/resources/" + +medFile = "pointe.med" + +medFile = filePath + medFile +rootFile = string.split(medFile,".")[0] +medFileOut21 = rootFile + "_Out21.med" +medFileOut22 = rootFile + "_Out22.med" + +print "Mounting in memory of the MED object from the file ",medFile +medObj = MED(MED_DRIVER,medFile) + +print "" +print "Reading the object" +medObj.read() + +medFileVersion = getMedFileVersionForWriting() + +if (medFileVersion == V22): + setMedFileVersionForWriting(V21) + pass + +print "" +print "Adding a med file V2.1 format driver to the MED object with the file ",medFileOut21 +idMedV21 = medObj.addDriver(MED_DRIVER,medFileOut21) + +print "" +print "Writing the MED object in the med file V2.1 format file" +medObj.write(idMedV21) + +medFileVersion = getMedFileVersionForWriting() +if (medFileVersion == V21): + setMedFileVersionForWriting(V22) + pass + +print "" +print "Adding a med file V2.2 format driver to the MED object with the file ",medFileOut22 +idMedV22 = medObj.addDriver(MED_DRIVER,medFileOut22) + +print "" +print "Writing the MED object in med file V2.2 format file" +medObj.write(idMedV22) + +print "" +print "Mounting in memory of the two files produced and writing them again" + +medFiles = [] +medFiles.append(medFileOut21) +medFiles.append(medFileOut22) +nbOfFiles = len(medFiles) + +for i in range(nbOfFiles): + medFile = medFiles[i] + + rootFile = string.split(medFile,".")[0] + medFileOut21 = rootFile + "_Out21.med" + medFileOut22 = rootFile + "_Out22.med" + + print "" + print " Mounting in memory of the MED object from the file ",medFile + medObj = MED(MED_DRIVER,medFile) + + print "" + print " Reading the object" + medObj.read() + + medFileVersion = getMedFileVersionForWriting() + + if (medFileVersion == V22): + setMedFileVersionForWriting(V21) + pass + + print "" + print " Adding a med file V2.1 format driver to the MED object with the file ",medFileOut21 + idMedV21 = medObj.addDriver(MED_DRIVER,medFileOut21) + + print "" + print " Writing the MED object in the med file V2.1 format file" + medObj.write(idMedV21) + + medFileVersion = getMedFileVersionForWriting() + if (medFileVersion == V21): + setMedFileVersionForWriting(V22) + pass + + print "" + print " Adding a med file V2.2 format driver to the MED object with the file ",medFileOut22 + idMedV22 = medObj.addDriver(MED_DRIVER,medFileOut22) + + print "" + print " Writing the MED object in med file V2.2 format file" + medObj.write(idMedV22) + pass + +print "" +print "END of the Pyhton script ..... Ctrl D to exit" diff --git a/src/MEDMEM_SWIG/testWriteAndFam.py b/src/MEDMEM_SWIG/testWriteAndFam.py new file mode 100755 index 000000000..2ee8d2f95 --- /dev/null +++ b/src/MEDMEM_SWIG/testWriteAndFam.py @@ -0,0 +1,160 @@ +################################################################################### +# +# This Python script is testing the writing in Med format V2.1 V2.2 +# +# You can check if the analysis of the families is OK. +# +################################################################################### + +from libMEDMEM_Swig import * +import string +import os +# +#befor running this script, please be sure about the path the files +# +filePath=os.environ["MED_ROOT_DIR"] +filePath=filePath+"/share/salome/resources/" + +medFiles = [] +medFiles.append("geomMesh21.med") +medFiles.append("geomMesh22.med") +nbOfFiles = len(medFiles) + +for i in range(nbOfFiles): + medFile = medFiles[i] + medFile = filePath + medFile + medFiles[i] = medFile + pass + +meshName = "GeomMesh" + +for i in range(nbOfFiles): + medFile = medFiles[i] + + rootFile = string.split(medFile,".")[0] + medFileOut21 = rootFile + "Out21.med" + medFileOut22 = rootFile + "Out22.med" + + print "Mounting in memory of the mesh ",meshName," from the file ",medFile + mesh = MESH(MED_DRIVER,medFile,meshName) + + print "" + print "Families analysis of the mesh ",meshName," from the file ",medFile + print "" + + for entity in [MED_NODE,MED_CELL,MED_FACE,MED_EDGE]: + nbFam = mesh.getNumberOfFamilies(entity) + if (entity == MED_NODE) & (nbFam > 0): + print "This mesh has",nbFam,"Node Family(ies)" + pass + elif (entity == MED_CELL) & (nbFam > 0): + print "This mesh has",nbFam,"Cell Family(ies)" + pass + elif (entity == MED_FACE) & (nbFam > 0): + print "This mesh has",nbFam,"Face Family(ies)" + pass + elif (entity == MED_EDGE) & (nbFam > 0): + print "This mesh has",nbFam,"Edge Family(ies)" + pass + + if nbFam > 0: + for j in range(nbFam): + print "" + family = mesh.getFamily(entity,j+1) + familyName = family.getName() + familyBool = family.isOnAllElements() + if (familyBool): + print " -this famyly named ",familyName," is on all entities" + pass + else: + familyNumber = family.getNumber(MED_ALL_ELEMENTS) + print " -this famyly named ",familyName," has ",len(familyNumber)," entities" + pass + pass + pass + pass + + medFileVersion = getMedFileVersionForWriting() + + if (medFileVersion == V22): + setMedFileVersionForWriting(V21) + pass + + print "" + print " adding a Med file V2.1 format driver to the mesh with the file ",medFileOut21 + idMedV21 = mesh.addDriver(MED_DRIVER,medFileOut21,mesh.getName()) + + print "" + print " writing the mesh in Med file V2.1 format" + mesh.write(idMedV21) + + medFileVersion = getMedFileVersionForWriting() + if (medFileVersion == V21): + setMedFileVersionForWriting(V22) + pass + + print "" + print " adding a Med file V2.2 format driver to the mesh with the file ",medFileOut22 + idMedV22 = mesh.addDriver(MED_DRIVER,medFileOut22,mesh.getName()) + + print "" + print " writing the mesh in Med file V2.2 format" + mesh.write(idMedV22) + print "" + pass + +medFiles2 = [] + +for i in range(nbOfFiles): + medFile = medFiles[i] + rootFile = string.split(medFile,".")[0] + medFileOut21 = rootFile + "Out21.med" + medFileOut22 = rootFile + "Out22.med" + + medFiles2.append(medFileOut21) + medFiles2.append(medFileOut22) + pass + +nbOfFiles = len(medFiles2) + +for i in range(nbOfFiles): + medFile = medFiles2[i] + mesh = MESH(MED_DRIVER,medFile,meshName) + + print "Families analysis of the mesh ",meshName," from the file ",medFile + print "" + for entity in [MED_NODE,MED_CELL,MED_FACE,MED_EDGE]: + nbFam = mesh.getNumberOfFamilies(entity) + if (entity == MED_NODE) & (nbFam > 0): + print "This mesh has",nbFam,"Node Family(ies)" + pass + elif (entity == MED_CELL) & (nbFam > 0): + print "This mesh has",nbFam,"Cell Family(ies)" + pass + elif (entity == MED_FACE) & (nbFam > 0): + print "This mesh has",nbFam,"Face Family(ies)" + pass + elif (entity == MED_EDGE) & (nbFam > 0): + print "This mesh has",nbFam,"Edge Family(ies)" + pass + + if nbFam > 0: + for j in range(nbFam): + print "" + family = mesh.getFamily(entity,j+1) + familyName = family.getName() + familyBool = family.isOnAllElements() + if (familyBool): + print " -this famyly named ",familyName," is on all entities" + pass + else: + familyNumber = family.getNumber(MED_ALL_ELEMENTS) + print " -this famyly named ",familyName," has ",len(familyNumber)," entities" + pass + pass + pass + pass + pass + +print "" +print "END of the Pyhton script ..... Ctrl D to exit" diff --git a/src/MEDMEM_SWIG/test_profil_MedFieldDriver.py b/src/MEDMEM_SWIG/test_profil_MedFieldDriver.py new file mode 100644 index 000000000..37cd5065b --- /dev/null +++ b/src/MEDMEM_SWIG/test_profil_MedFieldDriver.py @@ -0,0 +1,93 @@ +############################################################################ +# +# this Python script is testing the profil functionality using the FIELD +# constructor via a MED driver. +# +############################################################################ + +from libMEDMEM_Swig import * + +# users inputs +#test 1 --- zzzz121b_without_tr6.med RESUZERODEPL____________________ 1 1 +#test 2 --- zzzz121b_without_tr6.med RESUZEROERRE_ELGA_NORE__________ 1 1 +#test 3 --- maill.00.med Indicateur_d_erreur_00 2 2 + +medFile = "zzzz121b_without_tr6.med" +#medFile = "maill.00.med" + +fieldName = "RESUZERODEPL____________________" +#fieldName = "RESUZEROERRE_ELGA_NORE__________" +#fieldName = "Indicateur_d_erreur_00" + +# default value, may be changed according to what field is stored in medFile +##iterationNumber = -1 +##orderNumber = -1 +iterationNumber = 1 +orderNumber = 1 +#iterationNumber = 2 +#orderNumber = 2 + +import os +# +#befor running this script, please be sure about the path the file fileName +# +filePath=os.environ["MED_ROOT_DIR"] +filePath=filePath+"/share/salome/resources/" + +medFile = filePath + medFile + +def analyseField(field): + fieldName = field.getName() + fieldType = field.getValueType() + fieldDesc = field.getDescription() + fieldIterationNumber = field.getIterationNumber() + fieldOrderNumber = field.getOrderNumber() + fieldTime = field.getTime() + fieldNbOfComp = field.getNumberOfComponents() + print "The field ",fieldName," with the description ",fieldDesc," typed ",fieldType + print "Iteration number ",fieldIterationNumber," OrderNumber ",fieldOrderNumber," Time ",fieldTime + print "It has ",fieldNbOfComp,"components" + for k in range(fieldNbOfComp): + kp1 = k+1 + fieldCompName = field.getComponentName(kp1) + fieldCompDesc = field.getComponentDescription(kp1) + fieldCompUnit = field.getMEDComponentUnit(kp1) + print " * Component:",kp1 + print " Name:",fieldCompName + print " Description:",fieldCompDesc + print " Unit:",fieldCompUnit + pass + fieldSupport = field.getSupport() + fieldMeshName = fieldSupport.getMeshName() + fieldSupportOnAll = fieldSupport.isOnAllElements() + fieldNbEntities = fieldSupport.getNumberOfElements(MED_ALL_ELEMENTS) + fieldEntityType = fieldSupport.getEntity() + fieldSupportNumber = range(1,fieldNbEntities+1) + if (not fieldSupportOnAll): + fieldSupportNumber = fieldSupport.getNumber(MED_ALL_ELEMENTS) + pass + print " fieldSupportNumber ", fieldSupportNumber + fieldInterlacingType = field.getInterlacingType() + print "It relies on the mesh named ",fieldMeshName + print "its interlacing type ",fieldInterlacingType + print "and it is on ",fieldNbEntities," entities of the type ",fieldEntityType + if (fieldInterlacingType == MED_FULL_INTERLACE): + for i in range(fieldNbEntities): + value = field.getRow(fieldSupportNumber[i]) + print " * ",fieldSupportNumber[i]," --- ",value + pass + pass + elif (fieldInterlacingType == MED_FULL_INTERLACE): + for i in range(fieldNbOfComp): + value = field.getColumn(fieldSupportNumber[i]) + print " * ",fieldSupportNumber[i]," --- ",value + pass + pass + pass + +field = FIELDDOUBLE(MED_DRIVER, medFile, fieldName, + iterationNumber, orderNumber) + +analyseField(field) + +print "END of the Pyhton script ..... Ctrl D to exit" diff --git a/src/MEDWrapper/Base/MED_Algorithm.cxx b/src/MEDWrapper/Base/MED_Algorithm.cxx index 6f523efec..b9b215532 100644 --- a/src/MEDWrapper/Base/MED_Algorithm.cxx +++ b/src/MEDWrapper/Base/MED_Algorithm.cxx @@ -50,32 +50,22 @@ namespace MED MSG(MYDEBUG,"GetElemsByEntity(...)"); TEntity2TGeom2ElemInfo anEntity2TGeom2ElemInfo; MED::TEntityInfo::const_iterator anIter = theEntityInfo.begin(); + PElemInfo anElemInfo; + TErr anErr; for(; anIter != theEntityInfo.end(); anIter++){ const EEntiteMaillage& anEntity = anIter->first; const TGeom2Size& aGeom2Size = anIter->second; TGeom2ElemInfo& aGeom2ElemInfo = anEntity2TGeom2ElemInfo[anEntity]; if(anEntity == eNOEUD){ - aGeom2ElemInfo[ePOINT1] = theWrapper->GetPNodeInfo(theMeshInfo); + aGeom2ElemInfo[ePOINT1] = theWrapper->GetPElemInfo(theMeshInfo); continue; } TGeom2Size::const_iterator anIter2 = aGeom2Size.begin(); for(; anIter2 != aGeom2Size.end(); anIter2++){ const EGeometrieElement& aGeom = anIter2->first; - switch(aGeom){ - case ePOLYGONE: { - aGeom2ElemInfo[ePOLYGONE] = theWrapper->GetPPolygoneInfo(theMeshInfo,anEntity,aGeom); - break; - } - case ePOLYEDRE: { - aGeom2ElemInfo[ePOLYEDRE] = theWrapper->GetPPolyedreInfo(theMeshInfo,anEntity,aGeom); - break; - } - default: { - aGeom2ElemInfo[aGeom] = theWrapper->GetPCellInfo(theMeshInfo,anEntity,aGeom); - }} - + aGeom2ElemInfo[aGeom] = theWrapper->GetPElemInfo(theMeshInfo,anEntity,aGeom,MED::eNOD,&anErr); } } ADDMSG(MYDEBUG,"\n"); diff --git a/src/MEDWrapper/Base/MED_Common.hxx b/src/MEDWrapper/Base/MED_Common.hxx index f659a8fc2..7775b16ce 100644 --- a/src/MEDWrapper/Base/MED_Common.hxx +++ b/src/MEDWrapper/Base/MED_Common.hxx @@ -81,6 +81,10 @@ namespace MED{ typedef enum {eNO_PFLMOD, eGLOBAL, eCOMPACT} EModeProfil; + typedef enum {eGRILLE_CARTESIENNE,eGRILLE_POLAIRE,eGRILLE_STANDARD} EGrilleType; + + typedef enum {eCOOR, eCONN, eNOM, eNUM, eFAM,eCOOR_IND1,eCOOR_IND2,eCOOR_IND3} ETable; + typedef TVector<TFloat> TFloatVector; typedef TVector<std::string> TStringVector; typedef TVector<TInt> TIntVector; @@ -160,6 +164,9 @@ namespace MED{ struct TGaussInfo; typedef SharedPtr<TGaussInfo> PGaussInfo; + class TGrilleInfo; + typedef SharedPtr<TGrilleInfo> PGrilleInfo; + struct TTimeStampVal; typedef SharedPtr<TTimeStampVal> PTimeStampVal; diff --git a/src/MEDWrapper/Base/MED_CoordUtils.cxx b/src/MEDWrapper/Base/MED_CoordUtils.cxx index 74225911b..2b9e0956c 100644 --- a/src/MEDWrapper/Base/MED_CoordUtils.cxx +++ b/src/MEDWrapper/Base/MED_CoordUtils.cxx @@ -125,6 +125,8 @@ namespace MED bool anIsDimPresent[3] = {false, false, false}; for(int iDim = 0; iDim < aMeshDimension; iDim++){ std::string aName = theNodeInfo->GetCoordName(iDim); + if ( aName.size() > 1 ) // PAL12148, aName has size 8 or 16 + aName = aName.substr(0,1); if(aName == "x" || aName == "X") anIsDimPresent[eX] = true; else if(aName == "y" || aName == "Y") diff --git a/src/MEDWrapper/Base/MED_GaussUtils.cxx b/src/MEDWrapper/Base/MED_GaussUtils.cxx index ad532ba42..8ca5447d2 100644 --- a/src/MEDWrapper/Base/MED_GaussUtils.cxx +++ b/src/MEDWrapper/Base/MED_GaussUtils.cxx @@ -216,10 +216,6 @@ namespace MED "- aNbRef("<<aNbRef<<")"<< "; aNbRef2("<<aNbRef2<<")\n"); bool anIsSatisfy = (aNbRef == aNbRef2); -#ifndef _DEBUG_REF_COORDS_ - static TInt NB_REF_TO_CHECK = 2; - aNbRef = NB_REF_TO_CHECK; -#endif if(anIsSatisfy){ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ const TCCoordSlice& aCoord2 = theRefCoord[aRefId]; @@ -234,11 +230,15 @@ namespace MED } } if(!anIsEqual){ - const TCCoordSlice& aCoord = theRefCoord[aRefId]; - INITMSG(MYDEBUG,aRefId + 1<<":{"); + TCCoordSlice aCoord = GetCoord(aRefId); + INITMSG(MYDEBUG,aRefId + 1<<": aCoord = {"); TInt aDim = aCoord.size(); for(TInt anId = 0; anId < aDim; anId++) ADDMSG(MYDEBUG,"\t"<<aCoord[anId]); + const TCCoordSlice& aCoord2 = theRefCoord[aRefId]; + ADDMSG(MYDEBUG,"}\t!=\taCoord2 = {"); + for(TInt anId = 0; anId < aDim; anId++) + ADDMSG(MYDEBUG,"\t"<<aCoord2[anId]); ADDMSG(MYDEBUG,"}\n"); #ifndef _DEBUG_ return anIsSatisfy; @@ -622,6 +622,146 @@ namespace MED }; + //--------------------------------------------------------------- + struct TQuad8a: TShapeFun + { + TQuad8a(): + TShapeFun(2,8) + { + TInt aNbRef = GetNbRef(); + for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + TCoordSlice aCoord = GetCoord(aRefId); + switch(aRefId){ + case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; break; + case 1: aCoord[0] = -1.0; aCoord[1] = -1.0; break; + case 2: aCoord[0] = 1.0; aCoord[1] = -1.0; break; + case 3: aCoord[0] = 1.0; aCoord[1] = 1.0; break; + + case 4: aCoord[0] = -1.0; aCoord[1] = 0.0; break; + case 5: aCoord[0] = 0.0; aCoord[1] = -1.0; break; + case 6: aCoord[0] = 1.0; aCoord[1] = 0.0; break; + case 7: aCoord[0] = 0.0; aCoord[1] = 1.0; break; + } + } + } + + virtual + void + InitFun(const TShapeFun::TCCoordSliceArr& theRef, + const TShapeFun::TCCoordSliceArr& theGauss, + TFun& theFun) const + { + GetFun(theRef,theGauss,theFun); + + TInt aNbGauss = theGauss.size(); + for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){ + const TCCoordSlice& aCoord = theGauss[aGaussId]; + TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId); + + aSlice[0] = 0.25*(1.0 + aCoord[1])*(1.0 - aCoord[0])*(aCoord[1] - aCoord[0] - 1.0); + aSlice[1] = 0.25*(1.0 - aCoord[1])*(1.0 - aCoord[0])*(-aCoord[1] - aCoord[0] - 1.0); + aSlice[2] = 0.25*(1.0 - aCoord[1])*(1.0 + aCoord[0])*(-aCoord[1] + aCoord[0] - 1.0); + aSlice[3] = 0.25*(1.0 + aCoord[1])*(1.0 + aCoord[0])*(aCoord[1] + aCoord[0] - 1.0); + + aSlice[4] = 0.5*(1.0 - aCoord[0])*(1.0 - aCoord[1])*(1.0 + aCoord[1]); + aSlice[5] = 0.5*(1.0 - aCoord[1])*(1.0 - aCoord[0])*(1.0 + aCoord[0]); + aSlice[6] = 0.5*(1.0 + aCoord[0])*(1.0 - aCoord[1])*(1.0 + aCoord[1]); + aSlice[7] = 0.5*(1.0 + aCoord[1])*(1.0 - aCoord[0])*(1.0 + aCoord[0]); + } + } + }; + + + //--------------------------------------------------------------- + struct TQuad4b: TShapeFun + { + TQuad4b(): + TShapeFun(2,4) + { + TInt aNbRef = GetNbRef(); + for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + TCoordSlice aCoord = GetCoord(aRefId); + switch(aRefId){ + case 0: aCoord[0] = -1.0; aCoord[1] = -1.0; break; + case 1: aCoord[0] = 1.0; aCoord[1] = -1.0; break; + case 2: aCoord[0] = 1.0; aCoord[1] = 1.0; break; + case 3: aCoord[0] = -1.0; aCoord[1] = 1.0; break; + } + } + } + + virtual + void + InitFun(const TShapeFun::TCCoordSliceArr& theRef, + const TShapeFun::TCCoordSliceArr& theGauss, + TFun& theFun) const + { + GetFun(theRef,theGauss,theFun); + + TInt aNbGauss = theGauss.size(); + for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){ + const TCCoordSlice& aCoord = theGauss[aGaussId]; + TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId); + + aSlice[0] = 0.25*(1.0 - aCoord[0])*(1.0 - aCoord[1]); + aSlice[1] = 0.25*(1.0 + aCoord[0])*(1.0 - aCoord[1]); + aSlice[2] = 0.25*(1.0 + aCoord[0])*(1.0 + aCoord[1]); + aSlice[3] = 0.25*(1.0 - aCoord[0])*(1.0 + aCoord[1]); + } + } + }; + + + //--------------------------------------------------------------- + struct TQuad8b: TShapeFun + { + TQuad8b(): + TShapeFun(2,8) + { + TInt aNbRef = GetNbRef(); + for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + TCoordSlice aCoord = GetCoord(aRefId); + switch(aRefId){ + case 0: aCoord[0] = -1.0; aCoord[1] = -1.0; break; + case 1: aCoord[0] = 1.0; aCoord[1] = -1.0; break; + case 2: aCoord[0] = 1.0; aCoord[1] = 1.0; break; + case 3: aCoord[0] = -1.0; aCoord[1] = 1.0; break; + + case 4: aCoord[0] = 0.0; aCoord[1] = -1.0; break; + case 5: aCoord[0] = 1.0; aCoord[1] = 0.0; break; + case 6: aCoord[0] = 0.0; aCoord[1] = 1.0; break; + case 7: aCoord[0] = -1.0; aCoord[1] = 0.0; break; + } + } + } + + virtual + void + InitFun(const TShapeFun::TCCoordSliceArr& theRef, + const TShapeFun::TCCoordSliceArr& theGauss, + TFun& theFun) const + { + GetFun(theRef,theGauss,theFun); + + TInt aNbGauss = theGauss.size(); + for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){ + const TCCoordSlice& aCoord = theGauss[aGaussId]; + TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId); + + aSlice[0] = 0.25*(1.0 - aCoord[0])*(1.0 - aCoord[1])*(-1.0 - aCoord[0] - aCoord[1]); + aSlice[1] = 0.25*(1.0 + aCoord[0])*(1.0 - aCoord[1])*(-1.0 + aCoord[0] - aCoord[1]); + aSlice[2] = 0.25*(1.0 + aCoord[0])*(1.0 + aCoord[1])*(-1.0 + aCoord[0] + aCoord[1]); + aSlice[3] = 0.25*(1.0 - aCoord[0])*(1.0 + aCoord[1])*(-1.0 - aCoord[0] + aCoord[1]); + + aSlice[4] = 0.25*(1.0 - aCoord[0]*aCoord[0])*(1.0 - aCoord[1]); + aSlice[5] = 0.25*(1.0 - aCoord[1]*aCoord[1])*(1.0 + aCoord[0]); + aSlice[6] = 0.25*(1.0 - aCoord[0]*aCoord[0])*(1.0 + aCoord[1]); + aSlice[7] = 0.25*(1.0 - aCoord[1]*aCoord[1])*(1.0 - aCoord[0]); + } + } + }; + + //--------------------------------------------------------------- struct TTetra4a: TShapeFun { @@ -718,6 +858,104 @@ namespace MED }; + //--------------------------------------------------------------- + + + struct TTetra4b: TShapeFun + { + TTetra4b(): + TShapeFun(3,4) + { + TInt aNbRef = GetNbRef(); + for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + TCoordSlice aCoord = GetCoord(aRefId); + switch(aRefId){ + case 0: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break; + case 2: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break; + case 1: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; + case 3: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; + } + } + } + + virtual + void + InitFun(const TShapeFun::TCCoordSliceArr& theRef, + const TShapeFun::TCCoordSliceArr& theGauss, + TFun& theFun) const + { + GetFun(theRef,theGauss,theFun); + + TInt aNbGauss = theGauss.size(); + for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){ + const TCCoordSlice& aCoord = theGauss[aGaussId]; + TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId); + + aSlice[0] = aCoord[1]; + aSlice[2] = aCoord[2]; + aSlice[1] = 1.0 - aCoord[0] - aCoord[1] - aCoord[2]; + aSlice[3] = aCoord[0]; + } + } + }; + + + //--------------------------------------------------------------- + struct TTetra10b: TShapeFun + { + TTetra10b(): + TShapeFun(3,10) + { + TInt aNbRef = GetNbRef(); + for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + TCoordSlice aCoord = GetCoord(aRefId); + switch(aRefId){ + case 0: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break; + case 2: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break; + case 1: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; + case 3: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; + + case 6: aCoord[0] = 0.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break; + case 5: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.5; break; + case 4: aCoord[0] = 0.0; aCoord[1] = 0.5; aCoord[2] = 0.0; break; + + case 7: aCoord[0] = 0.5; aCoord[1] = 0.5; aCoord[2] = 0.0; break; + case 9: aCoord[0] = 0.5; aCoord[1] = 0.0; aCoord[2] = 0.5; break; + case 8: aCoord[0] = 0.5; aCoord[1] = 0.0; aCoord[2] = 0.0; break; + } + } + } + + virtual + void + InitFun(const TShapeFun::TCCoordSliceArr& theRef, + const TShapeFun::TCCoordSliceArr& theGauss, + TFun& theFun) const + { + GetFun(theRef,theGauss,theFun); + + TInt aNbGauss = theGauss.size(); + for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){ + const TCCoordSlice& aCoord = theGauss[aGaussId]; + TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId); + + aSlice[0] = aCoord[1]*(2.0*aCoord[1] - 1.0); + aSlice[2] = aCoord[2]*(2.0*aCoord[2] - 1.0); + aSlice[1] = (1.0 - aCoord[0] - aCoord[1] - aCoord[2])*(1.0 - 2.0*aCoord[0] - 2.0*aCoord[1] - 2.0*aCoord[2]); + aSlice[3] = aCoord[0]*(2.0*aCoord[0] - 1.0); + + aSlice[6] = 4.0*aCoord[1]*aCoord[2]; + aSlice[5] = 4.0*aCoord[2]*(1.0 - aCoord[0] - aCoord[1] - aCoord[2]); + aSlice[4] = 4.0*aCoord[1]*(1.0 - aCoord[0] - aCoord[1] - aCoord[2]); + + aSlice[7] = 4.0*aCoord[0]*aCoord[1]; + aSlice[9] = 4.0*aCoord[0]*aCoord[2]; + aSlice[8] = 4.0*aCoord[0]*(1.0 - aCoord[0] - aCoord[1] - aCoord[2]); + } + } + }; + + //--------------------------------------------------------------- struct THexa8a: TShapeFun { @@ -766,7 +1004,7 @@ namespace MED } }; - + //--------------------------------------------------------------- struct THexa20a: TShapeFun { THexa20a(TInt theDim = 3, TInt theNbRef = 20): @@ -915,6 +1153,137 @@ namespace MED }; + //--------------------------------------------------------------- + struct THexa8b: TShapeFun + { + THexa8b(): + TShapeFun(3,8) + { + TInt aNbRef = GetNbRef(); + for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + TCoordSlice aCoord = GetCoord(aRefId); + switch(aRefId){ + case 0: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break; + case 3: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break; + case 2: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break; + case 1: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break; + case 4: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break; + case 7: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break; + case 6: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break; + case 5: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break; + } + } + } + + virtual + void + InitFun(const TShapeFun::TCCoordSliceArr& theRef, + const TShapeFun::TCCoordSliceArr& theGauss, + TFun& theFun) const + { + GetFun(theRef,theGauss,theFun); + + TInt aNbGauss = theGauss.size(); + for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){ + const TCCoordSlice& aCoord = theGauss[aGaussId]; + TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId); + + aSlice[0] = 0.125*(1.0 - aCoord[0])*(1.0 - aCoord[1])*(1.0 - aCoord[2]); + aSlice[3] = 0.125*(1.0 + aCoord[0])*(1.0 - aCoord[1])*(1.0 - aCoord[2]); + aSlice[2] = 0.125*(1.0 + aCoord[0])*(1.0 + aCoord[1])*(1.0 - aCoord[2]); + aSlice[1] = 0.125*(1.0 - aCoord[0])*(1.0 + aCoord[1])*(1.0 - aCoord[2]); + + aSlice[4] = 0.125*(1.0 - aCoord[0])*(1.0 - aCoord[1])*(1.0 + aCoord[2]); + aSlice[7] = 0.125*(1.0 + aCoord[0])*(1.0 - aCoord[1])*(1.0 + aCoord[2]); + aSlice[6] = 0.125*(1.0 + aCoord[0])*(1.0 + aCoord[1])*(1.0 + aCoord[2]); + aSlice[5] = 0.125*(1.0 - aCoord[0])*(1.0 + aCoord[1])*(1.0 + aCoord[2]); + } + } + }; + + + //--------------------------------------------------------------- + struct THexa20b: TShapeFun + { + THexa20b(TInt theDim = 3, TInt theNbRef = 20): + TShapeFun(theDim,theNbRef) + { + TInt aNbRef = myRefCoord.size(); + for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + TCoordSlice aCoord = GetCoord(aRefId); + switch(aRefId){ + case 0: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break; + case 3: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break; + case 2: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break; + case 1: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break; + case 4: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break; + case 7: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break; + case 6: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break; + case 5: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break; + + case 11: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break; + case 10: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = -1.0; break; + case 9: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break; + case 8: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = -1.0; break; + case 16: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break; + case 19: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break; + case 18: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break; + case 17: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break; + case 15: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break; + case 14: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break; + case 13: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break; + case 12: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break; + } + } + } + + virtual + void + InitFun(const TShapeFun::TCCoordSliceArr& theRef, + const TShapeFun::TCCoordSliceArr& theGauss, + TFun& theFun) const + { + GetFun(theRef,theGauss,theFun); + + TInt aNbGauss = theGauss.size(); + for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){ + const TCCoordSlice& aCoord = theGauss[aGaussId]; + TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId); + + aSlice[0] = 0.125*(1.0 - aCoord[0])*(1.0 - aCoord[1])*(1.0 - aCoord[2])* + (-2.0 - aCoord[0] - aCoord[1] - aCoord[2]); + aSlice[3] = 0.125*(1.0 + aCoord[0])*(1.0 - aCoord[1])*(1.0 - aCoord[2])* + (-2.0 + aCoord[0] - aCoord[1] - aCoord[2]); + aSlice[2] = 0.125*(1.0 + aCoord[0])*(1.0 + aCoord[1])*(1.0 - aCoord[2])* + (-2.0 + aCoord[0] + aCoord[1] - aCoord[2]); + aSlice[1] = 0.125*(1.0 - aCoord[0])*(1.0 + aCoord[1])*(1.0 - aCoord[2])* + (-2.0 - aCoord[0] + aCoord[1] - aCoord[2]); + aSlice[4] = 0.125*(1.0 - aCoord[0])*(1.0 - aCoord[1])*(1.0 + aCoord[2])* + (-2.0 - aCoord[0] - aCoord[1] + aCoord[2]); + aSlice[7] = 0.125*(1.0 + aCoord[0])*(1.0 - aCoord[1])*(1.0 + aCoord[2])* + (-2.0 + aCoord[0] - aCoord[1] + aCoord[2]); + aSlice[6] = 0.125*(1.0 + aCoord[0])*(1.0 + aCoord[1])*(1.0 + aCoord[2])* + (-2.0 + aCoord[0] + aCoord[1] + aCoord[2]); + aSlice[5] = 0.125*(1.0 - aCoord[0])*(1.0 + aCoord[1])*(1.0 + aCoord[2])* + (-2.0 - aCoord[0] + aCoord[1] + aCoord[2]); + + aSlice[11] = 0.25*(1.0 - aCoord[0]*aCoord[0])*(1.0 - aCoord[1])*(1.0 - aCoord[2]); + aSlice[10] = 0.25*(1.0 - aCoord[1]*aCoord[1])*(1.0 + aCoord[0])*(1.0 - aCoord[2]); + aSlice[9] = 0.25*(1.0 - aCoord[0]*aCoord[0])*(1.0 + aCoord[1])*(1.0 - aCoord[2]); + aSlice[8] = 0.25*(1.0 - aCoord[1]*aCoord[1])*(1.0 - aCoord[0])*(1.0 - aCoord[2]); + aSlice[16] = 0.25*(1.0 - aCoord[2]*aCoord[2])*(1.0 - aCoord[0])*(1.0 - aCoord[1]); + aSlice[19] = 0.25*(1.0 - aCoord[2]*aCoord[2])*(1.0 + aCoord[0])*(1.0 - aCoord[1]); + aSlice[18] = 0.25*(1.0 - aCoord[2]*aCoord[2])*(1.0 + aCoord[0])*(1.0 + aCoord[1]); + aSlice[17] = 0.25*(1.0 - aCoord[2]*aCoord[2])*(1.0 - aCoord[0])*(1.0 + aCoord[1]); + aSlice[15] = 0.25*(1.0 - aCoord[0]*aCoord[0])*(1.0 - aCoord[1])*(1.0 + aCoord[2]); + aSlice[14] = 0.25*(1.0 - aCoord[1]*aCoord[1])*(1.0 + aCoord[0])*(1.0 + aCoord[2]); + aSlice[13] = 0.25*(1.0 - aCoord[0]*aCoord[0])*(1.0 + aCoord[1])*(1.0 + aCoord[2]); + aSlice[12] = 0.25*(1.0 - aCoord[1]*aCoord[1])*(1.0 - aCoord[0])*(1.0 + aCoord[2]); + } + } + }; + + //--------------------------------------------------------------- struct TPenta6a: TShapeFun { @@ -960,6 +1329,51 @@ namespace MED }; + //--------------------------------------------------------------- + struct TPenta6b: TShapeFun + { + TPenta6b(): + TShapeFun(3,6) + { + TInt aNbRef = myRefCoord.size(); + for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + TCoordSlice aCoord = GetCoord(aRefId); + switch(aRefId){ + case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break; + case 2: aCoord[0] = -1.0; aCoord[1] = -0.0; aCoord[2] = 1.0; break; + case 1: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; + case 3: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break; + case 5: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break; + case 4: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; + } + } + } + + virtual + void + InitFun(const TShapeFun::TCCoordSliceArr& theRef, + const TShapeFun::TCCoordSliceArr& theGauss, + TFun& theFun) const + { + GetFun(theRef,theGauss,theFun); + + TInt aNbGauss = theGauss.size(); + for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){ + const TCCoordSlice& aCoord = theGauss[aGaussId]; + TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId); + + aSlice[0] = 0.5*aCoord[1]*(1.0 - aCoord[0]); + aSlice[2] = 0.5*aCoord[2]*(1.0 - aCoord[0]); + aSlice[1] = 0.5*(1.0 - aCoord[1] - aCoord[2])*(1.0 - aCoord[0]); + + aSlice[3] = 0.5*aCoord[1]*(aCoord[0] + 1.0); + aSlice[5] = 0.5*aCoord[2]*(aCoord[0] + 1.0); + aSlice[4] = 0.5*(1.0 - aCoord[1] - aCoord[2])*(1.0 + aCoord[0]); + } + } + }; + + //--------------------------------------------------------------- struct TPenta15a: TShapeFun { @@ -1027,6 +1441,305 @@ namespace MED }; + //--------------------------------------------------------------- + struct TPenta15b: TShapeFun + { + TPenta15b(): + TShapeFun(3,15) + { + TInt aNbRef = myRefCoord.size(); + for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + TCoordSlice aCoord = GetCoord(aRefId); + switch(aRefId){ + case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break; + case 2: aCoord[0] = -1.0; aCoord[1] = -0.0; aCoord[2] = 1.0; break; + case 1: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; + case 3: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break; + case 5: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break; + case 4: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; + + case 8: aCoord[0] = -1.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break; + case 7: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.5; break; + case 6: aCoord[0] = -1.0; aCoord[1] = 0.5; aCoord[2] = 0.0; break; + case 12: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break; + case 14: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break; + case 13: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; + case 11: aCoord[0] = 1.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break; + case 10: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.5; break; + case 9: aCoord[0] = 1.0; aCoord[1] = 0.5; aCoord[2] = 0.0; break; + } + } + } + + virtual + void + InitFun(const TShapeFun::TCCoordSliceArr& theRef, + const TShapeFun::TCCoordSliceArr& theGauss, + TFun& theFun) const + { + GetFun(theRef,theGauss,theFun); + + TInt aNbGauss = theGauss.size(); + for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){ + const TCCoordSlice& aCoord = theGauss[aGaussId]; + TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId); + + aSlice[0] = 0.5*aCoord[1]*(1.0 - aCoord[0])*(2.0*aCoord[1] - 2.0 - aCoord[0]); + aSlice[2] = 0.5*aCoord[2]*(1.0 - aCoord[0])*(2.0*aCoord[2] - 2.0 - aCoord[0]); + aSlice[1] = 0.5*(aCoord[0] - 1.0)*(1.0 - aCoord[1] - aCoord[2])*(aCoord[0] + 2.0*aCoord[1] + 2.0*aCoord[2]); + + aSlice[3] = 0.5*aCoord[1]*(1.0 + aCoord[0])*(2.0*aCoord[1] - 2.0 - aCoord[0]); + aSlice[5] = 0.5*aCoord[2]*(1.0 + aCoord[0])*(2.0*aCoord[2] - 2.0 - aCoord[0]); + aSlice[4] = -0.5*(aCoord[0] + 1.0)*(1.0 - aCoord[1] - aCoord[2])*(-aCoord[0] + 2.0*aCoord[1] + 2.0*aCoord[2]); + + aSlice[8] = 2.0*aCoord[1]*aCoord[2]*(1.0 - aCoord[0]); + aSlice[7] = 2.0*aCoord[2]*(1.0 - aCoord[1] - aCoord[2])*(1.0 - aCoord[0]); + aSlice[6] = 2.0*aCoord[1]*(1.0 - aCoord[1] - aCoord[2])*(1.0 - aCoord[0]); + + aSlice[12] = aCoord[1]*(1.0 - aCoord[0]*aCoord[0]); + aSlice[14] = aCoord[2]*(1.0 - aCoord[0]*aCoord[0]); + aSlice[13] = (1.0 - aCoord[1] - aCoord[2])*(1.0 - aCoord[0]*aCoord[0]); + + aSlice[11] = 2.0*aCoord[1]*aCoord[2]*(1.0 + aCoord[0]); + aSlice[10] = 2.0*aCoord[2]*(1.0 - aCoord[1] - aCoord[2])*(1.0 + aCoord[0]); + aSlice[9] = 2.0*aCoord[1]*(1.0 - aCoord[1] - aCoord[2])*(1.0 + aCoord[0]); + } + } + }; + + + //--------------------------------------------------------------- + struct TPyra5a: TShapeFun + { + TPyra5a(): + TShapeFun(3,5) + { + TInt aNbRef = myRefCoord.size(); + for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + TCoordSlice aCoord = GetCoord(aRefId); + switch(aRefId){ + case 0: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; + case 1: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break; + case 2: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; + case 3: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break; + case 4: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break; + } + } + } + + virtual + void + InitFun(const TShapeFun::TCCoordSliceArr& theRef, + const TShapeFun::TCCoordSliceArr& theGauss, + TFun& theFun) const + { + GetFun(theRef,theGauss,theFun); + + TInt aNbGauss = theGauss.size(); + for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){ + const TCCoordSlice& aCoord = theGauss[aGaussId]; + TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId); + + aSlice[0] = 0.25*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]); + aSlice[1] = 0.25*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(+aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]); + aSlice[2] = 0.25*(+aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(+aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]); + aSlice[3] = 0.25*(+aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]); + aSlice[4] = 1.0 - aCoord[2]; + } + } + }; + + + //--------------------------------------------------------------- + struct TPyra5b: TShapeFun + { + TPyra5b(): + TShapeFun(3,5) + { + TInt aNbRef = myRefCoord.size(); + for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + TCoordSlice aCoord = GetCoord(aRefId); + switch(aRefId){ + case 0: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; + case 3: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break; + case 2: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; + case 1: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break; + case 4: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break; + } + } + } + + virtual + void + InitFun(const TShapeFun::TCCoordSliceArr& theRef, + const TShapeFun::TCCoordSliceArr& theGauss, + TFun& theFun) const + { + GetFun(theRef,theGauss,theFun); + + TInt aNbGauss = theGauss.size(); + for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){ + const TCCoordSlice& aCoord = theGauss[aGaussId]; + TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId); + + aSlice[0] = 0.25*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]); + aSlice[3] = 0.25*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(+aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]); + aSlice[2] = 0.25*(+aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(+aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]); + aSlice[1] = 0.25*(+aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]); + aSlice[4] = 1.0 - aCoord[2]; + } + } + }; + + + //--------------------------------------------------------------- + struct TPyra13a: TShapeFun + { + TPyra13a(): + TShapeFun(3,13) + { + TInt aNbRef = myRefCoord.size(); + for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + TCoordSlice aCoord = GetCoord(aRefId); + switch(aRefId){ + case 0: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; + case 1: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break; + case 2: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; + case 3: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break; + case 4: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break; + + case 5: aCoord[0] = 0.5; aCoord[1] = 0.5; aCoord[2] = 0.0; break; + case 6: aCoord[0] = -0.5; aCoord[1] = 0.5; aCoord[2] = 0.0; break; + case 7: aCoord[0] = -0.5; aCoord[1] = -0.5; aCoord[2] = 0.0; break; + case 8: aCoord[0] = 0.5; aCoord[1] = -0.5; aCoord[2] = 0.0; break; + case 9: aCoord[0] = 0.5; aCoord[1] = 0.0; aCoord[2] = 0.5; break; + case 10: aCoord[0] = 0.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break; + case 11: aCoord[0] = -0.5; aCoord[1] = 0.0; aCoord[2] = 0.5; break; + case 12: aCoord[0] = 0.0; aCoord[1] = -0.5; aCoord[2] = 0.5; break; + } + } + } + + virtual + void + InitFun(const TShapeFun::TCCoordSliceArr& theRef, + const TShapeFun::TCCoordSliceArr& theGauss, + TFun& theFun) const + { + GetFun(theRef,theGauss,theFun); + + TInt aNbGauss = theGauss.size(); + for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){ + const TCCoordSlice& aCoord = theGauss[aGaussId]; + TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId); + + aSlice[0] = 0.5*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)* + (aCoord[0] - 0.5)/(1.0 - aCoord[2]); + aSlice[1] = 0.5*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(+aCoord[0] - aCoord[1] + aCoord[2] - 1.0)* + (aCoord[1] - 0.5)/(1.0 - aCoord[2]); + aSlice[2] = 0.5*(+aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(+aCoord[0] + aCoord[1] + aCoord[2] - 1.0)* + (-aCoord[0] - 0.5)/(1.0 - aCoord[2]); + aSlice[3] = 0.5*(+aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)* + (-aCoord[1] - 0.5)/(1.0 - aCoord[2]); + + aSlice[4] = 2.0*aCoord[2]*(aCoord[2] - 0.5); + + aSlice[5] = 0.5*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)* + (aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]); + aSlice[6] = 0.5*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(aCoord[0] - aCoord[1] + aCoord[2] - 1.0)* + (aCoord[0] + aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]); + aSlice[7] = 0.5*(aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(aCoord[0] + aCoord[1] + aCoord[2] - 1.0)* + (-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]); + aSlice[8] = 0.5*(aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)* + (-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]); + + aSlice[9] = 0.5*aCoord[2]*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/ + (1.0 - aCoord[2]); + aSlice[10] = 0.5*aCoord[2]*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/ + (1.0 - aCoord[2]); + aSlice[11] = 0.5*aCoord[2]*(aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(aCoord[0] + aCoord[1] + aCoord[2] - 1.0)/ + (1.0 - aCoord[2]); + aSlice[12] = 0.5*aCoord[2]*(aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)/ + (1.0 - aCoord[2]); + } + } + }; + + + //--------------------------------------------------------------- + struct TPyra13b: TShapeFun + { + TPyra13b(): + TShapeFun(3,13) + { + TInt aNbRef = myRefCoord.size(); + for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){ + TCoordSlice aCoord = GetCoord(aRefId); + switch(aRefId){ + case 0: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; + case 3: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break; + case 2: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break; + case 1: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break; + case 4: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break; + + case 8: aCoord[0] = 0.5; aCoord[1] = 0.5; aCoord[2] = 0.0; break; + case 7: aCoord[0] = -0.5; aCoord[1] = 0.5; aCoord[2] = 0.0; break; + case 6: aCoord[0] = -0.5; aCoord[1] = -0.5; aCoord[2] = 0.0; break; + case 5: aCoord[0] = 0.5; aCoord[1] = -0.5; aCoord[2] = 0.0; break; + case 9: aCoord[0] = 0.5; aCoord[1] = 0.0; aCoord[2] = 0.5; break; + case 12: aCoord[0] = 0.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break; + case 11: aCoord[0] = -0.5; aCoord[1] = 0.0; aCoord[2] = 0.5; break; + case 10: aCoord[0] = 0.0; aCoord[1] = -0.5; aCoord[2] = 0.5; break; + } + } + } + + virtual + void + InitFun(const TShapeFun::TCCoordSliceArr& theRef, + const TShapeFun::TCCoordSliceArr& theGauss, + TFun& theFun) const + { + GetFun(theRef,theGauss,theFun); + + TInt aNbGauss = theGauss.size(); + for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){ + const TCCoordSlice& aCoord = theGauss[aGaussId]; + TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId); + + aSlice[0] = 0.5*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)* + (aCoord[0] - 0.5)/(1.0 - aCoord[2]); + aSlice[3] = 0.5*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(+aCoord[0] - aCoord[1] + aCoord[2] - 1.0)* + (aCoord[1] - 0.5)/(1.0 - aCoord[2]); + aSlice[2] = 0.5*(+aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(+aCoord[0] + aCoord[1] + aCoord[2] - 1.0)* + (-aCoord[0] - 0.5)/(1.0 - aCoord[2]); + aSlice[1] = 0.5*(+aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)* + (-aCoord[1] - 0.5)/(1.0 - aCoord[2]); + + aSlice[4] = 2.0*aCoord[2]*(aCoord[2] - 0.5); + + aSlice[8] = 0.5*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)* + (aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]); + aSlice[7] = 0.5*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(aCoord[0] - aCoord[1] + aCoord[2] - 1.0)* + (aCoord[0] + aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]); + aSlice[6] = 0.5*(aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(aCoord[0] + aCoord[1] + aCoord[2] - 1.0)* + (-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]); + aSlice[5] = 0.5*(aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)* + (-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]); + + aSlice[9] = 0.5*aCoord[2]*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/ + (1.0 - aCoord[2]); + aSlice[12] = 0.5*aCoord[2]*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/ + (1.0 - aCoord[2]); + aSlice[11] = 0.5*aCoord[2]*(aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(aCoord[0] + aCoord[1] + aCoord[2] - 1.0)/ + (1.0 - aCoord[2]); + aSlice[10] = 0.5*aCoord[2]*(aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)/ + (1.0 - aCoord[2]); + } + } + }; + + //--------------------------------------------------------------- bool GetGaussCoord3D(const TGaussInfo& theGaussInfo, @@ -1096,10 +1809,20 @@ namespace MED if(TQuad4a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) return true; + if(TQuad4b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) + return true; + break; } case eQUAD8: { INITMSG(MYDEBUG,"eQUAD8"<<endl); + + if(TQuad8a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) + return true; + + if(TQuad8b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) + return true; + break; } case eTETRA4: { @@ -1108,10 +1831,20 @@ namespace MED if(TTetra4a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) return true; + if(TTetra4b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) + return true; + break; } case ePYRA5: { INITMSG(MYDEBUG,"ePYRA5"<<endl); + + if(TPyra5a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) + return true; + + if(TPyra5b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) + return true; + break; } case ePENTA6: { @@ -1120,6 +1853,9 @@ namespace MED if(TPenta6a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) return true; + if(TPenta6b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) + return true; + break; } case eHEXA8: { @@ -1128,6 +1864,9 @@ namespace MED if(THexa8a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) return true; + if(THexa8b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) + return true; + break; } case eTETRA10: { @@ -1136,10 +1875,20 @@ namespace MED if(TTetra10a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) return true; + if(TTetra10b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) + return true; + break; } case ePYRA13: { INITMSG(MYDEBUG,"ePYRA13"<<endl); + + if(TPyra13a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) + return true; + + if(TPyra13b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) + return true; + break; } case ePENTA15: { @@ -1148,6 +1897,9 @@ namespace MED if(TPenta15a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) return true; + if(TPenta15b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) + return true; + break; } case eHEXA20: { @@ -1156,6 +1908,9 @@ namespace MED if(THexa20a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) return true; + if(THexa20b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode)) + return true; + break; } default: @@ -1189,6 +1944,8 @@ namespace MED theGaussCoord.Init(aNbElem,aNbGauss,aDim,theMode); + TInt aConnDim = theCellInfo.GetConnDim(); + INITMSGA(MYDEBUG,0, "- aDim = "<<aDim<< "; aNbGauss = "<<aNbGauss<< @@ -1201,8 +1958,6 @@ namespace MED TCConnSlice aConnSlice = theCellInfo.GetConnSlice(aCellId); TCoordSliceArr aCoordSliceArr = theGaussCoord.GetCoordSliceArr(anElemId); - TInt aConnDim = aConnSlice.size(); - for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){ TCoordSlice& aGaussCoordSlice = aCoordSliceArr[aGaussId]; diff --git a/src/MEDWrapper/Base/MED_Structures.cxx b/src/MEDWrapper/Base/MED_Structures.cxx index 0c1346e46..c87203616 100644 --- a/src/MEDWrapper/Base/MED_Structures.cxx +++ b/src/MEDWrapper/Base/MED_Structures.cxx @@ -454,3 +454,323 @@ TTimeStampVal { return myGeom2Value[theGeom]; } + +//--------------------------------------------------------------- +// TGrilleInfo structure methods +//--------------------------------------------------------------- +const EGrilleType& +TGrilleInfo +::GetGrilleType() const +{ + return myGrilleType; +} + +EGrilleType +TGrilleInfo +::GetGrilleType() +{ + return myGrilleType; +} + +void +TGrilleInfo +::SetGrilleType(EGrilleType theGrilleType) +{ + myGrilleType = theGrilleType; +} + +const +TIndexes& +TGrilleInfo +::GetMapOfIndexes() const +{ + return myIndixes; +} + +TIndexes +TGrilleInfo +::GetMapOfIndexes() +{ + return myIndixes; +} + +const +TFloatVector& +TGrilleInfo +::GetIndexes(TInt theAxisNumber) const +{ + TIndexes::const_iterator aIter=myIndixes.find(theAxisNumber); + if(aIter==myIndixes.end()) + EXCEPTION(runtime_error,"const TGrilleInfo::GetIndexes - myIndixes.find(theAxisNumber); fails"); + return aIter->second; +} + +TFloatVector +TGrilleInfo +::GetIndexes(TInt theAxisNumber) +{ + TIndexes::iterator aIter=myIndixes.find(theAxisNumber); + if(aIter==myIndixes.end()) + EXCEPTION(runtime_error,"TGrilleInfo::GetIndexes - myIndixes.find(theAxisNumber); fails"); + return aIter->second; +} + +TInt +TGrilleInfo +::GetNbIndexes(TInt theAxisNumber) +{ + const TFloatVector& aVector=GetIndexes(theAxisNumber); + return aVector.size(); +} + +TInt +TGrilleInfo +::GetNbNodes() +{ + TInt nbNodes=0; + TInt aDim = myMeshInfo->GetDim(); + if(myGrilleType == eGRILLE_STANDARD) + for(int i=0;i<aDim;i++) + if(nbNodes == 0) + nbNodes = myGrilleStructure[i]; + else + nbNodes = nbNodes*myGrilleStructure[i]; + else + for(int i=0;i<aDim;i++) + if(nbNodes == 0) + nbNodes = GetNbIndexes(i); + else + nbNodes = nbNodes*GetNbIndexes(i); + + return nbNodes; +} + +TInt +TGrilleInfo +::GetNbCells() +{ + TInt nbCells=0; + TInt aDim = myMeshInfo->GetDim(); + if(myGrilleType == eGRILLE_STANDARD) + for(int i=0;i<aDim;i++) + if(nbCells == 0) + nbCells = myGrilleStructure[i]-1; + else + nbCells = nbCells*(myGrilleStructure[i]-1); + else + for(int i=0;i<aDim;i++) + if(nbCells == 0) + nbCells = GetNbIndexes(i)-1; + else + nbCells = nbCells*(GetNbIndexes(i)-1); + return nbCells; +} + +EGeometrieElement +TGrilleInfo +::GetGeom() +{ + TInt aDim = myMeshInfo->GetDim(); + switch(aDim){ + case 1: + return eSEG2; + case 2: + return eQUAD4; + case 3: + return eHEXA8; + default: + return eNONE; + } +} + +EEntiteMaillage +TGrilleInfo +::GetEntity() +{ + return eMAILLE; +} + +const +TIntVector& +TGrilleInfo +::GetGrilleStructure() const +{ + return myGrilleStructure; +} + +TIntVector +TGrilleInfo +::GetGrilleStructure() +{ + return myGrilleStructure; +} + +void +TGrilleInfo +::SetGrilleStructure(TInt theAxis,TInt theNb) +{ + if(theAxis >= 0 && theAxis <=2 && theNb >= 0) + myGrilleStructure[theAxis]=theNb; +} + +const +TNodeCoord& +TGrilleInfo +::GetNodeCoord() const +{ + return myCoord; +} + +TNodeCoord +TGrilleInfo +::GetNodeCoord() +{ + return myCoord; +} + +TNodeCoord +TGrilleInfo +::GetCoord(TInt theId) +{ + TNodeCoord aCoord; + TInt aDim = myMeshInfo->GetDim(); + TInt aNbNodes = this->GetNbNodes(); + aCoord.resize(aDim); + + if(theId >= aNbNodes) + EXCEPTION(runtime_error,"TGrilleInfo::GetCoord - theId out of range"); + + if(myGrilleType == eGRILLE_STANDARD){ + switch(aDim){ + case 3: + aCoord[2] = myCoord[aDim*theId+2]; + case 2: + aCoord[1] = myCoord[aDim*theId+1]; + case 1:{ + aCoord[0] = myCoord[aDim*theId]; + break; + } + } + } else { + + TFloatVector aVecX = this->GetIndexes(0); + TInt nbIndxX = this->GetNbIndexes(0); + + switch(aDim){ + case 1:{ + aCoord[0] = aVecX[theId]; + break; + } + case 2:{ + TFloatVector aVecY = this->GetIndexes(1); + TInt i,j,k; + i = j = k = 0; + i = theId % nbIndxX; + j = theId / nbIndxX; + if(myGrilleType == eGRILLE_CARTESIENNE){ + aCoord[0] = aVecX[i]; + aCoord[1] = aVecY[j]; + } else { // eGRILLE_POLAIRE (cylindrical) + aCoord[0] = aVecX[i] * cos(aVecY[j]); + aCoord[1] = aVecX[i] * sin(aVecY[j]); + } + break; + } + case 3:{ + TFloatVector aVecY = this->GetIndexes(1); + TInt nbIndxY = this->GetNbIndexes(1); + TFloatVector aVecZ = this->GetIndexes(2); + TInt i,j,k; + i = j = k = 0; + + i = theId % nbIndxX; + j = (theId / nbIndxX) % nbIndxY; + k = theId / (nbIndxX*nbIndxY); + + if(myGrilleType == eGRILLE_CARTESIENNE){ + aCoord[0] = aVecX[i]; + aCoord[1] = aVecY[j]; + aCoord[2] = aVecZ[k]; + } else { // eGRILLE_POLAIRE (cylindrical) + aCoord[0] = aVecX[i] * cos(aVecY[j]); + aCoord[1] = aVecX[i] * sin(aVecY[j]); + aCoord[2] = aVecZ[k]; + } + + break; + } + } + } + + return aCoord; +} + +TIntVector +TGrilleInfo +::GetConn(TInt theId) +{ + TIntVector anIndexes; + TInt aDim = myMeshInfo->GetDim(); + TInt aArrSize = 2; + for(int i=1;i<aDim;i++) aArrSize = aArrSize*2; + + TInt idx; + TInt iMin, iMax, jMin, jMax, kMin, kMax; + TInt loc[3]; + + loc[0] = loc[1] = loc[2] = 0; + iMin = iMax = jMin = jMax = kMin = kMax = 0; + + TInt nbX,nbY; + if (myGrilleType == eGRILLE_STANDARD) + { + nbX = this->GetGrilleStructure()[0]; + nbY = this->GetGrilleStructure()[1]; + } + else + { + nbX = this->GetNbIndexes(0); + nbY = this->GetNbIndexes(1); + } + + TInt d01 = nbX*nbY; + + switch(aDim){ + case 3:{ + iMin = theId % (nbX - 1); + iMax = iMin + 1; + jMin = (theId / (nbX - 1)) % (nbY - 1); + jMax = jMin + 1; + kMin = theId / ((nbX - 1) * (nbY - 1)); + kMax = kMin + 1; + break; + } + case 2:{ + iMin = theId % (nbX-1); + iMax = iMin + 1; + jMin = theId / (nbX-1); + jMax = jMin + 1; + break; + } + case 1:{ + iMin = theId; + iMax = theId + 1; + break; + } + } + + + for (loc[2]=kMin; loc[2]<=kMax; loc[2]++) + { + for (loc[1]=jMin; loc[1]<=jMax; loc[1]++) + { + for (loc[0]=iMin; loc[0]<=iMax; loc[0]++) + { + idx = loc[0] + loc[1]*nbX + loc[2]*d01; + anIndexes.push_back(idx); + } + } + } + + return anIndexes; +} diff --git a/src/MEDWrapper/Base/MED_Structures.hxx b/src/MEDWrapper/Base/MED_Structures.hxx index f22f4b977..a4160a738 100644 --- a/src/MEDWrapper/Base/MED_Structures.hxx +++ b/src/MEDWrapper/Base/MED_Structures.hxx @@ -594,6 +594,93 @@ namespace MED TMeshValue& GetMeshValue(EGeometrieElement theGeom); }; + + typedef std::map<TInt,TFloatVector> TIndexes; + typedef std::map<TInt,TString> TNames; + + //! Define a base class which represents MED Grille + struct TGrilleInfo: + virtual TModeSwitchInfo + { + + PMeshInfo myMeshInfo; + const PMeshInfo& GetMeshInfo() const { return myMeshInfo;} + + TNodeCoord myCoord; //!< Contains all nodal coordinates, now used only for eGRILLE_STANDARD + //! Gives coordinates for mesh nodes (const version) + const TNodeCoord& GetNodeCoord() const; + TNodeCoord GetNodeCoord(); + //! Gives coordinates for mesh node by its number, array index from 0 + TNodeCoord GetCoord(TInt theId); + //! Gives ids of nodes for mesh cell by its number, array index from 0 + TIntVector GetConn(TInt theId); + + EGrilleType myGrilleType; //!< Defines grille type (eGRILLE_CARTESIENNE,eGRILLE_POLAIRE,eGRILLE_STANDARD) + //!Gets grille type (const version) + const EGrilleType& GetGrilleType() const; + //!Gets grille type + EGrilleType GetGrilleType(); + //!Sets grille type + void SetGrilleType(EGrilleType theGrilleType); + + + + TString myCoordNames; //!< Contains names for the coordinate dimensions + //! Get name of the coordinate dimension by its order number + virtual std::string GetCoordName(TInt theId) const = 0 ; + //! Set name of the coordinate dimension by its order number + virtual void SetCoordName(TInt theId, const std::string& theValue) = 0; + + TString myCoordUnits; //!< Contains units for the coordinate dimensions + //! Get name of unit for the coordinate dimension by its order number + virtual std::string GetCoordUnit(TInt theId) const = 0; + //! Set name of unit for the coordinate dimension by its order number + virtual void SetCoordUnit(TInt theId, const std::string& theValue) = 0; + + + //! Map of index of axes and Table of indexes for certain axe, now used for eGRILLE_CARTESIENNE and eGRILLE_POLAIRE + TIndexes myIndixes; + //!Gets a map of Tables (const version) + const TIndexes& GetMapOfIndexes() const ; + //!Gets a map of Tables + TIndexes GetMapOfIndexes(); + //!Gets a Table of indexes for certain axe(const version) + const TFloatVector& GetIndexes(TInt theAxisNumber) const; + //!Gets a Table of indexes for certain axe + TFloatVector GetIndexes(TInt theAxisNumber); + //!Gets a number of indices per axe + TInt GetNbIndexes(TInt theAxisNumber); + + TInt GetNbNodes();//! Return count of all points + TInt GetNbCells();//! Return count of all cells + EGeometrieElement GetGeom();//! Return geometry of cells (calculated from mesh dimension) + EEntiteMaillage GetEntity();//! Return entity (eMAILLE) + + /*! + *Vector of grille structure (Example: {3,4,5}, 3 nodes in X axe, 4 nodes in Y axe, ...) + *Used only for eGRILLE_STANDARD + */ + TIntVector myGrilleStructure; + //!Gets grille structure(const version) + const TIntVector& GetGrilleStructure() const; + //!Gets grille structure + TIntVector GetGrilleStructure(); + //!Sets the grille structure of theAxis axe to theNb. + void SetGrilleStructure(TInt theAxis,TInt theNb); + + /*! + *Defines sequence MED Family indexes for corresponding mesh entites + *Not used now. + */ + TElemNum myFamNum; + //! Get number of a MED FAMILY by order number of the mesh element + TInt GetFamNum(TInt theId) const; + //! Set number of a MED FAMILY for the mesh element with the order number + void SetFamNum(TInt theId, TInt theVal); + + }; + + } #endif diff --git a/src/MEDWrapper/Base/MED_TStructures.hxx b/src/MEDWrapper/Base/MED_TStructures.hxx index 71be52285..109f4c5bc 100644 --- a/src/MEDWrapper/Base/MED_TStructures.hxx +++ b/src/MEDWrapper/Base/MED_TStructures.hxx @@ -910,6 +910,118 @@ namespace MED } }; + //--------------------------------------------------------------- + template<EVersion eVersion> + struct TTGrilleInfo: + virtual TGrilleInfo + { + TTGrilleInfo(const PMeshInfo& theMeshInfo, + const PGrilleInfo& theInfo) + { + myMeshInfo = theMeshInfo; + + myCoord = theInfo->GetNodeCoord(); + + myGrilleType = theInfo->GetGrilleType(); + + myCoordNames = theInfo->myCoordNames; + + myCoordUnits = theInfo->myCoordUnits; + + myIndixes = theInfo->GetMapOfIndexes(); + + myGrilleStructure = theInfo->GetGrilleStructure(); + + myGrilleType = theInfo->GetGrilleType(); + + } + + TTGrilleInfo(const PMeshInfo& theMeshInfo, + const EGrilleType& type, + const TInt nnoeuds) + { + myMeshInfo = theMeshInfo; + TInt aDim = theMeshInfo->GetDim(); + if(type == eGRILLE_STANDARD){ + myCoord.resize(aDim*nnoeuds); + myCoordNames.resize(aDim*GetPNOMLength<eVersion>()+1); + myCoordUnits.resize(aDim*GetPNOMLength<eVersion>()+1); + } else { //if(type == eGRILLE_CARTESIENNE){ + myCoordNames.resize(aDim*GetPNOMLength<eVersion>()+aDim); + myCoordUnits.resize(aDim*GetPNOMLength<eVersion>()+aDim); + } + + myGrilleStructure.resize(theMeshInfo->myDim); + + } + + TTGrilleInfo(const PMeshInfo& theMeshInfo, + const EGrilleType& type) + { + myMeshInfo = theMeshInfo; + TInt aDim = theMeshInfo->GetDim(); + if(type == eGRILLE_STANDARD){ + myCoordNames.resize(aDim*GetPNOMLength<eVersion>()+1); + myCoordUnits.resize(aDim*GetPNOMLength<eVersion>()+1); + } else {// if(type == eGRILLE_CARTESIENNE){ + myCoordNames.resize(aDim*GetPNOMLength<eVersion>()+aDim); + myCoordUnits.resize(aDim*GetPNOMLength<eVersion>()+aDim); + } + TTGrilleInfo(theMeshInfo,type,0); + } + + TTGrilleInfo(const PMeshInfo& theMeshInfo, + const EGrilleType& type, + const MED::TIntVector& nbNodeVec) + { + myMeshInfo = theMeshInfo; + + TInt aDim = theMeshInfo->GetDim(); + if(type == eGRILLE_STANDARD){ + myCoordNames.resize(aDim*GetPNOMLength<eVersion>()+1); + myCoordUnits.resize(aDim*GetPNOMLength<eVersion>()+1); + } else {// if(type == eGRILLE_CARTESIENNE){ + myCoordNames.resize(aDim*GetPNOMLength<eVersion>()+aDim); + myCoordUnits.resize(aDim*GetPNOMLength<eVersion>()+aDim); + } + + if(type != eGRILLE_STANDARD) + for(int aAxe=0;aAxe<nbNodeVec.size();aAxe++){ + myIndixes[aAxe].resize(nbNodeVec[aAxe]); + } + + TTGrilleInfo(theMeshInfo,type,0); + } + + virtual + std::string + GetCoordName(TInt theId) const + { + return GetString(theId,GetPNOMLength<eVersion>(),myCoordNames); + } + + virtual + void + SetCoordName(TInt theId, const std::string& theValue) + { + SetString(theId,GetPNOMLength<eVersion>(),myCoordNames,theValue); + } + + virtual + std::string + GetCoordUnit(TInt theId) const + { + return GetString(theId,GetPNOMLength<eVersion>(),myCoordUnits); + } + + virtual + void + SetCoordUnit(TInt theId, const std::string& theValue) + { + SetString(theId,GetPNOMLength<eVersion>(),myCoordUnits,theValue); + } + + }; } #endif diff --git a/src/MEDWrapper/Base/MED_TWrapper.hxx b/src/MEDWrapper/Base/MED_TWrapper.hxx index 3faa314c7..fe36efa87 100644 --- a/src/MEDWrapper/Base/MED_TWrapper.hxx +++ b/src/MEDWrapper/Base/MED_TWrapper.hxx @@ -109,6 +109,36 @@ namespace MED theInfo)); } + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + virtual + PElemInfo + CrElemInfo(const PMeshInfo& theMeshInfo, + TInt theNbElem, + EBooleen theIsElemNum = eVRAI, + EBooleen theIsElemNames = eVRAI) + { + return PElemInfo(new TTElemInfo<eVersion> + (theMeshInfo, + theNbElem, + theIsElemNum, + theIsElemNames)); + } + + virtual + PElemInfo + CrElemInfo(const PMeshInfo& theMeshInfo, + TInt theNbElem, + const TIntVector& theFamNum, + const TIntVector& aElemNum, + const TStringVector& aElemNames) + { + return PElemInfo(new TTElemInfo<eVersion> + (theMeshInfo, + theNbElem, + theFamNum, + aElemNum, + aElemNames)); + } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ virtual @@ -452,6 +482,50 @@ namespace MED theInfo)); } + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + virtual + PGrilleInfo + CrGrilleInfo(const PMeshInfo& theMeshInfo, + const PGrilleInfo& theInfo) + { + return PGrilleInfo(new TTGrilleInfo<eVersion> + (theMeshInfo, + theInfo)); + } + virtual + PGrilleInfo + CrGrilleInfo(const PMeshInfo& theMeshInfo, + const EGrilleType& type) + { + return PGrilleInfo(new TTGrilleInfo<eVersion> + (theMeshInfo, + type)); + } + + virtual + PGrilleInfo + CrGrilleInfo(const PMeshInfo& theMeshInfo, + const EGrilleType& type, + const TInt& nbNodes) + { + return PGrilleInfo(new TTGrilleInfo<eVersion> + (theMeshInfo, + type, + nbNodes)); + } + + virtual + PGrilleInfo + CrGrilleInfo(const PMeshInfo& theMeshInfo, + const EGrilleType& type, + const MED::TIntVector& nbNodeVec) + { + return PGrilleInfo(new TTGrilleInfo<eVersion> + (theMeshInfo, + type, + nbNodeVec)); + } + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ }; } diff --git a/src/MEDWrapper/Base/MED_Wrapper.cxx b/src/MEDWrapper/Base/MED_Wrapper.cxx index 763bdacba..3775c6e9d 100644 --- a/src/MEDWrapper/Base/MED_Wrapper.cxx +++ b/src/MEDWrapper/Base/MED_Wrapper.cxx @@ -60,6 +60,10 @@ namespace MED TInt theId, TErr* theErr) { + // must be reimplemented in connection with mesh type eSTRUCTURE + // if(theMeshInfo->GetType() != eNON_STRUCTURE) + // return PFamilyInfo(); + TInt aNbAttr = GetNbFamAttr(theId,*theMeshInfo); TInt aNbGroup = GetNbFamGroup(theId,*theMeshInfo); PFamilyInfo anInfo = CrFamilyInfo(theMeshInfo,aNbGroup,aNbAttr); @@ -88,6 +92,10 @@ namespace MED TErr* theErr) { TInt aNbElems = GetNbNodes(*theMeshInfo); + if(aNbElems == 0){ + return PNodeInfo(); + } + PNodeInfo anInfo = CrNodeInfo(theMeshInfo,aNbElems); GetNodeInfo(*anInfo,theErr); @@ -134,6 +142,9 @@ namespace MED EGeometrieElement theGeom, EConnectivite theConnMode) { + if(theMeshInfo->GetType() != eNON_STRUCTURE) + return PPolygoneInfo(); + TInt aNbElem = GetNbPolygones(theMeshInfo,theEntity,theGeom,theConnMode); TInt aConnSize = GetPolygoneConnSize(theMeshInfo,theEntity,theGeom,theConnMode); PPolygoneInfo anInfo = CrPolygoneInfo(theMeshInfo,theEntity,theGeom,aNbElem,aConnSize,theConnMode); @@ -165,6 +176,8 @@ namespace MED EGeometrieElement theGeom, EConnectivite theConnMode) { + if(theMeshInfo->GetType() != eNON_STRUCTURE) + return PPolyedreInfo(); TInt aNbElem = GetNbPolyedres(theMeshInfo,theEntity,theGeom,theConnMode); TInt aNbFaces, aConnSize; GetPolyedreConnSize(theMeshInfo,aNbFaces,aConnSize,theConnMode); @@ -196,6 +209,94 @@ namespace MED return anInfo; } + PElemInfo + TWrapper + ::GetPElemInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity, + EGeometrieElement theGeom, + EConnectivite theConnMode, + TErr* theErr) + { + EMaillage aType = theMeshInfo->GetType(); + if(aType == eNON_STRUCTURE){ + switch(theGeom){ + case ePOINT1: + return GetPNodeInfo(theMeshInfo,theErr); + break; + case ePOLYGONE: + return GetPPolygoneInfo(theMeshInfo,theEntity,theGeom,theConnMode); + break; + case ePOLYEDRE: + return GetPPolyedreInfo(theMeshInfo,theEntity,theGeom,theConnMode); + break; + default: + return GetPCellInfo(theMeshInfo,theEntity,theGeom,theConnMode,theErr); + } + } else { + PGrilleInfo aGrille = GetPGrilleInfo(theMeshInfo); + + TInt nbElems; + EBooleen theIsElemNum = eFAUX; + // nodes + switch(theGeom){ + case ePOINT1: + nbElems = aGrille->GetNbNodes(); + theIsElemNum = eVRAI; + break; + case eSEG2: + case eQUAD4: + case eHEXA8: + nbElems = aGrille->GetNbCells(); + break; + default: + nbElems = 0; + } + + TIntVector aFamNum; + TIntVector aElemNum; + TStringVector aElemNames; + + PElemInfo aElemInfo; + + if(theGeom == ePOINT1){ + aElemInfo = CrElemInfo(theMeshInfo, + nbElems, + theIsElemNum); + MED::TElemInfo &aTElemInfo = *aElemInfo; + + // must be reimplemente in connection with mesh type eSTRUCTURE +// GetNumeration(aTElemInfo, +// nbElems, +// theEntity, +// theGeom, +// theErr); + + GetFamilies(aTElemInfo, + nbElems, + theEntity, + theGeom, + theErr); + + // must be reimplemente in connection with mesh type eSTRUCTURE +// GetNames(aTElemInfo, +// nbElems, +// theEntity, +// theGeom, +// theErr); + } else { + aElemInfo = CrElemInfo(theMeshInfo, + nbElems, + aFamNum, + aElemNum, + aElemNames); + } + + return aElemInfo; + } + return PElemInfo(); + } + + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PCellInfo TWrapper @@ -205,6 +306,8 @@ namespace MED EConnectivite theConnMode, TErr* theErr) { + if(theMeshInfo->GetType() != eNON_STRUCTURE) + return PCellInfo(); TInt aNbElem = GetNbCells(theMeshInfo,theEntity,theGeom,theConnMode); PCellInfo anInfo = CrCellInfo(theMeshInfo,theEntity,theGeom,aNbElem,theConnMode); GetCellInfo(anInfo,theErr); @@ -348,4 +451,53 @@ namespace MED return anInfo; } + + PGrilleInfo + TWrapper + ::GetPGrilleInfo(const PMeshInfo& theMeshInfo) + { + if(theMeshInfo->GetType() != eSTRUCTURE) + return PGrilleInfo(); + + EGrilleType type; + GetGrilleType(*theMeshInfo,type); + PGrilleInfo anInfo; + if(type == eGRILLE_STANDARD){ + const TInt nnoeuds = GetNbNodes(*theMeshInfo); + anInfo = CrGrilleInfo(theMeshInfo,type,nnoeuds); + } + else { + TIntVector aVec; + aVec.resize(theMeshInfo->GetDim()); + for(int aAxe=0;aAxe<theMeshInfo->GetDim();aAxe++){ + ETable aATable; + switch(aAxe){ + case 0: + aATable = eCOOR_IND1; + break; + case 1: + aATable = eCOOR_IND2; + break; + case 2: + aATable = eCOOR_IND3; + break; + } + aVec[aAxe] = GetNbNodes(*theMeshInfo,aATable); + } + anInfo = CrGrilleInfo(theMeshInfo,type,aVec); + } + + GetGrilleInfo(anInfo); + anInfo->SetGrilleType(type); + return anInfo; + } + + PGrilleInfo + TWrapper + ::GetPGrilleInfo(const PMeshInfo& theMeshInfo, + const PGrilleInfo& theInfo) + { + PGrilleInfo anInfo = CrGrilleInfo(theMeshInfo,theInfo); + return anInfo; + } } diff --git a/src/MEDWrapper/Base/MED_Wrapper.hxx b/src/MEDWrapper/Base/MED_Wrapper.hxx index 23c4a08a6..db861b118 100644 --- a/src/MEDWrapper/Base/MED_Wrapper.hxx +++ b/src/MEDWrapper/Base/MED_Wrapper.hxx @@ -208,6 +208,14 @@ namespace MED TErr* theErr = NULL) {} + //! Read a MEDWrapper MED Element representation from defined MED file + PElemInfo + GetPElemInfo(const PMeshInfo& theMeshInfo, + EEntiteMaillage theEntity = eNOEUD, + EGeometrieElement theGeom = ePOINT1, + EConnectivite theConnMode = eNOD, + TErr* theErr = NULL); + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //! Read number of nodes in defined MED Mesh virtual @@ -215,6 +223,15 @@ namespace MED GetNbNodes(const TMeshInfo& theMeshInfo, TErr* theErr = NULL) = 0; + virtual + TInt + GetNbNodes(const TMeshInfo& theMeshInfo, + ETable theTable, + TErr* theErr = NULL) + { + return 0; + } + //! Read a MEDWrapper MED Nodes representation from defined MED file virtual void @@ -229,6 +246,29 @@ namespace MED //! Creates a MEDWrapper MED Nodes representation virtual + PElemInfo + CrElemInfo(const PMeshInfo& theMeshInfo, + TInt theNbElem, + EBooleen theIsElemNum = eVRAI, + EBooleen theIsElemNames = eVRAI) + { + return PElemInfo(); + } + + //! Creates a MEDWrapper MED Nodes representation + virtual + PElemInfo + CrElemInfo(const PMeshInfo& theMeshInfo, + TInt theNbElem, + const TIntVector& theFamNum, + const TIntVector& aElemNum, + const TStringVector& aElemNames) + { + return PElemInfo(); + } + + //! Creates a MEDWrapper MED Nodes representation + virtual PNodeInfo CrNodeInfo(const PMeshInfo& theMeshInfo, TInt theNbElem, @@ -719,6 +759,88 @@ namespace MED const TKey2Gauss& theKey2Gauss, TErr* theErr = NULL); + //! Read a MEDWrapper MED Grille representation from defined MED file + /*! This feature is support only for version of 2.2 and higher */ + PGrilleInfo + GetPGrilleInfo(const PMeshInfo& theMeshInfo); + + //! Read a MEDWrapper MED Grille representation from defined MED file + /*! This feature is support only for version of 2.2 and higher */ + PGrilleInfo + GetPGrilleInfo(const PMeshInfo& theMeshInfo, + const PGrilleInfo& theInfo); + + //! Read a MEDWrapper MED Grille representation from defined MED file + /*! This feature is support only for version of 2.2 and higher */ + virtual + void + GetGrilleInfo(TGrilleInfo& theInfo, + TErr* theErr = NULL) + {} + + //! Write the MEDWrapper MED Grille representation into defined MED file + /*! This feature is support only for version of 2.2 and higher */ + virtual + void + SetGrilleInfo(const TGrilleInfo& theInfo, + TErr* theErr = NULL) + {} + + /*! This feature is support only for version of 2.2 and higher */ + virtual + PGrilleInfo + CrGrilleInfo(const PMeshInfo& theMeshInfo, + const PGrilleInfo& theGrilleInfo) + { + return PGrilleInfo(); + } + + /*! This feature is support only for version of 2.2 and higher */ + virtual + PGrilleInfo + CrGrilleInfo(const PMeshInfo& theMeshInfo) + { + return PGrilleInfo(); + } + + /*! This feature is support only for version of 2.2 and higher */ + virtual + PGrilleInfo + CrGrilleInfo(const PMeshInfo& theMeshInfo, + const EGrilleType& type) + { + return PGrilleInfo(); + } + + /*! This feature is support only for version of 2.2 and higher */ + virtual + PGrilleInfo + CrGrilleInfo(const PMeshInfo& theMeshInfo, + const EGrilleType& type, + const TInt& nbNodes) + { + return PGrilleInfo(); + } + + /*! This feature is support only for version of 2.2 and higher */ + virtual + PGrilleInfo + CrGrilleInfo(const PMeshInfo& theMeshInfo, + const EGrilleType& type, + const MED::TIntVector& nbNodeVec) + { + return PGrilleInfo(); + } + + /*! This feature is support only for version of 2.2 and higher */ + virtual + void + GetGrilleType(const TMeshInfo& theMeshInfo, + EGrilleType& type, + TErr* theErr = NULL) + { + } + }; diff --git a/src/MEDWrapper/V2_2/MED_V2_2_Wrapper.cxx b/src/MEDWrapper/V2_2/MED_V2_2_Wrapper.cxx index 853d61208..34c626acc 100644 --- a/src/MEDWrapper/V2_2/MED_V2_2_Wrapper.cxx +++ b/src/MEDWrapper/V2_2/MED_V2_2_Wrapper.cxx @@ -417,12 +417,7 @@ namespace MED med_entite_maillage(theEntity), med_geometrie_element(theGeom)); - theInfo.myIsElemNames = (theInfo.myElemNames).empty()? eFAUX : eVRAI ; - - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(runtime_error,"GetNames - MEDnomLire(...)"); + theInfo.myIsElemNames = aRet != 0? eFAUX : eVRAI ; } void @@ -450,12 +445,7 @@ namespace MED anEntity, aGeom); - theInfo.myIsElemNum = (theInfo.myElemNum).empty()? eFAUX : eVRAI ; - - if(theErr) - *theErr = aRet; - else if(aRet < 0) - EXCEPTION(runtime_error,"GetNumeration - MEDnumLire(...)"); + theInfo.myIsElemNum = aRet != 0? eFAUX : eVRAI; } void @@ -611,6 +601,7 @@ namespace MED TInt TVWrapper ::GetNbNodes(const MED::TMeshInfo& theMeshInfo, + ETable theTable, TErr* theErr) { TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); @@ -622,7 +613,7 @@ namespace MED return MEDnEntMaa(myFile->Id(), &aMeshInfo.myName[0], - MED_COOR, + (med_table)theTable, MED_NOEUD, med_geometrie_element(0), med_connectivite(0)); @@ -1027,7 +1018,9 @@ namespace MED if(theErr && *theErr < 0) return anInfo; - + + if(theMeshInfo.GetType() == eNON_STRUCTURE) { + TInt aNbElem = GetNbNodes(theMeshInfo); if(aNbElem > 0){ anInfo[eNOEUD][ePOINT1] = aNbElem; @@ -1047,6 +1040,61 @@ namespace MED } } } + } else { // eSTRUCTURE + EGrilleType aGrilleType; + TInt aNbNodes = 1; + TInt aNbElem = 1; + TInt aDim = theMeshInfo.GetDim(); + EGeometrieElement aGeom; + EEntiteMaillage anEntity = eMAILLE; + switch(aDim){ + case 1: + aGeom = eSEG2; + break; + case 2: + aGeom = eQUAD4; + break; + case 3: + aGeom = eHEXA8; + break; + } + + GetGrilleType(theMeshInfo,aGrilleType); + + if (aGrilleType == eGRILLE_STANDARD){ + TIntVector theStruct; + theStruct.resize(aDim); + GetGrilleStruct(theMeshInfo,theStruct,theErr); + for(med_int i=0;i<aDim;i++){ + aNbNodes = aNbNodes * theStruct[i]; + aNbElem = aNbElem * (theStruct[i]-1); + } + anInfo[eNOEUD][ePOINT1] = aNbNodes; + anInfo[anEntity][aGeom] = aNbElem; + + } else { // eGRILLE_CARTESIENNE and eGRILLE_POLAIRE + med_table quoi; + for(int aAxe=1;aAxe<=aDim;aAxe++) + { + switch(aAxe) { + case 1 : + quoi = MED_COOR_IND1; + break; + case 2 : + quoi = MED_COOR_IND2; + break; + case 3 : + quoi = MED_COOR_IND3; + break; + } + TInt nbn = GetNbNodes(theMeshInfo,(ETable)quoi); + aNbNodes = aNbNodes * nbn; + aNbElem = aNbElem * (nbn-1); + } + anInfo[eNOEUD][ePOINT1] = aNbNodes; + anInfo[anEntity][aGeom] = aNbElem; + } + } return anInfo; } @@ -1889,5 +1937,230 @@ namespace MED SetTimeStamp(theVal,eLECTURE_AJOUT,theErr); } + void + TVWrapper + ::SetGrilleInfo(const MED::TGrilleInfo& theInfo, + TErr* theErr) + { + SetGrilleInfo(theInfo,eLECTURE_ECRITURE,theErr); + } + + void + TVWrapper + ::SetGrilleInfo(const MED::TGrilleInfo& theInfo, + EModeAcces theMode, + TErr* theErr) + { + if(theInfo.myMeshInfo->myType != eSTRUCTURE) + return; + TFileWrapper aFileWrapper(myFile,theMode,theErr); + + if(theErr) + if(!*theErr) + return; + + MED::TGrilleInfo& anInfo = const_cast<MED::TGrilleInfo&>(theInfo); + MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo; + + TErr aRet = 0; + aRet = MEDnatureGrilleEcr(myFile->Id(), + &aMeshInfo.myName[0], + (med_type_grille)anInfo.myGrilleType); + if(theErr) + *theErr = aRet; + else if(aRet < 0) + EXCEPTION(runtime_error,"SetGrilleInfo - MEDnatureGrilleEcr(...)"); + + if(anInfo.myGrilleType == eGRILLE_STANDARD){ + med_int nnoeuds = (med_int)(anInfo.myCoord.size()/aMeshInfo.myDim); + aRet = MEDcoordEcr(myFile->Id(), + &aMeshInfo.myName[0], + aMeshInfo.myDim, + &anInfo.myCoord[0], + med_mode_switch(anInfo.myModeSwitch), + nnoeuds, + (med_repere)theInfo.myGrilleType, + &anInfo.myCoordNames[0], + &anInfo.myCoordUnits[0]); + + if(aRet < 0) + EXCEPTION(runtime_error,"SetGrilleInfo - MEDcoordEcr(...)"); + + aRet = MEDstructureCoordEcr(myFile->Id(), + &aMeshInfo.myName[0], + aMeshInfo.myDim, + &anInfo.myGrilleStructure[0]); + if(aRet < 0) + EXCEPTION(runtime_error,"SetGrilleInfo - MEDstructureCoordEcr(...)"); + + } else { + for(int aAxe=0;aAxe<aMeshInfo.myDim;aAxe++){ + aRet = MEDindicesCoordEcr(myFile->Id(), + &aMeshInfo.myName[0], + aMeshInfo.myDim, + &anInfo.GetIndexes(aAxe)[0], + anInfo.GetIndexes(aAxe).size(), + aAxe+1, + &anInfo.GetCoordName(aAxe)[0], + &anInfo.GetCoordUnit(aAxe)[0]); + if(aRet < 0) + EXCEPTION(runtime_error,"SetGrilleInfo - MEDindicesCoordEcr(...)"); + } + + } + + return; + } + + void + TVWrapper + ::GetGrilleInfo(TGrilleInfo& theInfo, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); + + if(theErr) + if(!*theErr) + return; + + MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo; + + EMaillage type_maillage = aMeshInfo.myType; + + GetGrilleType(aMeshInfo,theInfo.myGrilleType,theErr); + EGrilleType type = theInfo.myGrilleType; + + TErr aRet; + if(type_maillage == eSTRUCTURE && type == eGRILLE_STANDARD){ + + GetGrilleStruct(aMeshInfo,theInfo.myGrilleStructure,theErr); + + aRet = MEDcoordLire(myFile->Id(), + &aMeshInfo.myName[0], + aMeshInfo.myDim, + &theInfo.myCoord[0], + med_mode_switch(theInfo.myModeSwitch), + MED_ALL, // all coordinates must be return + NULL, + 0, + (med_repere*)&theInfo.myGrilleType, + &theInfo.myCoordNames[0], + &theInfo.myCoordUnits[0]); + + if(theErr) + *theErr = aRet; + else if(aRet < 0) + EXCEPTION(runtime_error,"GetGrilleInfo - MEDcoordLire(...)"); + //============================ + } + + if(type_maillage == eSTRUCTURE && type != eGRILLE_STANDARD){ + med_table quoi; + for(int aAxe=1;aAxe<=aMeshInfo.myDim;aAxe++) + { + switch(aAxe) { + case 1 : + quoi = MED_COOR_IND1; + break; + case 2 : + quoi = MED_COOR_IND2; + break; + case 3 : + quoi = MED_COOR_IND3; + break; + + default : + aRet = -1; + } + + if(theErr) + *theErr = aRet; + else if(aRet < 0) + EXCEPTION(runtime_error,"GetGrilleInfo - Axe number out of range(...)"); + + TInt nind = GetNbNodes(aMeshInfo,(ETable)quoi); + if(nind < 0) + EXCEPTION(runtime_error,"GetGrilleInfo - Erreur a la lecture de la taille de l'indice"); + + med_float* indices = (med_float*)&theInfo.myIndixes[aAxe-1][0]; + + char comp[MED_TAILLE_PNOM+1]; + char unit[MED_TAILLE_PNOM+1]; + + aRet = MEDindicesCoordLire(myFile->Id(), + &aMeshInfo.myName[0], + aMeshInfo.myDim, + indices, + (med_int)nind, + (med_int)aAxe, + comp, + unit); + theInfo.SetCoordName(aAxe-1,comp); + theInfo.SetCoordUnit(aAxe-1,unit); + if(theErr) + *theErr = aRet; + else if(aRet < 0) + EXCEPTION(runtime_error,"GetGrilleInfo - MEDindicesCoordLire(...)"); + } + } + } + + void + TVWrapper + ::GetGrilleType(const MED::TMeshInfo& theMeshInfo, + EGrilleType& type, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); + + if(theErr) + if(!*theErr) + EXCEPTION(runtime_error," GetGrilleType - aFileWrapper (...)"); + + MED::TMeshInfo& aMeshInfo = const_cast<MED::TMeshInfo&>(theMeshInfo); + + EMaillage type_maillage = aMeshInfo.myType; + + TErr aRet; + if(type_maillage == eSTRUCTURE){ + med_type_grille Mtype; + aRet = MEDnatureGrilleLire(myFile->Id(), + &aMeshInfo.myName[0], + &Mtype); + if(aRet < 0) + EXCEPTION(runtime_error,"GetGrilleInfo - MEDnatureGrilleLire(...)"); + + type = (EGrilleType)Mtype; + + } + } + + void + TVWrapper + ::GetGrilleStruct(const MED::TMeshInfo& theMeshInfo, + TIntVector& theStruct, + TErr* theErr) + { + TFileWrapper aFileWrapper(myFile,eLECTURE,theErr); + + if(theErr) + if(!*theErr) + return; + + TErr aRet; + MED::TMeshInfo& aMeshInfo = const_cast<MED::TMeshInfo&>(theMeshInfo); + + med_int* anGrilleStruct = aMeshInfo.myDim > 0? (med_int*)&theStruct[0]: NULL; + + aRet = MEDstructureCoordLire(myFile->Id(), + &aMeshInfo.myName[0], + aMeshInfo.myDim, + anGrilleStruct); + if(theErr) + *theErr = aRet; + else if(aRet < 0) + EXCEPTION(runtime_error,"GetGrilleInfo - MEDstructureCoordLire(...)"); + } + } } diff --git a/src/MEDWrapper/V2_2/MED_V2_2_Wrapper.hxx b/src/MEDWrapper/V2_2/MED_V2_2_Wrapper.hxx index f8398b758..dcd1e5f1a 100644 --- a/src/MEDWrapper/V2_2/MED_V2_2_Wrapper.hxx +++ b/src/MEDWrapper/V2_2/MED_V2_2_Wrapper.hxx @@ -77,6 +77,8 @@ namespace MED typedef MED::TTTimeStampVal<eV2_2> TVTimeStampVal; + typedef MED::TTGrilleInfo<eV2_2> TVGrilleInfo; + //--------------------------------------------------------------- class TFile; typedef boost::shared_ptr<TFile> PFile; @@ -217,6 +219,14 @@ namespace MED virtual TInt GetNbNodes(const MED::TMeshInfo& theMeshInfo, + TErr* theErr = NULL) + { + return GetNbNodes(theMeshInfo,eCOOR,theErr); + } + + TInt + GetNbNodes(const MED::TMeshInfo& theMeshInfo, + ETable theTable, TErr* theErr = NULL); virtual @@ -420,6 +430,32 @@ namespace MED EModeAcces theMode, TErr* theErr = NULL); + virtual + void + GetGrilleInfo(TGrilleInfo& theGrilleInfo, + TErr* theErr = NULL); + + virtual + void + SetGrilleInfo(const MED::TGrilleInfo& theGrilleInfo, + TErr* theErr = NULL); + + void + SetGrilleInfo(const MED::TGrilleInfo& theGrilleInfo, + EModeAcces theMode, + TErr* theErr = NULL); + + virtual + void + GetGrilleType(const MED::TMeshInfo& theMeshInfo, + EGrilleType& type, + TErr* theErr = NULL); + + void + GetGrilleStruct(const MED::TMeshInfo& theMeshInfo, + TIntVector& theStruct, + TErr* theErr = NULL); + protected: PFile myFile; }; diff --git a/src/Makefile.in b/src/Makefile.in index 2c1e36e7b..34505d711 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -43,7 +43,7 @@ ifeq (@WITHIHM@,yes) SUBDIRS+= MEDGUI endif -LDFLAGS= -L$(top_builddir)/lib/salome -LDFLAGSFORBIN= -L$(top_builddir)/lib/salome +LDFLAGS= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome +LDFLAGSFORBIN= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome @MODULE@ diff --git a/src/MedClient/src/CONNECTIVITYClient.cxx b/src/MedClient/src/CONNECTIVITYClient.cxx index e01355124..a47ba8225 100644 --- a/src/MedClient/src/CONNECTIVITYClient.cxx +++ b/src/MedClient/src/CONNECTIVITYClient.cxx @@ -115,6 +115,12 @@ void CONNECTIVITYClient::blankCopy() _polyType_client = MED_EN::MED_NONE; } + // create a constituent (PAL10556) + if ( Entity == MED_CELL ) { + Entity = ( IOR_Mesh->getMeshDimension() == 3 ? MED_FACE : MED_EDGE ); + _constituent = new CONNECTIVITYClient( IOR_Mesh, Entity ); + } + _complete = false; END_OF("CONNECTIVITYClient::blankCopy()"); @@ -349,11 +355,11 @@ const int * CONNECTIVITYClient::getGlobalNumberingIndex if (!_complete) (const_cast<CONNECTIVITYClient *>(this))->fillCopy(); - const int * c = CONNECTIVITY::getGlobalNumberingIndex(Entity); + const int * index = CONNECTIVITY::getGlobalNumberingIndex(Entity); END_OF("void CONNECTIVITYClient::getGlobalNumberingIndex()"); - return c; + return index; } //============================================================================= diff --git a/src/MedClient/src/Makefile.in b/src/MedClient/src/Makefile.in index 082cd052c..b639773d5 100644 --- a/src/MedClient/src/Makefile.in +++ b/src/MedClient/src/Makefile.in @@ -92,12 +92,12 @@ BIN_SRC = BIN_SERVER_IDL = BIN_CLIENT_IDL = -LDFLAGS= -L$(top_builddir)/lib/salome -LDFLAGSFORBIN= -L$(top_builddir)/lib/salome +LDFLAGS= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome +LDFLAGSFORBIN= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome -CPPFLAGS+= $(MED2_INCLUDES) $(HDF5_INCLUDES) $(PYTHON_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -I$(srcdir)/../../MEDMEM_I -CXXFLAGS+=-I${KERNEL_ROOT_DIR}/include/salome -LDFLAGS+=-L${KERNEL_ROOT_DIR}/lib/salome -lOpUtil -lMedCorba_Swigcmodule -lmedmem +CPPFLAGS+= $(MED2_INCLUDES) $(HDF5_INCLUDES) $(PYTHON_INCLUDES) ${KERNEL_CXXFLAGS} -I$(srcdir)/../../MEDMEM_I +CXXFLAGS+=${KERNEL_CXXFLAGS} +LDFLAGS+=${KERNEL_LDFLAGS} -lOpUtil -lMedCorba_Swigcmodule -lmedmem MED.hh MEDSK.cc: MED.idl omniidl -bcxx -Wbtp -I$(top_builddir)/idl -I${KERNEL_ROOT_DIR}/idl/salome $^ diff --git a/src/MedClient/src/libMEDClient.i b/src/MedClient/src/libMEDClient.i index e5a017b27..40e70d688 100644 --- a/src/MedClient/src/libMEDClient.i +++ b/src/MedClient/src/libMEDClient.i @@ -53,6 +53,14 @@ class MESHClient : public MESH { } }; +MESH * getMeshPointer(MESHClient * input); +%{ + MESH * getMeshPointer(MESHClient * input) + { + return (MESH *) input; + } +%} + class SUPPORTClient : public SUPPORT { public: diff --git a/src/MedClient/test/environ/csh/init1.in b/src/MedClient/test/environ/csh/init1.in index d5f917612..bd0bbeca9 100644 --- a/src/MedClient/test/environ/csh/init1.in +++ b/src/MedClient/test/environ/csh/init1.in @@ -1,4 +1,4 @@ -cd ${KERNEL_ROOT_DIR}/bin +cd ${KERNEL_ROOT_DIR}/bin/salome pwd ./allkill || true ./killall python || true diff --git a/src/MedClient/test/environ/csh/init3.in b/src/MedClient/test/environ/csh/init3.in index 8bf9383d2..fc7b3a531 100644 --- a/src/MedClient/test/environ/csh/init3.in +++ b/src/MedClient/test/environ/csh/init3.in @@ -1,2 +1,2 @@ -cd ${KERNEL_ROOT_DIR}/bin +cd ${KERNEL_ROOT_DIR}/bin/salome csh diff --git a/src/MedClient/test/environ/csh/runContainer.in b/src/MedClient/test/environ/csh/runContainer.in index 2d61eb8e8..2fd3ddb61 100644 --- a/src/MedClient/test/environ/csh/runContainer.in +++ b/src/MedClient/test/environ/csh/runContainer.in @@ -9,15 +9,15 @@ set PYTHON_VERSION=python@PYTHON_VERSION@ setenv KERNEL_ROOT_DIR @prefix@ if ( ${?KERNEL_ROOT_DIR} ) then - setenv PATH ${KERNEL_ROOT_DIR}/bin:${KERNEL_ROOT_DIR}/Tests:${PATH} - setenv LD_LIBRARY_PATH ${KERNEL_ROOT_DIR}/lib:${LD_LIBRARY_PATH} - setenv PYTHONPATH ${KERNEL_ROOT_DIR}/lib:${KERNEL_ROOT_DIR}/lib/${PYTHON_VERSION}/site-packages/salome:${PYTHONPATH} + setenv PATH ${KERNEL_ROOT_DIR}/bin/salome:${KERNEL_ROOT_DIR}/Tests:${PATH} + setenv LD_LIBRARY_PATH ${KERNEL_ROOT_DIR}/lib@LIB_LOCATION_SUFFIX@/salome:${LD_LIBRARY_PATH} + setenv PYTHONPATH ${KERNEL_ROOT_DIR}/lib@LIB_LOCATION_SUFFIX@/salome:${KERNEL_ROOT_DIR}/lib@LIB_LOCATION_SUFFIX@/${PYTHON_VERSION}/site-packages/salome:${PYTHONPATH} endif if ( ${?MED_ROOT_DIR} ) then - setenv PATH ${MED_ROOT_DIR}/bin:${PATH} - setenv LD_LIBRARY_PATH ${MED_ROOT_DIR}/lib:${LD_LIBRARY_PATH} - setenv PYTHONPATH ${MED_ROOT_DIR}/lib:${MED_ROOT_DIR}/lib/${PYTHON_VERSION}/site-packages/salome:${PYTHONPATH} + setenv PATH ${MED_ROOT_DIR}/bin/salome:${PATH} + setenv LD_LIBRARY_PATH ${MED_ROOT_DIR}/lib@LIB_LOCATION_SUFFIX@/salome:${LD_LIBRARY_PATH} + setenv PYTHONPATH ${MED_ROOT_DIR}/lib@LIB_LOCATION_SUFFIX@/salome:${MED_ROOT_DIR}/lib@LIB_LOCATION_SUFFIX@/${PYTHON_VERSION}/site-packages/salome:${PYTHONPATH} endif if ( -d ${HOME}/.salome/bin ) then @@ -50,8 +50,8 @@ set CONTAINER_TYPE = `echo ${CONTAINER_NAME} | grep 'Py$'` echo ${?CONTAINER_TYPE} if ( ${?CONTAINER_TYPE} ) then - ( ${KERNEL_ROOT_DIR}/bin/SALOME_ContainerPy.py ${CONTAINER_NAME} &) + ( ${KERNEL_ROOT_DIR}/bin/salome/SALOME_ContainerPy.py ${CONTAINER_NAME} &) else - ( ${KERNEL_ROOT_DIR}/bin/SALOME_Container ${CONTAINER_NAME} & ) + ( ${KERNEL_ROOT_DIR}/bin/salome/SALOME_Container ${CONTAINER_NAME} & ) endif diff --git a/src/MedClient/test/environ/csh/stopContainer.in b/src/MedClient/test/environ/csh/stopContainer.in index 95cfa69e4..3cbbee5e7 100644 --- a/src/MedClient/test/environ/csh/stopContainer.in +++ b/src/MedClient/test/environ/csh/stopContainer.in @@ -38,15 +38,15 @@ PYTHON_VERSION=python2.2 if test -n ${KERNEL_ROOT_DIR} then - export PATH=${KERNEL_ROOT_DIR}/bin:${PATH} - export LD_LIBRARY_PATH=${KERNEL_ROOT_DIR}/lib:${LD_LIBRARY_PATH} - export PYTHONPATH=${KERNEL_ROOT_DIR}/lib:${KERNEL_ROOT_DIR}/lib/${PYTHON_VERSION}/site-packages/salome:${PYTHONPATH} + export PATH=${KERNEL_ROOT_DIR}/bin/salome:${PATH} + export LD_LIBRARY_PATH=${KERNEL_ROOT_DIR}/lib@LIB_LOCATION_SUFFIX@/salome:${LD_LIBRARY_PATH} + export PYTHONPATH=${KERNEL_ROOT_DIR}/lib@LIB_LOCATION_SUFFIX@/salome:${KERNEL_ROOT_DIR}/lib@LIB_LOCATION_SUFFIX@/${PYTHON_VERSION}/site-packages/salome:${PYTHONPATH} fi if test -n ${MED_ROOT_DIR} then - export PATH=${MED_ROOT_DIR}/bin:${PATH} - export LD_LIBRARY_PATH=${MED_ROOT_DIR}/lib:${LD_LIBRARY_PATH} - export PYTHONPATH=${MED_ROOT_DIR}/lib:${MED_ROOT_DIR}/lib/${PYTHON_VERSION}/site-packages/salome:${PYTHONPATH} + export PATH=${MED_ROOT_DIR}/bin/salome:${PATH} + export LD_LIBRARY_PATH=${MED_ROOT_DIR}/lib@LIB_LOCATION_SUFFIX@/salome:${LD_LIBRARY_PATH} + export PYTHONPATH=${MED_ROOT_DIR}/lib@LIB_LOCATION_SUFFIX@/salome:${MED_ROOT_DIR}/lib@LIB_LOCATION_SUFFIX@/${PYTHON_VERSION}/site-packages/salome:${PYTHONPATH} fi if test -d ${HOME}/.salome/bin diff --git a/src/MedClient/test/environ/runTestMedCorba.in b/src/MedClient/test/environ/runTestMedCorba.in index c152b3c71..c83158c0f 100644 --- a/src/MedClient/test/environ/runTestMedCorba.in +++ b/src/MedClient/test/environ/runTestMedCorba.in @@ -4,17 +4,17 @@ PYTHON_VERSION=python@PYTHON_VERSION@ if test -n $MED_ROOT_DIR then - export PATH=$MED_ROOT_DIR/bin:${PATH} - export LD_LIBRARY_PATH=$MED_ROOT_DIR/lib:${LD_LIBRARY_PATH} - export PYTHONPATH=${MED_ROOT_DIR}/lib:${MED_ROOT_DIR}/lib/$PYTHON_VERSION/site-packages/salome:${MED_ROOT_DIR}/share/salome/resources:${PYTHONPATH} + export PATH=$MED_ROOT_DIR/bin/salome:${PATH} + export LD_LIBRARY_PATH=$MED_ROOT_DIR/lib@LIB_LOCATION_SUFFIX@/salome:${LD_LIBRARY_PATH} + export PYTHONPATH=${MED_ROOT_DIR}/lib@LIB_LOCATION_SUFFIX@/salome:${MED_ROOT_DIR}/lib@LIB_LOCATION_SUFFIX@/$PYTHON_VERSION/site-packages/salome:${MED_ROOT_DIR}/share/salome/resources:${PYTHONPATH} # add bin, because some script are in (SALOME_SWIG) !!!! - export PYTHONPATH=${MED_ROOT_DIR}/bin:${PYTHONPATH} + export PYTHONPATH=${MED_ROOT_DIR}/bin/salome:${PYTHONPATH} fi if test -n $MED_ROOT_DIR then - export PATH=$MED_ROOT_DIR/bin:${PATH} - export LD_LIBRARY_PATH=$MED_ROOT_DIR/lib:${LD_LIBRARY_PATH} - export PYTHONPATH=${MED_ROOT_DIR}/lib:${MED_ROOT_DIR}/lib/$PYTHON_VERSION/site-packages/salome:${MED_ROOT_DIR}/share/salome/resources:${PYTHONPATH} + export PATH=$MED_ROOT_DIR/bin/salome:${PATH} + export LD_LIBRARY_PATH=$MED_ROOT_DIR/lib@LIB_LOCATION_SUFFIX@/salome:${LD_LIBRARY_PATH} + export PYTHONPATH=${MED_ROOT_DIR}/lib@LIB_LOCATION_SUFFIX@/salome:${MED_ROOT_DIR}/lib@LIB_LOCATION_SUFFIX@/$PYTHON_VERSION/site-packages/salome:${MED_ROOT_DIR}/share/salome/resources:${PYTHONPATH} fi mkdir -p resultats diff --git a/src/MedClient/test/test1/Compo1Py.py b/src/MedClient/test/test1/Compo1Py.py index 50dac23a7..cb075bcad 100644 --- a/src/MedClient/test/test1/Compo1Py.py +++ b/src/MedClient/test/test1/Compo1Py.py @@ -1,13 +1,13 @@ import sys from omniORB import CORBA, PortableServer import CosNaming -import Engines, Engines__POA +import Compo1Py_ORB, Compo1Py_ORB__POA from SALOME_ComponentPy import * from libMedCorba_Swig import * import Compo1 -class Compo1Py( Engines__POA.Compo1Py, SALOME_ComponentPy_i): +class Compo1Py( Compo1Py_ORB__POA.Compo1Py, SALOME_ComponentPy_i): def __init__(self, orb, poa, contID, \ containerName, instanceName, interfaceName): diff --git a/src/MedClient/test/test2/Makefile.in b/src/MedClient/test/test2/Makefile.in index 490b3204b..aa2bb3adc 100644 --- a/src/MedClient/test/test2/Makefile.in +++ b/src/MedClient/test/test2/Makefile.in @@ -42,11 +42,11 @@ LIB = libCompo2cmodule.la LIB_SRC = Compo2.cxx LIB_CLIENT_IDL= SALOME_Component.idl SALOMEDS.idl SALOMEDS_Attributes.idl SALOME_Exception.idl SALOME_Comm.idl MED.idl SALOME_GenericObj.idl -LDFLAGS= -L$(top_builddir)/lib/salome -LDFLAGSFORBIN= -L$(top_builddir)/lib/salome +LDFLAGS= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome +LDFLAGSFORBIN= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome -CPPFLAGS += ${MED2_INCLUDES} ${HDF5_INCLUDES} ${PYTHON_INCLUDES} -I${KERNEL_ROOT_DIR}/include/salome -LIBS = -L${KERNEL_ROOT_DIR}/lib/salome -lMEDClientcmodule -lMEDMEM_Swigcmodule -lmedmem -lMEDMEMImpl ${MED2_LIBS} ${HDF5_LIBS} +CPPFLAGS += ${MED2_INCLUDES} ${HDF5_INCLUDES} ${PYTHON_INCLUDES} ${KERNEL_CXXFLAGS} +LIBS = ${KERNEL_LDFLAGS} -lMEDClientcmodule -lMEDMEM_Swigcmodule -lmedmem -lMEDMEMImpl ${MED2_LIBS} ${HDF5_LIBS} # Executables targets diff --git a/src/MedCorba_Swig/Makefile.in b/src/MedCorba_Swig/Makefile.in index c8bb812f7..71be6d496 100644 --- a/src/MedCorba_Swig/Makefile.in +++ b/src/MedCorba_Swig/Makefile.in @@ -65,15 +65,15 @@ EXPORT_HEADERS = libMedCorba_Swig.i ############################################################################# -LDFLAGS= -L$(top_builddir)/lib/salome -LDFLAGSFORBIN= -L$(top_builddir)/lib/salome +LDFLAGS= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome +LDFLAGSFORBIN= -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome -CPPFLAGS+= $(PYTHON_INCLUDES) $(MED2_INCLUDES) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -CXXFLAGS+=-ftemplate-depth-42 -I${KERNEL_ROOT_DIR}/include/salome +CPPFLAGS+= $(PYTHON_INCLUDES) $(MED2_INCLUDES) $(HDF5_INCLUDES) ${KERNEL_CXXFLAGS} +CXXFLAGS+=-ftemplate-depth-42 ${KERNEL_CXXFLAGS} LIBS= $(PYTHON_LIBS) -#LDFLAGS+=$(MED2_LIBS) $(HDF5_LIBS) -lMEDMEMImpl -lmedmem -lMEDMEM_Swigcmodule -L${KERNEL_ROOT_DIR}/lib/salome -lSalomeLoggerServer -L${KERNEL_ROOT_DIR}/lib/salome +#LDFLAGS+=$(MED2_LIBS) $(HDF5_LIBS) -lMEDMEMImpl -lmedmem -lMEDMEM_Swigcmodule ${KERNEL_LDFLAGS} -lSalomeLoggerServer ${KERNEL_LDFLAGS} # change motivated by the bug KERNEL4778. -LDFLAGS+=$(MED2_LIBS) $(HDF5_LIBS) -lMEDMEMImpl -lmedmem -lMEDMEM_Swigcmodule -L${KERNEL_ROOT_DIR}/lib/salome -lSALOMELocalTrace +LDFLAGS+=$(MED2_LIBS) $(HDF5_LIBS) -lMEDMEMImpl -lmedmem -lMEDMEM_Swigcmodule ${KERNEL_LDFLAGS} -lSALOMELocalTrace ############################################################################# -- 2.39.2