From 1cabb28ebdb266aa36cdac8ac7af7491ed53c8b8 Mon Sep 17 00:00:00 2001 From: cs Date: Fri, 9 Mar 2007 14:29:06 +0000 Subject: [PATCH 1/1] Module MULTIPR --- INSTALL | 1 + MULTIPR_version.h.in | 34 + Makefile.in | 121 ++ README | 228 ++++ adm_local/Makefile.in | 59 + adm_local/unix/config_files/check_MULTIPR.m4 | 53 + adm_local/unix/make_commence.in | 278 ++++ adm_local/unix/make_omniorb.in | 52 + bin/VERSION.in | 1 + bin/myrunSalome.py | 162 +++ bin/runAppli.in | 44 + build_configure | 242 ++++ configure.in.base | 337 +++++ ...V_EDF-IOLS-MULTIPR_spec-conception_1_1.odt | Bin 0 -> 557571 bytes ...V_EDF-IOLS-MULTIPR_spec-conception_1_1.pdf | Bin 0 -> 482304 bytes idl/MULTIPR.idl | 230 ++++ idl/Makefile.in | 86 ++ resources/ExecMULTIPR.png | Bin 0 -> 454 bytes resources/MULTIPR.png | Bin 0 -> 454 bytes resources/MULTIPRCatalog.xml.in | 59 + resources/MULTIPR_import_med.png | Bin 0 -> 231 bytes resources/MULTIPR_save_med.png | Bin 0 -> 215 bytes resources/SalomeApp.xml | 11 + src/MULTIPR/MULTIPR_API.cxx | 193 +++ src/MULTIPR/MULTIPR_API.hxx | 108 ++ src/MULTIPR/MULTIPR_DecimationAccel.cxx | 325 +++++ src/MULTIPR/MULTIPR_DecimationAccel.hxx | 258 ++++ src/MULTIPR/MULTIPR_DecimationFilter.cxx | 306 +++++ src/MULTIPR/MULTIPR_DecimationFilter.hxx | 167 +++ src/MULTIPR/MULTIPR_Elements.cxx | 459 +++++++ src/MULTIPR/MULTIPR_Elements.hxx | 248 ++++ src/MULTIPR/MULTIPR_Exceptions.hxx | 203 +++ src/MULTIPR/MULTIPR_Family.cxx | 463 +++++++ src/MULTIPR/MULTIPR_Family.hxx | 367 +++++ src/MULTIPR/MULTIPR_Field.cxx | 524 ++++++++ src/MULTIPR/MULTIPR_Field.hxx | 236 ++++ src/MULTIPR/MULTIPR_GaussLoc.cxx | 235 ++++ src/MULTIPR/MULTIPR_GaussLoc.hxx | 150 +++ src/MULTIPR/MULTIPR_Globals.hxx | 29 + src/MULTIPR/MULTIPR_Mesh.cxx | 1188 +++++++++++++++++ src/MULTIPR/MULTIPR_Mesh.hxx | 378 ++++++ src/MULTIPR/MULTIPR_MeshDis.cxx | 893 +++++++++++++ src/MULTIPR/MULTIPR_MeshDis.hxx | 436 ++++++ src/MULTIPR/MULTIPR_Nodes.cxx | 400 ++++++ src/MULTIPR/MULTIPR_Nodes.hxx | 190 +++ src/MULTIPR/MULTIPR_Obj.cxx | 427 ++++++ src/MULTIPR/MULTIPR_Obj.hxx | 249 ++++ src/MULTIPR/MULTIPR_PointOfField.hxx | 100 ++ src/MULTIPR/MULTIPR_Profil.cxx | 160 +++ src/MULTIPR/MULTIPR_Profil.hxx | 140 ++ src/MULTIPR/MULTIPR_ProgressCallback.hxx | 82 ++ src/MULTIPR/MULTIPR_Utils.cxx | 226 ++++ src/MULTIPR/MULTIPR_Utils.hxx | 94 ++ src/MULTIPR/MULTIPR_i.cxx | 485 +++++++ src/MULTIPR/MULTIPR_i.hxx | 273 ++++ src/MULTIPR/Makefile.in | 56 + src/MULTIPR/multipr.cxx | 703 ++++++++++ src/MULTIPRGUI/MULTIPR_GUI.cxx | 747 +++++++++++ src/MULTIPRGUI/MULTIPR_GUI.h | 235 ++++ src/MULTIPRGUI/MULTIPR_GUI_Dlg.cxx | 651 +++++++++ src/MULTIPRGUI/MULTIPR_GUI_Dlg.h | 202 +++ src/MULTIPRGUI/MULTIPR_icons.po | 37 + src/MULTIPRGUI/MULTIPR_msg_en.po | 92 ++ src/MULTIPRGUI/MULTIPR_msg_fr.po | 80 ++ src/MULTIPRGUI/Makefile.in | 51 + src/Makefile.in | 35 + 66 files changed, 14879 insertions(+) create mode 100644 INSTALL create mode 100644 MULTIPR_version.h.in create mode 100644 Makefile.in create mode 100755 README create mode 100644 adm_local/Makefile.in create mode 100755 adm_local/unix/config_files/check_MULTIPR.m4 create mode 100644 adm_local/unix/make_commence.in create mode 100644 adm_local/unix/make_omniorb.in create mode 100755 bin/VERSION.in create mode 100755 bin/myrunSalome.py create mode 100755 bin/runAppli.in create mode 100755 build_configure create mode 100644 configure.in.base create mode 100755 doc/CSSI_DRV_EDF-IOLS-MULTIPR_spec-conception_1_1.odt create mode 100755 doc/CSSI_DRV_EDF-IOLS-MULTIPR_spec-conception_1_1.pdf create mode 100644 idl/MULTIPR.idl create mode 100644 idl/Makefile.in create mode 100644 resources/ExecMULTIPR.png create mode 100644 resources/MULTIPR.png create mode 100644 resources/MULTIPRCatalog.xml.in create mode 100644 resources/MULTIPR_import_med.png create mode 100644 resources/MULTIPR_save_med.png create mode 100644 resources/SalomeApp.xml create mode 100644 src/MULTIPR/MULTIPR_API.cxx create mode 100644 src/MULTIPR/MULTIPR_API.hxx create mode 100644 src/MULTIPR/MULTIPR_DecimationAccel.cxx create mode 100644 src/MULTIPR/MULTIPR_DecimationAccel.hxx create mode 100644 src/MULTIPR/MULTIPR_DecimationFilter.cxx create mode 100644 src/MULTIPR/MULTIPR_DecimationFilter.hxx create mode 100644 src/MULTIPR/MULTIPR_Elements.cxx create mode 100644 src/MULTIPR/MULTIPR_Elements.hxx create mode 100644 src/MULTIPR/MULTIPR_Exceptions.hxx create mode 100644 src/MULTIPR/MULTIPR_Family.cxx create mode 100644 src/MULTIPR/MULTIPR_Family.hxx create mode 100644 src/MULTIPR/MULTIPR_Field.cxx create mode 100644 src/MULTIPR/MULTIPR_Field.hxx create mode 100644 src/MULTIPR/MULTIPR_GaussLoc.cxx create mode 100644 src/MULTIPR/MULTIPR_GaussLoc.hxx create mode 100644 src/MULTIPR/MULTIPR_Globals.hxx create mode 100644 src/MULTIPR/MULTIPR_Mesh.cxx create mode 100644 src/MULTIPR/MULTIPR_Mesh.hxx create mode 100644 src/MULTIPR/MULTIPR_MeshDis.cxx create mode 100644 src/MULTIPR/MULTIPR_MeshDis.hxx create mode 100644 src/MULTIPR/MULTIPR_Nodes.cxx create mode 100644 src/MULTIPR/MULTIPR_Nodes.hxx create mode 100644 src/MULTIPR/MULTIPR_Obj.cxx create mode 100644 src/MULTIPR/MULTIPR_Obj.hxx create mode 100644 src/MULTIPR/MULTIPR_PointOfField.hxx create mode 100644 src/MULTIPR/MULTIPR_Profil.cxx create mode 100644 src/MULTIPR/MULTIPR_Profil.hxx create mode 100644 src/MULTIPR/MULTIPR_ProgressCallback.hxx create mode 100644 src/MULTIPR/MULTIPR_Utils.cxx create mode 100644 src/MULTIPR/MULTIPR_Utils.hxx create mode 100644 src/MULTIPR/MULTIPR_i.cxx create mode 100644 src/MULTIPR/MULTIPR_i.hxx create mode 100644 src/MULTIPR/Makefile.in create mode 100644 src/MULTIPR/multipr.cxx create mode 100644 src/MULTIPRGUI/MULTIPR_GUI.cxx create mode 100644 src/MULTIPRGUI/MULTIPR_GUI.h create mode 100644 src/MULTIPRGUI/MULTIPR_GUI_Dlg.cxx create mode 100644 src/MULTIPRGUI/MULTIPR_GUI_Dlg.h create mode 100644 src/MULTIPRGUI/MULTIPR_icons.po create mode 100644 src/MULTIPRGUI/MULTIPR_msg_en.po create mode 100644 src/MULTIPRGUI/MULTIPR_msg_fr.po create mode 100644 src/MULTIPRGUI/Makefile.in create mode 100644 src/Makefile.in diff --git a/INSTALL b/INSTALL new file mode 100644 index 0000000..adabbd3 --- /dev/null +++ b/INSTALL @@ -0,0 +1 @@ +SALOME2 : MULTIPR module diff --git a/MULTIPR_version.h.in b/MULTIPR_version.h.in new file mode 100644 index 0000000..69335a1 --- /dev/null +++ b/MULTIPR_version.h.in @@ -0,0 +1,34 @@ +// Copyright (C) 2005 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library 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 +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ +// +// File : MULTIPR_version.h +// Author : Vadim SANDLER +// Module : SALOME + +#if !defined(__MULTIPR_VERSION_H__) +#define __MULTIPR_VERSION_H__ + +/* + MULTIPR_VERSION is (major << 16) + (minor << 8) + patch. +*/ + +#define MULTIPR_VERSION_STR "@VERSION@" +#define MULTIPR_VERSION @XVERSION@ + +#endif // __MULTIPR_VERSION_H__ diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..1eeeb2f --- /dev/null +++ b/Makefile.in @@ -0,0 +1,121 @@ +# Copyright (C) 2005 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +# -* Makefile *- +# +# Author : C. Caremoli +# Date : 10/10/2003 +# $Header$ +# + +# source path +top_srcdir=@top_srcdir@ +top_builddir=. +srcdir=@srcdir@ +VPATH=.:@srcdir@:@top_srcdir@/bin:./bin/salome:./resources:@top_srcdir@/resources:./bin:@top_srcdir@/idl + + +@COMMENCE@ + +SUBDIRS = idl src adm_local + +RESOURCES_FILES = MULTIPRCatalog.xml MULTIPR.png ExecMULTIPR.png MULTIPR_import_med.png MULTIPR_save_med.png SalomeApp.xml + +BIN_SCRIPT= VERSION runAppli myrunSalome.py + +# copy header files in common directory + +include_list = include/salome/SALOMEconfig.h \ + include/salome/MULTIPR_version.h + +ifneq ($(HAVE_SSTREAM),yes) + include_list += include/salome/sstream +endif + +inc: idl $(include_list) + +bin: bin/salome/VERSION + +bin/salome/VERSION : bin/VERSION + -$(RM) $@ + $(LN_S) ../../$< $@ + +include/salome/SALOMEconfig.h: salome_adm/unix/SALOMEconfig.ref + -$(RM) $@ + $(LN_S) ../../$< $@ + +# test if SALOMEconfig.h has changed (contents) +salome_adm/unix/SALOMEconfig.ref: salome_adm/unix/SALOMEconfig.h + @if ! [ -a $@ ]; then \ + cp -p $< $@; \ + fi; \ + if ! cmp $< $@; then \ + cp -p $< $@; \ + fi; \ + +include/salome/sstream: salome_adm/unix/sstream + -$(RM) $@ + $(LN_S) ../../$< $@ + +include/salome/MULTIPR_version.h: MULTIPR_version.h + -$(RM) $@ + $(LN_S) ../../$< $@ + +depend: depend_idl + +depend_idl: + (cd idl ; $(MAKE) $@) || exit 1 + +# doc is already build : if you want to had documents, go manually to doc and run 'make doc' +#doc: +# (cd doc && $(MAKE) $@) || exit 1 + +install-end: +# finish libtool install +# @$(LT) --mode=finish $(libdir) + +install-include: $(include_list) + $(INSTALL) -d $(includedir) + @for f in X $(include_list); do \ + if test $$f != X; then \ + ($(INSTALL_DATA) $$f $(includedir)/. || exit 1); \ + fi; \ + done + +# install script in $(bindir) : +install-bin: $(BIN_SCRIPT) + $(INSTALL) -d $(bindir) + $(INSTALL_PROGRAM) $^ $(bindir) + +uninstall: uninstall-idl + +uninstall-idl: + $(RM) $(idldir)/*.idl + +distclean: distclean-other + +distclean-other: + -$(RM) salome_adm/unix/*~ salome_adm/unix/*% salome_adm/unix/*.bak salome_adm/unix/*.new salome_adm/unix/*.old + -$(RM) salome_adm/unix/make_* + -$(RM) salome_adm/unix/depend salome_adm/unix/SALOMEconfig.h + -$(RM) config.cache config.log config.status + +@MODULE@ + +install: install-bin install-include install-end + diff --git a/README b/README new file mode 100755 index 0000000..2e4ce3c --- /dev/null +++ b/README @@ -0,0 +1,228 @@ +MODULE SALOME MULTIPR +===================== +Par EDF/CS, 02/2007 + + +Description +----------- +MULTIPR est un module pour la plateforme SALOME (v3.2). +Le module sert au partitionnement et a la decimation de maillages tetraedriques (TETRA10), +dans le but de pouvoir visualiser d'importants volumes de donnees. + + +Contenu de ce fichier +--------------------- +I. INSTALLATION/COMPILATION +II. L'APPLICATION AUTONOME EN LIGNE DE COMMANDE multipr +III LE MODULE SALOME MULTIPR + + +******************************************************************************* +* +* I. INSTALLATION/COMPILATION +* +******************************************************************************* + +A. Information generales +------------------------ +MULTIPR a besoin des prerequis suivants: + 1. Salome V3.2 + 2. MESPLITTER (branche CVS WP1_2_3_17-01-2007_Data_format_at_entry_of_visualization_pipeline) + 3. MED fichier v2.3 + 4. METIS v4.0.1 (version NON modifiee par EDF) + 5. SCOTCH v4 + +A propos de MEDSPLITTER : +MEDSPLITTER est un partitionneur de fichiers MED qui repose sur le format MED v2.3 +et les outils METIS et SCOTCH. L'outil a ete developpe par Vincent Bergeaud du CEA. +Dans le cadre du module MULTIPR, MEDSPLITTER est utilise pour partitionner des grains +(scenario a 2 echelles). + + + +B. Installation/compilation +--------------------------- + + + B.1. Se procurer le module MED/MEDSPLITTER compatible avec MULTIPR + ------------------------------------------------------------------ + +1. Charger la branche CVS WP1_2_3_17-01-2007_Data_format_at_entry_of_visualization_pipeline dans le repertoire MED sur le server d'OpenCascade + > cvs -d ":pserver:salome2anonymous@www.opencascade.com:/home/server/cvs/MED" login + rntlrntl (<--- mot de passe) + > cvs -d ":pserver:salome2anonymous@www.opencascade.com:/home/server/cvs/MED" checkout -kk -RP -r WP1_2_3_17-01-2007_Data_format_at_entry_of_visualization_pipeline MED_SRC + > cvs -d ":pserver:salome2anonymous@www.opencascade.com:/home/server/cvs/MED" logout + (note : MEDPLITTER peut également être compilé à partir de la branche CVS BR_SPLITTER_improved) + +2. Modifier le code pour utiliser MED fichier v2.3 : + A. Supprimer les 6 fichiers suivants : + MED_SRC/src/medmem/MEDMEM_MEDMEMchampLire.hxx/cxx + MED_SRC/src/medmem/MEDMEM_MEDMEMgaussEcr.hxx/cxx + MED_SRC/src/medmem/MEDMEM_MEDMEMprofilEcr.hxx/cxx + B. Mettre a jour le fichier medmem/Makefile.in en supprimant les 6 lignes correspondantes + C. Mettre a jour le fichier MEDMEM_MedFieldDriver22.hxx + 1. Dans la section "includes, supprimer les 3 lignes #include "MEDMEM_MEDMEMchampLire.hxx" ... + 2. Remplacer ces lignes par l'inclusion de l'API MED : + namespace med_2_2 + { + extern "C" + { + #include + #include + } + } + 3. Effectuer les changements suivants (utiliser l'API MED fichier v2.3) : + MEDMEMchampLire -> MEDchampLire + MEDMEMgaussEcr -> MEDgaussEcr + MEDMEMprofilEcr -> MEDprofilEcr + => En tout, il y a 4 lignes a changer + + + B.2. Prerequis a la compilation du module MED/MEDSPLITTER + --------------------------------------------------------- + +3. Verifier que la variable d'environnement LD_LIBRARY_PATH ne pointe pas vers un repertoire MED +4. Verifier que la variable d'environnement MED_ROOT_DIR n'est pas definie +5. Installer METIS v4.0.1 (soit le repertoire d'installation) + A. Charger le source sur http://glaros.dtc.umn.edu/gkhome/metis/metis/download + B. Decompresser l'archive : tar -zxvz metis-4.0.tar.gz + C. Puis make dans le repertoire + D. Verifier que tout est OK : depuis \Graph, lancer ./mtest 4elt.graph +6. Verifier que la bibliotheque boost v1.32 ou + est installee + A. Bien verifier que le paquet libboost_program_option est inclu (ce paquet est utilise par MEDSPLITTER) + B. Ajouter la variable d'environnement export BOOSTDIR=/usr, si nécessaire + C. Si necessaire, dans /usr/lib, ajouter le lien + ln -s libboost_program_options.so libboost_program_options-gcc-mt.so + (droits administrateur necessaires) + + + B.3. Compilation du module MED/MEDSPLITTER + ------------------------------------------ + +7. Pour compiler la branche MED WP1_2_3_17-01-2007_Data_format_at_entry_of_visualization_pipeline avec SALOME V3.2.2 (Debian Sarge) + Dans le repertoire SALOME v3.2.2 : + A. Sourcer prerequis-Sarge-slash-usr.sh et envSalome-V3_2_2.sh + B. Verifier que la variable d'environnement MED2HOME pointe bien vers + MED fichier v2.3 +8. Pour compiler avec METIS v4.0.1 precedemment charge : + Renommer la fonction log2 en log2_ dans metis\lib\proto.h + (sinon, un conflit se produit) + +Depuis le repertoire contenant WP1_2_3_17-01-2007_Data_format_at_entry_of_visualization_pipeline : +9. Creer un repertoire Build et un repertoire MED au cote de MED_SRC +10. Dans le repertoire MED_SRC, faire ./build_configure +11. Depuis le repertoire Build, faire (en remplacant les <...> par les bons répertoires) + ../MED_SRC/configure --prefix=/MED --enable-splitter=yes --with-metis= --with-scotch= + --enable-production=yes --disable-debug +12. Puis : make +13. Puis : make install + + + B.4. Tester l'installation du module MED/MEDSPLITTER + ---------------------------------------------------- + +14. Definir la variable d'environnement MED_ROOT_DIR (=/MED) +15. Eventuellement, mettre a jour les variables d'environnement LD_LIBRARY_PATH et PYTHONPATH +16. Pour verifier que MEDMEM est bien installe : + Depuis le repertoire /MED : python bin/salome/testMedMemGeneral.py +17. Pour verifier que MEDSPLITTER est bien installe : + A. Dans /MED/bin/salome, creer le repertoire tests : mkdir tests + B. Puis : + ./test_SPLITTER_indivisible + ./test_SPLITTER_square + ./medsplitter --input-file=/MED/share/salome/resources/med/pointe_import22.med --output-file=toto --ndomains=2 --meshname=maa1 + + + B.5. Compiler le module MULTIPR + ------------------------------- + +18. Creer un repertoire Build et un repertoire MULTIPR au cote de MULTIPR_SRC +19. Dans le repertoire MULTIPR_SRC, faire ./build_configure +20. Depuis le repertoire Build, faire (en remplacant les <...> par les bons répertoires) + ../MULTIPR_SRC/configure --prefix=/MULTIPR --enable-production=yes --disable-debug +21. Puis : make +22. Puis : make install + + +******************************************************************************* +* +* II. L'APPLICATION AUTONOME EN LIGNE DE COMMANDE multipr +* +******************************************************************************* + +Tests de l'application autonome en ligne de commande multipr +------------------------------------------------------------ +L'application "multipr" se trouve dans .../bin/salome + +1. Affichage de la page d'aide + + $ ./multipr + +2. Autotest complet de l'application + + $ ./multipr --auto /data + (ou /data designe le repertoire dans lequel se trouve le fichier agregat100grains_12pas.med) + +3. Affichage de la liste des maillages et des champs d'un fichier MED sequentiel : + + $ ./multipr --info agregat100grains_12pas.med + +4. Affichage de toutes les informations concernant un maillage : + + $ ./multipr --info agregat100grains_12pas.med MAIL + +5. Partitionnement (1 echelle) : + Extraction des grains du maillage MAIL dans le fichier agregat100grains_12pas.med + + $ ./multipr --part1 agregat100grains_12pas.med MAIL + +6. Partitionnement (2 echelles) : + Decoupage du grain numero 98 en 3 parties : + + $ ./multipr --part2 agregat100grains_12pas_grains_maitre.med MAIL_98 3 + +7. Decimation : + Creation de 3 resolutions du grain numero 99 en prenant : + comme reference le 12e pas de temps du champ SIG_____SIEF_ELGA_______________ + comme seuil pour la resolution MEDIUM : 10 + comme seuil pour la resolution BASSE : 25 + comme rayon pour le calcul du voisinage : 0.3 + + $ ./multipr --decim agregat100grains_12pas_grains_maitre.med MAIL_99 SIG_____SIEF_ELGA_______________ 12 Filtre_GradientMoyen 10 25 0.3 + +8. Messages d'erreur : + Les exemples suivants sont des commandes erronees : + + $ ./multipr --part1 agregat100grains_12pas.m MAIL + ... MULTIPR: FileNotFoundException (MULTIPR_Mesh.cxx, line 663): MED file not found + + $ ./multipr --part1 agregat100grains_12pas.med MAILLAGE + ... MULTIPR: IllegalStateException (MULTIPR_Mesh.cxx, line 747): mesh not found in the given MED file + + $ ./multipr --part2 agregat100grains_12pas.med MAIL 2 + ... MULTIPR: IOException (MULTIPR_API.cxx, line 106): waiting for a distributed MED file (not a sequential one) + + $ ./multipr --part2 agregat100grains_12pas_grains_maitre.med MAIL_95 0 + ... MULTIPR: IllegalArgumentException (MULTIPR_API.cxx, line 97): pNbParts should be >= 2 + + $ ./multipr --decim agregat100grains_12pas_grains_maitre.med MAIL_99 SIG_____SIEF_ELGA_______________ 14 Filtre_GradientMoyen 10 25 0.3 + ... MULTIPR: IllegalArgumentException (MULTIPR_DecimationFilter.cxx, line 100): invalid field iteration (14) + + $ ./multipr --decim agregat100grains_12pas_grains_maitre.med MAIL_99 SIG_____SIEF_ELGA___________TEST 12 Filtre_GradientMoyen 10 25 0.3 + MULTIPR: IllegalArgumentException (MULTIPR_DecimationFilter.cxx, line 99): field not found + + etc. + + +******************************************************************************* +* +* III. LE MODULE SALOME MULTIPR +* +******************************************************************************* + +Lancer le module salome seul : ./bin/salome/runAppli depuis le repertoire MULTIPR + + + + + diff --git a/adm_local/Makefile.in b/adm_local/Makefile.in new file mode 100644 index 0000000..cfbe6f4 --- /dev/null +++ b/adm_local/Makefile.in @@ -0,0 +1,59 @@ +# Copyright (C) 2005 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +# source path +top_srcdir=@top_srcdir@ +top_builddir=.. +srcdir=@srcdir@ +VPATH=.:$(srcdir)/adm_local + + +all: resources + +install: + cp -rf @top_srcdir@/adm_local @prefix@ + +bin: + +resources : + cp -rf @top_srcdir@/adm_local $(top_builddir) + +inc: + +lib: + +depend: + +depend_idl: + +install-end: + +install-include: + +install-bin: + +uninstall: + +uninstall-idl: + +distclean: + +clean: + +distclean-other: + diff --git a/adm_local/unix/config_files/check_MULTIPR.m4 b/adm_local/unix/config_files/check_MULTIPR.m4 new file mode 100755 index 0000000..91816f8 --- /dev/null +++ b/adm_local/unix/config_files/check_MULTIPR.m4 @@ -0,0 +1,53 @@ +# Check availability of MULTIPR module binary distribution +# +# Author : Olivier LE ROUX (CS, 2006) +#------------------------------------------------------------ + +AC_DEFUN([CHECK_MULTIPR],[ + +AC_CHECKING(for Multipr) + +Multipr_ok=no + +AC_ARG_WITH(multipr, + --with-multipr=DIR root directory path of MULTIPR installation, + MULTIPR_DIR="$withval",MULTIPR_DIR="") + +if test "x$MULTIPR_DIR" = "x" ; then + +# no --with-gui-dir option used + + if test "x$MULTIPR_ROOT_DIR" != "x" ; then + + # MULTIPR_ROOT_DIR environment variable defined + MULTIPR_DIR=$MULTIPR_ROOT_DIR + + else + + # search multipr binaries in PATH variable + AC_PATH_PROG(TEMP, libMULTIPR.so) + if test "x$TEMP" != "x" ; then + MULTIPR_BIN_DIR=`dirname $TEMP` + MULTIPR_DIR=`dirname $MULTIPR_BIN_DIR` + fi + + fi +# +fi + +if test -f ${MULTIPR_DIR}/lib/salome/libMULTIPR.so ; then + Multipr_ok=yes + AC_MSG_RESULT(Using MULTIPR distribution in ${MULTIPR_DIR}) + + if test "x$MULTIPR_ROOT_DIR" == "x" ; then + MULTIPR_ROOT_DIR=${MULTIPR_DIR} + fi + AC_SUBST(MULTIPR_ROOT_DIR) +else + AC_MSG_WARN("Cannot find compiled MULTIPR distribution") +fi + +AC_MSG_RESULT(for MULTIPR: $Multipr_ok) + +])dnl + diff --git a/adm_local/unix/make_commence.in b/adm_local/unix/make_commence.in new file mode 100644 index 0000000..4d769e4 --- /dev/null +++ b/adm_local/unix/make_commence.in @@ -0,0 +1,278 @@ +# common directories to put headerfiles +inc_builddir=$(top_builddir)/include/salome + +MODULE_NAME=@MODULE_NAME@ + +@SET_MAKE@ +SHELL=/bin/sh + +# header missing + +HAVE_SSTREAM=@HAVE_SSTREAM@ + + +LIBS=@LIBS@ +LDFLAGS=@LDFLAGS@ -L$(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome -Xlinker -rpath-link -Xlinker $(top_builddir)/lib@LIB_LOCATION_SUFFIX@/salome +# add libstdc++ to link c++ library with libtool ! +LDFLAGS+= -lstdc++ + +CP=@CP@ + +# CPP + +CPP=@CPP@ +CXXCPP=@CXXCPP@ +CPPFLAGS=@CPPFLAGS@ -I$(inc_builddir) -I$(srcdir) -I. + +# C + +CC = @CC@ +CFLAGS = @CFLAGS@ +C_DEPEND_FLAG = @C_DEPEND_FLAG@ + +# C++ + +CXX = @CXX@ +CXXFLAGS = @CXXFLAGS@ +CXX_DEPEND_FLAG = @CXX_DEPEND_FLAG@ + +# BOOST Library + +BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ + +# JAVA + +JAVA_INCLUDES = @JAVA_INCLUDES@ +JAVA_LIBS = @JAVA_LIBS@ +JAVA_LDPATH = @JAVA_LDPATH@ + +# PYTHON + +PYTHON = @PYTHON@ +PYTHONHOME = @PYTHONHOME@ +PYTHON_INCLUDES = @PYTHON_INCLUDES@ +PYTHON_LIBS = @PYTHON_LIBS@ +PYTHON_VERSION = @PYTHON_VERSION@ +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 + +QT_ROOT = @QT_ROOT@ +QT_INCLUDES = @QT_INCLUDES@ +QT_MT_INCLUDES = @QT_INCLUDES@ -DQT_THREAD_SUPPORT +QT_LIBS = @QT_LIBS@ +QT_MT_LIBS = @QT_MT_LIBS@ + +MOC = @MOC@ +UIC = @UIC@ + +# msg2qm + +MSG2QM = @MSG2QM@ + +#QWT + +QWT_INCLUDES=@QWT_INCLUDES@ +QWT_LIBS=@QWT_LIBS@ + +# SIP +SIP = @SIP@ +SIP_INCLUDES = @SIP_INCLUDES@ +SIP_LIBS = @SIP_LIBS@ + +# PYQT +PYQT_SIPS = @PYQT_SIPS@ +PYQT_LIBS = @PYQT_LIBS@ + +# openGL +OGL_INCLUDES=@OGL_INCLUDES@ +OGL_LIBS=@OGL_LIBS@ + +# VTK +VTK_INCLUDES=@VTK_INCLUDES@ +VTK_LIBS=@VTK_LIBS@ + +# HDF5 + +HDF5_INCLUDES=@HDF5_INCLUDES@ +HDF5_LIBS=@HDF5_LIBS@ +HDF5_MT_LIBS=@HDF5_MT_LIBS@ + +# MED2 + +MED2_INCLUDES=@MED2_INCLUDES@ +MED2_LIBS=@MED2_LIBS@ +MED2_MT_LIBS=@MED2_MT_LIBS@ + +# OpenCasCade + +OCC_INCLUDES=@CAS_CPPFLAGS@ +OCC_CXXFLAGS=@CAS_CXXFLAGS@ + +OCC_KERNEL_LIBS=@CAS_KERNEL@ +OCC_OCAF_LIBS=@CAS_OCAF@ +OCC_VIEWER_LIBS=@CAS_VIEWER@ +OCC_MODELER_LIBS=@CAS_MODELER@ +OCC_DATAEXCHANGE_LIBS=@CAS_DATAEXCHANGE@ +OCC_LIBS=@CAS_LDFLAGS@ + +# MPICH + +MPICH_INCLUDES=@MPICH_INCLUDES@ +MPICH_LIBS=@MPICH_LIBS@ + +# Swig C++ Python + +SWIG = @SWIG@ +SWIG_FLAGS = @SWIG_FLAGS@ -I$(inc_builddir) -I$(srcdir) -I. + +# OMNIORB + +OMNIORB_ROOT = @OMNIORB_ROOT@ +OMNIORB_INCLUDES = @OMNIORB_INCLUDES@ +OMNIORB_LIBS = @OMNIORB_LIBS@ +OMNIORB_CXXFLAGS = @OMNIORB_CXXFLAGS@ + +OMNIORB_IDL = @OMNIORB_IDL@ +OMNIORB_IDLCXXFLAGS = @OMNIORB_IDLCXXFLAGS@ +OMNIORB_IDLPYFLAGS = @OMNIORB_IDLPYFLAGS@ -I$(top_srcdir)/idl -I$(top_builddir)/idl -I$(KERNEL_ROOT_DIR)/idl/salome + +OMNIORB_IDL_CLN_H = @OMNIORB_IDL_CLN_H@ +OMNIORB_IDL_CLN_CXX = @OMNIORB_IDL_CLN_CXX@ +OMNIORB_IDL_CLN_OBJ = @OMNIORB_IDL_CLN_OBJ@ + +OMNIORB_IDL_SRV_H = @OMNIORB_IDL_SRV_H@ +OMNIORB_IDL_SRV_CXX = @OMNIORB_IDL_SRV_CXX@ +OMNIORB_IDL_SRV_OBJ = @OMNIORB_IDL_SRV_OBJ@ + +# Default ORB + +CORBA_ROOT = @CORBA_ROOT@ +CORBA_INCLUDES = @CORBA_INCLUDES@ +CORBA_LIBS = @CORBA_LIBS@ +CORBA_CXXFLAGS = @CORBA_CXXFLAGS@ + +IDLCXXFLAGS = -bcxx @IDLCXXFLAGS@ -I$(top_srcdir)/idl -I$(top_builddir)/idl -I$(KERNEL_ROOT_DIR)/idl/salome +IDLPYFLAGS = @IDLPYFLAGS@ + +IDL = @IDL@ + +IDL_CLN_H = @IDL_CLN_H@ +IDL_CLN_CXX = @IDL_CLN_CXX@ +IDL_CLN_OBJ = @IDL_CLN_OBJ@ + +IDL_SRV_H = @IDL_SRV_H@ +IDL_SRV_CXX = @IDL_SRV_CXX@ +IDL_SRV_OBJ = @IDL_SRV_OBJ@ + +CPPFLAGS+= $(CORBA_INCLUDES) +CXXFLAGS+= $(CORBA_CXXFLAGS) + +# add corba libs when link salome application ! +#LDFLAGS+= $(CORBA_LIBS) +LIBS+=$(CORBA_LIBS) + +## Shared libraries +LT_STATIC_EXEC=@LT_STATIC_EXEC@ +DYNAMIC_DIRS=@DYNAMIC_DIRS@ +LT_LIB=libtool +LT=$(top_builddir)/libtool +LT_COMPILE=$(LT) --mode=compile $(CC) +LT_LINK_LIB=$(LT_LIB) --mode=link $(CC) -rpath $(libdir) +LT_LINK_EXE=$(LT) --mode=link $(CC) $(LT_STATIC_EXEC) -dlopen self -rpath $(bindir) $(DYNAMIC_DIRS) +LT_RUN=$(LT) --mode=execute +LT_INSTALL_PROG=$(LT) --mode=install $(INSTALL_PROGRAM) +LT_INSTALL_LIB=$(LT) --mode=install $(INSTALL_DATA) +LT_UNINSTALL=$(LT) --mode=uninstall $(RM) + +INSTALL=@INSTALL@ +INSTALL_PROGRAM=@INSTALL_PROGRAM@ +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=@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=@exec_prefix@/lib@LIB_LOCATION_SUFFIX@/python$(PYTHON_VERSION)/site-packages/salome/shared_modules + +docdir=$(datadir)/doc + +# +# begin of package rules +# + +.PHONY: all lib bin inc resources tests install uninstall dep depend depend_idl cleandep mostlyclean clean distclean + +.SUFFIXES: .cxx .cc .c .f .o .lo .idl .py .i .ui .po .qm + +all: + $(MAKE) inc + $(MAKE) depend_idl + $(MAKE) depend + $(MAKE) lib + $(MAKE) bin + $(MAKE) resources + +# +# add target to build administrative files +# + +Makefile: $(top_builddir)/config.status $(srcdir)/Makefile.in + cd $(top_builddir) ; ./config.status + +LOCAL_MAKE = make_commence make_omniorb + +KERNEL_MAKE = make_module make_conclude depend SALOMEconfig.h F77config.h sstream envScript + +$(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 :-) +ifneq ($(top_srcdir),$(srcdir)) +configure: $(top_srcdir)/configure +endif + +$(top_srcdir)/configure: $(top_srcdir)/configure.in $(top_srcdir)/aclocal.m4 + cd $(top_srcdir) ; autoconf + +$(top_srcdir)/configure.in: $(top_srcdir)/configure.in.base + cd $(top_srcdir) && ./build_configure + + +ACLOCAL_KERNEL = \ +ac_cxx_bool.m4 check_corba.m4 \ +ac_cxx_depend_flag.m4 check_hdf5.m4 enable_pthreads.m4 \ +ac_cxx_mutable.m4 check_mico.m4 libtool.m4 \ +ac_cxx_namespaces.m4 check_omniorb.m4 pyembed.m4 \ +ac_cxx_partial_specialization.m4 python.m4 \ +ac_cxx_typename.m4 check_pthreads.m4 check_cas.m4 \ +ac_cc_warnings.m4 check_swig.m4 + +ACLOCAL_GUI = \ +check_vtk.m4 check_opengl.m4 check_qt.m4 \ +check_GUI.m4 check_corba_in_GUI.m4 + +$(top_srcdir)/aclocal.m4: $(ACLOCAL_KERNEL:%=@KERNEL_ROOT_DIR@/salome_adm/unix/config_files/%) \ + $(ACLOCAL_GUI:%=@GUI_ROOT_DIR@/adm_local/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_omniorb.in b/adm_local/unix/make_omniorb.in new file mode 100644 index 0000000..c91ccbf --- /dev/null +++ b/adm_local/unix/make_omniorb.in @@ -0,0 +1,52 @@ +#======================================================================= +# Begin specific part to omniorb +# (include from file adm/unix/make_omniorb generated by +# adm/unix/make_omniorb.in) +#======================================================================= +# -* Makefile *- +# +# Author : Patrick GOLDBRONN (CEA) +# Date : 29/06/2001 +# + +# Client and server object are the same with omniorb +# There are one header file and one source file generate + +#IDLOBJ=$(IDLSRC:%.idl=%$(IDL_CLN_OBJ)) + +# dependancies between idl and it's generated files +%$(OMNIORB_IDL_CLN_CXX) %$(OMNIORB_IDL_CLN_H): ${KERNEL_ROOT_DIR}/idl/salome/%.idl + $(OMNIORB_IDL) $(IDLCXXFLAGS) $(OMNIORB_IDLCXXFLAGS) $< + +%$(OMNIORB_IDL_CLN_CXX) %$(OMNIORB_IDL_CLN_H): ${top_srcdir}/idl/%.idl + $(OMNIORB_IDL) $(IDLCXXFLAGS) $(OMNIORB_IDLCXXFLAGS) $< + +# dependncies between idl files +depend_idl: .depidl + +# we use cpp to generate dependencies between idl files. +# we change cpp output to keep only idl file and transform it to get a suitable rule +.depidl: $(IDL_FILES) + @touch $@ + @for dep in $? dummy; do \ + if [ $$dep != "dummy" ]; then \ + echo Building dependencies for $$dep; \ + basedep=`basename $$dep .idl`; \ + header="$$basedep"$(IDL_CLN_H); \ + sed '\%^'"$$header"':%,\%[^\\]$$%d' <$@ >$@- && mv $@- $@; \ + $(CPP) $(C_DEPEND_FLAG) -I$(srcdir) $$dep 2>/dev/null | \ + sed `echo "s%$$basedep\\.idl%$$header:%g"` | \ + sed 's% $(srcdir)/% %g' | \ + sed 's% $(top_srcdir)/% %g' | \ + sed 's% $(top_builddir)/% %g' | \ + sed 's%^.*:\.o: *%%' | sed 's%^ *\\ *%%'| sed 's%^ *\(.*\):%\1:%' | \ + sed 's/\.idl/$(IDL_CLN_H)/' >>$@; \ + echo '' >>$@; \ + fi; \ + done ; + +-include .depidl + +#======================================================================= +# End specific part to omniorb +#======================================================================= diff --git a/bin/VERSION.in b/bin/VERSION.in new file mode 100755 index 0000000..8395447 --- /dev/null +++ b/bin/VERSION.in @@ -0,0 +1 @@ +SALOME 2 MODULE C++ : MULTIPR : @VERSION@ diff --git a/bin/myrunSalome.py b/bin/myrunSalome.py new file mode 100755 index 0000000..e9d52c4 --- /dev/null +++ b/bin/myrunSalome.py @@ -0,0 +1,162 @@ +# Copyright (C) 2005 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +#!/usr/bin/env python + +def test(clt): + """ + Test function that creates an instance of MULTIPR component + usage : multipr=test(clt) + """ + # create an LifeCycleCORBA instance + import LifeCycleCORBA + lcc = LifeCycleCORBA.LifeCycleCORBA(clt.orb) + import MULTIPR_ORB + multipr = lcc.FindOrLoadComponent("FactoryServer", "MULTIPR") + return multipr + + +def multipr_test1(clt,path): + import LifeCycleCORBA + lcc = LifeCycleCORBA.LifeCycleCORBA(clt.orb) + import MULTIPR_ORB + engine = lcc.FindOrLoadComponent("FactoryServer", "MULTIPR") + m = engine.getObject(path+'/agregat100grains_12pas.med') + liste_champs = m.getFields() + for i in liste_champs: + m.getTimeStamps(i) + liste_maillages = m.getMeshes() + m.setMesh(liste_maillages[0]) + m.partitionneDomaine() + m.getParts() + m.save() + m.decimePartition('MAIL_99', 'SIG_____SIEF_ELGA_______________', 12, 'Filtre_GradientMoyen', 10, 25, 0.3) + liste_grains = m.getParts() + m.save() + m.partitionneGrain('MAIL_98', 3, 0) + m.save() + m.getParts() + m.getMeshes() + m.getFields() + + +def multipr_test2(clt,path): + import LifeCycleCORBA + lcc = LifeCycleCORBA.LifeCycleCORBA(clt.orb) + import MULTIPR_ORB + engine = lcc.FindOrLoadComponent("FactoryServer", "MULTIPR") + m = engine.getObject(path+'/agregat100grains_12pas.med') + m.getMeshes() + m.setMesh('MAIL') + m.partitionneDomaine() + m.getParts() + liste_champs = m.getFields() + m.getTimeStamps(liste_champs[3]) + m.decimePartition('MAIL_99', 'SIG_____SIEF_ELGA_______________', 12, 'Filtre_GradientMoyen', 10, 25, 0.3) + m.save() + m.getMeshes() + m.getParts() + m.getFields() + + +def multipr_test3(clt,path): + import LifeCycleCORBA + lcc = LifeCycleCORBA.LifeCycleCORBA(clt.orb) + import MULTIPR_ORB + engine = lcc.FindOrLoadComponent("FactoryServer", "MULTIPR") + m = engine.getObject(path+'/agregat100grains_12pas.med') + m.setMesh('MAIL') + m.partitionneDomaine() + m.getParts() + liste_champs = m.getFields() + m.getTimeStamps(liste_champs[3]) + m.decimePartition('MAIL_99', 'SIG_____SIEF_ELGA_______________', 12, 'Filtre_GradientMoyen', 10, 25, 0.3) + m.partitionneGrain('MAIL_1', 3, 0) + m.getParts() + #m.partitionneGrain('MAIL_2', 4, 1) + m.getMeshes() + m.getParts() + m.getFields() + m.save() + + +def multipr_test4(clt,path): + import LifeCycleCORBA + lcc = LifeCycleCORBA.LifeCycleCORBA(clt.orb) + import MULTIPR_ORB + engine = lcc.FindOrLoadComponent("FactoryServer", "MULTIPR") + m = engine.getObject(path+'/agregat100grains_12pas_grains_maitre.med') + m.getFields() + m.getParts() + for i in m.getParts(): + m.partitionneGrain(i, 3, 0); + + +def multipr_test5(clt,path): + import LifeCycleCORBA + lcc = LifeCycleCORBA.LifeCycleCORBA(clt.orb) + import MULTIPR_ORB + engine = lcc.FindOrLoadComponent("FactoryServer", "MULTIPR") + m = engine.getObject(path+'/agregat100grains_12pas.med') + liste_champs = m.getFields() + liste_maillages = m.getMeshes() + m.setMesh(liste_maillages[0]) + liste_grains = m.partitionneDomaine() + for grain in liste_grains[0:4]: + m.decimePartition(grain, liste_champs[1], 12, 'Filtre_GradientMoyen', 10, 25, 0.3) + m.getParts() + m.save() + + +def multipr_test6(clt,path): + import LifeCycleCORBA + lcc = LifeCycleCORBA.LifeCycleCORBA(clt.orb) + import MULTIPR_ORB + engine = lcc.FindOrLoadComponent("FactoryServer", "MULTIPR") + m = engine.getObject(path+'/agregat100grains_12pas.med') + liste_champs = m.getFields() + liste_maillages = m.getMeshes() + m.setMesh(liste_maillages[0]) + liste_grains = m.partitionneDomaine() + liste_pgrain = m.partitionneGrain(liste_grains[4], 16, 0) + m.setBoxing(10) + for grain in liste_pgrain[0:11]: + m.decimePartition(grain, liste_champs[1], 12, 'Filtre_GradientMoyen', 10, 25, 0.5) + m.getParts() + m.save() + n = engine.getObject(path+'/agregat100grains_12pas_grains_maitre.med') + n.getParts() + + +if __name__ == "__main__": + import user + from runSalome import * + clt,args = main() + + # + # Impression arborescence Naming Service + # + + if clt != None: + print + print " --- registered objects tree in Naming Service ---" + clt.showNS() + session=clt.waitNS("/Kernel/Session") + catalog=clt.waitNS("/Kernel/ModulCatalog") + import socket + container = clt.waitNS("/Containers/" + socket.gethostname().split('.')[0] + "/FactoryServer") diff --git a/bin/runAppli.in b/bin/runAppli.in new file mode 100755 index 0000000..99af375 --- /dev/null +++ b/bin/runAppli.in @@ -0,0 +1,44 @@ +#!/bin/sh + +if [ -z "${KERNEL_ROOT_DIR}" ] ; then +export KERNEL_ROOT_DIR=@KERNEL_ROOT_DIR@ +fi +if [ -z "${MULTIPR_ROOT_DIR}" ] ; then +export MULTIPR_ROOT_DIR=@prefix@ +fi + +searchFreePort() { + echo -n "Searching for a free port for naming service: " + export NSPORT=2810 + local limit=$NSPORT + let limit=limit+100 + while [ 1 ] + do + aRes=`netstat -ltn | grep -E :${NSPORT}` + if [ -z "$aRes" ]; then + echo ${NSPORT} - Ok + local myhost=`hostname` + export OMNIORB_CONFIG=${HOME}/.omniORB_${myhost}_${NSPORT}.cfg + local initref="NameService=corbaname::"`hostname`":$NSPORT" + if [[ `python -c "import CORBA; print CORBA.ORB_ID"` = "omniORB4" ]]; then + echo "InitRef = $initref" > $OMNIORB_CONFIG + else + echo "ORBInitRef $initref" > $OMNIORB_CONFIG + fi + break + fi + echo -n "${NSPORT} " + if [[ $NSPORT -eq $limit ]] ; then + echo + echo "Can't find a free port to launch omniNames" + echo "Try to kill the running servers and then launch SALOME again." + exit + fi + let NSPORT=NSPORT+1 + done +} + +searchFreePort + + +${KERNEL_ROOT_DIR}/bin/salome/envSalome.py python -i $MULTIPR_ROOT_DIR/bin/salome/myrunSalome.py --modules=MULTIPR --containers=cpp,python --killall diff --git a/build_configure b/build_configure new file mode 100755 index 0000000..9aa3637 --- /dev/null +++ b/build_configure @@ -0,0 +1,242 @@ +#!/bin/bash + +# +# Tool for updating list of .in file for the SALOME project +# and regenerating configure script +# +# Author : Marc Tajchman - CEA +# Date : 10/10/2002 +# $Header $ +# + +ORIG_DIR=`pwd` +CONF_DIR=`echo $0 | sed -e "s,[^/]*$,,;s,/$,,;s,^$,.,"` + +######################################################################## +# Test if the KERNEL_ROOT_DIR is set correctly + +if test ! -d "${KERNEL_ROOT_DIR}"; then + echo "failed : KERNEL_ROOT_DIR variable is not correct !" + exit +fi + +######################################################################## +# Test if the GUI_ROOT_DIR is set correctly + +if test ! -d "${GUI_ROOT_DIR}"; then + echo "failed : GUI_ROOT_DIR variable is not correct !" + exit +fi + +######################################################################## +# Test if the MED_ROOT_DIR is set correctly + +if test ! -d "${MED_ROOT_DIR}"; then + echo "failed : MED_ROOT_DIR variable is not correct !" + exit +fi + +######################################################################## +# Test if the MED2HOME is set correctly + +if test ! -d "${MED2HOME}"; then + echo "failed : MED2HOME variable is not correct !" + exit +fi + +######################################################################## +# Test if the HDF5HOME is set correctly + +if test ! -d "${HDF5HOME}"; then + echo "failed : HDF5HOME variable is not correct !" + exit +fi + +######################################################################## +# find_in - utility function +# +# usage : +# find_in directory filename +# +# Finds files following the *.in pattern, recursively in the +# directory (first argument). +# Results are appended into the file (second argument) +# +# Difference from the standard unix find is that files are tested +# before directories +# + +find_in() +{ + local i + local f=$2 + +# if the first argument is not a directory, returns + + if [ ! -d "$1" ] ; then + return + fi + +# dont look in the CVS directories + + case $1 in + */CVS) return ;; + */adm_local/*) return ;; + *) ;; + esac + +# for each regular file contained in the directory +# test if it's a .in file + + for i in "$1"/* + do + if [ -f "$i" ] ; then + case $i in + *.in) echo $i" \\" >> $f;; + *) ;; + esac + fi + done + +# for each subdirectory of the first argument, proceeds recursively + + for i in "$1"/* + do + if [ -d "$i" ] ; then + find_in "$i" "$f" + fi + done +} + + +####################################################################### +# Generate list of .in files (Makefile.in, config.h.in, etc) +# appending it in file configure.in + +cd ${CONF_DIR} +ABS_CONF_DIR=`pwd` + +# +# Common part of the configure.in file +# +chmod u+w configure.in.base +if ! \cp -f configure.in.base configure.in_tmp1 +then + echo + echo "error : can't create files in" ${CONF_DIR} + echo "aborting ..." + chmod u-w configure.in.base + exit +fi +chmod u-w configure.in.base + +if [ -e "${CONF_DIR}/salome_adm" ] ; then + \rm -f ${CONF_DIR}/salome_adm +fi + +# make a link allowing AC_OUTPUT to find the salome_adm/.../*.in files +echo "" >> configure.in_tmp1 +echo 'ln -fs ${KERNEL_ROOT_DIR}/salome_adm ${ROOT_SRCDIR}' >> configure.in_tmp1 + +echo "" >> configure.in_tmp1 +echo "AC_OUTPUT([ \\" >> configure.in_tmp1 + +# +# List of .in files in the adm/unix directory +# These files MUST be on top of AC_OUTPUT list so we +# put them "manually" +# + +echo "./salome_adm/unix/SALOMEconfig.h \\" >> configure.in_tmp1 +echo "./salome_adm/unix/F77config.h \\" >> configure.in_tmp1 +echo "./salome_adm/unix/sstream \\" >> configure.in_tmp1 +echo "./salome_adm/unix/depend \\" >> 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 "./adm_local/unix/make_commence:${ABS_CONF_DIR}/adm_local/unix/make_commence.in \\" >> configure.in_tmp1 +echo "./salome_adm/unix/make_conclude \\" >> configure.in_tmp1 +echo "./salome_adm/unix/make_module \\" >> configure.in_tmp1 + +\rm -f configure.in_tmp2 +touch configure.in_tmp2 +find_in . configure.in_tmp2 + +sed -e '/^...salome_adm/d' \ + -e '/configure.in/d' \ + -e '/^...adm_local/d' \ + -e 's/.in / /' \ + configure.in_tmp2 >> configure.in_tmp1 + +echo "])" >> configure.in_tmp1 + +# delete the link created for AC_OUTPUT +echo "" >> configure.in_tmp1 +\mv configure.in_tmp1 configure.in_new +\rm -f configure.in_tmp2 + + +######################################################################## +# Create new (or replace old) configure.in file +# Print a message if the file is write protected +# + +echo +if test ! -f configure.in +then + echo -n "Creating new file 'configure.in' ... " + if \mv configure.in_new configure.in >& /dev/null + then + echo "done" + else + echo "error, check your file permissions" + fi +else + echo -n "Updating 'configure.in' file ... " + if ! \cp configure.in configure.in_old >& /dev/null + then + echo + echo + echo "Can't backup previous configure.in" + echo -n "Continue (you will not be able to revert) - (Y/N) ? " + read R + case "x$R" in + xn*) exit;; + xN*) exit;; + esac + echo + echo -n " " + fi + if \cp configure.in_new configure.in >& /dev/null + then + \rm -f configure.in_new + echo "done" + else + echo + echo "error, can't update previous configure.in" + fi +fi + +######################################################################## +# Use autoconf to rebuild the configure script +# + +if test -f configure +then + echo -n "Updating 'configure' script ... " +else + echo -n "Creating 'configure' script ... " +fi + +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 \ + -I ${MED_ROOT_DIR}/adm_local/unix/config_files +if autoconf +then + echo "done" +else + echo "failed (check file permissions and/or user quotas ...)" +fi + +cd ${ORIG_DIR} + +echo diff --git a/configure.in.base b/configure.in.base new file mode 100644 index 0000000..bfad732 --- /dev/null +++ b/configure.in.base @@ -0,0 +1,337 @@ +# +# PLEASE DO NOT MODIFY configure.in FILE +# +# ALL CHANGES WILL BE DISCARDED BY THE NEXT +# build_configure COMMAND +# +# CHANGES MUST BE MADE IN configure.in.base FILE +# +# +# Author : Marc Tajchman (CEA) +# Date : 28/06/2001 +# Modified by : Patrick GOLDBRONN (CEA) +# Modified by : Marc Tajchman (CEA) +# +# Created from configure.in.base +# + +AC_INIT(src) +AC_CONFIG_AUX_DIR(${KERNEL_ROOT_DIR}/salome_adm/unix/config_files) +AC_CANONICAL_HOST + +PACKAGE=salome +AC_SUBST(PACKAGE) + +VERSION=3.2.2 +XVERSION=0x030202 +AC_SUBST(VERSION) +AC_SUBST(XVERSION) + +# set up MODULE_NAME variable for dynamic construction of directories (resources, etc.) +MODULE_NAME=multipr +AC_SUBST(MODULE_NAME) + +dnl +dnl Initialize source and build root directories +dnl + +ROOT_BUILDDIR=`pwd` +ROOT_SRCDIR=`echo $0 | sed -e "s,[[^/]]*$,,;s,/$,,;s,^$,.,"` +cd $ROOT_SRCDIR +ROOT_SRCDIR=`pwd` +cd $ROOT_BUILDDIR + +AC_SUBST(ROOT_SRCDIR) +AC_SUBST(ROOT_BUILDDIR) + +echo +echo Source root directory : $ROOT_SRCDIR +echo Build root directory : $ROOT_BUILDDIR +echo +echo + +if test -z "$AR"; then + AC_CHECK_PROGS(AR,ar xar,:,$PATH) +fi +AC_SUBST(AR) + +dnl Export the AR macro so that it will be placed in the libtool file +dnl correctly. +export AR + +echo +echo --------------------------------------------- +echo testing make +echo --------------------------------------------- +echo + +AC_PROG_MAKE_SET +AC_PROG_INSTALL +dnl +dnl libtool macro check for CC, LD, NM, LN_S, RANLIB, STRIP + for shared libraries + +AC_ENABLE_DEBUG(yes) +AC_DISABLE_PRODUCTION + +echo --------------------------------------------- +echo testing libtool +echo --------------------------------------------- + +dnl first, we set static to no! +dnl if we want it, use --enable-static +AC_ENABLE_STATIC(no) + +AC_LIBTOOL_DLOPEN +AC_PROG_LIBTOOL + +dnl Fix up the INSTALL macro if it s a relative path. We want the +dnl full-path to the binary instead. +case "$INSTALL" in + *install-sh*) + INSTALL='\${KERNEL_ROOT_DIR}'/salome_adm/unix/config_files/install-sh + ;; +esac + +echo +echo --------------------------------------------- +echo testing C/C++ +echo --------------------------------------------- +echo + +cc_ok=no +dnl inutil car libtool +dnl AC_PROG_CC +AC_PROG_CXX +AC_CXX_WARNINGS +AC_CXX_TEMPLATE_OPTIONS +AC_DEPEND_FLAG +# AC_CC_WARNINGS([ansi]) +cc_ok=yes + +dnl Library libdl : +AC_CHECK_LIB(dl,dlopen) + +dnl Library librt : for alpha/osf +AC_CHECK_LIB(rt,nanosleep) + +dnl add library libm : +AC_CHECK_LIB(m,ceil) + +AC_CXX_USE_STD_IOSTREAM +AC_CXX_HAVE_SSTREAM + +dnl +dnl --------------------------------------------- +dnl testing linker +dnl --------------------------------------------- +dnl + +AC_LINKER_OPTIONS + +echo +echo --------------------------------------------- +echo testing threads +echo --------------------------------------------- +echo + +ENABLE_PTHREADS + +echo +echo --------------------------------------------- +echo testing python +echo --------------------------------------------- +echo + +CHECK_PYTHON + +echo +echo --------------------------------------------- +echo testing QT +echo --------------------------------------------- +echo + +CHECK_QT + +echo +echo --------------------------------------------- +echo testing msg2qm +echo --------------------------------------------- +echo + +CHECK_MSG2QM + +echo +echo --------------------------------------------- +echo BOOST Library +echo --------------------------------------------- +echo + +CHECK_BOOST + +echo +echo --------------------------------------------- +echo Testing OpenCascade +echo --------------------------------------------- +echo + +CHECK_CAS + +echo +echo --------------------------------------------- +echo testing omniORB +echo --------------------------------------------- +echo + +CHECK_OMNIORB + +echo +echo --------------------------------------------- +echo default ORB : omniORB +echo --------------------------------------------- +echo + +DEFAULT_ORB=omniORB +CHECK_CORBA + +AC_SUBST_FILE(CORBA) +corba=make_$ORB +CORBA=adm_local/unix/$corba + +echo +echo --------------------------------------------- +echo Testing GUI +echo --------------------------------------------- +echo + +CHECK_SALOME_GUI + +echo +echo --------------------------------------------- +echo Testing full GUI +echo --------------------------------------------- +echo + +CHECK_CORBA_IN_GUI +if test "x${CORBA_IN_GUI}" != "xyes"; then + echo "failed : For configure MULTIPR module necessary full GUI !" + exit +fi + +echo +echo --------------------------------------------- +echo Testing Kernel +echo --------------------------------------------- +echo + +CHECK_KERNEL + +echo +echo --------------------------------------------- +echo Testing Med +echo --------------------------------------------- +echo + +CHECK_MED + +echo +echo --------------------------------------------- +echo testing HDF5 +echo --------------------------------------------- +echo + +CHECK_HDF5 + +echo +echo --------------------------------------------- +echo testing MED2 +echo --------------------------------------------- +echo + +CHECK_MED2 + +echo +echo --------------------------------------------- +echo Testing GUI +echo --------------------------------------------- +echo + +CHECK_SALOME_GUI + +echo +echo --------------------------------------------- +echo Summary +echo --------------------------------------------- +echo + +echo Configure +variables="cc_ok threads_ok boost_ok python_ok omniORB_ok qt_ok msg2qm_ok Kernel_ok Med_ok hdf5_ok med2_ok SalomeGUI_ok" + +for var in $variables +do + printf " %10s : " `echo \$var | sed -e "s,_ok,,"` + eval echo \$$var +done + +echo +echo "Default ORB : $DEFAULT_ORB" +echo + +dnl generals files which could be included in every makefile + +AC_SUBST_FILE(COMMENCE) COMMENCE=adm_local/unix/make_commence +AC_SUBST_FILE(CONCLUDE) CONCLUDE=salome_adm/unix/make_conclude +AC_SUBST_FILE(MODULE) MODULE=salome_adm/unix/make_module + +dnl les dependences +AC_SUBST_FILE(DEPEND) DEPEND=salome_adm/unix/depend + +dnl We don t need to say when we re entering directories if we re using +dnl GNU make becuase make does it for us. +if test "X$GMAKE" = "Xyes"; then + AC_SUBST(SETX) SETX=":" +else + AC_SUBST(SETX) SETX="set -x" +fi + +# make other build directories +for rep in salome_adm adm_local doc bin/salome include/salome lib${LIB_LOCATION_SUFFIX}/salome share/salome/resources/${MODULE_NAME} share/salome/doc idl +do + $INSTALL -d $rep +done + +echo +echo --------------------------------------------- +echo copying resource files, shell scripts, and +echo xml files +echo --------------------------------------------- +echo + +dnl copy shells and utilities contained in the bin directory +dnl excluding .in files (treated in AC-OUTPUT below) and CVS +dnl directory + +cd bin +for i in $ROOT_SRCDIR/bin/* +do + local_bin=`echo $i | sed -e "s,$ROOT_SRCDIR,.,"` + case "$local_bin" in + *.in | *~) ;; + ./bin/CVS) ;; + *) ln -fs $i; echo $local_bin ;; + esac +done +cd $ROOT_BUILDDIR + +AC_SUBST_FILE(ENVSCRIPT) ENVSCRIPT=salome_adm/unix/envScript + +echo +echo --------------------------------------------- +echo generating Makefiles and configure files +echo --------------------------------------------- +echo + +AC_OUTPUT_COMMANDS([ \ + chmod +x ./bin/* \ +]) + +## do not delete this line diff --git a/doc/CSSI_DRV_EDF-IOLS-MULTIPR_spec-conception_1_1.odt b/doc/CSSI_DRV_EDF-IOLS-MULTIPR_spec-conception_1_1.odt new file mode 100755 index 0000000000000000000000000000000000000000..80f80635602f89f6ac2ed3774f3c72ac7c985e68 GIT binary patch literal 557571 zcmbrk1yEc;&@PHgfFKDH+zGl6+?D_V0tC0uNg1f`w5FCOpZowCa zMHYFR{Bqx``ft^{@13okIyKVWGu<=&bmNarquz zA}OVK1G{ac&B(dL zxkRnj#LdgCE1ZZrV%+?srKd?h5vos|&K@7s-z37DduX$08!d@K_Z`v#x{G_((v=JTGjZ*fWD{{p3 zlQ(}2WxgeLIki((d$nv?r!7fz6_#K>Ac8TNKneBbLoAqYXLphxRrZFkAhv`52g-sw zpVbRLa@U78y6|^5ie!b5h=$HDWUYc{l}AEU!-}t>#VIGiXR$%F5T>_mRy-nOl=;5g z1A4Aj%38qz5np*wZ}bVy28{Z@R7qzsDX^0&nY^4M8(f*bdOV!qBI*!(}|#b^YaJ$_@uv-$FbjMjo|@7{-Sj65ZY zEIrvC2s5q25j0RThoSVB*>8|a|H8NX)D}^fFCyn;IfpG_CnZq9 zi@*9=a&m>eQD_vDJ57hu`@D6v3P`z1+VFgncQo2A#-WVUJwQ}yDRy^!WpiAMSwq$< z*~rd4`*M@qaX&%J$oh*wC$(%yhr{z46n%n8GlI!bIhw5dN|Kiwt{mTO0ADCxl@D6h z7c?{f-UmM#lgQmYFLw=Q+c&K{05?4{EnJ28HPSCMd?aCHE@6bS{eLMO*x{K9#?nW> zRAKSq@6dx_6y4HUj@M@EdE1Fh8O&X5S(W1FI*dKQ9ndu;%^V6t#1cKB8pPlD0a z8yy_T@zN`YB%Bv#{i3bVC+MCTMtMC(DZHrN5usHiS>2(dn0GE2c&LkG+0TcMxFYRvRU9Of&{j0^t9-i{nY`SM<1DvAW|V9#k4#nVZsz@H=kI-w5d zfp_qAAkG5Hd?c>E3ooLR8S9XNyMrIhOaZH1N-;Ke=i%2D_f)~1ljVg)l?(7HjEb^c zAB}h9+;OkFT(#IcTB+TJwiA<5r>#W67>!jjvJGYgDgt^r^4V9 z2pc>4`;H@o8MT5K2i_6#s2akFFIysQqQ9b3T2X<;5;pt-1r4=26lH$7 z3tcMgt7}+^JWHaJI@PuTFEE~BAF}Sex7&&ny1#pt8^JKYHu=%@In02@Cd^>FnrwGwU$8sT zJyCocL=Uya!O}U$(1+)u@RCc2B+71fYvvkUo4c43*}1)#BqJgU)mt+%q_J7|KqdM> ziK-`ldm@b(f)HXLa`}D`Ms2b8YOZE#TR2C+Hlt4VX^4C>N;7>{Da}8a%!_}XgMxf5v6%k2_H6I zKQN*cyIdUY3u7yqnca7F9g%aEEXQg-a-nOj*VN$LFBFqeacDMLu4bR+Ct(9hS|$a@fp00aG7P^x~so_2YSN;>q%zM`Gh}N1*92 z;di~t!|VqFK6sFM`uETcyV0M=jH-@Y1sGIM;gx($`*y5i@s`Tq7`v8+;00QQR>bG_ zJ#wUwV^4dYy1{z!rr<~{uoM25zj}`DVMV--6 z`0eoF+>Ls-+6iJ6%UWS6p`LRHVUD?3LBCx(VZNTgvh(cE3mY2d#gi^29_w+>o!{B# z-s1Qj?$*8;J=-{($gI6XP|Ma5*(Nz6hiV|^K-u{?Vv7a2=|UkkXpJNv&-yEs2}KLw zH_Y=g&4X-?k9O_3++v$Kuj+&tHU-J=L}MGsIk9- zDpoYdHh4diP4hOy6GS}2JJcb$N{%A0#S7o^{_=f)&Co3>_6Y})4IHyvUWBke%m%!! z^l1oaE?N|4kO}eH$*fF1`OfFNZ;%f134HaQI8jn9%2AS|HhLW`;S=b;rW9StlVLe1 zvP^FYAC#s<>P5@I<2_rD`K!9_L~apJOZ3$Xek14XaQoK_!VO4YM18=nn;YUTkp23M;7qNrxSf4TW`1jN}Mjr|Z z4G)q~|3t055LpN6CzfWkMshtHF>B6a4EHx9?0NnKtD1T=hQSeOY}74BcF=zJGsg34 zFNeH{!+_2u6~;$Tx`}?7w%T7F?6)chyLkgC2WW{(?ZE&go=fg^Fv!g%Q>MfVddh`fKU}&C&{j#_zfmzTBunZ(CN;f zPa9Uu4$vFg%^WdKFVK(gyM$1j(7S|ioFck}@^7xp*FYjr`A}zOs6dy{6Q{ha5Vj8{ z6kLQb3!jRK)oZklS6APD2hfY)zrfn2@SfoH+2r9}w9sC+N-}>QU9V(^$gKwP0Zd+# z{&_-@K_hwL*}Fc&!Q^i*Q(uDBAUYaq>f`v#jqDgWuUkg^R94>pMy3Y{h$UCYZ1y19 zrfNM=w$z9;=Y4Tx(b$O@;b%02Idft@k{6dTV<6al)*z-M;EF!vt?#c73FR2$rfIFG zQI9!y^EY^dR%3t~6X!1rSV`w)7BnC5Pf{v5F)m6dNvkCG=_wxYQhoOY7O_nqr3!t5 zn~!INk|Ei)R@Yfd`cpLpO;2r`5t}&d3*LYj=7mMG8_7$SL<4GoYVJ^HYE&~f7AB@e zzq|Kqtooq1-YVi*A3D=8m?nAoh9lSXjEn(2BLw3l|7Y4NoPzrYnF}sPzWm1>ULq15 zV%W3)xu~`Pcg3iER9__Oy$#~^eMEXtG3l~#g(|fol}~2i#G?OIJb8xL+uJK&R_NF7 zy-}$=IdQ8LVyief>a0FyVP>LVCynr6ziudR(Cc8v`Hb|z^?kQ2#IRbVOK)2+xlhJ{ z&m(D>I9CQMVj!I4s?;j~_6!F#FhUFU7E4V@x`2knu&L6+89H<WuZD?C1~3`(^Sf8ph`$e;USsN=h3^`vfDiOHb#SqIH8nH_xNV zEfRms0`4c*@X_R-n#_Xm)YWu2tB?C0VgTGs73_aTf^!KcKLJ9eOz{fO<`#d1^AaiF zspMsR#7#=aYV4es2Q^@tB)keoPL3*u5)pa@nF~gN<2`tc@SR0~_IsXpVMdTku>csM zwoJt49Ssd!Y*Pevux!iTB+$O+zQH|i@Lwf3oWszwQ;vDUKPS;02ICouj5x5s_X1Ty zU!|#0Y|7PT1;cJ_jI;(aL7iyBfKM!Txy98eh!5%As0=8av^r?l zw#N|x*fwgV67y<_LD{INsF2D}5p#K_qP62XC~9>!3moaih5%sD0$MLWU>fv|>> z$Z-^D3owUC6!7#q$U5M30H|{!j|s-7`r3($aa*17Y|6r9CQSkzBLSqDBKP5Ng+3n6 z!~;VQYoJ1R?DXko@hR!F@0|=}3WaIS{JcjPVb+Y@QCnAZ^P&1x6E-=@ok)8oDDOo4 z0`9)un!pv9@_*OOvPI7rOh`tg4OiSX48dn=62$?)Q3Z=$qQgaaPSL_VKlX3aLSEx^ zzHcGfj+o8JAM3zm!vi zi~41GugSJ+A&&bxg|)_&6K(e*;Y5V0tpToWD*ar4PcV~NPDW?@~ zSSg1|(ndG1>VC&mX_nyS5+^rbIW&}98dFtC(?M2uJOs{kA~DqK4FEH&NBDkyeZ8soBOap24CBNi9*62W7l7tpux@()<8nL9 z6SK0SGOT)+c#V&~i`PBt|_ynSVTbhXMMh*`{MIX0>`dd3y=hDQC zE2sbH+b4eyJTXx-V>;b9Cl-REPV*LYBQTT5;ToBY&|iCbG_21xef@L6Y zE#doZU(e68jS=%Bg~gHcu9-hgapt4BC}>A%M__q1^1S#avfeJ38v+cuk@MK$jkkPy zbwo94;XW7V7H~5gy5M9+UOCN+Loy_x(8mXE z^lwV|E}*(NV1lvHSA%b$>v)=G`zZ0Kmmg93i=2GC@ zu)gDrB90<^-8~4zU6@EXba>l61cV?k7uN)}k7$f+!Zc<$U_A+IjFu&K->vB;X?uMH znawTeQVr>Pa#*!DnbF*hkH70cqv@Jde_5?Q;YK9F=^IKJaGxQHer{X1HRTx_eNq4e z+YBN>B$TcRA0=&xkwk3Zxz=<#faibNtZmK=7nIaP6)rR6>x7#>Wd4;_M2;6DJ`JSp zsBYdgKm7@du=x_Iu(kIl>#eyB7~^oa-))hK8*$tk^AIh9t7n)@=VQ zW8;r%H5VQDdTXoQ&gm1;fBIXP=Q@GqQI;o+?!@o=xYN_o4$OQ)vY`>Cl_e8`GqlRu z+17T}CJdD)l;eGB$csfJub02?C`#LuC#^ZDB|P4>HQ~;Rm^`M#U=q`l|#43_tGAB8=* zDq;S)y)heMrWswIG&dlKZtCqeIs!r;^9e)^Hjz$QyV~K+uPv`iaB#+>SRVrd+Q~I+ zz#)x|3r`Ry%2%(S_`?17LVj3)`!BQgKbg_p=IRnRDDc-jYlodf$?`1de0PBVXqPi; zM=|KF4+9gJhTmj@v_Zxi)^s!YY8Bl{pq2D~252<*OJZyA2b;Lym1F0w)ya)z6a_)Y zNHaQ3=h(lhdxz`J?QtzV3`yX9?M>`p3ClZMi^)$&VWm)z8o4FNo{y$8iW<&g)v%$P zc`r0!LsyfzCYF@Mk2v91^wYo3VAbx~sv0F+;|d4uMi^-L#qI8l03p>0!&R@eJuMfY zZQR;>&)ce<@WZ_>JiiSLgn_P!`}{^3qy>rFxvLXqeWN)}8U}zoOt+#{gi^|Q{kWSy z27x71hIVs#_OUQoA+qd12sJcXz^{s1a9Fj-=uYI9a;kdS6n%gvnf{Z>iSaH8t9~G) zE8@6`Qd=wB{c}3U_xE6h-tCgwXZd+xS^H{Bx(A_WfN@1zvJ&h2#gS~e>zIA3B*VN9 z5oXl))ZgCsB!jN)_nOq`r3H;?RwIiCx~pi}qTVzZ!x;eSu(TudK_CQ7L*59q)cj6U z+SGcD8A4-IV^^*?pr05Y>_fwx2J4}cXc{MD%j3Io_r0uBy8rPCF6YE;P!V27rq8q7 zgItjmnyZ5EMKa#LA zk?`YWEt?s}yuQWWuC0yK*`yi8?uqvSKhDZ-_uL=X8>Bs+e1!5x(?|Np1!KY2321}g zr5E6?z`Euprn@ik0?Lcyx<=@P#8n>XXu?Xcqpjf^L<#5_Sz(Ed`kqzhhS1uxxlVXj_mT13^q zyAS6f=THWZ$mXe$kir>g?k{8)?O?K+zw{b`wGNKMYlXxo54p=}#in)RS3Pckbdw)l ze@{m>ss;H{?6P|Vd+V%0dTRB0m=+DvhvZ*ht3GFpBkDsBz z*Q*^~Gy=uD5J9|~;~lqh2h+WLd_Q{s3Qb2ugaVDG7MQni0r{Yb^iVxOPj! z9@bijzU_rZb2*s>%gaZ-o}5lb_K}H|GFSxDAyqleaPGqvtIzlgcz3bWId#r}NVMZj zR73M2FJZg?adx+6*wJaAAnq3SS@@bc$r5=iYlc$yOr5!ao}!hD-VN<)I}%JjbX5n3 zNye;y&uEHJBawqMi0dVy!wvh&$EAxt)9quT{P}Y5B2@W4JeDVF``ZZJiQ_^Jx3cmZYWx~wsSy2>>I^~?iJD0tW3!_j%? z099_kR~mod3TOmvDKXDS>o1c><;;2?c+RA&xu3L|Mh&CvJ_+T|vYGf^V)}b1;uoa= zFGK=Ho6Xm>)VV>QWCg}p-`yDsE^WOu#~7i|j)m3)X?!au2fbot{dEAg>)Sm#QoU!D zkjVBB<^>QQR#Dr8@nbFC8P<{Lz?+|@ZwfB^9= zRCG@`vTs;mX+WVcG}I{3ayK5MCL&q36Sl)b-MZBYCGGhgj=BTuI_LVf|DUno417QR zP1U$AGB9%pyi`U;Go0a|fd4(&@c}EO7@Xp3?MvZP&?>fI_;nuz@1EXGfd8 z5N7(g03de=<`{FGEs6vJnTRHF`(uwx*%y2G`eMs{{H|MDQ*)w(&hv2p7x0G>;*+jW z1&qnmzvpH~1Q~E;tC75gE2@yA;9qZwa8p(W8d7|wLjm$=c#_`rT$n-0c}^6=hk>|~ z57RqL8!QlL^iHhJ{z+?Jf1*SMZ1ZwyJnaiIz>&FWa;{>F*Vya>-lfbJ1GFEMjWEtd z6p>x7uY1T+%xcxbgJ1IKpxK?j1~!)JP=ZQ0LfW=+K;IoN6lFSrxCBum0g0zbyx8AS zpVqXsaN%h~w;ddVqJ;DvjX@Zrzoz3QnqlUjh%A9)4uRlsmYxG@rUrV zH&uaC_OJ+nO)@96OhWFG3Zk_Dy9iQx7G_uq{Wp>~q$W0mJg~f1eg;?4Jdmo@R|z=X z#@)zEF6$I~l59jv5&k#by{*aE^Bj{g7~XK45f&~XqBA3`SQY}ggCLRHn*Akqvs*AT zpbK~*9YpfyJjT5lhMK&*W$HgUPOJZk@7{17JOBb0i;3 zcy#^=CGppHNqm*em{${dWKqsvsy^?TuZ@hfI!$BGc-Bf%N%19w%fBU}<;R z<%o~mdt)DSYY6vt`y~>dqa%ub@zvd~31Z>0B68E(GCt_7$so;YY=RKpMJ9p;*J!>p z1f5VuV5ESEUU_=?Ve*Xph27Pek`z#K`9`41znPf*oe9)t8W~}v8k!Pe{U>|0k-wA@ zoR?|qU_E6XvVpkqhG5n%D{uinRb^*nHWF=iAn!^R5;c&KayfuLVvd4216Esx2|*+G zfGfJi2jj=uQ$r!|XxZ+>lNsEIZJ6c-jU zS;vz?ATd~7t^V3Pwo#|>Z8*PQoHVkrm7|k0Xx$c!v9miqG-T1P+%4_9DJvb>15v;9 zFm&7!tRNA9iM5}DI9aQT930@L}uT(mj0?}YHG^AqY_U_OOE$H%mG=Q zazZsRe)ANsgj5)F{y)YdAsiBhtMJ;w*9*6wEM$B6Ag{0SBoWLa3Q}`BT5ibj^>pz*1Nki>TjCtG-DXFP_g2jIBlVtPJ?iYG`dY&fLiRg$EtOS%XMO!x17vr)HXF8rh z^pj6T+<$Ft2V%j1{TGmS`6Bfw0@LdIz8ZyG=p+zHb{^fIa9JEApual7Swr$iszK3- zl`9z+-u&^ZAP`zj*g+Pf-gIeC@*3Xuo?Bgp6}rQSj8mdTVK8X4sfE$YC8Qqc5zIm^ zcn~z#JXngK&qb{z62%ceK^kcIAW*px(r`HB3s>J^`P zw$trhTO_XUV&ZZEeMQ=P8mkm?ls%k5;iA^-g1?rq)C8Ej3;(!xM~5eiLzMP@|= z=@{D5)#ic!yY3&E0b~;41?78V<54%{21PEa+kbIAsZBUEhg=}JzER!%FRs_~*c(+% zOe*+`B) zh0r$eSo~uh%r^I$QbOhsxg|VlF{44$#w+%^ ziN5YuBQ+Eq1piRgdRe?7CN50`-9h;qQ|t1^2fu|!E|;s3&IQhuj{$d!+=X=cKCmal zdPHu`p|0pIpjS&jWXlJDxwJN!eE1Bp%m`*21u1-lb7whWg&{BJX#L17;sVVa?aw+m z^K%%ghBeqxt2^~xXl)kT*k~Xr0PS*#G_AWcw5Vo$W@0=QWbS(q@xXnz@B;(!8yh!L z#8j=h27p}rM5ou1cl;?ha1C1K=Nm9&Xx)yqNoo0_%IhroM6#z{Kpp3F&=@C~hm9%H zE}>>@P_}w&xFYo^Ez*4=ZPE;!^Ck=Q)Os)swC-_$gik3rwF&bpeKQbCDp67fnMA-t>>XywfRKNOOxJkmKl91!)``WzeY$utq1@?bY0 zMvoucuQ2ADFjrQE9!C#BKSd6F`A<}Dnu=~*Gp>TymWj0Ar&5H!OO{D2UOP5kL%877 zK5PZDW?9hTw;vBPfLeDa73o$wu0n2PcOSlS!#j>gd-XfCx?RT^seg5hLh}*$GT)y{ zR|s@?mR@B#O?FWLTZ1fSI!+$8c0^^i2D}gQ?J0E!Ej~l4mGuskbldB-UKiJcn6^o86s{&z#mQ2_Dr{d#MbCQzJeEDW&b_fr0*hMn5tiaaIR@oF$wOwg$iRa(@{j z+zj4$$YXkT5Rz&rw|@m}9OwV;`_V};x;UDhZeJ^Jz(GkVdUBRaWJYg-Pjcba)XK_3 zR_x(fOHp6#wztmJVd4AI$^wbzmRP+=u1kuAE)E_wq3FAjGtc*CHa0#r0RtPrc%JQK z%P6j_Jq!EH3ih4A{dOy*q13Ro#e2_VF1AAv8`#Tv+m`C)jSxg>{+blmW!%y}nM6@9 z&r#BJLvJ6?FqpFya&S@j66iVi$GW|urw?1Sz=2lPaC1YZVPB(T+1hz_aZt(_*uO%l zRkZ;-DI_B|jT6_pW*2W$7*8Stxcc08 zJCm>SgzMeh?5U4Q{V4lp)a7!VDO%o0&nC&2Ubx~|Wh)K0KybU}Q4TTRW6mjvoJgGt!B9}2kI z>QT)hjAPpgVp3QXU0FKm5x85y(Mc^U$cbYXTx~53fsmHp{@L`)3NKKIxZT>K0#cRC zRoR1#M&Cn;H)K>?ze_6`0M6BED};PHLf`^}If zqY9xStDje~+1Uw|Pv8|58MP8)etNCzt{$Fr9%R%1Qu*e_=Xqcc`tYE@t$ZHmRNv8Q^o`KP!r`SJ*mdFh+omN)_NonGJ7o>E=-fx%JxNggyoN4=r z0P}SjakH6*vDF%1=~G+OTCFR@k%y%w9E^#DT;B%{hg*4D`Bom=tFn^_bM8PTX_j4F zvawn6U61uGoVY4-N8H3Fq-(gbS>5eyU3aIc8qnNb!COnJ9ZB@-)TN?B152T+j-^s3o6%Z zNdB9nT~UQ%poJ35b&K$PAA*RX*)ul^{>5znxmIuMLtWh_>x`V|e)5QC$UUVo$#w9L zXq)o=>A+*`P!Opz&-@%X$vbFv%kFB>xZF$1s#NVn@nfU!Yz7JQ<~Qx5fQKOP(Lw+G zQ(^m}Rx}MCik}K(F3*R!(NZV_t(%%iZ;2 z0{zD6v8d4SC8y#;;nMB+iA!(v#KHRES?IJQyhubN?8~8#R-54)#j%_S)by_Svtp`; zfd{zGZlD#Y?nprgFyAb?b~oNq7xLf?Fdm)98?gWq8a29~_y1{IScYS%>AhXr&P!zr(0DwuV35f=4{ zkKXK|Fxk($H0f6BkChmQ)rH0t`$!;pv)hl5_74*Whka*T_bQq|oAUP?ZLnLMLeDTy zG&OOF_ovotu@Lsk#(vr|VK|VF$?J4$2{AXWYozxm$WZ_t`ZIQ>XJDNWg!L`kJvX3u zgR;$a>IkbM=2gSg9lpVv^TuR*+bQRjn9|C4rLmC{eo3P*h|A6X1mVE^rILWhvxKml z&7LmBv}jE{G#*TeYYF+Ssax{q=4O3^exG2)dgUa$D>i1ysr!SZ!;M!xh>D66_7>W! zlB`ws*IoU0a( z-RwL5T9&DYp1jq{(Fwd*~Q^q`R?(NOlzoWpiN+_B9{9Xlq zSAep&9NFf|1N1)IyX|5!DolTCR1P6Gp66_iy{FBj>W~>;3eW#>4_2j1J1uqEHjU`3 zr8Yi%_Uf5y<6_P7qlZTIHTjcQ1Rfz@!qx1@6$6ESXnN*OHA53RuoDG1XbDm!r9g{} z1-E&{g(WMirTDEmntU56?lYKp^@a>jJVGeB>r-!!__0GuLpw@g2mFV^9PqNos)ae3 zLBp$?T4lCjUD9IJi?2kdPTARt=3S6QhrkU<7J1;?5K;d~1(IvkWyHY`hUK&t@nLbL zJ#QY9e6K3Q!3>qY%{CPYNAK|agiLPuWE@su|KYGjyhi$5Gy1)jnUIv50%F^TT26%2%7@?;VeIZ z>59vP=jsPez2vvTQJ1AufdjgSCtf%4{LA;+!lcC#WAMYdqtSI)sdwZK6z{a(21?cC z-Nx+!9G(Iw7+J1%0z1SC*7#rPFS3^CQh9&XgKqVV+D89XZ z>?34j`c_N76{uj}H+cvqw{dRD%y{qTF<*opIZwMsC%ZAZ_2&9iv{oIn`a|#hP z-8a>tN@{xv?{PgW)nkpLOwBIjcQSKMTkM>wEh#Ozy^&bRy*x}gO68P&ifwpPsoUc3 zW4l#z=R7>5qjt${>UG&YQVP^NpjC>D4@q5=ZM|sGu{ohRgl2Sh=WHDSSN7@Zp$iMQ zgK_3!FAx{}34>#}6I0V(Ib>2?oBipP!cm|gOWKCcI)Qz}rE+EY%CV|Z%d+|WuigSx z9n+|k_O|^$CUq8-J_*lqIJ`n=Q=T+>-ciCE($o8LE?Fz77W?JiI6hs)L*r5-@W;{2 zsCROKzWhCTcemJFwz!n!LQJqseNZr-S?KU`Z06B6uHc4?kWt6QtrVcfe8q7fWnC)w zzQWsk;{zK2O)z|qTb74zfo`HH_v`&I|De&;@60}_G=fXL-L2*0ty9~QkYSVAe7i9? zE>(4jWvi!7&QIhsCbTRi9#lK_VO%U>r%3{q?i;)i)bFjDDXTq0Sz*{t$ImDrSZ}3v z_VU<%qn@Pn%Tt3JN8}eVah~J{5|~iR@463HSRWq;AE->9!!M6638dt+XQ}q+=)Tv8 zHmft(EKaBJPdX%QNd!__hkpooxnf6g+_Y4kZZz1xZ@Vbt7#}n!AwG7QxE?u}g2Wy` zt7>NFQOMk)!mbiC*lkuLwp?*gb*w}@tKnXHBZ{sC(;&T+^;=bjpNITzNCdwNmr>Ji zm&h&f(n|3BtA1?NGbJgataGtfM-7_aO)Jt2HsUk&WE)l5`O1DO7Pu4Z4xwg}Sg?^q zS!aAT;rx~fJ`d~Ah9SEnA^gJ0>FUp)*4-om0;O!$&gF|rDwy*pHXcy}NB?t(sL5UfcT>7N*v7Y*)XI|x8~zn0?r zLf2b}AH88Ey)5VFeSp^2S8|8FkKLarRd+j@8%A4X0{dRXFdk;~3C5wbnS5#qyn6R* zN0ze|4{ta&CEPe}W+wQ4nv=3D#D}E-)0^O9v+j=upTpRGQqnnR_-NwpK^=$4>CtlD zpEA`Wg>)uOC1r2^gR%IwDPUlOM#qFIfviwpK}bzoEvu4{#^_HQTiAR~V4!$r=4G{7 z)!AcCgR5y*Grvn=^5wo$>x|299;o-(YfxU=Ax)~k8UTyXA;_Y*s&UBb>rrSnT5%p5 zr8Q;TCzrdNt>2a{-$tgzhsUw7;Hx(;*#~vHl)keXvK|wPqz7YtzLH*|dw=AqXhhj0 zu}FySz7`oi__M5W=QO}>RfAdB^(yzn?`77 z3Rq;*l&MTi{-{M3Rw)pm>{X<;t1s1Iw^`T`>lLzinEE(i~BagX-U_HIEtqV(Zk1PF=%o*+%c65yw#Z{)7ckM7V&=B^0FB> zkvgc3m(8$cutqAm;peM>So!MMk*Cf?s^t$g2CFVv66va}n5rvHAlijPtI# zDl_oT3)%f9Ey20_9m0d7_G+G!?eI7nrsBc42?lIuH>xwc2cWm6Dc@ybGsCcg*L=IG zJFUM=U*j?%ck+Hp{Z(;4@QYFLc~wim`Mb?haqovIbnN44RjH*OZCNzvg>B%hEBkM# zsV&6wm}2wXGf-;fyQlSX`s4mjJ93Ai9K5q7Gp1_ZK6m530m&z*sl=^+wk4-<7*Zt3 z$<$=0b@w~8N-CR}56apL>eNhtyP1_nL~Y(xDW`yF!K*YM_S-|^Q@uhjy{lGQ{{R=y z{q|o+yAMn(MGoU99#f97LNRk}a$l4VMzch(wS&Q5crUq%|1jAuT_`dC>i;?|u_rKN z{=xB*d;Ct)O8DFd>ytuysc*6mt-l}kF8u{RYH=WMsoo*N<>}ejWQf$Acl}wVh)1r& ztE$CMU)#Oj?QQJrF&I*31nQn{J?QX1Icy!l?g$dgl3){RT)vR)!X54=|I#j8jMytW zh$ zI8-=r393*H5kE@}APmvz5dPy)^S-w+IrbRrYN~mCwUzf-92=XIYyYb*y-iitq||Re zPslHb&D~;8<%5-8p^XXO{nk8hzQbWCx1^VNY4f|GA@8<3Cu_~QV(*{g?fQ!@aPi9W zV;1SXP%fHnI&hW$_F(+f#saBgF$FdVesL`d>E;##7+Z$Se9}4Kj61U-^M0CUdMjqI zsZ$iEavYdhf52%K)h6{gH)kQY?Ay4kw%t!BVwnh7xw@ZKCC>@_AucCBVXq)eC@_`W)_@Z|w%^lEyJi%# z*qlZAtTsij@=2!W4}p;G3UUte)}owJO^~-Y>>B|d=@C!$H|kgRTXyM&QVQ>{>YY#K zYm1s<_tQ`}TByV>n={QaOZ6Q!_nTd%3qE|ipQ{5%Zqx#b?3)DY(IF20%5^^RjNOjH=g~l?r?bSAFuEFkG56V&4TA0uhQf< z`-F?=#<*zS&>{d&I(WFot^Oxopro7 z=D0-Z3L#Ko>`;XMAjiwfY1%Pi|0+!uViF(IdIJ?UmPQp=vxiT_*W_a7T?`M&7_y7F z$yHvYFM!%!Gqvj|9k@>I2Zl6cczR2ht97$fdfpS9F_k2kazku)ylE2!aQ48msMAR)Wtk8t_An^1Myt+v83z@82)nJ~k0a?Ve0~uL^U;`KW$+ zD`r&B7BZ(I_}h#i(+e~)74d24858O8JC|2X@uLrtQ-;b43OpKf!j=kU;4>~uPyX5; z8nv4qDqA!=ic7qK0ViJJ=Yy5T;#}_}H1!*dR>he)9JCLMwrV~1l_zNrD;K8Nc0=n& z`t8Tzhfpyac2(Gej&m>ex=J^W2 z=NNIk`zm#Mk|!$Wu)n|WQh@syDd`U{a~WRDnj~X+A^a_0@N#~eIq0_K?$4i9Iw?{q zD57ucPmN-jnJ@CACAG0#x|6z!c2=+VJ>MiPehA42Yu08&6>QAZ0lSGs%+*5>+Swf@$0o)?*!qDR@_lFR7;qvC?v=5U9Y z@v%UkS94=Zh77jp+aYlPzKU~BcH=rn=iKp`rocXzPLc-_9FnukMCoNp<*Zt3h1R8( znyOOmgxZLwm6`CV<3EEbArCMpX|r(&$me#v)>PPE(zr%|`8TA0DtxL|i=aP*PasHW zntlI8(P#eINII;57VIy~5_^)D>v4|WS*=z}>J1srzCTSI-~ZYiZvc?c31m+a1hzSS z&CI-aDa`BFwBa_rymzBPsj8}S8T~a%SBqxBL^ek`pjO{*mU?yVjyMTUpB`Zk7Ho{b z?�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≧x|DYy5pM;_SLp|*+ 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%0DA|Ag@rXDui_o? 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⋘rOvPT)3)LrR>@Kc<*lW%J^v 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%0AvWtmRf-VWNpoMs0=XkF?1OjVWcfhgu$XS zZB|AFVDZpOtyU6Cg;1dsztTKw3s@u!5S@nsSL7qr!{ z%AnINU=NV!-2x8<8uOsrhd|Yuj}Im-J#;4@Dl~-sLC#btSr|MyM|r$Fbc(o0g%HJz zG6GT@Ha_{MsizSBEL5sKOUru#s3KI~>DIYxEm6$>{E4QO0jstTc_E40JX~zR2xB|b zn;czxEQa>_U{jEYVKK`G_q-Mm(Y)?71ppT*s$ZqP2j3KScQ??R0n-HS5I|?1J*167 z(3QKd?Z=N3FutqdB-$C!9}mJXSPceU$FHc?Lu)*Lf-Wz>t-KV5{M^CyUdtLF`vCWB zV&W9y`sRwQcUamwK2Xwk*KtKtOd2{KgoJd%UU?6M&x+rHPB_F%V;uq(kX$|l`@wbZ zTf|eK4*?Mf8r@fqzj!WI0|&o(a}jPYY<{o}`4T}-WhjXU3Mtf6Nq*l`-$o!vdC=6V z6XMfvHVfn+!3~?8@ZrjBXr=}!#q#^l&s(bDdu~j>tf+8OR_=i?!|QOh0@fG0#Z!7Z zq{J!=xS_-ktXu^{$N`@#>ixn5~DJInq8go!ZHas*0rw9*xs(Y%KDij~i0EXK-SB!Pp z$iSe%(YL;|5E~3jFty-4=mG#n=yhNqt?&B&5u|W|bO)?_D=3%+RGm0qN(q-b?Hq12&99sJugO!*Y4x;0giJ z2cjLQ(0~~Ts;K-gC07F=R8rT{y18AfsbmiIZsGL^VlnU;z$4!+@5DS0wBJ-}Q0GiM z6RB51=moA6y187Py9-ooLp2m6Zc=xF{g=S+ln-_JV30ua587wl9%N`(n z1-=CuR~W46zrYj}2cRs>LeP1Ej0=DaOl6}0IV0hkz?Z^=lTQ}X6IFh94(*w9ayH;? zA`l-^U3k#gNKa1>$dQ5D5+R8E0`ML%vp~ZR`iTO7qmzi%4jbp5(L{m5WdW#yfIuu5 zG9Es|Q8;Jl#*hl$0~s0mI0G+%GNTj=;uh$33acc(?MNSV+ibA<@v*T9AU+KXYg51& zU>}$WP(cEO>1JOcQ0<}zj7hS4z5QOL#Z&MEo<8MF?p9P#uo-AcfczxH+A2`{2O%F^ zvG2X12r9_*Ui9=qd{^w_*#lDnaxEa504@|2=)c+B;RO2uzBNcQy1Kc+sxM`t7m;$> znv-`QRxBF>2t`;pc@;o{xc80VZ^uLFEI7?Dm*Kp1%7a0!4hkS3Y1P}=xeV?U8^u|K z$V*V7Bz$07N*wt%m;4A$9Qck96+`brzH8S~c;W+r;ev_>79`;}bMaA9ST~ZzD%Ouw!{{s0gG*{#r$0CoW zy`Uf9JQk+wu!3lSF}{tJAhyK2L5BsnGT<12gG|B?ZIr#w@9W@4*HZhW8tCD8 z&w(J!SgAQN;IpIP@&R?KW#{aOk+Ldl>3OUDQ*t@w@32b&o;S6!k`Ni0o|7}`sIv;{ z_<$h?zkUq~r2|-KrQ?2x?~u)Pd?cIBL1GW^mk2Kl3H4sVob1|oCXch zLZyWqz;c+B?9q%+mIIdzCBwqknf^VGdq5=#LuUo_eYV%v&HCiM$@fmlYk-UkNB{_X zCGgp0QhAOhg46gw81hfB;Z$tT-FpEu$*70kECaIGRdcYj!Tn>}tc!%e$pBmf z9;v}#D8W@of*!t_r;wR=tbc8vgC?vhY9|Yrv*VU#?oq^#QuPtAfi!yTtR@q6Ke+{Pq>Ca*@oT}0L@?4_kraL(9p{2 zY703e-vRUxxq4s5rUyjv!2m%x59q`asLQ?1`v!?#fWKXLR&F}L#9s$M0YbxVh(CHr zaYcG?C6r+=Lo9e&uwjtAf^dwqZTy-<+<3zVjp$$ zeSDe$d6l3zM+@n5fOEL~!pBk<-jWjd(>;QYYBymc05QhgtcA(HVdQNpkzl|jdfMDH z+vt2>Q`}+a=dT8Q(3Yk_y%0_hE$Yb%>5^9PI?#-QqHRf72(W`dz(QYyq+E$)=btpFEeq^t6TmD02U_GBu<%0f#l3k$KZ{?;Y?*k#WhIavJv8^ z;M(Q^9=+1h)g=T8wpSRy!A*#XftCXB2m^2xLV6(UaL|>#26+o;Ob1cRtXDhC5U?_k zs|05ZUA&Yw4_5}fG6=aOoF)K1x!Yb zvlR~57c&iz|0#kX6oM{MKoJ>L?K0J|7Ycv#OzDoW+EOu8y~DzkfnrBqy$h=rG79H$ zaXGoT0IGY^ZGiYjK12xMBN#S#7zG1V3hMy2&>Be2f@{grm~snxsCxp60y(x00vl7QG8@(ukm4clU0#>>GuI@Qzc_xw*5XJ}AGE84*)I!+n zB=|`9ybrWE=mQA0s1=B7zP@KaU%bMqnF9Ibf!MgX17Ilx@MweD=Gn8-Z=jEPIS7sv zwSupJ-fWG6pZur+PFC_yTqw8-O?a>la36&1M3&$ZCklB~{lo>&Hafwfv!%rZsMSWn zz$$}~CzR3k!$)i~F*DmbI7DsTfu7we#m@jo z2yaF!m@VM~AQPSlW{Pdt4i5PcQ#P7iOd7hX7z_karo z-QkCg;q&3Ym+V8vAJAAYJQxEzweDakLB!nIAqp$W^vwj3w%Y=DOKeK_c<` z@WR>}hf8`J=P=2hK-$FghcUxVTL%@)BknfTd+tix*og zT=P4?k#KQyLwbXa|zKb%xVy20g*&#y^~6xQ-~pA$D`~6Fd{@$&?d=#`qR0&$zDLo z01)Y#*;u%*|D_%k48S@FEyI8+tEwKGn)VR_XbkfNF=z9fmFC`@07xK2`1Wb< z9ay&i0v^OQu6KU<0{t@B>mFcyI|Ex0*T4Ye98l})=(boumYE%#X!X z&0w((yfSoKAzV=SA>X?E0&oogHdMiTU%C%XP^z3ajDT4I;VIN)zBGrbW@tB}qGT1C z3NY*D$~8n`YE>1vU9@O~asMRv)=(=8jR;9WzYHXBz=MJfn8EgoB#Z0oI5eSksq|VW zBtG4sBgdZ=51)dx4?xSekdL4)Wdu^SxU_)KKop*8Hv`bGpvOUEo!}qJ#ksRDz)u9v zlUE+nJ}Fhk{RVR)+}6N$MD_PTqzSB}@cexCk}S~PLvs;M(H+piIKvJG_zDO!Ww13v zMvi+F%pJI(X#ZuUk{RF)#)Gu#YW{Kb>?^uD137tcBef68gM+^U@F~E4AkO<$GJ`>aN{HWVIKAqj#|61W-x>h_%7 zB?s+L&wTrKbLmU)khgQhaM@3H>rYJ}aECk~;#&`RwY-9YK=Ad2MC5y4 z$k{>sQblXPvyC}!gi+D9y=Dl(Y>{$RuPbn6dT$&S<5xUCZi~66Hgj<5eQIVBxYCeHsRuU6EF)2d4dTFUj-dP`>(|3(RzfN zgzdSg2e{{OaeOKzs$Zl4v;@#J{1KKQsPFhQ6Yg90U?c zj?Ge+0C$ZvmT~)TfKbwh`a{LzhxH7&6*%3g*fW-_P zug6cqo2SGjCDB44@$n!Jq-(W)dNeQmFw1_Rw--8qT=RuIFodlvM>2pgLghD9GzM9t zpjg9mXXULKoqzK?rU!t!TY1INZfo5szwCPY5oRX9eqYS&>BdD{E&B_Q!bP*2sw0ph zi2BKW7LxKz1yCvfJ5R|47#jSZnb}+Fv*aY?MW1VrxY6>4y&WAWL8`=&~UI(d0lWtPucOrTK0d50Q15|ik<=^@z0M}nxSXu&b zPlZHHSNF^O)}o}CG|W5+Ww5GpX-P@cTc*K3Jks4jp9|iCM0Rs?0sakgPMUPb8a@B= z=nmZ8g|FNkRyaP^xMiDz-<|Gks~lEmN`KD0mu)~QYQ3P?oZ4NA8_2A~JfonHtpJi;t2s22P*8^X&!^00bUg_ z72pARG#~^#{&neCJ^TnW2pTtOLYis8e2wArX)ZW23-j}6K(FeM`nOf4SDb@mpflMg z2G7i)enL9K2hV)P3`ImlKw*2?|DhY?&IEv2!17@Rdd1L&>LK3W9Z4*L!e15ks^)H*%ng%?_}t`+j(!o}2^;4oGsG zJ%gb$OzvY@{JjmbD>o~NC`2xND_IDW%zSLMd}W(#2Xvq2Eut z;j;e02CG3(>yO0NW&*Dy_`_ErIS8QP4eQhSkgtr{lHbkW(MC-|QDOCcEv;d&^{^4a zB!QOPql{5ja5l_o5Yq!#Z!g5qv-oylpZKm5o)rbA8 zhyBo1&8?nJaJC>F1^XlvDMVRhUIcS`xnX__BBM`NVz5khAOi>L;D!f7JD+9(HA-RU z?#)0m(39baG&Q{tc?C_z zng*1yhzdg$F(Cht1|3%p!d31^_%zsU^+a|XFLQt3y@;_mwS=~tzgk%mBBduHb`wlfdg7h6Bn*8);}H* zJ5UzyMZ=tgBcM+(fe_7-Vt@=j6yU%WFo1aDMvePE7nGy?zQ*V&J_+(F5GR3G%YEO- zXc|ENe_}g?$Oah7qo1FN|2SmoG_b7doz|$)YgR-bZZc#8DgH&LnW{1aO;t@uvl-af z08Qwh+Y7#k!SCCv?E%>urq3U~r#uC$0mx#%M}VFaA{&4(Lcb5YJ9q9t4Ezx7`#}ZP z8;Rdn>Cd_Sxu<)=q0s>`i)HcSaEJe!LO&zojti2&uR;I(_l16(k`lkm{%-Mb-H{Z% z&vT3C_P;OmL!2NG7!Q9J`swLy!!Z$OO-1Elo)rZ|#iBCd?{iP3wd~-EtijJPhB+l4 z<$qNAtt86JQ4B}7t-a1YJdYRdD-e76luySlhDM_6YYs|lMC(;hpprO`OLpQ zOzHK-I(?%j)=3qDrKlZdOM}acJ-QGy5GpXeq7w2tnPLb)QRzCJHzDB%o)^T zgmU9Z4|CX0feVMuQWL*1o zGX2P?WEYF@vE}2cT?;9CF*m+kVv$AubNjJJ18y4XVz0usIw0Hc(PPo|wk`FsesQVTf$HRum zPLtDqntO{n(fxIp=jVqeoobjmo)(EdCt{B2gklTNx<^mbLp*$ZHrM0nI+jIkFz*C8ND$OVY z-o3fohNiQ^?%-Y9pnj~a%m!&bAPbS;EwVohFc7);cWD#@q=+O@a!N48f z$uJVbbsW4m8HA-<@e9Z>Tj$^t zRhV>U^@U44FB{jc7qi}(%b_kC6u79L!O_W8c#p=mqVW@-0oT^v*HQoE9zIDbPGc>b z6|A)^l#9IcHCmeI8HC*~zKt|w&QU_^7!`H;dFQCY+S{=V*ZnWBXC%up(2l=al8w~i z!p$+1Y?^cmbQVx>!q9y{b7_;U)1o+{AN}Rdp^9Wj`63nDZW;G$>>>Nw`%7_g)|P^74q_ru3tlVy;RG~2gLU2#V=*bZ$>3ZZkV%6QB zs%8>BoJzm=_wYviX0v_V?HI!AuO62O%}|BmD)qto@5%C2`4}d|DX*$lHp^&iVLj9M zg8%Z1R0+cRrxEK2Sssta9^IFG;`m+?!ku(y78pkr@D(;l?1c)&)6(4DQjkuTh2No9 z)2*ExHRZ3Zbd=IC15|!4R@0bsh>GCh5D<3K(nL&*{3uZ8iyOt18g!V)U%MgGG}EJ} z6|Pgr?vawHnE2MIRd0^*`-sS(Lxtawba>>049)k$p9+)K3u!iQHO-sLRO$|JuR`rk z)Pt8h+C)aeOZRIMjf$l0IcLElBFE0QB(**HafZgQsIj{eDm)CSXl=JEKf_}1Cmls_MThulFAcd+YRvwaihx&8FE?!bjt4rg%Kt{bjLOcquR zT#k(vqVK8jV8&_}zjUx(h0N;;cunKCbw+2tkj2C6!<2 z+V=NbW3R6`Kl8NIq13=JienhZ;$(&sTvP0Do^M*4B%PO-^fx>t%GQCWD_rNR&(z4A z6I*yDYHu-#DVagIlDIaiG0F6+U8{+-dH#!nfq8cLRM-(|&PyH8vz z)r^k%`uHZhx5Of5&Q@*77DXem<8z$i&5Tw5WUP|7uM(`Co2#;i;+k^K-i~$M^&ihY zb%=XEIe%sjJ!OvZ_Q_JC`4wBb*ta+tJyI%Wwi#^b)<3i0zLT)iAUk^99F3Z)-OB#h zw9fuh8kJ^3U7k*ew|`>FPj=l034c?<-zdkUZbu8Et4Gs@F(zc;Lf^WwqE-zisrbU~ z=6CVp$xMtZf24k19g4}(+SV_q7t#RF(S$E(FkjXV^u%|@623IALFRXP@wVmsop71Z zJ%QA?U^UG!p%PdgAKzm*7rlS{=n4aRxLWOwoW_LJ)8DU0aMF4hMBJ3L55cudau3{W zwpm;covyxpfw&iJeQ4+Vm& z9jS}T6U5UScWVwQ`C;^_Dgmn0jBK6wjGt;@3MWb!b#?z8CLMeg`| zFMp*_p#eeVOIL#>uO{3q72i8siOl=qdeWQLLiy-%ADN!E!>oFbS!sR!M3m00mlM69 zh>%{@26X|>Mbx9YYg)Vy`mTH(r??O|Smb44-OM)rNL7uBoZNQ9k99H`RTRP}BxKXg zy|B1wIA0NR+3K*2#)E%eS#j=YU`OgS4DCN`^XGiH2NlaB0<4UCJ^qZ)LKKCfkN9lH zz4TKEl$L^0&EpKoN|Ri-bVluT)~KSdgV;!#Y)(YZK|5B)oq=Ie{^dgR?$k>Din7EB z*EQpr@*72(5J-M0W)|0=IHV!YXURL7p&p*EGe1x5XY^Ebp68-D3wM6J9+iaQnA3*|$V)cf| zGn4FLtDXA0U%n^OrT%BP@?S3EzyIa@E4nnQ-p$Ykq)>16? zi_aTxh2KB3hiO3OXC4PoBpz=d#w8K(H8RZOY8lS#_a0VHW-rtfn*CybE6fpBolj}q zI6+uuCl>XfWiPm|>uZq=A|r&T`1p>qt}_MR;>=E$UB>RKx$Y!h?*Pd(ND?@61(;~H z7%2}runS=}MtTZRSL`uoEn1g+Lx2%T@X2e1tfwbU-kg_Ddt@c06_s9j+cs+RqyIE`-&c+run` z`f+n|{+pqpC+EII{V3r$KDKb!jQUl0RUMfN@=(F`mw7G5#Vt+)+Gd8XwVo=Gv>0k+ zKx3B=7VI&Pj8(7-6TPF0xvOD^-zHU%GK^^kN{YrE914-l0+Ap1Dvw zblgn*nperaE$H}^E1M~(R^PS93E^gslW_3cU+e`E$Pg2)VJnD;${%JE)rK0)pG-<4qfHEc>~|)M#&yM*b-Cnc z**n`m62%k(rpmM^}i=_}jk#}?ZI zTQ?@}^v~Yjd=+o*-(9T06w^6u70vCFl?vY=9Q8nyz0aYR?h-~&^VB!3`N<>d*m;BT z5+!fwR}7RGNz^4ZHSqQ3dR!Iguc1vD5r6%|?8)Ou(V<*Bt95?81k6ePGR@r+M!u{f zAg^}L2I%)rOsvf}q(w(nniR@A$IZMe0Y7zIUvz7e4WMfO*}+Aho`x z=JjdM#lY9P2rM#fq3(kup33vR@>29%9>>gsV^oA&PyJ-qwIa#&#WfE#HCo3y z^SJF6AD{7*1pnwp;RD;tduIIOZc#6fPPlC=DV4uwrZSy;F(rI~lDRL$&^M0tI`RbP zL~645P|k@|LKsJ^Qa33v@rLW?h6Zm!bHd$ToRNK4OB?ZbA`pSCraoTv+KJku-nzr+ zfW`Ld2S^P{_2IVSNu~9Sgi5YWf`=W7WFjG##d^*c(v5xklZ7gFX|G&sIUy?Qa%w5~ zKb8EBgwS<|R`g)?T7yGwo4^mrO zB~R(*y>MLk;W&GuI(spfEkm^hZ4w17d><|H6Yj_IPvS0_|GsUl3e(NJ(Yu9lDy&xm zEe;Y(RV@e#{tUNF;56CHpZT+j4~@-r44SXQ>ALL14#q^vr+3$v+}lkWjvD!WXe!#z z>I<~*?10j2j;p{!Vfe5se_If#0v#s!^hsBbo{rP`9!R^sxGnuo=~{=2zz5^GhX*43 z6P$P{$)RRXFx8u!jn_Gz6UJ}lyWuH!(WRfBhN{osM^NjF{vbPA&%*VjdAdwHG76Eo zzG}&{n;z1ePDZub#FN`0`G*3_ZdYnTMuhzp4;Ct1uKa3BMm=X+Q^?h@Jag2Lzl<%c zEPFG0l(s3GrU$F>Rf50pBIcb6ncXiJ#hlo^cgjOYpP%|8&xsSg)}^_K?a2}30s#WO z42-T-j$&`>vJ<{1_TluQw|U(9tCuK2@Y^PTKk3{=92**fJD)h5MAYwV@L!UAhk{>Pjz`p=3v8_ax;CR7~-C@d?B*fUW=38_T`;@QBQulPR`35==;0l z)ld&z_DNpYBF0mx$L@*9Uw$rZ*6aU0hX+TWa3!d_L}K%GXQzxV`=liLs_nl&vo{sh z+Ze{O)pq}aa@E?sF*!Ai$NbR9cXp?3jAMX?G>$5E=ydHABY$ZzbLyLe*2H1|=gvw$ zrg06DmT?SmcXWI}H}qx~xqD|UXkfp0r@8xs!e;0(GwKn;Q&OQz)L!>`hP~f+={Jyw z9VoagS=n00zT+1S!$b!l+N^Qab=I;`1ox}XO=3|>C(nk4Y_P5Smy7_n2c>85cuQ(T zcJfjxzV=`V-9W~ZC)aAb_a3j~uui=@j4{zWSn+rNqEh`bL45Sg^{HnUGd;jN2k#?* z+2C~JiCW6!q!dmf#gWJZf2qd1?)_K(+BXt}ot?$M@FU*DduD7UV`vTPux?&GfAvoTdZcr7qFfcZr7mGs=1e(yV; z&Fh}hBGD#QI|S3(2l~R31GjDUpRau%VY2YPBicAr5A$|^o?e=6dn&4aHW#BUlpErs`8#iNCTi`&-bdfAFFOvvsgMd!KRNN7Y=M>c=?!Y? ztD}4QR*0x-17LGe75BU(9($>D)_%xBKh7je2k+{_DZfZU*b|^XC|oQKd_c3O-Ep&xG7z z``SO8@G^YlypUSy_DGb%qjISmM?^UixMq8I_)^o|#5E2+8;8HFvK|Frv5CV`Uq2aU zoX1k$t*x$)MJX;zr%XXyyu6Z;V|1=nQY3CR55j@xbhbVzTb!nkV%fLN);+&t>SGJ| zY==6?*LAvOrm^gC)vxA${rr$5V~_8cOt*UW+4T+Qnyf4-H8p2fm1gd*R=mrmo=8Hf z#R%70dz{=PY;#1C_UJS>fBdTb9DE39o!_R zYp@b@026Rx;=l;7qMrDQe9b*^d@-vu^O25@^Lg}H)JQb0=I`gXQWg!6JOn{hUUsP2 z54Ber!DQ;-NQp~8H0(7S0U_Pze&HfyW%hDaruplYHoA#)_@qj9WJE!y8TUP4jSCAa z3hu-Zgh<9vy1XPD(C@Z7xf@m!E0bU+#CW~u$IkeCEnL;_ah58R<1cx79*xDo=2_;B zElhYbXu5;wIUI$XJ5nJFps!8*NzOn4dBKe4v^<|QH17O?4oqi60qV2H!R&2YWNt}y zExs@}qmWg_t|1^nJL4bgk zw>!%;Ah&=QpV)gky$SU+SPT&VrC;T|+uPDR)dRt^hHJgq$%;82W0!Q#liILnVU>nt zE3w4exQjT+;%=kuE?E2@;AFN1m;D7Tk55PVkz{QitZz*1G0Df-a1&Bg3@)5ML$P?} zY`KAG;|r?7UXrecclR&oXx@GKT&3_@A=ZU6j_Fr&)t}>Qj&m^LOWWV+r7YwPS~)7B zV%*4|z*&79K2%m;1Qjx?UZ>m1rzZs&92odJTm_PGnTBK?kIw|gc;30dGCK48*#+*R zqgOZB1AM$rX4ZzDVZ?u(lO>x=Bqn3}{voi_i<1n`A6g*ZjsLoHcuccAcsicJ(J^!4 z7Dg}g)|3^m8K?+@4sWM#UAT&eoxgnV4P7(Nx6_B0Co39ukGEaf=wr`&Ab?i;W@e%4 z$I(l7?>xe9P}6xQK6tqbH5#O9K-LN(-wIjn#3Qvx+;l?DQ2NiHw6Wow&^@1e#`7De zNMC8+qOWB0xZLySD2&HVoDj5a?I)OL9ch2N!v3p&<@7R;$Gc6+8MD58qdE16#we`pCbo02r#Zq2ve!S*!8%D?Y&R>?FIA3$A zrG0(DEf4Ak`|&e(xeNLns1Cy&tH+m@Sv>rpz#Bv^SZqGl)KG@B8Io=CATrH8q54sP z8mT{EZxRy|6K$du?QkzK*7L>F$0fs1ZS=vX6V5QCZ339QE-q8DEe_+*h`QGb*MzLq zSpZtnT`UgqMDo12SJ5O)Mc@zBk`{4~M|oE{V^*%ebv0~zW;T7&%=xqAR5Go{sK{U> z;UZ53rFme}Gs=$OrIMLp%^s+=JBTyCFBhr4wap?pAT2Q;{Y1^&+9Q`W_CVZtV!l9J z`RAcfv9)Ac*m4!9s=YVO^0M}`9yO8h!+vFgBZ2RK-~J=MR4RTE>xGizZ$CVkLVZhL zfZjW6r;!Dzy&eZKvb(H7gl5 zZV7T+)?>YrH2*BJ%skHcW(3a1r7Hc8w1vx6seXfU1}?1~^mxr*AKN)O#cy0^M5z@_n#%BPQeyNQ1jN^{qPEKS_@^w;r`+8AK^|GwK>~-E^niO~8#}e>irwB`(xFSn=m}lEr!B2^raTVgB67b{&d;G zUp{j9*t3*ed1b|Oy@K(c-K66-qJY4<2jVB$8&3}{H~-Cz z=Q5O2cNOY}X6|Nw;Z^7IZ+)`htKJ(31ojxZ(r+PhHK^{) zR(-GcG3P)f^~!^o9xLPYbQ3LT(eggD2Q{&}YF*dHNR?<}(9%R66&QurS5n+BooAMv zSz1`<(|plID0y&s+nDR-D`Oz?6GwW9VivERKAP|P!i;hSF7@f(T%t+-g&kZ zpQ&}r@|BjeT%M52ZS75+Fk(5KxXjgEx2snc!>b5icq?MeZ@tCyrN4i3>&v`d?u$JX zBl^3`B@e3dBbEbhMo2B&E8#Jl@AJL!!TQCe<@}NjvcnGV;sa2Tmi5t{-?E0NhhBs; z1u@-6o~MefiFT-Tn| z-7v6o2{hu3pQX^Fy?Xxw)#pSGY@bGBuI%#qN_;k7dLFSjG68JD-70Zaj3J3;&h|vj zUhY}DsT(rI<2G9U$4_S@2`nFH?-ZZYCu)_;0aqt+Een=OYnimEON+>ww z`kO~}8G*PYRN{O`B54)<7B}v@6)fMoqE|DzdR8IdB}r<+)8Fu;e!)x1yleM^m4eD2 z(@+mOY&FwO?7saTBANd(Q7=~04bKF&G*Ym8*<|NK zC@e7OH3e*#cR%=WUqCHpfc%-&6|q)Zqusr_`q9;oclK!)Yb7}=9!!afmRsLmscXg8 z{uKK5o-zrriI1k;m9NEL8kG-sdy;JPRL_Z9KeM=fa(eqf=uAwzx{vkaL~sS zbNF!n4s@&>uFvs#+0MVE@!@lQ!RzdSZtfL$x*{s-0Uc% zdzSigbfvXTK1UsAPhX5H{Ztnb-$atL)nM=CcBjIZq_?}zA_6J8TGC%8!K=;v_U0jT z?5}s`9B)XSk?GyoOG_HQf;JcTk9q( zZe8z9_aI5rAs^^RGOR*Ms@h3m!RDr3sgfxhk-Q?fKhfgqB_zB$KE^9ZAyCV`Pj!F5 zq?rSQ=!JM*9sP1kyPyBfN0Dz{1xae$9oskEJPoL=#5{-;%GgHIh7}i`ttg8aznOlW zkD1Jkt#nJ|7rx=!vxlt+mM8jK19I(VY#APi5ROM zv{WzUNYq`L0~vqq=LRVjiB(5_z7-hHRatyz3yVa})aMK4Y{+FdI~ya*GepxCi2ug|oEk6S0Lc0d9rhM6AQyX3vJ zA^8&8TX(DMd>`e|M80=;A0pP@>vfcBV?!~71ZP@J+XK;n_|J~z&rguGi~e18aeVm#b;Z{6k-;}!q+gggvjvtpF}Cgd%n zsGz=?Rt3GkqE+>$q7qs!`5De7#Cu5nx$Pgcif5Pj0U?Mj6}ygDgy!azJl7~en)wLd@@3qyuV)tqoxDnKdX)V(YH+!1dQ3aidcq~F z?fv=|XH6Xel6_q0L^qg9)pqavVYx}19Ueh_t<$4Js*CpT+AICX zpU)H&OWp7p-xFOdzT{cG*2*W?^NS}TMNGW?!QN^e#XL&9dhqFs^A~AZrYa6?68eZ& z|I@MlfBJB;X^dN)<-kCQTkVsI%T-S>{JrQ{rrOw@#8FYpp;7CPV)(CjY2@EmZwk@- z6|lfE2!q$C>GY`6M-s+x++S{+n&NWh@OV7YHhW$t&%ZdYm80^k*17s#J)8KHqm4bv z`QJ+$e}RSA_{Px#r^?_LTpZW4e4fa2n@Y{sixceC^d%i+gSe&sd^`h4`=il$IKqB9| zVPvhPB;-Fm2~DUg#(^{AU1N!1pZRHTeJseXrpdwHSwZe$@&cwzxrfPTjTZ+552~BA z|6?4yD=eLL{4OhX#rnF@e}|BF(6PCuutOEOFI&XR{_5`$7(8a<>YMrQBem%Mby(zK zo$V?OE4;Vv{NN{(zn8&sOe6oa^Vb&K$mwGDoE{AZn1^L6EX!kO($-Q~vkO`Oby#Fy zU2$vei>?8U=vI^ce=g(bhk~(u%jNn4)>oa=e=m1#L9WB@XSkU2)fqM7ISN!Dm`^|J-wn-6#j2%_EOlRoz~Va!K{30t=*;Fw@$* z0=en%x?&!<@!JO-S43SnJWLdHul&6jK^`XYVWevr1*Pl(QGcK0^)Lz18+~`s5%}?6 zwqokE*SxJfF>EAr9I* zj5FbNwp4JHEDt&yC$iHEhBR^*0W-hf!({8)GCxzrdw3nT5KmY^@R}AC zyyoCBd$p?kgeAQoHyAzGI$NJ>X$1)ZvIiXwFtvI#sNablbX5KMH5GpS@L!)zEG<|$ zRYOJb!;*9wsOzPfos}*9`X5W4<)DM@jFJ4{Two_pPrb62-rt3)j*6my%+HS-9PEQT z?WiazFh^^jJWTX;^M&7vAYJalDRqr&z>=EJW$~Epf&0$yf#jo!DPvcJQ4zq{VH##l z7tcAkgE0XU=EUeRTR&6$i!^D0h0q^P<`@;FtgBAo`p?T69wzo2?NwXp1p-&#BJ6(G zIO$U!2!=EL{pmX%vwPpF^P)Wq$(NM7g<95U??(&9pM}aG3a|Wg+3EY*r0P3Sa#v0pGY8w zx19NPg#P*B%N{0!Gpknn?RVdxuSrPVCedZCH;>eQ-{KG@m<@Wrep6N|@4-**}iaL5I4#-L& z_CtaPPhOgc${@8!VNJpnaCqjDSywFZ&pA}cBVidF5_BY-_s^bc9jhR{`S)tYZ%1W3 zb3xT{1-BO;a{g-%U_0z6MvpRvCHHb9D#{@&YJK!$0jh2G*HJacZJEZh>9?N4IrY#G?I)^I%E!)|3ldC<`clYF&bW3J6)LiDPJ=GF?m zhlwm)ImZ>2nUuG}^un-x@ctd|6Xe^TN9wQRB}Msk?8ZC(wM+lwTNch#7plXq26l~C-8v4_}$l@Hu%X72-ZqVBU8jp8l<6q9%irY9zmi;yE z4x<{9%4I|k+4AE<<{pdxRHw4}JLgz_%+g=8Iki51zc%YJHb*tHSfNRX@yE~)&Ativ zvtg{*N{J&Y!4wKRR??*w=z`G$->+IfvDz%Stl_O};63*#Bp|VvEPK zv$o#bqh4Wc*@g3MQ=5fu_-zG+hauC^@KT6d%+BgOzB<3;OEnad{<3<}Z}wSO0TJ$URR+`S0V&|GlsNUkX|O z4}L|?+o+h%jOj7*MRe$!3UT4O<_DA6ZPz>=7Q_O6+vNXrWc_PqYD$zEq&{*_-CbP| z4%g}-DMBA|Fqpb{TdK5>B#oyq4ZyvlH4s??Ij~linq(etN@J6A!_`0Py*Lj0K`-!U zGP?N<)L;V%lsN^TH=emH^i7!>Uu%)hErveLUT`A`T&-*kU|qrODg^XQ|~WkzxJd+k4N9M1r_$#}X}aHlxpiLTn^ zUeyN!YkDn;4+D*z`YJ*nS@Q|qMJfe>ER!C&omMGGmi*G|%npsJ1nmanwQ$1eCMl&i z9fWaF5BGoEIFem<{kbPno<>Q;?GdBb&SAAL|NpRe-%(9`?c(SWPy_@N1f)xsj`SJ? z6r?LiZ_-gZh;)!H(!10kRXQZnoAf44dhb1S2qh%k@IB{u*E#FG_pWo>``7RnYiDN9 z&YnG)Jv*N~&(rz!IUd&pdJY!_4beH!SNzeQeR6JC1os`K!9MD>b?0Br$DYNFZ=%s^ zgoK_yJfr<=Ji4A>|w; zu7lz<+fP3f7G5t58gSLqnwvJQ(PTbvfj^CgM5q`15t7U@ntG;4rb76|oUjRrCm{gg zOQt2=p!>PA|6@{fJ&=QL(LtD_yk{!E39*;IAe#=O5kek2Mur$%=qh_)&4>>mS3=zvrYc$BbcFd_{ zR$^lQz`Ol1mUZ24+ruu5-=i*pi9dlFY=Cvd55csMUSqE3v(R!nO{03{7lXUDu0Aeg z%vy_MZo$2$yOBGowyLEBPa4tOfb5pWO+wB;K6@}E84P2u*UlZ?r3LBA4wjh9CpNuh zd|^~lvh}n{&-h*U3pbptLm&QcW4k^6uNnJZdlda zx;pbL(zkM+6+IrRah=nv5Yj63tE7G|ULIP133@?nIC1C|_5_jP_8~HyrIfQV&mXi5 zwRrga#v+Zc!5#>BsazU$*yI)WCYl+v8}Z(3ngDZUH=((0X`OuwK|P! z($ZOfJy-R%_P)_0-R-9>y>zs+YqI6w$vylS;qmgN?PR^&2h;I+R%}zaE|z(Vx=u6; zWPapD?jv|cKaWzU_4*WJJVNS%+rvdT&Xg^#qmCm=@a)b{%@}!NU+VjDi@W3qNSZi< zdlcy|X;2pzKaIEIo0xwQ&-6UF0X-bG3R%1V+yMJ)G|4FIsMXrr=vXM}1UJ{F{7a0<&I)I+2{IJ~iG{@96Ou@IAfLcn+t=;VG1^+GAQLODz?_rs^ zJH{UfdHh2<9@kvK!h;!g`b?)~ghH#wQT#NCyi1s1m?SxFX_+GlKTY3M)r$15gpsQ# zm4!Phuc{R(zmKE4&EoZyCCB??yQ^FiSK4)XZ_8o~()|0?Dj6~=Rssy7z>g=W;nz4e zI^L(G_}kA3BXSXZ=As2T*mf(DhbCUc#GM`}m{Tf{HJ!)#(&@K+_$gf2Z=mBcqQ%|w z6?N2r{bt5Xk@Mq5v-^<@%jiK+bd>qofw_6CMe1^rJcL~ahg>o7rubEtU(E@eB~!n? zt{vYMl~a`feH*g5#(X<|m9`>-lL}JA6;r(zT+)Vc zM%VcZ!5PI?$bg8gj7666n`>X_wR3M@osHm!!s8EY4a!pIMd^{*-ID3$C0|QA1okxK z+`v?s3F-E_&Q&hViAO0jbEHM7ZZVRndqcvl`>ZSL)Qd6VyW@{N78#W*2n6>C0) z%PMEfN0{)}8+mCh(^LTi2m&1lSW#^#xR?OK@!1vHFUVw&OCBG1M8`@^M;qe!$E)u2 z@+3Nqwv%eTGkp27>{UzuoeMk4rcQSG#qrq0@A+F$8OV!tElgf*McES^XZH^kZbkb)-e)3SOAj2<0{jt^(AJpi5TVMQEEkgHu&hgE4r z6rP+|-_y5yRz&4oOHh#K7CSPs?^+wzySRtGAJf@gpu;>nF8ULU?TGw^2=7{$+a*WF zP1HZoHi=AP@Z+$(Zq*mkR<3XPoflq0ovokJDTU6kB8_vMdMzt(sT?76ZT&kwN5p#i ze*H{mDyy=o?MULG1EFz;UV65?+BR8L!oF&RSEFz5 z6Ad*XeuNY2_kHRbKX_ZoHpy0?nz9;K(La4L5BV@1ug$)u=^5Q~QI&F#_P3LQK)1QV zejJ^}Qlk6-g^v7NCp-AI@JOHYkGHN!2kku8r{xN_^?-=#wl+nhn^yg2A57R-CS81= z?@p>WiX1n4=6vCO(~x@oho>YoljbSMnGk_V$y?nK=hxgE+CrHNYQ_`ID1MYTr!u<5 zU8A$3z6})ilagm1P533socekoY`(~aK|PijKXhz#!Ay~_R>d`GG%7di{p6BV#jIqf z;1AQ=>7la(_7;-XaiF;%1S4mQgJMB)bYY|SSm2-1%H`_Ko#XL#nI7GJyL`JBQox%n?rGOgn)q6Gtmej8h7$xU*oFIO-ZLpY-XtHzEP zu3KX!;?GcN=pg!C$eZVc@bf^j+Yj=t*_c^QPjYL9a9f7kPQ-+9<->@lzj4y#77 z5VrBhj}q1JSIj&JQQKL=%y*f%J2Lxd$EPKaSC`sQ;KWBB8aGr-=*v52@ARb0P{*id z#`8f9RlxSw`|&4}RCYm{Mf}gL>?sLitqB>SzS45~tqpO8bd7a!WJ#tblAGn<5^dPl zAY~*piLWu=;#iD+V39g;+5O=X+S}*oKqcu);}^AgFG9GWM9|zN%F&LUmW*Z8nu)H7 zCyLXsmEu{3=Ebw<{U^UFy4L2;s90y5hG?#LsAUR|B)d+8=R9}Gb4MCNDdld`IX{?y z@OMR9zVD!qSArV7{^L-GRp$1kWK5Ipv%}tki;xj2VRjg*b*Wv@kscbnTKG&aC@sl0&{42)|ETH|j&HK2fSu{T1rtpG)@duWmqCQqcuak~rBY6)!5#XX!Od-+rRre;K@n%E^lg(G##*=t;f% z;dDPfNhviwx-Ro1ys$Y*M!^PjLbD^uaW*R>_ACpOV@w~nsO|Yz1;h=ZXDv5dQ>(k9 zat$GhT*x-yQ6wDNdvR29s&qG=$5_YAIhRE|ns&Fhf3x{}b`4Ha(#z}Lm`1)i-EwW2SmHHAyZphwc}A7T&t;oWv+ zQoiWv>Ar}7L^+MYMM2W9>!H*29Ol2tTQx6NU4$VKIgnA&-GH71Pi}*9?T~Ue&Xxmf zigit~;z?l>0S-}6T!y*HJYkJZ&R@nY{LR$IDSkQva^bnQz6V2Fcw;Qj zN?vez*+-V@#-JZ1>f*G04>uI`biM_jrRypuR^_fmnkym+7&@{Ng7 zZU`R@(!(9))wE%JB1d6M^>JfKJvwS+Jz{#g#GuP z+Zyq1=r=LMs9~cwKoh%7eL73;*$YC+mei&2l>9l2D0}fEC#HYqzC{5^x$*z;J3vnr z792mw-gP_sJXqX0#W~W#D1JB2MQ5o{HjR> z#(_M~#F-O2x&w2FcIWEHr#I4n{grgwFD18ZzW!rR5myIyH+uIEzD=JnJge-2=R-sQ-Py8^dqj~oGb{vqV!+C zONCpnE|ZE=3{-xjz4xVqEjCed#{GR;dd(=}X;AEHeJ4hYbx;Xxq^q4{qcLNFL*oFi zS>bK4=MxM_u?fvveBCeu;$-B5wsB}#i0ex(b7tx%_`_r46;VIGmPkbO(jT!DD9bPP zQ#h*y-{C|*l|3OM-KI?B^=s^^6HQ~(*s-&==o5BW=n3EizcPGs*X3Qv0+iK?sqL&? zY(=N1&+I!DF;9lGGd9Sjr|Hmdz3Mn(0ja!sK=V%(>7r^;%7rAm1U1ZoZGQ(c7!01= z)lm4hogs@a$G}ND@!X+5hunPK#GDXIR20*AFve^7W{2MdweS{~gYcKAuyyuAw$4p? zqqm3h_w~2Dt9K`<7JGTZu4C^{KG+ozeO~`ci&hrJ8x-yHDx(Irh(;@e;3^B6zzcW~}$8kvo}$95W}SSum+p3`bD9(|%PyEdt1p&K-JHP|QD2#nXm z{La@RUg}8vM+LE>-qOj5D*wOy#nr*=IZ+ZT1%5+^3nOrNi{o-m0 z!r6V}BM;TYqiz|kmG`FtZCeVsIcLenU+$W(8*VxEH1%8DA4uNZq%)30XEo^G9Fjty z7llT0Qnvxy+qdeUp&nBq|^t+qlesR~&Q5-ue?miYy2}2h)`&!9bOXRnE3HX-oCq zhJhv6&5*O$`TN~MV+OVJHnV$il3l&UBqncn!Z;-bv2h@(ni-<5*^eV!cI?DMeY$it zSmlnuF4X*k`C{{&3XzD}K@VbkZ`F5vdk%qn@bNDn7RQMsG=8!Rkao@8t0rZ~OU4rn z4w*F&d#c|a`k*d(b(a^G7qMDNkW0!!nnYUtILelvH}D#}BID=WaFT{ zf;jUe>2oe4rDb0DUXbsr?;k{kN`4RHrFz2gkO;f{{a4-xa;>Jr^yabei2{jC?@G(G z$6?!hJl}D3)0{*cLz$8JewyQFAVcKNcneOb12ti}l;7pjAtJOT=SGU! zHym{?UQUBLSX^-58zS;^zMw?T+7Qvs-JIAE`JNxno(|pAw^$ArAKWDPUb|jx-VC3k z6VCe~mJV^yFVPxCe!M{1oZnnSaTXhShJ=m065+)T&8Vd_1o2Jh0djeHaSOd>*XpqE zcUII`eky<3vN-4GCn6!@eS&K6yBwM%^1GgIU+zCZ`Ekp~7b;O8@{KHDX`YFd4m+A% z&4t?kvw|uz#1W_FAtXV)1+)LlCim-5uSs`^`$USk%(ozNuaR(aO<~w(xvoINGTE`hzpBl^n!A@^7aPMQwoDpfX(vcnpC$Rdmdr%=-cF96d~glzK~#F8 zEsJ<-dB=J;R4GrwqafgTt^YTB#Y88EwFaE^Ku3#iMZgN0)`+3(2rmzX$g`v8s9xz! zahka6wef`uU>;m6n~ zQar!Ri|+kyh?yrmmemsEb~_TA2|)Hbu<&$oFrLN7c}l)i|6?yS{pXzBt)uBFYSbBh z1iY!qqKL;&zbOom5f5=EI-`{Ax!>o%zFd{!y50XPaxD1>%om4bH*ST%V$z7U@sA0( zTUGLWYv($5e-gq2#X;};*4mJJws-+)?Bz*IRJz>I8eA0Hpj%z|j8Q=ML1qltIvvBPi@ajo z&80a*$rT&h4eY$%5Pgy?rCj|>_{=>9P%(&N*<9rSs9#1CiypC|=7}TrYujm{YDxv$U+ryZfL1#3>CYA8)JkuMxCKiBR8OYH9Q9uNUu(`^rJa z`QV(@#;7rU$Lyv85B2(at<*BhcSVvC;Wf%!-Z^lI-;qpFAhMT3qq=XBVs~Xa?hopv zV@ioohwi3QwinWwoaYDEu|UelnE!hN)>Y&>w08{Le0|*C-kPF}3_BEts~Gl837@f> zEshmO_-K^#!Bv`W3yP|y{4Nfc(Md|s2`8Xl=s1=cVDM=24n;<0COXLERYX~N`L@)y z(pkjgSIp=n9fkto=v*IfgEgw85Q+(GKC+8EspZ8}3>XL=qsAvh!MKVl=VGEopWWQ# z1%Di4zhOwgXZ}vvnj;mvuFWf`^v<@(|3}a%kCM4GoMDB}EbUa=^ZwY$`~*X@7S3CR z6&nnAU}~E3J)T#bp4I4Fe>xxTWrH;uQieJwg=?<+!?x~!Qz@65=Tt9M<%Br@Anlr& zV`z;;M=qPhfZ_C3q_S4*7h-mhs!9D3;Erd2axUBBz9g`JQw@dkmv&g`XXvo=e4*r& zacFS58f)%C@1$WSplW&iDD`pE;7UWT`Wrl_`Qh_`h5|4)H^tAm0u}Ak1>@}Z{^O3M z^+t(0L2-D0qs#A15z*4KGk%v6G-)O3_6eR632-yUh?-n#&s+#EOZjy#u^?_j$~vnb zU#@h}ykER_O1A0^^39D41g@AKZlky2lr(^NG~}f-vQJ zg7}5Wzayju{%!_aSjw2MbGtv}Q@f<>Y9_u4Kz!@}(kT)s7eu;4(bzJUCg6_JMQyCv zNNQ9oNd1Z{bC^5eI+9$O{o_^SH1uKuTiYUbsg#U0ypk@+vv&D@QRln6*j$hMmyS5R zs%KXE@^4C*4i%~%C#c9t!*&>+c3;GQsMWpQsY%8HpZoWee0CoD-45};_C>C;sYN2c zAaC9qW<9}{UShWQe)MgXoG7gSy(SrMT;xdG6c4>Xd2RF2;ytMdI#|L=WhQ}mlR1NN zCiyvDUst4Whp)hQnTKN{$7!e{PU1yX$2(mhVlL8WzC#doLf`O~$d#pCVyrZ1s_jQJ zr<|7Ohzkd-a7O~ev{wNFfs;?Vd<}lZ5yvub53=MKxGODZi<_PO#u`dUEKm9!t7d#)2U;By? z{z2LP`lK}$uqJ<9TRETgx@40j>Sa0gURZH}Uj2^;r#DCO{ta|@UK+IIF&%568{&mq z&%=v=j{I%3+;ksi?Au$w9%K_1dHDGKfNoVK5k<}5%6D{r7X0kENjW>RUbSxjX>erH zMq-Mb5?PX~ZNO8qbFM<8(b|=V9cx|!yfg~|I6S0Di|TE@|G72MLN4cxxwHE0`#*8} z-q%ST8sXxuvk-7S-yy^AOsm5(t2)V6{LIe(wSD(M@HPCWzzeeOwHMuNv}(F8daOn% z(i{(}mz>N3g^}n05Qu>C0S4*R)y*)d<@49~&Kb-!Y`Fe@jeKzRy^<(joz@^LBe1Al za?9QRS%A7Nn>~pp`i+`*AJ7vb&{-#(e4YtGjxeTeExJ`AR$dD}m8f7~MJ6;%@?30QT*B2mMjlT z7PpALW$ZdFg`+5IG7X5B_$|Kvd2UM?N9p!x)^xa<#ql9%ZBCx>+CQ?3L7J;Sp=5MiQaUd`Y9o7Mc?cJ@dK7(j;h~+ zZGDHkxgj!^v^h_3OuGRFjTJ*S+NuOSC@Wo?Dh2b4AQa zhFq!?-P^Vw{X2__!%%G>8zZ|1 z^X}vB)HxCVk70_%7tRdvBWW!5;f2}H+&bs|F-sj{`-5`#n#;C6hpKRp4Or-KHOk28 zF-U~|<=%_FjL@>jWv~3Y*KYfNGUrjLq{BW^$@jTG1;(L3@~5PdR7gcvI?Uw#*ZTzf zBSgE$Z?8DXMKePKgY=}YOCBL+CdFpvSAv|L zq(CT8Ak6lLng^%U`lje?{NS!#zUo~l9R#$TA0E#K@16nsWK@C^Dy1f};b$BxJlx#B zN0N`+1KnwwD#0<8Qb}b#xNwtG-j?l$+HW%S zC~jfsq+|hOHHSrOni@}sKn-x=%Yy&BOgu|IXQ1=+IOCbq&gnN{oc}DHI{##UV~~Q* zfAZBWQIa?k85Du6)PXY}(9Q|dkkivq_o{Q7Nzt46an3c*Ax}@Tg+o_1X8j}n+3p2` zU2CRd7L`q<;?RM5xHJC-%KRtoNV~s*tJiS>B&>j^TA1W zB7Ihn(=9hK@1<@=sGOpdDx|3MU-Lx7iCBc88zW|dUauVjT^-teoIVj{htSbwHzcCV zKM#SHugedR1m9PQ_fUPbswI(AbmysGA-yDBifcGXbsy+7@y0YO8H?1K(8KT0foJEk zxJE5EWP-!8+-u;3cZ7K_j3kON`Y#dYZq8mpqSNL1Pd2BgbuY_A^yFJMrop7kz3Ut( ziOZv!ujevg~Emij*gXD~x@{*I`^#U_O^VeWD`gz;5n0T(*jUX6r`}z0FKCz4L2| zbzcY@oa&W07-|I;Qy-Gcw!G41N{rKxQ&J=QndsB)fV|6J%m3FD{L|#E9I95anaMK* zFU{-f4c;0jay9h7rCc={?C1R?$>3!*!MADRX&a>{s&)V_5Nn}WyNnQn3=x|4aNIF4MlI!VM0^+=Vr z@24|#KJ3yNhpM&F_;qUMk|8+DbLK{QoDK_rs5QBM+Vc{tx^Xj7T3W$H5E)ffcz<32ifu5Fygb;!v#nlYX?*N`_>=YWHS=@u#1!k#SUomB`lN~> z=U3(@r*)%2nJAdb(H`~WykD4LcwX+dL!^)AV5=S*H8z_Gc$@)0$zsGSczrJ+`bl}? z`4iA)!9Sbe;9TKv!oNv5PwFhwBx=476f&U$x4J&2sMm!{`@Mk+ePV#? zn)tN7Cb7xvFdIkG-o9Sz`}neE077&Xh~A&1a!4Xk|9benoC|S3{Okh_kkAX*UMJz(tXe;rmk4m z5v~h8vv}?{;dr!qmvC)nxVgk<4o|~A(x*ba!*Cz~I)t~|U!OG>Rd$uMOf{2SMI+3y z4xjGELLS*qQyAW?c&(W-(s`F?N-$OumsN zL;uNqkw|qrs5rghJ-BM@&KNN)+%VQIP(t1ee3WyR=cT;rbO){!V_sSA?is9&M2bp_ zp0|N)9PnT6z>+(RJT3j|mP?x|q8;Y36f=-YgW|(Z ziqC{Wb@Mb%TG(`Oga`a6k%_s1&Z{!Nzjp#>?Vnb?(c`~5fvpZU_x<9VnE9R&X;;}d zy=YMV;(eA>OU(0j5GY5-h5*-w{yKANvuj@`>>$=Bkpf8pKho6uhTnxS2Mbno&PQ8D z!vZ5;HFu|((0y_@*B{95z&qmD5dRtGLwThS6=CBY20IaHz*Y&P_ZulE;@)?9;|Nwt zsae^KYhYp_Q)Uz^qlx$v)8lEwt4eR|CpcH|$D`->-o`y5-Wp2R;qL`Ca~k^G!L_NY z-|u?YO$J|m{Mfk#7FgatHX#`gTXp)JSmCSlPNbrUcBR~pZo|yji+JPiy(D}0~MZU1$> zoUGyLU*3lOp?|X?d4+{Ou2tAN#He;Qhss)Sx_QjTLR3OBLogISg0w?p788D?+fi?V z)N%hMU&+KVn@qL5y&ds3$=vG{2NuYonKVVt{tz9HU}R5sy19g&>!?zlrh>>bs&%Xy z{U}uXm)HdPqV_y*>O^O>dCrL2O=Pkd3vLm56gAzQHpAR@RXG8EU7zox8?G63J-^OR zu@~io(<0lgG1~Ja@{ZXyqOz@*R zGmfA$jW#RMVI>*Z1Y zR{Fb+ghN**$cUeU-EMMpje^5BZ-4Pz#s|ngA8&P&gb;l$`;Ci83p(RB6_sko|FZuH zj{ByPr|Hw(0i+Yfp&|O3vI%$yuff~heDxG6#QQSyiwuJJ4D-PE&E*p}-;_~UwEW&XYVwF)m!(|7kO_;%uaaImkerWYkjqQA~PnP91o2WwmHB2S38d3e-X z;>x?w>D!jm(5c;YW;FD~2S98aO7h1hw(HUqD8-I?tv{nm2inU*1zE%5fgf;d7 z>~sI|H0xS#p%u;7+88lQIw4jt$ck|f^Vb{KlE?xU0h^Ijj)c5njmU~mY}P2 zla}KO-@2Y0FH|o{(VgS)tq)n})XB)%S^a=DbmA}=%$CHM_H8!|YejP#RN$&+ z%u@8w`H#N+`0rxxNO%L>3_?YI0#KGi2%PZU@Fp1)| zx;kX@OFt;({ZxNZ%(qvX1c*R%rcRwF24geO8i_8p1>#|imSMQ|DU%ZzBOTqrvwgAW zMG;78bTZC&!I;Ghb92^-(#*}bb0qVn_#E|x;myvO5;AkY9|LXV>WQ!h1o;;XzfOx0 zJu`jG&CuW4y`EYZCZ6{ZcK!!D7K=wmbc6C^abyS)e^4I$`1) zPP3o#OegeUtE^BWI<0H@dI60hZHVVX1cDglo z6R@CbUEIlZB=SOz-3*May3a}dPig4pC97Ho1zX>3Js^1N^My9)GGg?HqMqQXGtNKl z=tkcycs_Y`psVH@rIJYsua7|2vV;Cq^hXib$o~P^{Lqr@PNYP)`CaerwoYE=uomx2 z3PRLJ8%;C0%umfz)ruTm8z`tT0(81*un(Sf@wF4wAFboqKS zRzZmFU3Kohz6*nHJhugTaJ|WZ#V4vUeqdhUL_fEkjtW9L(66;!rKuU=zhgxtIHzZ5 zt#Conds)~=e?gM9Um4xjL;6n%$4>3-wt~t=`2Tdt^V=%=;d{%FXqfY=)LGD3(~h|x z-}ll)_to2*5jr86eIF-!_Kj3zDZg73k5u5WW?m4v-3wo6{{>9oW|XF> z2_v~k87=tbJbm|e7N5sFRnA*-poxp<`Jtibu@~TjGqlxRg^kcuL3c_UNE3yQZr~yu zoBi=Ql>By%$?Xc?eX#45SkVIc^?e#2LAX#tmLP^mEKyMFostsz0}{!hOW;O~hnzJ< zAkEs*UE%wt9;Qt-an1*iCV(C+m3lqgh8WxFEcQ=HRSz_qW*NsKQ*XN(RcVJlzzsS& z%4IEgvwGfOuMK(`#cUQP-b8`Cd_*=8l_nVaPp#)eJl=~kpOWD?Lf#%*!)A(g8hvc7wkso7h#xw)t5reb zh3~YRg+J@EQ(X5>TQ>(w$3p+^lag@6;&yupFTl6mdQPG@ydtLX#l3^os&}eYs z-#52?jJ_Hz;D)WVNc0R5BtZ~-J50fP2!@n&e%1oU#{ojkMgnrT5P;Z^z9zFa&D=@6M9n$U})2z_l zqlX@7w^uzZ7}=})mV)0CJpn8jLHB?@Y&2X#XP4u3E*1Q!)GK5c2Y!@S7l|HoGp153 zZn|18B@4f4s%4j^?(?D1a?F5~G_~#~3#Ms+@@!|l126H;xQ%2aq(-OZ9 zA)1*OpKRJ`OXV2nWSIEV;pmE%zzR@PO-#nd#I&Cur(%3e_mDCf?=S}fs?y7e5Wl~R zj=z##s6AfC5l{S2u|G-|u1~b9aYMGKKQjJ%Et_JC8NpRwNy!{;-n-E?bMhkRvCe9WZsnx}`x zEJBdz!PDidNCV}8pU>j$dik}iouH>oE0QL~aTs5WrVG&7e0HwL7aOj(-ByUso=j#} zGYDE4zifg?75BsHcA7r?U#$ZFPbWwJg9YXPT2(<8in!sOEr+?Dc&_*bC{XbnJX09pgk8i3XSv<9Fx0IdON z4M1xES_9A;fYt!C2B0+ntpR8aKx+V61JD|P)&R5ypf&yp_wfIR)(`@;2B0+ntpR8a zKx+V61JD|P)&R5ypfv!k0mRk-Vru}gHGtR}Kx_>lwgwPe1Bk5w#MS^}YXGq|fY=&9 zYz-i`1`t~Vh^+y{)&OE_0I@ZI*cw1=4IsA0zcIFkFrYO6tpR8aKx+V61JD|P)&R5y zpfv!k0cZ_CYXDjU&>Dc&0JH|6H2|#vXbnJX09pgk8i3XSv<9Fx0IdON4M1xES_9A; zfYt!C2B0Dc&0JH|6H2|#vXbnJX09pgk8i3XSv<9Fx0IdON4M1xES_9A; zfYt!C2B0+ntpR8aKx+V61JD|P)&R5ypfv!k0cZ_CYXDjU&>H_ntsx3%4M1xES_9A; zfYt!C2B0+ntpR8aKx+V61JD|P)&R5ypfv!k0cZ_CYXDjU&>Dc&0JH|6H2|#vXbnJX z09pgk8i3XSv<9Fx0IdONjen!okOs5{pfv!k0cZ_CYXDjU&>Dc&0JH|6H2|#vXbnJX z09pgk8i3XSv<9Fx0IdON4M1xES_9A;fYt!C2B0+ntpR8aKx+V61JD|P)&R7|zfo(* z09pgk8i3XSv<9Fx0IdON4M1xES_9A;fYt!C2B0+ntpR8aKx+V61JD|P)&R5ypfv!k z0cZ_CYXDjU&>Dc&0JH|6H2|#vXbnJX09xbUs5PDgS_9A;fYt!C2B0+ntpR8aKx+V6 z1JD|P)&R5ypfv!k0cZ_CYXDjU&>Dc&0JH|6H2|#vXbnJX09pgk8i3XSv<9Fx0IdON z4M1xETI1iSHTVFn0cZ_CYXDjU&>Dc&0JH|6H2|#vXbnJX09pgk8i3XSv<9Fx0IdON z4M1xES_9A;fYt!C2B0+ntpR8aKx+V61JD|P)&R5ypfv!k@o&@`{D9T~v<9Fx0IdON z4M1xES_9A;fYt!C2B0+ntpR8aKx+V61JD|P)&R5ypfv!k0cZ_CYXDjU&>Dc&0JH|6 zH2|#vXbnJX09pgk8i3aL|4wV*V_;yIIoN-)u>ZvEZf6T?QgWHoNn)u58~dB6=EXkx zGHhzURve__r7o&4!bY15W`k~lRZy;M%&{DAJ zr^+lWZelj&CZ@%Fu#RYH1?hMZ7-yxK&xGShx0&g+?=~nIy@(7&q_E9zN7+nGKxtmt zAH1#?tY!@n^r=2U?P%K6p3r69@U%c3>?10DMJl^d$~BD>Q`Hg|8Uf{8=P@9k>Q(WH zAEk96Ue+J@=Os_OLg5BA7uumKv!S^>SK+&o-}9tcdBTmou9~#rX5PZbrJoI(t&SlV zXB{J;B;=FDyV>8si&GX-&29q|kp%C+1A;?eBUcs#O2Cc=1X+wV-JcxCnU-SKnF_tKj_T5ed0;q?1lDxRm1_I+pQ=6&MG7QTm;b=)|H6+bcVSQGE~?qc~##hKbVKAlc(lE|Cs`phjkQ0M*KaCRdKJ7RD# zm108{W-@i(8B&ZTKUZULb(&?%s(5L%5h8q#wq=wW>+Y&4;{~lbBdwUd;>`+_*%hp^ zywN8nt@H~D$TV(-l=$y}X&CJ~A zmLDyzlMhLd{!$_VDJg%w`Z0cHDLHU&m%ow~srKo9F%t7c=7K40kbkSMQV~v{u}e4V zojkZ#(>9{1mV`8UL&$rB^7f+NZqoT;a%UlG;{ zv9GUbP?)4<;ha)-^pTsXB(eApc!JlV%qn%rw@6NoC#yCCBbL>I3KYqQ)?rv8!j_ZG z98K+?b6vccGA!brUGA_yd#TH2x17{&KA`p+V;z&|fnuHVao2)==kR?|^?MzDL;EvG z>)Oi;i1OrLd=09b1cgV-8N_2c?yuPxvP_&R46WTl< zDfzX~&WiupFD5SmvM9J1_`$QQ_SFpTFU{kY=Zeztioi#naT~X{$qd_lp=k>LOx)A}JX~ z6^;K+=m-y7yjUt&joHF;N-VH{&RzV~>(?=<;}G<^ZRl4)c64Bw zhH=TCGqsEjl}9ov1%YOM5wUlC71T}cIg`-M?R--Im|+Kg9yFu$oS%h6V{!irW+9YW ze47nr*6zH~pX0pjrNrtbHgFluKX8`SUMDoJKj-~{K1J&19+9F4hA8C&K8&@j#ZJ~! ztQn$){C7!s9OKNt6<_Uh|_}y8goe_w|=@_mNdCWy|LzTXAS?uF?V@k{pXSL6c1X8B!)N6zx<6I z|IF%;+w`_T_$O$LwM8K_U1rSd%1v73k!djA$OhjcU#my?CDj)K)}t%ZY*YY_qw$`W z#20-L7-{-%sG&Otk3M^R4Ty*carVqv!#!X(F;&+F0!^*2lJDY^?8 zYQ!@rWp!sfJW3<|QpKtrR2=bydUW2m&|fdI98_DR=cj+gl#WOd8gEZjWOmR@x@w$s zYU;3?ST5%x`e=Y4s@^i)W}PQ9EHP?w;Gr-Q$SSBw#-Q;$eqHKIhb{YoRy<3-Uwc0rdB^eHJ+C?2qj+zdfab+x%ys7}>1l-L>G-^A~ zugyQeZU|bVpdu`r`10O_XZ=x%Wb4?9fD@?_yW;|idb>r-(JMCQgUi53ew0uP0hCKb zNAQKgR}vf3X(QFEQ0Cs-n@VrmYq)^y&niPHuzp+&V9rip{a26W( zFfm!f+D*7Z6kl%Kr=weQ)pUl0Z4L3oH=PRDWQ)c-9&DXw)?)sC$K*dJ&mvZC$Dg_x z53>GH_Cpuuba_|tt4++f;dAAxWd&5P`U|jvqN?z!@ zN@HA;2R4{FCQ^SVo<|yS9LI=(6Io^2?i<=HD-J;7mD`hrR9L9Ghd+F;N60UpMWlr$ z;kOZl96frevSh6t2x5~FmR-^!uFfJm|BG#J@Nz<8vEt}WI`NawF;G|ahg8!7Wk>iW zKZ*vMGFE6pcutV7qij&7WHV=S zK5p`X-q z@uk=4+4!xGTt8@I(`QYTKFjh&X7^#FwJPN)FS|zzThFW*N54>-xI3=*d+$O#fhHnG%T?Gjg;4>=F>sNie)h!`xI(Td~q$&JhA>JawD3GcNVWG%z4d@1GiQ|Kcbk;KY_|!>S1*7P+u6jixb0%B@n{`xfIpd-r))n| z^cTeLuhv=N!L;wFh;TUra1NEa6gOSZ0cf)VkK7|8HE+E6&%lBVQ6^rCS3M4x72M z?bj?hk-K-T!B|f0Gatlr?^%7bCeF+)eU&;^^zeQRmf%N6x!@?5sGW}q95njBOAMU? z*d$)~e@-R)ZFGss;(X+M_=1_?)0(uJVZy^b!AC#H1TKf)g0=|1d9yzF^MknenS&Gi zfJ}c_n{H~k)|T#V<>SN>dZwf5~oo*Yk8ctyGsx&#%^8vZ{a`sqx!R z^U6xN5(7zo@?}T@K4$Pk#NffHIedoAE${7f!cVn2da-hH`V%5e`BWjxrVBeMOgp}E zOnRI#P6`I6lwG{gQbiKoKkA91u?x;Z2c{Rrj|NM4XFBb7Qm5s27oMFN)_;3z;ZsR3 zLLDamDbwn0o6AqkM<187i$aR!blpY}jW0^Zh7;_pe2aDWp)~dH=^}C23QL8|=$>#* z%4xV9GAB7QHWJAd_xEW{xUDK>T{*AfP~{mhd z|GqmNC;TP1-_=h4xL0QqQ)i~OdhLjZ$HzIbpQ$eAUA;dAS2tUUiD-IcaPhZoxrlf8 zhyd4wlJy)8edfqRJO^aop&=@kdKnOB~4H{~y5vp#{(x;|^+u58-Z zW+y7x_gIqK7rGUt{i&?twMbz)!*?%AroDDPnwPV$(MHoya(O zI=i|fI;tWws|kXe+)c&s=$k%*7W9^!ZIg;}p}XjjU#glhMEWy|&oO=hegMni_*veBFBp8cZT{nXPQ?N#LBLitWwD>Tg6n;wLOg~c=L}X#aH13NNA=K zBd1aI;|~C9Vp}_cleW&1f`W2W5ar)?LNFA23fiSiEZq-6u9v3phRmH7ok-?qXDrk8 zT8G+n>7|(-mN#8(4eHd@>OI`NrYvHpHyjr^ZvZdH4mror2P6mXPk`K4>5IX;M%@ZC z_6qe5vq4E!Bvx`s4J0-*-##E4oq8a7Un$J?{uUB?himX|Vh*iA-FoWTM5vy`M@n~=#sS&FIrX(YXRAsscZ;#jU$Eo?N&USywYXAQkZO_DtuzVI5&5wb%~Wu5L((Ni+S z(#$0`nY@~{dTL3{c|}5AheNYYDZ|$j_BP?yiPD-YGuvHW`>WA~?OZ4mRV?phMT4@N z0iLE@X)vz2doZ=1jU;tmXKwPoSTlFek!5zCgcN(VfXMI00FRc1SM`V`ZGfPh$g`yY z$%$6in7)&Tsa3t`xbMrm)~mYe?^l*m0}}o@eTeEUg<%7n><-%e`Cs|vK^T>cf^qsHV&nNX1s9-a{Ee}F^n)#F2)MrIDvQyFi( zEElIb(z?Y{NcQH#@jLEfd3t9^s!lq3rK+iCzW@YB;^-Lrkt1&`#GJ5oP|DwQ$^dsR z^=T&8Qth0K*cMD$WespWtfMVHXf_jJ=5xbO&~i-eSbn$#!&kN9%;b^6dF%|SZLS)N zE7FaMkp}9=!e)ID#0~5;L?jR|>WBb$wA>Zq?qZ~SX=m9$#D8#Cfv%CYzBee5CV{p> z49pK;Lh#JYZAi0e&yMar^1ROOQI9C<-SQ|xzm5lXp_u@>WypG{m+T~sOxD~QCNBCi z{m{@MBNW6lqY@bfA*Uu+rA}i5L=8b}NgdRZm|v?NEYT9V)8M%-*TQjBN3W?4IJD9} zB&QJGL#w6y!rEOeQy9=ujS^lqR079MW_)4g95QWs4g8x$yR9U~Ti5Het=d=&AmOp| zebj`KG2M?Y?rBDjAA9SDkt>I~O-kX&)L3CVryfT}f|V&1Zd=|9d9wzD#=(58{DF$_ ztE+nH+?&VQST>HEptOJg&huDGvgDR4JcZ7Cv34MyxUUI1F{4TSU<80+gcIAy3v0!z9bZX|D%o zHh9E{8|srScCCPifGhuc)uB$D$}x7KF!R^Xf?JM#1@JsoBp5}EeoxX8 zb#S7E>dqeYXtAcqY!MfLz_I`r`=qSNM*|&DG79UNp-CF zgJNH$o z`#vK;GOfro$L)b#Yfd(uMwG?cm2xs|ZN%Qg#kyy*tsUIH$|@kjne{|;3eftZ|&?d@Reoy!-+KlzG8{{ksT@9mi@y%%ki>n*$M z@VFMspN9wQ5y0U+@1vQ00)+wH-#Jg^`@l=U~$$YfhN=Z@bUsUM3y@fwhi zY)JGzA}X+(%(XTi^p1>@hD*4_(SXA54z=TkX)%i-@8)pt+;MN$7^D3GEBjXX(}H0@I&MEj!aS0K`= zp;fT15rX9iQ($fX)(WN*0~s~?t$^!5DqcMRAXlk36Ww0ap9+17zKBv6(yMZk_%afG zA)DeY0O`6bN{<=DBC+eCPg$K_Qo@(z$vCx>+fv5C9s(=Okh8^aJ`@9VVXvF60@RSp=KO=h`(7JyxNd^HA^QM8wtaXpP zq4{V@^OZb0*D%T+wq@%!kVB1fqmoyj$)Vlo)sci3lbK`JHsR96meE+o-YwZfU39aI z`)t5yDe;wRBnvqAtQ;!foNc;^4V3Oi@I%j_q7!)Q+o!^HOo13sM{` zLfB3iHXQY$bWW~Bi&LW31sC*|(*sR@5wi7f|1Z5+B7S=qy@}}mT zd;Rxo_D2b}6S_H{0E2s8$177rqU=Z^9-$V5Ysodfi2gx~p@RF8Le)~GO%LG85ujv> zbm%3utSwLhD4Ks(s_gRvq)2pLk}VscNU9=>)uky7J}X!93hOgei2rxlQ=cAyXiQI_ zVxkgVxQ7N}l*!|9f)e;FR=C6YKUH?XrEdQ9(p>;n6m z4K2af{xIR|#Ay?v|Fy>U+j$Y11E}BL_ECHD?+SaLoRaPTnl005LU&(ufxEMaKeOVW zNe7^V|NpY^06L`q%hD;)!Tw+E|BLNk-b*tGBKY4~pD0-U&xHR69;sTy?zF-B#O|ym z?f~A0M1L2Ds&RmB^PtSOpb~XI{Li<@Vu&KDj?{BRE4i;BGE$`pOPacNp92ntpP_l|2Uc{)x1k
  • >eRJU3 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 c80YfTynlw93}?Mb9QN2I8biMu92ds`f%y zn%Z2|0=|7lJ(!j|>ui$(Hl;fJIIu}8j>s`kfO8vGF%Tlf093I~TO`Ul2gs<_TPz`} zZoR-N-@M~x?d7C`)5jT!U^gC0v5bv*TKv!Hyn6+9#9uCYQ)bwC%uTV##Cov%p)Y*p zbA6nI`w6k<`(+x=7*u{gR&Tk7u9v#%0Vd+y^E@`>b8XBOBINxzf+%deCHt58F6z~~ zmJKC^O$-Rm*qg|9DL03U(GLTKai7rfgJ)+PkMAux{jGOYNf#f91PKvJqkZ=>Td9=? z{o0mUbb7zDZywf_8wqU2g4GmO+fNs3&B2zd`&Rczl-6Rw+d1|-`7eL~>Z5qgjX`eDEfo5>{dn3 z_DEbI8*t^hxH2ROhvi`5Ki^V{W^0 zrG?9bG^*gefP6%^d6jR}zZvQ`qpcg%IO4A%4zik5!P1hcRa{{XLS6MJ*;g-uft@p! z!KnNsaOrpSaRc4J9s=r_>egpLBcslKuOH2JnD@)wB|w zP4sm3YEK_&TK$b@RsWWj8M5@)eSbd*JuHnZG?2UjpBfDce*X9<)=Tf=SdyX_RJY>mT@wO4(>M3|QP-p46N<8L-xTvn!q z``dGS+aZ0C9!;6{8tEvI(^+~yuO`jL0@4NV!CS{O=}VL6e$mq0y!8w%YB3!ux5k4|7e0b5bfV%BY zakni^)d=Y0X&exlVT(E@Jwg%ATkP#3;fgup!b&7PJG**>Dg<9l*8?r1qhj<*BKsgT zq@YH|rWGODt|2v5K2dFj&ss~G)~v=)%*{@^0`;)n<{MnkJNntU(@#I+NK%}y^%yY@ z9Loj~Vq=X2wa?J4MF|qdS;C0x?%Q|0;*H2R#RXG;K#IbZ5xbL@hRFq6u-PCiTJ`xC z%#PrJae*kHV2rZWX5Hao4RMd?#+ma$T=X-B>NSX9bqDpkgl7{1uSYQGtUJ~(Cf&Ec zNg88kr;L$r1>HS>Jdfg!5}2Q#jz>+OLgOZ|RSBkat~e>|INWo9P-q*j#cKWX&3f6fANScnzN7&4&=9F;5y%hC^PCBwNgFdfJ!&L z^0!k7bJh4QT3-j~_8Wl{S5z7_RUL&Qm;TRvlB!E3Fd&i#+I-a&i} zY+i`eD0BW%DxC53OUO-d!%XK}xU$5Q9;A~0;WuIDycde@G(gZ z3cKE?nG4^KR!J}z&zNWMbfnj+K>hPkh_VM<|DbIjiyKXdwagygEWGWP2+XIkwD<=n z*B-e}r@;}NcC)X`+TSiKq{XSvNX3hEh6d_~wD>_c!KFPC5q+P-Qj-fqNhz_=O1~oN z`k%NP4jJqa{Vb9~PO-jANLyjA96;0A{UX1>I)C+I_~7=02YM+Obe>vqHiMTBk#*2R zK_}3<1_5Sh3pqQIVR0E-`5o|>A;E1W5x3Q#G!>#J){{yTcv>7#yK#)xP$X<~G#{r$ zEE`;? z(^3VJWg>4Cp)V3m{*Qz{*Hi_M>Ab6VVb^v0@VnV!Z_W~IQ_!Z2F5loP+z31ob@HoQ zSwBxrNxJY^8WyhWd`!(GXU<6cGWifc+eajk)xi7i>?4*?+V#GGlF0W%dcC4yvuHsUB(L197Vn83 zMR}n4ZC|OKj_FssO1*tl-F1Qd7k$c~uHer}W5&;n|L9X#{sn#VKVzTls;^k#up

    }349Y!V4}{BnOcQXsuC(%4D5Lwn?0O?~c==;k3T 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∓O0*s8VF#S~@vGjcMZfs($SoolqW_!a`>*6^ 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]Ev-F=tAZB6w(Mcp@&1q8hirBg7D} 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�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 CL!oj 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 literal 0 HcmV?d00001 diff --git a/idl/MULTIPR.idl b/idl/MULTIPR.idl new file mode 100644 index 0000000..19510b7 --- /dev/null +++ b/idl/MULTIPR.idl @@ -0,0 +1,230 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +// +// MULTIPR.idl +// +// Interface CORBA for the MULTIPR module +// +// Author: Olivier LE ROUX - CS, Virtual Reality Dpt +// +// Date: 01/2007 +// + +#ifndef __MULTIPR_INTERFACE_CORBA__ +#define __MULTIPR_INTERFACE_CORBA__ + +#include "SALOME_Exception.idl" +#include "SALOME_Component.idl" +#include "SALOME_GenericObj.idl" +#include "SALOMEDS.idl" // to access study + + +/*! \ingroup MULTIPR + * + * This package contains the interface MULTIPR_ORB used for %MULTIPR component. + */ +module MULTIPR_ORB +{ + + +typedef sequence string_array; + + +//************************************************************************* +// Interface of the %MULTIPR component used to manage partition/decimation +//************************************************************************* + +interface MULTIPR_Obj +{ + + //--------------------------------------------------------------------- + // Basic accessors/mutators + //-------------------------------------------------------------------- + + /*! + * Return true iff this obj represents a valid sequential MED file. + */ + boolean isValidSequentialMEDFile(); + + /*! + * Return true iff this obj represents a valid distributed MED file. + */ + boolean isValidDistributedMEDFile(); + + /*! + * Set the mesh to be partitionned/decimated. + * Assume sequential MED file. + */ + void setMesh(in string meshName) + raises (SALOME::SALOME_Exception); + + /*! + * Set the boxing parameter used for decimation (100 by default). + */ + void setBoxing(in long boxing) + raises (SALOME::SALOME_Exception); + + /*! + * Return the list of meshes contained in the associated MED file. + */ + string_array getMeshes() + raises (SALOME::SALOME_Exception); + + /*! + * Return the list of fields contained in the current mesh of the associated MED file. + */ + string_array getFields() + raises (SALOME::SALOME_Exception); + + /*! + * Return the number of iterations for a given field. + */ + long getTimeStamps(in string fieldName) + raises (SALOME::SALOME_Exception); + + /*! + * Return the name of all partitions. + * Assume this object encapsulates a distributed MED file. + */ + string_array getParts() + raises (SALOME::SALOME_Exception); + + /*! + * Return all information abour a part. + * Assume this object encapsulates a distributed MED file. + */ + string getPartInfo(in string partName) + raises (SALOME::SALOME_Exception); + + //--------------------------------------------------------------------- + // Algorithms + //-------------------------------------------------------------------- + + /*! + * Create a distributed MED file (v2.3) by extracting all the groups from the current mesh of the current MED sequential MED file. + * Assume: + * - the file is in MED format and can be read using MED file v2.3. + * - the file is sequential (not a distributed MED). + * - the file only contains TETRA10 elements (dimension of space and mesh is 3). + * - the file have no profil. + * \return the name of each part. + */ + string_array partitionneDomaine() + raises (SALOME::SALOME_Exception); + + /*! + * Create a distributed MED file (V2.3) by splitting a group of a MED file previously created by partitionneDomaine. + * Assume: + * - the file is a distributed MED file, previously created by partitionneDomaine() + * (=> each part only contain 1 mesh, TETRA10 elements only) + * - nbPart > 1 + * - partitionner METIS=0 or SCOTCH=1 + * \return the name of each part. + */ + string_array partitionneGrain( + in string partName, + in long nbParts, + in long partitionner) + raises (SALOME::SALOME_Exception); + + /*! + * Create 3 resolutions of the given part of a distributed MED file (V2.3). + * Assume: + * - the file is a distributed MED file, previously created by partitionneDomaine() or partitionneGrain() + * (=> each part only contain 1 mesh, TETRA10 elements only) + */ + string_array decimePartition( + in string partName, + in string fieldName, + in long fieldIt, + in string filterName, + in double tmed, + in double tlow, + in double radius) + raises (SALOME::SALOME_Exception); + + //--------------------------------------------------------------------- + // i/o + //-------------------------------------------------------------------- + + /*! + * Save the current distributed MED file to disk. + */ + void save() + raises (SALOME::SALOME_Exception); + +}; // interface MULTIPR_Obj + + +//************************************************************************* +// Interface of the %MULTIPR component; used to create MULTIPR_Obj object +// and to define high level API. +//************************************************************************* +interface MULTIPR_Gen : Engines::Component +{ + /*! + * Return the version of the MULTIPR library. + */ + string getVersion() + raises (SALOME::SALOME_Exception); + + //------------------------------------------------------------------------ + // High level API + // Directly apply one of the 3 main operations of the MULTIPR module on a MED file + //------------------------------------------------------------------------ + + /*! + * Create a distributed MED file (v2.3) by extracting all the groups from the mesh of a sequential MED file. + * High level function. + */ + void partitionneDomaine( + in string medFilename, + in string meshName) + raises (SALOME::SALOME_Exception); + + /*! + * Create a distributed MED file (V2.3) by splitting a group of a MED file previously created by partitionneDomaine(). + * High level function. + */ + void partitionneGrain( + in string medFilename, + in string partName, + in long nbParts, + in long partitionner) // 0=METIS 1=SCOTCH + raises (SALOME::SALOME_Exception); + + /*! + * Creates 3 resolutions of the given part of a distributed MED file (V2.3). + * High level function. + */ + void decimePartition( + in string medFilename, + in string partName, + in string fieldName, + in long fieldIt, + in string filterName, + in double tmed, + in double tlow, + in double radius, + in long boxing) + raises (SALOME::SALOME_Exception); + + //------------------------------------------------------------------------ + // Low level API + // Create an object to encapsulate a MED file. + //------------------------------------------------------------------------ + + /*! + * Create a MULTIPR_Obj object which encapsulate a MED file. + */ + MULTIPR_Obj getObject(in string medFilename) + raises (SALOME::SALOME_Exception); + +}; // interface MULTIPR_Gen + + +}; // module MULTIPR_ORB + +#endif // __MULTIPR_INTERFACE_CORBA__ + diff --git a/idl/Makefile.in b/idl/Makefile.in new file mode 100644 index 0000000..57b0c2f --- /dev/null +++ b/idl/Makefile.in @@ -0,0 +1,86 @@ +# Copyright (C) 2005 OPEN CASCADE, CEA, EDF R&D, LEG +# PRINCIPIA R&D, EADS CCR, Lip6, BV, CEDRAT +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +# +# generate dependencies for idl file : +# + +# source path +top_srcdir=@top_srcdir@ +top_builddir=.. +srcdir=@srcdir@ +VPATH=.:${KERNEL_ROOT_DIR}/idl/salome + +@COMMENCE@ + +IDL_FILES = \ + MULTIPR.idl + +PY_CLIENT_IDL = $(IDL_FILES) + +# we copy all idl file in $(top_builddir)/idl +inc: $(top_builddir)/idl/salome $(IDL_FILES:%=$(top_builddir)/idl/salome/%) + +$(top_builddir)/idl/salome: + mkdir $@ + +$(IDL_FILES:%=$(top_builddir)/idl/salome/%):$(IDL_FILES:%=$(top_srcdir)/idl/%) +# $(CP) $< $@ + cp -f $^ $(top_builddir)/idl/salome + + +lib: pyidl + +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) + +$(PYTHON_BUILD_SITE): + $(INSTALL) -d $@ + +$(PYTHON_BUILD_SITE)/%_idl.py: $(top_builddir)/idl/salome/%.idl + $(OMNIORB_IDL) $(OMNIORB_IDLPYFLAGS) -C$(PYTHON_BUILD_SITE) $< + + +# install python client (generated from idl file +install: install-pyidl install-idl + +# create directory $(idldir) and copy idl files into it +install-idl: $(IDL_FILES:%=$(top_builddir)/idl/salome/%) + $(INSTALL) -d $(idldir) + $(INSTALL_DATA) $^ $(idldir) + + +install-pyidl: $(IDL_FILES:%=$(top_builddir)/idl/salome/%) + $(INSTALL) -d $(PYTHON_SITE_INSTALL) + @for file in $^ dummy; do \ + if [ $$file != "dummy" ]; then \ + $(OMNIORB_IDL) $(OMNIORB_IDLPYFLAGS) -C$(PYTHON_SITE_INSTALL) $$file ; \ + fi ; \ + done ; + +#@ CONCLUDE @ + +cleandep: + -$(RM) .dep* + +distclean: + -$(RM) *.py + -$(RM) $(IDL_FILES:%=$(top_builddir)/idl/salome/%) + -$(RM) Makefile + diff --git a/resources/ExecMULTIPR.png b/resources/ExecMULTIPR.png new file mode 100644 index 0000000000000000000000000000000000000000..436af1d6cad730a38b33af3002504423af93a034 GIT binary patch literal 454 zcmV;%0XhDOP)R$7$8M`9eDr%0aHmt zK~y-)jnhGDR6!61;O`Bi;viW>(L1=)^g&$2>_iB{z+Avx7ITP(L70U(fEP)~D)9^= zNmd!7LfXZvm)CE6g0<0h}Pm;i7%~Wr?HV{ggS~25EBpsC4@P`M%;=eR1Az-)BCL0o?ZjPjG#_#kT2z z_HdE8ZQ{{g4Hzn*beb=Q0Jqpl{Duk2vQ<$;KXOle9_N?%R0(>VFiAbTRj>wo2l6&l zKE+3T2!bD~UnonwzzpxU%Bds3XV@gBQqNRYeHnX|g54Tm*)BKunK3yW_sD6*eiii> zl%rPd3=bDH(~-Y^9gV$PL|^9Y9{>H7FEeF2!hV*Apk<{Wj(KmUufjBSysFu|_%^il wy`|UnFm)XcXErKdj9GX9@IPa_o$qpg0Oi|cfLbZ#wg3PC07*qoM6N<$f*oMT>Hq)$ literal 0 HcmV?d00001 diff --git a/resources/MULTIPR.png b/resources/MULTIPR.png new file mode 100644 index 0000000000000000000000000000000000000000..436af1d6cad730a38b33af3002504423af93a034 GIT binary patch literal 454 zcmV;%0XhDOP)R$7$8M`9eDr%0aHmt zK~y-)jnhGDR6!61;O`Bi;viW>(L1=)^g&$2>_iB{z+Avx7ITP(L70U(fEP)~D)9^= zNmd!7LfXZvm)CE6g0<0h}Pm;i7%~Wr?HV{ggS~25EBpsC4@P`M%;=eR1Az-)BCL0o?ZjPjG#_#kT2z z_HdE8ZQ{{g4Hzn*beb=Q0Jqpl{Duk2vQ<$;KXOle9_N?%R0(>VFiAbTRj>wo2l6&l zKE+3T2!bD~UnonwzzpxU%Bds3XV@gBQqNRYeHnX|g54Tm*)BKunK3yW_sD6*eiii> zl%rPd3=bDH(~-Y^9gV$PL|^9Y9{>H7FEeF2!hV*Apk<{Wj(KmUufjBSysFu|_%^il wy`|UnFm)XcXErKdj9GX9@IPa_o$qpg0Oi|cfLbZ#wg3PC07*qoM6N<$f*oMT>Hq)$ literal 0 HcmV?d00001 diff --git a/resources/MULTIPRCatalog.xml.in b/resources/MULTIPRCatalog.xml.in new file mode 100644 index 0000000..5ee10c9 --- /dev/null +++ b/resources/MULTIPRCatalog.xml.in @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + MULTIPR + MULTIPR GUI + Data + O. Le Roux + @VERSION@ + CS/EDF-RD + 1 + MULTIPR.png + 'linux' ~ OS + + + + + MULTIPR + No comment + + + + + getObject + O. Le Roux + 1.0.0 + + + + MEDfilename + string + Name of the MED file to be processed + + + + + return + MULTIPR_Obj + + + + + + + + + + + diff --git a/resources/MULTIPR_import_med.png b/resources/MULTIPR_import_med.png new file mode 100644 index 0000000000000000000000000000000000000000..d9953b6a7d36d4983f2cd609ef10976ac221215f GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!7%)r1n>(-?sKn{O^Pl)S*0|);9XJ~0+_z$EQ z7#`Knt^-nxB|(0{3=Yq3q=7g|-tI0e{TVj{fgG_C*NBqf{Irtt#G+J&^vpD)g1mGE zBRvB>L)*B089)``o-U3d6?1&M4)PvQ;5l+fi(A2vp(}!6Dx*Nk|Cv%5s~;VoE6>K# zQGEW5oA9EG!rjU&^ViLso3`2fSZHEMajgTe~DWM4fqRCMQ literal 0 HcmV?d00001 diff --git a/resources/MULTIPR_save_med.png b/resources/MULTIPR_save_med.png new file mode 100644 index 0000000000000000000000000000000000000000..330493fa2ae0c510e9ccd70d2f923b1220b9dde5 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!9%)r1XI!iqT$l(m|32{Ae;6O_gki&3TqMZXs zF_r}R1v5B2yO9RsBze2LFr{(VfRu}sxJHx&=ckpFCl;kLq-UlX738HW80i`48QR9} z%K)nI^>lFzshE?TkPwiNkTB!Gfg=l8m&}#eBr!>XWru@DmT2=etpyT?nG}*37e;y? zSkda3%^Hw(m5a@kjm^N2*=a>vo14Lkbx{V)P7MqUQul;6JeuR&3^bU*)78&qol`;+ E0M`~hx&QzG literal 0 HcmV?d00001 diff --git a/resources/SalomeApp.xml b/resources/SalomeApp.xml new file mode 100644 index 0000000..3e52145 --- /dev/null +++ b/resources/SalomeApp.xml @@ -0,0 +1,11 @@ + +
    + + + +
    +
    + + +
    +
    diff --git a/src/MULTIPR/MULTIPR_API.cxx b/src/MULTIPR/MULTIPR_API.cxx new file mode 100644 index 0000000..5c5fda5 --- /dev/null +++ b/src/MULTIPR/MULTIPR_API.cxx @@ -0,0 +1,193 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_API.cxx + * + * \brief see MULTIPR_API.hxx + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +//***************************************************************************** +// Includes section +//***************************************************************************** + +#include "MULTIPR_API.hxx" +#include "MULTIPR_Globals.hxx" +#include "MULTIPR_Mesh.hxx" +#include "MULTIPR_MeshDis.hxx" +#include "MULTIPR_Utils.hxx" +#include "MULTIPR_Exceptions.hxx" + +extern "C" +{ + #include "med.h" +} + +#include "MEDSPLITTER_API.hxx" + +#include +#include +#include + +using namespace std; + + +//***************************************************************************** +// Implementation +//***************************************************************************** + +const char* multipr::getVersion() +{ + return "1.0"; +} + + +void multipr::partitionneDomaine(const char* pMEDfilename, const char* pMeshName) +{ + if (pMEDfilename == NULL) throw NullArgumentException("pMEDfilename should not be NULL", __FILE__, __LINE__); + if (pMeshName == NULL) throw NullArgumentException("pMeshName should not be NULL", __FILE__, __LINE__); + + //--------------------------------------------------------------------- + // Read the sequential mesh + //--------------------------------------------------------------------- + cout << "Read sequential MED file: " << pMEDfilename << ": please wait... " << endl; + + multipr::Mesh mesh; + mesh.readSequentialMED(pMEDfilename, pMeshName); + cout << mesh << endl; + + //--------------------------------------------------------------------- + // Build distributed mesh from groups + //--------------------------------------------------------------------- + cout << "Build distributed mesh: please wait... " << endl; + multipr::MeshDis* meshDis = NULL; + try + { + meshDis = mesh.splitGroupsOfElements(); + + //------------------------------------------------------------- + // Write distributed mesh + //------------------------------------------------------------- + cout << "Write distributed mesh: please wait... " << endl; + string strPrefix = removeExtension(pMEDfilename, ".med"); + meshDis->writeDistributedMED(strPrefix.c_str()); + + delete meshDis; + } + catch (RuntimeException& e) + { + delete meshDis; + throw e; + } +} + + +void multipr::partitionneGrain( + const char* pMEDfilename, + const char* pGroupName, + int pNbParts, + int pPartitionner) +{ + if (pMEDfilename == NULL) throw NullArgumentException("pMEDfilename should not be NULL", __FILE__, __LINE__); + if (pGroupName == NULL) throw NullArgumentException("pGroupName should not be NULL", __FILE__, __LINE__); + if (pNbParts < 2) throw IllegalArgumentException("pNbParts should be >= 2", __FILE__, __LINE__); + if ((pPartitionner != MULTIPR_METIS) && (pPartitionner != MULTIPR_SCOTCH)) throw NullArgumentException("pPartitionner should be METIS (0) or SCOTCH (1)", __FILE__, __LINE__); + + //--------------------------------------------------------------------- + // Read the distributed mesh + //--------------------------------------------------------------------- + MULTIPR_LOG("Read distributed MED file: " << pMEDfilename << ": please wait... " << endl); + + int ret = MEDformatConforme(pMEDfilename); + if (ret == 0) throw IOException("waiting for a distributed MED file (not a sequential one)", __FILE__, __LINE__); + + multipr::MeshDis meshDis; + meshDis.readDistributedMED(pMEDfilename); + cout << meshDis << endl; + + //--------------------------------------------------------------------- + // Split the given part (pGroupName) + //--------------------------------------------------------------------- + if (pPartitionner == MULTIPR_METIS) + { + cout << "Use METIS" << endl; + } + else if (pPartitionner == MULTIPR_SCOTCH) + { + cout << "Use SCOTCH" << endl; + } + + meshDis.splitPart(pGroupName, pNbParts, pPartitionner); + cout << meshDis << endl; + + //--------------------------------------------------------------------- + // Write new distributed mesh + //--------------------------------------------------------------------- + string strPrefix = multipr::removeExtension(pMEDfilename, ".med"); + meshDis.writeDistributedMED(strPrefix.c_str()); +} + + +void multipr::decimePartition( + const char* pMEDfilename, + const char* pPartName, + const char* pFieldName, + int pFieldIt, + const char* pFilterName, + double pTMed, + double pTLow, + double pRadius, + int pBoxing) +{ + //--------------------------------------------------------------------- + // Check arguments + //--------------------------------------------------------------------- + if (pMEDfilename == NULL) throw NullArgumentException("pMEDfilename should not be NULL", __FILE__, __LINE__); + if (pPartName == NULL) throw NullArgumentException("pPartName should not be NULL", __FILE__, __LINE__); + if (pFieldName == NULL) throw NullArgumentException("pFieldName should not be NULL", __FILE__, __LINE__); + if (pFieldIt < 1) throw IllegalArgumentException("pFieldIt: invalid field iteration; should be >= 1", __FILE__, __LINE__); + if (pTMed < 0.0) throw IllegalArgumentException("med res.: threshold must be > 0", __FILE__, __LINE__); + if (pTMed >= pTLow) throw IllegalArgumentException("threshold for med res. must be < threshold for low res.", __FILE__, __LINE__); + if (pRadius <= 0.0) throw IllegalArgumentException("radius should be > 0", __FILE__, __LINE__); + if ((pBoxing < 1) || (pBoxing > 200)) throw IllegalArgumentException("boxing should be in [1..200]", __FILE__, __LINE__); + + cout << "--decim file=" << pMEDfilename << " part=" << pPartName << " filter=" << pFilterName << " tmed=" << pTMed << " tlow=" << pTLow << " radius=" << pRadius << endl; + + //--------------------------------------------------------------------- + // Read the distributed mesh + //--------------------------------------------------------------------- + MULTIPR_LOG("Read distributed MED file: " << pMEDfilename << ": please wait... " << endl); + + int ret = MEDformatConforme(pMEDfilename); + if (ret == 0) throw IOException("waiting for a distributed MED file (not a sequential one)", __FILE__, __LINE__); + + multipr::MeshDis meshDis; + meshDis.readDistributedMED(pMEDfilename); + cout << meshDis << endl; + + //--------------------------------------------------------------------- + // Create 3 resolutions of the given part + //--------------------------------------------------------------------- + meshDis.decimatePart( + pPartName, + pFieldName, + pFieldIt, + pFilterName, + pTMed, + pTLow, + pRadius, + pBoxing); + cout << meshDis << endl; + + //--------------------------------------------------------------------- + // Write new distributed mesh + //--------------------------------------------------------------------- + string strPrefix = removeExtension(pMEDfilename, ".med"); // get prefix from the original MED filename + meshDis.writeDistributedMED(strPrefix.c_str()); +} + +// EOF diff --git a/src/MULTIPR/MULTIPR_API.hxx b/src/MULTIPR/MULTIPR_API.hxx new file mode 100644 index 0000000..8c42885 --- /dev/null +++ b/src/MULTIPR/MULTIPR_API.hxx @@ -0,0 +1,108 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_API.hxx + * + * \brief Main header of the high level MULTIPR API. + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +#ifndef MULTIPR_API_HXX +#define MULTIPR_API_HXX + + +namespace multipr +{ + + +enum Partitionner +{ + MULTIPR_METIS = 0, + MULTIPR_SCOTCH = 1 + +}; // enum Partitionner + + +/** + * \fn const char* getVersion() + * \brief returns the current version of the MULTIPR API. + * \return the current version of the MULTIPR API. + */ +const char* getVersion(); + + +/** + * \fn int partitionneDomaine(const char* medFilename, const char* meshName) + * \brief creates a distributed MED file (v2.3) by extracting all the groups from the mesh of a sequential MED file. + * Assumes: + * - the file is in MED format and can be read using MED file v2.3. + * - the file is sequential (not a distributed MED). + * - the file only contains TETRA10 elements (dimension of space and mesh is 3). + * - the file have no profil. + * \param medFilename filename of any valid sequential MED file with TETRA10 elements only. + * \param meshName name of the mesh to be distributed. + * \throw RuntimeException if any error occurs. + */ +void partitionneDomaine( + const char* medFilename, + const char* meshName); + + +/** + * \fn int partitionneGrain(const char* medFilename, const char* groupName, int nbParts, int partitionner) + * \brief creates a distributed MED file (V2.3) by splitting a group of a MED file previously created by partitionneDomaine. + * Assumes: + * - the file is a distributed MED file, previously created by partitionneDomaine() + * (=> each part only contain 1 mesh, TETRA10 elements only) + * - nbPart > 1 + * \param medFilename filename of any valid distributed MED file previously created by partitionneDomaine(). + * \param partName name of the part to be splitted. + * \param nbParts number of parts; must be > 1. + * \param partitionner use value MULTIPR_METIS for Metis or MULTIPR_SCOTCH for Scotch. + * \throw RuntimeException if any error occurs. + */ + void partitionneGrain( + const char* medFilename, + const char* partName, + int nbParts, + int partitionner=MULTIPR_METIS); + + +/** + * \fn int decimePartition(const char* medFilename, const char* partName, const char* fieldName, int fieldIt, const char* filterName, double tmed, double tlow, double radius); + * \brief creates 3 resolutions of the given part of a distributed MED file (V2.3). + * Assumes: + * - the file is a distributed MED file, previously created by partitionneDomaine() or partitionneGrain() + * (=> each part only contain 1 mesh, TETRA10 elements only) + * \param medFilename filename of any valid distributed MED file previously created by partitionneDomaine or partitionneGrain. + * \param partName name of the part to be decimated. + * \param fieldName name of the field used for decimation. + * \param fieldIt iteration (time step) of the field. + * \param filterName name of the filter to be used. + * \param tmed threshold used for medium resolution. + * \param tlow threshold used for low resolution; tmed must be less than tlow + * \param radius radius used to determine the neighbourhood. + * \param boxing number of cells along each axis; must be >= 1; e.g. if 100 then acceleration grid will have 100*100*100 = 10**6 cells. + * \throw RuntimeException if any error occurs. + */ +void decimePartition( + const char* medFilename, + const char* partName, + const char* fieldName, + int fieldIt, + const char* filterName, + double tmed, + double tlow, + double radius, + int boxing); + +} // namespace MULTIPR + + +#endif // MULTIPR_API_HXX + +// EOF diff --git a/src/MULTIPR/MULTIPR_DecimationAccel.cxx b/src/MULTIPR/MULTIPR_DecimationAccel.cxx new file mode 100644 index 0000000..080613a --- /dev/null +++ b/src/MULTIPR/MULTIPR_DecimationAccel.cxx @@ -0,0 +1,325 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_DecimationAccel.cxx + * + * \brief see MULTIPR_DecimationAccel.hxx + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +//***************************************************************************** +// Includes section +//***************************************************************************** + +#include "MULTIPR_DecimationAccel.hxx" +#include "MULTIPR_PointOfField.hxx" +#include "MULTIPR_Exceptions.hxx" + +#include + +using namespace std; + + +namespace multipr +{ + + +//***************************************************************************** +// Class DecimationAccel implementation +//***************************************************************************** + + +ostream& operator<<(ostream& pOs, DecimationAccel& pA) +{ + pOs << "DecimationAccel:" << endl; + return pOs; +} + + +//***************************************************************************** +// Class DecimationAccelGrid +//***************************************************************************** + +DecimationAccelGrid::DecimationAccelGrid() +{ + mGrid = NULL; + + reset(); +} + + +DecimationAccelGrid::~DecimationAccelGrid() +{ + reset(); +} + + +void DecimationAccelGrid::reset() +{ + mNum = 0; + + mMin[0] = numeric_limits::quiet_NaN(); + mMin[1] = numeric_limits::quiet_NaN(); + mMin[2] = numeric_limits::quiet_NaN(); + + mMax[0] = numeric_limits::quiet_NaN(); + mMax[1] = numeric_limits::quiet_NaN(); + mMax[2] = numeric_limits::quiet_NaN(); + + mInvLen[0] = numeric_limits::quiet_NaN(); + mInvLen[1] = numeric_limits::quiet_NaN(); + mInvLen[2] = numeric_limits::quiet_NaN(); + + mSize[0] = 0; + mSize[1] = 0; + mSize[2] = 0; + + if (mGrid != NULL) + { + delete[] mGrid; + mGrid = NULL; + } + + mFlagPrintAll = false; +} + + +void DecimationAccelGrid::create(const std::vector& pPts) +{ + // check if grid have been initialized + if (mSize[0] == 0) throw IllegalStateException("call setSize() before", __FILE__, __LINE__); + + // compute bbox of the grid + computeBBox(pPts); + + // allocate the grid + int size = mSize[0] * mSize[1] * mSize[2]; + mGrid = new vector[size]; + + // fill the grid + mNum = pPts.size(); + for (int i = 0 ; i < mNum ; i++) + { + vector& cell = getCell(pPts[i]); + cell.push_back(pPts[i]); + } +} + + +void DecimationAccelGrid::configure(const char* pArgv) +{ + // check arguments + if (pArgv == NULL) throw NullArgumentException("", __FILE__, __LINE__); + + int sizeX = 0; + int sizeY = 0; + int sizeZ = 0; + + int ret = sscanf(pArgv, "%d %d %d", &sizeX, &sizeY, &sizeZ); + + if (ret != 3) throw IllegalArgumentException("expected 3 parameters", __FILE__, __LINE__); + if (sizeX <= 0) throw IllegalArgumentException("number of cells along X-axis must be > 0", __FILE__, __LINE__); + if (sizeY <= 0) throw IllegalArgumentException("number of cells along Y-axis must be > 0", __FILE__, __LINE__); + if (sizeZ <= 0) throw IllegalArgumentException("number of cells along Z-axis must be > 0", __FILE__, __LINE__); + + reset(); + + mSize[0] = sizeX; + mSize[1] = sizeY; + mSize[2] = sizeZ; +} + + +void DecimationAccelGrid::getCellCoord( + med_float pX, med_float pY, med_float pZ, + int* pIx, int* pIy, int* pIz) const +{ + med_float cx = (pX - mMin[0]) * mInvLen[0]; + med_float cy = (pY - mMin[1]) * mInvLen[1]; + med_float cz = (pZ - mMin[2]) * mInvLen[2]; + + *pIx = med_int(cx); + if (*pIx >= mSize[0]) *pIx = mSize[0] - 1; + else if (*pIx < 0) *pIx = 0; + + *pIy = med_int(cy); + if (*pIy >= mSize[1]) *pIy = mSize[1] - 1; + else if (*pIy < 0) *pIy = 0; + + *pIz = med_int(cz); + if (*pIz >= mSize[2]) *pIz = mSize[2] - 1; + else if (*pIz < 0) *pIz = 0; +} + + +int DecimationAccelGrid::getCellIndex(int pI, int pJ, int pK) const +{ + int index = pK * (mSize[0] * mSize[1]) + pJ * mSize[0] + pI; + + return index; +} + + +vector& DecimationAccelGrid::getCell(const PointOfField& pPt) +{ + int ix, iy, iz; + + getCellCoord( + pPt.mXYZ[0], pPt.mXYZ[1], pPt.mXYZ[2], + &ix, &iy, &iz); + + int index = getCellIndex(ix, iy, iz); + + return mGrid[index]; +} + + +vector DecimationAccelGrid::findNeighbours( + med_float pCenterX, + med_float pCenterY, + med_float pCenterZ, + med_float pRadius) const +{ + //--------------------------------------------------------------------- + // Determine the axis aligned bounding box of the sphere ((x, y, z), r) + //--------------------------------------------------------------------- + med_float sphereBBoxMin[3]; + med_float sphereBBoxMax[3]; + + sphereBBoxMin[0] = pCenterX - pRadius; + sphereBBoxMin[1] = pCenterY - pRadius; + sphereBBoxMin[2] = pCenterZ - pRadius; + + sphereBBoxMax[0] = pCenterX + pRadius; + sphereBBoxMax[1] = pCenterY + pRadius; + sphereBBoxMax[2] = pCenterZ + pRadius; + + //--------------------------------------------------------------------- + // Determine the cells of the grid intersected by the sphere ((x, y, z), r) + // => range of cells are [iMinCell[0], iMaxCell[0]] x [iMinCell[1], iMaxCell[1]] x [iMinCell[2], iMaxCell[2]] + //--------------------------------------------------------------------- + int iMinCell[3]; + int iMaxCell[3]; + + getCellCoord(sphereBBoxMin[0], sphereBBoxMin[1], sphereBBoxMin[2], + &iMinCell[0], &iMinCell[1], &iMinCell[2]); + + getCellCoord(sphereBBoxMax[0], sphereBBoxMax[1], sphereBBoxMax[2], + &iMaxCell[0], &iMaxCell[1], &iMaxCell[2]); + + //--------------------------------------------------------------------- + // Collect points of the field which are in the sphere + //--------------------------------------------------------------------- + vector res; + +/* +// debug +cout << "Center = " << pCenterX << " " << pCenterY << " " << pCenterZ << endl; +cout << "Radius = " << pRadius << endl; +cout << "Visited cells : [" << iMinCell[0] << " ; " << iMaxCell[0] << "] x ["<< iMinCell[1] << " ; " << iMaxCell[1] << "] x [" << iMinCell[2] << " ; " << iMaxCell[2] << "]" << endl; +*/ + + // for all the cells in the grid intersected by the sphere ((x, y, z), r) + for (int i = iMinCell[0] ; i <= iMaxCell[0] ; i++) + { + for (int j = iMinCell[1] ; j <= iMaxCell[1] ; j++) + { + for (int k = iMinCell[2] ; k <= iMaxCell[2] ; k++) + { + int idCell = getCellIndex(i, j, k); + +//printf("DEBUG: visited cell(%d %d %d) -> %d\n", i, j, k, idCell); + + vector& cell = mGrid[idCell]; + + // for all the points in the current cell + for (vector::const_iterator itPoint = cell.begin() ; itPoint != cell.end() ; itPoint++) + { + const PointOfField& currentPt = *itPoint; + + // test if currentPt is in the sphere ((x, y, z), r) + med_float vecX = currentPt.mXYZ[0] - pCenterX; + med_float vecY = currentPt.mXYZ[1] - pCenterY; + med_float vecZ = currentPt.mXYZ[2] - pCenterZ; + + med_float norm = med_float( sqrt( vecX*vecX + vecY*vecY + vecZ*vecZ ) ); + if (norm < pRadius) + { + // only add the point if it is different from (x, y, z) + if ((currentPt.mXYZ[0] != pCenterX) || + (currentPt.mXYZ[1] != pCenterY) || + (currentPt.mXYZ[2] != pCenterZ)) + { + res.push_back(currentPt); + } + } + } + } + } + } + + return res; +} + + +void DecimationAccelGrid::computeBBox(const std::vector& pPts) +{ + for (int itDim = 0 ; itDim < 3 ; itDim++) + { + mMin[itDim] = numeric_limits::max(); + mMax[itDim] = -mMin[itDim]; + } + + for (unsigned i = 0 ; i < pPts.size() ; i++) + { + for (int itDim = 0 ; itDim < 3 ; itDim++) + { + med_float coord = pPts[i].mXYZ[itDim]; + if (coord < mMin[itDim]) mMin[itDim] = coord; + if (coord > mMax[itDim]) mMax[itDim] = coord; + } + } + + mInvLen[0] = med_float(mSize[0]) / (mMax[0] - mMin[0]); + mInvLen[1] = med_float(mSize[1]) / (mMax[1] - mMin[1]); + mInvLen[2] = med_float(mSize[2]) / (mMax[2] - mMin[2]); +} + + +ostream& operator<<(ostream& pOs, DecimationAccelGrid& pG) +{ + pOs << "DecimationAccelGrid:" << endl; + pOs << " Num=" << pG.mNum << endl; + pOs << " Size=" << pG.mSize[0] << " x " << pG.mSize[1] << " x " << pG.mSize[2] << endl; + pOs << " BBox=[" << pG.mMin[0] << " ; " << pG.mMax[0] << "] x [" << pG.mMin[1] << " ; " << pG.mMax[1] << "] x [" << pG.mMin[2] << " ; " << pG.mMax[2] << "]" << endl; + pOs << " Inv len.=" << pG.mInvLen[0] << " ; " << pG.mInvLen[1] << " ; " << pG.mInvLen[2] << endl; + + if (pG.mFlagPrintAll) + { + int checkNumCells = 0; + int numCells = pG.mSize[0] * pG.mSize[1] * pG.mSize[2]; + for (int i = 0 ; i < numCells ; i++) + { + vector& cell = pG.mGrid[i]; + cout << " Cell " << i << ": #=" << cell.size() << ": " << endl; + for (unsigned j = 0 ; j < cell.size() ; j++) + { + cout << " " << cell[j] << endl; + } + checkNumCells += cell.size(); + } + + if (pG.mNum != checkNumCells) throw IllegalStateException("", __FILE__, __LINE__); + } + + return pOs; +} + + +} // namespace multipr + +// EOF diff --git a/src/MULTIPR/MULTIPR_DecimationAccel.hxx b/src/MULTIPR/MULTIPR_DecimationAccel.hxx new file mode 100644 index 0000000..f85f846 --- /dev/null +++ b/src/MULTIPR/MULTIPR_DecimationAccel.hxx @@ -0,0 +1,258 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_DecimationAccel.hxx + * + * \brief Interface DecimationAccel: acceleration structure used for decimation. + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +#ifndef MULTIPR_DECIMATION_ACCEL_HXX +#define MULTIPR_DECIMATION_ACCEL_HXX + +//***************************************************************************** +// Includes section +//***************************************************************************** + +extern "C" +{ + #include "med.h" +} + +#include +#include + + +namespace multipr +{ + +//***************************************************************************** +// Predeclaration +//***************************************************************************** + +class PointOfField; + + +//***************************************************************************** +// Interface DecimationAccel +//***************************************************************************** + +class DecimationAccel +{ +public: + + /** + * Builds an empty DecimationAccel (default constructor). + */ + DecimationAccel() { /* do nothing */ } + + /** + * Destructor. Removes everything. + */ + virtual ~DecimationAccel() { /* do nothing */ } + + //--------------------------------------------------------------------- + // Algorithms + //--------------------------------------------------------------------- + + /** + * Interface. Configures this acceleration structure. String is used for genericity. + * \param pArgv all the configuration parameters in a string. + */ + virtual void configure(const char* pArgv) = 0; + + /** + * Interface. Creates a new acceleration structure and fills it with the given list of points. + * \param pPts list of points to be inserted in the acceleration structure. + */ + virtual void create(const std::vector& pPts) = 0; + + /** + * Interface. Finds all the points in a sphere defined by its center (x,y,z) and its radius. + * \param pCenterX x-coordinates of the center of the sphere. + * \param pCenterY y-coordinates of the center of the sphere. + * \param pCenterZ z-coordinates of the center of the sphere. + * \param pRadius radius of the sphere. + * \return all the points in a sphere defined by its center (x,y,z) and its radius. + */ + virtual std::vector findNeighbours( + med_float pCenterX, + med_float pCenterY, + med_float pCenterZ, + med_float pRadius) const = 0; + + //--------------------------------------------------------------------- + // I/O + //--------------------------------------------------------------------- + + /** + * Sets the flag which control the stream operator <<. + * \param pFlag new flag value. + */ + void setPrintAll(bool pFlag) { mFlagPrintAll = pFlag; } + + /** + * Dumps any GaussLoc to the given output stream. + * \param pOs any output stream. + * \param pA any DecimationAccel. + * \return the output stream pOs. + */ + friend std::ostream& operator<<(std::ostream& pOs, DecimationAccel& pA); + +protected: + + bool mFlagPrintAll; /** Flag to control the behaviour of the stream operator <<. */ + +private: + + // do not allow copy constructor + DecimationAccel(const DecimationAccel&); + + // do not allow copy + DecimationAccel& operator=(const DecimationAccel&); + + // do not allow operator == + bool operator==(const DecimationAccel&); + +}; // class DecimationAccel + + +//***************************************************************************** +// Interface DecimationFilter and factory to build filters. +//***************************************************************************** + +class DecimationAccelGrid : public DecimationAccel +{ +public: + + /** + * Builds an empty DecimationAccelGrid (default constructor). + */ + DecimationAccelGrid(); + + /** + * Destructor. Removes everything. + */ + virtual ~DecimationAccelGrid(); + + /** + * Resets this object in its state by default (empty). Cleans memory. + */ + void reset(); + + //--------------------------------------------------------------------- + // Algorithms + //--------------------------------------------------------------------- + + /** + * Configures this acceleration structure. String is used for genericity. + * \param pArgv assumes "size_x size_y size_z": number of cells along each axis. + */ + virtual void configure(const char* pArgv); + + /** + * Creates a new acceleration structure and fills it with the given list of points. + * setSize() must have been called before. + * \param pPts list of points to be inserted in the acceleration structure. + * \throw IllegalStateException if setSize() has not been called before. + */ + virtual void create(const std::vector& pPts); + + /** + * Finds all the points in a sphere defined by its center (x,y,z) and its radius. + * \param pCenterX x-coordinates of the center of the sphere. + * \param pCenterY y-coordinates of the center of the sphere. + * \param pCenterZ z-coordinates of the center of the sphere. + * \param pRadius radius of the sphere. + * \return all the points in a sphere defined by its center (x,y,z) and its radius. + */ + virtual std::vector findNeighbours( + med_float pCenterX, + med_float pCenterY, + med_float pCenterZ, + med_float pRadius) const; + + /** + * Returns the coordinates of the cell which contain the point (x,y,z). + * Clamping is performed on (pIx, pIy, pIz) to avoid out of bounds. + * \param pX (in) X-coordinates of the point. + * \param pY (in) Y-coordinates of the point. + * \param pZ (in) Z-coordinates of the point. + * \param pIx (out) X-index of the cell which contain the point (x,y,z). + * \param pIy (out) Y-index. + * \param pIz (out) Z-index. + */ + void getCellCoord( + med_float pX, med_float pY, med_float pZ, + int* pIx, int* pIy, int* pIz) const; + + /** + * Returns the index of the cell whose coordinates are (i, j, k). + * \param pI + * \param pJ + * \param pK + * \return the index of the cell (i, j, k). + */ + int getCellIndex(int pI, int pJ, int pK) const; + + /** + * Returns the list of points contained in the cell of pPt. + * \param pPt any point which coordinates are in the bbox of this acceleration structure. + * \return the list of points contained in the cell of pPt. + */ + std::vector& getCell(const PointOfField& pPt); + + //--------------------------------------------------------------------- + // I/O + //--------------------------------------------------------------------- + + /** + * Dumps any GaussLoc to the given output stream. + * \param pOs any output stream. + * \param pG any DecimationAccelGrid. + * \return the output stream pOs. + */ + friend std::ostream& operator<<(std::ostream& pOs, DecimationAccelGrid& pG); + +private: + + /** + * Computes the axis-aligned bounding box of a set of points. + * Sets the fields mMin/mMax. + * \param pPts list of points. + */ + void computeBBox(const std::vector& pPts); + +private: + + int mNum; /**< Number of points in the grid. */ + med_float mMin[3]; /**< Bounding box, min corner. */ + med_float mMax[3]; /**< Bounding box, max corner. */ + med_float mInvLen[3]; /**< 1/length of cells, along each dimension. */ + med_int mSize[3]; /**< Number of cells along each dimension. */ + std::vector* mGrid; /**< Flatten grid structure; each cell is a vector of PointOfField. */ + +private: + + // do not allow copy constructor + DecimationAccelGrid(const DecimationAccelGrid&); + + // do not allow copy + DecimationAccelGrid& operator=(const DecimationAccelGrid&); + + // do not allow operator == + bool operator==(const DecimationAccelGrid&); + +}; // class DecimationAccelGrid + + +} // namespace MULTIPR + + +#endif // MULTIPR_DECIMATION_ACCEL_HXX + +// EOF diff --git a/src/MULTIPR/MULTIPR_DecimationFilter.cxx b/src/MULTIPR/MULTIPR_DecimationFilter.cxx new file mode 100644 index 0000000..ef9e335 --- /dev/null +++ b/src/MULTIPR/MULTIPR_DecimationFilter.cxx @@ -0,0 +1,306 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_DecimationFilter.cxx + * + * \brief see MULTIPR_DecimationFilter.hxx + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +//***************************************************************************** +// Includes section +//***************************************************************************** + +#include "MULTIPR_DecimationFilter.hxx" +#include "MULTIPR_Field.hxx" +#include "MULTIPR_Mesh.hxx" +#include "MULTIPR_PointOfField.hxx" +#include "MULTIPR_DecimationAccel.hxx" +#include "MULTIPR_Exceptions.hxx" + +#include + +using namespace std; + + +namespace multipr +{ + + +//***************************************************************************** +// Class DecimationFilter implementation +//***************************************************************************** + +// factory +DecimationFilter* DecimationFilter::create(const char* pFilterName) +{ + if (pFilterName == NULL) throw NullArgumentException("filter name should not be NULL", __FILE__, __LINE__); + + if (strcmp(pFilterName, "Filtre_GradientMoyen") == 0) + { + return new DecimationFilterGradAvg(); + } + else + { + throw IllegalArgumentException("unknown filter", __FILE__, __LINE__); + } +} + + +//***************************************************************************** +// Class DecimationFilterGradAvg +//***************************************************************************** + +DecimationFilterGradAvg::DecimationFilterGradAvg() +{ + // do nothing +} + + +DecimationFilterGradAvg::~DecimationFilterGradAvg() +{ + // do nothing +} + + +Mesh* DecimationFilterGradAvg::apply(Mesh* pMesh, const char* pArgv, const char* pNameNewMesh) +{ + //--------------------------------------------------------------------- + // Retrieve and check parameters + //--------------------------------------------------------------------- + if (pMesh == NULL) throw NullArgumentException("pMesh should not be NULL", __FILE__, __LINE__); + if (pArgv == NULL) throw NullArgumentException("pArgv should not be NULL", __FILE__, __LINE__); + if (pNameNewMesh == NULL) throw NullArgumentException("pNameNewMesh should not be NULL", __FILE__, __LINE__); + + char fieldName[MED_TAILLE_NOM + 1]; + int fieldIt; + double threshold; + double radius; + int boxing; // number of cells along axis (if 100 then grid will have 100*100*100 = 10**6 cells) + + int ret = sscanf(pArgv, "%s %d %lf %lf %d", + fieldName, + &fieldIt, + &threshold, + &radius, + &boxing); + + if (ret != 5) throw IllegalArgumentException("wrong number of arguments for filter GradAvg; expected 5 parameters", __FILE__, __LINE__); + + //--------------------------------------------------------------------- + // Retrieve field = for each point: get its coordinate and the value of the field + //--------------------------------------------------------------------- + Field* field = pMesh->getFieldByName(fieldName); + + if (field == NULL) throw IllegalArgumentException("field not found", __FILE__, __LINE__); + if ((fieldIt < 1) || (fieldIt > field->getNumberOfTimeSteps())) throw IllegalArgumentException("invalid field iteration", __FILE__, __LINE__); + + vector points; + pMesh->getAllPointsOfField(field, fieldIt, points); + + //--------------------------------------------------------------------- + // Creates acceleration structure used to compute gradient + //--------------------------------------------------------------------- + DecimationAccel* accel = new DecimationAccelGrid(); + char strCfg[256]; // a string is used for genericity + sprintf(strCfg, "%d %d %d", boxing, boxing, boxing); + accel->configure(strCfg); + accel->create(points); + + //--------------------------------------------------------------------- + // Collects elements of the mesh to be kept + //--------------------------------------------------------------------- + set elementsToKeep; + + int numElements = pMesh->getNumberOfElements(); + int numGaussPointsByElt = points.size() / numElements; // for a TETRA10, should be 5 for a field of elements and 10 for a field of nodes + + // for each element + for (int itElt = 0 ; itElt < numElements ; itElt++) + { + bool keepElement = false; + + // for each Gauss point of the current element + for (int itPtGauss = 0 ; itPtGauss < numGaussPointsByElt ; itPtGauss++) + { + const PointOfField& currentPt = points[itElt * numGaussPointsByElt + itPtGauss]; + + vector neighbours = accel->findNeighbours( + currentPt.mXYZ[0], + currentPt.mXYZ[1], + currentPt.mXYZ[2], + radius); + + // if no neighbours => keep element + if (neighbours.size() == 0) + { + keepElement = true; + break; + } + + // otherwise compute gradient... + med_float normGrad = computeNormGrad(currentPt, neighbours); + + // debug + //cout << (itElt * numGaussPointsByElt + j) << ": " << normGrad << endl; + + if ((normGrad >= threshold) || isnan(normGrad)) + { + keepElement = true; + break; + } + } + + if (keepElement) + { + // add index of the element to keep (index must start at 1) + elementsToKeep.insert(itElt + 1); + } + } + + //--------------------------------------------------------------------- + // Cleans + //--------------------------------------------------------------------- + delete accel; + + //--------------------------------------------------------------------- + // Create the final mesh by extracting elements to keep from the current mesh + //--------------------------------------------------------------------- + Mesh* newMesh = pMesh->createFromSetOfElements(elementsToKeep, pNameNewMesh); + + return newMesh; +} + + +void DecimationFilterGradAvg::getGradientInfo( + Mesh* pMesh, + const char* pFieldName, + int pFieldIt, + double pRadius, + int pBoxing, + double* pOutGradMin, + double* pOutGradAvg, + double* pOutGradMax) +{ + if (pMesh == NULL) throw NullArgumentException("pMesh should not be NULL", __FILE__, __LINE__); + if (pFieldName == NULL) throw NullArgumentException("pFieldName should not be NULL", __FILE__, __LINE__); + + Field* field = pMesh->getFieldByName(pFieldName); + + if (field == NULL) throw IllegalArgumentException("field not found", __FILE__, __LINE__); + if ((pFieldIt < 1) || (pFieldIt > field->getNumberOfTimeSteps())) throw IllegalArgumentException("invalid field iteration", __FILE__, __LINE__); + + vector points; + pMesh->getAllPointsOfField(field, pFieldIt, points); + + //--------------------------------------------------------------------- + // Creates acceleration structure used to compute gradient + //--------------------------------------------------------------------- + DecimationAccel* accel = new DecimationAccelGrid(); + char strCfg[256]; // a string is used for genericity + sprintf(strCfg, "%d %d %d", pBoxing, pBoxing, pBoxing); + accel->configure(strCfg); + accel->create(points); + + //--------------------------------------------------------------------- + // Collects elements of the mesh to be kept + //--------------------------------------------------------------------- + + int numElements = pMesh->getNumberOfElements(); + int numGaussPointsByElt = points.size() / numElements; // for a TETRA10, should be 5 for a field of elements and 10 for a field of nodes + + *pOutGradMax = -1e300; + *pOutGradMin = 1e300; + *pOutGradAvg = 0.0; + int count = 0; + + // for each element + for (int itElt = 0 ; itElt < numElements ; itElt++) + { + // for each Gauss point of the current element + for (int itPtGauss = 0 ; itPtGauss < numGaussPointsByElt ; itPtGauss++) + { + const PointOfField& currentPt = points[itElt * numGaussPointsByElt + itPtGauss]; + + vector neighbours = accel->findNeighbours( + currentPt.mXYZ[0], + currentPt.mXYZ[1], + currentPt.mXYZ[2], + pRadius); + + // if no neighbours => keep element + if (neighbours.size() == 0) + { + continue; + } + + // otherwise compute gradient... + med_float normGrad = computeNormGrad(currentPt, neighbours); + + // debug + //cout << (itElt * numGaussPointsByElt + j) << ": " << normGrad << endl; + + if (!isnan(normGrad)) + { + if (normGrad > *pOutGradMax) *pOutGradMax = normGrad; + if (normGrad < *pOutGradMin) *pOutGradMin = normGrad; + *pOutGradAvg += normGrad; + count++; + } + } + } + + if (count != 0) *pOutGradAvg /= double(count); + + //--------------------------------------------------------------------- + // Cleans + //--------------------------------------------------------------------- + delete accel; +} + + +med_float DecimationFilterGradAvg::computeNormGrad(const PointOfField& pPt, const std::vector& pNeighbours) const +{ + med_float gradX = 0.0; + med_float gradY = 0.0; + med_float gradZ = 0.0; + + // for each neighbour + for (unsigned i = 0 ; i < pNeighbours.size() ; i++) + { + const PointOfField& neighbourPt = pNeighbours[i]; + + med_float vecX = neighbourPt.mXYZ[0] - pPt.mXYZ[0]; + med_float vecY = neighbourPt.mXYZ[1] - pPt.mXYZ[1]; + med_float vecZ = neighbourPt.mXYZ[2] - pPt.mXYZ[2]; + + med_float norm = med_float( sqrt( vecX*vecX + vecY*vecY + vecZ*vecZ ) ); + med_float val = neighbourPt.mVal - pPt.mVal; + + val /= norm; + + gradX += vecX * val; + gradY += vecY * val; + gradZ += vecZ * val; + } + + med_float invSize = 1.0 / med_float(pNeighbours.size()); + + gradX *= invSize; + gradY *= invSize; + gradZ *= invSize; + + med_float norm = med_float( sqrt( gradX*gradX + gradY*gradY + gradZ*gradZ ) ); + + return norm; + +} + + +} // namespace multipr + +// EOF diff --git a/src/MULTIPR/MULTIPR_DecimationFilter.hxx b/src/MULTIPR/MULTIPR_DecimationFilter.hxx new file mode 100644 index 0000000..828da59 --- /dev/null +++ b/src/MULTIPR/MULTIPR_DecimationFilter.hxx @@ -0,0 +1,167 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_DecimationFilter.hxx + * + * \brief Interface DecimationFilter: filter used for decimation. + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +#ifndef MULTIPR_DECIMATION_FILTER_HXX +#define MULTIPR_DECIMATION_FILTER_HXX + +//***************************************************************************** +// Includes section +//***************************************************************************** + +extern "C" +{ + #include "med.h" +} + +#include +#include + + +namespace multipr +{ + +//***************************************************************************** +// Predeclaration +//***************************************************************************** + +class Mesh; +class PointOfField; + + +//***************************************************************************** +// Interface DecimationFilter and factory to build filters. +//***************************************************************************** + +class DecimationFilter +{ +public: + /** + * Decimation filter factory. + * \param pFilterName name of the filter to be instanciated. + * \return a new instance of the given filter. + */ + static DecimationFilter* create(const char* pFilterName); + +public: + + /** + * Builds an empty DecimationFilter (default constructor). + */ + DecimationFilter() { } + + /** + * Destructor. Removes everything. + */ + virtual ~DecimationFilter() { } + + /** + * Interface. Creates a new Mesh by decimating the given Mesh with this DecimationFilter. + * \param pMesh any mesh to be decimated; must not be NULL. + * \param pArgv all the arguments of the filter as a string; must not be NULL. + * \param pNameNewMesh name of the decimated mesh; must not be NULL. + * \return the decimated mesh. + */ + virtual Mesh* apply(Mesh* pMesh, const char* pArgv, const char* pNameNewMesh) = 0; + +private: + + // do not allow copy constructor + DecimationFilter(const DecimationFilter&); + + // do not allow copy + DecimationFilter& operator=(const DecimationFilter&); + + // do not allow operator == + bool operator==(const DecimationFilter&); + +}; // class DecimationFilter + + +//***************************************************************************** +// Filter : Average Gradient +//***************************************************************************** + +class DecimationFilterGradAvg : public DecimationFilter +{ +public: + + /** + * Builds an empty DecimationFilterGradAvg (default constructor). + */ + DecimationFilterGradAvg(); + + /** + * Destructor. Removes everything. + */ + virtual ~DecimationFilterGradAvg(); + + /** + * Creates a new Mesh by decimating the given Mesh with this DecimationFilter. + * + * For each element + * Keep this element if all its points (related to a field) have a |gradient| > threshold. + * + * For each point, gradient is computed by considering all the neighbours in a sphere of radius r. + * + * \param pMesh any mesh to be decimated; must not be NULL. + * \param pArgv all the arguments of the filter as a string; must not be NULL. + * for GradAvg, expected "fieldName fieldIt threshold radius boxing" (5 parameters). + * \param pNameNewMesh name of the decimated mesh; must not be NULL. + * \return the decimated mesh. + */ + virtual Mesh* apply(Mesh* pMesh, const char* pArgv, const char* pNameNewMesh); + + /** + * Returns information about gradient. + */ + void getGradientInfo( + Mesh* pMesh, + const char* pFieldName, + int pFieldIt, + double pRadius, + int pBoxing, + double* pOutGradMin, + double* pOutGradAvg, + double* pOutGradMax); + +private: + + /** + * Returns the norm of the gradient of the field at the given point. + * Sub-method used by apply(). + * \param pPt any point in the field. + * \param pNeigbours neighbourhood of pPt. + * \return the norm of the gradient of the field in pPt. + */ + med_float computeNormGrad(const PointOfField& pPt, const std::vector& pNeighbours) const; + +private: + + // do not allow copy constructor + DecimationFilterGradAvg(const DecimationFilterGradAvg&); + + // do not allow copy + DecimationFilterGradAvg& operator=(const DecimationFilterGradAvg&); + + // do not allow operator == + bool operator==(const DecimationFilterGradAvg&); + +}; // class DecimationFilterGradAvg + + +} // namespace MULTIPR + + +#endif // MULTIPR_DECIMATION_FILTER_HXX + +// EOF diff --git a/src/MULTIPR/MULTIPR_Elements.cxx b/src/MULTIPR/MULTIPR_Elements.cxx new file mode 100644 index 0000000..226267e --- /dev/null +++ b/src/MULTIPR/MULTIPR_Elements.cxx @@ -0,0 +1,459 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_Elements.cxx + * + * \brief see MULTIPR_Elements.hxx + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +//***************************************************************************** +// Includes section +//***************************************************************************** + +#include "MULTIPR_Elements.hxx" +#include "MULTIPR_Nodes.hxx" +#include "MULTIPR_Exceptions.hxx" + +#include +#include +#include + +using namespace std; + + +namespace multipr +{ + + +//***************************************************************************** +// Class Elements implementation +//***************************************************************************** + +Elements::Elements() +{ + mId = NULL; + mFamIdent = NULL; + mNames = NULL; + mCon = NULL; + + reset(); +} + + +Elements::~Elements() +{ + reset(); +} + + +void Elements::reset() +{ + mNum = 0; + mEntity = MED_MAILLE; + mGeom = MED_NONE; + mNumNodesByElt = 0; + mDim = 0; + + if (mId != NULL) { delete[] mId; mId = NULL; } + if (mFamIdent != NULL) { delete[] mFamIdent; mFamIdent = NULL; } + if (mNames != NULL) { delete[] mNames; mNames = NULL; } + if (mCon != NULL) { delete[] mCon; mCon = NULL; } + + mSetOfNodes.clear(); + + mFlagPrintAll = false; +} + + +med_int Elements::getFamilyIdentifier(med_int pIndex) const +{ + if ((pIndex < 0) || (pIndex >= mNum)) throw IndexOutOfBoundsException("", __FILE__, __LINE__); + + return mFamIdent[pIndex]; +} + + +const med_int* Elements::getConnectivity(int pIndex) const +{ + if ((pIndex < 0) || (pIndex >= mNum)) throw IndexOutOfBoundsException("", __FILE__, __LINE__); + + return mCon + mNumNodesByElt * pIndex; +} + + +void Elements::getCoordinates(med_int pIndexElt, const Nodes* pNodes, med_float* pCoo, int pFirst) const +{ + if ((pIndexElt < 0) || (pIndexElt >= mNum)) throw IndexOutOfBoundsException("", __FILE__, __LINE__); + if (pNodes == NULL) throw NullArgumentException("", __FILE__, __LINE__); + if (pCoo == NULL) throw NullArgumentException("", __FILE__, __LINE__); + + // get the list of nodes of the element + const med_int* con = getConnectivity(pIndexElt); + + med_float* destCoo = pCoo; + int size = sizeof(med_float) * mDim; + + // for each node of the element + int n = (mNumNodesByElt < pFirst) ? mNumNodesByElt : pFirst; + for (int i = 0 ; i < n ; i++) + { + // get index of node (MED index start at 1) + med_int indexNode = con[i] - 1; + + // get coordinates of this node + const med_float* srcCoo = pNodes->getCoordinates(indexNode); + + // copy coordinates to destCoo + memcpy(destCoo, srcCoo, size); + + // prepare next point + destCoo += mDim; + } +} + + +Elements* Elements::extractSubSet(const set& pSetIndices) const +{ + Elements* subset = new Elements(); + + //--------------------------------------------------------------------- + // Copy parameters + //--------------------------------------------------------------------- + subset->mNum = pSetIndices.size(); + subset->mEntity = mEntity; + subset->mGeom = mGeom; // e.g. 310 for a TETRA10 + subset->mNumNodesByElt = mNumNodesByElt; // e.g. 10 for a TETRA10 + subset->mDim = mDim; // e.g. 3 for a TETRA10 + + //--------------------------------------------------------------------- + // Allocate arrays + //--------------------------------------------------------------------- + subset->mFamIdent = new med_int[subset->mNum]; + subset->mCon = new med_int[mNumNodesByElt * subset->mNum]; + + //--------------------------------------------------------------------- + // Copy subset of familys id and connectivity. + //--------------------------------------------------------------------- + med_int* destCon = subset->mCon; + set::iterator itSet = pSetIndices.begin(); + for (int itElt = 0 ; itElt < subset->mNum; itElt++) + { + med_int srcIndex = (*itSet) - 1; // MED index start at 1 + subset->mFamIdent[itElt] = mFamIdent[srcIndex]; + + med_int* srcCon = mCon + srcIndex * mNumNodesByElt; + memcpy(destCon, srcCon, sizeof(med_int) * mNumNodesByElt); + + destCon += mNumNodesByElt; + itSet++; + } + + //--------------------------------------------------------------------- + // Copy subset of identifiers if necessary + //--------------------------------------------------------------------- + if (isIdentifiers()) + { + itSet = pSetIndices.begin(); + subset->mId = new med_int[subset->mNum]; + for (int itElt = 0 ; itElt < subset->mNum; itElt++) + { + med_int srcIndex = (*itSet) - 1; // MED index start at 1 + subset->mId[itElt] = mId[srcIndex]; + + itSet++; + } + } + + //--------------------------------------------------------------------- + // Copy subset of names if necessary + //--------------------------------------------------------------------- + if (isNames()) + { + itSet = pSetIndices.begin(); + subset->mNames = new char[MED_TAILLE_PNOM * subset->mNum + 1]; + char* destPtr = subset->mNames; + for (int itElt = 0 ; itElt < subset->mNum; itElt++) + { + med_int srcIndex = (*itSet) - 1; // MED index start at 1 + char* srcPtr = mNames + srcIndex * MED_TAILLE_PNOM; + memcpy(destPtr, srcPtr, MED_TAILLE_PNOM); + + destPtr += MED_TAILLE_PNOM; + itSet++; + } + subset->mNames[MED_TAILLE_PNOM * subset->mNum] = '\0'; + } + + return subset; +} + + +const set& Elements::getSetOfNodes() +{ + // lazy get: test if mSetOfNodes has already been built + if (mSetOfNodes.size() == 0) + { + buildSetOfNodes(); + } + + return mSetOfNodes; +} + + +set Elements::getSetOfFamilies() const +{ + // set of families is empty at the beginning + set setOfFamilies; + + // for each element, add its family to the set + for (int itElt = 0 ; itElt < mNum ; itElt++) + { + setOfFamilies.insert(mFamIdent[itElt]); + } + + return setOfFamilies; +} + + +void Elements::remap() +{ + // build set of nodes if necessary + if (mSetOfNodes.size() == 0) + { + buildSetOfNodes(); + } + + // build the map for indices convertion + map mapOldIndexToNewIndex; + med_int newIndex = 1; // MED index start at 1 + for (set::iterator itSet = mSetOfNodes.begin(); itSet != mSetOfNodes.end() ; itSet++) + { + med_int oldIndex = (*itSet); + mapOldIndexToNewIndex.insert(make_pair(oldIndex, newIndex)); + newIndex++; + } + + // for each node referenced by this set of elements + for (int itNode = 0, size = mNum * mNumNodesByElt ; itNode < size ; itNode++) + { + // convert old index to new index (remap) + mCon[itNode] = mapOldIndexToNewIndex[mCon[itNode]]; + } + + buildSetOfNodes(); +} + + +void Elements::buildSetOfNodes() +{ + if (mSetOfNodes.size() != 0) + { + mSetOfNodes.clear(); + } + + // for each node referenced by this set of elements + for (int itNode = 0, size = mNum * mNumNodesByElt ; itNode < size ; itNode++) + { + // add the node to the set + mSetOfNodes.insert(mCon[itNode]); + } +} + + +void Elements::readMED( + med_idt pMEDfile, + char* pMeshName, + med_int pMeshDim, + med_entite_maillage pEntity, + med_geometrie_element pGeom) +{ + if (pMEDfile == 0) throw IOException("", __FILE__, __LINE__); + if (pMeshName == NULL) throw NullArgumentException("", __FILE__, __LINE__); + if ((pMeshDim < 1) || (pMeshDim > 3)) throw IllegalArgumentException("", __FILE__, __LINE__); + + reset(); + + mEntity = pEntity; + mGeom = pGeom; + mNumNodesByElt = mGeom % 100; + mDim = mGeom / 100; + + mNum = MEDnEntMaa( + pMEDfile, + pMeshName, + MED_CONN, // type of information requested = CONNECTIVITY + pEntity, + pGeom, + MED_NOD); // nodal connectivity + + if (mNum < 0) throw IOException("i/o error while reading information about elements in MED file", __FILE__, __LINE__); + + mCon = new med_int[mNumNodesByElt * mNum]; + mNames = new char[MED_TAILLE_PNOM * mNum + 1]; + mId = new med_int[mNum]; + mFamIdent = new med_int[mNum]; + med_booleen isNames; + med_booleen isIdentifiers; + + med_err ret = MEDelementsLire( + pMEDfile, + pMeshName, + pMeshDim, + mCon, + MED_FULL_INTERLACE, + mNames, + &isNames, + mId, + &isIdentifiers, + mFamIdent, + mNum, + mEntity, + mGeom, + MED_NOD); // NODAL CONNECTIVITY + + if (ret != 0) throw IOException("i/o error while reading elements in MED file", __FILE__, __LINE__); + + if (!isNames) + { + delete[] mNames; + mNames = NULL; + } + + if (!isIdentifiers) + { + delete[] mId; + mId = NULL; + } +} + + +void Elements::writeMED(med_idt pMEDfile, char* pMeshName, med_int pMeshDim) +{ + if (pMEDfile == 0) throw IOException("", __FILE__, __LINE__); + if (pMeshName == NULL) throw NullArgumentException("", __FILE__, __LINE__); + if (strlen(pMeshName) > MED_TAILLE_NOM) throw IllegalArgumentException("", __FILE__, __LINE__); + if ((pMeshDim < 1) || (pMeshDim > 3)) throw IllegalArgumentException("", __FILE__, __LINE__); + + // special case: if no elements => do nothing + if (mNum == 0) return; + + med_err ret = MEDelementsEcr( + pMEDfile, + pMeshName, + pMeshDim, + mCon, + MED_FULL_INTERLACE, + mNames, + isNames()?MED_VRAI:MED_FAUX, + mId, + isIdentifiers()?MED_VRAI:MED_FAUX, + mFamIdent, + mNum, + mEntity, + mGeom, + MED_NOD); // NODAL CONNECTIVITY + + if (ret != 0) throw IOException("i/o error while writing elements in MED file", __FILE__, __LINE__); +} + + +ostream& operator<<(ostream& pOs, Elements& pE) +{ + char strEntity[16]; + switch (pE.mEntity) + { + case MED_MAILLE: strcpy(strEntity, "MED_MAILLE"); break; + case MED_FACE: strcpy(strEntity, "MED_FACE"); break; + case MED_ARETE: strcpy(strEntity, "MED_ARETE"); break; + case MED_NOEUD: strcpy(strEntity, "MED_NOEUD"); break; + default: strcpy(strEntity, "UNKNOWN"); break; + } + + pOs << "Elements: " << endl; + pOs << " #number =" << pE.mNum << endl; + pOs << " Entity =" << strEntity << endl; + pOs << " Geom =" << pE.mGeom << endl; + pOs << " Has names?" << (pE.isNames()?"yes":"no") << endl; + pOs << " Has id ?" << (pE.isIdentifiers()?"yes":"no") << endl; + + { + set setOfFam = pE.getSetOfFamilies(); + if (setOfFam.size() == 0) + { + pOs << " Families: #fam=0" << endl; + } + else + { + set::iterator itFam = setOfFam.end(); + itFam--; + pOs << " Families: #fam=" << setOfFam.size() << " id_min=" << (*(setOfFam.begin())) << " id_max=" << (*itFam) << endl; + + if (pE.mFlagPrintAll) + { + for (int i = 0 ; i < pE.mNum; i++) + { + pOs << " Elt " << (i + 1) << ": " << pE.mFamIdent[i] << endl; + } + } + } + } + + { + set setOfNodes = pE.getSetOfNodes(); + if (setOfNodes.size() == 0) + { + pOs << " Connectivity: #nodes=0" << endl; + } + else + { + set::iterator itNode = setOfNodes.end(); + itNode--; + pOs << " Connectivity: #nodes=" << setOfNodes.size() << " id_min=" << (*(setOfNodes.begin())) << " id_max=" << (*itNode) << endl; + + if (pE.mFlagPrintAll) + { + for (int i = 0 ; i < pE.mNum ; i++) + { + pOs << " Elt " << (i + 1) << ": "; + for (int j = 0 ; j < pE.mNumNodesByElt ; j++) + { + pOs << pE.mCon[i * pE.mNumNodesByElt + j] << " "; + } + pOs << endl; + } + } + } + } + + if (pE.mFlagPrintAll) + { + + if (pE.isIdentifiers()) + { + pOs << " Num (identifier): " << endl; + for (int i = 0 ; i < pE.mNum; i++) + { + pOs << " Elt " << (i + 1) << ": " << pE.mId[i] << " " << endl; + } + } + + if (pE.isNames()) + { + pE.mNames[MED_TAILLE_PNOM * pE.mNum] = '\0'; + pOs << " Names: |" << pE.mNames << "|" << endl; + } + + } + + return pOs; +} + + +} // namespace multipr + +// EOF diff --git a/src/MULTIPR/MULTIPR_Elements.hxx b/src/MULTIPR/MULTIPR_Elements.hxx new file mode 100644 index 0000000..178aa4c --- /dev/null +++ b/src/MULTIPR/MULTIPR_Elements.hxx @@ -0,0 +1,248 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_Elements.hxx + * + * \brief Class Elements = table of elements in a mesh. + * All elements share the same type (e.g. MED_MAILLE) and the same geometric description (e.g. TETRA10). + * Each element has a family and a table of connectivity. + * Optional: each element has a name and an id. + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +#ifndef MULTIPR_ELEMENTS_HXX +#define MULTIPR_ELEMENTS_HXX + +//***************************************************************************** +// Includes section +//***************************************************************************** + +extern "C" +{ + #include "med.h" +} + +#include + + +namespace multipr +{ + +//***************************************************************************** +// Predeclaration +//***************************************************************************** + +class Nodes; + + +//***************************************************************************** +// Class Elements +//***************************************************************************** + +class Elements +{ +public: + + /** + * Builds an empty set of elements (default constructor). + */ + Elements(); + + /** + * Destructor. Removes everything. + */ + ~Elements(); + + /** + * Resets this object in its state by default (empty). Cleans memory. + */ + void reset(); + + //--------------------------------------------------------------------- + // Basic accessors/mutators + //--------------------------------------------------------------------- + + /** + * Returns true iff this object contains no elements (table of elements is empty). + * \return true iff this object contains no elements. + */ + bool isEmpty() const { return (mNum == 0); } + + /** + * Returns true iff elements have a name. + * \return true iff elements have a name. + */ + bool isNames() const { return (mNames != NULL); } + + /** + * Returns true iff elements have an identifier (= a number). + * \return true iff elements have an identifier (= a number). + */ + bool isIdentifiers() const { return (mId != NULL); } + + /** + * Returns the number of elements. + * \return the number of elements. + */ + int getNumberOfElements() const { return mNum; } + + /** + * Returns the type of primitives (e.g. MED_TETRA10). + * \return the type of primitives + */ + med_geometrie_element getTypeOfPrimitives() const { return mGeom; } + + /** + * Returns the number of nodes that composed an element. + * \return the number of nodes that composed an element. + */ + int getNumberOfNodesByElement() const { return mNumNodesByElt; } + + /** + * Returns the family associated with an element. + * \param pIndex index of any element in [0..NUMBER_OF_ELEMENTS-1]. + * \return the family associated with an element. + * \throw IndexOutOfBoundsException if pIndex is invalid. + */ + med_int getFamilyIdentifier(med_int pIndex) const; + + /** + * Returns the connectivity of one element. + * \param pIndex must be in [0..NUMBER_OF_ELEMENTS-1]. + * \return a pointer towards the table of connectivity of the element. + * \throw IndexOutOfBoundsException if pIndex is invalid. + */ + const med_int* getConnectivity(int pIndex) const; + + /** + * Returns the coordinates of all the nodes of one element. + * \param pIndexElt must be in [0..NUMBER_OF_ELEMENTS-1]. + * \param pNodes table of nodes, used to retrieve coordinates. + * \param pCoo (out) table of coordinates of nodes (e.g. 30 = 3 * 10 med_float for a TETRA10). + * \param pFirst only get the pFirst coordinates. + * \throw IndexOutOfBoundsException if pIndex is invalid. + */ + void getCoordinates(med_int pIndexElt, const Nodes* pNodes, med_float* pCoo, int pFirst = 100) const; + + //--------------------------------------------------------------------- + // Algorithms + //--------------------------------------------------------------------- + + /** + * Constructor. Creates a subset of this set of elements from a set of indices. + * \param pSetIndices set of indices (start at 1). + * \return a restriction of this set of elements. + */ + Elements* extractSubSet(const std::set& pSetIndices) const; + + /** + * Returns the set of indices (starting at 1) of all nodes used by this set of elements. + * \return the set of indices of all nodes used by this set of elements. + */ + const std::set& getSetOfNodes(); + + /** + * Returns the set of families referenced by this set of elements. + * Each family is described by its identifier. + * \return Returns the set of families referenced by this set of elements. + */ + std::set getSetOfFamilies() const; + + /** + * Remaps this set of elements such that indices of nodes are continous 1 2 3 4 5 ... * + * This method is intended to be used after extractSubSet(). + */ + void remap(); + + //--------------------------------------------------------------------- + // I/O + //--------------------------------------------------------------------- + + /** + * Reads a set of elements from a MED file. + * You must give: name of mesh, dimension of the mesh, type of entity and type of elements. + * \param pMEDfile any valid MED file opened for reading. + * \param pMeshName name of the mesh. + * \param pMeshDim dimension of the mesh. + * \param pEntity entity to be read (e.g. MED_MAILLE). + * \param pGeom type of primitves to be read (e.g. MED_TETRA10). + * \throw IOException if any i/o error occurs. + */ + void readMED( + med_idt pMEDfile, + char* pMeshName, + med_int pMeshDim, + med_entite_maillage pEntity, + med_geometrie_element pGeom); + + /** + * Writes this set of elements to a MED file. + * WARNING: mesh must have been created and added to the MED file before. + * \param pMEDfile any valid MED file opened for writing. + * \param pMeshName name of the mesh. + * \param pMeshDim dimension of the mesh. + * \throw IOException if any i/o error occurs. + */ + void writeMED(med_idt pMEDfile, char* pMeshName, med_int pMeshDim); + + /** + * Sets the flag which control the stream operator <<. + * \param pFlag new flag value. + */ + void setPrintAll(bool pFlag) { mFlagPrintAll = pFlag; } + + /** + * Dumps any Elements to the given output stream. + * \param pOs any output stream. + * \param pE any Elements. + * \return the output stream pOs. + */ + friend std::ostream& operator<<(std::ostream& pOs, Elements& pE); + +private: + + /** + * Builds the set of nodes used by this set of elements. + * If the set already exist, then it is cleared and a new set is computed. + */ + void buildSetOfNodes(); + +private: + + med_int mNum; /**< Number of elements. */ + med_entite_maillage mEntity; /**< Type of entity, e.g. MED_MAILLE. */ + med_geometrie_element mGeom; /**< Type of primitive, e.g. MED_TETRA10. */ + int mDim; /**< Dimension of elements = mGeom / 100. */ + int mNumNodesByElt; /**< Number of nodes by element = mGeom % 100. */ + med_int* mId; /**< Optional; for each element, its identifier; NULL if undefined. */ + med_int* mFamIdent; /**< For each element, its family (identifier). */ + char* mNames; /**< Optional; for each element, its name; NULL if undefined. */ + med_int* mCon; /**< For each element, list of nodes (index in 1..*) = table of connectivity. */ + std::set mSetOfNodes; /**< Set of all nodes used by this set of elements. */ + + bool mFlagPrintAll; /** Flag to control the behaviour of the stream operator <<. */ + +private: + + // do not allow copy constructor + Elements(const Elements&); + + // do not allow copy + Elements& operator=(const Elements&); + + // do not allow operator == + bool operator==(const Elements&); + +}; // class Elements + + +} // namespace MULTIPR + + +#endif // MULTIPR_NODES_HXX + +// EOF diff --git a/src/MULTIPR/MULTIPR_Exceptions.hxx b/src/MULTIPR/MULTIPR_Exceptions.hxx new file mode 100644 index 0000000..2b25de1 --- /dev/null +++ b/src/MULTIPR/MULTIPR_Exceptions.hxx @@ -0,0 +1,203 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_Exceptions.hxx + * + * \brief All the exceptions used by MULTIPR. + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +#ifndef MULTIPR_EXCEPTIONS_HXX +#define MULTIPR_EXCEPTIONS_HXX + +//***************************************************************************** +// Includes section +//***************************************************************************** + +#include +#include + + +namespace multipr +{ + +//***************************************************************************** +// Class RuntimeException +// Super class for all exceptions used by the module MULTIPR +//***************************************************************************** + +class RuntimeException +{ +public: + + /** + * Constructor. Build a new RuntimeException. + * \param pMsg message to be associated with this exception. + * \param pFile name of the file where the probem occur (you can use the macro __FILE__); "unknown" by default. + * \param pLine number of the line where the probem occur (you can use the macro __LINE__); 0 by default. + */ + RuntimeException( + const std::string& pMsg, + const std::string& pFile = "unknown", + int pLine = 0) + { + mMsg = pMsg; + mFile = pFile; + mLine = pLine; + mType = "RuntimeException"; + } + + /** + * Dumps info about this exception to the given output stream. + */ + void dump(std::ostream& pOs) const + { + pOs << "MULTIPR: " << mType << " (" << mFile << ", line " << mLine << "): " << mMsg << std::endl; + } + +protected: + + std::string mMsg; /**< Message associated with this exception. */ + std::string mFile; /**< Name of the source file where the problem occurs. */ + int mLine; /**< Number of the line where the problem occurs. */ + std::string mType; /**< Type of this exception. */ +}; + + +//***************************************************************************** +// Class NullArgumentException +// Should be used for a NULL pointer +//***************************************************************************** + +class NullArgumentException : public RuntimeException +{ +public: + NullArgumentException( + const std::string& pMsg, + const std::string& pFile="unknown", + int pLine=0) : RuntimeException(pMsg, pFile, pLine) + { + mType = "NullArgumentException"; + } +}; + + +//***************************************************************************** +// Class IllegalArgumentException +// Should be used when a parameter is invalid (check precondition) +//***************************************************************************** + +class IllegalArgumentException : public RuntimeException +{ +public: + IllegalArgumentException( + const std::string& pMsg, + const std::string& pFile="unknown", + int pLine=0) : RuntimeException(pMsg, pFile, pLine) + { + mType = "IllegalArgumentException"; + } +}; + + +//***************************************************************************** +// Class IllegalStateException +// Should be used when the internal state of an object is invalid +//***************************************************************************** + +class IllegalStateException : public RuntimeException +{ +public: + IllegalStateException( + const std::string& pMsg, + const std::string& pFile="unknown", + int pLine=0) : RuntimeException(pMsg, pFile, pLine) + { + mType = "IllegalStateException"; + } +}; + + +//***************************************************************************** +// Class IndexOutOfBoundsException +// Should be used when an index is out of bounds +//***************************************************************************** + +class IndexOutOfBoundsException : public RuntimeException +{ +public: + IndexOutOfBoundsException( + const std::string& pMsg, + const std::string& pFile="unknown", + int pLine=0) : RuntimeException(pMsg, pFile, pLine) + { + mType = "IndexOutOfBoundsException"; + } +}; + + +//***************************************************************************** +// Class IOException +// Should be used when any i/o error occurs +//***************************************************************************** + +class IOException : public RuntimeException +{ +public: + IOException( + const std::string& pMsg, + const std::string& pFile="unknown", + int pLine=0) : RuntimeException(pMsg, pFile, pLine) + { + mType = "IOException"; + } +}; + + +//***************************************************************************** +// Class FileNotFoundException +// Should be used to indicate that a file has not been found +//***************************************************************************** + +class FileNotFoundException : public IOException +{ +public: + FileNotFoundException( + const std::string& pMsg, + const std::string& pFile="unknown", + int pLine=0) : IOException(pMsg, pFile, pLine) + { + mType = "FileNotFoundException"; + } +}; + + +//***************************************************************************** +// Class UnsupportedOperationException +// Should be used when a function/method is not yet implemented or +// if an operation is not supported in a given context +//***************************************************************************** + +class UnsupportedOperationException : public RuntimeException +{ +public: + UnsupportedOperationException( + const std::string& pMsg, + const std::string& pFile="unknown", + int pLine=0) : RuntimeException(pMsg, pFile, pLine) + { + mType = "UnsupportedOperationException"; + } +}; + + +} // namespace MULTIPR + + +#endif // MULTIPR_EXCEPTIONS_HXX + +// EOF diff --git a/src/MULTIPR/MULTIPR_Family.cxx b/src/MULTIPR/MULTIPR_Family.cxx new file mode 100644 index 0000000..e6ab2fc --- /dev/null +++ b/src/MULTIPR/MULTIPR_Family.cxx @@ -0,0 +1,463 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_Family.cxx + * + * \brief see MULTIPR_Family.hxx + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +//***************************************************************************** +// Includes section +//***************************************************************************** + +#include "MULTIPR_Family.hxx" +#include "MULTIPR_Exceptions.hxx" + +#include + +using namespace std; + + +namespace multipr +{ + + +//***************************************************************************** +// Class Attributs implementation +//***************************************************************************** + +Attributs::Attributs() +{ + mId = NULL; + mVal = NULL; + mDesc = NULL; + + reset(); +} + + +Attributs::~Attributs() +{ + reset(); +} + + +Attributs& Attributs::operator=(const Attributs& pAttr) +{ + if (this != &pAttr) // check for self-assignement + { + reset(); + + mNum = pAttr.mNum; + + if (mNum < 0) throw IllegalStateException("", __FILE__, __LINE__); + + if (pAttr.mId != NULL) + { + mId = new med_int[mNum]; + memcpy(mId, pAttr.mId, sizeof(med_int) * mNum); + } + + if (pAttr.mVal != NULL) + { + mVal = new med_int[mNum]; + memcpy(mVal, pAttr.mVal, sizeof(med_int) * mNum); + } + + if (pAttr.mDesc != NULL) + { + mDesc = new char[MED_TAILLE_DESC * mNum + 1]; + memcpy(mDesc, pAttr.mDesc, MED_TAILLE_DESC * mNum + 1); + } + } + + return *this; +} + + +void Attributs::reset() +{ + mNum = 0; + + if (mId != NULL) { delete[] mId; mId = NULL; } + if (mVal != NULL) { delete[] mVal; mVal = NULL; } + if (mDesc != NULL) { delete[] mDesc; mDesc = NULL; } +} + + +ostream& operator<<(ostream& pOs, Attributs& pA) +{ + if (pA.mNum == 0) + { + pOs << "NONE" << endl; + } + else + { + pOs << endl << " #attr=" << pA.mNum << endl; + + if (pA.mId != NULL) + { + pOs << " Id =["; + for (int i = 0 ; i < pA.mNum ; i++) + { + pOs << pA.mId[i] << " "; + } + pOs << "]" << endl; + } + else + { + pOs << " Id =NULL" << endl; + } + + if (pA.mVal != NULL) + { + pOs << " Val =["; + for (int i = 0 ; i < pA.mNum ; i++) + { + pOs << pA.mVal[i] << " "; + } + pOs << "]" << endl; + } + else + { + pOs << " Val =NULL"; + } + + if (pA.mDesc != NULL) + { + pOs << " Desc=|" << pA.mDesc << "|" << endl; + } + else + { + pOs << " Desc=NULL" << endl; + } + } + + return pOs; +} + + +//***************************************************************************** +// Class Family implementation +//***************************************************************************** + +Family::Family() +{ + reset(); +} + + +Family::~Family() +{ + reset(); +} + + +void Family::reset() +{ + mName[0] = '\0'; + mId = 0; + mStrNameGroups = ""; + + mElt.clear(); + mNameGroups.clear(); + mAttributs.reset(); + + mIsFamilyOfNodes = true; + + mFlagPrintAll = false; +} + + +void Family::insertElt(med_int pIndexElt) +{ + if (pIndexElt < 1) throw new IllegalArgumentException("", __FILE__, __LINE__); + + mElt.insert(pIndexElt); +} + + +void Family::buildGroups(vector& pGroups, map& pGroupNameToGroup) const +{ + // pGroups / pGroupNameToGroup can be empty or not + + // for each group in this family + for (unsigned itGroup = 0 ; itGroup < mNameGroups.size() ; itGroup++) + { + const string& keyName = mNameGroups[itGroup]; + + // check if the group already exist + map::iterator it = pGroupNameToGroup.find(keyName); + + Group* group = NULL; + if (it != pGroupNameToGroup.end()) + { + // the group already exists + group = (*it).second; + } + else + { + // a new group have been identified: create a new entry + group = new Group(); + group->setName(keyName); + group->setIsGroupOfNodes(isFamilyOfNodes()); + + pGroups.push_back(group); + pGroupNameToGroup.insert(make_pair(keyName, group)); + } + + // add all elements of the this family to the group + for (set::iterator itElt = mElt.begin() ; itElt != mElt.end() ; itElt++) + { + group->insertElt(*itElt); + } + + } +} + + +Family* Family::extractGroup(const char* pGroupName) +{ + Family* family = new Family(); + + strcpy(family->mName, mName); + family->mId = mId; + family->mAttributs = mAttributs; + + if (pGroupName == NULL) + { + family->mStrNameGroups = mStrNameGroups; + family->mNameGroups = mNameGroups; + } + else + { + if (strlen(pGroupName) > MED_TAILLE_LNOM) throw IllegalArgumentException("", __FILE__, __LINE__); + if (strlen(pGroupName) == 0) throw IllegalArgumentException("", __FILE__, __LINE__); + + if (strstr(mStrNameGroups.c_str(), pGroupName) == 0) + { + // pGroupName found in the list of groups => just keep pGroupName + family->mStrNameGroups = mStrNameGroups; + family->mNameGroups = mNameGroups; + } + else + { + // pGroupName not found in the current list of groups + // probably not a group of the same nature => keep all the groups + family->mStrNameGroups = pGroupName; + family->mNameGroups.push_back(pGroupName); + } + } + + return family; +} + + +void Family::readMED(med_idt pMEDfile, char* pMeshName, med_int pIndex) +{ + if (pMEDfile == 0) throw IOException("", __FILE__, __LINE__); + if (pMeshName == NULL) throw NullArgumentException("", __FILE__, __LINE__); + if (strlen(pMeshName) > MED_TAILLE_NOM) throw IllegalArgumentException("", __FILE__, __LINE__); + if (pIndex < 1) throw IllegalArgumentException("", __FILE__, __LINE__); + + reset(); + + med_int numGroups = MEDnGroupe(pMEDfile, pMeshName, pIndex); + + if (numGroups < 0) throw IOException("i/o error while reading number of groups in MED file", __FILE__, __LINE__); + + med_int numAttr = MEDnAttribut(pMEDfile, pMeshName, pIndex); + + med_int* attrId = new med_int[numAttr]; + med_int* attrVal = new med_int[numAttr]; + char* attrDesc = new char[MED_TAILLE_DESC * numAttr + 1]; + attrDesc[0] = '\0'; + + char* nameGroups = new char[MED_TAILLE_LNOM * numGroups + 1]; + nameGroups[0] = '\0'; + + med_err ret = MEDfamInfo( + pMEDfile, + pMeshName, + pIndex, + mName, + &mId, + attrId, + attrVal, + attrDesc, + &numAttr, + nameGroups, + &numGroups); + + if (ret != 0) throw IOException("i/o error while reading family information in MED file", __FILE__, __LINE__); + + attrDesc[MED_TAILLE_DESC * numAttr] = '\0'; + + mAttributs.mNum = numAttr; + mAttributs.mId = attrId; + mAttributs.mVal = attrVal; + mAttributs.mDesc = attrDesc; + + mStrNameGroups = nameGroups; + + // split nameGroups + for (int itGroup = 0 ; itGroup < numGroups ; itGroup++) + { + char str[MED_TAILLE_LNOM + 1]; + strncpy(str, nameGroups + itGroup * MED_TAILLE_LNOM, MED_TAILLE_LNOM); + str[MED_TAILLE_LNOM] = '\0'; + mNameGroups.push_back(str); + } + + delete[] nameGroups; + + // MEDfamLire is not necessary as we used MEDnoeudsLire/MEDelementsLire instead +} + + +void Family::writeMED(med_idt pMEDfile, char* pMeshName) +{ + if (pMEDfile == 0) throw IOException("", __FILE__, __LINE__); + if (pMeshName == NULL) throw NullArgumentException("", __FILE__, __LINE__); + if (strlen(pMeshName) > MED_TAILLE_NOM) throw IllegalArgumentException("", __FILE__, __LINE__); + if (strlen(mName) > MED_TAILLE_NOM) throw IllegalArgumentException("", __FILE__, __LINE__); + if (mAttributs.mVal == NULL) throw IllegalStateException("", __FILE__, __LINE__); + if (mAttributs.mDesc == NULL) throw IllegalStateException("", __FILE__, __LINE__); + if (mAttributs.mId == NULL) throw IllegalStateException("", __FILE__, __LINE__); + + med_err ret = MEDfamCr( + pMEDfile, + pMeshName, + mName, + mId, + mAttributs.mId, + mAttributs.mVal, + mAttributs.mDesc, + mAttributs.mNum, + const_cast(mStrNameGroups.c_str()), + mNameGroups.size()); + + if (ret != 0) throw IOException("i/o error while creating family in MED file", __FILE__, __LINE__); + + // MEDfamEcr is not necessary as we used MEDnoeudsEcr/MEDelementsEcr instead + +} + + +ostream& operator<<(ostream& pOs, Family& pF) +{ + pOs << "Family: " << endl; + pOs << " Name =|" << pF.mName << "| size=" << strlen(pF.mName) << endl; + pOs << " Id =" << pF.mId << endl; + pOs << " Family of =" << (pF.isFamilyOfNodes()?"NODES":"ELEMENTS") << endl; + + pOs << " Groups: #groups=" << pF.mNameGroups.size() << endl; + for (unsigned itGroup = 0 ; itGroup < pF.mNameGroups.size() ; itGroup++) + { + pOs << " Group " << (itGroup + 1) << ": |" << pF.mNameGroups[itGroup] << "| size=" << pF.mNameGroups[itGroup].length() << endl; + } + pOs << " Attributs: " << pF.mAttributs; + + if (pF.mElt.size() != 0) + { + set::iterator itSet = pF.mElt.end(); + itSet--; + pOs << " Elements: #elt=" << pF.mElt.size() << " min_id=" << (*(pF.mElt.begin())) << " max_id=" << (*itSet) << endl; + if (pF.mFlagPrintAll) + { + pOs << " "; + for (set::iterator itSet = pF.mElt.begin() ; itSet != pF.mElt.end() ; itSet++) + { + pOs << (*itSet) << " "; + } + pOs << endl; + } + } + else + { + pOs << " Elements: #elt=0" << endl; + } + + return pOs; +} + + +//***************************************************************************** +// Class Group implementation +//***************************************************************************** + +Group::Group() +{ + reset(); +} + + +Group::~Group() +{ + reset(); +} + + +void Group::reset() +{ + mName = ""; + mElt.clear(); + mIsGroupOfNodes = true; + + mFlagPrintAll = false; +} + + +void Group::setName(const string& pName) +{ + if (pName.length() > MED_TAILLE_LNOM) throw IllegalArgumentException("", __FILE__, __LINE__); + + mName = pName; +} + + +void Group::insertElt(med_int pIndexElt) +{ + if (pIndexElt < 1) throw IllegalArgumentException("", __FILE__, __LINE__); + + mElt.insert(pIndexElt); +} + +ostream& operator<<(ostream& pOs, Group& pG) +{ + pOs << "Group: " << endl; + pOs << " Name =|" << pG.mName << "| size=" << pG.mName.length() << endl; + pOs << " Group of =" << (pG.isGroupOfNodes()?"NODES":"ELEMENTS") << endl; + + if (pG.mElt.size() != 0) + { + set::iterator itSet = pG.mElt.end(); + itSet--; + pOs << " Elements: #elt=" << pG.mElt.size() << " min_id=" << (*(pG.mElt.begin())) << " max_id=" << (*itSet) << endl; + if (pG.mFlagPrintAll) + { + pOs << " "; + for (set::iterator itSet = pG.mElt.begin() ; itSet != pG.mElt.end() ; itSet++) + { + pOs << (*itSet) << " "; + } + pOs << endl; + } + } + else + { + pOs << " Elements: #elt=0" << endl; + } + + return pOs; +} + + +} // namespace multipr + +// EOF diff --git a/src/MULTIPR/MULTIPR_Family.hxx b/src/MULTIPR/MULTIPR_Family.hxx new file mode 100644 index 0000000..15d1833 --- /dev/null +++ b/src/MULTIPR/MULTIPR_Family.hxx @@ -0,0 +1,367 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_Family.hxx + * + * \brief Class Family, Group and Attributs used to wrap MED file structures. + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +#ifndef MULTIPR_FAMILY_HXX +#define MULTIPR_FAMILY_HXX + +//***************************************************************************** +// Includes section +//***************************************************************************** + +extern "C" +{ + #include "med.h" +} + + +#include +#include +#include +#include + + +namespace multipr +{ + +//***************************************************************************** +// Predeclaration +//***************************************************************************** + +class Group; + + +//***************************************************************************** +// Class Attributs +//***************************************************************************** + +class Attributs +{ +public: + + /** + * Builds an empty Attributs (default constructor). + */ + Attributs(); + + /** + * Destructor. Removes everything. + */ + ~Attributs(); + + /** + * Assignment operator (deep copy). + * \param pAttr any Atttibuts to be copied. + * \return a reference towards the copy. + */ + Attributs& operator=(const Attributs& pAttr); + + /** + * Resets this object in its state by default (empty). Cleans memory. + */ + void reset(); + + //--------------------------------------------------------------------- + // I/O + //--------------------------------------------------------------------- + + /** + * Dumps any Attributs to the given output stream. + * \param pOs any output stream. + * \param pA any Attributs. + * \return the output stream pOs. + */ + friend std::ostream& operator<<(std::ostream& pOs, Attributs& pA); + +public: + + med_int mNum; /**< Number of attributes. */ + med_int* mId; /**< Table of identifiers: for each attribute, its identifier. */ + med_int* mVal; /**< Table of values; for each attribute, its value. */ + char* mDesc; /**< Table of description; for each attribute, its description. */ + +private: + + // do not allow copy constructor + Attributs(const Attributs&); + + // do not allow operator == + bool operator==(const Attributs&); + +}; // class Attribut + + +//***************************************************************************** +// Class Family +//***************************************************************************** + +class Family +{ +public: + + /** + * Builds an empty Family (default constructor). + */ + Family(); + + /** + * Destructor. Removes everything. + */ + ~Family(); + + /** + * Resets this object in its state by default (empty). Cleans memory. + */ + void reset(); + + //--------------------------------------------------------------------- + // Basic accessors/mutators + //--------------------------------------------------------------------- + + /** + * Returns the identifier (= number) of this Family. + * \return the identifier of this Family. + */ + med_int getId() const { return mId; } + + /** + * Returns the name of this Family. + * \return the name of this Family. + */ + const char* getName() const { return mName; } + + /** + * Returns true if this Family if a family of nodes, false if is a family of elements (=cells)). + * \return true iff this Family if a family of nodes. + */ + bool isFamilyOfNodes() const { return mIsFamilyOfNodes; } + + /** + * Sets whether this Family is a family of nodes or family of elements (= cells). + * \param pIsFamilyOfNodes flag. + */ + void setIsFamilyOfNodes(bool pIsFamilyOfNodes) { mIsFamilyOfNodes = pIsFamilyOfNodes; } + + /** + * Inserts a new element (by its index) into this Family. + * \param pIndexElt index of the element to be added; must be >= 1. + * \throw IllegalArgumentException if pIndexElt <= 0. + */ + void insertElt(med_int pIndexElt); + + /** + * Returns the number of elements in this Family. + * \return the number of elements in this Family. + */ + int getSize() const { return mElt.size(); } + + //--------------------------------------------------------------------- + // Algorithms + //--------------------------------------------------------------------- + + /** + * Adds all the groups of this Family into the set of groups described by (pGroups, pGroupNameToGroup). + * \param pGroups current list of groups. + * \param pGroupNameToGroup table (map) to retrieve a Group* from its name. + */ + void buildGroups( + std::vector& pGroups, + std::map& pGroupNameToGroup) const; + + /** + * Constructor. Returns a copy of this family restricted to the given group if pGroupName != NULL. + * Examples: + * 1. If current family have 3 groups "A", "B" and "C" and pGroupName="B", then the new family will only reference the group "B" + * 2. If current family have 3 groups "A", "B" and "C" and pGroupName="D", then the new family will reference groups "A", "B" and "C". + * WARNING: elements are not copied + * \param pGroupName name of the group to keep. + * \return a copy of this family. + */ + Family* extractGroup(const char* pGroupName); + + //--------------------------------------------------------------------- + // I/O + //--------------------------------------------------------------------- + + /** + * Reads a Family from a MED file. + * \param pMEDfile any valid MED file opened for reading. + * \param pMeshName name of the mesh. + * \param pIndex index of the family to be read (must be >= 1). + * \throw IOException if any i/o error occurs. + */ + void readMED(med_idt pMEDfile, char* pMeshName, med_int pIndex); + + /** + * Writes this Family to a MED file. + * WARNING: mesh must have been created and added to the MED file before. + * \param pMEDfile any valid MED file opened for writing. + * \param pPeshName name of the mesh. + * \throw IOException if any i/o error occurs. + */ + void writeMED(med_idt pMEDfile, char* pMeshName); + + /** + * Sets the flag which control the stream operator <<. + * \param pFlag new flag value. + */ + void setPrintAll(bool pFlag) { mFlagPrintAll = pFlag; } + + /** + * Dumps any Family to the given output stream. + * \param pOs any output stream. + * \param pF any Family. + * \return the output stream pOs. + */ + friend std::ostream& operator<<(std::ostream& pOs, Family& pF); + +private: + + char mName[MED_TAILLE_NOM + 1]; /** Name of the Family */ + med_int mId; /**< Id: > 0 if family of nodes; < 0 if family of elements. */ + std::set mElt; /**< Set of all the elements (by their index in 1..*). */ + std::string mStrNameGroups; /**< A string with name of all groups which contain the Family. */ + std::vector mNameGroups; /**< List of groups (by name) which contain the Family. */ + Attributs mAttributs; /**< All the attributed related to the Family. */ + bool mIsFamilyOfNodes; /**< Is it a family of nodes or a family of elements? */ + + bool mFlagPrintAll; /** Flag to control the behaviour of the stream operator <<. */ + +private: + + // do not allow copy constructor + Family(const Family&); + + // do not allow copy + Family& operator=(const Family&); + + // do not allow operator == + bool operator==(const Family&); + +}; // class Family + + +//***************************************************************************** +// Class Group +//***************************************************************************** + +class Group +{ +public: + + /** + * Builds an empty group (default constructor). + */ + Group(); + + /** + * Destructor. Removes everything. + */ + ~Group(); + + /** + * Resets this object in its state by default (empty). Cleans memory. + */ + void reset(); + + //--------------------------------------------------------------------- + // Basic accessors/mutators + //--------------------------------------------------------------------- + + /** + * Returns true if it is a group of nodes, false if it is a group of elements. + * \return true if it is a group of nodes, false if it is a group of elements. + */ + bool isGroupOfNodes() const { return mIsGroupOfNodes; } + + /** + * Sets whether it is a group of nodes or a group of elements. + * \param pIsGroupOfNodes true for a group of nodes, false for a group of elements. + */ + void setIsGroupOfNodes(bool pIsGroupOfNodes) { mIsGroupOfNodes = pIsGroupOfNodes; } + + /** + * Returns the name of this Group. + * \return the name of this Group. + */ + const std::string& getName() const { return mName; } + + /** + * Sets the name of this Group. + * \param pName new name of this Group (length of name must not exceed MED_TAILLE_LNOM). + */ + void setName(const std::string& pName); + + /** + * Adds the index of a new element to this Group. + * \param pIndexElt must be >= 1. + */ + void insertElt(med_int pIndexElt); + + /** + * Returns the set of all the elements referenced in this Group. + * \return the set of all the elements referenced in this Group. + */ + const std::set& getSetOfElt() const { return mElt; } + + /** + * Returns the number of elements referenced in this Group. + * \return the number of elements referenced in this Group. + */ + int getSize() const { return mElt.size(); } + + //--------------------------------------------------------------------- + // I/O + //--------------------------------------------------------------------- + + /** + * Sets the flag which control the stream operator <<. + * \param pFlag new flag value. + */ + void setPrintAll(bool pFlag) { mFlagPrintAll = pFlag; } + + /** + * Dumps any Group to the given output stream. + * \param pOs any output stream. + * \param pG any Group. + * \return the output stream pOs. + */ + friend std::ostream& operator<<(std::ostream& pOs, Group& pG); + +private: + + std::string mName; /**< Name of the group. */ + std::set mElt; /**< All elements of this group; each element is referenced by its index >= 1; each element is unique. */ + bool mIsGroupOfNodes; /**< Is it a group of nodes or a group of elements? */ + + bool mFlagPrintAll; /** Flag to control the behaviour of the stream operator <<. */ + +private: + + // do not allow copy constructor + Group(const Group&); + + // do not allow copy + Group& operator=(const Group&); + + // do not allow operator == + bool operator==(const Group&); + +}; // class Group + + +} // namespace MULTIPR + + +#endif // MULTIPR_FAMILY_HXX + +// EOF diff --git a/src/MULTIPR/MULTIPR_Field.cxx b/src/MULTIPR/MULTIPR_Field.cxx new file mode 100644 index 0000000..6d1854a --- /dev/null +++ b/src/MULTIPR/MULTIPR_Field.cxx @@ -0,0 +1,524 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_Field.cxx + * + * \brief see MULTIPR_Field.hxx + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +//***************************************************************************** +// Includes section +//***************************************************************************** + +#include "MULTIPR_Field.hxx" +#include "MULTIPR_Exceptions.hxx" + +#include + +using namespace std; + + +namespace multipr +{ + + +//***************************************************************************** +// Class Field implementation +//***************************************************************************** + +Field::Field() +{ + reset(); +} + + +Field::~Field() +{ + reset(); +} + + +void Field::reset() +{ + mName[0] = '\0'; + mEntity = MED_NOEUD; + mGeom = MED_NONE; + mType = MED_FLOAT64; + mSizeOfType = 8; + mNumComponents = 0; + mStrComponent = ""; + mStrUnit = ""; + + mNGauss.clear(); + mDT.clear(); + mNumDT.clear(); + mDTUnit.clear(); + mNumO.clear(); + mGaussLoc.clear(); + mProfil.clear(); + mSizeOfData.clear(); + mNVal.clear(); + + for (unsigned it = 0 ; it < mVal.size() ; it++) + { + delete[] mVal[it]; + } + mVal.clear(); + + mFlagPrintAll = false; +} + + +bool Field::isEmpty() const +{ + return (mNGauss.size() == 0); +} + + +int Field::getNumberOfGaussPointsByElement(int pTimeStepIt) const +{ + if ((pTimeStepIt < 1) || (pTimeStepIt > int(mNGauss.size()))) throw IndexOutOfBoundsException("", __FILE__, __LINE__); + + return mNGauss[pTimeStepIt - 1]; +} + + +const string& Field::getNameGaussLoc(int pTimeStepIt) const +{ + if ((pTimeStepIt < 1) || (pTimeStepIt > int(mNGauss.size()))) throw IndexOutOfBoundsException("", __FILE__, __LINE__); + + return mGaussLoc[pTimeStepIt - 1]; +} + + +const unsigned char* Field::getValue(int pTimeStepIt, int pIndex) const +{ + if ((pTimeStepIt < 1) || (pTimeStepIt > int(mNGauss.size()))) throw IndexOutOfBoundsException("", __FILE__, __LINE__); + if ((pIndex < 1) || (pIndex > mNVal[pTimeStepIt - 1] / mNGauss[pTimeStepIt - 1])) throw IndexOutOfBoundsException("", __FILE__, __LINE__); + + // size of one data = size of type * number of components * number of Gauss points + int sizeOfOneData = mSizeOfType * mNumComponents * mNGauss[pTimeStepIt - 1]; + + unsigned char* ret = mVal[pTimeStepIt - 1] + (pIndex - 1) * sizeOfOneData; + + return ret; +} + + +Field* Field::extractSubSet(const set& pSetIndices) const +{ + Field* subset = new Field(); + + memcpy(subset->mName, mName, MED_TAILLE_NOM + 1); + subset->mEntity = mEntity; + subset->mGeom = mGeom; + subset->mType = mType; + subset->mSizeOfType = mSizeOfType; + subset->mNumComponents = mNumComponents; + subset->mStrComponent = mStrComponent; + subset->mStrUnit = mStrUnit; + + subset->mNGauss = mNGauss; + subset->mDT = mDT; + subset->mNumDT = mNumDT; + subset->mDTUnit = mDTUnit; + subset->mNumO = mNumO; + subset->mGaussLoc = mGaussLoc; + subset->mProfil = mProfil; + + // for each time step + for (unsigned itTimeStep = 0 ; itTimeStep < mNGauss.size() ; itTimeStep++) + { + if (mProfil[itTimeStep].size() != 0) throw UnsupportedOperationException("", __FILE__, __LINE__); + // TODO ??? + // WARNING : do not manage profil for the moment + // if there is a profil, + // 1. we should set mProfil to NO_PROFIL for this time_step + // 2. we should extract data according to the profil + + int nval = pSetIndices.size() * subset->mNGauss[itTimeStep]; + subset->mNVal.push_back(nval); + + int sizeOfData = nval * mSizeOfType * mNumComponents; + subset->mSizeOfData.push_back(sizeOfData); + + unsigned char* data = new unsigned char[sizeOfData]; + unsigned char* dest = data; + int sizeOfOneData = mSizeOfType * mNumComponents * subset->mNGauss[itTimeStep]; + + //cout << "Size of 1 data = " << sizeOfOneData << endl; // debug + + // for each element to extract + for (set::iterator itSet = pSetIndices.begin() ; itSet != pSetIndices.end() ; itSet++) + { + int indexElt = (*itSet); + + // MED index start at 1. + if (indexElt < 1) throw new IllegalArgumentException("", __FILE__, __LINE__); + + unsigned char* src = mVal[itTimeStep] + (indexElt - 1) * sizeOfOneData; + memcpy(dest, src, sizeOfOneData); + + dest += sizeOfOneData; + } + subset->mVal.push_back(data); + } + + return subset; +} + + +void Field::getSetOfGaussLoc(set& pSetOfGaussLoc) const +{ + for (unsigned itGaussLoc = 0 ; itGaussLoc < mGaussLoc.size() ; itGaussLoc++) + { + const string& gaussLocName = mGaussLoc[itGaussLoc]; + + if (gaussLocName.length() != 0) + { + pSetOfGaussLoc.insert(gaussLocName); + } + } +} + + +void Field::readMED(med_idt pMEDfile, med_int pIndex, char* pMeshName) +{ + if (pMEDfile == 0) throw IOException("", __FILE__, __LINE__); + if (pMeshName == NULL) throw NullArgumentException("", __FILE__, __LINE__); + if (strlen(pMeshName) > MED_TAILLE_NOM) throw IllegalArgumentException("", __FILE__, __LINE__); + if (pIndex < 1) throw IllegalArgumentException("", __FILE__, __LINE__); + + reset(); + + mNumComponents = MEDnChamp(pMEDfile, pIndex); + + if (mNumComponents < 0) throw IOException("", __FILE__, __LINE__); + + char* strComponent = new char[mNumComponents * MED_TAILLE_PNOM + 1]; + char* strUnit = new char[mNumComponents * MED_TAILLE_PNOM + 1]; + + strComponent[0] = '\0'; + strUnit[0] = '\0'; + + med_err ret = MEDchampInfo( + pMEDfile, + pIndex, + mName, + &(mType), + strComponent, + strUnit, + mNumComponents); + + if (ret != 0) throw IOException("", __FILE__, __LINE__); + + mStrComponent = strComponent; + mStrUnit = strUnit; + + delete[] strUnit; + delete[] strComponent; + + switch (mType) + { + case MED_FLOAT64: mSizeOfType = 8; break; + case MED_INT64: mSizeOfType = 8; break; + case MED_INT32: mSizeOfType = 4; break; + case MED_INT: mSizeOfType = 4; break; + default: throw IllegalStateException("should not be there", __FILE__, __LINE__); + } + + //--------------------------------------------------------------------- + // Read fields over nodes + //--------------------------------------------------------------------- + bool fieldOnNodes = false; + { + med_int numTimeStepNodes = MEDnPasdetemps( + pMEDfile, + mName, + MED_NOEUD, + (med_geometrie_element) 0); + + if (numTimeStepNodes < 0) throw IOException("", __FILE__, __LINE__); + + if (numTimeStepNodes != 0) + { + fieldOnNodes = true; + mEntity = MED_NOEUD; + mGeom = (med_geometrie_element) 0; + readMEDtimeSteps(pMEDfile, numTimeStepNodes, pMeshName); + } + } + + //--------------------------------------------------------------------- + // Read fields over elements + //--------------------------------------------------------------------- + { + med_int numTimeStepElt = MEDnPasdetemps( + pMEDfile, + mName, + MED_MAILLE, + MED_TETRA10); + + if (numTimeStepElt < 0) throw IOException("", __FILE__, __LINE__); + + if (numTimeStepElt != 0) + { + if (fieldOnNodes) throw IllegalStateException("", __FILE__, __LINE__); + + mEntity = MED_MAILLE; + mGeom = MED_TETRA10; + readMEDtimeSteps(pMEDfile, numTimeStepElt, pMeshName); + } + } +} + + +void Field::readMEDtimeSteps(med_idt pMEDfile, med_int pNumberOfTimeSteps, char* pMeshName) +{ + if (pMEDfile == 0) throw IOException("", __FILE__, __LINE__); + if (pMeshName == NULL) throw NullArgumentException("", __FILE__, __LINE__); + if (strlen(pMeshName) > MED_TAILLE_NOM) throw IllegalArgumentException("", __FILE__, __LINE__); + if (pNumberOfTimeSteps < 0) throw IllegalArgumentException("", __FILE__, __LINE__); + + char strEntity[8]; + switch (mEntity) + { + case MED_ARETE: + case MED_FACE: + case MED_MAILLE: strcpy(strEntity, "CELLS"); break; + case MED_NOEUD: strcpy(strEntity, "NODES"); break; + default: strcpy(strEntity, "UNKNOWN"); break; + } + + // iterates over time step + for (int itTimeStep = 1 ; itTimeStep <= pNumberOfTimeSteps ; itTimeStep++) + { + med_int ngauss; + med_int numdt; + med_int numo; + char dtunit[MED_TAILLE_PNOM + 1]; + med_float dt; + char maa[MED_TAILLE_NOM + 1]; + med_booleen local; + med_int nmaa; + + med_err ret = MEDpasdetempsInfo( + pMEDfile, + mName, + mEntity, + mGeom, + itTimeStep, + &ngauss, + &numdt, + &numo, + dtunit, + &dt, + maa, + &local, + &nmaa); + + if (ret != 0) throw IOException("i/o error while reading #timesteps in MED file", __FILE__, __LINE__); + + // mesh must be local + if (local != MED_VRAI) throw IllegalStateException("only local fields are currently supported", __FILE__, __LINE__); + + // #mesh must be 1 + if (nmaa != 1) throw IllegalStateException("field shoud be associated with 1 mesh only", __FILE__, __LINE__); + + // mesh must be pMeshName + //MULTIPR_CHECK((strcmp(maa, pMeshName) == 0), MED_ILLEGAL_FILE, pMEDfile); + // if field does not apply on the current mesh, skip + if (strcmp(maa, pMeshName) != 0) + { + continue; + } + + mNGauss.push_back(ngauss); + mDT.push_back(dt); + mNumDT.push_back(numdt); + mDTUnit.push_back(dtunit); + mNumO.push_back(numo); + + //MULTIPR_LOG("Time step #" << itTimeStep << ": #gauss=" << ngauss << " dt=" << dt << " maa=" << maa << " has_dt?" << ((numdt==MED_NOPDT)?"no":"yes") << " numdt=" << numdt << " unit=" << dtunit << " has_order?" << ((numo==MED_NONOR)?"no":"yes") << " numo:" << numo << endl); + + med_int nval = MEDnVal( + pMEDfile, + mName, + mEntity, + mGeom, + numdt, + numo, + pMeshName, + MED_GLOBAL); + + if (nval < 0) throw IOException("i/o error while reading field in MED file", __FILE__, __LINE__); + + mNVal.push_back(nval); + + char gaussLocName[MED_TAILLE_NOM + 1]; + char profilName[MED_TAILLE_NOM + 1]; + int sizeOfData = mSizeOfType * mNumComponents * nval; + mSizeOfData.push_back(sizeOfData); + unsigned char* fieldData = new unsigned char[sizeOfData]; + + ret = MEDchampLire( + pMEDfile, + pMeshName, + mName, + fieldData, + MED_FULL_INTERLACE, + MED_ALL, + gaussLocName, + profilName, + MED_COMPACT, //MED_GLOBAL, MED_NO_PFLMOD, MED_COMPACT + mEntity, + mGeom, + numdt, + numo); + + if (ret != 0) throw IOException("i/o error while reading field in MED file", __FILE__, __LINE__); + + mGaussLoc.push_back(gaussLocName); + mProfil.push_back(profilName); + mVal.push_back(fieldData); + } +} + + +void Field::writeMED(med_idt pMEDfile, char* pMeshName) +{ + if (pMEDfile == 0) throw IOException("", __FILE__, __LINE__); + if (pMeshName == NULL) throw NullArgumentException("", __FILE__, __LINE__); + if (strlen(pMeshName) > MED_TAILLE_NOM) throw IllegalArgumentException("", __FILE__, __LINE__); + if (mNumComponents < 1) throw IllegalStateException("", __FILE__, __LINE__); + + med_err ret = MEDchampCr( + pMEDfile, + mName, // name of the field + mType, // type of data (MED_FLOAT64, MED_INT32, etc.) + const_cast(mStrComponent.c_str()), // name of components + const_cast(mStrUnit.c_str()), // name of units + mNumComponents); // number of components + + if (ret != 0) throw IOException("i/o error while creating field in MED file", __FILE__, __LINE__); + + // for each time step + for (unsigned i = 0 ; i < mNGauss.size() ; i++) + { + // skip if no values + if (mNVal[i] == 0) continue; + + ret = MEDchampEcr( + pMEDfile, + pMeshName, // name of the mesh (first call to MEDchampEcr => name of reference) + mName, // name of the field + mVal[i], // data (= values) + MED_FULL_INTERLACE, // data organization + mNVal[i], // number of values + const_cast(mGaussLoc[i].c_str()), // name of Gauss reference + MED_ALL, // components to be selected + const_cast(mProfil[i].c_str()), // name of profil + MED_GLOBAL, // how to read data: MED_NO_PFLMOD,MED_COMPACT,MED_GLOBAL + mEntity, // type of entity (MED_NOEUD, MED_MAILLE, etc.) + mGeom, // type of geometry (TETRA10, etc.) + mNumDT[i], // time step iteration + const_cast(mDTUnit[i].c_str()), // unit of time step + mDT[i], // time key + mNumO[i]); // order number + + if (ret != 0) throw IOException("i/o error while writing field in MED file", __FILE__, __LINE__); + } +} + + +ostream& operator<<(ostream& pOs, Field& pF) +{ + char strEntity[16]; + switch (pF.mEntity) + { + case MED_MAILLE: strcpy(strEntity, "MED_MAILLE"); break; + case MED_FACE: strcpy(strEntity, "MED_FACE"); break; + case MED_ARETE: strcpy(strEntity, "MED_ARETE"); break; + case MED_NOEUD: strcpy(strEntity, "MED_NOEUD"); break; + default: strcpy(strEntity, "UNKNOWN"); break; + } + + char strType[16]; + switch (pF.mType) + { + case MED_FLOAT64: strcpy(strType, "MED_FLOAT64"); break; + case MED_INT32: strcpy(strType, "MED_INT32"); break; + case MED_INT64: strcpy(strType, "MED_INT64"); break; + case MED_INT: strcpy(strType, "MED_INT"); break; + default: strcpy(strType, "UNKNOWN"); break; + } + + pOs << "Field: " << endl; + pOs << " Name =|" << pF.mName << "|" << endl; + pOs << " Entity =" << strEntity << endl; + pOs << " Geom =" << pF.mGeom << endl; + pOs << " Type =" << strType << " (size=" << pF.mSizeOfType << ")" << endl; + pOs << " #Components=" << pF.mNumComponents << endl; + pOs << " Name component=|" << pF.mStrComponent << "|" << endl; + pOs << " Unit component=|" << pF.mStrUnit << "|" << endl; + pOs << " #Time steps=" << pF.mNGauss.size() << endl; + + for (unsigned itTimeStep = 0 ; itTimeStep < pF.mNGauss.size() ; itTimeStep++) + { + pOs << " Time=" << pF.mDT[itTimeStep]; + pOs << " it=" << pF.mNumDT[itTimeStep]; + pOs << " order=" << pF.mNumO[itTimeStep]; + pOs << " #gauss=" << pF.mNGauss[itTimeStep]; + pOs << " #val=" << pF.mNVal[itTimeStep]; + pOs << " sizeof_val=" << pF.mSizeOfData[itTimeStep]; + pOs << " gauss_loc=|" << ((pF.mGaussLoc[itTimeStep].size() == 0)?"NONE":pF.mGaussLoc[itTimeStep]) << "| size=" << pF.mGaussLoc[itTimeStep].size(); + pOs << " profil=|" << ((pF.mProfil[itTimeStep].size() == 0)?"NONE":pF.mProfil[itTimeStep]) << "| size=" << pF.mProfil[itTimeStep].size() << endl; + + if (pF.mFlagPrintAll) + { + cout << " Values: "; + switch (pF.mType) + { + case MED_FLOAT64: + { + med_float* src = reinterpret_cast(pF.mVal[itTimeStep]); + for (int itVal = 0 ; itVal < pF.mNVal[itTimeStep] * pF.mNumComponents ; itVal++) + { + cout << src[itVal] << " "; + } + } + break; + case MED_INT: + case MED_INT32: + { + med_int* src = reinterpret_cast(pF.mVal[itTimeStep]); + for (int itVal = 0 ; itVal < pF.mNVal[itTimeStep] * pF.mNumComponents ; itVal++) + { + cout << src[itVal] << " "; + } + } + break; + case MED_INT64: + // not yet implemented + throw UnsupportedOperationException("not yet implemented", __FILE__, __LINE__); + default: + // should not be there + throw IllegalStateException("should not be there", __FILE__, __LINE__); + } + cout << endl; + } + + } + + return pOs; +} + + +} // namespace multipr + +// EOF diff --git a/src/MULTIPR/MULTIPR_Field.hxx b/src/MULTIPR/MULTIPR_Field.hxx new file mode 100644 index 0000000..2e82140 --- /dev/null +++ b/src/MULTIPR/MULTIPR_Field.hxx @@ -0,0 +1,236 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_Field.hxx + * + * \brief Class Field used to wrap MED file fields. + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +#ifndef MULTIPR_FIELD_HXX +#define MULTIPR_FIELD_HXX + +//***************************************************************************** +// Includes section +//***************************************************************************** + +extern "C" +{ + #include "med.h" +} + +#include +#include +#include + + +namespace multipr +{ + + +//***************************************************************************** +// Class Field +//***************************************************************************** + +class Field +{ +public: + + /** + * Builds an empty field (default constructor). + */ + Field(); + + /** + * Destructor. Removes everything. + */ + ~Field(); + + /** + * Resets this object in its state by default (empty). Cleans memory. + */ + void reset(); + + //--------------------------------------------------------------------- + // Basic accessors/mutators + //--------------------------------------------------------------------- + + /** + * Returns true iff this field is empty (no data). + * \return true if this field is empty, false otherwise. + */ + bool isEmpty() const; + + /** + * Returns true iff this field apply on nodes (otherwise, information are related to elements). + * \return true iff this field apply on nodes. + */ + bool isFieldOnNodes() const { return (mEntity == MED_NOEUD); } + + /** + * Returns the name of this Field. + * \return the name of this Field. + */ + const char* getName() const { return mName; } + + /** + * Returns the number of time steps in this Field. + * \return the number of time steps in this Field. + */ + int getNumberOfTimeSteps() const { return mNGauss.size(); } + + /** + * Returns the numeric type of information contained in this Field (e.g. MED_FLOAT64). + * \return the numeric type of this Field. + */ + med_type_champ getType() const { return mType; } + + /** + * Returns the number of components of this Field. + * \return the number of components of this Field. + */ + int getNumberOfComponents() const { return mNumComponents; } + + /** + * Returns the number of Gauss points for each element at the given time step. + * \param pTimeStepIt iteration of the field; must be in [1..MAX_ITERATION]. + * \return number of Gauss points in the elements of this Field at the given iteration. + * \throw IndexOutOfBoundsException if pTimeStepIt not in [1..MAX_ITERATION]. + */ + int getNumberOfGaussPointsByElement(int pTimeStepIt) const; + + /** + * Returns the name of the Gauss localization related to the given iteration. + * \param pTimeStepIt iteration of the field; must be in [1..MAX_ITERATION]. + * \return the name of the Gauss localization related to the given iteration. + * \throw IndexOutOfBoundsException if pTimeStepIt not in [1..MAX_ITERATION]. + */ + const std::string& getNameGaussLoc(int pTimeStepIt) const; + + /** + * Returns a pointer towards the first value of this Field for the given element at the given time step. + * \param pTimeStepIt iteration of the field; must be in [1..MAX_ITERATION]. + * \param pIndex index of the element; must be >= 1. + * \return the value of this Field for the given element at the given time step. + * \throw IndexOutOfBoundsException if pTimeStepIt or pIndex are invalid. + */ + const unsigned char* getValue(int pTimeStepIt, int pIndex) const; + + //--------------------------------------------------------------------- + // Algorithms + //--------------------------------------------------------------------- + + /** + * Creates a subset of this Field restricted to a set of elements (NODES or CELLS). + * This method performs a projection of this Field on the given set of elements. + * \param pSetIndices WARNING: indices start at 1. + * \return a new Field restricted to the given set of elements. + */ + Field* extractSubSet(const std::set& pSetIndices) const; + + /** + * Adds the set of GaussLoc used by this Field into the given set. + * \param pSetOfGauss any set of Gauss localisation. + */ + void getSetOfGaussLoc(std::set& pSetOfGaussLoc) const; + + //--------------------------------------------------------------------- + // I/O + //--------------------------------------------------------------------- + + /** + * Reads a field from a MED file. + * If the field is not related to the given mesh, the result is an empty field. + * \param pMEDfile any valid MED file opened for reading. + * \param pIndex index of the field to be read; must be >= 1. + * \param pMeshName name of the mesh (a field is always related to a mesh). + * \throw IOException if any i/o error occurs. + */ + void readMED(med_idt pMEDfile, med_int pIndex, char* pMeshName); + + /** + * Writes this field to a MED file. The field is linked to the given mesh. + * WARNING: all related Gauss info must have been added to the MED file before. + * \param pMEDfile any valid MED file opened for writing. + * \param pMeshName name of the mesh. + * \throw IOException if any i/o error occurs. + */ + void writeMED(med_idt pMEDfile, char* pMeshName); + + /** + * Sets the flag which control the stream operator <<. + * \param pFlag new flag value. + */ + void setPrintAll(bool pFlag) { mFlagPrintAll = pFlag; } + + /** + * Dumps any Field to the given output stream. + * \param pOs any output stream. + * \param pF any Field. + * \return the output stream pOs. + */ + friend std::ostream& operator<<(std::ostream& pOs, Field& pF); + +private: + + /** + * Reads all the information related to its field and a given time step (by its index). + * \param pMEDfile MED file handle. + * \param pNumberOfTimeSteps number of timesteps (iteration) to be read. + * \param pMeshName name of the mesh. + * \throw IOException if any i/o error occurs. + */ + void readMEDtimeSteps(med_idt pMEDfile, med_int pNumberOfTimeSteps, char* pMeshName); + +private: + + char mName[MED_TAILLE_NOM + 1]; + med_entite_maillage mEntity; // type of entity, e.g. MED_MAILLE + med_geometrie_element mGeom; // type of primitives, e.g. MED_TETRA10 (MED_NONE for a field on nodes) + med_type_champ mType; // type of field, e.g. MED_FLOAT64, MED_INT32 + int mSizeOfType; // 8 for MED_FLOAT64, 4 for MED_INT32, etc. + med_int mNumComponents; + std::string mStrComponent; + std::string mStrUnit; + + // Information related to time steps. + // Each vector should contain the same number of elements. + // Number of time step = mNGauss.size() = mDT.size() = ... + + std::vector mNGauss; /**< For each time step, number of Gauss points in the field. */ + std::vector mDT; /**< For each time step, value of time step. */ + std::vector mNumDT; /**< For each time step, iteration number. */ + std::vector mDTUnit; /**< For each time step, units. */ + std::vector mNumO; /**< For each time step, order number. */ + std::vector mGaussLoc; /**< For each time step, name of Gauss localization to be used (empty if none). */ + std::vector mProfil; /**< For each time step, name of the profil to be used (empty if none). */ + std::vector mSizeOfData; /**< For each time step, sizeof data (mVal) in bytes. */ + std::vector mNVal; /**< For each time step, number of values. */ + std::vector mVal; /**< For each time step, raw data; can be MED_FLOAT64, MED_INT32, etc. see mType. */ + + bool mFlagPrintAll; /**< Flag to control the behaviour of the stream operator <<. */ + +private: + + // do not allow copy constructor + Field(const Field&); + + // do not allow copy + Field& operator=(const Field&); + + // do not allow operator == + bool operator==(const Field&); + +}; // class Field + + +} // namespace MULTIPR + + +#endif // MULTIPR_FIELD_HXX + +// EOF diff --git a/src/MULTIPR/MULTIPR_GaussLoc.cxx b/src/MULTIPR/MULTIPR_GaussLoc.cxx new file mode 100644 index 0000000..7fd8566 --- /dev/null +++ b/src/MULTIPR/MULTIPR_GaussLoc.cxx @@ -0,0 +1,235 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_GaussLoc.cxx + * + * \brief see MULTIPR_GaussLoc.hxx + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +//***************************************************************************** +// Includes section +//***************************************************************************** + +#include "MULTIPR_GaussLoc.hxx" +#include "MULTIPR_Utils.hxx" +#include "MULTIPR_Exceptions.hxx" + +#include + +using namespace std; + + +namespace multipr +{ + + +//***************************************************************************** +// Class GaussLoc implementation +//***************************************************************************** + +GaussLoc::GaussLoc() +{ + mRefCoo = NULL; + mGaussCoo = NULL; + mWeight = NULL; + + reset(); +} + + +GaussLoc::GaussLoc(const GaussLoc& pGaussLoc) +{ + mRefCoo = NULL; + mGaussCoo = NULL; + mWeight = NULL; + + strcpy(mName, pGaussLoc.mName); + + mGeom = pGaussLoc.mGeom; + mDim = pGaussLoc.mDim; + mNumNodes = pGaussLoc.mNumNodes; + mNumGauss = pGaussLoc.mNumGauss; + + if (mDim != (mGeom / 100)) throw IllegalStateException("", __FILE__, __LINE__); + if (mNumNodes != (mGeom % 100)) throw IllegalStateException("", __FILE__, __LINE__); + + if (pGaussLoc.mRefCoo != NULL) + { + mRefCoo = new med_float[mDim * mNumNodes]; + memcpy(mRefCoo, pGaussLoc.mRefCoo, sizeof(med_float) * mDim * mNumNodes); + } + + if (pGaussLoc.mGaussCoo != NULL) + { + mGaussCoo = new med_float[mDim * mNumGauss]; + memcpy(mGaussCoo, pGaussLoc.mGaussCoo, sizeof(med_float) * mDim * mNumGauss); + } + + if (pGaussLoc.mWeight != NULL) + { + mWeight = new med_float[mNumGauss]; + memcpy(mWeight, pGaussLoc.mWeight, sizeof(med_float) * mNumGauss); + } +} + + +GaussLoc::~GaussLoc() +{ + reset(); +} + + +void GaussLoc::reset() +{ + mName[0] = '\0'; + mGeom = MED_NONE; + mDim = 0; + mNumNodes = 0; + mNumGauss = 0; + + if (mRefCoo != NULL) { delete[] mRefCoo; mRefCoo = NULL; } + if (mGaussCoo != NULL) { delete[] mGaussCoo; mGaussCoo = NULL; } + if (mWeight != NULL) { delete[] mWeight; mWeight = NULL; } +} + + +void GaussLoc::getCoordGaussPoints( + const med_float* pCooElt, + med_float* pCooGaussPoints) const +{ + // debug + //printArray2D(pCooElt, mNumNodes, mDim, "Node"); + + // WARNING: assumes TETRA10 !!! + // This method is not completely generic and should be extended to support all cases. + if (mGeom != MED_TETRA10) throw UnsupportedOperationException("only support TETRA10 for the moment", __FILE__, __LINE__); + + const med_float* pt1 = pCooElt; + const med_float* pt2 = pt1 + mDim; + const med_float* pt3 = pt2 + mDim; + const med_float* pt4 = pt3 + mDim; + + const med_float* coeff = mGaussCoo; + med_float* dest = pCooGaussPoints; + + // for each Gauss point + for (int i = 0 ; i < mNumGauss ; i++) + { + dest[0] = pt2[0] + (pt4[0] - pt2[0]) * coeff[0] + (pt1[0] - pt2[0]) * coeff[1] + (pt3[0] - pt2[0]) * coeff[2]; + dest[1] = pt2[1] + (pt4[1] - pt2[1]) * coeff[0] + (pt1[1] - pt2[1]) * coeff[1] + (pt3[1] - pt2[1]) * coeff[2]; + dest[2] = pt2[2] + (pt4[2] - pt2[2]) * coeff[0] + (pt1[2] - pt2[2]) * coeff[1] + (pt3[2] - pt2[2]) * coeff[2]; + + // prepare next point + coeff += mDim; + dest += mDim; + } +} + + +void GaussLoc::readMED(med_idt pMEDfile, med_int pIndex) +{ + if (pMEDfile == 0) throw IOException("pMEDfile should not be NULL", __FILE__, __LINE__); + if (pIndex < 1) throw IllegalArgumentException("pIndex should be >= 1", __FILE__, __LINE__); + + reset(); + + med_err ret = MEDgaussInfo( + pMEDfile, + pIndex, + mName, + &mGeom, + &mNumGauss); + + if (ret != 0) throw IOException("i/o error while reading Gauss localization information in MED file", __FILE__, __LINE__); + + mDim = mGeom / 100; + mNumNodes = mGeom % 100; + + mRefCoo = new med_float[mDim * mNumNodes]; + mGaussCoo = new med_float[mDim * mNumGauss]; + mWeight = new med_float[mNumGauss]; + + ret = MEDgaussLire( + pMEDfile, + mRefCoo, + mGaussCoo, + mWeight, + MED_FULL_INTERLACE, + mName); + + if (ret != 0) throw IOException("i/o error while reading Gauss localization in MED file", __FILE__, __LINE__); +} + + +void GaussLoc::writeMED(med_idt pMEDfile) +{ + if (pMEDfile == 0) throw IOException("", __FILE__, __LINE__); + if (mNumGauss < 0) throw IllegalStateException("", __FILE__, __LINE__); + if (mRefCoo == NULL) throw IllegalStateException("", __FILE__, __LINE__); + if (mGaussCoo == NULL) throw IllegalStateException("", __FILE__, __LINE__); + if (mWeight == NULL) throw IllegalStateException("", __FILE__, __LINE__); + if (strlen(mName) > MED_TAILLE_NOM) throw IllegalStateException("", __FILE__, __LINE__); + + med_err ret = MEDgaussEcr( + pMEDfile, + mGeom, + mRefCoo, + MED_FULL_INTERLACE, + mNumGauss, + mGaussCoo, + mWeight, + mName); + + if (ret != 0) throw IOException("i/o error while writing Gauss localization", __FILE__, __LINE__); +} + + +ostream& operator<<(ostream& pOs, GaussLoc& pG) +{ + pOs << "Gauss ref:" << endl; + pOs << " Name =|" << pG.mName << "|" << endl; + pOs << " Geom =" << pG.mGeom << endl; + pOs << " #Pt Gauss=" << pG.mNumGauss << endl; + + pOs << " Ref nodes coords.: (#nodes=" << pG.mNumNodes << " dim=" << pG.mDim << ")" << endl; + for (int itNode = 0 ; itNode < pG.mNumNodes ; itNode++) + { + pOs << " Node " << (itNode + 1) << ": "; + for (int itDim = 0; itDim < pG.mDim ; itDim++) + { + pOs << pG.mRefCoo[itNode * pG.mDim + itDim] << " "; + } + pOs << endl; + } + + pOs << " Gauss coords. and weight:" << endl; + for (int itGauss = 0 ; itGauss < pG.mNumGauss ; itGauss++) + { + pOs << " Pt " << (itGauss+1) << ": "; + for (int itDim = 0; itDim < pG.mDim ; itDim++) + { + pOs << pG.mGaussCoo[itGauss * pG.mDim + itDim] << " "; + } + pOs << "weight=" << pG.mWeight[itGauss]; + pOs << endl; + } + + /* + // debug + med_float res[15]; + pG.getCoordGaussPoints(pG.mRefCoo, res); + printArray2D(res, pG.mNumGauss, pG.mDim, "Gauss pt"); + */ + + return pOs; +} + + +} // namespace multipr + +// EOF diff --git a/src/MULTIPR/MULTIPR_GaussLoc.hxx b/src/MULTIPR/MULTIPR_GaussLoc.hxx new file mode 100644 index 0000000..d55deb7 --- /dev/null +++ b/src/MULTIPR/MULTIPR_GaussLoc.hxx @@ -0,0 +1,150 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_GaussLoc.hxx + * + * \brief Class GaussLoc. Allow to locate all the Gauss points in an element of reference (e.g. a TETRA10). + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +#ifndef MULTIPR_GAUSSLOC_HXX +#define MULTIPR_GAUSSLOC_HXX + +//***************************************************************************** +// Includes section +//***************************************************************************** + +extern "C" +{ + #include "med.h" +} + +#include + + +namespace multipr +{ + + +//***************************************************************************** +// Class GaussLoc +//***************************************************************************** + +class GaussLoc +{ +public: + + /** + * Builds an empty Gauss reference (default constructor). + */ + GaussLoc(); + + /** + * Copy constructor (deep copy). + * \param pGaussLoc the GaussLoc to copy. + */ + GaussLoc(const GaussLoc& pGaussLoc); + + /** + * Destructor. Removes everything. + */ + ~GaussLoc(); + + /** + * Resets this object in its state by default (empty). Cleans memory. + */ + void reset(); + + //--------------------------------------------------------------------- + // Basic accessors/mutators + //-------------------------------------------------------------------- + + /** + * Returns the name of this GaussLoc. + * \return the name of this GaussLoc. + */ + std::string getName() const { return mName; } + + /** + * Returns dimension of Gauss points which is also the dimension of reference nodes. + * \return dimension of Gauss points. + */ + int getDim() const { return mDim; } + + /** + * Returns number of Gauss points. + * \return number of Gauss points. + */ + int getNumGaussPoints() const { return mNumGauss; } + + //--------------------------------------------------------------------- + // Algorithms + //-------------------------------------------------------------------- + + /** + * Returns the coordinates of all the Gauss points for a given element. + * \param pCooElt (in) coordinates of nodes of an element. + * \param pCoo (out) coordinates of all the Gauss points (interlaced); memory must have been allocated. + */ + void getCoordGaussPoints(const med_float* pCooElt, med_float* pCooGaussPoints) const; + + //--------------------------------------------------------------------- + // I/O + //--------------------------------------------------------------------- + + /** + * Reads a GaussLoc object from a MED file. + * \param pMEDfile any valid MED file opened for reading. + * \param pIndex index of the gauss localization to be read; must be >= 1. + * \throw IOException if any i/o error occurs. + */ + void readMED(med_idt pMEDfile, med_int pIndex); + + /** + * Writes this GaussLoc object to the given MED file. + * \param pMEDfile any valid MED file opened for writing. + * \throw IOException if any i/o error occurs. + */ + void writeMED(med_idt pMEDfile); + + /** + * Dumps any GaussLoc to the given output stream. + * \param pOs any output stream. + * \param pF any Field. + * \return the output stream pOs. + */ + friend std::ostream& operator<<(std::ostream& pOs, GaussLoc& pG); + +private: + + char mName[MED_TAILLE_NOM + 1]; /**< Name of the Gauss info. */ + med_geometrie_element mGeom; /**< Type of elements, e.g. TETRA10 (code is 310). */ + int mDim; /**< Dimension of nodes, e.g. 3 for a TETRA10. */ + int mNumNodes; /**< Number of nodes in the reference element, e.g. 10 for a TETRA10. */ + med_int mNumGauss; /**< Number of Gauss points. */ + med_float* mRefCoo; /**< Table of coordinates of nodes. + Example: for a TETRA10: 10 nodes, 3 components => 30 med_float. */ + med_float* mGaussCoo; /**< Table of coordinates of Gauss points. */ + med_float* mWeight; /**< Table of weights of Gauss points. */ + +private: + + // do not allow copy + GaussLoc& operator=(const GaussLoc&); + + // do not allow operator == + bool operator==(const GaussLoc&); + +}; // class GaussLoc + + +} // namespace MULTIPR + + +#endif // MULTIPR_GAUSSLOC_HXX + +// EOF diff --git a/src/MULTIPR/MULTIPR_Globals.hxx b/src/MULTIPR/MULTIPR_Globals.hxx new file mode 100644 index 0000000..ff51f67 --- /dev/null +++ b/src/MULTIPR/MULTIPR_Globals.hxx @@ -0,0 +1,29 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_Globals.hxx + * + * \brief Some useful macros. + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + + +#ifndef MULTIPR_GLOBALS_HXX +#define MULTIPR_GLOBALS_HXX + +//***************************************************************************** +// Some useful macros +//***************************************************************************** + +#define ENABLE_LOG 0 +#define MULTIPR_LOG(STR) if (ENABLE_LOG) cout << STR; + + +#endif // MULTIPR_GLOBALS_HXX + + +// EOF diff --git a/src/MULTIPR/MULTIPR_Mesh.cxx b/src/MULTIPR/MULTIPR_Mesh.cxx new file mode 100644 index 0000000..fc16c30 --- /dev/null +++ b/src/MULTIPR/MULTIPR_Mesh.cxx @@ -0,0 +1,1188 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_Mesh.cxx + * + * \brief see MULTIPR_Mesh.hxx + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +//***************************************************************************** +// Includes section +//***************************************************************************** + +#include "MULTIPR_Mesh.hxx" +#include "MULTIPR_Nodes.hxx" +#include "MULTIPR_Elements.hxx" +#include "MULTIPR_Family.hxx" +#include "MULTIPR_Profil.hxx" +#include "MULTIPR_GaussLoc.hxx" +#include "MULTIPR_Field.hxx" +#include "MULTIPR_MeshDis.hxx" +#include "MULTIPR_PointOfField.hxx" +#include "MULTIPR_DecimationFilter.hxx" +#include "MULTIPR_Utils.hxx" +#include "MULTIPR_Exceptions.hxx" +#include "MULTIPR_Globals.hxx" +#include "MULTIPR_API.hxx" + +using namespace std; + + +namespace multipr +{ + + +//***************************************************************************** +// Class Mesh implementation +//***************************************************************************** + +Mesh::Mesh() +{ + mNodes = NULL; + mElements = NULL; + + reset(); +} + + +Mesh::~Mesh() +{ + reset(); +} + + +void Mesh::reset() +{ + mMEDfilename[0] = '\0'; + mMEDfile = 0; + + mMeshName[0] = '\0'; + mMeshUName[0] = '\0'; + mMeshDesc[0] = '\0'; + mMeshDim = -1; + mMeshType = MED_NON_STRUCTURE; + + for (int itDim = 0 ; itDim < 3 ; itDim++) + { + mMeshBBoxMin[itDim] = numeric_limits::quiet_NaN(); + mMeshBBoxMax[itDim] = numeric_limits::quiet_NaN(); + } + + if (mNodes != NULL) { delete mNodes; mNodes = NULL; } + if (mElements != NULL) { delete mElements; mElements = NULL; } + + for (unsigned itFam = 0 ; itFam < mFamilies.size() ; itFam++) + { + delete mFamilies[itFam]; + } + mFamilies.clear(); + mFamIdToFam.clear(); + + for (unsigned itGroup = 0 ; itGroup < mGroups.size() ; itGroup++) + { + delete mGroups[itGroup]; + } + mGroups.clear(); + mGroupNameToGroup.clear(); + + for (unsigned itGaussLoc = 0 ; itGaussLoc < mGaussLoc.size() ; itGaussLoc++) + { + delete mGaussLoc[itGaussLoc]; + } + mGaussLoc.clear(); + mGaussLocNameToGaussLoc.clear(); + + for (unsigned itField = 0 ; itField < mFields.size() ; itField++) + { + delete mFields[itField]; + } + mFields.clear(); + + for (unsigned itProfil = 0 ; itProfil < mProfils.size() ; itProfil++) + { + delete mProfils[itProfil]; + } + mProfils.clear(); + + mFlagPrintAll = false; +} + + +vector Mesh::getNameFields() const +{ + vector res; + + for (int itField = 0 ; itField < mFields.size() ; itField++) + { + Field* currentField = mFields[itField]; + res.push_back(currentField->getName()); + } + + return res; +} + + +int Mesh::getTimeStamps(const char* pFieldName) const +{ + for (int itField = 0 ; itField < mFields.size() ; itField++) + { + Field* currentField = mFields[itField]; + if (strcmp(currentField->getName(), pFieldName) == 0) + { + return currentField->getNumberOfTimeSteps(); + } + } + + return 0; +} + + +Field* Mesh::getFieldByName(const char* pFieldName) const +{ + if (pFieldName == NULL) throw NullArgumentException("pFieldName should not be NULL", __FILE__, __LINE__); + + Field* retField = NULL; + + // for each field + for (unsigned itField = 0 ; itField < mFields.size() ; itField++) + { + Field* currentField = mFields[itField]; + if (strcmp(pFieldName, currentField->getName()) == 0) + { + // field found! + retField = currentField; + break; + } + } + + return retField; +} + + +GaussLoc* Mesh::getGaussLocByName(const char* pGaussLocName) const +{ + if (pGaussLocName == NULL) throw NullArgumentException("pGaussLocName should not be NULL", __FILE__, __LINE__); + + map::const_iterator itGaussLoc = mGaussLocNameToGaussLoc.find(pGaussLocName); + GaussLoc* retGaussLoc = NULL; + + if (itGaussLoc != mGaussLocNameToGaussLoc.end()) + { + retGaussLoc = (*itGaussLoc).second; + } + + return retGaussLoc; +} + + +int Mesh::getNumberOfElements() const +{ + if (mElements == NULL) throw IllegalStateException("", __FILE__, __LINE__); + + return mElements->getNumberOfElements(); +} + + +Mesh* Mesh::createFromSetOfElements(const std::set& pSetOfElements, const char* pNewMeshName) +{ + if (pNewMeshName == NULL) throw NullArgumentException("pNewMeshName", __FILE__, __LINE__); + + //--------------------------------------------------------------------- + // Create a new mesh + //--------------------------------------------------------------------- + Mesh* mesh = new Mesh(); + + //--------------------------------------------------------------------- + // Build name of the new mesh + //--------------------------------------------------------------------- + strcpy(mesh->mMeshName, pNewMeshName); + + MULTIPR_LOG("Mesh name=|" << mesh->mMeshName << "|" << endl); + + //--------------------------------------------------------------------- + // Fill general infos + //--------------------------------------------------------------------- + strcpy(mesh->mMeshUName, mMeshUName); + strcpy(mesh->mMeshDesc, mMeshDesc); + + mesh->mMeshDim = mMeshDim; + mesh->mMeshType = mMeshType; + + MULTIPR_LOG("Mesh u. name=|" << mesh->mMeshUName << "|" << endl); + MULTIPR_LOG("Mesh desc=|" << mesh->mMeshDesc << "|" << endl); + MULTIPR_LOG("Mesh dim=" << mesh->mMeshDim << endl); + MULTIPR_LOG("Mesh Type=" << mesh->mMeshType << endl); + + //--------------------------------------------------------------------- + // Build nodes and elements + //--------------------------------------------------------------------- + // get all elements involved + mesh->mElements = mElements->extractSubSet(pSetOfElements); + MULTIPR_LOG((*(mesh->mElements)) << endl); + + // get all nodes involved + const set setOfNodes = mesh->mElements->getSetOfNodes(); + mesh->mNodes = mNodes->extractSubSet(setOfNodes); + MULTIPR_LOG((*(mesh->mNodes)) << endl); + + //--------------------------------------------------------------------- + // Remap nodes + //--------------------------------------------------------------------- + mesh->mElements->remap(); + MULTIPR_LOG((*(mesh->mElements)) << endl); + + //--------------------------------------------------------------------- + // Build families + //--------------------------------------------------------------------- + MULTIPR_LOG("Build fam.:" << endl); + // get families of nodes + { + set famOfNodes = mesh->mNodes->getSetOfFamilies(); + for (set::iterator itFam = famOfNodes.begin() ; itFam != famOfNodes.end() ; itFam++) + { + Family* famSrc = mFamIdToFam[*itFam]; + cout << (*famSrc) << endl; + Family* famDest = famSrc->extractGroup(NULL); + mesh->mFamilies.push_back(famDest); + } + } + + // get families of elements + { + set famOfElt = mesh->mElements->getSetOfFamilies(); + for (set::iterator itFam = famOfElt.begin() ; itFam != famOfElt.end() ; itFam++) + { + Family* famSrc = mFamIdToFam[*itFam]; + Family* famDest = famSrc->extractGroup(NULL); + mesh->mFamilies.push_back(famDest); + } + } + + MULTIPR_LOG("Finalize:"); + + // fill families with elements and build groups + mesh->finalizeFamiliesAndGroups(); + + MULTIPR_LOG("OK\n"); + + //--------------------------------------------------------------------- + // Create new fields and collect Gauss + //--------------------------------------------------------------------- + // for each field + set newSetOfGauss; + for (unsigned itField = 0 ; itField < mFields.size() ; itField++) + { + Field* currentField = mFields[itField]; + + Field* newField; + if (currentField->isFieldOnNodes()) + { + newField = currentField->extractSubSet(setOfNodes); + } + else + { + newField = currentField->extractSubSet(pSetOfElements); + } + + if (!newField->isEmpty()) + { + mesh->mFields.push_back(newField); + newField->getSetOfGaussLoc(newSetOfGauss); + } + } + MULTIPR_LOG("Collect fields: ok: #gauss=" << newSetOfGauss.size() << endl); + + //--------------------------------------------------------------------- + // Build Gauss infos + //--------------------------------------------------------------------- + for (set::iterator itSet = newSetOfGauss.begin() ; itSet != newSetOfGauss.end(); itSet++) + { + const string& keyName = (*itSet); + + GaussLoc* gaussLoc = getGaussLocByName(keyName.c_str()); + if (gaussLoc != NULL) + { + GaussLoc* copyGaussLoc = new GaussLoc(*gaussLoc); + mesh->mGaussLoc.push_back(copyGaussLoc); + mesh->mGaussLocNameToGaussLoc.insert(make_pair(copyGaussLoc->getName(), copyGaussLoc)); + } + } + + //--------------------------------------------------------------------- + // Compute bbox + //--------------------------------------------------------------------- + mesh->mNodes->getBBox(mesh->mMeshBBoxMin, mesh->mMeshBBoxMax); + + return mesh; +} + + +Mesh* Mesh::createFromGroup(const Group* pGroup, const char* pNewMeshName) +{ + if (pGroup == NULL) throw NullArgumentException("pGroup should not be NULL", __FILE__, __LINE__); + if (pNewMeshName == NULL) throw NullArgumentException("pNewMeshName should not be NULL", __FILE__, __LINE__); + if (strlen(pNewMeshName) > MED_TAILLE_NOM) throw IllegalArgumentException("pNewMeshName length too long", __FILE__, __LINE__); + + //--------------------------------------------------------------------- + // Create a new mesh + //--------------------------------------------------------------------- + Mesh* mesh = new Mesh(); + + //--------------------------------------------------------------------- + // Build name of the new mesh + //--------------------------------------------------------------------- + strcpy(mesh->mMeshName, pNewMeshName); + + MULTIPR_LOG("Mesh name=|" << mesh->mMeshName << "|" << endl); + + //--------------------------------------------------------------------- + // Fill general infos + //--------------------------------------------------------------------- + strcpy(mesh->mMeshUName, mMeshUName); + strcpy(mesh->mMeshDesc, mMeshDesc); + + mesh->mMeshDim = mMeshDim; + mesh->mMeshType = mMeshType; + + MULTIPR_LOG("Mesh u. name=|" << mesh->mMeshUName << "|" << endl); + MULTIPR_LOG("Mesh desc=|" << mesh->mMeshDesc << "|" << endl); + MULTIPR_LOG("Mesh dim=" << mesh->mMeshDim << endl); + MULTIPR_LOG("Mesh Type=" << mesh->mMeshType << endl); + + //--------------------------------------------------------------------- + // Build nodes and elements + //--------------------------------------------------------------------- + // get all elements involved + const set setOfElt = pGroup->getSetOfElt(); + mesh->mElements = mElements->extractSubSet(setOfElt); + MULTIPR_LOG((*(mesh->mElements)) << endl); + + // get all nodes involved + const set setOfNodes = mesh->mElements->getSetOfNodes(); + mesh->mNodes = mNodes->extractSubSet(setOfNodes); + MULTIPR_LOG((*(mesh->mNodes)) << endl); + + //--------------------------------------------------------------------- + // Remap nodes + //--------------------------------------------------------------------- + mesh->mElements->remap(); + MULTIPR_LOG((*(mesh->mElements)) << endl); + + //--------------------------------------------------------------------- + // Build families + //--------------------------------------------------------------------- + MULTIPR_LOG("Build fam.:" << endl); + // get families of nodes + { + set famOfNodes = mesh->mNodes->getSetOfFamilies(); + for (set::iterator itFam = famOfNodes.begin() ; itFam != famOfNodes.end() ; itFam++) + { + Family* famSrc = mFamIdToFam[*itFam]; + Family* famDest = famSrc->extractGroup(pGroup->getName().c_str()); + mesh->mFamilies.push_back(famDest); + } + } + + // get families of elements + { + set famOfElt = mesh->mElements->getSetOfFamilies(); + for (set::iterator itFam = famOfElt.begin() ; itFam != famOfElt.end() ; itFam++) + { + Family* famSrc = mFamIdToFam[*itFam]; + Family* famDest = famSrc->extractGroup(pGroup->getName().c_str()); + mesh->mFamilies.push_back(famDest); + } + } + + MULTIPR_LOG("Finalize:"); + + // fill families with elements and build groups + mesh->finalizeFamiliesAndGroups(); + + MULTIPR_LOG("OK\n"); + + //--------------------------------------------------------------------- + // Create new fields and collect Gauss + //--------------------------------------------------------------------- + // for each field + set newSetOfGauss; + for (unsigned itField = 0 ; itField < mFields.size() ; itField++) + { + Field* currentField = mFields[itField]; + + Field* newField; + if (currentField->isFieldOnNodes()) + { + newField = currentField->extractSubSet(setOfNodes); + } + else + { + newField = currentField->extractSubSet(setOfElt); + } + + if (!newField->isEmpty()) + { + mesh->mFields.push_back(newField); + newField->getSetOfGaussLoc(newSetOfGauss); + } + } + MULTIPR_LOG("Collect fields: ok: #gauss=" << newSetOfGauss.size() << endl); + + //--------------------------------------------------------------------- + // Build Gauss infos + //--------------------------------------------------------------------- + for (set::iterator itSet = newSetOfGauss.begin() ; itSet != newSetOfGauss.end(); itSet++) + { + const string& keyName = (*itSet); + + GaussLoc* gaussLoc = getGaussLocByName(keyName.c_str()); + if (gaussLoc != NULL) + { + GaussLoc* copyGaussLoc = new GaussLoc(*gaussLoc); + mesh->mGaussLoc.push_back(copyGaussLoc); + mesh->mGaussLocNameToGaussLoc.insert(make_pair(copyGaussLoc->getName(), copyGaussLoc)); + } + } + + //--------------------------------------------------------------------- + // Compute bbox + //--------------------------------------------------------------------- + mesh->mNodes->getBBox(mesh->mMeshBBoxMin, mesh->mMeshBBoxMax); + + return mesh; +} + + +MeshDis* Mesh::splitGroupsOfElements() +{ + MeshDis* meshDis = new MeshDis(); + + // get prefix from the original MED filename + string strPrefix = removeExtension(mMEDfilename, ".med"); + + int numGroup = 1; + + // for each group + for (unsigned itGroup = 0 ; itGroup < mGroups.size() ; itGroup++) + { + Group* currentGroup = mGroups[itGroup]; + + // skip this group if it is a group of nodes + if (currentGroup->isGroupOfNodes()) + { + continue; + } + + char strPartName[256]; + sprintf(strPartName, "%s_%d", mMeshName, numGroup); + + char strMEDfilename[256]; + sprintf(strMEDfilename, "%s_grain%d.med", strPrefix.c_str(), numGroup); + + Mesh* mesh = createFromGroup(currentGroup, mMeshName); + + // skip the group which contain all the others groups, even it contains only 1 group + if ((mesh->mElements->getNumberOfElements() == mElements->getNumberOfElements()) && (mGroups.size() > 1)) + { + delete mesh; + continue; + } + + meshDis->addMesh( + MeshDisPart::MULTIPR_WRITE_MESH, + mMeshName, + numGroup, + strPartName, + "localhost", + strMEDfilename, + mesh); + + numGroup++; + } + + return meshDis; +} + + +Mesh* Mesh::decimate( + const char* pFilterName, + const char* pArgv, + const char* pNameNewMesh) +{ + //--------------------------------------------------------------------- + // Check parameters + //--------------------------------------------------------------------- + if (pFilterName == NULL) throw NullArgumentException("pFilterName should not be NULL", __FILE__, __LINE__); + if (pArgv == NULL) throw NullArgumentException("pArgv should not be NULL", __FILE__, __LINE__); + if (pNameNewMesh == NULL) throw NullArgumentException("pNameNewMesh should not be NULL", __FILE__, __LINE__); + + //--------------------------------------------------------------------- + // Instanciate filter used for decimation + //--------------------------------------------------------------------- + DecimationFilter* filter = DecimationFilter::create(pFilterName); + + //--------------------------------------------------------------------- + // Create new mesh by decimating current one + //--------------------------------------------------------------------- + Mesh* decimatedMesh = filter->apply(this, pArgv, pNameNewMesh); + + //--------------------------------------------------------------------- + // Cleans + //--------------------------------------------------------------------- + delete filter; + + return decimatedMesh; +} + + + +void Mesh::getAllPointsOfField(Field* pField, int pTimeStepIt, std::vector& pPoints) +{ + //--------------------------------------------------------------------- + // Check arguments + //--------------------------------------------------------------------- + + if (pField == NULL) throw NullArgumentException("field should not be NULL", __FILE__, __LINE__); + if (pTimeStepIt < 1) throw IllegalArgumentException("invalid field iteration; should be >= 1", __FILE__, __LINE__); + + if (mMeshDim != 3) throw UnsupportedOperationException("not yet implemented", __FILE__, __LINE__); + if (pField->getType() != MED_FLOAT64) throw UnsupportedOperationException("not yet implemented", __FILE__, __LINE__); + if (pField->getNumberOfComponents() != 1) throw UnsupportedOperationException("field have more than 1 component (vectorial field, expected scalar field)", __FILE__, __LINE__); + + //--------------------------------------------------------------------- + // Collect points + //--------------------------------------------------------------------- + + if (pField->isFieldOnNodes()) + { + //------------------------------------------------------------- + // Case 1: field of nodes + //------------------------------------------------------------- + if (mNodes == NULL) throw IllegalStateException("no nodes in the current mesh", __FILE__, __LINE__); + + // for each node + for (int itNode = 0, size = mNodes->getNumberOfNodes() ; itNode < size ; itNode++) + { + // collect coordinates and value of the point + const med_float* coo = mNodes->getCoordinates(itNode); + + const med_float* val = + reinterpret_cast(pField->getValue(pTimeStepIt, itNode + 1)); + + // add new point + pPoints.push_back(PointOfField(coo[0], coo[1], coo[2], val[0])); + } + } + else + { + //------------------------------------------------------------- + // Case 2: field of elements + //------------------------------------------------------------- + + if (mElements == NULL) throw IllegalStateException("no elements in the current mesh", __FILE__, __LINE__); + if (mElements->getTypeOfPrimitives() != MED_TETRA10) throw UnsupportedOperationException("only support TETRA10 mesh", __FILE__, __LINE__); + + const string& nameGaussLoc = pField->getNameGaussLoc(pTimeStepIt); + GaussLoc* gaussLoc = getGaussLocByName(nameGaussLoc.c_str()); + if (gaussLoc == NULL) throw IllegalStateException("no Gauss localization for these elements", __FILE__, __LINE__); + + int numGauss = pField->getNumberOfGaussPointsByElement(pTimeStepIt); + + int size = gaussLoc->getDim() * gaussLoc->getNumGaussPoints(); + med_float* cooGaussPts = new med_float[size]; + + int dim = mElements->getTypeOfPrimitives() / 100; + int numNodes = mElements->getTypeOfPrimitives() % 100; + size = dim * numNodes; + med_float* cooNodes = new med_float[size]; + + // for each elements + for (int itElt = 0, size = mElements->getNumberOfElements() ; itElt < size ; itElt++) + { + // get coordinates of nodes of the current elements + // OPTIMIZATION: ASSUME TETRA10: ONLY GETS THE 4 FIRST NODES OF EACH ELEMENT + mElements->getCoordinates(itElt, mNodes, cooNodes, 4); + + // compute coordinates of gauss points + gaussLoc->getCoordGaussPoints(cooNodes, cooGaussPts); + + //printArray2D(cooGaussPts, 5, 3, "Gauss pt"); + + const med_float* val = + reinterpret_cast(pField->getValue(pTimeStepIt, itElt + 1)); + + // for each point of Gauss of the element + med_float* srcCoo = cooGaussPts; + for (int itPtGauss = 0 ; itPtGauss < numGauss ; itPtGauss++) + { + pPoints.push_back(PointOfField(srcCoo[0], srcCoo[1], srcCoo[2], val[itPtGauss])); + srcCoo += 3; + } + } + + delete[] cooNodes; + delete[] cooGaussPts; + } +} + + +float Mesh::evalDefaultRadius(int pN) const +{ + if (mFields.size() == 0) return 1.0f; + + //--------------------------------------------------------------------- + // Compute default radius + //--------------------------------------------------------------------- + + med_float volumeBBox = + (mMeshBBoxMax[0] - mMeshBBoxMin[0]) * + (mMeshBBoxMax[1] - mMeshBBoxMin[1]) * + (mMeshBBoxMax[2] - mMeshBBoxMin[2]); + + if (isnan(volumeBBox)) + { + return 1.0f; + } + + const med_float k = 0.8; // considered 80% of the volume + + // get nunmber of gauss points in the field + try + { + Field* anyField = mFields[mFields.size()-1]; + int numTimeSteps = anyField->getNumberOfTimeSteps(); + + int numGaussPoints = getNumberOfElements() * anyField->getNumberOfGaussPointsByElement(numTimeSteps-1); + + med_float radius = med_float(pow( (3.0/4.0) * pN * k * volumeBBox / (3.1415 * numGaussPoints), 1.0/3.0)); + + return float(radius); + } + catch (...) + { + return 1.0f; + } +} + + +med_geometrie_element CELL_TYPES[MED_NBR_GEOMETRIE_MAILLE] = +{ + MED_POINT1, + MED_SEG2, + MED_SEG3, + MED_TRIA3, + MED_TRIA6, + MED_QUAD4, + MED_QUAD8, + MED_TETRA4, + MED_TETRA10, + MED_HEXA8, + MED_HEXA20, + MED_PENTA6, + MED_PENTA15 +}; + + +char CELL_NAMES[MED_NBR_GEOMETRIE_MAILLE][MED_TAILLE_NOM + 1] = +{ + "MED_POINT1", + "MED_SEG2", + "MED_SEG3", + "MED_TRIA3", + "MED_TRIA6", + "MED_QUAD4", + "MED_QUAD8", + "MED_TETRA4", + "MED_TETRA10", + "MED_HEXA8", + "MED_HEXA20", + "MED_PENTA6", + "MED_PENTA15", + "MED_PYRA5", + "MED_PYRA13" +}; + + +void Mesh::readSequentialMED(const char* pMEDfilename, const char* pMeshName) +{ + reset(); + + //--------------------------------------------------------------------- + // Check arguments + //--------------------------------------------------------------------- + MULTIPR_LOG("Check arguments: "); + if (pMEDfilename == NULL) throw NullArgumentException("pMEDfilename should not be NULL", __FILE__, __LINE__); + if (pMeshName == NULL) throw NullArgumentException("pMeshName should not be NULL", __FILE__, __LINE__); + MULTIPR_LOG("OK\n"); + + strncpy(mMEDfilename, pMEDfilename, 256); + strncpy(mMeshName, pMeshName, MED_TAILLE_NOM); + + //--------------------------------------------------------------------- + // Open MED file (READ_ONLY) + //--------------------------------------------------------------------- + MULTIPR_LOG("Open MED file: "); + mMEDfile = MEDouvrir(mMEDfilename, MED_LECTURE); // open MED file for reading + if (mMEDfile <= 0) throw FileNotFoundException("MED file not found", __FILE__, __LINE__); + MULTIPR_LOG("OK\n"); + + //--------------------------------------------------------------------- + // Check valid HDF format + //--------------------------------------------------------------------- + MULTIPR_LOG("Format HDF: "); + if (MEDformatConforme(mMEDfilename) != 0) throw IOException("invalid file", __FILE__, __LINE__); + MULTIPR_LOG("OK\n"); + + //--------------------------------------------------------------------- + // Get MED version + //--------------------------------------------------------------------- + MULTIPR_LOG("MED version: "); + med_int verMajor, verMinor, verRelease; + med_err ret = MEDversionLire(mMEDfile, &verMajor, &verMinor, &verRelease); + if (ret != 0) throw IOException("error while reading MED version", __FILE__, __LINE__); + MULTIPR_LOG(verMajor << "." << verMinor << "." << verRelease << ": OK\n"); + + //--------------------------------------------------------------------- + // Check that there is no profil + //--------------------------------------------------------------------- + MULTIPR_LOG("#profils must be 0: "); + med_int nbProfils = MEDnProfil(mMEDfile); + if (nbProfils != 0) throw UnsupportedOperationException("not yet implemented", __FILE__, __LINE__); + MULTIPR_LOG("OK\n"); + + //--------------------------------------------------------------------- + // Read all Gauss localizations + //--------------------------------------------------------------------- + readGaussLoc(); + + //--------------------------------------------------------------------- + // Read scalars (should be 0) + //--------------------------------------------------------------------- + MULTIPR_LOG("Scalars: "); + med_int nbScalars = MEDnScalaire(mMEDfile); + if (nbScalars != 0) throw UnsupportedOperationException("not yet implemented", __FILE__, __LINE__); + MULTIPR_LOG(nbScalars << ": OK\n"); + + //--------------------------------------------------------------------- + // Find the mesh + //--------------------------------------------------------------------- + // read number of meshes + MULTIPR_LOG("Num meshes: "); + med_int nbMeshes = MEDnMaa(mMEDfile); + if (nbMeshes <= 0) throw IOException("i/o error while reading number of meshes in MED file", __FILE__, __LINE__); + MULTIPR_LOG(nbMeshes << ": OK\n"); + + med_int meshIndex = -1; + // iteration over mesh to find the mesh we want + // for each mesh in the file (warning: first mesh is number 1) + for (int itMesh = 1 ; itMesh <= nbMeshes ; itMesh++) + { + char meshName[MED_TAILLE_NOM + 1]; + + ret = MEDmaaInfo( + mMEDfile, + itMesh, + meshName, + &mMeshDim, + &mMeshType, + mMeshDesc); + + if (ret != 0) throw IOException("i/o error while reading mesh information in MED file", __FILE__, __LINE__); + MULTIPR_LOG("Mesh: |" << meshName << "|"); + + // test if the current mesh is the mesh we want + if (strcmp(pMeshName, meshName) == 0) + { + // *** mesh found *** + MULTIPR_LOG(" OK (found)\n"); + meshIndex = itMesh; + break; + } + else + { + // not the mesh we want: skip this mesh + MULTIPR_LOG(" skipped\n"); + } + } + + if (meshIndex == -1) + { + throw IllegalStateException("mesh not found in the given MED file", __FILE__, __LINE__); + } + + //--------------------------------------------------------------------- + // Check mesh validity + //--------------------------------------------------------------------- + // dimension of the mesh must be 3 (= 3D mesh) + MULTIPR_LOG("Mesh is 3D: "); + if (mMeshDim != 3) throw UnsupportedOperationException("dimension of the mesh should be 3; other dimension not yet implemented", __FILE__, __LINE__); + MULTIPR_LOG("OK\n"); + + // mesh must not be a grid + MULTIPR_LOG("Mesh is not a grid: "); + if (mMeshType != MED_NON_STRUCTURE) + throw UnsupportedOperationException("grid not supported", __FILE__, __LINE__); + MULTIPR_LOG("OK\n"); + + // mesh must only contain TETRA10 elements + MULTIPR_LOG("Only TETRA10: "); + med_connectivite connectivite = MED_NOD; // NODAL CONNECTIVITY ONLY + bool onlyTETRA10 = true; + int numTetra10 = -1; + for (int itCell = 0 ; itCell < MED_NBR_GEOMETRIE_MAILLE ; itCell++) + { + med_int meshNumCells = MEDnEntMaa( + mMEDfile, + mMeshName, + MED_CONN, + MED_MAILLE, + CELL_TYPES[itCell], + connectivite); + + if ((meshNumCells > 0) && (strcmp(CELL_NAMES[itCell], "MED_TETRA10") != 0)) + { + onlyTETRA10 = false; + break; + } + if (strcmp(CELL_NAMES[itCell], "MED_TETRA10") == 0) + { + numTetra10 = meshNumCells; + } + } + + if (!onlyTETRA10) throw UnsupportedOperationException("mesh should only contain TETRA10 elements", __FILE__, __LINE__); + MULTIPR_LOG(numTetra10 << ": OK\n"); + + // everything is OK... + + //--------------------------------------------------------------------- + // Check num joint = 0 + //--------------------------------------------------------------------- + MULTIPR_LOG("Num joints: "); + med_int numJoints = MEDnJoint(mMEDfile, mMeshName); + MULTIPR_LOG(numJoints << ": OK\n"); + + //--------------------------------------------------------------------- + // Check num equivalence = 0 + //--------------------------------------------------------------------- + MULTIPR_LOG("Num equivalences: "); + med_int numEquiv = MEDnEquiv(mMEDfile, mMeshName); + MULTIPR_LOG(numEquiv << ": OK\n"); + + //--------------------------------------------------------------------- + // Read nodes + //--------------------------------------------------------------------- + mNodes = new Nodes(); + mNodes->readMED(mMEDfile, mMeshName, mMeshDim); + mNodes->getBBox(mMeshBBoxMin, mMeshBBoxMax); + + //--------------------------------------------------------------------- + // Read elements + //--------------------------------------------------------------------- + mElements = new Elements(); + mElements->readMED(mMEDfile, mMeshName, mMeshDim, MED_MAILLE, MED_TETRA10); + + //--------------------------------------------------------------------- + // Read families + //--------------------------------------------------------------------- + readFamilies(); + finalizeFamiliesAndGroups(); + + //--------------------------------------------------------------------- + // Read fields + //--------------------------------------------------------------------- + readFields(); + + //--------------------------------------------------------------------- + // Close the MED file + //--------------------------------------------------------------------- + MULTIPR_LOG("Close MED file: "); + ret = MEDfermer(mMEDfile); + if (ret != 0) throw IOException("i/o error while closing MED file", __FILE__, __LINE__); + MULTIPR_LOG("OK\n"); +} + + +void Mesh::writeMED(const char* pMEDfilename) +{ + MULTIPR_LOG("Write MED: " << pMEDfilename << endl); + + if (pMEDfilename == NULL) throw NullArgumentException("pMEDfilename should not be NULL", __FILE__, __LINE__); + if (strlen(pMEDfilename) == 0) throw IllegalArgumentException("pMEDfilename size is 0", __FILE__, __LINE__); + + remove(pMEDfilename); + + //--------------------------------------------------------------------- + // Create the new MED file (WRITE_ONLY) + //--------------------------------------------------------------------- + med_idt newMEDfile = MEDouvrir(const_cast(pMEDfilename), MED_CREATION); + if (newMEDfile == -1) throw IOException("", __FILE__, __LINE__); + + //--------------------------------------------------------------------- + // Write scalars + //--------------------------------------------------------------------- + // no scalars to write + + //--------------------------------------------------------------------- + // Create mesh: must be created first + //--------------------------------------------------------------------- + med_err ret = MEDmaaCr( + newMEDfile, + mMeshName, + mMeshDim, + MED_NON_STRUCTURE, + mMeshDesc); + + if (ret != 0) throw IOException("", __FILE__, __LINE__); + MULTIPR_LOG(" Create mesh: |" << mMeshName << "|: OK" << endl); + + //--------------------------------------------------------------------- + // Write nodes and elements (mesh must exist) + //--------------------------------------------------------------------- + mNodes->writeMED(newMEDfile, mMeshName); + MULTIPR_LOG(" Write nodes: ok" << endl); + mElements->writeMED(newMEDfile, mMeshName, mMeshDim); + MULTIPR_LOG(" write elt: ok" << endl); + + //--------------------------------------------------------------------- + // Write families (mesh must exist) + //--------------------------------------------------------------------- + for (unsigned itFam = 0 ; itFam < mFamilies.size() ; itFam++) + { + Family* fam = mFamilies[itFam]; + fam->writeMED(newMEDfile, mMeshName); + } + MULTIPR_LOG(" Write families: ok" << endl); + + //--------------------------------------------------------------------- + // Write profil + //--------------------------------------------------------------------- + // no profil + + //--------------------------------------------------------------------- + // Write Gauss localization (must be written before fields) + //--------------------------------------------------------------------- + for (unsigned itGaussLoc = 0 ; itGaussLoc < mGaussLoc.size() ; itGaussLoc++) + { + + GaussLoc* gaussLoc = mGaussLoc[itGaussLoc]; + gaussLoc->writeMED(newMEDfile); + } + MULTIPR_LOG(" Write Gauss: ok" << endl); + + //--------------------------------------------------------------------- + // Write fields + //--------------------------------------------------------------------- + for (unsigned itField = 0 ; itField < mFields.size() ; itField++) + { + Field* field = mFields[itField]; + field->writeMED(newMEDfile, mMeshName); + } + MULTIPR_LOG(" Write fields: ok" << endl); + + //--------------------------------------------------------------------- + // Close the new MED file + //--------------------------------------------------------------------- + ret = MEDfermer(newMEDfile); + if (ret != 0) throw IOException("", __FILE__, __LINE__); +} + + +void Mesh::readGaussLoc() +{ + MULTIPR_LOG("Gauss ref: "); + med_int numGauss = MEDnGauss(mMEDfile); + if (numGauss < 0) throw IOException("", __FILE__, __LINE__); + MULTIPR_LOG(numGauss << ": OK\n"); + + for (int itGauss = 1 ; itGauss <= numGauss ; itGauss++) + { + GaussLoc* gaussLoc = new GaussLoc(); + gaussLoc->readMED(mMEDfile, itGauss); + + MULTIPR_LOG((*gaussLoc) << endl); + + mGaussLoc.push_back(gaussLoc); + mGaussLocNameToGaussLoc.insert(make_pair(gaussLoc->getName(), gaussLoc)); + } +} + + +void Mesh::readFamilies() +{ + med_int numFamilies = MEDnFam(mMEDfile, mMeshName); + if (numFamilies <= 0) throw IOException("", __FILE__, __LINE__); + + for (int itFam = 1 ; itFam <= numFamilies ; itFam++) + { + Family* fam = new Family(); + fam->readMED(mMEDfile, mMeshName, itFam); + mFamilies.push_back(fam); + } +} + + +void Mesh::finalizeFamiliesAndGroups() +{ + //--------------------------------------------------------------------- + // Build mapping between family id and pointers towards families + //--------------------------------------------------------------------- + for (unsigned itFam = 0 ; itFam < mFamilies.size() ; itFam++) + { + Family* fam = mFamilies[itFam]; + mFamIdToFam.insert(make_pair(fam->getId(), fam)); + } + + //--------------------------------------------------------------------- + // Fill families of nodes + //--------------------------------------------------------------------- + for (int itNode = 1 ; itNode <= mNodes->getNumberOfNodes() ; itNode++) + { + // get family of the ith nodes + int famIdent = mNodes->getFamIdent(itNode - 1); // MED nodes start at 1 + map::iterator itFam = mFamIdToFam.find(famIdent); + + if (itFam == mFamIdToFam.end()) throw IllegalStateException("", __FILE__, __LINE__); + + Family* fam = (*itFam).second; + + // insert the current node to its family + fam->insertElt(itNode); + fam->setIsFamilyOfNodes(true); + } + + //--------------------------------------------------------------------- + // Fill families of elements + //--------------------------------------------------------------------- + for (int itElt = 1 ; itElt <= mElements->getNumberOfElements() ; itElt++) + { + // get family of the ith element (MED index start at 1) + int famIdent = mElements->getFamilyIdentifier(itElt - 1); + map::iterator itFam = mFamIdToFam.find(famIdent); + + if (itFam == mFamIdToFam.end()) throw IllegalStateException("", __FILE__, __LINE__); + + Family* fam = (*itFam).second; + + // insert the current node its family + fam->insertElt(itElt); + fam->setIsFamilyOfNodes(false); + } + + //--------------------------------------------------------------------- + // Build groups + //--------------------------------------------------------------------- + // for each family + for (unsigned itFam = 0 ; itFam < mFamilies.size() ; itFam++) + { + mFamilies[itFam]->buildGroups(mGroups, mGroupNameToGroup); + } +} + + +void Mesh::readFields() +{ + //--------------------------------------------------------------------- + // Read number of fields + //--------------------------------------------------------------------- + MULTIPR_LOG("Read fields: "); + med_int numFields = MEDnChamp(mMEDfile, 0); + if (numFields <= 0) throw IOException("", __FILE__, __LINE__); + MULTIPR_LOG(numFields << ": OK\n"); + + //--------------------------------------------------------------------- + // Iterate over fields + //--------------------------------------------------------------------- + // for each field, read number of components and others infos + for (int itField = 1 ; itField <= numFields ; itField++) + { + Field* field = new Field(); + field->readMED(mMEDfile, itField, mMeshName); + + // if the nth field does not apply on our mesh => slip it + if (field->isEmpty()) + { + delete field; + } + else + { + mFields.push_back(field); + } + } +} + + +ostream& operator<<(ostream& pOs, Mesh& pM) +{ + pOs << "Mesh: " << endl; + pOs << " MED file =|" << pM.mMEDfilename << "|" << endl; + pOs << " Name =|" << pM.mMeshName << "|" << endl; + pOs << " Unv name =|" << pM.mMeshUName << "|" << endl; + pOs << " Desc =|" << pM.mMeshDesc << "|" << endl; + pOs << " Dim =" << pM.mMeshDim << endl; + pOs << " Type =" << ((pM.mMeshType == MED_STRUCTURE)?"STRUCTURE":"NON_STRUCTURE") << endl; + pOs << " BBox =[" << pM.mMeshBBoxMin[0] << " ; " << pM.mMeshBBoxMax[0] << "] x [" << pM.mMeshBBoxMin[1] << " ; " << pM.mMeshBBoxMax[1] << "] x [" << pM.mMeshBBoxMin[2] << " ; " << pM.mMeshBBoxMax[2] << "]" << endl; + + if (pM.mFlagPrintAll) + { + cout << (*(pM.mNodes)) << endl; + cout << (*(pM.mElements)) << endl; + + pOs << " Families : #=" << pM.mFamilies.size() << endl; + for (unsigned i = 0 ; i < pM.mFamilies.size() ; i++) + { + cout << (*(pM.mFamilies[i])) << endl; + } + + pOs << " Groups : #=" << pM.mGroups.size() << endl; + for (unsigned i = 0 ; i < pM.mGroups.size() ; i++) + { + cout << (*(pM.mGroups[i])) << endl; + } + + pOs << " Gauss loc: #=" << pM.mGaussLoc.size() << endl; + for (unsigned i = 0 ; i < pM.mGaussLoc.size() ; i++) + { + cout << (*(pM.mGaussLoc[i])) << endl; + } + + pOs << " Fields : #=" << pM.mFields.size() << endl; + for (unsigned i = 0 ; i < pM.mFields.size() ; i++) + { + cout << (*(pM.mFields[i])) << endl; + } + } + else + { + pOs << " Nodes : #=" << pM.mNodes->getNumberOfNodes() << endl; + + const set& setOfNodes = pM.mElements->getSetOfNodes(); + if (setOfNodes.size() == 0) + { + pOs << " Elt : #=" << pM.mElements->getNumberOfElements() << endl; + } + else + { + set::iterator itNode = setOfNodes.end(); + itNode--; + pOs << " Elt : #=" << pM.mElements->getNumberOfElements() << " node_id_min=" << (*(setOfNodes.begin())) << " node_id_max=" << (*itNode) << endl; + } + + pOs << " Families : #=" << pM.mFamilies.size() << endl; + pOs << " Groups : #=" << pM.mGroups.size() << endl; + pOs << " Gauss loc: #=" << pM.mGaussLoc.size() << endl; + pOs << " Fields : #=" << pM.mFields.size() << endl; + } + + return pOs; +} + + +} // namespace multipr + +// EOF diff --git a/src/MULTIPR/MULTIPR_Mesh.hxx b/src/MULTIPR/MULTIPR_Mesh.hxx new file mode 100644 index 0000000..d72bd8b --- /dev/null +++ b/src/MULTIPR/MULTIPR_Mesh.hxx @@ -0,0 +1,378 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_Mesh.hxx + * + * \brief Class Mesh used by the MULTIPR API; used to wrap MED file meshes. + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +#ifndef MULTIPR_MESH_HXX +#define MULTIPR_MESH_HXX + +//***************************************************************************** +// Includes section +//***************************************************************************** + +extern "C" +{ + #include "med.h" +} + +#include +#include +#include +#include +#include +#include + + +namespace multipr +{ + +//***************************************************************************** +// Pre-declaration +//***************************************************************************** + +class GaussLoc; +class Profil; +class Nodes; +class Elements; +class Family; +class Field; +class Group; +class MeshDis; +class PointOfField; + + +//***************************************************************************** +// Class Mesh +//***************************************************************************** + +/** + * Assumes: + * - 3D mesh in a 3D space + * - Unstructured mesh (not a grid) + * - Nodal connectivity + * - Cartesian coordinates system + * Always use FULL_INTERLACE arrays + */ +class Mesh +{ +public: + + /** + * Builds an empty Mesh (default constructor). + */ + Mesh(); + + /** + * Destructor. Removes everything. + */ + ~Mesh(); + + /** + * Resets this object in its state by default (empty). Cleans memory. + */ + void reset(); + + //--------------------------------------------------------------------- + // Basic accessors/mutators + //--------------------------------------------------------------------- + + /** + * Returns the name of this Mesh. + * \return the name of this Mesh. + */ + const char* getName() const { return mMeshName; } + + /** + * Returns the name of all the fields. + * \return the name of all the fields. + */ + std::vector getNameFields() const; + + /** + * Returns the number of iteration for a given field. + * \return the number of iteration for a given field. + */ + int getTimeStamps(const char* pFieldName) const; + + /** + * Returns a Field from its name; NULL if it does not exist. + * \param pFieldName name of the field to be retrieved. + * \return the Field pFieldName of it exists, NULL otherwise. + * \throw NullArgumentException if pFieldName is NULL. + */ + Field* getFieldByName(const char* pFieldName) const; + + /** + * Returns a GaussLoc from its name; NULL if it does not exist. + * \param pGaussLocName name of the GaussLoc to be retrieved. + * \return the GaussLoc pGaussLocName if it exists, NULL otherwise. + * \throw NullArgumentException if pGaussLocName is NULL. + */ + GaussLoc* getGaussLocByName(const char* pGaussLocName) const; + + /** + * Returns true iff the given 3D-point is in the bounding box of this Mesh. + * \param pX + * \param pY + * \param pZ + * \return true iff the given 3D-point is in the bounding box of this Mesh. + */ + bool isInBBox(med_float pX, med_float pY, med_float pZ) const + { + return ((pX >= mMeshBBoxMin[0]) && (pX <= mMeshBBoxMax[0]) && + (pY >= mMeshBBoxMin[1]) && (pY <= mMeshBBoxMax[1]) && + (pZ >= mMeshBBoxMin[2]) && (pZ <= mMeshBBoxMax[2])); + } + + /** + * Returns the number of elements. + * \return the number of elements. + */ + int getNumberOfElements() const; + + //--------------------------------------------------------------------- + // Algorithms + //--------------------------------------------------------------------- + + /** + * Creates a Mesh from a subset of its elements (cells). + * \param pSetOfElements subset of elements to keep. + * \param pNewMeshName name of the new Mesh. + * \return a new Mesh which is a restriction of this Mesh to the given set of elements. + * \throw NullArgumentException if pNewMeshName is NULL. + */ + Mesh* createFromSetOfElements(const std::set& pSetOfElements, const char* pNewMeshName); + + /** + * Creates a Mesh from one of its group. + * \param pGroup any group of this Mesh. + * \param pNewMeshName name of the new Mesh. + * \return a new Mesh which is a restriction of this Mesh to pGroup. + * \throw NullArgumentException if pGroup or pNewMeshName is NULL. + */ + Mesh* createFromGroup(const Group* pGroup, const char* pNewMeshName); + + /** + * Creates a distributed mesh (MeshDis) by creating a new mesh for each group of elements in this Mesh. + * \return a distributed mesh from groups of this Mesh. + */ + MeshDis* splitGroupsOfElements(); + + /** + * Creates a new mesh by decimating this one. + * \param pFilterName name of the filter to be used for decimation (e.g. Filtre_GradientMoyen); should not be NULL. + * \param pArgv all the arguments for filtering as a single string. + * \param pNameNewMesh name of the new mesh. + * \return the decimated mesh. + * \throw NullArgumentException if one of the arguments is NULL. + * \throw RuntimeException if any error occurs while decimating data. + */ + Mesh* decimate( + const char* pFilterName, + const char* pArgv, + const char* pNameNewMesh); + + /** + * Gets all the points in a field. Each point has coordinates and a value. + * \param pField any field of this Mesh. + * \param pTimeStepIt time step iteration. + * \param pPoints (out) list of points. + * \throw NullArgumentException if pField is NULL. + * \throw IllegalArgumentException if pTimeStepIt is invalid. + */ + void getAllPointsOfField(Field* pField, int pTimeStepIt, std::vector& pPoints); + + /** + * Returns a default value for neighborhood radius. + * Return value is such that, for any point in the field, average number of neighbours is pN. + * \param pN average number of neighbours. + * \return a default value for neighborhood radius; 1.0 if some error occurs. + */ + float evalDefaultRadius(int pN) const; + + //--------------------------------------------------------------------- + // I/O + //--------------------------------------------------------------------- + + /** + * Reads a Mesh from a sequential MED file. Resets the object before. + * \param pMEDfilename + * \param pMeshName + * \throw IOException if any i/o error occurs. + */ + void readSequentialMED(const char* pMEDfilename, const char* pMeshName); + + /** + * Writes this Mesh and all related things into a MED file. + * \param pMEDfilename + * \throw IOException if any i/o error occurs. + */ + void writeMED(const char* pMEDfilename); + + /** + * Sets the flag which control the stream operator <<. + * \param pFlag new flag value. + */ + void setPrintAll(bool pFlag) { mFlagPrintAll = pFlag; } + + /** + * Dumps any Mesh to the given output stream. + * \param pOs any output stream. + * \param pM any Mesh. + * \return the output stream pOs. + */ + friend std::ostream& operator<<(std::ostream& pOs, Mesh& pM); + +private: + + /** + * Reads all Gauss localizations in the current MED file. + * \throw IOException if an i/o error occurs. + */ + void readGaussLoc(); + + /** + * Reads families in the currentMED file and build groups. + * \throw IOException if an i/o error occurs. + */ + void readFamilies(); + + /** + * Finalizes the constructions of families and groups. + * Fill structures with elements. + */ + void finalizeFamiliesAndGroups(); + + /** + * Reads fields related to this mesh in the current MED file. + * \throw IOException if an i/o error occurs. + */ + void readFields(); + +private: + + /** + * Name of the associated MED file. + */ + char mMEDfilename[256]; + + /** + * MED file handle. + */ + med_idt mMEDfile; + + /** + * Name of this mesh. + */ + char mMeshName[MED_TAILLE_NOM + 1]; + + /** + * Universal name of this mesh. + */ + char mMeshUName[MED_TAILLE_DESC + 1]; + + /** + * Description. + */ + char mMeshDesc[MED_TAILLE_DESC + 1]; + + /** + * Dimension. + */ + med_int mMeshDim; + + /** + * Type of mesh (MED_NON_STRUCTURE or MED_STRUCTURE (=grid)) + */ + med_maillage mMeshType; + + /** + * Axis aligned bounding box of this mesh. + */ + med_float mMeshBBoxMin[3]; + med_float mMeshBBoxMax[3]; + + /** + * All the nodes used by this mesh. + */ + Nodes* mNodes; + + /** + * All the TETRA10 elements used by this mesh. + */ + Elements* mElements; + + /** + * Table of families used by this mesh. + */ + std::vector mFamilies; + + /** + * Map to retrieve a Family from its name. + */ + std::map mFamIdToFam; + + /** + * Table of groups used by this mesh. + */ + std::vector mGroups; + + /** + * Map to retrieve a Group from its name. + */ + std::map mGroupNameToGroup; + + /** + * Table of GaussLoc. + */ + std::vector mGaussLoc; + + /** + * Map to retrieve a Gauss info from its name. + */ + std::map mGaussLocNameToGaussLoc; + + /** + * Table of fields related to this mesh. + * Number of fiels = mFields.size(). + */ + std::vector mFields; + + /** + * Table of profils. + */ + std::vector mProfils; + + /** + * Flag to control the behaviour of the stream operator <<. + */ + bool mFlagPrintAll; + +private: + + // do not allow copy constructor + Mesh(const Mesh&); + + // do not allow copy + Mesh& operator=(const Mesh&); + + // do not allow operator == + bool operator==(const Mesh&); + +}; // class Mesh + + +} // namespace MULTIPR + + +#endif // MULTIPR_MESH_HXX + +// EOF diff --git a/src/MULTIPR/MULTIPR_MeshDis.cxx b/src/MULTIPR/MULTIPR_MeshDis.cxx new file mode 100644 index 0000000..3a856f3 --- /dev/null +++ b/src/MULTIPR/MULTIPR_MeshDis.cxx @@ -0,0 +1,893 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_MeshDis.cxx + * + * \brief see MULTIPR_MeshDis.hxx + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +//***************************************************************************** +// Includes section +//***************************************************************************** + +#include "MULTIPR_MeshDis.hxx" +#include "MULTIPR_Mesh.hxx" +#include "MULTIPR_Utils.hxx" +#include "MULTIPR_Globals.hxx" +#include "MULTIPR_API.hxx" +#include "MULTIPR_Exceptions.hxx" +#include "MULTIPR_ProgressCallback.hxx" + +#include "MEDSPLITTER_API.hxx" + +#include +#include + +using namespace std; + + +namespace multipr +{ + + +//***************************************************************************** +// Global variables (exported) +//***************************************************************************** + +MULTIPR_ProgressCallback* gProgressCallback = NULL; + + +//***************************************************************************** +// Class MeshDisEntry implementation +//***************************************************************************** + +MeshDisPart::MeshDisPart() +{ + mMesh = NULL; + mCollection = NULL; + mOldCollection = NULL; + + reset(); +} + + +MeshDisPart::~MeshDisPart() +{ + reset(); +} + + +void MeshDisPart::reset() +{ + mToDoOnNextWrite = MULTIPR_UNDEFINED; + + mMeshName[0] = '\0'; + mId = 0; + mPartName[0] = '\0'; + mPath[0] = '\0'; + mMEDFileName[0] = '\0'; + + if (mMesh != NULL) + { + delete mMesh; + mMesh = NULL; + } + + mSplit = 0; + + if (mCollection != NULL) + { + delete mCollection; + mCollection = NULL; + } + + if (mOldCollection != NULL) + { + delete mOldCollection; + mOldCollection = NULL; + } +} + + +const char* MeshDisPart::getMEDFileNameSuffix() const +{ + // "agregat100grains_12pas_grain97.med" -> "grain97" + // "agregat100grains_12pas_grain100_part2.med" -> "grain100_part2" + // "aagregat100grains_12pas_grain98_gradmoy-low-25.0-0.3.med" -> "grain98_gradmoy-low-25-0.3" + + string prefix = removeExtension(mMEDFileName, ".med"); + prefix.erase(0, prefix.rfind("grain")); + return prefix.c_str(); +} + + +void MeshDisPart::create( + OnNextWrite pToDoOnNextWrite, + const char* pMeshName, + int pId, + const char* pPartName, + const char* pPath, + const char* pMEDFileName, + Mesh* pMesh) +{ + if (pToDoOnNextWrite == MULTIPR_UNDEFINED) throw IllegalArgumentException("", __FILE__, __LINE__); + if (pMeshName == NULL) throw NullArgumentException("", __FILE__, __LINE__); + if (pId < 1) throw IllegalArgumentException("", __FILE__, __LINE__); + if (pPartName == NULL) throw NullArgumentException("", __FILE__, __LINE__); + if (pPath == NULL) throw NullArgumentException("", __FILE__, __LINE__); + if (pMEDFileName == NULL) throw NullArgumentException("", __FILE__, __LINE__); + + reset(); + + mToDoOnNextWrite = pToDoOnNextWrite; + strcpy(mMeshName, pMeshName); + mId = pId; + strcpy(mPartName, pPartName); + strcpy(mPath, pPath); + strcpy(mMEDFileName, pMEDFileName); + mMesh = pMesh; + +} + + +void MeshDisPart::readMED() +{ + if (mMesh != NULL) throw IllegalStateException("", __FILE__, __LINE__); + if (mCollection != NULL) throw IllegalStateException("", __FILE__, __LINE__); + if (mOldCollection != NULL) throw IllegalStateException("", __FILE__, __LINE__); + + //cout << "read MED : mesh=" << mMEDfilename << endl; + + mMesh = new Mesh(); + mMesh->readSequentialMED(mMEDFileName, mMeshName); +} + + +ostream& operator<<(ostream& pOs, MeshDisPart& pM) +{ + switch (pM.mToDoOnNextWrite) + { + case MeshDisPart::MULTIPR_UNDEFINED: + pOs << "undefined"; + break; + + case MeshDisPart::MULTIPR_KEEP_AS_IT: + pOs << pM.mMeshName << " " << pM.mId << " " << pM.mPartName << " " << pM.mPath << " " << pM.mMEDFileName; + break; + + case MeshDisPart::MULTIPR_WRITE_MESH: + pOs << pM.mMeshName << " " << pM.mId << " " << pM.mPartName << " " << pM.mPath << " " << pM.mMEDFileName; + break; + + case MeshDisPart::MULTIPR_WRITE_PARTS: + pOs << pM.mMeshName << " " << pM.mId << " " << pM.mPartName << " " << pM.mPath << " " << pM.mMEDFileName << " SPLIT " << pM.mSplit; + break; + + default: throw IllegalStateException("", __FILE__, __LINE__); + } + + return pOs; +} + + +//***************************************************************************** +// Class MeshDis implementation +//***************************************************************************** + +MeshDis::MeshDis() +{ + reset(); +} + + +MeshDis::~MeshDis() +{ + reset(); +} + + +void MeshDis::reset() +{ + mMEDfilename[0] = '\0'; + + for (unsigned itPart = 0 ; itPart != mParts.size() ; itPart++) + { + MeshDisPart* part = mParts[itPart]; + delete part; + } + mParts.clear(); + + //mProgressCallback = NULL; +} + + +void MeshDis::addMesh( + MeshDisPart::OnNextWrite pToDoOnNextWrite, + const char* pMeshName, + int pId, + const char* pPartName, + const char* pPath, + const char* pMEDFileName, + Mesh* pMesh) +{ + MeshDisPart* part = new MeshDisPart(); + + part->create( + pToDoOnNextWrite, + pMeshName, + pId, + pPartName, + pPath, + pMEDFileName, + pMesh); + + mParts.push_back(part); +} + + +void MeshDis::insertMesh( + MeshDisPart::OnNextWrite pToDoOnNextWrite, + const char* pMeshName, + int pId, + const char* pPartName, + const char* pPath, + const char* pMEDFileName, + Mesh* pMesh, + int pPosition) +{ + MeshDisPart* part = new MeshDisPart(); + + part->create( + pToDoOnNextWrite, + pMeshName, + pId, + pPartName, + pPath, + pMEDFileName, + pMesh); + + mParts.insert(mParts.begin() + pPosition, part); + + // rename id of following parts + for (unsigned i = pPosition + 1 ; i < mParts.size() ; i++) + { + mParts[i]->mId = i + 1; + } +} + + +MeshDisPart* MeshDis::findPart(const char* pPartName) +{ + if (pPartName == NULL) throw NullArgumentException("", __FILE__, __LINE__); + + MeshDisPart* part = NULL; + + for (unsigned itPart = 0 ; itPart < mParts.size() ; itPart++) + { + MeshDisPart* currentPart = mParts[itPart]; + + if (strcmp(currentPart->getPartName(), pPartName) == 0) + { + part = currentPart; + break; + } + } + + return part; + +} + + +vector MeshDis::getMeshes() const +{ + vector res; + + if (mParts.size() > 0) + { + MeshDisPart* part = mParts[0]; + const char* meshName = part->getMeshName(); + res.push_back(meshName); + } + + return res; +} + + +vector MeshDis::getFields() const +{ + vector res; + + if (mParts.size() == 0) + { + return res; + } + + // all the parts of the distributed MED file should have the same fields + // => just return the name of fields of the first part + switch (mParts[0]->mToDoOnNextWrite) + { + case MeshDisPart::MULTIPR_KEEP_AS_IT: + case MeshDisPart::MULTIPR_WRITE_PARTS: + { + vector > tmp = multipr::getListFields(mParts[0]->getMEDFileName()); + + for (int i = 0 ; i < tmp.size() ; i++) + { + res.push_back(tmp[i].first); + } + return res; + } + + case MeshDisPart::MULTIPR_WRITE_MESH: + return mParts[0]->mMesh->getNameFields(); + + default: + throw IllegalStateException("", __FILE__, __LINE__); + } +} + + +int MeshDis::getTimeStamps(const char* pFieldName) const +{ + if (mParts.size() == 0) + { + // no parts in this distributed MED file => no fields => #iteration = 0 + return 0; + } + + // all the parts of the distributed MED file should have the same fields + // => just return the number of iteration found in the field of the first part + switch (mParts[0]->mToDoOnNextWrite) + { + case MeshDisPart::MULTIPR_KEEP_AS_IT: + case MeshDisPart::MULTIPR_WRITE_PARTS: + { + vector > tmp = multipr::getListFields(mParts[0]->getMEDFileName()); + + for (int i = 0 ; i < tmp.size() ; i++) + { + if (strcmp(tmp[i].first.c_str(), pFieldName) == 0) + { + return tmp[i].second; + } + } + + // pFieldName not found in the list of fields + return 0; + } + + case MeshDisPart::MULTIPR_WRITE_MESH: + return mParts[0]->mMesh->getTimeStamps(pFieldName); + + default: + throw IllegalStateException("", __FILE__, __LINE__); + } +} + + +string MeshDis::getPartInfo(const char* pPartName) +{ + MeshDisPart* part = findPart(pPartName); + + if (part != NULL) + { + char num[16]; + sprintf(num, "%d", part->mId); + + string res = + string(part->mMeshName) + + string(" ") + + string(num) + + string(" ") + + string(part->mPartName) + + string(" ") + + string(part->mPath) + + string(" ") + + string(part->mMEDFileName); + + return res; + } + else + { + // part not found => return empty string + return ""; + } +} + + +void MeshDis::splitPart(const char* pPartName, int pNbParts, int pPartitionner) +{ + if (pPartName == NULL) throw NullArgumentException("", __FILE__, __LINE__); + if (pNbParts < 2) throw IllegalArgumentException("", __FILE__, __LINE__); + if ((pPartitionner != MULTIPR_METIS) && (pPartitionner != MULTIPR_SCOTCH)) throw IllegalArgumentException("should be 0=METIS or 1=SCOTCH", __FILE__, __LINE__); + + //--------------------------------------------------------------------- + // Find the MED file corresponding to the given part + //--------------------------------------------------------------------- + MeshDisPart* part = findPart(pPartName); + + if (part == NULL) + { + throw IllegalArgumentException("part not found in this distributed MED file", __FILE__, __LINE__); + } + + //--------------------------------------------------------------------- + // Load the sequential MED file + //--------------------------------------------------------------------- + MEDSPLITTER::MESHCollection* collection; + collection = new MEDSPLITTER::MESHCollection(part->getMEDFileName(), part->getMeshName()); + + //--------------------------------------------------------------------- + // Partition the group + //--------------------------------------------------------------------- + MEDSPLITTER::Topology* topology; + if (pPartitionner == MULTIPR_METIS) + { + try + { + topology = collection->createPartition(pNbParts, MEDSPLITTER::Graph::METIS); + } + catch (...) + { + throw RuntimeException("MEDSPLITTER error: createPartition(), using METIS", __FILE__, __LINE__); + } + } + else if (pPartitionner == MULTIPR_SCOTCH) + { + try + { + topology = collection->createPartition(pNbParts, MEDSPLITTER::Graph::SCOTCH); + } + catch (...) + { + throw RuntimeException("MEDSPLITTER error: createPartition(), using SCOTCH", __FILE__, __LINE__); + } + } + else + { + throw IllegalStateException("unknown partitionner", __FILE__, __LINE__); + } + + try + { + MEDSPLITTER::MESHCollection* newCollection = new MEDSPLITTER::MESHCollection(*collection, topology); + + part->mToDoOnNextWrite = MeshDisPart::MULTIPR_WRITE_PARTS; + part->mSplit = pNbParts; + part->mOldCollection = collection; + part->mCollection = newCollection; + } + catch (...) + { + throw RuntimeException("MEDSPLITTER error: new MESHCollection()", __FILE__, __LINE__); + } +} + + +void MeshDis::decimatePart( + const char* pPartName, + const char* pFieldName, + med_int pFieldIt, + const char* pFilterName, + med_float pTMed, + med_float pTLow, + med_float pRadius, + int pBoxing) +{ + //--------------------------------------------------------------------- + // Check arguments + //--------------------------------------------------------------------- + if (pPartName == NULL) throw NullArgumentException("partname should not be NULL", __FILE__, __LINE__); + if (pFieldName == NULL) throw NullArgumentException("fieldname should not be NULL", __FILE__, __LINE__); + if (pFieldIt < med_int(1)) throw IllegalArgumentException("invalid field iteration; should be >= 1", __FILE__, __LINE__); + if (pTMed < 0.0) throw IllegalArgumentException("med res.: threshold must be > 0", __FILE__, __LINE__); + if (pTMed >= pTLow) throw IllegalArgumentException("threshold for med res. must be < threshold for low res.", __FILE__, __LINE__); + if (pRadius <= med_float(0.0)) throw IllegalArgumentException("radius should be > 0", __FILE__, __LINE__); + if ((pBoxing < 1) || (pBoxing > 200)) throw IllegalArgumentException("boxing should be in [1..200]", __FILE__, __LINE__); + + //--------------------------------------------------------------------- + // Find the MED file corresponding to the given part + //--------------------------------------------------------------------- + MeshDisPart* part = findPart(pPartName); + if (part == NULL) + { + throw IllegalArgumentException("part not found in the given distributed MED file", __FILE__, __LINE__); + } + + //--------------------------------------------------------------------- + // Load the associated sequential MED file + //--------------------------------------------------------------------- + if (part->mMesh == NULL) + { + part->readMED(); + } + + Mesh* meshFull = part->mMesh; + cout << (*meshFull) << endl; + + const char* originalFilename = part->getMEDFileName(); + string strPrefix = removeExtension(originalFilename, ".med"); + + //--------------------------------------------------------------------- + // Decimates the given mesh + //--------------------------------------------------------------------- + // arguments for decimation are passed as a string for genericity + char argv[256]; + char newPartName[MED_TAILLE_NOM + 1]; + char newMEDFileName[256]; + + // *** create a new mesh = MEDIUM resolution *** + sprintf(argv, "%s %d %lf %lf %d", pFieldName, pFieldIt, pTMed, pRadius, pBoxing); + sprintf(newPartName, "%s_MED", pPartName); + sprintf(newMEDFileName, "%s_gradmoy-med-%s-%s.med", + strPrefix.c_str(), + realToString(pTMed).c_str(), + realToString(pRadius).c_str()); + + { + Mesh* meshMedium = meshFull->decimate(pFilterName, argv, part->getMeshName()); + cout << (*meshMedium) << endl; + + insertMesh( + MeshDisPart::MULTIPR_WRITE_MESH, + part->getMeshName(), + part->mId + 1, + newPartName, + "localhost", + newMEDFileName, + meshMedium, + part->mId + 0); + } + + // *** create a new mesh = LOW resolution *** + sprintf(argv, "%s %d %lf %lf %d", pFieldName, pFieldIt, pTLow, pRadius, pBoxing); + sprintf(newPartName, "%s_LOW", pPartName); + sprintf(newMEDFileName, "%s_gradmoy-low-%s-%s.med", + strPrefix.c_str(), + realToString(pTLow).c_str(), + realToString(pRadius).c_str()); + + { + Mesh* meshLow = meshFull->decimate(pFilterName, argv, part->getMeshName()); + cout << (*meshLow) << endl; + + insertMesh( + MeshDisPart::MULTIPR_WRITE_MESH, + part->getMeshName(), + part->mId + 2, + newPartName, + "localhost", + newMEDFileName, + meshLow, + part->mId + 1); + } +} + + +int MeshDis::computeNumParts() +{ + int numParts = 0; + + for (unsigned itPart = 0 ; itPart < mParts.size() ; itPart++) + { + switch (mParts[itPart]->mToDoOnNextWrite) + { + case MeshDisPart::MULTIPR_KEEP_AS_IT: + case MeshDisPart::MULTIPR_WRITE_MESH: + numParts++; + break; + + case MeshDisPart::MULTIPR_WRITE_PARTS: + numParts += mParts[itPart]->mSplit; + break; + + default: throw IllegalStateException("", __FILE__, __LINE__); + } + } + + return numParts; +} + + +void MeshDis::readDistributedMED(const char* pMEDfilename) +{ + //cout << "DBG: readDistributedMED" << endl; + if (pMEDfilename == NULL) throw NullArgumentException("filename should not be NULL", __FILE__, __LINE__); + + const int MAX_SIZEOF_LINE = 1024; + + reset(); + strcpy(mMEDfilename, pMEDfilename); + + //--------------------------------------------------------------------- + // Open master file (ASCII file) + //--------------------------------------------------------------------- + ifstream fileMaster(mMEDfilename); + if (fileMaster.fail()) throw IOException("i/o error while opening MED master file", __FILE__, __LINE__); + + //cout << "DBG: readDistributedMED: open" << endl; + + //--------------------------------------------------------------------- + // Read header + //--------------------------------------------------------------------- + char charbuffer[MAX_SIZEOF_LINE]; + fileMaster.getline(charbuffer, MAX_SIZEOF_LINE); + if (fileMaster.fail()) throw IOException("i/o error while reading MED master file", __FILE__, __LINE__); + + // check format + if ((charbuffer[0] != '#') || + (charbuffer[1] != ' ') || + (charbuffer[2] != 'M') || + (charbuffer[3] != 'E') || + (charbuffer[4] != 'D')) + throw IOException("not a valid distributed MED file", __FILE__, __LINE__); + + while ((charbuffer[0] == '#') || (strlen(charbuffer) == 0)) + { + fileMaster.getline(charbuffer, MAX_SIZEOF_LINE); + if (fileMaster.fail()) throw IOException("i/o error while reading MED master file", __FILE__, __LINE__); + } + + // read number of parts + int nbParts = atoi(charbuffer); + //cout << "DBG: readDistributedMED: #parts=" << nbParts << endl; + + //--------------------------------------------------------------------- + // Read infos about sub-parts + //--------------------------------------------------------------------- + char lMeshName[MED_TAILLE_NOM + 1]; + int lId; + char lPartName[MED_TAILLE_NOM + 1]; + char lPath[256]; + char lMEDFileName[256]; + + for (int i = 0 ; i < nbParts ; i++) + { + fileMaster.getline(charbuffer, MAX_SIZEOF_LINE); + if (fileMaster.fail()) throw IOException("i/o error while reading MED master file", __FILE__, __LINE__); + + while ((charbuffer[0] == '#') || (strlen(charbuffer) == 0)) + { + fileMaster.getline(charbuffer, MAX_SIZEOF_LINE); + if (fileMaster.fail()) throw IOException("i/o error while reading MED master file", __FILE__, __LINE__); + } + + lMeshName[0] = '\0'; + lId = 0; + lPartName[0] = '\0'; + lPath[0] = '\0'; + lMEDFileName[0] = '\0'; + + int ret = sscanf(charbuffer, "%s %d %s %s %s", + lMeshName, + &lId, + lPartName, + lPath, + lMEDFileName); + + if (ret != 5) throw IOException("i/o error while reading MED master file; bad format", __FILE__, __LINE__); + + //cout << "DBG: read: " << lMeshName << " " << lId << " " << lPartName << endl; + addMesh( + MeshDisPart::MULTIPR_KEEP_AS_IT, + lMeshName, + lId, + lPartName, + lPath, + lMEDFileName, + NULL); + } + + //--------------------------------------------------------------------- + // Close master file + //--------------------------------------------------------------------- + fileMaster.close(); + if (fileMaster.fail()) throw IOException("i/o error while closing MED master file", __FILE__, __LINE__); + //cout << "DBG: readDistributedMED: close" << endl; +} + + +/** + * Retrieves the output of MEDSPLITTER and convert it for MULTIPR. + */ +int convertMedsplitterToMultipr(ofstream& pFileMaster, const char* pTmpFilename, int pId, MeshDisPart* pPart) +{ + MULTIPR_LOG("convert" << endl); + + const int MAX_SIZEOF_LINE = 1024; + char charbuffer[MAX_SIZEOF_LINE]; + + // Open medsplitter master file (ASCII file) + ifstream fileMasterMedsplitter(pTmpFilename); + if (fileMasterMedsplitter.fail()) throw IOException("i/o error while opening MEDSPLITTER master file", __FILE__, __LINE__); + + fileMasterMedsplitter.getline(charbuffer, MAX_SIZEOF_LINE); + if (fileMasterMedsplitter.fail()) throw IOException("i/o error while reading MEDSPLITTER master file", __FILE__, __LINE__); + + while ((charbuffer[0] == '#') || (strlen(charbuffer) == 0)) + { + fileMasterMedsplitter.getline(charbuffer, MAX_SIZEOF_LINE); + if (fileMasterMedsplitter.fail()) throw IOException("i/o error while reading MEDSPLITTER master file", __FILE__, __LINE__); + } + + // read number of parts + int nbParts = atoi(charbuffer); + cout << "nb parts=" << nbParts << endl; + + char lMeshName[MED_TAILLE_NOM + 1]; + int lId; + char lPartName[MED_TAILLE_NOM + 1]; + char lPath[256]; + char lMEDFileName[256]; + + for (int i = 0 ; i < nbParts ; i++) + { + fileMasterMedsplitter.getline(charbuffer, MAX_SIZEOF_LINE); + if (fileMasterMedsplitter.fail()) throw IOException("", __FILE__, __LINE__); + + // parses the current line + lMeshName[0] = '\0'; + lId = 0; + lPartName[0] = '\0'; + lPath[0] = '\0'; + lMEDFileName[0] = '\0'; + + int ret = sscanf(charbuffer, "%s %d %s %s %s", + lMeshName, + &lId, + lPartName, + lPath, + lMEDFileName); + + if (ret != 5) throw IOException("i/o error while reading MEDSPLITTER master file; bad format", __FILE__, __LINE__); + + //cout << lMeshName << " " << (pId + i) << " " << pPart->getPartName() << "_" << (i + 1) << " " << lPath << " " << lMEDFileName << endl; + + pFileMaster << lMeshName << " " << (pId + i) << " " << pPart->getPartName() << "_" << (i + 1) << " " << lPath << " " << lMEDFileName << endl; + } + + fileMasterMedsplitter.close(); + if (fileMasterMedsplitter.fail()) throw IOException("i/o error while closing MEDSPLITTER master file", __FILE__, __LINE__); + + // remove master file generated by MEDSPLITTER + remove(pTmpFilename); + + return nbParts; +} + + +void MeshDis::writeDistributedMED(const char* pMEDfilenamePrefix) +{ + if (pMEDfilenamePrefix == NULL) throw NullArgumentException("", __FILE__, __LINE__); + + //--------------------------------------------------------------------- + // Build master filename + //--------------------------------------------------------------------- + string strPrefix = string(pMEDfilenamePrefix); + const char* strExtension = ".med"; + string strMasterFilename; + + // add suffix "_grains_maitre" iff it is not yet in the filename + if (strstr(pMEDfilenamePrefix, "_grains_maitre") == 0) + { + strMasterFilename= strPrefix + "_grains_maitre" + strExtension; + } + else + { + strMasterFilename = strPrefix + strExtension; + } + + MULTIPR_LOG("Create master: " << strMasterFilename << endl); + strcpy(mMEDfilename, strMasterFilename.c_str()); + + //--------------------------------------------------------------------- + // Create an ASCII master file for the resulting distributed mesh and write header + //--------------------------------------------------------------------- + remove(strMasterFilename.c_str()); + ofstream fileMaster(strMasterFilename.c_str()); + + if (fileMaster == 0) throw IOException("i/o error while creating MED master file", __FILE__, __LINE__); + + fileMaster << "# MED file v2.3 - Master file created by MULTIPR v" << getVersion() << endl; + fileMaster << "#" << " " << endl; + + fileMaster << computeNumParts() << endl; + if (fileMaster.fail()) throw IOException("i/o error while writing MED master file", __FILE__, __LINE__); + + //--------------------------------------------------------------------- + // Create a new MED file (v2.3) + //--------------------------------------------------------------------- + int id = 1; + + if (gProgressCallback != NULL) gProgressCallback->start("Save mesh", mParts.size()); + + try + { + + // for each sub-meshes + for (unsigned itPart = 0 ; itPart < mParts.size() ; itPart++) + { + switch (mParts[itPart]->mToDoOnNextWrite) + { + case MeshDisPart::MULTIPR_KEEP_AS_IT: + { + mParts[itPart]->mId = id; + id++; + fileMaster << (*mParts[itPart]) << endl; + cout << (*mParts[itPart]) << endl; + break; + } + + case MeshDisPart::MULTIPR_WRITE_MESH: + { + if (strlen(mParts[itPart]->getMEDFileName()) == 0) throw IOException("MED filename is empty", __FILE__, __LINE__); + if (mParts[itPart]->mMesh == NULL) throw IllegalStateException("invalid mesh (shoult not be NULL)", __FILE__, __LINE__); + mParts[itPart]->mMesh->writeMED(mParts[itPart]->getMEDFileName()); + mParts[itPart]->mId = id; + id++; + fileMaster << (*mParts[itPart]) << endl; + cout << (*mParts[itPart]) << endl; + break; + } + + case MeshDisPart::MULTIPR_WRITE_PARTS: + { + // split this part using medsplitter + if (mParts[itPart]->mOldCollection == NULL) throw IllegalStateException("", __FILE__, __LINE__); + string strPrefix = removeExtension(mParts[itPart]->getMEDFileName(), ".med"); + char tmpFilename[256]; + sprintf(tmpFilename, "%s_part", strPrefix.c_str()); + mParts[itPart]->mCollection->write(tmpFilename); + mParts[itPart]->mCollection->castAllFields(*(mParts[itPart]->mOldCollection)); + int ret = convertMedsplitterToMultipr(fileMaster, tmpFilename, id, mParts[itPart]); + id += ret; + remove(mParts[itPart]->getMEDFileName()); + break; + } + + default: throw IllegalStateException("should not be there", __FILE__, __LINE__); + } + + if (gProgressCallback != NULL) gProgressCallback->moveOn(); + } + + } + catch (RuntimeException& e) + { + if (gProgressCallback != NULL) gProgressCallback->done(); + throw e; + } + + if (gProgressCallback != NULL) gProgressCallback->done(); + + //--------------------------------------------------------------------- + // Close master file + //--------------------------------------------------------------------- + fileMaster.close(); + if (fileMaster.fail()) throw IOException("i/o error while closing MED master file", __FILE__, __LINE__); +} + + +ostream& operator<<(ostream& pOs, MeshDis& pM) +{ + pOs << "Mesh Dis.:" << endl; + pOs << " Filename =|" << pM.mMEDfilename << "|" << endl; + pOs << " #Sub-meshes=" << pM.mParts.size() << endl; + + for (unsigned itPart = 0 ; itPart < pM.mParts.size() ; itPart++) + { + cout << " " << (itPart + 1) << ": " << (*(pM.mParts[itPart])) << endl; + } + + return pOs; +} + + +} // namespace multipr + +// EOF diff --git a/src/MULTIPR/MULTIPR_MeshDis.hxx b/src/MULTIPR/MULTIPR_MeshDis.hxx new file mode 100644 index 0000000..bcfeebc --- /dev/null +++ b/src/MULTIPR/MULTIPR_MeshDis.hxx @@ -0,0 +1,436 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_MeshDis.hxx + * + * \brief Class MeshDis: distributed mesh. + * = MASTER file (ASCII) -> list of sequential MED file. + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +#ifndef MULTIPR_MESHDIS_HXX +#define MULTIPR_MESHDIS_HXX + +//***************************************************************************** +// Includes section +//***************************************************************************** + +extern "C" +{ + #include "med.h" +} + +#include +#include + +// include MEDSPLITTER used to split mesh using METIS or SCOTCH +#include "MEDMEM_define.hxx" +#include "MEDMEM_Mesh.hxx" +#include "MEDMEM_Family.hxx" +#include "MEDSPLITTER_Graph.hxx" +#include "MEDSPLITTER_MESHCollection.hxx" +#include "MEDSPLITTER_Topology.hxx" + + +namespace multipr +{ + +//***************************************************************************** +// Pre-declaration +//***************************************************************************** + +class Mesh; + + +//***************************************************************************** +// Class MeshDisPart = a sub-part of a distributed mesh. +// +// It can be : +// - a sequential MED file representing a Group (scenario 1) +// - a sequential MED file representing a part of a Group (scenario 2 -> MEDSPLITTER) +// - a lower resolution of a part (decimation) +//***************************************************************************** + +class MeshDisPart +{ + +public: + + /** + * Action to be done for this part on next writing on disk. + */ + enum OnNextWrite + { + MULTIPR_UNDEFINED, + MULTIPR_KEEP_AS_IT, + MULTIPR_WRITE_MESH, + MULTIPR_WRITE_PARTS + }; + +public: + + /** + * Builds an empty part of a distributed mesh (default constructor). + */ + MeshDisPart(); + + /** + * Destructor. Removes everything. + */ + ~MeshDisPart(); + + /** + * Resets this object in its state by default (empty). Cleans memory. + */ + void reset(); + + /** + * Creates a MeshDisPart. + * \param pToDoOnNextWrite + * \param pMeshName + * \param pId + * \param pPartName + * \param pPath + * \param pMEDFileName + * \param pMesh can be NULL. + */ + void create( + OnNextWrite pToDoOnNextWrite, + const char* pMeshName, + int pId, + const char* pPartName, + const char* pPath, + const char* pMEDFileName, + Mesh* pMesh); + + //--------------------------------------------------------------------- + // Basic accessors/mutators + //--------------------------------------------------------------------- + + /** + * Returns the name of this part. + * \return the name of this part. + */ + const char* getPartName() const { return mPartName; } + + /** + * Returns the name of the mesh of this part. + * \return the name of the mesh of this part. + */ + const char* getMeshName() const { return mMeshName; } + + /** + * Returns the MED filename which contain this part. + * \return the MED filename which contain this part. + */ + const char* getMEDFileName() const { return mMEDFileName; } + + /** + * Returns the suffix of the related MED filename (without .med extension). + * For examples: + * 1. "agregat100grains_12pas_grain97.med" -> "grain97" + * 2. "agregat100grains_12pas_grain100_part2.med" -> "grain100_part2" + * 3. "aagregat100grains_12pas_grain98_gradmoy-low-25.0-0.3.med" -> "grain98_gradmoy-low-25-0.3" + */ + const char* getMEDFileNameSuffix() const; + + /** + * Returns the action to be performed on this part on next write. + * \return the action to be performed on this part on next write. + */ + OnNextWrite getOnNextWrite() const { return mToDoOnNextWrite; } + + //--------------------------------------------------------------------- + // I/O + //--------------------------------------------------------------------- + + /** + * Reads the sequentiel MED file corresponding to this part. + * \throw IOException if an i/o error occurs. + */ + void readMED(); + + /** + * Dumps any MeshDisPart to the given output stream. + * \param pOs any output stream. + * \param pM any MeshDisPart. + * \return the output stream pOs. + */ + friend std::ostream& operator<<(std::ostream& pOs, MeshDisPart& pM); + +private: + + // MeshDisPart can be used: + // 1 (KEEP_AS_IT) : To store data read from one line of an ASCII master file (distributed MED file) + // 2 (WRITE_MESH) : As a temporary structure to store all infos about a mesh corresponding to a group (before writing on disk). + // 3 (WRITE_PARTS) : As a temporary structure to store all infos about splitting using MEDSPLITTER. + + OnNextWrite mToDoOnNextWrite; /**< See enum OnNextWrite. */ + + //--------------------------------------------------------------------- + // Case 1, 2, and 3 + //--------------------------------------------------------------------- + char mMeshName[MED_TAILLE_NOM + 1]; /**< Name of the mesh. */ + int mId; /**< Id of this part in [1..n]. */ + char mPartName[MED_TAILLE_NOM + 1]; /**< Name of this part. */ + char mPath[256]; /**< Path of the MED file. */ + char mMEDFileName[256]; /**< Name of the MED file which contain this part. */ + + //--------------------------------------------------------------------- + // Case 2: mesh of the related sequential MED file (can be NULL if not loaded) + //--------------------------------------------------------------------- + Mesh* mMesh; /**< Mesh associated with this part; can be NULL. */ + + //--------------------------------------------------------------------- + // Case 3 only: temporary result of MEDSPLITTER + //--------------------------------------------------------------------- + int mSplit; /**< For MEDSPLITTER: number of parts. Temporary. */ + MEDSPLITTER::MESHCollection* mCollection; /**< New data after splitting. */ + MEDSPLITTER::MESHCollection* mOldCollection; /**< Data before splitting (we need them when we want to write new data on disk. */ + +private: + + // do not allow copy constructor + MeshDisPart(const MeshDisPart&); + + // do not allow copy + MeshDisPart& operator=(const MeshDisPart&); + + // do not allow operator == + bool operator==(const MeshDisPart&); + + //--------------------------------------------------------------------- + // Friends + //--------------------------------------------------------------------- + friend class MeshDis; + +}; // class MeshDisPart + + +//***************************************************************************** +// Class MeshDis +//***************************************************************************** + +class MeshDis +{ +public: + + /** + * Builds an empty mesh (default constructor). + */ + MeshDis(); + + /** + * Destructor. Removes everything. + */ + ~MeshDis(); + + /** + * Resets this object in its state by default (empty). Clean memory. + */ + void reset(); + + //--------------------------------------------------------------------- + // Basic accessors/mutators + //--------------------------------------------------------------------- + + /** + * Returns the name of this distributed MED file (=name of the master file). + * \return the name of this distributed MED file (=name of the master file). + */ + const char* getFilename() const { return mMEDfilename; } + + /** + * Adds a new part to this distributed mesh. + * Used by the split process (extract groups). + * \param pToDoOnNextWrite + * \param pMeshName + * \param pId + * \param pPartName + * \param pPath + * \param pMEDFileName + * \param pMesh can be NULL. + */ + void addMesh( + MeshDisPart::OnNextWrite pToDoOnNextWrite, + const char* pMeshName, + int pId, + const char* pPartName, + const char* pPath, + const char* pMEDFileName, + Mesh* pMesh); + + /** + * Inserts a new part to this distributed mesh. + * Used by the decimation process. + * \param pToDoOnNextWrite + * \param pMeshName + * \param pId + * \param pPartName + * \param pPath + * \param pMEDFileName + * \param pMesh can be NULL. + * \param pPosition insert after this position. Start at 1. + */ + void insertMesh( + MeshDisPart::OnNextWrite pToDoOnNextWrite, + const char* pMeshName, + int pId, + const char* pPartName, + const char* pPath, + const char* pMEDFileName, + Mesh* pMesh, + int pPosition); + + /** + * Returns the current number of parts in this distributed mesh. + * \return the current number of parts in this distributed mesh. + */ + int getNumParts() const { return mParts.size(); } + + /** + * Returns the nth part of this distributed mesh. + * \param pIndex index of the part (in 0..getNumParts()-1). + * \return the nth part of this distributed mesh. + */ + MeshDisPart* getPart(int pIndex) const { return mParts[pIndex]; } + + /** + * Returns the list of meshes contained in this distributed MED file. + * \return the list of meshes contained in this distributed MED file. + */ + std::vector getMeshes() const; + + /** + * Returns the list of fields contained in this distributed MED file. + * \return the list of fields contained in this distributed MED file. + */ + std::vector getFields() const; + + /** + * Returns the number of iteration for a given field. + * \param pFieldName field name. + * \return the number of iteration for a given field. + */ + int getTimeStamps(const char* pFieldName) const; + + /** + * Returns all information about a part. + * \param pPartName name of the part. + * \return all information about a part. + */ + std::string getPartInfo(const char* pPartName); + + //--------------------------------------------------------------------- + // Algorithms + //--------------------------------------------------------------------- + + /** + * Finds a part of this distributed mesh by its name. + * Returns NULL if the part does not exist. + * \param pPartName part to be found; must not be NULL. + * \return a pointer towards the part if it exists, NULL otherwise. + * \throw NullArgumentException if pPartName is NULL. + */ + MeshDisPart* findPart(const char* pPartName); + + /** + * Updates this distributed mesh by splitting one of its part. + * This splitting method leans on medsplitter, by V. Bergeaud (CEA). + * \param pPartName name of the part to be splitted. + * \param pNbParts number of sub-parts. + * \param pPartitionner MULTIPR_METIS or MULTIPR_SCOTCH. + * \throw RuntimeException if any error occurs. + */ + void splitPart(const char* pPartName, int pNbParts, int pPartitionner); + + /** + * Creates 3 resolution (CURRENT = FULL, MEDIUM and LOW) of a part of this distributed mesh. + * Names of new meshes are _MED and _LOW. + * \param pPartName + * \param pFielName + * \param pFieldIt + * \param pFilterName + * \param pTMed threshold used to generate MEDIUM resolution. + * \param pTLow threshold used to generate LOW resolution (must be >= pTMed). + * \param pRadius + * \param pBoxing number of cells along each axis; e.g. if 100 then grid will have 100*100*100 = 10**6 cells; 100 by default. + * \throw RuntimeException if any error occurs. + */ + void decimatePart( + const char* pPartName, + const char* pFieldName, + med_int pFieldIt, + const char* pFilterName, + med_float pTMed, + med_float pTLow, + med_float pRadius, + int pBoxing = 100); + + //--------------------------------------------------------------------- + // I/O + //--------------------------------------------------------------------- + + /** + * Reads the master file of a distributed MED file. + * \param pMEDfilename + * \throw NullArgumentException if pMEDfilename is NULL. + * \throw IOException if any i/o error occurs. + */ + void readDistributedMED(const char* pMEDfilename); + + /** + * Writes this distributed MED file (including master file and sub MED files if necessary). + * \param pMEDfilenamePrefix + * \throw NullArgumentException if pMEDfilename is NULL. + * \throw IOException if any i/o error occurs. + */ + void writeDistributedMED(const char* pMEDfilenamePrefix); + + /** + * Dumps any MeshDis to the given output stream. + * \param pOs any output stream. + * \param pM any MeshDis. + * \return the output stream pOs. + */ + friend std::ostream& operator<<(std::ostream& pOs, MeshDis& pM); + +private: + + /** + * Recomputes the number of parts in this distributed mesh. + * This method is used by writeDistributedMED(). + * \return the number of parts in this distributed mesh. + */ + int computeNumParts(); + +private: + + char mMEDfilename[256]; /** Name of this distributed MED file (= name of the master file). */ + std::vector mParts; /**< Table of sub-parts; a distributed mesh is composed of N sub-part, where N = mParts.size(). */ + //MULTIPR_ProgressCallback* mProgressCallback; + +private: + + // do not allow copy constructor + MeshDis(const MeshDis&); + + // do not allow copy + MeshDis& operator=(const MeshDis&); + + // do not allow operator == + bool operator==(const MeshDis&); + +}; // class MeshDis + + +} // namespace MULTIPR + + +#endif // MULTIPR_MESHDIS_HXX + +// EOF diff --git a/src/MULTIPR/MULTIPR_Nodes.cxx b/src/MULTIPR/MULTIPR_Nodes.cxx new file mode 100644 index 0000000..a499c95 --- /dev/null +++ b/src/MULTIPR/MULTIPR_Nodes.cxx @@ -0,0 +1,400 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_Nodes.cxx + * + * \brief see MULTIPR_Nodes.hxx + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +//***************************************************************************** +// Includes section +//***************************************************************************** + +#include "MULTIPR_Nodes.hxx" +#include "MULTIPR_Exceptions.hxx" + +#include + +using namespace std; + + +namespace multipr +{ + + +//***************************************************************************** +// Class Nodes implementation +//***************************************************************************** + +Nodes::Nodes() +{ + mId = NULL; + mFamIdent = NULL; + mNames = NULL; + mCoo = NULL; + mNamesCoo = NULL; + mNamesUnitCoo = NULL; + + reset(); +} + + +Nodes::~Nodes() +{ + reset(); +} + + +void Nodes::reset() +{ + mNum = 0; + mDim = 0; + mCoordSystem = MED_CART; + + if (mId != NULL) { delete[] mId; mId = NULL; } + if (mFamIdent != NULL) { delete[] mFamIdent; mFamIdent = NULL; } + if (mNames != NULL) { delete[] mNames; mNames = NULL; } + if (mCoo != NULL) { delete[] mCoo; mCoo = NULL; } + if (mNamesCoo != NULL) { delete[] mNamesCoo; mNamesCoo = NULL; } + if (mNamesUnitCoo != NULL) { delete[] mNamesUnitCoo; mNamesUnitCoo = NULL; } + + mFlagPrintAll = false; +} + + +const med_float* Nodes::getCoordinates(med_int pIndexNode) const +{ + if ((pIndexNode < 0) || (pIndexNode >= mNum)) throw IndexOutOfBoundsException("", __FILE__, __LINE__); + + return mCoo + pIndexNode * mDim; +} + + +med_int Nodes::getFamIdent(med_int pIndexNode) const +{ + if ((pIndexNode < 0) || (pIndexNode >= mNum)) throw IndexOutOfBoundsException("", __FILE__, __LINE__); + + return mFamIdent[pIndexNode]; +} + + +void Nodes::getBBox(med_float pMin[3], med_float pMax[3]) const +{ + //--------------------------------------------------------------------- + // Special case: no nodes => bbox = [0 ; 0] x [0 ; 0] x [0 ; 0] + //--------------------------------------------------------------------- + if (mNum == 0) + { + for (int itDim = 0 ; itDim < mDim ; itDim++) + { + pMin[itDim] = med_float(0.0); + pMax[itDim] = med_float(0.0); + } + + return; + } + + //--------------------------------------------------------------------- + // Compute axis-aligned bounding box + //--------------------------------------------------------------------- + for (int itDim = 0 ; itDim < mDim ; itDim++) + { + pMin[itDim] = numeric_limits::max(); + pMax[itDim] = -pMin[itDim]; + } + for (int itNode = 0 ; itNode < mNum ; itNode++) + { + for (int itDim = 0 ; itDim < mDim ; itDim++) + { + med_float coord = mCoo[itNode * mDim + itDim]; + if (coord < pMin[itDim]) pMin[itDim] = coord; + if (coord > pMax[itDim]) pMax[itDim] = coord; + } + } +} + + +set Nodes::getSetOfFamilies() const +{ + set setOfFamilies; + + // for each node, ad its family to the set + for (int itNode = 0 ; itNode < mNum ; itNode++) + { + setOfFamilies.insert(mFamIdent[itNode]); + } + + return setOfFamilies; +} + + +Nodes* Nodes::extractSubSet(const set& pSetIndices) const +{ + Nodes* subset = new Nodes(); + + subset->mNum = pSetIndices.size(); + subset->mDim = mDim; + subset->mCoordSystem = mCoordSystem; + + //--------------------------------------------------------------------- + // Allocate arrays + //--------------------------------------------------------------------- + subset->mFamIdent = new med_int[subset->mNum]; + subset->mCoo = new med_float[subset->mDim * subset->mNum]; + subset->mNamesCoo = new char[subset->mDim * MED_TAILLE_PNOM + 1]; + subset->mNamesUnitCoo = new char[subset->mDim * MED_TAILLE_PNOM + 1]; + + memcpy(subset->mNamesCoo, mNamesCoo, subset->mDim * MED_TAILLE_PNOM + 1); + memcpy(subset->mNamesUnitCoo, mNamesUnitCoo, subset->mDim * MED_TAILLE_PNOM + 1); + + //--------------------------------------------------------------------- + // Copy subset of familys id and coords. + //--------------------------------------------------------------------- + set::iterator itSet = pSetIndices.begin(); + for (int i = 0 ; i < subset->mNum; i++) + { + + med_int srcIndex = (*itSet) - 1; // MED index start at 1 + subset->mFamIdent[i] = mFamIdent[srcIndex]; + + med_float* srcCoo = mCoo + srcIndex * mDim; + med_float* destCoo = subset->mCoo + i * subset->mDim; + for (int itDim = 0 ; itDim < mDim ; itDim++) + { + destCoo[itDim] = srcCoo[itDim]; + } + + itSet++; + } + + //--------------------------------------------------------------------- + // Copy subset of identifiers if necessary + //--------------------------------------------------------------------- + if (isIdentifiers()) + { + itSet = pSetIndices.begin(); + subset->mId = new med_int[subset->mNum]; + for (int i = 0 ; i < subset->mNum; i++) + { + med_int srcIndex = (*itSet) - 1; // MED index start at 1 + subset->mId[i] = mId[srcIndex]; + + itSet++; + } + } + + //--------------------------------------------------------------------- + // Copy subset of names if necessary + //--------------------------------------------------------------------- + if (isNames()) + { + subset->mNames = new char[MED_TAILLE_PNOM * subset->mNum + 1]; + char* destPtr = subset->mNames; + itSet = pSetIndices.begin(); + for (int i = 0 ; i < subset->mNum; i++) + { + med_int srcIndex = (*itSet) - 1; // MED index start at 1 + char* srcPtr = mNames + srcIndex * MED_TAILLE_PNOM; + memcpy(destPtr, srcPtr, MED_TAILLE_PNOM); + destPtr += MED_TAILLE_PNOM; + + itSet++; + } + subset->mNames[MED_TAILLE_PNOM * subset->mNum] = '\0'; + } + + return subset; +} + + +void Nodes::readMED(med_idt pMEDfile, char* pMeshName, med_int pDim) +{ + if (pMEDfile == 0) throw IOException("", __FILE__, __LINE__); + if (pMeshName == NULL) throw NullArgumentException("", __FILE__, __LINE__); + if (pDim != 3) throw IllegalArgumentException("", __FILE__, __LINE__); + + reset(); + + mDim = pDim; + mNum = MEDnEntMaa( + pMEDfile, + pMeshName, + MED_COOR, + MED_NOEUD, + med_geometrie_element(0), + med_connectivite(0)); + + if (mNum <= 0) throw IOException("", __FILE__, __LINE__); + + mId = new med_int[mNum]; + mFamIdent = new med_int[mNum]; + mNames = new char[MED_TAILLE_PNOM * mNum + 1]; + mCoo = new med_float[mDim * mNum]; + mNamesCoo = new char[mDim * MED_TAILLE_PNOM + 1]; + mNamesUnitCoo = new char[mDim * MED_TAILLE_PNOM + 1]; + + mNames[0] = '\0'; + mNamesCoo[0] = '\0'; + mNamesUnitCoo[0] = '\0'; + + med_booleen isIdentifiers; + med_booleen isNames; + + med_err ret = MEDnoeudsLire( + pMEDfile, + pMeshName, + mDim, + mCoo, + MED_FULL_INTERLACE, + &mCoordSystem, + mNamesCoo, + mNamesUnitCoo, + mNames, + &isNames, + mId, + &isIdentifiers, + mFamIdent, + mNum); + + if (ret != 0) throw IOException("", __FILE__, __LINE__); + + // check if coordinates system is CARTESIAN + if (mCoordSystem != MED_CART) throw IllegalStateException("", __FILE__, __LINE__); + + if (!isNames) + { + delete[] mNames; + mNames = NULL; + } + + if (!isIdentifiers) + { + delete[] mId; + mId = NULL; + } +} + + +void Nodes::writeMED(med_idt pMEDfile, char* pMeshName) const +{ + if (pMEDfile == 0) throw IOException("", __FILE__, __LINE__); + if (pMeshName == NULL) throw NullArgumentException("", __FILE__, __LINE__); + if (strlen(pMeshName) > MED_TAILLE_NOM) throw IllegalArgumentException("", __FILE__, __LINE__); + if ((mDim < 1) || (mDim > 3)) throw IllegalStateException("", __FILE__, __LINE__); + if (mFamIdent == NULL) throw IllegalStateException("", __FILE__, __LINE__); + if (mCoo == NULL) throw IllegalStateException("", __FILE__, __LINE__); + if (mNamesCoo == NULL) throw IllegalStateException("", __FILE__, __LINE__); + if (mNamesUnitCoo == NULL) throw IllegalStateException("", __FILE__, __LINE__); + + // special case: if no nodes => do nothing + if (mNum == 0) return; + + med_err ret = MEDnoeudsEcr( + pMEDfile, + pMeshName, + mDim, + mCoo, + MED_FULL_INTERLACE, + mCoordSystem, + mNamesCoo, + mNamesUnitCoo, + mNames, + isNames()?MED_VRAI:MED_FAUX, + mId, + isIdentifiers()?MED_VRAI:MED_FAUX, + mFamIdent, + mNum); + + if (ret != 0) throw IOException("i/o error while writing nodes", __FILE__, __LINE__); + +} + + +ostream& operator<<(ostream& pOs, Nodes& pN) +{ + char strCoordSystem[16]; + switch (pN.mCoordSystem) + { + case MED_CART: strcpy(strCoordSystem, "CARTESIAN"); break; + case MED_CYL: strcpy(strCoordSystem, "CYLINDRIC"); break; + case MED_SPHER: strcpy(strCoordSystem, "SPHERIC"); break; + default: strcpy(strCoordSystem, "UNKNOWN"); break; + } + + pOs << "Nodes: " << endl; + pOs << " #number =" << pN.mNum << endl; + pOs << " Dimension =" << pN.mDim << endl; + pOs << " Coord. system=" << strCoordSystem << endl; + pOs << " Has names ?" << (pN.isNames()?"yes":"no") << endl; + pOs << " Has id ?" << (pN.isIdentifiers()?"yes":"no") << endl; + pOs << " Axis names =" << "|" << pN.mNamesCoo << "|" << endl; + pOs << " Unit axis =" << "|" << pN.mNamesUnitCoo << "|" << endl; + + { + set setOfFam = pN.getSetOfFamilies(); + if (setOfFam.size() == 0) + { + pOs << " Families: #fam=0" << endl; + } + else + { + set::iterator itFam = setOfFam.end(); + itFam--; + pOs << " Families: #fam=" << setOfFam.size() << " id_min=" << (*(setOfFam.begin())) << " id_max=" << (*itFam) << endl; + } + + if (pN.mFlagPrintAll) + { + for (int itNode = 0 ; itNode < pN.mNum; itNode++) + { + pOs << " Node " << (itNode+1) << ": " << pN.mFamIdent[itNode] << endl; + } + } + } + + med_float bboxMin[3], bboxMax[3]; + pN.getBBox(bboxMin, bboxMax); + pOs << " BBox: [" << bboxMin[0] << " ; " << bboxMax[0] << "] x [" << bboxMin[1] << " ; " << bboxMax[1] << "] x [" << bboxMin[2] << " ; " << bboxMax[2] << "]" << endl; + + if (pN.mFlagPrintAll) + { + pOs << " Coordinates: " << endl; + for (int itNode = 0 ; itNode < pN.mNum ; itNode++) + { + pOs << " Node " << (itNode+1) << ": "; + for (int itDim = 0 ; itDim < pN.mDim ; itDim++) + { + pOs << pN.mCoo[itNode * pN.mDim + itDim] << " "; + } + pOs << endl; + } + + if (pN.isIdentifiers()) + { + pOs << " Num: " << endl; + for (int itNode = 0 ; itNode < pN.mNum; itNode++) + { + pOs << " Node " << (itNode+1) << ": " << pN.mId[itNode] << endl; + } + } + + if (pN.isNames()) + { + pN.mNames[MED_TAILLE_PNOM * pN.mNum] = '\0'; + pOs << " Names: |" << pN.mNames << "|" << endl; + } + + } + + return pOs; +} + + +} // namespace multipr + +// EOF diff --git a/src/MULTIPR/MULTIPR_Nodes.hxx b/src/MULTIPR/MULTIPR_Nodes.hxx new file mode 100644 index 0000000..ed39c9d --- /dev/null +++ b/src/MULTIPR/MULTIPR_Nodes.hxx @@ -0,0 +1,190 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_Nodes.hxx + * + * \brief Class Nodes = table of nodes. + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +#ifndef MULTIPR_NODES_HXX +#define MULTIPR_NODES_HXX + +//***************************************************************************** +// Includes section +//***************************************************************************** + +extern "C" +{ + #include "med.h" +} + +#include +#include + + +namespace multipr +{ + + +//***************************************************************************** +// Class Nodes +//***************************************************************************** + +class Nodes +{ +public: + + /** + * Builds an empty set of nodes (default constructor). + */ + Nodes(); + + /** + * Destructor. Removes everything. + */ + ~Nodes(); + + /** + * Resets this object in its state by default (empty). Cleans memory. + */ + void reset(); + + //--------------------------------------------------------------------- + // Basic accessors/mutators + //--------------------------------------------------------------------- + + /** + * Returns true if nodes have a name. + * \return true if nodes have a name. + */ + bool isNames() const { return (mNames != NULL); } + + /** + * Returns true if elements have an identifier (= a number). + * \return true if elements have an identifier (= a number). + */ + bool isIdentifiers() const { return (mId != NULL); } + + /** + * Returns the coordinates of one node according to its index. + * \param pIndexNode index of node in [0..NUMBER_OF_NODES-1]. + * \return the coordinates of one node. + * \throw IndexOutOfBoundsException if pIndexNode is invalid. + */ + const med_float* getCoordinates(med_int pIndexNode) const; + + /** + * Returns the family of one node. + * \param pIndexNode index of node in [0..NUMBER_OF_NODES-1]. + * \return the family of the given node. + * \throw IndexOutOfBoundsException if pIndexNode is invalid. + */ + med_int getFamIdent(med_int pIndexNode) const; + + /** + * Returns the number of nodes. + * \return the number of nodes. + */ + int getNumberOfNodes() const { return mNum; } + + //--------------------------------------------------------------------- + // Algorithms + //--------------------------------------------------------------------- + + /** + * Returns the axis-aligned bounding box (CARTESIAN coordinates system) of this set of nodes. + * \param pMin (out) coordinates of the min-corner of the bbox. + * \param pMin (out) coordinates of the max-corner of the bbox. + */ + void getBBox(med_float pMin[3], med_float pMax[3]) const; + + /** + * Returns the set of families referenced by this set of nodes. + * Each family is described by its identifier. + * \return the set of families referenced by this set of nodes. + */ + std::set getSetOfFamilies() const; + + /** + * Constructor. Creates a subset of this set of nodes from a set of indices. + * \param pSetOfIndices set of indices; each index must be >= 1. + * \return a subset of this set of nodes from a set of indices. + */ + Nodes* extractSubSet(const std::set& pSetIndices) const; + + //--------------------------------------------------------------------- + // I/O + //--------------------------------------------------------------------- + + /** + * Reads all nodes of a mesh from a MED file. + * \param pMEDfile any valid MED file opened for reading. + * \param pMeshName name of the mesh to be read. + * \param pDim dimension of the mesh. + * \throw IOException if any i/o error occurs. + */ + void readMED(med_idt pMEDfile, char* pMeshName, med_int pDim); + + /** + * Writes this set of nodes to a MED file. Nodes are associated with the given mesh. + * WARNING: mesh must have been created and added to the MED file before. + * \param pMEDfile any valid MED file opened for writing. + * \param pMeshName any mesh of the MED file. + * \throw IOException if any i/o error occurs. + */ + void writeMED(med_idt pMEDfile, char* pMeshName) const; + + /** + * Sets the flag which control the stream operator <<. + * \param pFlag new flag value. + */ + void setPrintAll(bool pFlag) { mFlagPrintAll = pFlag; } + + /** + * Dumps any Nodes to the given output stream. + * \param pOs any output stream. + * \param pN any Nodes. + * \return the output stream pOs. + */ + friend std::ostream& operator<<(std::ostream& pOs, Nodes& pN); + +private: + + med_int mNum; /**< Number of nodes in this set. */ + med_int mDim; /**< Dimension of nodes. */ + med_repere mCoordSystem; /**< Type of coordinates system; should be MED_CART for cartesian. */ + + med_int* mId; /**< Optional; for each node, its identifier; NULL if undefined. */ + med_int* mFamIdent; /**< For each node, its identifier of its family. */ + char* mNames; /**< Optional; for each node, its name; NULL if undefined. */ + med_float* mCoo; /**< For each node, coordinates of node; array is interlaced: x1 y1 z1 x2 y2 z2 ...*/ + char* mNamesCoo; /**< Names of axis of the coordinates system. */ + char* mNamesUnitCoo; /**< Unit of axis of the coordinates system. */ + + bool mFlagPrintAll; /** Flag to control the behaviour of the stream operator <<. */ + +private: + + // do not allow copy constructor + Nodes(const Nodes&); + + // do not allow copy + Nodes& operator=(const Nodes&); + + // do not allow operator == + bool operator==(const Nodes&); + +}; // class Nodes + + +} // namespace MULTIPR + + +#endif // MULTIPR_NODES_HXX + +// EOF diff --git a/src/MULTIPR/MULTIPR_Obj.cxx b/src/MULTIPR/MULTIPR_Obj.cxx new file mode 100644 index 0000000..99e69f8 --- /dev/null +++ b/src/MULTIPR/MULTIPR_Obj.cxx @@ -0,0 +1,427 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_Obj.cxx + * + * \brief see MULTIPR_Obj.hxx + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +//***************************************************************************** +// Includes section +//***************************************************************************** + +#include "MULTIPR_Obj.hxx" +#include "MULTIPR_Exceptions.hxx" +#include "MULTIPR_Mesh.hxx" +#include "MULTIPR_MeshDis.hxx" +#include "MULTIPR_Utils.hxx" + +#include +#include + +using namespace std; + + +namespace multipr +{ + + +//***************************************************************************** +// Class Obj implementation +//***************************************************************************** + +Obj::Obj() +{ + mMeshDis = NULL; + + reset(); +} + + +Obj::~Obj() +{ + reset(); +} + + +void Obj::reset() +{ + mMEDfilename = ""; + mMeshName = ""; + mState = MULTIPR_OBJ_STATE_RESET; + + if (mMeshDis != NULL) { delete mMeshDis; mMeshDis = NULL; } +} + + +void Obj::create(const char* pMEDfilename) +{ + if (pMEDfilename == NULL) throw multipr::NullArgumentException("file name must not be NULL", __FILE__, __LINE__); + + // reset everything before associating a new MED file to this object + reset(); + + mMEDfilename = pMEDfilename; + + // check if file exists + FILE* f = fopen(pMEDfilename, "rb"); + if (f == 0) + { + // file does not exist + mState = MULTIPR_OBJ_STATE_ERROR; + throw FileNotFoundException("file not found", __FILE__, __LINE__); + } + fclose(f); + + // test whether it is a sequential MED file or a distributed MED file + med_idt file = MEDouvrir(const_cast(pMEDfilename), MED_LECTURE); // open sequential MED file for reading + if (file > 0) + { + // sequential MED file has been sucessfuly openened + + // CASE 1: sequential MED file + med_int ret = MEDfermer(file); + + if (ret != 0) + { + // error while closing sequential MED file + mState = MULTIPR_OBJ_STATE_ERROR; + throw multipr::IOException("i/o error while closing MED file", __FILE__, __LINE__); + } + + mState = MULTIPR_OBJ_STATE_SEQ_INIT; + cout << "Sequential MED file " << pMEDfilename << " has been successfuly opened" << endl; + } + else + { + // CASE 2: distributed MED file? + try + { + mMeshDis = new multipr::MeshDis(); + mMeshDis->readDistributedMED(pMEDfilename); + + mState = MULTIPR_OBJ_STATE_DIS; + cout << "Distributed MED file " << pMEDfilename << " has been successfuly opened" << endl; + } + catch (...) + { + // neither a sequential MED file, nor a distributed MED file => error + mState = MULTIPR_OBJ_STATE_ERROR; + throw IOException("file is nor a sequential MED file, neither a distributed MED file", __FILE__, __LINE__); + } + } +} + + +void Obj::setMesh(const char* pMeshName) +{ + // setMesh() is only available for sequential MED file (not distributed MED file) + if ((mState != MULTIPR_OBJ_STATE_SEQ_INIT) && + (mState != MULTIPR_OBJ_STATE_SEQ)) throw IllegalStateException("expected a sequential MED file", __FILE__, __LINE__); + + mMeshName = pMeshName; + + // change state to MULTIPR_OBJ_STATE_SEQ (in case of state=MULTIPR_OBJ_STATE_SEQ_INIT) + mState = MULTIPR_OBJ_STATE_SEQ; +} + + +vector Obj::getMeshes() const +{ + // test whether it is a sequential MED file or a distributed MED file + if ((mState == MULTIPR_OBJ_STATE_SEQ_INIT) || + (mState == MULTIPR_OBJ_STATE_SEQ)) + { + // CASE 1: sequential MED file + return multipr::getListMeshes(mMEDfilename.c_str()); + } + else + { + // CASE 2: distributed MED file + if (mMeshDis == NULL) + { + throw IllegalStateException("distributed MED file should not be NULL", __FILE__, __LINE__); + } + + return mMeshDis->getMeshes(); + } +} + + +vector Obj::getFields() const +{ + // test whether it is a sequential MED file or a distributed MED file + if ((mState == MULTIPR_OBJ_STATE_SEQ_INIT) || + (mState == MULTIPR_OBJ_STATE_SEQ)) + { + // CASE 1: sequential MED file + vector > tmp = multipr::getListFields(mMEDfilename.c_str()); + + vector res; + for (int i = 0 ; i < tmp.size() ; i++) + { + res.push_back(tmp[i].first); + } + + return res; + } + else + { + // CASE 2: distributed MED file + if (mMeshDis == NULL) throw IllegalStateException("distributed MED file should not be NULL", __FILE__, __LINE__); + + return mMeshDis->getFields(); + } +} + + +int Obj::getTimeStamps(const char* pFieldName) const +{ + // test whether it is a sequential MED file or a distributed MED file + if ((mState == MULTIPR_OBJ_STATE_SEQ_INIT) || + (mState == MULTIPR_OBJ_STATE_SEQ)) + { + // CASE 1: sequential MED file + vector > tmp = multipr::getListFields(mMEDfilename.c_str()); + + for (int i = 0 ; i < tmp.size() ; i++) + { + if (strcmp(tmp[i].first.c_str(), pFieldName) == 0) + { + return tmp[i].second; + } + } + + // pFieldName not found in the list of fields + return 0; + } + else + { + // CASE 2: distributed MED file + if (mMeshDis == NULL) throw IllegalStateException("distributed MED file should not be NULL", __FILE__, __LINE__); + + return mMeshDis->getTimeStamps(pFieldName); + } +} + + +vector Obj::getParts() const +{ + // getParts() is only available for distributed MED file (not sequential MED file) + if ((mState != MULTIPR_OBJ_STATE_DIS) && + (mState != MULTIPR_OBJ_STATE_DIS_MEM)) throw IllegalStateException("expected a distributed MED file", __FILE__, __LINE__); + + return getListParts(); +} + + +string Obj::getPartInfo(const char* pPartName) const +{ + // getParts() is only available for distributed MED file (not sequential MED file) + if ((mState != MULTIPR_OBJ_STATE_DIS) && + (mState != MULTIPR_OBJ_STATE_DIS_MEM)) throw IllegalStateException("expected a distributed MED file", __FILE__, __LINE__); + + if (mMeshDis == NULL) throw IllegalStateException("distributed MED file should not be NULL", __FILE__, __LINE__); + + return mMeshDis->getPartInfo(pPartName); + +} + + +vector Obj::partitionneDomaine() +{ + if (mState == MULTIPR_OBJ_STATE_SEQ_INIT) throw IllegalStateException("use setMesh() before", __FILE__, __LINE__); + + // partitionneDomaine() is only available for sequential MED file (not distributed MED file) + if (mState != MULTIPR_OBJ_STATE_SEQ) throw IllegalStateException("unexpected operation", __FILE__, __LINE__); + + //------------------------------------------------------------- + // Read the sequential mesh + //------------------------------------------------------------- + cout << "Read sequential MED file: " << mMEDfilename << ": please wait... " << endl; + + Mesh mesh; + mesh.readSequentialMED(mMEDfilename.c_str(), mMeshName.c_str()); + cout << mesh << endl; + + //------------------------------------------------------------- + // Build distributed mesh from groups + //------------------------------------------------------------- + cout << "Build distributed mesh: please wait... " << endl; + try + { + mMeshDis = mesh.splitGroupsOfElements(); + } + catch (RuntimeException& e) + { + delete mMeshDis; + mMeshDis = NULL; + throw e; + } + + mState = MULTIPR_OBJ_STATE_DIS_MEM; + + return getListParts(); +} + + +vector Obj::partitionneGrain( + const char* pPartName, + int pNbParts, + int pPartitionner) +{ + if (mMeshDis == NULL) throw IllegalStateException("expected a distributed MED file", __FILE__, __LINE__); + if (pPartName == NULL) throw NullArgumentException("", __FILE__, __LINE__); + if (pNbParts < 2) throw IllegalArgumentException("", __FILE__, __LINE__); + if ((pPartitionner != 0) && (pPartitionner != 1)) throw IllegalArgumentException("partitionner should be 0=METIS or 1=SCOTCH", __FILE__, __LINE__); + + // partitionneGrain() is only available for distributed MED file (not sequential MED file) + if ((mState != MULTIPR_OBJ_STATE_DIS_MEM) && + (mState != MULTIPR_OBJ_STATE_DIS)) throw IllegalStateException("unexpected operation", __FILE__, __LINE__); + + // if distributed MED file is currently in memory, then write to disk before performing partitionneGrain() + // (because MEDSPLIITER starts from a file) + if (mState == MULTIPR_OBJ_STATE_DIS_MEM) + { + //----------------------------------------------------- + // Write distributed mesh + //----------------------------------------------------- + cout << "Write distributed mesh: please wait... " << endl; + string strPrefix = removeExtension(mMEDfilename.c_str(), ".med"); + mMeshDis->writeDistributedMED(strPrefix.c_str()); + + mMEDfilename = mMeshDis->getFilename(); + + delete mMeshDis; + + //--------------------------------------------------------------------- + // Read the distributed mesh + //--------------------------------------------------------------------- + int ret = MEDformatConforme(mMEDfilename.c_str()); + if (ret == 0) throw IOException("waiting for a distributed MED file (not a sequential one)", __FILE__, __LINE__); + + mMeshDis = new MeshDis(); + mMeshDis->readDistributedMED(mMEDfilename.c_str()); + + mState = MULTIPR_OBJ_STATE_DIS; + } + + //--------------------------------------------------------------------- + // Split the given part (pGroupName) + //--------------------------------------------------------------------- + mMeshDis->splitPart(pPartName, pNbParts, pPartitionner); + cout << mMeshDis << endl; + + //--------------------------------------------------------------------- + // Write new distributed mesh + //--------------------------------------------------------------------- + string strPrefix = multipr::removeExtension(mMEDfilename.c_str(), ".med"); + mMeshDis->writeDistributedMED(strPrefix.c_str()); + + //--------------------------------------------------------------------- + // Read the distributed mesh + //--------------------------------------------------------------------- + delete mMeshDis; + mMeshDis = new MeshDis(); + //cout << "read dis MED file: filename=" << mMEDfilename << endl; + mMeshDis->readDistributedMED(mMEDfilename.c_str()); + + return getListParts(); +} + + +vector Obj::decimePartition( + const char* pPartName, + const char* pFieldName, + int pFieldIt, + const char* pFilterName, + double pTmed, + double pTlow, + double pRadius, + int pBoxing) +{ + + // decimePartition() is only available for distributed MED file (not sequential MED file) + if ((mState != MULTIPR_OBJ_STATE_DIS_MEM) && + (mState != MULTIPR_OBJ_STATE_DIS)) throw IllegalStateException("unexpected operation", __FILE__, __LINE__); + + if (mMeshDis == NULL) throw IllegalStateException("expected a distributed MED file", __FILE__, __LINE__); + + //--------------------------------------------------------------------- + // Decimate + //--------------------------------------------------------------------- + mMeshDis->decimatePart( + pPartName, + pFieldName, + pFieldIt, + pFilterName, + pTmed, + pTlow, + pRadius, + pBoxing); + + mState = MULTIPR_OBJ_STATE_DIS_MEM; + + return getListParts(); +} + + +vector Obj::getListParts() const +{ + if (mMeshDis == NULL) throw IllegalStateException("not a distributed mesh", __FILE__, __LINE__); + + vector names; + + int numParts = mMeshDis->getNumParts(); + for (int i = 0 ; i < numParts ; i++) + { + names.push_back( mMeshDis->getPart(i)->getPartName() ); + } + + return names; +} + + +void Obj::save() +{ + // only save file if it is a distributed MED file currently in memory + if (mState == MULTIPR_OBJ_STATE_DIS_MEM) + { + //------------------------------------------------------------- + // Write new distributed mesh + //------------------------------------------------------------- + string strPrefix = multipr::removeExtension(mMEDfilename.c_str(), ".med"); + mMeshDis->writeDistributedMED(strPrefix.c_str()); + mMEDfilename = mMeshDis->getFilename(); + + cout << "Write MED master file: " << mMEDfilename << ": OK" << endl; + + //------------------------------------------------------------- + // Read the distributed mesh + //------------------------------------------------------------- + delete mMeshDis; + mMeshDis = new MeshDis(); + mMeshDis->readDistributedMED(mMEDfilename.c_str()); + + mState = MULTIPR_OBJ_STATE_DIS; + } +} + + +ostream& operator<<(ostream& pOs, Obj& pO) +{ + pOs << "Obj:" << endl; + pOs << " Name:" << pO.mMEDfilename << endl; + + return pOs; +} + + +} // namespace multipr + +// EOF diff --git a/src/MULTIPR/MULTIPR_Obj.hxx b/src/MULTIPR/MULTIPR_Obj.hxx new file mode 100644 index 0000000..ea1ab55 --- /dev/null +++ b/src/MULTIPR/MULTIPR_Obj.hxx @@ -0,0 +1,249 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_GaussLoc.hxx + * + * \brief Class MULTIPR_Obj. + * This class is used as an interface to implement MULTIPR services in the salome MODULE + * as described in the spec/design doc. + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +#ifndef MULTIPR_OBJ_HXX +#define MULTIPR_OBJ_HXX + +//***************************************************************************** +// Includes section +//***************************************************************************** + +#include +#include +#include + + +namespace multipr +{ + +class MeshDis; + + +//***************************************************************************** +// Class Obj +//***************************************************************************** + +enum ObjState +{ + MULTIPR_OBJ_STATE_ERROR, + MULTIPR_OBJ_STATE_RESET, + MULTIPR_OBJ_STATE_SEQ_INIT, + MULTIPR_OBJ_STATE_SEQ, + MULTIPR_OBJ_STATE_DIS, + MULTIPR_OBJ_STATE_DIS_MEM +}; // enum ObjState + + +class Obj +{ +public: + + /** + * Builds an empty Gauss reference (default constructor). + */ + Obj(); + + /** + * Destructor. Removes everything. + */ + ~Obj(); + + /** + * Resets this object in its state by default (empty). Cleans memory. + */ + void reset(); + + /** + * Associate a MED file (sequential or distributed) with this object. + * This method also: + * - reset everything before starting + * - determine if the given file is a sequential (SEQ) or a distributed (DIS) MED file + * - read the ASCII master file if it is a distributed MED file + * - set state + */ + void create(const char* pMEDfilename); + + //--------------------------------------------------------------------- + // Basic accessors/mutators + //-------------------------------------------------------------------- + + /** + * Returns true iff this obj represents a valid sequential MED file. + * \return true iff this obj represents a valid sequential MED file. + */ + bool isValidSequentialMEDFile() const { return (mState == MULTIPR_OBJ_STATE_SEQ) || (mState == MULTIPR_OBJ_STATE_SEQ_INIT); } + + /** + * Returns true iff this obj represents a valid distributed MED file. + * \return true iff this obj represents a valid distributed MED file. + */ + bool isValidDistributedMEDFile() const { return (mState == MULTIPR_OBJ_STATE_DIS) || (mState == MULTIPR_OBJ_STATE_DIS_MEM); } + + /** + * Defines the mesh to be processed. + * \param pMeshName name of the mesh to be partitionned. + */ + void setMesh(const char* pMeshName); + + /** + * Returns the list of meshes contained in the sequential MED file. + * Assumes this object encapsulates a sequential MED file. + * \return the list of meshes contained in the sequential MED file. + */ + std::vector getMeshes() const; + + /** + * Returns the list of fields contained in the sequential MED file. + * Assumes this object encapsulates a sequential MED file. + * \return the list of fields contained in the sequential MED file. + */ + std::vector getFields() const; + + /** + * Returns the number of timestamps for a given field. + * Assumes this object encapsulates a sequential MED file. + * \param pFieldName name of any field. + * \return the number of timestamps for a given field; 0 if field not found. + */ + int getTimeStamps(const char* pFieldName) const; + + /** + * Returns the name of all partitions. + * Assumes this object encapsulates a distributed MED file. + * \return the name of all partitions. + */ + std::vector getParts() const; + + /** + * Returns all information about a part. + * \param pPartName name of the part. + * \return all information about a part. + */ + std::string getPartInfo(const char* pPartName) const; + + //--------------------------------------------------------------------- + // Algorithms + //-------------------------------------------------------------------- + + /** + * Creates a distributed MED file (v2.3) by extracting all the groups from the current mesh of the current MED sequential MED file. + * Assumes: + * - the file is in MED format and can be read using MED file v2.3. + * - the file is sequential (not a distributed MED). + * - the file only contains TETRA10 elements (dimension of space and mesh is 3). + * - the file have no profil. + * \return the name of each part. + * \throw RuntimeException if any error occurs. + */ + std::vector partitionneDomaine(); + + /** + * Creates a distributed MED file (V2.3) by splitting a group of a MED file previously created by partitionneDomaine. + * Assumes: + * - the file is a distributed MED file, previously created by partitionneDomaine() + * (=> each part only contain 1 mesh, TETRA10 elements only) + * - nbPart > 1 + * \param pPartName name of the part to be splitted. + * \param pNbParts number of parts; must be > 1. + * \param pPartitionner use value 0=MULTIPR_METIS for Metis or 1=MULTIPR_SCOTCH for Scotch. + * \return the name of each part. + * \throw RuntimeException if any error occurs. + */ + std::vector partitionneGrain( + const char* pPartName, + int pNbParts, + int pPartitionner=0); + + /** + * Creates 3 resolutions of the given part of a distributed MED file (V2.3). + * Assumes: + * - the file is a distributed MED file, previously created by partitionneDomaine() or partitionneGrain() + * (=> each part only contain 1 mesh, TETRA10 elements only) + * \param pPartName name of the part to be decimated. + * \param pFieldName name of the field used for decimation. + * \param pFieldIt iteration (time step) of the field. + * \param pFilterName name of the filter to be used. + * \param pTmed threshold used for medium resolution. + * \param pTlow threshold used for low resolution; tmed must be less than tlow + * \param pTadius radius used to determine the neighbourhood. + * \param pBoxing number of cells along each axis; must be >= 1; e.g. if 100 then acceleration grid will have 100*100*100 = 10**6 cells. + * \return the name of each part. + * \throw RuntimeException if any error occurs. + */ + std::vector decimePartition( + const char* pPartName, + const char* pFieldName, + int pFieldIt, + const char* pFilterName, + double pTmed, + double pTlow, + double pRadius, + int pBoxing); + + //--------------------------------------------------------------------- + // I/O + //--------------------------------------------------------------------- + + /** + * Saves the associated MED file if necessary. + * \throw IOException if any i/o error occurs. + */ + void save(); + + /** + * Dumps any Obj to the given output stream. + * \param pOs any output stream. + * \param pO any Obj. + * \return the output stream pOs. + */ + friend std::ostream& operator<<(std::ostream& pOs, Obj& pO); + +private: + + /** + * Returns the list of parts contained in the current distributed mesh. + * \return the list of parts contained in the current distributed mesh. + * \throw IllegalStateException if the distributed mesh does not still exist. + */ + std::vector getListParts() const; + +private: + + std::string mMEDfilename; /**< Name of the MED file: sequential or distributed. */ + std::string mMeshName; /**< Mesh to be partitionned. */ + ObjState mState; /**< State of this object. */ + MeshDis* mMeshDis; /**< Distributed mesh. */ + + +private: + + // do not allow copy constructor + Obj(const Obj&); + + // do not allow copy + Obj& operator=(const Obj&); + + // do not allow operator == + bool operator==(const Obj&); + +}; // class Obj + + +} // namespace MULTIPR + + +#endif // MULTIPR_OBJ_HXX + +// EOF diff --git a/src/MULTIPR/MULTIPR_PointOfField.hxx b/src/MULTIPR/MULTIPR_PointOfField.hxx new file mode 100644 index 0000000..907aab4 --- /dev/null +++ b/src/MULTIPR/MULTIPR_PointOfField.hxx @@ -0,0 +1,100 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_PointOfField.hxx + * + * \brief Class PointOfField used for decimation. PointOfField = a point in a field = coordinates + value. + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +#ifndef MULTIPR_POINTOFFIELD_HXX +#define MULTIPR_POINTOFFIELD_HXX + +//***************************************************************************** +// Includes section +//***************************************************************************** + +extern "C" +{ + #include "med.h" +} + + +namespace multipr +{ + + +//***************************************************************************** +// Class PointOfField +//***************************************************************************** + +class PointOfField +{ +public: + + /** + * Builds an empty set of elements (default constructor). + */ + PointOfField() { reset(); } + + /** + * Constructor. + * \param pX x-coordinate of the point. + * \param pY y-coordinate of the point. + * \param pZ z-coordinate of the point. + * \param pVal value of the field at the given point. + */ + PointOfField(med_float pX, med_float pY, med_float pZ, med_float pVal) + { + mXYZ[0] = pX; + mXYZ[1] = pY; + mXYZ[2] = pZ; + mVal = pVal; + } + + /** + * Destructor. Removes everything. + */ + ~PointOfField() { reset(); } + + /** + * Resets this object in its state by default (empty). + */ + void reset() + { + mXYZ[0] = std::numeric_limits::quiet_NaN(); + mXYZ[1] = std::numeric_limits::quiet_NaN(); + mXYZ[2] = std::numeric_limits::quiet_NaN(); + mVal = std::numeric_limits::quiet_NaN(); + } + + /** + * Dumps any PointOfField to the given output stream. + * \param pOs any output stream. + * \param pP any PointOfField. + * \return the output stream pOs. + */ + friend std::ostream& operator<<(std::ostream& pOs, PointOfField& pP) + { + pOs << "[ " << pP.mXYZ[0] << " ; " << pP.mXYZ[1] << " ; " << pP.mXYZ[2] << "]: " << pP.mVal; + return pOs; + } + +public: + + med_float mXYZ[3]; /**< 3D-position. */ + med_float mVal; /**< Value of the field on this point. */ + +}; // class PointOfField + + +} // namespace multipr + + +#endif // MULTIPR_FIELDPOINT_HXX + +// EOF diff --git a/src/MULTIPR/MULTIPR_Profil.cxx b/src/MULTIPR/MULTIPR_Profil.cxx new file mode 100644 index 0000000..89dfea4 --- /dev/null +++ b/src/MULTIPR/MULTIPR_Profil.cxx @@ -0,0 +1,160 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_Profil.cxx + * + * \brief see MULTIPR_Profil.hxx + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +//***************************************************************************** +// Includes section +//***************************************************************************** + +#include "MULTIPR_Profil.hxx" +#include "MULTIPR_Exceptions.hxx" + +#include + +using namespace std; + + +namespace multipr +{ + + +//***************************************************************************** +// Class Profil implementation +//***************************************************************************** + +Profil::Profil() +{ + reset(); +} + + +Profil::~Profil() +{ + reset(); +} + + +void Profil::reset() +{ + mName[0] = '\0'; + mTable.clear(); +} + + +void Profil::create(const char* pName) +{ + if (pName == NULL) throw NullArgumentException("", __FILE__, __LINE__); + + reset(); + strcpy(mName, pName); +} + + + +const char* Profil::getName() const +{ + return mName; +} + + +med_int Profil::get(med_int pIndex) const +{ + if ((pIndex < 0) || (pIndex >= med_int(mTable.size()))) throw IndexOutOfBoundsException("", __FILE__, __LINE__); + + return mTable[pIndex]; +} + + +void Profil::add(med_int pElt) +{ + mTable.push_back(pElt); +} + + +void Profil::readMED(med_idt pMEDfile, med_int pIndexProfil) +{ + if (pMEDfile == 0) throw IOException("", __FILE__, __LINE__); + if (pIndexProfil < 1) throw IllegalArgumentException("", __FILE__, __LINE__); + + reset(); + + med_int numData; + med_err ret = MEDprofilInfo( + pMEDfile, + pIndexProfil, + mName, + &numData); + + if (ret != 0) throw IOException("", __FILE__, __LINE__); + + med_int* dataTmp = new med_int[numData]; + + ret = MEDprofilLire( + pMEDfile, + dataTmp, + mName); + + if (ret != 0) throw IOException("", __FILE__, __LINE__); + + for (int itData = 0 ; itData < numData ; itData++) + { + mTable.push_back(dataTmp[itData]); + } + + delete[] dataTmp; +} + + +void Profil::writeMED(med_idt pMEDfile) +{ + if (pMEDfile == 0) throw IOException("", __FILE__, __LINE__); + if (strlen(mName) > MED_TAILLE_NOM) throw IllegalStateException("", __FILE__, __LINE__); + if (mTable.size() == 0) throw IllegalStateException("", __FILE__, __LINE__); + + med_int* dataTmp = new med_int[mTable.size()]; + for (unsigned itData = 0 ; itData < mTable.size() ; itData++) + { + dataTmp[itData] = mTable[itData]; + } + + med_err ret = MEDprofilEcr( + pMEDfile, + dataTmp, + mTable.size(), + mName); + + if (ret != 0) throw IOException("", __FILE__, __LINE__); + + delete[] dataTmp; +} + + +ostream& operator<<(ostream& pOs, Profil& pP) +{ + pOs << "Profil:" << endl; + pOs << " Name=|" << pP.mName << "|" << endl; + pOs << " Size=" << pP.mTable.size() << endl; + + pOs << " Entities=["; + for (unsigned itElt = 0; itElt < pP.mTable.size() ; itElt++) + { + pOs << pP.mTable[itElt] << " "; + } + pOs << "]"; + + return pOs; +} + + +} // namespace multipr + +// EOF diff --git a/src/MULTIPR/MULTIPR_Profil.hxx b/src/MULTIPR/MULTIPR_Profil.hxx new file mode 100644 index 0000000..6a12b25 --- /dev/null +++ b/src/MULTIPR/MULTIPR_Profil.hxx @@ -0,0 +1,140 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_Profil.hxx + * + * \brief Class Profil used to managed MED profil. + * Profil is just a list of indices related to elements (NODES, CELLS). + * !!! currently not used !!! + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +#ifndef MULTIPR_PROFIL_HXX +#define MULTIPR_PROFIL_HXX + +//***************************************************************************** +// Includes section +//***************************************************************************** + +extern "C" +{ + #include "med.h" +} + +#include + + +namespace multipr +{ + + +//***************************************************************************** +// Class Profil +//***************************************************************************** + +class Profil +{ +public: + + /** + * Builds an empty profil (default constructor). + */ + Profil(); + + /** + * Destructor. Removes everything. + */ + ~Profil(); + + /** + * Resets this object in its state by default (empty). Cleans memory. + */ + void reset(); + + /** + * Creates a profil from its name (reset before). + * \param pName name of the profil to be created. + * \throw NullArgumentException if pName is NULL. + */ + void create(const char* pName); + + //--------------------------------------------------------------------- + // Basic accessors/mutators + //--------------------------------------------------------------------- + + /** + * Returns the name of this profil. + * \return the name of this profil. + */ + const char* getName() const; + + /** + * Returns the nth elements of this profil. + * \param pIndex index of the element to get; must be in [0..NUMBER_OF_ELEMENTS-1]. + * \return the nth elements of this profil. + * \throw IndexOutOfBoundsException if index is invalid. + */ + med_int get(med_int pIndex) const; + + /** + * Adds a new element to this profil. + * \param pElt element to be added; must be >= 1. + */ + void add(med_int pElt); + + //--------------------------------------------------------------------- + // I/O + //--------------------------------------------------------------------- + + /** + * Reads a Profil from a MED file. + * \param pMEDfile any valid MED file opened for reading. + * \param pIndexProfil index of the profil to be read; must be >= 1. + * \throw IOException if any i/o error occurs. + */ + void readMED(med_idt pMEDfile, med_int pIndexProfil); + + /** + * Writes this profil to a MED file. + * \param pMEDfile any valid MED file opened for writing. + * \throw IOException if any i/o error occurs. + */ + void writeMED(med_idt pMEDfile); + + /** + * Dumps any Profil to the given output stream. + * \param pOs any output stream. + * \param pP any Profil. + * \return the output stream pOs. + */ + friend std::ostream& operator<<(std::ostream& pOs, Profil& pP); + +private: + + char mName[MED_TAILLE_NOM + 1]; /**< Name of the profil. */ + std::vector mTable; /**< Table of elements. */ + +private: + + // do not allow copy constructor + Profil(const Profil&); + + // do not allow copy + Profil& operator=(const Profil&); + + // do not allow operator == + bool operator==(const Profil&); + +}; // class Profil + + +} // namespace MULTIPR + + +#endif // MULTIPR_PROFIL_HXX + +// EOF diff --git a/src/MULTIPR/MULTIPR_ProgressCallback.hxx b/src/MULTIPR/MULTIPR_ProgressCallback.hxx new file mode 100644 index 0000000..f8e0ff6 --- /dev/null +++ b/src/MULTIPR/MULTIPR_ProgressCallback.hxx @@ -0,0 +1,82 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_ProgressCallback.hxx + * + * \brief Class MULTIPR_ProgressCallback + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +#ifndef MULTIPR_PROGRESS_CALLBACK_HXX +#define MULTIPR_PROGRESS_CALLBACK_HXX + +//***************************************************************************** +// Includes section +//***************************************************************************** + + +//***************************************************************************** +// Class MULTIPR_ProgressCallback +// Used to provide feedback on the progress of a slow operation. +//***************************************************************************** + +class MULTIPR_ProgressCallback +{ +public: + + /** + * Builds a new MULTIPR_ProgressCallback (default constructor). + */ + MULTIPR_ProgressCallback() { init(100); } + + /** + * Destructor. Removes everything. + */ + ~MULTIPR_ProgressCallback() { /* do nothing */ } + + /** + * Starts to provide feedback on the progress of a slow operation. + * \param pTaskTitle name of the task to be monitored. + * \param pNumSteps number of steps in the task. + */ + virtual void start(const char* pTaskTitle, int pNumSteps) = 0; + + /** + * Moves on the current amount of progress made. + */ + void moveOn() { mCurrentStep++; float percent = float(mCurrentStep)/float(mTotalSteps)*100.0f; progress(percent); } + + /** + * Termines to provide feedback. + */ + virtual void done() = 0; + +protected: + + /** + * Resets this progress callback. + * \param pNumSteps number of steps in the task to be monitored. + */ + void init(int pNumSteps) { mCurrentStep = 0; mTotalSteps = pNumSteps; } + + /** + * Callback. Called on each progress. + * \param pPercent percent accomplished. + */ + virtual void progress(float pPercent) = 0; + +private: + + int mCurrentStep; + int mTotalSteps; + +}; // class MULTIPR_ProgressCallback + + +#endif // MULTIPR_PROGRESS_CALLBACK_HXX + +// EOF diff --git a/src/MULTIPR/MULTIPR_Utils.cxx b/src/MULTIPR/MULTIPR_Utils.cxx new file mode 100644 index 0000000..ad6b01f --- /dev/null +++ b/src/MULTIPR/MULTIPR_Utils.cxx @@ -0,0 +1,226 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_Utils.cxx + * + * \brief see MULTIPR_Utils.hxx + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +//***************************************************************************** +// Includes section +//***************************************************************************** + +#include "MULTIPR_Utils.hxx" +#include "MULTIPR_Exceptions.hxx" + +#include + +using namespace std; + + +//***************************************************************************** +// Implementation +//***************************************************************************** + +void multipr::trim(char* pStr, char pChar) +{ + int len = strlen(pStr) - 1; + int p = len; + while (pStr[p] == pChar) + { + p--; + } + if (p != len) + { + pStr[p + 1] = '\0'; + } +} + + +string multipr::removeExtension(const char* pFilename, const char* pExtension) +{ + string strPrefix(pFilename); + strPrefix.erase(strPrefix.rfind(pExtension), strlen(pExtension)); + + return strPrefix; +} + + +void multipr::printArray2D( + const med_float* pData, + const int pNumElt, + const int pDimElt, + const char* pPrefix) +{ + for (int itElt = 0 ; itElt < pNumElt ; itElt++) + { + cout << pPrefix << " " << (itElt + 1) << ": "; + for (int itDim = 0 ; itDim < pDimElt ; itDim++) + { + cout << pData[itElt * pDimElt + itDim] << " "; + } + cout << endl; + } +} + + +string multipr::realToString(med_float mV) +{ + char str[32]; + sprintf(str, "%lf", mV); + trim(str, '0'); + int len = strlen(str); + if (str[len - 1] == '.') + { + str[len] = '0'; + str[len + 1] = '\0'; + } + return string(str); +} + + +vector multipr::getListMeshes(const char* pMEDfilename) +{ + if (pMEDfilename == NULL) throw multipr::NullArgumentException("", __FILE__, __LINE__); + + vector res; + med_err ret; + + //--------------------------------------------------------------------- + // Open MED file (READ_ONLY) + //--------------------------------------------------------------------- + med_idt file = MEDouvrir(const_cast(pMEDfilename), MED_LECTURE); // open MED file for reading + if (file <= 0) throw multipr::IOException("MED file not found or not a sequential MED file", __FILE__, __LINE__); + + //--------------------------------------------------------------------- + // Read name of meshes + //--------------------------------------------------------------------- + med_int nbMeshes = MEDnMaa(file); + if (nbMeshes <= 0) throw multipr::IOException("i/o error while reading number of meshes in MED file", __FILE__, __LINE__); + + // for each mesh in the file (warning: first mesh is number 1) + for (int itMesh = 1 ; itMesh <= nbMeshes ; itMesh++) + { + char meshName[MED_TAILLE_NOM + 1]; + + int meshDim; + med_maillage meshType; + char meshDesc[MED_TAILLE_DESC + 1]; + + ret = MEDmaaInfo( + file, + itMesh, + meshName, + &meshDim, + &meshType, + meshDesc); + + if (ret != 0) throw multipr::IOException("i/o error while reading mesh information in MED file", __FILE__, __LINE__); + + res.push_back(meshName); + } + + //--------------------------------------------------------------------- + // Close the MED file + //--------------------------------------------------------------------- + ret = MEDfermer(file); + if (ret != 0) throw multipr::IOException("i/o error while closing MED file", __FILE__, __LINE__); + + return res; +} + + +vector > multipr::getListFields(const char* pMEDfilename) +{ + if (pMEDfilename == NULL) throw multipr::NullArgumentException("", __FILE__, __LINE__); + + vector > res; + med_err ret; + + //--------------------------------------------------------------------- + // Open MED file (READ_ONLY) + //--------------------------------------------------------------------- + med_idt file = MEDouvrir(const_cast(pMEDfilename), MED_LECTURE); // open MED file for reading + if (file <= 0) throw multipr::IOException("MED file not found or not a sequential MED file", __FILE__, __LINE__); + + //--------------------------------------------------------------------- + // Read number of fields + //--------------------------------------------------------------------- + med_int numFields = MEDnChamp(file, 0); + if (numFields <= 0) throw IOException("", __FILE__, __LINE__); + + //--------------------------------------------------------------------- + // For each field, read its name + //--------------------------------------------------------------------- + for (int itField = 1 ; itField <= numFields ; itField++) + { + char name[MED_TAILLE_NOM + 1]; + med_type_champ type; + + med_int numComponents = MEDnChamp(file, itField); + + if (numComponents < 0) throw IOException("", __FILE__, __LINE__); + + // collect scalar field only (not vectorial fields) + if (numComponents != 1) + continue; + + char* strComponent = new char[numComponents * MED_TAILLE_PNOM + 1]; + char* strUnit = new char[numComponents * MED_TAILLE_PNOM + 1]; + + strComponent[0] = '\0'; + strUnit[0] = '\0'; + + med_err ret = MEDchampInfo( + file, + itField, + name, + &(type), + strComponent, + strUnit, + numComponents); + + if (ret != 0) throw IOException("", __FILE__, __LINE__); + + delete[] strUnit; + delete[] strComponent; + + med_int numTimeStep = MEDnPasdetemps( + file, + name, + MED_NOEUD, + (med_geometrie_element) 0); + + if (numTimeStep < 0) throw IOException("", __FILE__, __LINE__); + + if (numTimeStep == 0) + { + numTimeStep = MEDnPasdetemps( + file, + name, + MED_MAILLE, + MED_TETRA10); + + if (numTimeStep < 0) throw IOException("", __FILE__, __LINE__); + + } + + res.push_back(make_pair(name, numTimeStep)); + } + + //--------------------------------------------------------------------- + // Close the MED file + //--------------------------------------------------------------------- + ret = MEDfermer(file); + if (ret != 0) throw multipr::IOException("i/o error while closing MED file", __FILE__, __LINE__); + + return res; +} + + +// EOF diff --git a/src/MULTIPR/MULTIPR_Utils.hxx b/src/MULTIPR/MULTIPR_Utils.hxx new file mode 100644 index 0000000..01b5a73 --- /dev/null +++ b/src/MULTIPR/MULTIPR_Utils.hxx @@ -0,0 +1,94 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_Utils.hxx + * + * \brief Some useful miscellaneous tools. + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +#ifndef MULTIPR_UTILS_HXX +#define MULTIPR_UTILS_HXX + +extern "C" +{ + #include "med.h" +} + +#include +#include + + +namespace multipr +{ + + +/** + * Removes all the pChar at the end of the string. + * \param pStr any valid C string ending with the char '\0'. + * \param pChar any char; SPACE by default. + * \return the same string where the ending spaces have been removed. + */ +void trim(char* pStr, char pChar=' '); + + +/** + * Removes the extension (suffix) of a filename. + * Example: removeExtension("agregat100grains_12pas.med", ".med") -> "agregat100grains_12pas" + * \param pPilename any valid C string ending with the char '\0'. + * \param pExtension any valid C string ending with the char '\0'. + * \return the filename without extension. + */ +std::string removeExtension(const char* pFilename, const char* pExtension); + + +/** + * Prints all the elements of a 2D array. + * \param pData all the data (should contain pNumberOfElements * pDimOfElements values) + * \param pNumElt number of elements to display. + * \param pDimElt Dimension of elements. + * \param pPrefix string to display before each element. + */ +void printArray2D( + const med_float* pData, + const int pNumElt, + const int pDimElt, + const char* pPrefix); + + +/** + * Converts any float value to a string (remove unecessary 0). + * \param mV any float value. + */ +std::string realToString(med_float mV); + + +/** + * Returns the name of all meshes contained in a sequential MED file. + * \param pMEDfilename name of any valid sequential MED file; must not be NULL. + * \return a list of mesh names. + * \throw NullArgumentException if pMEDfilename is NULL. + * \throw IOException if any other error occurs while reading MED file. + */ + std::vector getListMeshes(const char* pMEDfilename); + + + /** + * For each field in a sequential MED file, returns its name and the related number of iterations. + * \param pMEDfilename name of any valid sequential MED file; must not be NULL. + * \return a list of (name, #iterations). + * \throw NullArgumentException if pMEDfilename is NULL. + * \throw IOException if any other error occurs while reading MED file. + */ + std::vector > getListFields(const char* pMEDfilename); + +} // namespace MULTIPR + + +#endif // MULTIPR_UTILS_HXX + +// EOF diff --git a/src/MULTIPR/MULTIPR_i.cxx b/src/MULTIPR/MULTIPR_i.cxx new file mode 100644 index 0000000..e9dd3a2 --- /dev/null +++ b/src/MULTIPR/MULTIPR_i.cxx @@ -0,0 +1,485 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_i.cxx + * + * \brief see MULTIPR_i.hxx + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + + +//***************************************************************************** +// Includes section +//***************************************************************************** + +using namespace std; + +#include "MULTIPR_i.hxx" +#include "utilities.h" + +#include + +#include "MULTIPR_API.hxx" +#include "MULTIPR_Exceptions.hxx" + + +//***************************************************************************** +// Class MULTIPR_Gen_i implementation +//***************************************************************************** + +MULTIPR_Gen_i::MULTIPR_Gen_i( + CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId* contId, + const char* instanceName, + const char* interfaceName) : + Engines_Component_i(orb, poa, contId, instanceName, interfaceName) +{ + MESSAGE("activate object"); + _thisObj = this ; + _id = _poa->activate_object(_thisObj); +} + + +MULTIPR_Gen_i::~MULTIPR_Gen_i() +{ +} + + +//----------------------------------------------------------------------------- +// High level API +//----------------------------------------------------------------------------- + +char* MULTIPR_Gen_i::getVersion() + throw (SALOME::SALOME_Exception) +{ + return CORBA::string_dup(multipr::getVersion()); +} + + +void MULTIPR_Gen_i::partitionneDomaine( + const char* medFilename, + const char* meshName) + throw (SALOME::SALOME_Exception) +{ + try + { + multipr::partitionneDomaine(medFilename, meshName); + } + catch (multipr::RuntimeException& e) + { + e.dump(cout); + THROW_SALOME_CORBA_EXCEPTION("partitionneDomaine() failed", SALOME::INTERNAL_ERROR); + } +} + + +void MULTIPR_Gen_i::partitionneGrain( + const char* medFilename, + const char* partName, + CORBA::Long nbParts, + CORBA::Long partitionner) + throw (SALOME::SALOME_Exception) +{ + try + { + multipr::partitionneGrain( + medFilename, + partName, + nbParts, + partitionner); + } + catch (multipr::RuntimeException& e) + { + e.dump(cout); + THROW_SALOME_CORBA_EXCEPTION("partitionneGrain() failed", SALOME::INTERNAL_ERROR); + } +} + + +void MULTIPR_Gen_i::decimePartition( + const char* medFilename, + const char* partName, + const char* fieldName, + CORBA::Long fieldIt, + const char* filterName, + CORBA::Double tmed, + CORBA::Double tlow, + CORBA::Double radius, + CORBA::Long boxing) + throw (SALOME::SALOME_Exception) +{ + /* + // debug + cout << "File : " << medFilename << endl; + cout << "Part : " << partName << endl; + cout << "Field : " << fieldName << endl; + cout << "It : " << fieldIt << endl; + cout << "Filter: " << filterName << endl; + cout << "Med : " << tmed << endl; + cout << "Low : " << tlow << endl; + cout << "Rad : " << radius << endl; + cout << "Box : " << boxing << endl; + cout << endl; + */ + + try + { + multipr::decimePartition( + medFilename, + partName, + fieldName, + fieldIt, + filterName, + tmed, + tlow, + radius, + boxing); + } + catch (multipr::RuntimeException& e) + { + e.dump(cout); + THROW_SALOME_CORBA_EXCEPTION("decimePartition() failed", SALOME::INTERNAL_ERROR); + } +} + + +//----------------------------------------------------------------------------- +// Low level API +//----------------------------------------------------------------------------- + +MULTIPR_ORB::MULTIPR_Obj_ptr MULTIPR_Gen_i::getObject(const char* medFilename) + throw (SALOME::SALOME_Exception) +{ + MULTIPR_Obj_i* obj = new MULTIPR_Obj_i(medFilename); + return obj->POA_MULTIPR_ORB::MULTIPR_Obj::_this(); +} + + +MULTIPR_Obj_i::MULTIPR_Obj_i(const char* medFilename) + throw (SALOME::SALOME_Exception) +{ + mObj = new multipr::Obj(); + mBoxing = 100; + + try + { + cout << "Load " << medFilename << endl; + mObj->create(medFilename); + cout << endl; + } + catch (multipr::RuntimeException& e) + { + delete mObj; + mObj = NULL; + e.dump(cout); + THROW_SALOME_CORBA_EXCEPTION("Unable to create object", SALOME::INTERNAL_ERROR); + } +} + + +MULTIPR_Obj_i::~MULTIPR_Obj_i() +{ + if (mObj != NULL) + { + delete mObj; + mObj = NULL; + } +} + + +CORBA::Boolean MULTIPR_Obj_i::isValidSequentialMEDFile() + throw (SALOME::SALOME_Exception) +{ + if (mObj == NULL) THROW_SALOME_CORBA_EXCEPTION("No associated MED file", SALOME::INTERNAL_ERROR); + + return mObj->isValidSequentialMEDFile(); +} + + +CORBA::Boolean MULTIPR_Obj_i::isValidDistributedMEDFile() + throw (SALOME::SALOME_Exception) +{ + if (mObj == NULL) THROW_SALOME_CORBA_EXCEPTION("No associated MED file", SALOME::INTERNAL_ERROR); + + return mObj->isValidDistributedMEDFile(); +} + + +void MULTIPR_Obj_i::setMesh(const char* meshName) + throw (SALOME::SALOME_Exception) +{ + if (mObj == NULL) THROW_SALOME_CORBA_EXCEPTION("No associated MED file", SALOME::INTERNAL_ERROR); + + try + { + mObj->setMesh(meshName); + + cout << "Set mesh OK" << endl << endl; + } + catch (multipr::RuntimeException& e) + { + e.dump(cout); + THROW_SALOME_CORBA_EXCEPTION("Unable to set mesh", SALOME::INTERNAL_ERROR); + } +} + + +void MULTIPR_Obj_i::setBoxing(CORBA::Long pBoxing) + throw (SALOME::SALOME_Exception) +{ + if (mBoxing < 0) THROW_SALOME_CORBA_EXCEPTION("Invalid boxing parameter; should be >= 1", SALOME::INTERNAL_ERROR); + if (mBoxing > 200) THROW_SALOME_CORBA_EXCEPTION("Invalid boxing parameter; should be <= 200", SALOME::INTERNAL_ERROR); + + mBoxing = pBoxing; +} + + +MULTIPR_ORB::string_array* MULTIPR_Obj_i::getMeshes() + throw (SALOME::SALOME_Exception) +{ + if (mObj == NULL) THROW_SALOME_CORBA_EXCEPTION("No associated MED file", SALOME::INTERNAL_ERROR); + + MULTIPR_ORB::string_array_var mySeq = new MULTIPR_ORB::string_array(); + + try + { + std::vector listMeshes = mObj->getMeshes(); + mySeq->length(listMeshes.size()); + + for (int i = 0 ; i < listMeshes.size() ; i++) + { + mySeq[i] = CORBA::string_dup(listMeshes[i].c_str()); + } + } + catch (multipr::RuntimeException& e) + { + e.dump(cout); + THROW_SALOME_CORBA_EXCEPTION("Unable to get meshes", SALOME::INTERNAL_ERROR); + } + + return mySeq._retn(); +} + + +MULTIPR_ORB::string_array* MULTIPR_Obj_i::getFields() + throw (SALOME::SALOME_Exception) +{ + if (mObj == NULL) THROW_SALOME_CORBA_EXCEPTION("No associated MED file", SALOME::INTERNAL_ERROR); + + MULTIPR_ORB::string_array_var mySeq = new MULTIPR_ORB::string_array(); + + try + { + std::vector listFields = mObj->getFields(); + mySeq->length(listFields.size()); + + for (int i = 0 ; i < listFields.size() ; i++) + { + mySeq[i] = CORBA::string_dup(listFields[i].c_str()); + } + } + catch (multipr::RuntimeException& e) + { + e.dump(cout); + THROW_SALOME_CORBA_EXCEPTION("Unable to get fields", SALOME::INTERNAL_ERROR); + } + + return mySeq._retn(); +} + + +CORBA::Long MULTIPR_Obj_i::getTimeStamps(const char* fieldName) + throw (SALOME::SALOME_Exception) +{ + if (mObj == NULL) THROW_SALOME_CORBA_EXCEPTION("No associated MED file", SALOME::INTERNAL_ERROR); + + try + { + return mObj->getTimeStamps(fieldName); + } + catch (multipr::RuntimeException& e) + { + e.dump(cout); + THROW_SALOME_CORBA_EXCEPTION("Unable to get time stamps", SALOME::INTERNAL_ERROR); + } +} + + +MULTIPR_ORB::string_array* MULTIPR_Obj_i::getParts() + throw (SALOME::SALOME_Exception) +{ + if (mObj == NULL) THROW_SALOME_CORBA_EXCEPTION("No associated MED file", SALOME::INTERNAL_ERROR); + + MULTIPR_ORB::string_array_var mySeq = new MULTIPR_ORB::string_array(); + + try + { + std::vector listParts = mObj->getParts(); + mySeq->length(listParts.size()); + + for (int i = 0 ; i < listParts.size() ; i++) + { + mySeq[i] = CORBA::string_dup(listParts[i].c_str()); + } + } + catch (multipr::RuntimeException& e) + { + e.dump(cout); + THROW_SALOME_CORBA_EXCEPTION("Unable to get parts", SALOME::INTERNAL_ERROR); + } + + return mySeq._retn(); +} + + +char* MULTIPR_Obj_i::getPartInfo(const char* pPartName) + throw (SALOME::SALOME_Exception) +{ + if (mObj == NULL) THROW_SALOME_CORBA_EXCEPTION("No associated MED file", SALOME::INTERNAL_ERROR); + + return CORBA::string_dup(mObj->getPartInfo(pPartName).c_str()); +} + + +MULTIPR_ORB::string_array* MULTIPR_Obj_i::partitionneDomaine() + throw (SALOME::SALOME_Exception) +{ + if (mObj == NULL) THROW_SALOME_CORBA_EXCEPTION("No associated MED file", SALOME::INTERNAL_ERROR); + + MULTIPR_ORB::string_array_var mySeq = new MULTIPR_ORB::string_array(); + + try + { + std::vector listParts = mObj->partitionneDomaine(); + mySeq->length(listParts.size()); + + for (int i = 0 ; i < listParts.size() ; i++) + { + mySeq[i] = CORBA::string_dup(listParts[i].c_str()); + } + } + catch (multipr::RuntimeException& e) + { + e.dump(cout); + THROW_SALOME_CORBA_EXCEPTION("Unable to partition mesh", SALOME::INTERNAL_ERROR); + } + + return mySeq._retn(); +} + + +MULTIPR_ORB::string_array* MULTIPR_Obj_i::partitionneGrain( + const char* pPartName, + CORBA::Long pNbParts, + CORBA::Long pPartitionner) + throw (SALOME::SALOME_Exception) +{ + if (mObj == NULL) THROW_SALOME_CORBA_EXCEPTION("No associated MED file", SALOME::INTERNAL_ERROR); + + MULTIPR_ORB::string_array_var mySeq = new MULTIPR_ORB::string_array(); + + try + { + std::vector listParts = mObj->partitionneGrain( + pPartName, + pNbParts, + pPartitionner); + + mySeq->length(listParts.size()); + + for (int i = 0 ; i < listParts.size() ; i++) + { + mySeq[i] = CORBA::string_dup(listParts[i].c_str()); + } + } + catch (multipr::RuntimeException& e) + { + e.dump(cout); + THROW_SALOME_CORBA_EXCEPTION("Unable to partition group", SALOME::INTERNAL_ERROR); + } + + return mySeq._retn(); +} + + +MULTIPR_ORB::string_array* MULTIPR_Obj_i::decimePartition( + const char* pPartName, + const char* pFieldName, + CORBA::Long pFieldIt, + const char* pFilterName, + CORBA::Double pTmed, + CORBA::Double pTlow, + CORBA::Double pRadius) + throw (SALOME::SALOME_Exception) +{ + if (mObj == NULL) THROW_SALOME_CORBA_EXCEPTION("No associated MED file", SALOME::INTERNAL_ERROR); + + MULTIPR_ORB::string_array_var mySeq = new MULTIPR_ORB::string_array(); + + try + { + std::vector listParts = mObj->decimePartition( + pPartName, + pFieldName, + pFieldIt, + pFilterName, + pTmed, + pTlow, + pRadius, + mBoxing); + + mySeq->length(listParts.size()); + + for (int i = 0 ; i < listParts.size() ; i++) + { + mySeq[i] = CORBA::string_dup(listParts[i].c_str()); + } + } + catch (multipr::RuntimeException& e) + { + e.dump(cout); + THROW_SALOME_CORBA_EXCEPTION("Unable to decimate", SALOME::INTERNAL_ERROR); + } + + return mySeq._retn(); +} + + +void MULTIPR_Obj_i::save() + throw (SALOME::SALOME_Exception) +{ + if (mObj == NULL) THROW_SALOME_CORBA_EXCEPTION("No associated MED file", SALOME::INTERNAL_ERROR); + + try + { + mObj->save(); + + } + catch (multipr::RuntimeException& e) + { + e.dump(cout); + THROW_SALOME_CORBA_EXCEPTION("Unable to save MED file", SALOME::INTERNAL_ERROR); + } +} + + +extern "C" +{ + PortableServer::ObjectId* MULTIPREngine_factory( + CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId * contId, + const char* instanceName, + const char* interfaceName) + { + MESSAGE("PortableServer::ObjectId* MULTIPREngine_factory()"); + SCRUTE(interfaceName); + MULTIPR_Gen_i* myMULTIPR = new MULTIPR_Gen_i(orb, poa, contId, instanceName, interfaceName); + return myMULTIPR->getId(); + } +} diff --git a/src/MULTIPR/MULTIPR_i.hxx b/src/MULTIPR/MULTIPR_i.hxx new file mode 100644 index 0000000..73bd6cf --- /dev/null +++ b/src/MULTIPR/MULTIPR_i.hxx @@ -0,0 +1,273 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_i.hxx + * + * \brief C++ implementation of the CORBA interface of the MULTIPR module. + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + + +//***************************************************************************** +// Includes section +//***************************************************************************** + +#ifndef __MULTIPR_IMPLEMENTATION_CORBA__ +#define __MULTIPR_IMPLEMENTATION_CORBA__ + +#include +#include CORBA_SERVER_HEADER(MULTIPR) +#include "SALOME_Component_i.hxx" +#include "Utils_CorbaException.hxx" + +#include "MULTIPR_Obj.hxx" + + +//***************************************************************************** +// Class MULTIPR_Obj_i +// C++ implementation of the MULTIPR_Obj CORBA interface +// This class is a wrapper to encapsulate MULTIPR_Obj +//***************************************************************************** + +class MULTIPR_Obj_i : + public POA_MULTIPR_ORB::MULTIPR_Obj +{ + +public: + + /** + * Constructor. + * Associate a MED file (sequential or distributed) with this object. + * \param pMEDFilename MED file to be associated with this object. + */ + MULTIPR_Obj_i(const char* pMEDFilename) + throw (SALOME::SALOME_Exception); + + /** + * Destructor. + */ + virtual ~MULTIPR_Obj_i(); + + //--------------------------------------------------------------------- + // Basic accessors/mutators + //-------------------------------------------------------------------- + + /** + * Returns true iff this obj represents a valid sequential MED file. + * \return true iff this obj represents a valid sequential MED file. + */ + CORBA::Boolean isValidSequentialMEDFile() + throw (SALOME::SALOME_Exception); + + /** + * Returns true iff this obj represents a valid distributed MED file. + * \return true iff this obj represents a valid distributed MED file. + */ + CORBA::Boolean isValidDistributedMEDFile() + throw (SALOME::SALOME_Exception); + + /** + * Defines the mesh to be processed. + * \param pMeshName name of the mesh to be partitionned. + */ + void setMesh(const char* pMeshName) + throw (SALOME::SALOME_Exception); + + /** + * Sets boxing parameters for decimation (100 by default). + * \param pBoxing number of cells along each axis of the grid (= acceleration structure) ; should be in [1..200]. + */ + void setBoxing(CORBA::Long pBoxing) + throw (SALOME::SALOME_Exception); + + /** + * Returns the list of meshes contained in the sequential MED file. + * Assumes this object encapsulates a sequential MED file. + * \return the list of meshes contained in the sequential MED file. + */ + MULTIPR_ORB::string_array* getMeshes() + throw (SALOME::SALOME_Exception); + + /** + * Returns the list of fields contained in the sequential MED file. + * Assumes this object encapsulates a sequential MED file. + * \return the list of fields contained in the sequential MED file. + */ + MULTIPR_ORB::string_array* getFields() + throw (SALOME::SALOME_Exception); + + /** + * Returns the number of timestamps for a given field. + * Assumes this object encapsulates a sequential MED file. + * \param pFieldName name of any field. + * \return the number of timestamps for a given field; 0 if field not found. + */ + CORBA::Long getTimeStamps(const char* pFieldName) + throw (SALOME::SALOME_Exception); + + /** + * Returns the name of all partitions. + * Assumes this object encapsulates a distributed MED file. + * \return the name of all partitions. + */ + MULTIPR_ORB::string_array* getParts() + throw (SALOME::SALOME_Exception); + + /** + * Returns all information abour a part. + * Assumes this object encapsulates a distributed MED file. + * \param pPartName name of the part. + * \return information about a part. + */ + char* getPartInfo(const char* pPartName) + throw (SALOME::SALOME_Exception); + + //--------------------------------------------------------------------- + // Algorithms + //--------------------------------------------------------------------- + + /** + * Creates a distributed MED file (v2.3) by extracting all the groups from the current mesh of the current MED sequential MED file. + * Assumes: + * - the file is in MED format and can be read using MED file v2.3. + * - the file is sequential (not a distributed MED). + * - the file only contains TETRA10 elements (dimension of space and mesh is 3). + * - the file have no profil. + * \return the name of each part. + */ + MULTIPR_ORB::string_array* partitionneDomaine() + throw (SALOME::SALOME_Exception); + + /** + * Creates a distributed MED file (V2.3) by splitting a group of a MED file previously created by partitionneDomaine. + * Assumes: + * - the file is a distributed MED file, previously created by partitionneDomaine() + * (=> each part only contain 1 mesh, TETRA10 elements only) + * - nbPart > 1 + * \param pPartName name of the part to be splitted. + * \param pNbParts number of parts; must be > 1. + * \param pPartitionner use value 0=MULTIPR_METIS for Metis or 1=MULTIPR_SCOTCH for Scotch. + * \return the name of each part. + */ + MULTIPR_ORB::string_array* partitionneGrain( + const char* pPartName, + CORBA::Long pNbParts, + CORBA::Long pPartitionner) + throw (SALOME::SALOME_Exception); + + /** + * Creates 3 resolutions of the given part of a distributed MED file (V2.3). + * Assumes: + * - the file is a distributed MED file, previously created by partitionneDomaine() or partitionneGrain() + * (=> each part only contain 1 mesh, TETRA10 elements only) + * \param pPartName name of the part to be decimated. + * \param pFieldName name of the field used for decimation. + * \param pFieldIt iteration (time step) of the field. + * \param pFilterName name of the filter to be used. + * \param pTmed threshold used for medium resolution. + * \param pTlow threshold used for low resolution; tmed must be less than tlow + * \param pTadius radius used to determine the neighbourhood. + * \return the name of each part. + */ + MULTIPR_ORB::string_array* decimePartition( + const char* pPartName, + const char* pFieldName, + CORBA::Long pFieldIt, + const char* pFilterName, + CORBA::Double pTmed, + CORBA::Double pTlow, + CORBA::Double pRadius) + throw (SALOME::SALOME_Exception); + + //--------------------------------------------------------------------- + // I/O + //--------------------------------------------------------------------- + + /** + * Saves the associated MED file if necessary. + */ + void save() + throw (SALOME::SALOME_Exception); + +private: + + /** + * The associated MULTIPR object. + */ + multipr::Obj* mObj; + + /** + * Boxing paremeter: number of cells along each axis. + * E.g. if mBoxing=10 then total number of cells = 10*10*10 = 1000. + * By default, mBoxing=100. + */ + int mBoxing; + +}; + + +//***************************************************************************** +// Class MULTIPR_Gen_i +// C++ implementation of the MULTIPR_Gen CORBA interface +//***************************************************************************** + +class MULTIPR_Gen_i : + public POA_MULTIPR_ORB::MULTIPR_Gen, + public Engines_Component_i +{ + +public: + + MULTIPR_Gen_i( + CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId* contId, + const char* instanceName, + const char* interfaceName); + + virtual ~MULTIPR_Gen_i(); + + char* getVersion() + throw (SALOME::SALOME_Exception); + + void partitionneDomaine( + const char* medFilename, + const char* meshName) + throw (SALOME::SALOME_Exception); + + void partitionneGrain( + const char* medFilename, + const char* partName, + CORBA::Long nbParts, + CORBA::Long partitionner) + throw (SALOME::SALOME_Exception); + + void decimePartition( + const char* medFilename, + const char* partName, + const char* fieldName, + CORBA::Long fieldIt, + const char* filterName, + CORBA::Double tmed, + CORBA::Double tlow, + CORBA::Double radius, + CORBA::Long boxing) + throw (SALOME::SALOME_Exception); + + MULTIPR_ORB::MULTIPR_Obj_ptr getObject(const char* medFilename) + throw (SALOME::SALOME_Exception); +}; + + +extern "C" PortableServer::ObjectId* MULTIPREngine_factory( + CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId * contId, + const char* instanceName, + const char* interfaceName); + +#endif // __MULTIPR_IMPLEMENTATION_CORBA__ diff --git a/src/MULTIPR/Makefile.in b/src/MULTIPR/Makefile.in new file mode 100644 index 0000000..5599f79 --- /dev/null +++ b/src/MULTIPR/Makefile.in @@ -0,0 +1,56 @@ +# Copyright (C) 2005 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# Source path + +top_srcdir=@top_srcdir@ +top_builddir=../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@:@top_srcdir@/idl + +MACHINE=PCLINUX + +@COMMENCE@ + +# Libraries targets + +LIB = libMULTIPREngine.la +LIB_SRC = MULTIPR_i.cxx MULTIPR_API.cxx MULTIPR_Mesh.cxx MULTIPR_Profil.cxx MULTIPR_GaussLoc.cxx MULTIPR_Field.cxx MULTIPR_Nodes.cxx MULTIPR_Elements.cxx MULTIPR_Family.cxx MULTIPR_MeshDis.cxx MULTIPR_DecimationFilter.cxx MULTIPR_DecimationAccel.cxx MULTIPR_Utils.cxx MULTIPR_Obj.cxx +LIB_SERVER_IDL = MULTIPR.idl +LIB_CLIENT_IDL = SALOME_Component.idl SALOME_Exception.idl SALOMEDS.idl SALOME_GenericObj.idl Logger.idl + +EXPORT_HEADERS = MULTIPR_API.hxx MULTIPR_DecimationAccel.hxx MULTIPR_DecimationFilter.hxx MULTIPR_Elements.hxx MULTIPR_Exceptions.hxx MULTIPR_Family.hxx MULTIPR_Field.hxx MULTIPR_GaussLoc.hxx MULTIPR_Globals.hxx MULTIPR_MeshDis.hxx MULTIPR_Mesh.hxx MULTIPR_Nodes.hxx MULTIPR_PointOfField.hxx MULTIPR_Profil.hxx MULTIPR_Utils.hxx MULTIPR_Obj.hxx MULTIPR_ProgressCallback.hxx + +BIN = multipr +BIN_SRC = + +# additionnal information to compile and link file + +CPPFLAGS += $(KERNEL_CXXFLAGS) -Wno-deprecated -Wparentheses -Wreturn-type -pthread $(MED2_INCLUDES) $(HDF5_INCLUDES) -I$(MED_ROOT_DIR)/include/salome + +CPPFLAGSFORBIN=$(CPPFLAGS) + +LDFLAGS += $(KERNEL_LDFLAGS) -lSalomeContainer -lOpUtil -lm -lmed -lmedsplitter -lmedmem -lhdf5 -lmed_V2_1 -lSALOMELocalTrace $(MED2_LIBS) $(HDF5_LIBS) -L$(MED_ROOT_DIR)/lib/salome + +LDFLAGSFORBIN=$(LDFLAGS) + +# Executables targets + +@CONCLUDE@ + diff --git a/src/MULTIPR/multipr.cxx b/src/MULTIPR/multipr.cxx new file mode 100644 index 0000000..ccdedb7 --- /dev/null +++ b/src/MULTIPR/multipr.cxx @@ -0,0 +1,703 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file multipr.cxx + * + * \brief Standalone command line application of the MULTIPR component. + * The application aims to reduce large data set to allow interactive visualization. + * Its two main function are the following: + * 1. Splits any TETRA10 mesh contained in a MED file. + * a. Builds a distributed MED file by extracting all the groups from a sequential MED file. + * b. Splits a part of distributed MED file. + * 2. Decimates fields to produce multi-resolution data set. + * + * Return 0 if application succeed, 1 otherwise (failure). + * + * See http://www.salome-platform.org to learn more about Salome or MED. + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +#include "MULTIPR_API.hxx" +#include "MULTIPR_Obj.hxx" +#include "MULTIPR_Mesh.hxx" +#include "MULTIPR_Exceptions.hxx" +#include "MULTIPR_Utils.hxx" + +#include +#include +#include + +using namespace std; + + +// This command line application can use 2 differents API to do the same work. +// If MULTIPR_USE_OBJ_API is defined then this command line application used the MULTIPR_Obj API; +// otherwise, it uses the MULTIPR_API +//#define MULTIPR_USE_OBJ_API + + +const int MULTIPR_APP_OK = 0; +const int MULTIPR_APP_FAILED = 1; + + +/** + * Enumerates all the usages of this application. + */ +enum Usage +{ + MULTIPR_USAGE_UNKNOWN, + MULTIPR_USAGE_DISPLAY_HELP, + MULTIPR_USAGE_AUTOTEST, + MULTIPR_USAGE_PARTITION1, + MULTIPR_USAGE_PARTITION2, + MULTIPR_USAGE_DECIMATION, + MULTIPR_USAGE_INFO +}; + + +/** + * Enumerates all the possible errors. + */ +enum Error +{ + MULTIPR_APP_NO_ERROR, + MULTIPR_APP_UNKNOWN_USAGE, + MULTIPR_APP_WRONG_NUMBER_OF_ARGUMENTS, + MULTIPR_APP_ILLEGAL_ARGUMENT, + MULTIPR_APP_FILE_NOT_FOUND, + MULTIPR_APP_IO_ERROR, + MULTIPR_APP_UNDEFINED_ERROR +}; + + +// global variables used to configure the application +int g_usage = 0; +int g_errorCode = MULTIPR_APP_NO_ERROR; +char* g_medFilename = NULL; +char* g_meshName = NULL; +char* g_partName = NULL; +int g_nbParts = 0; +char* g_filterName = NULL; +char* g_fieldName = NULL; +int g_fieldTimeStepIt = 0; +float g_decimThresholdMed = 0.0f; +float g_decimThresholdLow = 0.0f; +float g_decimRadius = 0.0f; +int g_boxing = 100; + + +/** + * \fn const char* getUsage(int usage) + * \brief returns a string describing the usage of this application. + */ +const char* getUsage(int usage) +{ + switch(usage) + { + case MULTIPR_USAGE_DISPLAY_HELP: + return "--help: display help"; + + case MULTIPR_USAGE_AUTOTEST: + return "--auto: unit tests"; + + case MULTIPR_USAGE_PARTITION1: + return "--part1: extract all groups of a sequential MED file"; + + case MULTIPR_USAGE_PARTITION2: + return "--part2: split a part of a distributed MED file"; + + case MULTIPR_USAGE_DECIMATION: + return "--decim: generated level of details of a part of a distributed MED file"; + + case MULTIPR_USAGE_INFO: + return "--info: prints all infos about a mesh in a sequential MED file"; + + default: + return "unknown"; + } +} + + +/** + * \fn void printDescription() + * \brief prints a short description of this application. + */ +void printDescription() +{ + cout << "Keywords:" << endl; + cout << " Post-processing numerical simulation, Salome platform, " << endl; + cout << " Large data set visualization, 3D meshes and fields" << endl; + cout << "Description:" << endl; + cout << " multipr is a partitionning/decimation tool of MED files." << endl; + cout << " See http://www.salome-platform.org for information about MED or Salome." << endl; + cout << " Note: current version only accept TETRA10 meshes." << endl; +} + + +/** + * \fn void printUsage() + * \brief prints "how to use" manual of this tools.2NbPart + */ +void printUsage() +{ + cout << "Usages:" << endl; + cout << " --auto Autotest: performs some unit tests on the MULTIPR API" << endl; + cout << " * Usage: --auto path (path where to find test file \"agregat100grains_12pas.med\")" << endl; + cout << " --part1 Extracts all groups from a sequential MED file (V2.2 or higher)" << endl; + cout << " * Usage: --part1 file.med meshName" << endl; + cout << " --part2 Split a group of a distributed MED file (V2.3) produced with --part1" << endl; + cout << " * Usage: --part2 file.med partName nbParts" << endl; + cout << " --decim Generates 3 level of details (full, medium and low) of a part" << endl; + cout << " of a distributed MED file (V2.3)" << endl; + cout << " * Usage: --decim file.med partName fieldName fieldIt filterName [...]" << endl; + cout << " * Only one filter is currently available: Filtre_GradientMoyen" << endl; + cout << " * Usage: --decim file.med partName fieldName fieldIt Filtre_GradientMoyen m l radius" << endl; + cout << " where m=threshold for medium res. and l=threshold for low res.; assume m < l" << endl; + cout << " --info Dumps all infos related to a mesh in a sequential MED file" << endl; + cout << " * Usage: --info file.med [meshName]" << endl; + cout << " --help Displays this help page" << endl; + cout << endl; +} + + +/** + * \fn void printGlobals() + * \brief print current state of all global variables. + */ +void printGlobals() +{ + cout << endl; + cout << "********************************************************************************" << endl; + cout << "CONFIGURATION" << endl; + cout << "--------------------------------------------------------------------------------" << endl; + cout << "Mode : " << getUsage(g_usage) << endl; + cout << "Med filename : " << ((g_medFilename != NULL) ? g_medFilename : "UNDEFINED") << endl; + cout << "Mesh name : " << ((g_meshName != NULL) ? g_meshName : "UNDEFINED") << endl; + cout << "Part name : " << ((g_partName != NULL) ? g_partName : "UNDEFINED") << endl; + cout << "Nb parts : " << g_nbParts << endl; + cout << "Decimation:" << endl; + cout << " Field name : " << ((g_fieldName != NULL) ? g_fieldName : "UNDEFINED") << endl; + cout << " Time step iteration : " << g_fieldTimeStepIt << endl; + cout << " Filter name : " << ((g_filterName != NULL) ? g_filterName : "UNDEFINED") << endl; + cout << " Threshold for med. res. : " << g_decimThresholdMed << endl; + cout << " Threshold for low res. : " << g_decimThresholdLow << endl; + cout << " Radius : " << g_decimRadius << endl; + cout << " Boxing : " << g_boxing << endl; + cout << "********************************************************************************" << endl; + cout << endl; +} + + +/** + * \fn const char* getErrorMsg() + * \brief returns the error message corresponding to current error code. + * \return the current error message. + */ +const char* getErrorMsg() +{ + switch (g_errorCode) + { + case MULTIPR_APP_NO_ERROR: + return "no error"; + + case MULTIPR_APP_UNKNOWN_USAGE: + return "unknown usage"; + + case MULTIPR_APP_WRONG_NUMBER_OF_ARGUMENTS: + return "wrong number of arguments"; + + case MULTIPR_APP_ILLEGAL_ARGUMENT: + return "illegal argument"; + + case MULTIPR_APP_FILE_NOT_FOUND: + return "file not found"; + + case MULTIPR_APP_IO_ERROR: + return "i/o error"; + + default: + return "error (undefined)"; + } +} + + +/** + * \fn void parseCommandLine(int argc, char** argv) + * \brief parses the command line and configure this application. + * \param argc number of arguments. + * \param argv array of arguments. + */ +void parseCommandLine(int argc, char** argv) +{ + if (argc == 1) + { + g_usage = MULTIPR_USAGE_UNKNOWN; + return; + } + + if (strcmp(argv[1],"--help") == 0) + { + g_usage = MULTIPR_USAGE_DISPLAY_HELP; + } + else if (strcmp(argv[1],"--auto") == 0) + { + if (argc != 3) + { + g_usage = MULTIPR_USAGE_UNKNOWN; + g_errorCode = MULTIPR_APP_WRONG_NUMBER_OF_ARGUMENTS; + } + else + { + g_usage = MULTIPR_USAGE_AUTOTEST; + g_medFilename = argv[2]; + } + } + else if (strcmp(argv[1],"--part1") == 0) + { + if (argc != 4) + { + g_usage = MULTIPR_USAGE_UNKNOWN; + g_errorCode = MULTIPR_APP_WRONG_NUMBER_OF_ARGUMENTS; + } + else + { + g_usage = MULTIPR_USAGE_PARTITION1; + g_medFilename = argv[2]; + g_meshName = argv[3]; + } + } + else if (strcmp(argv[1],"--part2") == 0) + { + if (argc != 5) + { + g_usage = MULTIPR_USAGE_UNKNOWN; + g_errorCode = MULTIPR_APP_WRONG_NUMBER_OF_ARGUMENTS; + } + else + { + g_usage = MULTIPR_USAGE_PARTITION2; + g_medFilename = argv[2]; + g_partName = argv[3]; + g_nbParts = atoi(argv[4]); + } + } + else if (strcmp(argv[1],"--decim") == 0) + { + if ((argc != 10) && (argc != 11)) + { + g_usage = MULTIPR_USAGE_UNKNOWN; + g_errorCode = MULTIPR_APP_WRONG_NUMBER_OF_ARGUMENTS; + } + else + { + g_usage = MULTIPR_USAGE_DECIMATION; + g_medFilename = argv[2]; + g_partName = argv[3]; + g_fieldName = argv[4]; + g_fieldTimeStepIt = atoi(argv[5]); + g_filterName = argv[6]; + g_decimThresholdMed = atof(argv[7]); + g_decimThresholdLow = atof(argv[8]); + g_decimRadius = atof(argv[9]); + + if (argc == 11) + { + g_boxing = atoi(argv[10]); + } + } + } + else if (strcmp(argv[1],"--info") == 0) + { + if ((argc != 3) && (argc != 4)) + { + g_usage = MULTIPR_USAGE_UNKNOWN; + g_errorCode = MULTIPR_APP_WRONG_NUMBER_OF_ARGUMENTS; + } + else + { + g_usage = MULTIPR_USAGE_INFO; + g_medFilename = argv[2]; + + if (argc == 4) + { + g_meshName = argv[3]; + } + } + } + else + { + g_usage = MULTIPR_USAGE_UNKNOWN; + g_errorCode = MULTIPR_APP_UNKNOWN_USAGE; + } +} + + +/** + * \fn int runAutotest() + * \brief performs some unit tests on the MULTIPR API. + * \return MULTIPR_APP_OK if successful, MULTIPR_APP_FAILED if failure. + */ +int runAutotest() +{ + cout << "Start autotest..." << endl; + + int ret = MULTIPR_APP_OK; + try + { + string strMEDfilename = g_medFilename; + strMEDfilename += "/agregat100grains_12pas.med"; + + cout << "Test file: " << strMEDfilename << endl << endl; + + //--------------------------------------------------------------------- + // Test partionneDomaine() = extract groups from a sequential MED file + //--------------------------------------------------------------------- + multipr::partitionneDomaine(strMEDfilename.c_str(), "MAIL"); + + //--------------------------------------------------------------------- + // Test partitionneGrain() = split a group from a distributed MED file + // using MEDSPLITTER (METIS) + //--------------------------------------------------------------------- + string strDistributedMEDfilename = g_medFilename; + strDistributedMEDfilename += "/agregat100grains_12pas_grains_maitre.med"; + + multipr::partitionneGrain( + strDistributedMEDfilename.c_str(), + "MAIL_1", + 4, + multipr::MULTIPR_SCOTCH); + + multipr::partitionneGrain( + strDistributedMEDfilename.c_str(), + "MAIL_97", + 3, + multipr::MULTIPR_METIS); + + //--------------------------------------------------------------------- + // Test decimePartition() = generate 2 lower resolution of a mesh + // using decimation based on gradient + //--------------------------------------------------------------------- + multipr::decimePartition( + strDistributedMEDfilename.c_str(), + "MAIL_98", + "SIG_____SIEF_ELGA_______________", + 12, + "Filtre_GradientMoyen", + 10.0, + 25.0, + 0.3, + 100); + + multipr::decimePartition( + strDistributedMEDfilename.c_str(), + "MAIL_92", + "SIG_____SIEF_ELGA_______________", + 11, + "Filtre_GradientMoyen", + 10.0, + 25.0, + 0.5, + 10); + + multipr::decimePartition( + strDistributedMEDfilename.c_str(), + "MAIL_97_2", + "SIG_____SIEF_ELGA_______________", + 10, + "Filtre_GradientMoyen", + 10.0, + 25.0, + 0.4, + 20); + + //--------------------------------------------------------------------- + // Test passed: OK! + //--------------------------------------------------------------------- + cout << endl; + cout << "Test passed: everything seems to be OK" << endl; + cout << "OK" << endl << endl; + + } + catch (multipr::RuntimeException& e) + { + e.dump(cout); + cout << endl; + cout << "Test failed" << endl; + cout << "Failure" << endl << endl; + ret = MULTIPR_APP_FAILED; + } + + return ret; +} + + +/** + * \fn void runPartition1() + * \brief builds a distributed MED file (v2.3) by extracting groups from a sequential MED file. + * \return MULTIPR_APP_OK if successful, MULTIPR_APP_FAILED if failure. + */ +int runPartition1() +{ + int ret = MULTIPR_APP_OK; + try + { + multipr::partitionneDomaine(g_medFilename, g_meshName); + } + catch (multipr::RuntimeException& e) + { + e.dump(cout); + ret = MULTIPR_APP_FAILED; + } + + return ret; +} + + +/** + * \fn void runPartition2() + * \brief builds a distributed MED file (v2.3) by splitting a part of a distributed MED file generated by runPartition1(). + * \return MULTIPR_APP_OK if successful, MULTIPR_APP_FAILED if failure. + */ +int runPartition2() +{ + int ret = MULTIPR_APP_OK; + try + { + multipr::partitionneGrain( + g_medFilename, + g_partName, + g_nbParts, + multipr::MULTIPR_METIS); + } + catch (multipr::RuntimeException& e) + { + e.dump(cout); + ret = MULTIPR_APP_FAILED; + } + + return ret; +} + + +/** + * \fn int runDecimation() + * \brief creates 3 resolutions of a part of a distributed MED file. + * \return MULTIPR_APP_OK if successful, MULTIPR_APP_FAILED if failure. + */ +int runDecimation() +{ + int ret = MULTIPR_APP_OK; + try + { + multipr::decimePartition( + g_medFilename, + g_partName, + g_fieldName, + g_fieldTimeStepIt, + g_filterName, + g_decimThresholdMed, + g_decimThresholdLow, + g_decimRadius, + g_boxing); + } + catch (multipr::RuntimeException& e) + { + e.dump(cout); + ret = MULTIPR_APP_FAILED; + } + + return ret; +} + + +/** + * \fn int runDumpMED() + * \brief dumps info about a sequential MED file. + * \return MULTIPR_APP_OK if successful, MULTIPR_APP_FAILED if failure. + */ +int runDumpMED() +{ +#ifdef MULTIPR_USE_OBJ_API + int ret = MULTIPR_APP_OK; + try + { + // if mesh is unknown, then list all the meshes in the given MED file + if (g_meshName == NULL) + { + multipr::Obj obj; + obj.create(g_medFilename); + + { + // display list of meshes contained in the MED file + vector res = obj.getMeshes(); + cout << "List of meshes in this MED file:" << endl; + for (unsigned i = 0 ; i < res.size() ; i++) + { + cout << "Mesh " << (i + 1) << ": " << res[i] << endl; + } + } + + cout << endl; + + { + // display list of fields contained in the MED file + vector names = obj.getFields(); + cout << "List of fields in this MED file:" << endl; + for (unsigned i = 0 ; i < names.size() ; i++) + { + cout << "Field " << (i + 1) << ": " << names[i] << " #it=" << obj.getTimeStamps(names[i].c_str()) << endl; + } + } + } + else + { + // display all infos about one mesh in a MED file + multipr::Mesh mesh; + mesh.readSequentialMED(g_medFilename, g_meshName); + mesh.setPrintAll(true); + cout << mesh << endl; + } + cout << "OK" << endl; + } + catch (multipr::RuntimeException& e) + { + e.dump(cout); + ret = MULTIPR_APP_FAILED; + } + + return ret; +#else + int ret = MULTIPR_APP_OK; + try + { + // if mesh is unknown, then list all the meshes in the given MED file + if (g_meshName == NULL) + { + { + // display list of meshes contained in the MED file + vector res = multipr::getListMeshes(g_medFilename); + cout << "List of meshes in this MED file:" << endl; + for (unsigned i = 0 ; i < res.size() ; i++) + { + cout << "Mesh " << (i + 1) << ": " << res[i] << endl; + } + } + + cout << endl; + + { + // display list of fields contained in the MED file + vector > res = multipr::getListFields(g_medFilename); + cout << "List of fields in this MED file:" << endl; + for (unsigned i = 0 ; i < res.size() ; i++) + { + cout << "Field " << (i + 1) << ": " << res[i].first << " #it=" << res[i].second << endl; + } + } + } + else + { + // display all infos about one mesh in a MED file + multipr::Mesh mesh; + mesh.readSequentialMED(g_medFilename, g_meshName); + mesh.setPrintAll(true); + cout << mesh << endl; + } + cout << "OK" << endl; + } + catch (multipr::RuntimeException& e) + { + e.dump(cout); + ret = MULTIPR_APP_FAILED; + } + + return ret; +#endif +} + + +/** + * \fn int run() + * \brief applies partitioning/decimation according to global parameters. + * \return MULTIPR_APP_OK if successful, MULTIPR_APP_FAILED if failure. + */ +int run() +{ + printGlobals(); + + int ret = MULTIPR_APP_OK; + switch (g_usage) + { + case MULTIPR_USAGE_AUTOTEST: ret = runAutotest(); break; + case MULTIPR_USAGE_PARTITION1: ret = runPartition1(); break; + case MULTIPR_USAGE_PARTITION2: ret = runPartition2(); break; + case MULTIPR_USAGE_DECIMATION: ret = runDecimation(); break; + case MULTIPR_USAGE_INFO: ret = runDumpMED(); break; + default: + cout << "ERROR: unknown usage" << endl; + ret = MULTIPR_APP_FAILED; + break; + } + + return ret; +} + + +/** + * \fn int main(int argc, char** argv) + * \brief entry point of the application. + * \param argc number of arguments. + * \param argv list of arguments. + * \return 0 if OK, 1 if failed. + */ +int main(int argc, char** argv) +{ + cout << "multipr v" << multipr::getVersion() << " - by EDF/CS - 01/2007" << endl; + cout << "==================================" << endl; + + #ifdef MULTIPR_USE_OBJ_API + cout << "Version MULTIPR_Obj" << endl; + #else + cout << "Version MULTIPR_API" << endl; + #endif + + parseCommandLine(argc, argv); + + int ret = MULTIPR_APP_OK; // assume no error at the beginning + + if (g_usage == MULTIPR_USAGE_UNKNOWN) + { + if (argc != 1) + { + // if usage is unknown and there are some arguments, print an error message + cout << "ERROR: " << getErrorMsg() << endl; + cout << endl; + ret = MULTIPR_APP_FAILED; + } + else + { + // if no argument, print a description of this application + printDescription(); + } + + printUsage(); + } + else if (g_usage == MULTIPR_USAGE_DISPLAY_HELP) + { + printDescription(); + printUsage(); + } + else + { + // the application seems to be configured properly: it can be executed + ret = run(); + } + + return ret; +} + +// EOF diff --git a/src/MULTIPRGUI/MULTIPR_GUI.cxx b/src/MULTIPRGUI/MULTIPR_GUI.cxx new file mode 100644 index 0000000..650b930 --- /dev/null +++ b/src/MULTIPRGUI/MULTIPR_GUI.cxx @@ -0,0 +1,747 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_GUI.cxx + * + * \brief see MULTIPR_GUI.h + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +//***************************************************************************** +// Includes section +//***************************************************************************** + +// MULTIPR Includes +#include "MULTIPR_GUI.h" +#include "MULTIPR_GUI_Dlg.h" + +// Salome Includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +// QT Includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +using namespace std; + + +//***************************************************************************** +// Global variable +//***************************************************************************** + +namespace multipr +{ + // progress callback used by the MULTIPR library + extern MULTIPR_ProgressCallback* gProgressCallback; +} + + +//***************************************************************************** +// Class MULTIPR_GUI implementation +//***************************************************************************** + +MULTIPR_GUI::MULTIPR_GUI() : SalomeApp_Module("MULTIPR") +{ + mMEDFileName = ""; + mMULTIPRObj = NULL; +} + + +MULTIPR_ORB::MULTIPR_Obj_ptr MULTIPR_GUI::getMULTIPRObj() +{ + return mMULTIPRObj; +} + + +SalomeApp_Application* MULTIPR_GUI::getAppli() const +{ + return getApp(); +} + + +MULTIPR_ORB::MULTIPR_Gen_ptr MULTIPR_GUI::InitMULTIPRGen(SalomeApp_Application* app) +{ + Engines::Component_var comp = app->lcc()->FindOrLoad_Component("FactoryServer", "MULTIPR"); + MULTIPR_ORB::MULTIPR_Gen_ptr clr = MULTIPR_ORB::MULTIPR_Gen::_narrow(comp); + ASSERT(!CORBA::is_nil(clr)); + return clr; +} + + +void MULTIPR_GUI::initialize(CAM_Application* app) +{ + SalomeApp_Module::initialize(app); + + InitMULTIPRGen(dynamic_cast(app)); + + QWidget* aParent = app->desktop(); + SUIT_ResourceMgr* aResourceMgr = app->resourceMgr(); + + //------------------------------------------------------------------------- + // create actions + //------------------------------------------------------------------------- + QPixmap aPixmapImportFromMEDFile = aResourceMgr->loadPixmap("MULTIPR", tr("ICON_IMPORT_MED")); + + createAction( + ACTION_IMPORT_MED, + tr("TLT_IMPORT_FROM_MED_FILE"), + QIconSet(aPixmapImportFromMEDFile), + tr("MEN_IMPORT_FROM_MED_FILE"), + tr("STS_IMPORT_FROM_MED_FILE"), + (CTRL + Key_I), + aParent, + false, + this, + SLOT(OnImportFromMEDFile())); + + createAction( + ACTION_SPLIT, + tr("TLT_SPLIT"), + QIconSet(), + tr("MEN_SPLIT"), + tr("STS_SPLIT"), + 0, + aParent, + false, + this, + SLOT(OnPartition2())); + + createAction( + ACTION_DECIMATE, + tr("TLT_DECIMATE"), + QIconSet(), + tr("MEN_DECIMATE"), + tr("STS_DECIMATE"), + 0, + aParent, + false, + this, + SLOT(OnDecimate())); + + QPixmap aPixmapSaveMEDFile = aResourceMgr->loadPixmap("MULTIPR", tr("ICON_SAVE_MED")); + + createAction( + ACTION_SAVE, + tr("TLT_SAVE"), + QIconSet(aPixmapSaveMEDFile), + tr("MEN_SAVE"), + tr("STS_SAVE"), + 0, + aParent, + false, + this, + SLOT(OnSave())); + + //------------------------------------------------------------------------- + // create menus + //------------------------------------------------------------------------- + int aMenuId; + aMenuId = createMenu(tr("MEN_FILE"), -1, -1); + createMenu(separator(), aMenuId, -1, 10); + aMenuId = createMenu(tr("MEN_FILE_MULTIPR"), aMenuId, -1, 10); + createMenu(ACTION_IMPORT_MED, aMenuId); + + aMenuId = createMenu(tr("MEN_MULTIPR"), -1, -1, 30); + createMenu(ACTION_IMPORT_MED, aMenuId, 10); + createMenu(ACTION_SAVE, aMenuId, 10); + createMenu(ACTION_SPLIT, aMenuId, 10); + createMenu(ACTION_DECIMATE, aMenuId, 10); + + //------------------------------------------------------------------------- + // create toolbars + //------------------------------------------------------------------------- + int aToolId = createTool(tr("TOOL_MULTIPR")); + createTool(ACTION_IMPORT_MED, aToolId); + createTool(ACTION_SAVE, aToolId); + + //------------------------------------------------------------------------- + // create popup menus + //------------------------------------------------------------------------- + QtxPopupMgr* mgr = popupMgr(); + mgr->insert( action(ACTION_SPLIT), -1, -1, -1 ); + mgr->insert( action(ACTION_DECIMATE), -1, -1, -1 ); + mgr->insert( action(ACTION_SAVE), -1, -1, -1 ); + + QString aRule = "client='ObjectBrowser' and selcount>=1"; // $type in {'VISU::TMESH'}"; + mgr->setRule(action(ACTION_SPLIT), aRule, true); + mgr->setRule(action(ACTION_DECIMATE), aRule, true); + mgr->setRule(action(ACTION_SAVE), aRule, true); + + //------------------------------------------------------------------------- + // set progress dialog + //------------------------------------------------------------------------- + MULTIPR_GUI_ProgressCallbackDlg* progressDlg = new MULTIPR_GUI_ProgressCallbackDlg(application()->desktop()); + multipr::gProgressCallback = progressDlg; +} + + +CAM_DataModel* MULTIPR_GUI::createDataModel() +{ + return new MULTIPR_GUI_DataModel(this); +} + + +QString MULTIPR_GUI::engineIOR() const +{ + CORBA::String_var anIOR = getApp()->orb()->object_to_string(InitMULTIPRGen(getApp())); + return QString(anIOR.in()); +} + + +bool MULTIPR_GUI::activateModule(SUIT_Study* theStudy) +{ + bool bOk = SalomeApp_Module::activateModule(theStudy); + + setMenuShown(true); + setToolShown(true); + + return bOk; +} + + +bool MULTIPR_GUI::deactivateModule(SUIT_Study* theStudy) +{ + setMenuShown(false); + setToolShown(false); + + return SalomeApp_Module::deactivateModule(theStudy); +} + + +void MULTIPR_GUI::windows(QMap& theMap) const +{ + theMap.clear(); + theMap.insert(SalomeApp_Application::WT_ObjectBrowser, Qt::DockLeft); + theMap.insert(SalomeApp_Application::WT_PyConsole, Qt::DockBottom); +} + + +void MULTIPR_GUI::selected(QStringList& entries, const bool multiple) +{ + LightApp_SelectionMgr* mgr = getApp()->selectionMgr(); + + if(!mgr) return; + + SUIT_DataOwnerPtrList anOwnersList; + mgr->selected(anOwnersList); + + for (int i = 0 ; i < anOwnersList.size() ; i++) + { + const LightApp_DataOwner* owner = dynamic_cast(anOwnersList[i].get()); + + if (!entries.contains(owner->entry())) + { + entries.append(owner->entry()); + } + + if (!multiple) + break; + } +} + + +void MULTIPR_GUI::OnImportFromMEDFile() +{ + // Get file name + QStringList aFilter; + aFilter.append(tr("FLT_MED_FILES")); + aFilter.append(tr("FLT_ALL_FILES")); + + SalomeApp_CheckFileDlg* fd = new SalomeApp_CheckFileDlg( + this->application()->desktop(), + true, + tr("USE_BUILD_PROGRESS") ); + fd->setCaption(tr("MEN_IMPORT_FROM_MED_FILE")); + fd->setFilters(aFilter); + fd->exec(); + QFileInfo aFileInfo(fd->selectedFile()); + delete fd; + + // Check the file name + if (!aFileInfo.exists()) + return; + + mMEDFileName = aFileInfo.filePath(); + + QApplication::setOverrideCursor(Qt::waitCursor); + + try + { + MULTIPR_ORB::MULTIPR_Gen_ptr multiprgen = MULTIPR_GUI::InitMULTIPRGen(getApp()); + mMULTIPRObj = multiprgen->getObject(mMEDFileName.latin1()); + } + catch(...) + { + SUIT_MessageBox::error1( + getApp()->desktop(), + "Import MED file error", + "Invalid MED file (not recognized by MULTIPR)", + tr("OK") ); + } + QApplication::restoreOverrideCursor(); + + try + { + if (mMULTIPRObj->isValidSequentialMEDFile()) + { + OnPartition1(); + } + } + catch (...) + { + } +} + + +void MULTIPR_GUI::OnPartition1() +{ + MULTIPR_GUI_Partition1Dlg* dialog = new MULTIPR_GUI_Partition1Dlg(this); + dialog->exec(); + delete dialog; +} + + +void MULTIPR_GUI::OnPartition2() +{ + retrieveSelectedParts(); + + if (mSelectedParts.count() == 0) + { + SUIT_MessageBox::warn1( + getApp()->desktop(), + "Split warning", + "No parts selected", + tr("OK") ); + return; + } + + MULTIPR_GUI_Partition2Dlg* dialog = new MULTIPR_GUI_Partition2Dlg(this); + dialog->exec(); + delete dialog; + getApp()->updateObjectBrowser(); +} + + +void MULTIPR_GUI::OnDecimate() +{ + retrieveSelectedParts(); + + if (mSelectedParts.count() == 0) + { + SUIT_MessageBox::warn1( + getApp()->desktop(), + "Decimation warning", + "No parts selected", + tr("OK") ); + return; + } + + MULTIPR_GUI_DecimateDlg* dialog = new MULTIPR_GUI_DecimateDlg(this); + dialog->exec(); + delete dialog; + getApp()->updateObjectBrowser(); +} + + +void MULTIPR_GUI::OnSave() +{ + QApplication::setOverrideCursor(Qt::waitCursor); + + try + { + mMULTIPRObj->save(); + getApp()->updateObjectBrowser(); + } + catch(...) + { + SUIT_MessageBox::error1( + getApp()->desktop(), + "Save distributed MED file error", + "Error while writing distributed MED file", + tr("OK") ); + } + + QApplication::restoreOverrideCursor(); +} + + + +void MULTIPR_GUI::retrieveSelectedParts() +{ + mSelectedParts.clear(); + + QStringList userSelection; + selected(userSelection, true); + for (QStringList::const_iterator it = userSelection.begin(), last = userSelection.end(); it != last; it++) + { + const QString& str = (*it); + QStringList words = QStringList::split(":", str); + if (words.count() == 2) + { + if (words[0] == "MULTIPR_PART") + { + mSelectedParts.push_back(words[1]); + } + } + } +} + + +//***************************************************************************** +// Super class Data Object implementation +//***************************************************************************** + +MULTIPR_GUI_DataObject::MULTIPR_GUI_DataObject(SUIT_DataObject* parent, const char* name) : + LightApp_DataObject(parent), + CAM_DataObject(parent) +{ + mName = name; +} + + +MULTIPR_GUI_DataObject::~MULTIPR_GUI_DataObject() +{ + // do nothing! +} + + +QString MULTIPR_GUI_DataObject::entry() const +{ + return QString("MULTIPR_OBJECT"); +} + + +QString MULTIPR_GUI_DataObject::name() const +{ + return mName; +} + + +QPixmap MULTIPR_GUI_DataObject::icon() const +{ + //static QPixmap icon = SUIT_Session::session()->resourceMgr()->loadPixmap("MULTIPR", QObject::tr("ICON_IMPORT_MED"), false); + return QPixmap(); + +} + + +QString MULTIPR_GUI_DataObject::toolTip() const +{ + // default behaviour: return an empty string + return ""; +} + + +//***************************************************************************** +// Class Data Object Module implementation +//***************************************************************************** + +MULTIPR_GUI_DataObject_Module::MULTIPR_GUI_DataObject_Module(CAM_DataModel* dm, SUIT_DataObject* parent, const char* name) : + MULTIPR_GUI_DataObject(parent, name), + LightApp_ModuleObject(dm, parent), + CAM_DataObject(parent) +{ + // do nothing! +} + + +MULTIPR_GUI_DataObject_Module::~MULTIPR_GUI_DataObject_Module() +{ + // do nothing! +} + + +QString MULTIPR_GUI_DataObject_Module::entry() const +{ + return QString("MULTIPR_MODULE:" + mName); +} + + +QString MULTIPR_GUI_DataObject_Module::name() const +{ + return CAM_RootObject::name(); +} + + +QPixmap MULTIPR_GUI_DataObject_Module::icon() const +{ + return QPixmap(); +} + + +QString MULTIPR_GUI_DataObject_Module::toolTip() const +{ + return QString("Module MULTIPR"); +} + + +//***************************************************************************** +// Class Data Object Mesh implementation +//***************************************************************************** + +MULTIPR_GUI_DataObject_Mesh::MULTIPR_GUI_DataObject_Mesh(SUIT_DataObject* parent, const char* name) : + MULTIPR_GUI_DataObject(parent, name), + CAM_DataObject(parent) +{ + // do nothing! +} + + +MULTIPR_GUI_DataObject_Mesh::~MULTIPR_GUI_DataObject_Mesh() +{ + // do nothing! +} + + +QString MULTIPR_GUI_DataObject_Mesh::entry() const +{ + return QString("MULTIPR_MESH:") + mName; +} + + +QPixmap MULTIPR_GUI_DataObject_Mesh::icon() const +{ + return QPixmap(); +} + + +QString MULTIPR_GUI_DataObject_Mesh::toolTip() const +{ + return QString("Original mesh"); +} + + +//***************************************************************************** +// Class Data Object Part implementation +//***************************************************************************** + +MULTIPR_GUI_DataObject_Part::MULTIPR_GUI_DataObject_Part(SUIT_DataObject* parent, const char* name, const char* info) : + MULTIPR_GUI_DataObject(parent, name), + CAM_DataObject(parent) +{ + mMeshName = ""; + mId = 0; + mPath = ""; + mMEDFileName = ""; + + mTooltip = info; + + // parse info to retrieve all the fields + char lMeshName[256]; + int lId; + char lPartName[256]; + char lPath[256]; + char lMEDFileName[256]; + + int ret = sscanf(info, "%s %d %s %s %s", + lMeshName, + &lId, + lPartName, + lPath, + lMEDFileName); + + // number of read parameters should be 5 + if (ret != 5) return; + + mMeshName = lMeshName; + mId = lId; + mPath = lPath; + mMEDFileName = lMEDFileName; +} + + +MULTIPR_GUI_DataObject_Part::~MULTIPR_GUI_DataObject_Part() +{ + // do nothing! +} + + +QString MULTIPR_GUI_DataObject_Part::entry() const +{ + return QString("MULTIPR_PART:") + mName; +} + + +QPixmap MULTIPR_GUI_DataObject_Part::icon() const +{ + return QPixmap(); +} + + +QString MULTIPR_GUI_DataObject_Part::toolTip() const +{ + return mTooltip; +} + + +//***************************************************************************** +// Class Data Object Resolution implementation +//***************************************************************************** + +MULTIPR_GUI_DataObject_Resolution::MULTIPR_GUI_DataObject_Resolution(SUIT_DataObject* parent, const char* name, const char* info) : + MULTIPR_GUI_DataObject_Part(parent, name, info), + CAM_DataObject(parent) +{ + // do nothing! +} + + +MULTIPR_GUI_DataObject_Resolution::~MULTIPR_GUI_DataObject_Resolution() +{ + // do nothing! +} + + +QString MULTIPR_GUI_DataObject_Resolution::entry() const +{ + return QString("MULTIPR_RESOLUTION:") + mName; +} + + +QPixmap MULTIPR_GUI_DataObject_Resolution::icon() const +{ + return QPixmap(); +} + + +QString MULTIPR_GUI_DataObject_Resolution::toolTip() const +{ + return mTooltip; +} + + +//***************************************************************************** +// Data Model +//***************************************************************************** + +MULTIPR_GUI_DataModel::MULTIPR_GUI_DataModel(CAM_Module* module) : + LightApp_DataModel(module) +{ + mMULTIPR_GUI = dynamic_cast(module); +} + + +MULTIPR_GUI_DataModel::~MULTIPR_GUI_DataModel() +{ + // do nothing! +} + + +void MULTIPR_GUI_DataModel::build() +{ + MULTIPR_GUI_DataObject_Module* modelRoot = dynamic_cast(root()); + + if (!modelRoot) + { + // root is not set yet + modelRoot = new MULTIPR_GUI_DataObject_Module(this, NULL, "MULTIPR"); + setRoot(modelRoot); + } + + MULTIPR_ORB::MULTIPR_Obj_ptr obj = mMULTIPR_GUI->getMULTIPRObj(); + + if (obj != NULL) + { + MULTIPR_ORB::string_array* listParts = obj->getParts(); + + if (listParts->length() >= 1) + { + const char* strPartName0 = (*listParts)[0]; + char* strPartInfo0 = obj->getPartInfo(strPartName0); + + char lMeshName[256]; + int lId; + char lPartName[256]; + char lPath[256]; + char lMEDFileName[256]; + + // parse infos + int ret = sscanf(strPartInfo0, "%s %d %s %s %s", + lMeshName, + &lId, + lPartName, + lPath, + lMEDFileName); + + if (ret != 5) return; + + MULTIPR_GUI_DataObject_Mesh* dataObjectMesh = new MULTIPR_GUI_DataObject_Mesh(modelRoot, lMeshName); + + MULTIPR_GUI_DataObject_Part* dataObjectPart_prev = NULL; + + for (int i = 0 ; i < listParts->length() ; i++) + { + const char* strItem = (*listParts)[i]; + char* strPartInfo = obj->getPartInfo(strItem); + + // parse infos + int ret = sscanf(strPartInfo, "%s %d %s %s %s", + lMeshName, + &lId, + lPartName, + lPath, + lMEDFileName); + + if (ret != 5) return; + + //cout << "Part : " << lPartName << endl; + if ((strstr(lPartName,"_MED") != NULL) || (strstr(lPartName,"_LOW") != NULL)) + { + //cout << "Found MED/LOW" << endl; + new MULTIPR_GUI_DataObject_Resolution(dataObjectPart_prev, strItem, strPartInfo); + } + else + { + dataObjectPart_prev = new MULTIPR_GUI_DataObject_Part(dataObjectMesh, strItem, strPartInfo); + } + } + } + } +} + + +extern "C" +{ + CAM_Module* createModule() + { + return new MULTIPR_GUI(); + } +} + + +// EOF diff --git a/src/MULTIPRGUI/MULTIPR_GUI.h b/src/MULTIPRGUI/MULTIPR_GUI.h new file mode 100644 index 0000000..aa929e2 --- /dev/null +++ b/src/MULTIPRGUI/MULTIPR_GUI.h @@ -0,0 +1,235 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_GUI.h + * + * \brief MULTIPR GUI (QT) + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +#ifndef __MULTIPR_GUI__ +#define __MULTIPR_GUI__ + + +//***************************************************************************** +// Includes section +//***************************************************************************** + +#include +#include +#include +#include + +#include +#include CORBA_CLIENT_HEADER(MULTIPR) + +#include +#include +#include +#include + +#include "MULTIPR_ProgressCallback.hxx" + + +//***************************************************************************** +// Pre-declaration +//***************************************************************************** + +class SalomeApp_Application; +class CAM_Module; + +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QSpacerItem; +class QButtonGroup; +class QLabel; +class QComboBox; +class QLineEdit; +class QSpinBox; +class QPushButton; + + +//***************************************************************************** +// Class MULTIPR_GUI +// Salome Application +//***************************************************************************** + +class MULTIPR_GUI: public SalomeApp_Module +{ + Q_OBJECT + +public: + MULTIPR_GUI(); + + void initialize(CAM_Application*); + QString engineIOR() const; + void windows(QMap&) const; + + MULTIPR_ORB::MULTIPR_Obj_ptr getMULTIPRObj(); + SalomeApp_Application* getAppli() const; + void selected(QStringList&, const bool); + + static MULTIPR_ORB::MULTIPR_Gen_ptr InitMULTIPRGen(SalomeApp_Application*); + + const QStringList& getSelectedParts() const { return mSelectedParts; } + +public slots: + bool deactivateModule(SUIT_Study*); + bool activateModule(SUIT_Study*); + +protected slots: + void OnImportFromMEDFile(); + void OnPartition1(); + void OnPartition2(); + void OnDecimate(); + void OnSave(); + + void retrieveSelectedParts(); + +protected: + virtual CAM_DataModel* createDataModel(); + +protected: + + enum + { + ACTION_IMPORT_MED = 190, + ACTION_SAVE, + ACTION_SPLIT, + ACTION_DECIMATE + }; + +private: + QString mMEDFileName; + QStringList mSelectedParts; + MULTIPR_ORB::MULTIPR_Obj_ptr mMULTIPRObj; + +}; // class MULTIPR_GUI + + +//***************************************************************************** +// Class MULTIPR_GUI_DataObject +//***************************************************************************** + +class MULTIPR_GUI_DataObject : public LightApp_DataObject +{ +public: + MULTIPR_GUI_DataObject(SUIT_DataObject* parent, const char* name); + virtual ~MULTIPR_GUI_DataObject(); + + virtual QString entry() const; + virtual QString name() const; + virtual QPixmap icon() const; + virtual QString toolTip() const; + +protected: + QString mName; +}; + + +//***************************************************************************** +// Class MULTIPR_GUI_DataObject_Module +//***************************************************************************** + +class MULTIPR_GUI_DataObject_Module : public MULTIPR_GUI_DataObject, public LightApp_ModuleObject +{ +public: + MULTIPR_GUI_DataObject_Module(CAM_DataModel* dm, SUIT_DataObject* parent, const char* name); + virtual ~MULTIPR_GUI_DataObject_Module(); + + virtual QString entry() const; + virtual QString name() const; + virtual QPixmap icon() const; + virtual QString toolTip() const; + +private: +}; + + +//***************************************************************************** +// Class MULTIPR_GUI_DataObject_Mesh +//***************************************************************************** + +class MULTIPR_GUI_DataObject_Mesh : public MULTIPR_GUI_DataObject +{ +public: + MULTIPR_GUI_DataObject_Mesh(SUIT_DataObject* parent, const char* name); + virtual ~MULTIPR_GUI_DataObject_Mesh(); + + virtual QString entry() const; + virtual QPixmap icon() const; + virtual QString toolTip() const; + +private: +}; + + +//***************************************************************************** +// Class MULTIPR_GUI_DataObject_Part +//***************************************************************************** + +class MULTIPR_GUI_DataObject_Part : public MULTIPR_GUI_DataObject +{ +public: + MULTIPR_GUI_DataObject_Part(SUIT_DataObject* parent, const char* name, const char* info); + virtual ~MULTIPR_GUI_DataObject_Part(); + + virtual QString entry() const; + virtual QPixmap icon() const; + virtual QString toolTip() const; + +protected: + QString mMeshName; + int mId; + QString mPath; + QString mMEDFileName; + QString mTooltip; +}; + + +//***************************************************************************** +// Class MULTIPR_GUI_DataObject_Resolution +//***************************************************************************** + +class MULTIPR_GUI_DataObject_Resolution : public MULTIPR_GUI_DataObject_Part +{ +public: + MULTIPR_GUI_DataObject_Resolution(SUIT_DataObject* parent, const char* name, const char* info); + virtual ~MULTIPR_GUI_DataObject_Resolution(); + + virtual QString entry() const; + virtual QPixmap icon() const; + virtual QString toolTip() const; + +private: +}; + + +//***************************************************************************** +// Class MULTIPR_GUI_DataModel +//***************************************************************************** + +class MULTIPR_GUI_DataModel : public LightApp_DataModel +{ +public: + MULTIPR_GUI_DataModel(CAM_Module*); + virtual ~MULTIPR_GUI_DataModel(); + +protected: + virtual void build(); + +private: + MULTIPR_GUI* mMULTIPR_GUI; +}; + + +#endif // __MULTIPR_GUI__ + + +// EOF + diff --git a/src/MULTIPRGUI/MULTIPR_GUI_Dlg.cxx b/src/MULTIPRGUI/MULTIPR_GUI_Dlg.cxx new file mode 100644 index 0000000..be2a2fd --- /dev/null +++ b/src/MULTIPRGUI/MULTIPR_GUI_Dlg.cxx @@ -0,0 +1,651 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_GUI_Dlg.cxx + * + * \brief see MULTIPR_GUI_Dlg.h + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +//***************************************************************************** +// Includes section +//***************************************************************************** + +#include "MULTIPR_GUI_Dlg.h" +#include "MULTIPR_GUI.h" +#include "MULTIPR_Mesh.hxx" +#include "MULTIPR_DecimationFilter.hxx" + +// Salome Includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include + +// QT Includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +using namespace std; + + +MULTIPR_GUI_Partition1Dlg::MULTIPR_GUI_Partition1Dlg(MULTIPR_GUI* theModule) : + QDialog( theModule->application()->desktop(), 0, false, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + mModule = theModule; + + buttonGroupProcess = new QButtonGroup( this, "buttonGroupProcess" ); + buttonGroupProcess->setGeometry( QRect( 10, 110, 450, 60 ) ); + + pushButtonCancel = new QPushButton( buttonGroupProcess, "pushButtonCancel" ); + pushButtonCancel->setGeometry( QRect( 321, 10, 110, 41 ) ); + + pushButtonOK = new QPushButton( buttonGroupProcess, "pushButtonOK" ); + pushButtonOK->setGeometry( QRect( 10, 10, 110, 41 ) ); + + buttonGroupSelectMesh = new QButtonGroup( this, "buttonGroupSelectMesh" ); + buttonGroupSelectMesh->setGeometry( QRect( 10, 10, 450, 91 ) ); + + comboBoxSelectMesh = new QComboBox( FALSE, buttonGroupSelectMesh, "comboBoxSelectMesh" ); + comboBoxSelectMesh->setGeometry( QRect( 160, 30, 280, 40 ) ); + MULTIPR_ORB::string_array* listMeshes = theModule->getMULTIPRObj()->getMeshes(); + for (int i=0; ilength() ; i++) + { + const char* strItem = (*listMeshes)[i]; + comboBoxSelectMesh->insertItem(strItem); + } + comboBoxSelectMesh->setEditable(false); + + textLabelSelectMesh = new QLabel( buttonGroupSelectMesh, "textLabelSelectMesh" ); + textLabelSelectMesh->setGeometry( QRect( 20, 30, 110, 40 ) ); + + setCaption( tr( "Extract groups from sequential MED file" ) ); + buttonGroupProcess->setTitle( QString::null ); + pushButtonCancel->setText( tr( "Cancel" ) ); + pushButtonOK->setText( tr("OK") ); + buttonGroupSelectMesh->setTitle( tr( "Select mesh" ) ); + textLabelSelectMesh->setText( tr( "Mesh name" ) ); + + resize( QSize(471, 185).expandedTo(minimumSizeHint()) ); + clearWState( WState_Polished ); + + connect(pushButtonOK, SIGNAL(clicked()), this, SLOT(accept())); + connect(pushButtonCancel, SIGNAL(clicked()), this, SLOT(reject())); +} + + +/* + * Destroys the object and frees any allocated resources + */ +MULTIPR_GUI_Partition1Dlg::~MULTIPR_GUI_Partition1Dlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +void MULTIPR_GUI_Partition1Dlg::accept() +{ + const char* meshName = comboBoxSelectMesh->currentText().latin1(); + + try + { + mModule->getMULTIPRObj()->setMesh(meshName); + + QApplication::setOverrideCursor(Qt::waitCursor); + mModule->getMULTIPRObj()->partitionneDomaine(); + QApplication::restoreOverrideCursor(); + + } + catch(...) + { + SUIT_MessageBox::error1( + mModule->getAppli()->desktop(), + "Import MED file error", + "Unable to set mesh", + tr("OK") ); + } + + QDialog::accept(); + mModule->getAppli()->updateObjectBrowser(); +} + + +void MULTIPR_GUI_Partition1Dlg::reject() +{ + QDialog::reject(); +} + + +MULTIPR_GUI_Partition2Dlg::MULTIPR_GUI_Partition2Dlg(MULTIPR_GUI* theModule) : + QDialog( theModule->application()->desktop(), 0, false, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + mModule = theModule; + + buttonGroupSplitParameters = new QButtonGroup( this, "buttonGroupSplitParameters" ); + buttonGroupSplitParameters->setGeometry( QRect( 10, 10, 380, 140 ) ); + + textLabelSelectNbParts = new QLabel( buttonGroupSplitParameters, "textLabelSelectNbParts" ); + textLabelSelectNbParts->setGeometry( QRect( 30, 30, 160, 31 ) ); + + textLabelSelectSplitter = new QLabel( buttonGroupSplitParameters, "textLabelSelectSplitter" ); + textLabelSelectSplitter->setGeometry( QRect( 30, 80, 111, 31 ) ); + + comboBoxSelectSplitter = new QComboBox( FALSE, buttonGroupSplitParameters, "comboBoxSelectSplitter" ); + comboBoxSelectSplitter->setGeometry( QRect( 210, 80, 150, 40 ) ); + comboBoxSelectSplitter->insertItem("METIS"); + comboBoxSelectSplitter->insertItem("SCOTCH"); + comboBoxSelectSplitter->setEditable(false); + + spinBoxNbParts = new QSpinBox( buttonGroupSplitParameters, "spinBoxNbParts" ); + spinBoxNbParts->setGeometry( QRect( 210, 30, 150, 30 ) ); + spinBoxNbParts->setMaxValue( 1000 ); + spinBoxNbParts->setMinValue( 2 ); + spinBoxNbParts->setValue( 2 ); + + buttonGroupProcess = new QButtonGroup( this, "buttonGroupProcess" ); + buttonGroupProcess->setGeometry( QRect( 10, 160, 380, 60 ) ); + + pushButtonOK = new QPushButton( buttonGroupProcess, "pushButtonOK" ); + pushButtonOK->setGeometry( QRect( 10, 10, 110, 41 ) ); + + pushButtonCancel = new QPushButton( buttonGroupProcess, "pushButtonCancel" ); + pushButtonCancel->setGeometry( QRect( 250, 10, 110, 41 ) ); + + setCaption( tr( "Split selected part" ) ); + buttonGroupSplitParameters->setTitle( tr( "Split parameters" ) ); + textLabelSelectNbParts->setText( tr( "Number of sub-parts" ) ); + textLabelSelectSplitter->setText( tr( "Splitter" ) ); + buttonGroupProcess->setTitle( QString::null ); + pushButtonOK->setText( tr("OK") ); + pushButtonCancel->setText( tr( "Cancel" ) ); + + resize( QSize(403, 234).expandedTo(minimumSizeHint()) ); + clearWState( WState_Polished ); + + connect(pushButtonOK, SIGNAL(clicked()), this, SLOT(accept())); + connect(pushButtonCancel, SIGNAL(clicked()), this, SLOT(reject())); +} + +/* + * Destroys the object and frees any allocated resources + */ +MULTIPR_GUI_Partition2Dlg::~MULTIPR_GUI_Partition2Dlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +void MULTIPR_GUI_Partition2Dlg::accept() +{ + const char* strSplitter = comboBoxSelectSplitter->currentText().latin1(); + int nbParts = spinBoxNbParts->value(); + int partitionner = -1; + if (strcmp(strSplitter, "METIS") == 0) + { + partitionner = 0; + } + else if (strcmp(strSplitter, "SCOTCH") == 0) + { + partitionner = 1; + } + + QApplication::setOverrideCursor(Qt::waitCursor); + + try + { + const QStringList& partsList = mModule->getSelectedParts(); + for (QStringList::const_iterator it = partsList.begin(), last = partsList.end(); it != last; it++) + { + const QString& partName = (*it); + cout << "Split " << partName.latin1() << " #parts=" << nbParts << " splitter=" << strSplitter; + mModule->getMULTIPRObj()->partitionneGrain(partName.latin1(), nbParts, partitionner); + } + + } + catch(...) + { + SUIT_MessageBox::error1( + mModule->getAppli()->desktop(), + "Split error", + "Error while splitting selected part(s)", + tr("OK") ); + } + + QApplication::restoreOverrideCursor(); + QDialog::accept(); +} + + +void MULTIPR_GUI_Partition2Dlg::reject() +{ + QDialog::reject(); +} + + +MULTIPR_GUI_DecimateDlg::MULTIPR_GUI_DecimateDlg(MULTIPR_GUI* theModule) : + QDialog( theModule->application()->desktop(), 0, false, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + mModule = theModule; + + buttonGroupSelectField = new QButtonGroup( this, "buttonGroupSelectField" ); + buttonGroupSelectField->setGeometry( QRect( 10, 10, 450, 140 ) ); + + textLabelSelectFieldName = new QLabel( buttonGroupSelectField, "textLabelSelectFieldName" ); + textLabelSelectFieldName->setGeometry( QRect( 30, 30, 141, 31 ) ); + + textLabelSelectFieldIteration = new QLabel( buttonGroupSelectField, "textLabelSelectFieldIteration" ); + textLabelSelectFieldIteration->setGeometry( QRect( 30, 80, 111, 31 ) ); + + MULTIPR_ORB::string_array* listFields = theModule->getMULTIPRObj()->getFields(); + int maxIteration = 0; + for (int i=0 ; ilength() ; i++) + { + const char* strItem = (*listFields)[i]; + CORBA::Long nbIteration = theModule->getMULTIPRObj()->getTimeStamps(strItem); + if (nbIteration > maxIteration) + { + maxIteration = nbIteration; + } + } + + comboBoxSelectFieldIteration = new QComboBox( FALSE, buttonGroupSelectField, "comboBoxSelectFieldIteration" ); + comboBoxSelectFieldIteration->setGeometry( QRect( 150, 80, 280, 40 ) ); + for (int i=1 ; i<=maxIteration ; i++) + { + comboBoxSelectFieldIteration->insertItem(QString::number(i)); + } + + comboBoxSelectFieldName = new QComboBox( FALSE, buttonGroupSelectField, "comboBoxSelectFieldName" ); + comboBoxSelectFieldName->setGeometry( QRect( 150, 30, 280, 40 ) ); + for (int i=0 ; ilength() ; i++) + { + const char* strItem = (*listFields)[i]; + comboBoxSelectFieldName->insertItem(strItem); + } + comboBoxSelectFieldName->setEditable(false); + QToolTip::add( comboBoxSelectFieldName, tr( "only scalar fields are listed (multi-component fields are not displayed)" ) ); + + buttonGroupSelectFilter = new QButtonGroup( this, "buttonGroupSelectFilter" ); + buttonGroupSelectFilter->setGeometry( QRect( 10, 160, 450, 90 ) ); + + textLabelSelectFilter = new QLabel( buttonGroupSelectFilter, "textLabelSelectFilter" ); + textLabelSelectFilter->setGeometry( QRect( 30, 30, 101, 31 ) ); + + comboBoxSelectFilter = new QComboBox( FALSE, buttonGroupSelectFilter, "comboBoxSelectFilter" ); + comboBoxSelectFilter->setGeometry( QRect( 150, 30, 280, 40 ) ); + comboBoxSelectFilter->insertItem("Filtre_GradientMoyen"); + + buttonGroupParameters = new QButtonGroup( this, "buttonGroupParameters" ); + buttonGroupParameters->setGeometry( QRect( 10, 260, 450, 210 ) ); + + textLabelTMed = new QLabel( buttonGroupParameters, "textLabelTMed" ); + textLabelTMed->setGeometry( QRect( 20, 40, 242, 30 ) ); + + textLabelTLow = new QLabel( buttonGroupParameters, "textLabelTLow" ); + textLabelTLow->setGeometry( QRect( 20, 80, 208, 30 ) ); + + textLabelRadius = new QLabel( buttonGroupParameters, "textLabelRadius" ); + textLabelRadius->setGeometry( QRect( 20, 120, 211, 30 ) ); + + textLabelBoxing = new QLabel( buttonGroupParameters, "textLabelBoxing" ); + textLabelBoxing->setGeometry( QRect( 20, 160, 241, 30 ) ); + + lineEditTMed = new QLineEdit( buttonGroupParameters, "lineEditTMed" ); + lineEditTMed->setGeometry( QRect( 320, 40, 111, 30 ) ); + + lineEditTLow = new QLineEdit( buttonGroupParameters, "lineEditTLow" ); + lineEditTLow->setGeometry( QRect( 320, 80, 111, 30 ) ); + + lineEditRadius = new QLineEdit( buttonGroupParameters, "lineEditRadius" ); + lineEditRadius->setGeometry( QRect( 320, 120, 111, 30 ) ); + + spinBoxBoxing = new QSpinBox( buttonGroupParameters, "spinBoxBoxing" ); + spinBoxBoxing->setGeometry( QRect( 320, 160, 111, 30 ) ); + spinBoxBoxing->setMaxValue( 200 ); + spinBoxBoxing->setMinValue( 2 ); + spinBoxBoxing->setValue( 100 ); + + buttonGroupProcess = new QButtonGroup( this, "buttonGroupProcess" ); + buttonGroupProcess->setGeometry( QRect( 10, 480, 450, 60 ) ); + + pushButtonCancel = new QPushButton( buttonGroupProcess, "pushButtonCancel" ); + pushButtonCancel->setGeometry( QRect( 321, 10, 110, 41 ) ); + + pushButtonOK = new QPushButton( buttonGroupProcess, "pushButtonOK" ); + pushButtonOK->setGeometry( QRect( 10, 10, 110, 41 ) ); + + setCaption( tr( "Decimation" ) ); + buttonGroupSelectField->setTitle( tr( "Select field" ) ); + textLabelSelectFieldName->setText( tr( "Field name" ) ); + textLabelSelectFieldIteration->setText( tr( "Iteration" ) ); + buttonGroupSelectFilter->setTitle( tr( "Select filter" ) ); + textLabelSelectFilter->setText( tr( "Filter name" ) ); + buttonGroupParameters->setTitle( tr( "Set parameters" ) ); + textLabelTMed->setText( tr( "Threshold for medium resolution" ) ); + textLabelTLow->setText( tr( "Threshold for low resolution" ) ); + textLabelRadius->setText( tr( "Radius (neighborhood)" ) ); + textLabelBoxing->setText( tr( "Boxing parameter" ) ); + lineEditTMed->setText( tr( "0.1" ) ); + lineEditTLow->setText( tr( "0.2" ) ); + + float defaultRadius = 0.5f; + lineEditRadius->setText( QString::number(defaultRadius) ); + buttonGroupProcess->setTitle( QString::null ); + pushButtonCancel->setText( tr( "Cancel" ) ); + pushButtonOK->setText( tr("OK") ); + + pushButtonThresholdAuto = new QPushButton( buttonGroupParameters, "pushButtonThresholdAuto" ); + pushButtonThresholdAuto->setGeometry( QRect( 260, 80, 50, 30 ) ); + QFont pushButtonThresholdAuto_font( pushButtonThresholdAuto->font() ); + pushButtonThresholdAuto_font.setPointSize( 11 ); + pushButtonThresholdAuto->setFont( pushButtonThresholdAuto_font ); + pushButtonThresholdAuto->setText( tr( "auto" ) ); + QToolTip::add( pushButtonThresholdAuto, tr( "compute extremum for gradient (set medium=MIN and low=MAX)" ) ); + + pushButtonRadiusAuto = new QPushButton( buttonGroupParameters, "pushButtonRadiusAuto" ); + pushButtonRadiusAuto->setGeometry( QRect( 260, 120, 50, 30 ) ); + QFont pushButtonRadiusAuto_font( pushButtonRadiusAuto->font() ); + pushButtonRadiusAuto_font.setPointSize( 11 ); + pushButtonRadiusAuto->setFont( pushButtonRadiusAuto_font ); + pushButtonRadiusAuto->setText( tr( "auto" ) ); + QToolTip::add( pushButtonRadiusAuto, tr( "set radius automatically (average #neighbours equal to 8)" ) ); + + resize( QSize(470, 554).expandedTo(minimumSizeHint()) ); + clearWState( WState_Polished ); + + connect(pushButtonOK, SIGNAL(clicked()), this, SLOT(accept())); + connect(pushButtonCancel, SIGNAL(clicked()), this, SLOT(reject())); + connect(pushButtonRadiusAuto, SIGNAL(clicked()), this, SLOT(OnRadiusAuto())); + connect(pushButtonThresholdAuto, SIGNAL(clicked()), this, SLOT(OnThresholdAuto())); +} + + +/* + * Destroys the object and frees any allocated resources + */ +MULTIPR_GUI_DecimateDlg::~MULTIPR_GUI_DecimateDlg() +{ + // no need to delete child widgets, Qt does it all for us +} + + +void MULTIPR_GUI_DecimateDlg::accept() +{ + const char* strFieldName = comboBoxSelectFieldName->currentText().latin1(); + const char* strFieldIt = comboBoxSelectFieldIteration->currentText().latin1(); + int fieldIteration = atoi(strFieldIt); + + double thresholdMed; + int ret = sscanf(lineEditTMed->text().latin1(), "%lf", &thresholdMed); + if ((ret != 1) || (thresholdMed <= 0.0f)) + { + SUIT_MessageBox::error1( + mModule->getAppli()->desktop(), + "Decimation parameters error", + "Invalid medium threshold (should be > 0.0)", + tr("OK") ); + + return; + } + + double thresholdLow; + ret = sscanf(lineEditTLow->text().latin1(), "%lf", &thresholdLow); + if ((ret != 1) || (thresholdLow <= 0.0f)) + { + SUIT_MessageBox::error1( + mModule->getAppli()->desktop(), + "Decimation parameters error", + "Invalid low threshold (should be > 0.0)", + tr("OK") ); + + return; + } + + if (thresholdMed >= thresholdLow) + { + SUIT_MessageBox::error1( + mModule->getAppli()->desktop(), + "Decimation parameters error", + "Medium threshold must be < low threshold", + tr("OK") ); + + return; + } + + double radius; + ret = sscanf(lineEditRadius->text().latin1(), "%lf", &radius); + if ((ret != 1) || (radius <= 0.0f)) + { + SUIT_MessageBox::error1( + mModule->getAppli()->desktop(), + "Decimation parameters error", + "Invalid radius (should be > 0.0)", + tr("OK") ); + + return; + } + + QApplication::setOverrideCursor(Qt::waitCursor); + + try + { + const QStringList& partsList = mModule->getSelectedParts(); + for (QStringList::const_iterator it = partsList.begin(), last = partsList.end(); it != last; it++) + { + const QString& partName = (*it); + + mModule->getMULTIPRObj()->setBoxing(spinBoxBoxing->value()); + + mModule->getMULTIPRObj()->decimePartition( + partName.latin1(), + strFieldName, + fieldIteration, + comboBoxSelectFilter->currentText().latin1(), + thresholdMed, + thresholdLow, + radius); + } + } + catch(...) + { + SUIT_MessageBox::error1( + mModule->getAppli()->desktop(), + "Decimation error", + "Error while decimating selected part(s)", + tr("OK") ); + } + + QApplication::restoreOverrideCursor(); + QDialog::accept(); +} + + +void MULTIPR_GUI_DecimateDlg::reject() +{ + QDialog::reject(); +} + + +void MULTIPR_GUI_DecimateDlg::OnRadiusAuto() +{ + // evaluates default radius for the first selected part + const QStringList& partsList = mModule->getSelectedParts(); + char* strPartInfo0 = mModule->getMULTIPRObj()->getPartInfo(partsList[0].latin1()); + + char lMeshName[256]; + int lId; + char lPartName[256]; + char lPath[256]; + char lMEDFileName[256]; + + // parse infos + int ret = sscanf(strPartInfo0, "%s %d %s %s %s", + lMeshName, + &lId, + lPartName, + lPath, + lMEDFileName); + + QApplication::setOverrideCursor(Qt::waitCursor); + float defaultRadius = 0.5f; + try + { + multipr::Mesh* mesh = new multipr::Mesh(); + mesh->readSequentialMED(lMEDFileName, lMeshName); + const int averageNumberOfNeighbours = 8; + defaultRadius = mesh->evalDefaultRadius(averageNumberOfNeighbours); + delete mesh; + } + catch (...) + { + } + QApplication::restoreOverrideCursor(); + + lineEditRadius->setText( QString::number(defaultRadius) ); +} + + +void MULTIPR_GUI_DecimateDlg::OnThresholdAuto() +{ + // evaluates default radius for the first selected part + const QStringList& partsList = mModule->getSelectedParts(); + char* strPartInfo0 = mModule->getMULTIPRObj()->getPartInfo(partsList[0].latin1()); + + char lMeshName[256]; + int lId; + char lPartName[256]; + char lPath[256]; + char lMEDFileName[256]; + + // parse infos + int ret = sscanf(strPartInfo0, "%s %d %s %s %s", + lMeshName, + &lId, + lPartName, + lPath, + lMEDFileName); + + QApplication::setOverrideCursor(Qt::waitCursor); + float defaultRadius = 0.5f; + try + { + multipr::Mesh* mesh = new multipr::Mesh(); + mesh->readSequentialMED(lMEDFileName, lMeshName); + + multipr::DecimationFilter* filter = + multipr::DecimationFilter::create(comboBoxSelectFilter->currentText().latin1()); + + double gradMin = 0.1, gradAvg = 0.15, gradMax = 0.2; + + multipr::DecimationFilterGradAvg* filterGrad = dynamic_cast(filter); + if (filterGrad) + { + const char* strFieldIt = comboBoxSelectFieldIteration->currentText().latin1(); + int fieldIteration = atoi(strFieldIt); + + double radius; + ret = sscanf(lineEditRadius->text().latin1(), "%lf", &radius); + if ((ret != 1) || (radius <= 0.0f)) + { + SUIT_MessageBox::error1( + mModule->getAppli()->desktop(), + "Decimation parameters error", + "Invalid radius (should be > 0.0)", + tr("OK") ); + + return; + } + + filterGrad->getGradientInfo( + mesh, + comboBoxSelectFieldName->currentText().latin1(), + fieldIteration, + radius, + spinBoxBoxing->value(), + &gradMin, + &gradAvg, + &gradMax); + } + + delete filter; + delete mesh; + + lineEditTMed->setText( QString::number(gradMin) ); + lineEditTLow->setText( QString::number(gradMax) ); + } + catch (...) + { + } + QApplication::restoreOverrideCursor(); +} + + +//***************************************************************************** +// MULTIPR_GUI_ProgressCallbackDlg +//***************************************************************************** + +MULTIPR_GUI_ProgressCallbackDlg::MULTIPR_GUI_ProgressCallbackDlg(QWidget* parent) : + QProgressDialog(parent, 0, false, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu) +{ + setLabel(new QLabel(this, "Please wait")); + setLabelText("Please wait"); + setTotalSteps(100); +} + + +MULTIPR_GUI_ProgressCallbackDlg::~MULTIPR_GUI_ProgressCallbackDlg() +{ +} + + +void MULTIPR_GUI_ProgressCallbackDlg::start(const char* pTaskTitle, int pNumStep) +{ + setCaption(pTaskTitle); + MULTIPR_ProgressCallback::init(pNumStep); +} + + +void MULTIPR_GUI_ProgressCallbackDlg::done() +{ + setProgress(100); +} + + +void MULTIPR_GUI_ProgressCallbackDlg::progress(float pPercent) +{ + setProgress(int(pPercent)); +} + +// EOF diff --git a/src/MULTIPRGUI/MULTIPR_GUI_Dlg.h b/src/MULTIPRGUI/MULTIPR_GUI_Dlg.h new file mode 100644 index 0000000..c43df01 --- /dev/null +++ b/src/MULTIPRGUI/MULTIPR_GUI_Dlg.h @@ -0,0 +1,202 @@ +// Project MULTIPR, IOLS WP1.2.1 - EDF/CS +// Partitioning/decimation module for the SALOME v3.2 platform + +/** + * \file MULTIPR_GUI_Dlg.h + * + * \brief MULTIPR GUI Dialog (QT) + * + * \author Olivier LE ROUX - CS, Virtual Reality Dpt + * + * \date 01/2007 + */ + +#ifndef __MULTIPR_GUI_DLG__ +#define __MULTIPR_GUI_DLG__ + + +//***************************************************************************** +// Includes section +//***************************************************************************** + +#include +#include +#include +#include + +#include +#include CORBA_CLIENT_HEADER(MULTIPR) + +#include +#include +#include +#include + +#include "MULTIPR_ProgressCallback.hxx" + + +//***************************************************************************** +// Pre-declaration +//***************************************************************************** + +class SalomeApp_Application; +class CAM_Module; + +class QVBoxLayout; +class QHBoxLayout; +class QGridLayout; +class QSpacerItem; +class QButtonGroup; +class QLabel; +class QComboBox; +class QLineEdit; +class QSpinBox; +class QPushButton; + +class MULTIPR_GUI; + + + +//***************************************************************************** +// Class MULTIPR_GUI_Partition1Dlg +// Dialog box used for extracting groups from sequential MED file +//***************************************************************************** + +class MULTIPR_GUI_Partition1Dlg : public QDialog +{ + Q_OBJECT + +public: + MULTIPR_GUI_Partition1Dlg(MULTIPR_GUI* theModule); + ~MULTIPR_GUI_Partition1Dlg(); + + QButtonGroup* buttonGroupProcess; + QPushButton* pushButtonCancel; + QPushButton* pushButtonOK; + QButtonGroup* buttonGroupSelectMesh; + QComboBox* comboBoxSelectMesh; + QLabel* textLabelSelectMesh; + +protected slots: + void accept(); + void reject(); + +private: + MULTIPR_GUI* mModule; + +}; + + +//***************************************************************************** +// Class MULTIPR_GUI_Partition2Dlg +// Dialog box used for splitting a group (use MEDSPLITTER) +//***************************************************************************** + +class MULTIPR_GUI_Partition2Dlg : public QDialog +{ + Q_OBJECT + +public: + MULTIPR_GUI_Partition2Dlg(MULTIPR_GUI* theModule); + ~MULTIPR_GUI_Partition2Dlg(); + + QButtonGroup* buttonGroupSplitParameters; + QLabel* textLabelSelectNbParts; + QLabel* textLabelSelectSplitter; + QComboBox* comboBoxSelectSplitter; + QSpinBox* spinBoxNbParts; + QButtonGroup* buttonGroupProcess; + QPushButton* pushButtonOK; + QPushButton* pushButtonCancel; + +protected slots: + void accept(); + void reject(); + +private: + MULTIPR_GUI* mModule; +}; + + +//***************************************************************************** +// Class MULTIPR_GUI_DecimateDlg +// Dialog box used for decimating mesh (compute 2 lower resolution: medium and low) +//***************************************************************************** + +class MULTIPR_GUI_DecimateDlg : public QDialog +{ + Q_OBJECT + +public: + MULTIPR_GUI_DecimateDlg(MULTIPR_GUI* theModule); + ~MULTIPR_GUI_DecimateDlg(); + + QButtonGroup* buttonGroupSelectField; + QLabel* textLabelSelectFieldName; + QLabel* textLabelSelectFieldIteration; + QComboBox* comboBoxSelectFieldIteration; + QComboBox* comboBoxSelectFieldName; + QButtonGroup* buttonGroupSelectFilter; + QLabel* textLabelSelectFilter; + QComboBox* comboBoxSelectFilter; + QButtonGroup* buttonGroupParameters; + QLabel* textLabelTMed; + QLabel* textLabelTLow; + QLabel* textLabelRadius; + QLabel* textLabelBoxing; + QLineEdit* lineEditTMed; + QLineEdit* lineEditTLow; + QLineEdit* lineEditRadius; + QSpinBox* spinBoxBoxing; + QButtonGroup* buttonGroupProcess; + QPushButton* pushButtonCancel; + QPushButton* pushButtonOK; + QPushButton* pushButtonThresholdAuto; + QPushButton* pushButtonRadiusAuto; + +protected: + +protected slots: + void accept(); + void reject(); + void OnRadiusAuto(); + void OnThresholdAuto(); + +private: + MULTIPR_GUI* mModule; + +}; + + +//***************************************************************************** +// Class MULTIPR_GUI_ProgressCallbackDlg +//***************************************************************************** + +class MULTIPR_GUI_ProgressCallbackDlg : + public QProgressDialog, + public MULTIPR_ProgressCallback + +{ + Q_OBJECT + +public: + + MULTIPR_GUI_ProgressCallbackDlg(QWidget* parent); + + ~MULTIPR_GUI_ProgressCallbackDlg(); + + virtual void start(const char* pTaskTitle, int pNumStep); + + virtual void done(); + +protected: + + virtual void progress(float pPercent); +}; + + +#endif // __MULTIPR_GUI_DLG__ + + +// EOF + diff --git a/src/MULTIPRGUI/MULTIPR_icons.po b/src/MULTIPRGUI/MULTIPR_icons.po new file mode 100644 index 0000000..e7a6c52 --- /dev/null +++ b/src/MULTIPRGUI/MULTIPR_icons.po @@ -0,0 +1,37 @@ +# Copyright (C) 2005 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +# This is a Qt message file in .po format. Each msgid starts with +# a scope. This scope should *NOT* be translated - eg. "Foo::Bar" +# would be translated to "Pub", not "Foo::Pub". +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"POT-Creation-Date: 2002-05-28 10:57:43 AM CEST\n" +"PO-Revision-Date: YYYY-MM-DD\n" +"Last-Translator: FULLNAME \n" +"Content-Type: text/plain; charset=iso-8859-1\n" + +msgid "ICON_GET_BANNER" +msgstr "ExecMULTIPR.png" + +msgid "ICON_IMPORT_MED" +msgstr "MULTIPR_import_med.png" + +msgid "ICON_SAVE_MED" +msgstr "MULTIPR_save_med.png" diff --git a/src/MULTIPRGUI/MULTIPR_msg_en.po b/src/MULTIPRGUI/MULTIPR_msg_en.po new file mode 100644 index 0000000..e85b5fc --- /dev/null +++ b/src/MULTIPRGUI/MULTIPR_msg_en.po @@ -0,0 +1,92 @@ +# Copyright (C) 2005 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but MULTIPR_GUI ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +# This is a Qt message file in .po format. Each msgid starts with +# a scope. This scope should *NOT* be translated - eg. translating +# from French to English, "Foo::Bar" would be translated to "Pub", +# not "Foo::Pub". +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"POT-Creation-Date: 2003-11-19 03:10:19 PM CET\n" +"PO-Revision-Date: YYYY-MM-DD\n" +"Last-Translator: FULLNAME \n" +"Content-Type: text/plain; charset=iso-8859-1\n" + +msgid "MULTIPR_GUI::BUT_OK" +msgstr "OKO" + +msgid "MULTIPR_GUI::BUT_CANCEL" +msgstr "Cancel" + +msgid "TLT_IMPORT_FROM_MED_FILE" +msgstr "Import from MED file" + +msgid "MEN_IMPORT_FROM_MED_FILE" +msgstr "Import from MED file" + +msgid "STS_IMPORT_FROM_MED_FILE" +msgstr "Call import from sequential or distributed MED file" + +msgid "TLT_SPLIT" +msgstr "Split part" + +msgid "MEN_SPLIT" +msgstr "Split part" + +msgid "STS_SPLIT" +msgstr "Split selected parts of the current distributed mesh" + +msgid "TLT_DECIMATE" +msgstr "Decimate" + +msgid "MEN_DECIMATE" +msgstr "Decimate" + +msgid "STS_DECIMATE" +msgstr "Decimate selected parts (build two new meshes at lower resolution)" + +msgid "TLT_SAVE" +msgstr "Save distributed mesh" + +msgid "MEN_SAVE" +msgstr "Save distributed mesh" + +msgid "STS_SAVE" +msgstr "Save the current distributed MED file" + +msgid "MEN_FILE" +msgstr "&File" + +msgid "MEN_FILE_MULTIPR" +msgstr "Multipr" + +msgid "MEN_MULTIPR" +msgstr "Multipr" + +msgid "TOOL_MULTIPR" +msgstr "MULTIPR" + +msgid "FLT_ALL_FILES" +msgstr "All Files (*.*)" + +msgid "FLT_MED_FILES" +msgstr "MED Files (*.med)" + +msgid "USE_BUILD_PROGRESS" +msgstr "Use build progress" diff --git a/src/MULTIPRGUI/MULTIPR_msg_fr.po b/src/MULTIPRGUI/MULTIPR_msg_fr.po new file mode 100644 index 0000000..3722623 --- /dev/null +++ b/src/MULTIPRGUI/MULTIPR_msg_fr.po @@ -0,0 +1,80 @@ +# Copyright (C) 2005 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +# This is a Qt message file in .po format. Each msgid starts with +# a scope. This scope should *NOT* be translated - eg. translating +# from French to English, "Foo::Bar" would be translated to "Pub", +# not "Foo::Pub". +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"POT-Creation-Date: 2003-11-19 03:10:25 PM CET\n" +"PO-Revision-Date: YYYY-MM-DD\n" +"Last-Translator: FULLNAME \n" +"Content-Type: text/plain; charset=iso-8859-1\n" + +#: MULTIPR_GUI.cxx:76 +msgid "MULTIPR_GUI::BUT_OK" +msgstr "OK" + +#: MULTIPR_GUI.cxx:76 +msgid "MULTIPR_GUI::INF_MULTIPR_BANNER" +msgstr "Information MULTIPR" + +#: MULTIPR_GUI.cxx:76 +msgid "MULTIPR_GUI::INF_MULTIPR_MENU" +msgstr "Ceci est un simple test" + +#: MULTIPR_GUI.cxx:57 +msgid "MULTIPR_GUI::QUE_MULTIPR_LABEL" +msgstr "Import Prénom" + +#: MULTIPR_GUI.cxx:57 +msgid "MULTIPR_GUI::QUE_MULTIPR_NAME" +msgstr "Entrez votre prénom, s'il vous plait" + +msgid "TLT_MY_NEW_ITEM" +msgstr "My menu item" + +msgid "MEN_MY_NEW_ITEM" +msgstr "My menu item" + +msgid "STS_MY_NEW_ITEM" +msgstr "Call my menu item" + +msgid "TLT_GET_BANNER" +msgstr "Get MULTIPR banner" + +msgid "MEN_GET_BANNER" +msgstr "Get banner" + +msgid "STS_GET_BANNER" +msgstr "Get MULTIPR banner" + +msgid "MEN_FILE" +msgstr "&File" + +msgid "MEN_FILE_MULTIPR" +msgstr "Multipr" + +msgid "MEN_MULTIPR" +msgstr "MULTIPR" + +msgid "TOOL_MULTIPR" +msgstr "MULTIPR" + diff --git a/src/MULTIPRGUI/Makefile.in b/src/MULTIPRGUI/Makefile.in new file mode 100644 index 0000000..212cb33 --- /dev/null +++ b/src/MULTIPRGUI/Makefile.in @@ -0,0 +1,51 @@ +# Copyright (C) 2005 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +# source path +top_srcdir=@top_srcdir@ +top_builddir=../.. +srcdir=@srcdir@ +VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_builddir)/idl:${KERNEL_ROOT_DIR}/idl/salome + +@COMMENCE@ + +# header files +EXPORT_HEADERS= + +# .po files to transform in .qm +PO_FILES = MULTIPR_msg_en.po MULTIPR_msg_fr.po MULTIPR_icons.po + +# Libraries targets +LIB = libMULTIPR.la +LIB_SRC = MULTIPR_GUI.cxx MULTIPR_GUI_Dlg.cxx +LIB_MOC = MULTIPR_GUI.h MULTIPR_GUI_Dlg.h + + +LIB_CLIENT_IDL = SALOMEDS.idl SALOME_Exception.idl SALOME_ModuleCatalog.idl SALOMEDS_Attributes.idl SALOME_Component.idl SALOME_GenericObj.idl MULTIPR.idl Logger.idl + +LIB_SERVER_IDL = + +# additionnal information to compil and link file + +CPPFLAGS += $(QT_INCLUDES) $(OCC_INCLUDES) $(PYTHON_INCLUDES) $(BOOST_CPPFLAGS) $(KERNEL_CXXFLAGS) $(GUI_CXXFLAGS) $(MED2_INCLUDES) $(HDF5_INCLUDES) -I$(MED_ROOT_DIR)/include/salome +CXXFLAGS += $(KERNEL_CXXFLAGS) $(GUI_CXXFLAGS) +LDFLAGS += -lSalomeApp -lMULTIPREngine $(KERNEL_LDFLAGS) $(GUI_LDFLAGS) -lmed -lmedsplitter -lmedmem -lhdf5 -lmed_V2_1 -lSALOMELocalTrace $(MED2_LIBS) $(HDF5_LIBS) -L$(MED_ROOT_DIR)/lib/salome + + + +@CONCLUDE@ diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 0000000..c8862d4 --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,35 @@ +# Copyright (C) 2005 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# +#============================================================================== +# File : Makefile.in +# Author : O. LE ROUX, CS +# Project : SALOME +#============================================================================== + +# source path +top_srcdir=@top_srcdir@ +top_builddir=.. +srcdir=@srcdir@ +VPATH=.:@srcdir@ + +@COMMENCE@ + +SUBDIRS = MULTIPR MULTIPRGUI + +@MODULE@ -- 2.39.2