From 684fbc340f8746a5f9d8f3c04c8fb6bb69185cb6 Mon Sep 17 00:00:00 2001 From: vbd Date: Wed, 13 Jul 2011 08:22:38 +0000 Subject: [PATCH] merge from 631 BR --- doc/doxygen/Doxyfile_med_user.in | 79 ++- doc/doxygen/Makefile.am | 34 +- doc/doxygen/figures/OverlapDEC1.fig | 95 +++ doc/doxygen/figures/OverlapDEC1.png | Bin 0 -> 6982 bytes doc/doxygen/figures/UML_light.png | Bin 2803 -> 3990 bytes doc/doxygen/figures/UML_small.png | Bin 25901 -> 27022 bytes doc/doxygen/grid.dox | 13 +- doc/doxygen/interpkernel.dox | 303 ++++---- doc/doxygen/main.dox | 5 +- doc/doxygen/medcoupling.dox | 283 ++++++-- doc/doxygen/medfilebrowser.dox | 22 + doc/doxygen/medloader.dox | 306 +++++++- doc/doxygen/medmem.dox | 28 +- doc/doxygen/mesh.dox | 17 +- doc/doxygen/meshing.dox | 4 +- doc/doxygen/polygon.dox | 44 +- doc/doxygen/static/doxygen.css | 1026 ++++++++++++++++++--------- doc/doxygen/static/footer.html | 21 +- doc/doxygen/static/header.html.in | 28 +- 19 files changed, 1612 insertions(+), 696 deletions(-) create mode 100644 doc/doxygen/figures/OverlapDEC1.fig create mode 100644 doc/doxygen/figures/OverlapDEC1.png create mode 100644 doc/doxygen/medfilebrowser.dox diff --git a/doc/doxygen/Doxyfile_med_user.in b/doc/doxygen/Doxyfile_med_user.in index 01b76df5c..db4a10990 100644 --- a/doc/doxygen/Doxyfile_med_user.in +++ b/doc/doxygen/Doxyfile_med_user.in @@ -1,20 +1,20 @@ -# Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE # -# 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 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. +# 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 +# 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 +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # # Doxyfile 0.1 @@ -77,15 +77,19 @@ INPUT = @srcdir@ \ @srcdir@/../../src/MEDLoader \ @srcdir@/../../src/MEDMEM -FILE_PATTERNS = MEDMEM_Mesh.* \ +FILE_PATTERNS = MEDMEM_GMesh.* \ + MEDMEM_Mesh.* \ MEDMEM_Grid.* \ MEDMEM_Meshing.* \ MEDMEM_Support.* \ MEDMEM_Field.* \ - MEDMEM_Med.* \ + MEDMEM_MedFileBrowser.* \ + MEDMEM_Remapper.* \ InterpKernelDEC.* \ + OverlapDEC.* \ DEC.* \ - MPIProcessorGroup.* \ + DisjointDEC.* \ + MPIProcessorGroup.* \ StructuredCoincidentDEC.* \ ExplicitCoincidentDEC.* \ NonCoincidentDEC.* \ @@ -108,27 +112,30 @@ FILE_PATTERNS = MEDMEM_Mesh.* \ InterpKernelGeo2DNode.* \ InterpKernelGeo2DQuadraticPolygon.* \ ParaFIELD.* \ - MEDCouplingMesh.* \ + MEDCouplingMesh.* \ MEDCouplingUMesh.* \ - MEDCouplingUMeshDesc.* \ - MEDCouplingPointSet.* \ - MEDCouplingCMesh.* \ - MEDCouplingExtrudedMesh.* \ - MEDCouplingFieldDouble.* \ - MEDCouplingField.* \ - MEDCouplingFieldDiscretization.* \ - MEDCouplingTimeDiscretization.* \ - MEDCouplingTimeLabel.* \ - MEDCouplingRefCountObject.* \ - MEDCouplingMemArray.* \ - MEDCouplingRemapper.* \ - MEDLoader.* \ + MEDCouplingUMeshDesc.* \ + MEDCouplingPointSet.* \ + MEDCouplingCMesh.* \ + MEDCouplingExtrudedMesh.* \ + MEDCouplingFieldDouble.* \ + MEDCouplingField.* \ + MEDCouplingFieldTemplate.* \ + MEDCouplingFieldDiscretization.* \ + MEDCouplingTimeDiscretization.* \ + MEDCouplingTimeLabel.* \ + MEDCouplingRefCountObject.* \ + MEDCouplingMemArray.* \ + MEDCouplingRemapper.* \ + MEDLoader.* \ + MEDFileMesh.* \ *.dox RECURSIVE = NO EXCLUDE = CVS EXCLUDE_PATTERNS = *~ EXAMPLE_PATH = @srcdir@/../../src/ParaMEDMEM/ \ @srcdir@/../../doc/MEDMEM \ + @srcdir@/../../src/MEDMEMBinTest \ @srcdir@/../../src/MEDMEM EXAMPLE_PATTERNS = *.cxx *.py EXAMPLE_RECURSIVE = NO @@ -165,6 +172,12 @@ DISABLE_INDEX = NO ENUM_VALUES_PER_LINE = 4 GENERATE_TREEVIEW = YES TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +#SORT related options +#--------------------------------------------------------------------------- +SORT_GROUP_NAMES = NO + #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- @@ -201,13 +214,13 @@ GENERATE_XML = NO # Configuration options related to the preprocessor #--------------------------------------------------------------------------- ENABLE_PREPROCESSING = YES -MACRO_EXPANSION = NO -EXPAND_ONLY_PREDEF = NO +MACRO_EXPANSION = YES +EXPAND_ONLY_PREDEF = YES SEARCH_INCLUDES = YES INCLUDE_PATH = INCLUDE_FILE_PATTERNS = PREDEFINED = -EXPAND_AS_DEFINED = +EXPAND_AS_DEFINED = MEDCOUPLING_EXPORT MEDCOUPLINGREMAPPER_EXPORT SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::addtions related to external references diff --git a/doc/doxygen/Makefile.am b/doc/doxygen/Makefile.am index b49523f5f..714e33185 100644 --- a/doc/doxygen/Makefile.am +++ b/doc/doxygen/Makefile.am @@ -1,20 +1,20 @@ -# Copyright (C) 2007-2010 CEA/DEN, EDF R&D, OPEN CASCADE +# Copyright (C) 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE # -# 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 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. +# 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 +# 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 +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com # # MED MEDMEM : MED files in memory @@ -27,7 +27,9 @@ guidocdir = $(docdir)/gui/MED guidoc_DATA = images/head.png install-data-local : html-local - $(INSTALL) -d $(DESTDIR)$(docdir)/gui/MED + @if test -d doc_ref_user; then \ + $(INSTALL) -d $(DESTDIR)$(docdir)/gui/MED; \ + fi @if test -d doc_ref_user/html ; then \ for filen in `find doc_ref_user/html -maxdepth 1 -type f` ; do\ echo "Installing $${filen}" ; \ @@ -44,7 +46,6 @@ clean-local: EXTRA_DIST += figures \ main.dox \ Geometric2D.dox \ - MED_class.dox \ biblio.dox \ barycoords.dox \ dualmesh.dox \ @@ -53,6 +54,7 @@ EXTRA_DIST += figures \ grid.dox \ interpkernel.dox \ medcoupling.dox \ + medfilebrowser.dox \ medloader.dox \ medmem.dox \ medsplitter.dox \ @@ -64,4 +66,4 @@ EXTRA_DIST += figures \ tools.dox \ static/footer.html \ static/doxygen.css \ - images \ No newline at end of file + images diff --git a/doc/doxygen/figures/OverlapDEC1.fig b/doc/doxygen/figures/OverlapDEC1.fig new file mode 100644 index 000000000..31166cd1e --- /dev/null +++ b/doc/doxygen/figures/OverlapDEC1.fig @@ -0,0 +1,95 @@ +#FIG 3.2 Produced by xfig version 3.2.5b +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +6 5775 5775 6750 6600 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6450 5850 6750 5850 +2 1 0 1 2 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6450 6450 6750 6450 +2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6450 6150 6750 6150 +4 0 0 50 -1 0 12 0.0000 4 180 525 5775 5925 proc 0\001 +4 0 2 50 -1 0 12 0.0000 4 180 525 5775 6525 proc 2\001 +4 0 1 50 -1 0 12 0.0000 4 180 525 5775 6225 proc 1\001 +-6 +6 2700 4050 3150 4500 +1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 2925 4275 212 212 2925 4275 3075 4425 +4 0 0 50 -1 0 14 0.0000 4 165 120 2925 4350 0\001 +-6 +6 9300 3825 9750 4275 +1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 9525 4050 212 212 9525 4050 9675 4200 +4 0 0 50 -1 0 14 0.0000 4 165 120 9525 4125 0\001 +-6 +6 4275 3525 4725 3975 +1 3 0 1 1 7 50 -1 -1 0.000 1 0.0000 4500 3750 212 212 4500 3750 4712 3750 +4 0 1 50 -1 0 12 0.0000 4 135 105 4425 3825 0\001 +-6 +6 7950 3225 8400 3675 +1 3 0 1 1 7 50 -1 -1 0.000 1 0.0000 8175 3450 212 212 8175 3450 8387 3450 +4 0 1 50 -1 0 12 0.0000 4 135 105 8100 3525 0\001 +-6 +6 2775 2550 3225 3000 +1 3 0 1 2 7 50 -1 -1 0.000 1 0.0000 3000 2775 212 212 3000 2775 3212 2775 +4 0 2 50 -1 0 12 0.0000 4 135 105 3000 2850 0\001 +-6 +6 8775 2475 9225 2925 +1 3 0 1 2 7 50 -1 -1 0.000 1 0.0000 9000 2700 212 212 9000 2700 9212 2700 +4 0 2 50 -1 0 12 0.0000 4 135 105 9000 2775 0\001 +-6 +1 3 0 1 0 7 50 -1 -1 0.000 1 0.0000 3975 4425 212 212 3975 4425 4125 4575 +1 3 0 1 1 7 50 -1 -1 0.000 1 0.0000 4248 2814 212 212 4248 2814 4460 2814 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 3600 3600 4800 4800 3600 4800 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3600 4800 2400 4800 2400 3600 3600 3600 3600 4800 +2 2 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4875 3375 3675 3375 3675 2175 4875 2175 4875 3375 +2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 4875 3375 4875 4650 3675 3375 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6225 5250 6225 975 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3075 1425 3975 1425 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 8700 1425 9525 1425 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 7800 4800 10200 4800 10200 2400 7800 4800 +2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 7800 4650 8925 3525 7800 2475 7800 4650 +2 1 0 1 2 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 9000 3450 10125 2325 7875 2325 9000 3450 +2 2 0 1 2 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3600 3375 2400 3375 2400 2175 3600 2175 3600 3375 +4 0 0 50 -1 0 12 0.0000 4 135 105 2325 5100 0\001 +4 0 0 50 -1 0 12 0.0000 4 135 105 4725 5100 2\001 +4 0 0 50 -1 0 12 0.0000 4 135 105 3600 5100 1\001 +4 0 0 50 -1 0 12 0.0000 4 135 105 2175 3750 3\001 +4 0 0 50 -1 0 12 0.0000 4 135 105 3450 3825 4\001 +4 0 0 50 -1 0 20 0.0000 4 225 930 3075 1275 Source\001 +4 0 0 50 -1 0 14 0.0000 4 165 120 3900 4500 1\001 +4 0 2 50 -1 0 12 0.0000 4 135 105 2175 3450 0\001 +4 0 2 50 -1 0 12 0.0000 4 135 105 3450 3300 1\001 +4 0 1 50 -1 0 12 0.0000 4 135 105 3825 3300 1\001 +4 0 1 50 -1 0 12 0.0000 4 135 105 5025 3375 2\001 +4 0 1 50 -1 0 12 0.0000 4 135 105 3750 2025 3\001 +4 0 1 50 -1 0 12 0.0000 4 135 105 4950 2025 4\001 +4 0 1 50 -1 0 12 0.0000 4 135 105 4950 4875 0\001 +4 0 1 50 -1 0 12 0.0000 4 135 105 4200 2850 1\001 +4 0 0 50 -1 0 20 0.0000 4 300 885 8625 1275 Target\001 +4 0 1 50 -1 0 12 0.0000 4 135 105 7575 4725 0\001 +4 0 1 50 -1 0 12 0.0000 4 135 105 7500 2475 2\001 +4 0 0 50 -1 0 12 0.0000 4 135 105 7725 5100 0\001 +4 0 0 50 -1 0 12 0.0000 4 135 105 10125 5100 1\001 +4 0 0 50 -1 0 12 0.0000 4 135 105 10425 2400 2\001 +4 0 2 50 -1 0 12 0.0000 4 135 105 9000 3300 0\001 +4 0 2 50 -1 0 12 0.0000 4 135 105 7800 2175 1\001 +4 0 2 50 -1 0 12 0.0000 4 135 105 10050 2175 2\001 +4 0 1 50 -1 0 12 0.0000 4 135 105 8700 3600 1\001 +4 0 2 50 -1 0 12 0.0000 4 135 105 3525 2025 3\001 +4 0 2 50 -1 0 12 0.0000 4 135 105 2325 2025 2\001 diff --git a/doc/doxygen/figures/OverlapDEC1.png b/doc/doxygen/figures/OverlapDEC1.png new file mode 100644 index 0000000000000000000000000000000000000000..d6fbd3f0b165688dad3e56a9a332e8a01d8e0b10 GIT binary patch literal 6982 zcmeHLS6EYBmktU_6~U+wiUCoGAmyib0un+eflm~Ls7MzOq((pm1q=itRgjtl0-~UF z=}7$uQUjq02uh29^b#Ty{_@Ps#mqA|GjsD@tY@#i_CEWp^{#TxUN5aIjCeRfoB#lT z#~6MM2>=|E0{~b8*^ekK z07h13U?W%WM}ChSecc}Vfz@PHl-w=e?*jn9W#em5o1l#4uj2s(wPSjS;NgQqIYnNR z!B{!4o_CyqO;up zg{~jgl_SqsDL!ltuqF|jxK*L!3oaYYz&$}i|kMma^-CC<;tA4j8 z(m8VVXDtj6d-pjA%Lro$f^{_&%uKuOirDXTVDZaoT-k5P0$*PhP)Imi&NNX;n4S%x22c4coCDLywrsG(Gv*Sti*R zImdXC+Q9vZYq}_jBY8P&))t4ne%rj!J#5+(Ww5FoE?LN@8tSFrf*MROUY&&j>Ua0O zU{TlIS*<1{=G(sJ!T`K`TBx4Q)wi>cmH_B)TH^-ptiM>7M_uwy{UZ?m6%c6cnB2j{ z9g+6u4x6Qkg3cua9@xk|Hh^boV({xU4ZxE1#s6EPd(SL8d^>yi;d$Ojgj-voBz?cu z^G5q&^FcP%qlUztl&GYFenI6=srGQ#p*Y6$s;>PhYkDK)NtseaVV2CVr?a3oV4H5Q zyga95_T2N?;{F9cAe9OEyCV47pTIR$w$A(!k_qzqTehvSoGs9cA7i<;{gPDjQ=auOqzyQKQ zcWxKK02x*b;un;U<>)9M1OM@9h?luR!aHXDd;KG-5DV{3TYsOof$=7CU5{#Di6Psx z;q54$p(vwk!?(fb`IhV!QB%nu`)%G(TtZ1>nwB?EIh-9>K!N3dpkBdAfY$O>F9b=} zm5dY=V)<1-rB%q7{_IP?qM(eUSrt&x;2d0OAjh7<3W5X$_ zz7Py)D6Q~#LedSnktBP$Qj%22ZC~bLZsR@!=HZkE2Ffb7t3>ff!#>(k(O=Ig|EFER zYrM6{ST3wdUGOAK8tOji2;p>R%_ucTO!7JciNjiH_~~jsoa~$=`H~SzJ(3a^WeudT z!vlj46LmgG!mkGD7(%g6UAQk0QG>DCIC!W|;d0#1mk1dY9sjThUF3%j#h&&C^3^yI_8>O7$ETD&IbL zv6d>m@nfYgPL%Z1_YYzWY2!Xd-@}pMVZ0aZUY_Y?=|-;;+Dp=K!NbLx7Q!$Rn4Vr(`^ZLq^&sW%fpFZ}4 z=9Qq~%yDjY?u_nT2yB|kk&q%<0-OufRs}FfO`-i#q ziy8>$kO$EB!r5+r+uqJ~!SwLfJLx<~D##MynhRUB)43AVd>7+Ta^}o=d46bD5d-+5 z!5wI)edPvxzmO-=D3(+KPTsZ6QomIn1AGzZPWj0+v$VUvdBlzjS+hLr^U?#Kt_+$k z09)CtLf_JH8YYMZ*9WaSiT<%~Y2anKPd9B)N5N5E@(TQ;egm%<^fgb4@*dG>#P%#o znV%@T`5NEXKT?oM2-iD%l@&tOP91;gpN{WCVD*KJ*e;wyJwC+_Rf6G&3q{v;5aRt0 z4DgXv!UY!@XQaA94_Y%Hr{Gan;;|YUS4Py%%PYi(8Nrd|1X7yDQ>oDA)d8qU-A0fp zWDL;=TfT5sruhf-q4j?FlwpM52(iKdSzhvT7PdnQq?;fD@)uuUpSerKU$`r}x^0WY ztfWU8BV38F+#y1^VcvyUwt(`}M5|fhqE|?u-Rr_z6#+IM&L^B0BK^!#y@AoUR_44a zayF!$K`=tH_S--~a)!ATpcg7}oH~mZI3j!HWsU(HgmYO~6>Ys%FugIH+E-`}$4pya z?7(#iDjVjGf(*62q^YgTk{^xF53p?rsKJkuq?8;8qjmOuRbPuMH+Z$Zy?;Fyi%<%{ zgo7$z&%iOw;YuM#{JX>VT<)ODa7Ch&Qjmp+p6u}qCskwS3X3C61HM6&D&Ui^Yh`P^ z#Wi4a*@3%r&5L6|w_9nxs`c zOK(zVMF57%R5cRJSgM-6p#;j9~38D(!DvBTiv3nAvndM zeL(_(cFd2XRhCTt>7WKYUscRVw4n+S-^HM%m`Stkj4HZlm`z!*obW3(}z)HV6(LsJb$tCV*B*x%JRtXa{;e?bzfQspuE9`jR#n) z!;`_^XX>&~js*mJXRHw;Tc86B8m{4BxfQ}Wo>pU>%F~kajPK^e6wcRtG;d;PR3sm` zOt(~fGAjSTa|f&_e3gK^z3Mi`od6VJT37Xs^gylUjb>?MyxSExGHIskCU+ulRvlw% zU0gghb{yIMtsm{3YUz%{Un6-W?I6F4npgaQ%UvyKnC$ogHb!VD`pv~1A>+iBLu!GHnd*Lj7+k(`Yv6@yDvFLQH^6%FNmQ4#(xk|gwjR!z^P*+I zWotq$D+gw*p*1~SRCjAE6>s34^b8C|tX&$OE|OV$W{lue?lQpT6tq}Q7XA1oW{eQe z_D(YYTJ|%nqOa(w?Dx<;tv!>8!z!XwCg{gz2=0`vSz!Z_liLjQHzc7uiyPUcTh4fQ zvV_Yng;p`x$z_G<@tu%rbcqwo4E2ZwzpcBr63V_y zFUO3}|DITHQS3$9Bt2R}+H)b>8DSAEGE$!7MAQ>HH{{Cl6ex|LX`>AntP0rh_ap9y zIbcM8g-y7w8yH3PGRAu6pV=Rl7G9I;xeuKuHFF-h3 z&?6f*6YwpTxtd!F{ya#+K^GguwmgX!ABXhYg)={u8y_rvCJLf`J8&x(ToS~iVJ7|8 zNinD*1muTGv?i1(sevQvPOYyyNroyLV>xS16I%yvb0q+w6hjPNQ@ZVYs6<{N;$~h% zQqa^|O1)=>)ipUt%^`e0z0{g8gE_JI!Pp~eEGQJ}#H?LQQt+O_$Dd!6{T#5&j;Y$K zsIOS-3cu`^g#Q^h(rG=O3*&`=h&dV$iK#$Cl4$quWLQ0Sd^bg#G?66op`-+8f0`P) zg4bv)=qIppWT^&VD&rez;KKev=8RcOVR+bCc782F2QWFv#y&QUQg8|yK7cms?;g`2 zc~O!F8n1+=h;*A_Y6h=iBT*2>d1yF)jYWS2FUtsZ*E(*A>Kd6m5XjE|eaIgpJF;R> z6BdvhFJxYd+}G*Afm273z^&?gJ0y2U!fr%u9df^7)iZ^Ue?rv-gJ;RI`|`10OFEAv zuOF@nGeJxm=Qw0N&IEm_M56Ix*+8v3M4)+*KKAl$i1yb}Nv9xIgM2CK@Am}Kp&!=d zT~gN0siHFyaMk-5JRQ13TeKAr%Cv`s&fk6&7uH8&=O+rN8TMy_{dYELC~v<4+Qx!h z;O5Vp0Tv$}Ra!_=H313_;w>8&L7~M-ljL4i@)CbIYol2Leu3h2mEiyw^uuZ-`}lJ} z!!51zr0hu1pZgzAgk{qS%2%q8XwAl_9z~|?{1WN%hDDx#dR@rT|57olYK@O+;TV2)`CjjAs4^;>D^yMP(;}`_DtfeYa@#JjJr#1o-Q5 z;@91kE<^F5$kr5)Q{UXtnPg(Ls(X^rn+AlAi8&re zrL8tvPl+3bAs@xU-6Bv_tObxrFF zFjN-Vs-t|RsDk<$+z(>vGU2M>5--*q+NdG{xt9l1Tz~noTn{sXBp7q>t9nZM%4KYb z8`dER!OUqJ*nT9M7;V{e@AX(=B4~Q>g=fd*4%>EEnWm5- zDJ)jmAfL})$g3=2K3mfBYRRXhpjfppIQGsSGZDa6A>V(dOPSVHvWp7yY(t7#48g36 zyk!XNRr;!`|ATTFa(R(^`@91k0R&R>V|smhPzo=)>!t)8wnb)ru$5%ju@CJV+w}MJ zI|7l66E5mrN}6oP>~dfSF??l=9nU?_m~~m9nYnca-<{ z*G*5hhwXds39hR<-z`B8kH`tH{|>9K0Vji?>TyCxhWrmG*#c0|JMz!A&cAN+|6k)# zTS@PvLy7G{OR0?i1&-LR5%vTba;XeC{SsJCIsAAD)kB1zgCBS=KaRySg3n-mJGoaV zgdsbv;NJRrn7!?lxlG@Fo9DBc!**b3KCSdkpmVduwMHPi#Y2DC1s6!>z^!5nWH0y{EBt9R>D&2$68);4Ct}pNS)fMZaQz1VS16`)z8WC$;{Z7gET{EE8zRqWs#nN1@Khs)yq#(JY?5 z)_|HjfA7~s_qRfnPln~l_55;Hnp?;*YG*1#`Y&i6eG$IS`Gh(s+stN;%l^nG{P?I{ zGLoxost0ptJ$Vl^lg$&Gb6U}#+f_4UPq>c#r~u=Ezqb`x%S1{ z-bM!cIY;Mb$ybX1ZdUg3oT>u>F=znOA!dcpz<=bcLb_VfT;Hk9Ho?i*c43jt&ZBt# zeRB2J&#u{=t*6WmDZtp!;##r(o$#0c+dWn`kAL=9hZI-CY@7mcB<90cd7q_Wrf_7YKhv!e8m|S55eD T3*))D4K~{1{l)kHvBLiwHX_6V literal 0 HcmV?d00001 diff --git a/doc/doxygen/figures/UML_light.png b/doc/doxygen/figures/UML_light.png index 8eff5fa9c564a18200e14ddeff717d653cc8eff1..08ecacdbb7ccf09599668346827a52e6316f4a3e 100644 GIT binary patch literal 3990 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 literal 2803 zcmb_eX;4$=8a_!#iV$zDNE1)otMqDG@RUT{t^@_QM&q7wNrX8XHWiQ(1Bh&1M_Z1O zK{SkFT`DSDfT&am5UL&(0|pQwifmf6mB^A&z(8`plLV?W{c-Qi{gXL--}^q#^R6Gq z)~#JJ)(LikAZYBWmA)Gwh&&y9TO7&Y_i9UO76dt!tn&5QBztOjF53TW{x~S0)v{^f zhJEMb!td5@n=v0Eji($EnTiV2P9oL8!>`_qp|?46$I%|| zt6v55H@?91!y-UW=XCaGo*5{cWHq~lBmhDhN0P&y!lnSfO9;XDwvnk6(ZHX^?s(_* zy=I^>JYxKZ{KsQhs`sX$M;6CPJak=cvKl+KBB7mq6>dA_1cUF=xpAWHqguuhTXv{o(;!-rc^~ON& z&XB^Xr5s7WjD%HoM9sEbtZr&ngnB!`IwpV9>AbK47ZzOqzPlNMlkdLiGgsdXF!a&{ zTK!TqMjWLextui|&TJw#9>sSwGgT4Z_%O2{E#m8@2hoq5#*IkzXC~vploFswkx?fT z=}+K${$)_QgFHy2^>wm%ek<-EXS`3x75Y4nZ(SDGF$1q6Fe;f_S%{IIadEAG5{xG8 zX=EzS;|T_Ek-u>CoN_ai&R>UWq!{8U%*5x9y&0O4QR%>?eQI9I{M+*&x*eW?$;z14 z0W<~?{?FxrnC5mB@h=6UbN&I}CJ1c&6qm=$0uid!ZvG4l0M`?3{E1^i=uP>Eq%%7i zC$8x>Z;efhXJms9N?g-y-fh|Se+!bc)*j1b&JiNixjsawwCMbWcWRlSXFZpFC0{Ub z>d&YP0>|y3@LD=ZV}X)rBa3FJsX_gkO9PpNW@R=}O{>8*C29t!8PL9M1?>sZLYG*AXDN*A;>_1Gb9eC+fi(g{tO8CB-l`F zkd^Kb@PTY7HppZV1ehTkiXE~P0?hxDFn}WVK|f*aBKJ7Kl#ikO83{ri(<&a{Ga9gr zijkg2|Gy%>67!DhMWpK%%XrY7VXW|%aA;D}dE{H{*iaXtN2kE?F7trx^F4l2Fl`Om zAwagyYIA+kGv|BM$=mNZ?l5&Aw!Dmt5AGk8~AP!~Ujyb3T5s z{QKgU+QqpfaR5o#8E@!&Ym$7q2UH-py+Ml|TOvRi8u#$;bc*9x^x`Ri4aBZkj}1OZ z!8Pt}uAHoRwA?eT^Txw&!9S_3B!?cSRb_RGjbWf@zvY3tl|oVys1*@P220hub^=!D z404v;I;?om-3-<_nb_6<$SoGt4Yw+3g|fRjhxWY;qenbVYF48hNlSFaxyfB*aWD7-cQ0@Teo=5*SDaazDDr3Y{3ryo0zNhDKtPW& zc&O|y8_ZNGAzKNCsf$d+!UTHGBSZ%WrF`lJwuAcY%J#@ztraCE%g~z8lzUZA_VJDA?(MDPa{a<*r$owy#UcF75{|^kD?aiIBCVW>>En)om!Y$d zdl`v?U80wA&Aco4%%{{F@&ik|X{nyDsv$kQ_heX4Ozxh`qH$-#20J`<{v0957EjMZyn?l}TaZi|J>&n)6dUPt0n%SyK7&4$z7#+kn!5&^18ulA|&FXx!E z(;|um(dieFUaqSp8~@?l4nxm5)giGy=dH9dRTSQH`%cN?MdOFmMFVR#iG%rrIae|p zlCZ5U-TjFRG#5af!@mJ7@JZ!CZ-UZ;{#h^)Y$*{h23U=r5k2Kr>;CJ@cSofpB^d2n zwT3lKRC}9*|4Dtsw)frqw(6GH7n$RgM3bk5NjC0H{O#*wUmOt0?!!OWL6VGwH1Y!5H@)4^wj^> zMN3SV6WGc%Rnx&d5z}l}GjHY`tNPxEG8ZDgpUAOYmu}Gx(Pe z*zpp^$gb8{(`OS4@&we5?ooRN2*RzWGc2 Gll}vI@+C+B diff --git a/doc/doxygen/figures/UML_small.png b/doc/doxygen/figures/UML_small.png index 77109ab34035dcf9e9efddfdfc74e42de40087d0..791728fa43c41d13151b8666998e6a54a2168372 100644 GIT binary patch literal 27022 zcma%iWmJ@3_$?CBjndMgbcjeuNK30oNQab^ba!`mDj^^UD&46=h=53UHwZ}Ihu{C+ zweE-e;j$KpGsDdLp7X@s``ITDFKP*26%CM=to>U&23_ zc5+(pkdUy6Z@zCKrDu{MAz>+5JbkLFYHsUj`_A0fj#mEZQ(8L*TQdu5QzRtUiLB=? znh7U&pUj?^;%i9$+54Pg?T19qP=?V(`HtKiDlNeZqWuk87ZTDQikqvqW2M-|tqNNtWF)&$PDY}h`RjmsRpwVn zv~fst^hB%Jw_??idO2V8k|6bxAyq!FHo-zlL_)H5^OU4V`iP6P^;iB08q%MVgeg*_ zKlxN87)VjKkkVLX8Ii>skPKe>sk0-uwj<@1iPLkUwtl+htM!dn7TLE64aqrLGZtUm z0LeE^lD!X!RuCEK={@3p6k0`;T<%{jb0zwALA7$XkXjK*{VC6W@sZRf{iJX?*qd9R zTWGibENMu3pTG=ri9RzWgMnCX6-99X2MLMdbg1o0P%L(JWodrJY}I=AZ&&`6)t)W= z6T1D`tHwxVR3rlB!QBb{<>lWfc0IQ$om#9)bdV-Akj!UKb@?VSbG5O4x}Qe430{cb z%g$5n6``iW!p7caGRkY>UW|Bh%{Om57vX&j&t6Ts?;+Wzi>H;h76e?{8`?O3QjcCm zpi1)CoUAfj^#u7`M&BP=;Q#!Z{Z9D4W>~E%y;6@`oqC)U-S?ygqIDnMeVXJ;%mf!) zq_SX@R^@N#UlG==-aEIDBk(kTIU|XCA96%eV8epYnbY z38`_7>~(P>sbV(<5|UJ|--AjCbeuMlvR1szHtNP!Qe?y1QsOv_ts(@Hx0igWu=2=~ zCCFd23jIO-T8ToDOPD@S@THAM5O;Ns=(XRb9qDZYvg~%U#$ZfTiCzq1Lpq^QLZj$E z^aB{AY0;?khI0JzzVB(*LrK)=yLuhoBbP{8#_7s29B??0JdS!Teil2~OUoO65#A`v zljv8ahBAWeBwklcLlNGc`)$fz-*5RvL(kTn9Fe@jqm6xsc<{_3 z#|>XchDaNPX;Luv+%;a-e5eug(3o2Dk@FqO)@;LF3`XP#U*atcy+DF?Yya3-SxrUF zr^QTL3}1-qF=JB4$3L`ujv8g@>kM%cvi6cqP+vKdSYYWRGBc3>C`JmVcY;tjhH~q=cB?DV?c5 zl%$d5owWM##mjdu#YWve zV!tSTiC?Ox;Z-Q}vRZYq1astW>1YY{%Z3txPXp>M>M^Q=YWfAu`j`G^#<*3%K{C0) zas@ApYr4s!= z){)R#p%W*}dVzYi`k?wrr@@UU!^WF#>zGGBj_}r}hh&f5{w+8n-PrxTJ4Ew{n;%0U zmfV_0(0H#e)_Bb-)uMK2FL1t?5Mf>)*J)lbBwxT%%e)ivX7Qmb=@YXuTPmY6{u$FL zD-lB@3*O21o$tGrn(y}~TBV!S4}BSS?Ca}gpDO!P_I)e*@o1)1wqf&l)~>H{bq#Wvxp2Dg!4&CdeqEXe{%%>7^YkDl91@N8XdVQr;v-QIqDYeWG1nrRPeV8I<33J4AOS{_dS3MAY)U2_Y>qC_neUC!e;te(Pjqk-`;87=oi`N!e@xf zn13zvZU=YwmC+1twcT32)#OLvSB+wYLW7!y`T_kRS`=EtZ7!TAcO-EzakXe15^P&Z z4=7KK`KI2mrw`rvfsu7boAQjik6H2FZ^G!{L5x`fZ`;CC#r3{#7@>2r)}ggD7UXH9 zr(PuYAMk$U+)(@S+|l0gg#CBflGgc~rs(~clE^yYNy~2z&Tq;rt<|lKw=!ydYd_Zd zxrY3c-cKQNBxc0i4qNK{(lhA|G^BpdlnsvCk8?au%uLKIP{*}M{=zoKUBg?hm&`#gA|7fzNmjv#k;G>Rm|q9L#E?eE7v5aJ;FC@cC~TJfbDH)t#e0a*{|B64UB=I}K=F?y8I^#QrNhU9MEmKByG<+VACh3>il@)*bS1D7wvhYe- zf7J8H?d`N~YkjC z-ExMn?L@|Qy31EP?FV@663cBYvxS}>i>hmR107Qx{j+I4HAfhma&BzDgj$@+I11k8 zism)#u0k^lnbjEGy+*sg^e0A>Of}ESML&tkdfQ#j%T?&uZknDT zwqJ>Sa{Q~bDLk}0>~m(>I{I$x-x#NEj$6}i_ZDT14f8ZrEmQr`Kj-6ZQWvZp#VK9) z7}tu6=84M<^fUYopD$OROOAUyuThTew}RY^kQ{)e3-^dqXqvHMGkkKe?!h|O4C4@Bh^$5tPD--}^+ljC*# z<@ec+OVg(AZa#@L9fm(`=(pT`LRt*}+*$_sAL|bMzz7$HAN~u`|L5WV>p3|>f842O zV$NHsliS{w36-c4bAq2@@s!mP^(tawV({_sx)s7`dx=$(TC?)BKPV)b^`~R{w{k1a zX9XFOr5B<}ur@yLt?IL%DtTU{{muHZ^Ok0Kex)8ghPo%m$RHok3!Dxo?> zh$<25(P6o6Mk1ZZs-Q-qMuJI4BK?^in-WbT*CO386`6)fKHikv8}FQ0(nKqn@w*QL z*$9dBsZUoGduDV#s~XA60?KGbjQ!bSv{cNg>S`Nx$540)m8x49SMT>v8>HDX|N#O-QDUW(rPaxCEIIey|E`pqr^2e z{~T{mzLXB0F1|MXnJb~0K!7S??{geUE$qB8Qexa4>BrM|mqQzef`4sos9CfS&KE;NQ$7pIj^EiE_TP1I)LPVIfVVda#wgq(gP-bX>ldok(>ztq*$x$I6g zd7Mm5O+8EDoZdD6YB`!N=5qy?;W3y4p^;lF#`Mj0_8tYr#|OgPW__vfnNv-NBPGwD zK7EQv;kx!kX~%!Li+dA3=hdI5M(fHcHk1%ZLiLD@>>)Euiad$hxT6=#2N8-%z|!H`u{$efk`MEnI$L`Xf;y;I>kh(4B9JSwcsXwk=JQ zpYhDj|9m#4nR9sT{&x+2>xm>kJmGMWR^zV0xe5H3!BietP4a5X(Fb;A7201dVd>z3 zI*-BA!&UuyM|m&YVpwIls5n^Mb6Do=-k?04+Y+%X$U4@$RDUmbwn@44{$67!yNys8Br&_by7aj^UH$fUa$#ZNCczFKq}x~Uo*KaGKlR@ zu$D%WcNiBJH}6mfxmHk6@cF+a?#eRN%2Jla@ViDKB@-~vN-ng(36dgM3iGwUsV)ES z0`or)|M#365^<~AXsjY3#v1S5AXXUdO#zrT;pM?G=BGeu!l8W>J!<)qBq*Qte_xN- zyOqA~C`xIy5%C4?WK*airDK~z-m(PmYa`BKRh)NcIKt_b(2sll@>$stg&#ghOH0pF ze1w~Ev4@!37P~%G`JWrT%cU0?;q*VBIB#cupUuR~j9F>eyzaj$lx0Z9VHzZrK@B^O z(G8FNf7HxdIA%ef$8zyfY9wY!HzANkAjy6=BDqTPHafbog4|8{`QGex9-olFB+pBR z6Xb{$o{w`ofE`iAe(u>U`9qaio(NGT?7T%FO?U*Kyui7`)pBu=_cVkGuV;I*2E}XV ziPA7m#~1UV_GJgd53tghe+vDwOB6`Dpny`~1WVS(!Nz_lEIfwtpt_69IkW7ryuADs za(R=XK=A}7rpS7#stj{$EZDnA7 z@f#vTf1*g*TW`B9Zfh>B+K`*<4?%M=dp$>wI1oLe?t(i*s+`j0Ts=J`ZJP0vWc@OC zQ-fK93X#(b|-TyQTwQk+fF{#q>BW z^?p~%5J=+CxvR1Hcg%&v1yv%vHcWv~QsmxlDB;rv$MpbwDJHhfg$!Ff{YF>&3caQW z8fBWT-m;LFj7Yf_57^j3R^8P4496Fm(;M?yNlfb;*B#P$O(Dikjwfxe7iq4GH9zOK zTt-8Klv5+E5{|}@DHQDxKb4ht;RkHnEx~w%ob%*NTgkR*Ybu&HH*jo(bB*koi>F z@?vi8grA4Tj?<|jUvQpb5L+m#fAw(PacQcqdih6JZY`-)vT3m4%0Sk62fi4;&6Fkq zs$_3bj<@^S-}QK=XEqaGFpDG@dieqiEy5Qt;xO|t@-X5s;zpS z=mMFg=%n7WrW2$S{L`S9s#`2eHqok2kW{!ly}r(CHZxCW2&9L+R1+Q3U440R%y{k5 zk0s3$_|w~k@j*B;vFd2T455280ot+O_D0k&KiaEj!#IP7Pjc|PF7H)XX(fyOn+wpX zvEk5b)SP}|ztCClw5d*l7AI4@i*Yc5>nw?3U-vqnl_E+;jRZ}iQj?vk=sC&wtV2sd zd0-(&d}0qb`+IvQ!L4vfMdpIZ?K}%1Mn=tesgMp#G5$0~svaRKXX&^Ae}Bh%TKOME ztXRA?zJgFlhWS%{;~9A)M{Qc}BX|*28l^Ae8G~UB%qQ68l?Az!hT|FeBAFhY6z2B^ z5+r;#;U=524bRu*WEnhPgE`j_{n-AM&f612ObTBtN5cy(`q0B@RqFUS z5LNlC1jKdbL%*gQ@b&5r-k6(*j#3C2wufqe-9S_k|DH%>3^RQ?>sruLWf~ETL#|e# zx83Z8&K53W^*gb$vQpFoZ@Ss*Fh-2?MTt5Sd*9i#%QI-xTl-5;cCuH|@x86u{C%+f z<%VC6SE&&*duFEBi#VqwBt8i8`TK^|Jo;nIPvUA|;(i*8k>zeLyhCL>`{<9-aLx zdCqcuwrQW9Y^tSQY2X}26c@O6GAu`wJH)HfWBEz_!;gbyM1#}j-Fx?*z=Z^$;~Vik zjV;3OSn>eF{(ASpk1x~NMXcfM2t;!E1Fb4Y zMDli3^}Dy<_M{{3Mi@Ddee(KUuA>r~L7))-zCUA((1evL~@S4+lQ`TTrub)Z!XWG<}B1mQij**r3g_C z2QqERyI(grU-tEF<>uy63xBhoJVta!-4A39>P|yc5A6HwCS5>rJon?!9V4X*GRawKAlvLpD+t%}UU9-iUHWF_*M_Mh~ z4d>YVAy+Zh)6;{Fj&4;L`I>VKs?p)$VTAQJM>Uei(a)Yevl>~GmJIDlu;td2Qaf-x zkXB=SZ_v&zNs?@8s)dF3?Rfog;zyDgM6zmyqAPzW#_s@t@=5x1-wuP#GFG$HyNxIB%EgHXIi!i9NEJGCDuz zsA&B4I@v;^7nnk!MY1U-A)w=wSk-r=1Xn3yN*3zTNQK_h zd$!&H4Fx?7Qr9Zh94C=wCd2pC63r`zR?YTK_Ifqs6$k(h)Tz3(m8kkZHl* zjTVd+cG`G>NapB?rp7M8LaC1w=l8kT??J=9JMu|ahagbW>9K#_gYX4oQMcoz?+F!+ z>Ny0+6hNeup0gw5h;FI_L9p7QJgYPvPKSw!N%Mt6KxJjKcgsZ2Vl!;kxI^|;6GLdeZQ9-oOWlt ze!Z7Zzh3}ggj&=+F`v~unSzxerY9ja^-qO<3%z&NyVZf}$?cDiJGuFlhQlQ>;w&Z< zF+Q-~3(w!x+`*yiG~hOQv-;)jq+6@+Bb?h$6PTl}HY3f_gzecC>?)7WcV89nHmt4n zx*f)!9dGZqp&P&HOD!F?Z)?+tUW7X!SjZ4@3+^|YZ1$QB!d{h$I;+*H?yj+!UJ*=Q zR3MThVM;O8k|Ze@nsZ!fI?`ylg+fFgY)Up^&TndB;z0E*6jtKd`7w3btBMa}R%7de z;rVTWEyRU%WH=vy2iDro`pq<V z^+|cyxzD8~|F)x$TQ=87_P^)V?<~>>dVB2}rh#n<th#epbZVrrxClN;cA)MYC5^ybTYH1B1SFdc7R&?aG}+2dVl{j ziFDtJI>C?chvOvD%PSLZ*(`zIf7CYt@9K&my(!|!T~H_nGak8Y{UNM=GsvYQkX^WL z+@p+&mWCO}zm}|~OU|#f=_n+LaY3`TV8cxYD+3aT`0y8jPUouFlxEobR*(f|83*$oGd%S#;s4pY(t$EI-7QTyjd^ zbDxLKWTg1S$k@n+(z zjM8yFmzz0(OF&SiN=MtPn#1p~ZBLz6_urLK%MK&%VPW!miZR>hwpgg7^SZ^`urpMR zU+IzM3oah}R8}FG81I(Xb-aOlB+DC(lv>nUDFyyC&( zvm80U!`4l-FgoY^5z1NmqG04V_8;oKRqQ?XK|+DPBDGNj?XN2IG6*Ep61TPx@r;1+ z@wEo#1(N|v|GSN=O|YOKXD%KZL!hQMW%{F&ND^az!?FH0ZaOh?UP3do(geT7FXe4U z-=c5=nfNMw_YxjDqt{ar-dz8vg8kwY+YGq*Ek_hcs)>nZr%EX6AUxs;pw;$c+7svZ zRuw2DZ3KpfFFYs7-;ocESv{P?B_Sb^8Wxe32c?6hQ#O=Kr13?Q`!eHwC_<8quTbJ1YWmmd0bmq`&Dc{toqQ{F+9gh_r!m>Q#<8wc`- zjs&geb2U2~#`xY%5l`)@!pQ^zI~>Va2Rar&YqVp=KyI85!{kQBYyllAYOdk=OqidN zHAp0qy>L3(A?#4}?}yXNkGs@!_35uj+=w5Hdq_?iB;f?)QdBdIw9Y>(4t8~UaLR?; zF3>w@DvJ{+emK-*^j-^6om@Y_l0Bb2L5>wRpzVC(0K@&OfTk?iRZfII#Eyp4~|-(blv4-X4cZ=R*3Zj#wuw$hD>L z{oRnWGJ^u2XZtSixp7eDE3clPVsEYM6W?1g+S!spOO8N7?$b@Rxiqq)Q^KD5wY9vQmC46_VL`08_{i*^k z?xCqm6bB)TTESiBP4Nt06`9O8;$slDNj9#c+*hSS`>~ddQhn96owHQhn!Q0}|8Gxi ziss`($;^&Vx(&c$Z#~!5^W5*Edm2n235r6N^6F+q%clw03hO_WbX;5&PMg04GTyEZ zWUa5SZ{VOMd><*-c@%62wLrFFjFOyuyvp>Mptphomb6;A_E&$bjeS?|v-P5t{tQ_e z86(k#b2P=_zbCUkTnL9CtUDWH75Ia8M;oJRYHCNDW9Z|$^^O)$K&?iKP9Qf^=@bUW(D4yXdj_n#NaComf*|KfjJGYR?srWglgM~#=pAgaCk^!gTGHE5Ij z`}={h(+w^iG7FDR>+Bc1Z^}v4;UYhhNbJbS2vo<9Ius8rNr;Kx&9(YbKC%J5Q&ddM zr$7DSo^lYC&M4%GUenpH56|Ga*Kk$68`5ft^(-Q%y}iA!^xQu5%9z|Xd4?@W8}T!Z z?~VJ>#s}8$!PVzArPW;*fPMk#1QG(>9d6sL2hEK|M^@%i$Sm< z?6ULPmDl5VOO51%&2;@$48nk$HJsOeLCOiS&=rxVPeV%js?NbwD;aPJI|4u&Lm=$J zyx|T8r|`pvUv(Rt;Zua|7Xs^f#Qok>!A%k}$oxx*I~xVPvb?@g;Ozt|rA7MANJ&Dy z7~K+Z@mD0v)q_tCxq_AvDTu1q28$b`rA+b*ZZkGDW5sGur)P>(XtGyD@5SV^!tSZp z05r}Kw3kd?PUg^=ndbEVH;yn^eCgCfv zeQ1wJU^1+Xy#3h(i6{rsxmUcg=O*QrrK|`zJVn1 z^5cu|upPa%H zjD2lLR$BUW)oD&}!18OmaMGe+NC#+_>5pt@s^6$IOzY)KVMZ@zDiz81($K}zON~Yjvw?ng{;m5W!jk_(^-XOfo6cFP5yEq&a&Kmggg}-zZtE$=i(me&S z?A!o?cnA*pf^);Rvj@nLn4f0ca^Yaopvs9}*B_%yW*-eS=suw0Ls zmN;JwYh>7vOAzdgQ?MwdoA9QA;Q975P@ea!A1xspOEs7Rr<%PQV8tQpZ}O1e{O3N9 z0;1#+k8qqjtbZjv2~R73Lv}tJqo17_<5oY%37VnvZSQsF^qJ4uCEdk z6JbB@hsUR;t~t~-pYJr>6Lo)4ra82Fs77*!galas2e>Budm>~C#0Plo2DRT!)SGzL zj+>ypS5pa!%d4T?N|TnD#j+qi$*_1DfP zJ`F2^4sIM`_c#5xoj!d5EP*^}ksHIKiM6w~nUF_5W9yCr8QV54*&XxdQ1aB(e?csT z;8CY%WqDov+XoKn4s_J6_~*}`{6qyl?*{CPROGWifJ65 zr|OmHorF(mKL5GP2{4Q`Ti8XJq$@TyHZ(L8S>SH1(BtR?(>nDJ3J_vmzDX#@X5QY- z?Zcw)xZymPa$Wzqi-*WZESmJ|1!dq|2GSr|3=`*2U_CgoI7*NAZkd`K-k~ zpFe-TfB!xdX`A0=S_Lvu&|Z3adx5U&RGEASa_^6slam9prHdZE%Zu_?N(uptH+V-u zSy}Ik`Ay@2wfhVE)FDiyVWvvs@00ipRsoX^rd3;$HMVwkm4mB?vp}Q7s>io%DgCb` zzugz~AGK_9TvrFF3WJWT>F=+JuU4aNqSpj?M~j!?`1P$_8na5w&-L{5U?zz{2irQ+ z==RR-eeVE_p$ zBjmV-)HV_p7WOn4r_S^A0JgNoN=t>8k6M-@CUT%^Kf*O!`_3hf9)-dtF9Xc-Za zk&Z%H&V-`ZUxKk$dl{F-H{rcglV%Qq8_)RNoZnJuYBb3H(qg1|2xueaLrbVLts*3- zc~C?H2|!}V%IdeD>WyOnWeT!j4A2`5Krc(87iEC71gw7JSbu?X0V4_kVz43)`1$#T zg&SOUXAIVbsqmr~TPcf&*IQ5b$PlvPnZCp8Tf;?zl(vmPb{|DaUr8o-LkWN$hkLsN z(kK|8<{lAIKI@P6AZ*Y#H6W3BO@CY*Ah;kEDFp3k>-hZ9rE>@5e4U6!qCV1i0^opY zZZX8Hr{@I-e+r4LJeDJ@u8Trh1DTmrm5<;;bOE1aueSVKz?S2(teKp)Ie9t*(+%if z9l^MiqVA5<^-h;va)-6kJ6l`UuKz6i9qV3?kB{d<3Bo1kWqj}eOIrd4pb$eG^1p<4 z8;QxuF)3%=H_M^k>c+png>qX;Mur!s8nzY+l18!WEtzlFjy*5=N*&h$HKusCF2lWX z^6^!}bppKo*%!g0O{v;cw7h(HO2Kbl36b&8>bH1G3p54DZ~8z`YVInw0JiMfc7E!` zp_VTdahHRZxx(#m<#xcW`o~r50Zqx7nb3*PGcz-R?*cL=srT;Bcyyv7W5`bd8FZ`7 zFb4InA)sJP1~s_DVa+k3i4E93eXpaJ6=RcMEQX;v_(v4LAP4|%_7kuA$!!>itb?>X zf2+Hvrv`?AKFAN~-Wzp=Ur`!1Fv`Q*&jM6}In=_w>&EZ$2Eamp{%BTmLfDYd&weu{*hZMK<=DwW-^mv9X+A4oVd1&# z7dTI$9R2;*^(~f-A^04i8!0F$H33q~RpCDuCW*N9ap56MfyK8;XO z1jPv|;;!2_OmBq7CYQxD5Qm&*EM3W$7z`OYun3`fenqPaD4~2=gCjUQS{1x=F&#FO z8=2cUSA+H|`EofbG=J^LeK&B~;$!5!*Undu+edtdLgcA542=CuZ7;2m2e`#+`WRTR zL_=hD(>m6;h(j)~7aOWqi4~~|^~%SsgMSi6MU72gmSN#!PU$LMg|&{z+7Cu;wC$!* z9o<@%-cisw9*YVwRboyUGQU9dO=!PWxVlw4iXs+z*z%fBEtS0{+gW>jv^n(t@fCiL`F5-TdG6;UeX%dT5@xiE$gj-Rn-QJJJYE z--_h~+Ugj{qk#-I0>bG6??J}BzI6M1=gH7fLQ z>%zjz-lATK+HrrRTV?fGOLpt_W%FF@j&g2jx`Fv^ZF9t9mRw}-J@@9?Vo#-cvZRG}aCB4$4bNLl)UKlyj z2JI5WHvnttO}VToggy2kUjhmAJm0R_c0TV6BcAmI>t}4;E)YZ>4`9p^}=_Ou{F6oF16k zF_rMVCFrbj-CtN*GAS7P1Lzo5p-*DE#pgQ5=c?}Qq(DF$!JRuVO%NE&3*a|dhe;Y~ zBH`c9tsl`2oxy1%c74G&czAh!G7A&J+sxzP`Mvg2-xF9E7#MgakDpuG-n8`XuVe71 z2V|Sc5-q$O92|6Xx9W9)<)xUO!llD26y)WHTD8q{32Q*l?dzLr@ez|&tNf{=cGsn7 z81tjV)uZaqXD-UhcyvopGyzXg5a1P??IF*=3lUX$d3n;Wr(lOZCac{tP-ugygFy#C z!OvvVZzj4`6nXM~IV>_VliSdL+`1W-@4b8i z|8p7eduYOr1Y!~c4EGNRh`2(dfybs@W`P~B4j#r%MjMi)nvhUaivo-`?uqW|>}=fc zri6h5;0iED%stRnS--MKcdmOaGDzBscNVM5k!aVZS`mFM~(6cu&%(i zJ|}THT!!42WMTrY3lXAMs+x!Fcu4n0nbH(>0{sJu z52^zB5dSo^&qAe)5^3k7gMI_eAj9>il+SaMqZmE(-rWJ!^uk7LWFDcr&ks+f#?G0i8o1$iify z66HUvyHpzQgy<(249tq#+u7n7{ceRmtO_N;%^hB+B|e5_NLbU%0um+b%VDu?8cW$BE(T9#SYLu0 zn+Q0+z~6FXW`rO2agbdH{3*IiKbOU7OX}hb`b2fKaxh#oA$@%zlX{1!tEu-PBw;Q* zO;MUs#h#(a9BddVQy}o8*Yc|+yWX>8)82O_Y0f4B89Zzz1`!Q<71xJ@K+{g&;4*&j zmsn82uorp4TJ77qFJO~Gz?1ETaZceSuJVbu^_4}EG%Nz zUp+H*grWd76Wc#Gsw@_IOn6wB#Hu1vM8oj9H4N}m^u0^c+H2j9ERBrvlj|=)R(U)5 z?Q&J@x+G0_0#XsG)Yp-=9|*)IR8qi#58uhg-cdKsnp|TZ4?yqn<02>=<$dR1nk1GAvgO|MIB762zT|;hrJiwCN5FYUR|24A(XwgNW z#@^xmxx0{U`aZ2JHlDF<+q@z&cSk~@3xqePaB^iMtSxy(2?+`9A7-R??-qXU;hV4dj8v+2RT<_XSQ891t5dzB22%r z&VV&bAIJaLBel0JgZ_%Y~1B* zJ}Yy=eP}BD{9g<^f+5(T?K=rl1-&qyTYwdO_wF5dZjhUd+Mb7phW=YhP-%THs~ z&A@fRl!SsJJw5#ls!|Gv&hKq!(B!(eok=ap>t1t$fcWvn{kMr~o}MD_xBCzXVUJ^L z!$dVOcY$n&TQOf;T%7*U>h27-=FQX+L;^5Bto%1g2HOGZEmXqfcsGAj%$JNTEKqG9 zUtg?>vAz5_0!$QGUJAQb{OW0Y!$WZ8-MfdE>>)0Un-^)Kbr%&(jUgR|0vWKWRi;uH zkG;%(aSJ3BkWOxDMbA3u504B}FF{*AK@oQMdp z(&kLmJ{NzbQ0tmrc;qfh*J)NgZvCxYa0o1OH#~!gXyM3x*5~>X`Y9ecFDhb<=Laj` zMPA-2ZaunL@AGXKQ{e4(J(_VfhC)!$bUg9g!;y8TD*_$;i$slY;X0r_=xd?*#jIHW zqG5GT=R;`Dz#gd-4K9P%0k=0kO!Pm%;p1Rq+k}Q3LCVDpW2s?a0?_De#;ZO+q69Vl zqfZ{{_`;iBhz~)Ok}{Snfs(zdl}ycRA_p+06q*M}mhIl|+7B2=PC}O3o@iXKM8_v@ZD+#;f<}IRyp4?~lwPO;+WOkh zJWxD&Z~{#K;vg`()l9V@Qr{XG(JKuT_;Jer0vpne@&v8$+Voi`@0rd6+1LgoUGw3> ze&|xId>Cp*Kx9VO9hsgbkIYyXh%W*%5HCTMMgDZ#Q+2SB`k}=y6L20v&y0wOU+BH5th`3~PMk`p=P^}jZhViXgb-8=%L$l+=3 zmg;zf+7M~CZ1 z6+I2Wf08QfVk0Bd4bA{6Dk_{&!mlV2_g2tw)ZT>WGcq&Z6tyQgyC6P>SfiTLO<8XFsTbaXs_{#@Vt6y&!U4LW}jbz$T%aB^G$z~kfN+x%UQT@}4u{FB2al#b0> zN-Z$VE}!-8*?D+j8_U%rD}1u`Dt1sdynu$`Qt^lJo>LTasT4u<#l-X4w?g#9AJ2hMw4EMd{Yl~xZTEEsEIa4-);RODNW5O$Ht#*^ig4@K|Zal?bW%53?2hd^= z5zOJd1cR!PZCz;uXLvrwfcwKS1-~dX=4M_n4n;D`$6``HX}^UgVW4%FNL7^t?VXmB z5Vhxr9n7APf|559KJJ9;4LLnd*z86j z8l(72%cGhrkM_Kg+$?1DeX-{2t6o0YtPcl@$e(g$(iEBhcG2}NMhN$D!2)lA;AL!N z6pTmx0Kr>)3?>ec#eXDo2*XgNtgH;?oPZh6pT&bmssV7}JrP$sm^DVnw}^Rl$(!#Xoz8H>v!hqHs6}Kbg}%F&3u-{EFo= zQ4}CLMb|5)(_-L-bgVnBtgcc<$;9*oAXLzcFY(xB!t(#|uaf&NN27eiI6&>BcC3TH z0f1?wm28*_i{91KlftEc1xg`Ppm=fQ21-;+j2JX?DXC7V%tFpvWTd2zyf6NN;?(Zp zPw)#U)%9YBWW5}%IxX7V@M8wNa)#anLYFm1n3C>~zS6(^w-|$tLuT+FUCu~ML}jLw zQi`MzYX%uDpEa3P4OtJ9L+9I#H25Ql&Esgp2?n4yHS89Pa;7Fop?jm8dX4{}(Q0zT z5egNZsW#Q{=xEMYpQilLu%XB%rlpPNN(2C>QHV-n41^{z{~<+BJ<99nCFHJv^`AX> zU!d|C0&gj{X5pL>0Fn0Wl9CcA6&?P-9ZrQs23kp#hN*hsWB`0R4?VpR%tugeGho>*6=gn1JM0WuWgfrd4{NZU>-}BeFybca@BwD;^w}9H{)C}hOIqSYkxDG zzTWSl0q)1y!JU?t29c%iVh)p4nBVl9VdLS!`hDv%BIh;`H#ax8v)cppF(DygJ~h^k zELi7p^gBT+P+0!EW1kS&cL?8>574?8WTSC#ag!J=VAQ`ffME&19+XoF3`}fn%Eu1x z2Ui1B$<;^}7Z$7qCZT8nd-Ra(g?I!{0=x(p7fc8y*4FHG3GZq_3L6?4`ky6LnKJz7 z0$j5B;^5gIWIFRXQ#wz{V0k zo4R5CthhJ{47CD2;DO;KwR|{0%(A~DV+Yagq^1=9$-glT!$~*;QKU*`)^PPzAA?i+ z81@|)H7hDAj`Ur^}?ZR3qJfIbRi-;+-7}dXJEDdWZ?6^iScu2u2sCpQLO?snb!x@!Yf7*l8 zh3FXZNoEddwV=!PfW=8`fzr_*Ra?(JTH0|x?p7ALZ4?<4YO>$07<&d)0uCmge3=rx zr=p+`KD^H8GBq6Jm=DKZV2Jt!hH62pGQRAf*nI*K8zzV-gfG6T@S$*2u|IWxLM0@r zIu++(h1$UlS(YkjZv+MuX*Ko{^D(H7-CbQDii$`#sO_oHZQ~$gu>5n!Hs?q4c@FQE zJHfu4V*AaxLBbx>c>Rqt+pz*@1Y*X^o>!{qgs5FjsS2KYdfBuXH%DZWJyR`HvTnY- zHh*)3=PM+$hZ)Yn`AR)SKeT>B>Ll?N!eGO{?p_)izhPVxDZ>EgFQ;mn<`~40u`wct z)*Z=?!)fuWrg+#Gi9$_r=L*DQ&%=ey;8YdrP;MOU6#_s1kcV z=9NhG*RQTNQ#-U*3967=9#jtb+;Ng1FyMUYCkl(Q!L#aiFZqu&jgY?xInZ-XMn)+V zEjmm(ex-BIC+s7#Xq|s|W-^3MpI<7x)N?9-=M<68dWD^PUXlOls z3T_-hFcH52ydX0B{2h|zz8l6z_EE=RW*Eq8lin^A8m@{21gxg{}hMgmfpA3S&b3!FO)Hk`7l8MR~ztev)r=;C$Vn^P;0 zfpY*crsIJ40HLmd!1BGnKggwANOF_L3cCqaE4fH9Eq`niU@&Byw)O12zhd=u7BHmT+aP6|@*;)pgMPAW8u!A`tB-af$12@{>;hc}GsVtzxC3&K|cfY|Ef~?VU zwowY97HnNl+X*3JMh2&_PCcIxz=XWIx|$eR=i(x8#X9S8-i-d=uyv52m&t8t20o&HxFyoLe&$HBl(0s4Z1v&j^!4yc=K4fk<(W-(1zqYz2Zq z$Ylpdb`$7QJ}a0U_?31iz5*eC5|Gjj z0r?E-McewBH^h4sy)O#q>=X7B>@90F?MXl zy>sf6)k@Zr#T9*H;5ot|Z34nph&OL)+9aF)0H*4pA(*o#wB?dQ#;blpSVgdun3I0t zad;&)zo!Shu?kqG9ry)cD&QCl_>WXtux(uRMMRys&O0V$<8NBO(N*5g<$yx>lbe!t20oqpn;xC1+dSIEnIK4%(5C4!^GN^lnf=)B$0a41yCSYM_|Nc88`tI}sZqC1C_C>x(HZka0aj!ckm z(@|LQ~Lq(3zp*Y(7F2^A8$dK z-Ebw(Q}@N8-?L)*k@qy6I!vdyHlU-ky0;&EoleMPk-P4#X2mXuG`oC@LEUrMt6FfjivIr-wnqkp$t!gv=+nFMz*&~OU7!>8~5WaQEx z!PZOGTFBLIOZGVb*v8O}!Q)uJ+d1i}XNR4>O<Tg428E!1oI`0|@Rt&w2{E8LcdoDRbrMoZ} zko7!nCSE#v^_T$p1gsB`tU*xsH4wEj5Dx|g-4O{cF;;ekE9|2F&stjr4EN>OwzXnKr6K6;wq8EjPO8X<&@P_YCqr+QUlvO&=25^>)jei zPi?w)hs_b6zsyA_LVKCt&dq<#@foMOa39&l=H)A3D=o-DEwW9EX6-t2hBu{o1?j3!J-||3cadH&wU56gRY1d!Yo%SS)2z-lZ-;cT)6z}5?<@`B z_%FGyqpP}iEz=Ii#Vrg zzI-ggKTQq_jy$SO8@j>g@se(9S{4n#rS|z-u9j!L)09W2Z~IxmZ zDh(JFZ{<70zFf91N`6)4*(K{>V{drO!@VICAP)+4VrFKc!WODWb)?W7G%nk6x5NMR zbjrBnj&tE5Y>FeTI=RY^PkXT|ZT-wHo_%)3j>Q(%QpQKPso?LXTEphqPnQa3yc4A1 z-k6yARCxY@qtoKqt$>eqRUN;p)C?9RCqvq+e4kWl4>62`h2FU#;QRg(+Lolw>syzu z(P_n?Tv@4Yy4kR8Q{+HA2mR%l9O~+9PGc`lwQF^Bzzcuk zjI8r4=`UKv&=NGA!R?nR%wT%`9VAF|sa3=0!VnE+xzTAmpOh3UZ1F+~7}M(=pAd#? zFUDRC`q@7TAPMc%V4jJ$Bq~$k=7ikhxf4cko?rb$R^$;~cdMXao6n9&>#;X^1#~kj z;X6wQN;xPYD@YNVBP>#`*Vi0fU^A(gQFt*h@6Q=6BP+W`bn&**&5X;%gp`>~xwrIH z-Ztro%-Y58#tLV*Z`SDJxWVU`P%|uWe>#7OmdLZ@U+C zbmP+9bW_vXkH?xy7V-KfdjO`r>(+F{q?b! zhthJEDm$j8q^KVrGCluTjxjLWT>`ZzX<*D(!?QJ`4>%AW_LkjkH#Dv&X@|=l35Xp+ zU`(uRXT?8-eHHl$SRkIVj<(_F`Ae6OhvAi$bL|mh8oZY6WhEXwecs z0A5uGqN1WjMOp`)1W_PoWItp{QHeyWD5YD8#tM`4v5FJ8%n9@!>LwBuI_Y`nj@sdi z1J%CSz3Q=h#CBNy{H{0`u8e|22*sL!iL2g#)PX)?Gnr$wTr|Kh_T%ZcFkb&%r};EuVK-DdHzA?o{Np>pKheRmDW;%tKu@`&%bQ&b zEJ84d7njkWSR4TRSRZ&DtuCN;3=a)e{&>AFRzNC8VGEgK;f!~LwElv=uuCVUs^q0@uY8_!A-hyOh zr{mz&1PUJFe>qsXcGta8G*#$#y!-BNoatS{mm?KEwn}u(_a{IwzJm6+-#1oSSqX5D z>-fSMW*#mBya_Fdc(l(vm!DE4kz|l1d;2=>`c$9@9NBL#8<& z|9BmH44&TLjDlJdvm~2+PGHHzONxu%1P<~=))fKkKzCiDv{?4eE3#$pMvvQWhipU^ zm2~s+$e6Wb6SDUO#y*$~)aH)`eLir=;l)VSmxOgc7f3Txf&H9_l1SfH+LM0qqDM(L z@|bWM(FlKPyS6zrRF~Q?`1K6V3Isuk*PN4wL852p=H@Te@AwW%5yHBw%hhldDL?is zx$*k5uZEkO8&UQc%vwc(8lzGUoqYv`Xv2o9#=akJM;t#rOIx zOdnEGxho>?kvB0mwkhFR*pKvWxf7Xw?`xL$$hA&m(`!zsX0SXa(&BCZ`n@2h^Hyo8$Qa7JPQHFI#k2z%N!T8w*2V4|IA9_M?YAXBRX#Zr0Y;m<40`mZ8_% z=Uefy4{0dJ{G~ zD1~Kpz=q%XmjjVHbOPR~k&7Wy{jvDkKIrILCp6QQ*R1)BBT0>lV^W~sIoPXlC2}TD zzEZwt_N`yDp@|7WGXkwzWcvQExz?;5t>xo%gJ^7}&<{1-OTa6yhX<7#54$s<#0hk^nn`(KyW;HJ!(zXbCR-ANq6rZ z@9hjG5&#os|=4Ycf#4Z>+{hl$CWeMn zFIOzoc-Zsv@Eq4p5WO;-k#7Rg=$aqu+j%NYJF8#LReuXO>eer_@Ylniy{i~ZX%fWb zcG#W{4rxpU&@!k2M?p-uJWxFoos*mU9^m}YkcI@miUcL5{MhF-1qP^&Z8kO+?n6uf z$px@CL>UZz4X3j2J}Cx*X&0Uuual3W!g5C5fE=PLMICy(FdyLH;NauqgGWzY18pzJ zEF0k!ZCUru?e#*+ONj1UR4hn4%FuJ*QhELP2Zn%)#7sdwpkC@pLzvciPNT_-x zN|TgRfKs=#&}pVXTkHF!Lk(D`ZY72XG*1O=Ma`cY$uA_#C*U!PdOo8qGvBf$;@V1; zOHecKMyQpQFtsn1sqlYtFTUs2{^4F0JtO6R2bZFP7r9r-cKNmwbGFRm`d>SA>~ zJU!v}c$Z&TZJmBGDiP>Pu{0HBqc#QkPMCL-9>KtH1-MbR9BkQfb8oXOJWo^p{ zKS!rnUX=SdwnUP0C+bwr>pWiHao-X)NOX!PGKITB?;I2Xn;D!wos5B$|xEFV9rs~ao??C0iR(FBy zwODDFQZlHo+I4j;C;K%1A(L)y8vPnbqJmZ;yaL(4m&Dh*H&q5rNG}+pcZ3&m8dNz# z_-K~q!0#Xj$#|`@)6%jHO;4`*W!u1JQ>u|voCWaQKwDc;j`f_!JrWUY(~Tkl3RO+I zct|#EYj0hAfz6F}7%*UxSYd{oDn581UPB3s$h_K~P%I#nRU@$q3_m|V*l{r#Kpdk( zbq6Aj^C3;-9-z7j(kOM-A3%FTK}R(#d0+cS3}!_YnCrg%TOVeE>FLcYnF%7 zd+1dW>;92nT`b>xCzdTvZBNjN6qf%e61P#=H?N{Ypf(xGKVmM1C4lAp!l7qw(V0-A z?yrkjgt5xbDG>tSX*?$$ptD8tFT2|VfR4pLcZ1f$67uXBP;Y9+m%MM=Nvm<|Txor{ zCd>2VfJXfN$TXTmI%#L#sd|?mSJO0j<*jw{8(dY*gSD4i3H#CZ`*G4rFwRQybJ01t z{i7px;S{$$DZ+#OCf0tn#8>PcP&r)qI56RY#+lxI58m{p*toRjKCio`km?Y9E~WAQ z-6AFP4wb?k>=#*cSR=Zkqw{rqXLSEF<5FA5j?(o#GhX;=Ue;Z^Jb)1k=1m2cnzH{F z@zz;;hBq!1IbG5LFU)G&js6Lqgr<&t>x+|Rn_q~7wL?JLe^G45vJ=A}i@tl0wr05F;IBpgPo-ZSKMTWw`(h6k#Vf^oC zkwnrpWR|YV`yd!qe4)ZS=&yPAoQRu=w_sjNm@jj3OHK(vG=V|ikvC-r8 zQ^`u~!w<;3Pgaxu`4$&T6D#4PPN!jT@{)ddhRjx84{7EM|7K)}W(V4jsTdoPZae&S zH72dn{P#O38NmP<`U}zhE&A^0LnAq&c?2@C;S$~MzEM%QbUyP(j4>sKwTF~t zp2(CLYir>!h+{C?V@kyxQtDi!DKB@(osP-zZZgU1T4tCiLmgA;i}&cpBJJ6;nMb6l z7cebCzhnwu=AR7Gf5+`^e-E_|#^H`yhG*Qd2FctWss&%(9-t<;Da6*h$4Qe;W-#rO z6ut|UYr)-pp5DUb?^3UG}vQ^Gu=z%tV=6#`=Z5pSg%Qp0p z*tfUmmrl7}+4dg89q@=-9UqxYCd5TxbKQ6-5xYFAxUY98=fMa0`WbOd}hTJis9QvQ1&t~OO=j>X#Wq}gneoLLe_$+W9X zUfRgmn2v{i%%Z)%KlF%HNF!mgmtB8TnAXt9x1C?uf{7ekhL*KI5x><M8p&p-YShVcMq5}*v)t=omKr+v|Gtv@baRGAs(=4?Rj z)MXuAOJbvP{CKpSh4>&A%k7i7set4^S?JASh60R*qWc170+47Mz1sAXJ-TdSClA{v zcYT_SBHPtlI2DTMK9I4T4-=yC$VmVSaayo&YT!h~q~FW3HYk@oCBFqM&yq7sxTC4| z$j>%^66ujqiGX7;BtrN4H+pm*_#aUAFeLqWvFp%N#HaQ@h=zy)h*MM|l$XXPCIaHB zq;HK0h!2By10p{nQV@G`*EL!+3@Efx7o;Q+IRLG#P}q!u56VbS*Fn~3#(M}yJK^ws z_1;z4+G%nZ8DIK((Klcv9Vc*SF~U$(%#yt4?*tGeRg>4|zCxoC+9IpqbRtelqxWX0j_$z{~kalMMgXDLCCc(KmCD_LS!>yxplLvn~Nn7-~zAV zB**D8mM`=N_4O;vWHc1O_4{Kyh1PQZH*FU&ru{8YzpPm*Y<7v1)PkwrkOnve`($9E zMpn=}TM2{oEk+hISgL7fyp%M?c4Eje*r6%(C`J?m6jv5KDw}b{~NTCK1i%;?<^w)vIdlj8H8t3fU~@V@Kdq@2?F9&^8v67P&Nu&+Y&E=W_QM!gTBnc_i#39Yut zd-pZ)j4>e%iHo0rlp`J< zo(Nglu(8Kx1Uy5ov=LLepbk%*NfBq7d&WYtg+129$?T;|@c}ivcF#cw+3w&R^q4 zT0fcwNM+ZGs`M;;b0n{xMs0*c)*Emj3>HwS=p*boSu0{TTK{dj2EEI1YD;cM-v*>g zF-DYZkKVgElFoHrqFo^G5+|;C;%be4d!y0AOqnnApad5^9X^h-xa9fSdaI zqDNaVC{UZ%gFzgK7v4vg??9o1X8>Z?hIPK3p7DpWfTq@5yeajN^K$Tx$ T@A`L$xMwjl+GbclbBXvLPlWqV literal 25901 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 A+5i9m diff --git a/doc/doxygen/grid.dox b/doc/doxygen/grid.dox index 36e09d3f8..07c6f5122 100644 --- a/doc/doxygen/grid.dox +++ b/doc/doxygen/grid.dox @@ -3,10 +3,10 @@ \section GRIDgeneral General Information The GRID class represents structured meshes in the MEDMEM library. -As the GRID class inherits from MESH, all of the functionalities that were -described in the previous section apply for structured mesh GRID objects. -In particular, reading and writing from files, general information access -are similar. However, because of the particular nature of structured meshes, +The GRID class inherits mesh common information from GMESH class, +in particular, reading and writing from files (c.f. \ref MESH_io), general information +access (c.f. \ref MESH_general), +access to families and other supports (c.f. \ref MESH_families). However, because of the particular nature of structured meshes, there exist methods to access information related to the axes of the grid. The numbering of the cells and nodes in a grid starts at one and @@ -17,5 +17,8 @@ of the last axis (c.f. figure \ref fig_grid_connectivity} ). \section grid_outline Outline -Constructors are defined in \ref GRID_constructors, methods related to axes are defined in \ref GRID_axes, while connectivity methods are given in \ref GRID_connectivity. +Constructors are defined in \ref GRID_constructors, methods related to +axes are defined in \ref GRID_axes, while connectivity methods are +given in \ref GRID_connectivity. A structured mesh can be obtained from +a GRID using MEDMEM::GRID::convertInMESH() method. */ diff --git a/doc/doxygen/interpkernel.dox b/doc/doxygen/interpkernel.dox index bfed9661f..71db3faad 100644 --- a/doc/doxygen/interpkernel.dox +++ b/doc/doxygen/interpkernel.dox @@ -1,170 +1,46 @@ /*! -\page interpkernel Interpolation kernel toolkit +\page interpkernel Interpolation tools \section InterpKerIntro Introduction The main purpose of this module is to propose a set of algorithms for -mesh interpolation \b fully \b independant \b of \b mesh \b datastructure to +mesh interpolation \b fully \b independant \b of \b the \b mesh \b datastructure to support several type of format. This component is parameterized as much as possible using C++ templates. For the moment only interpolators for unstructured meshes are present in -%interpolation kernel. - -\section InterpKerTheory Theory of interpolation - -\subsection InterpKerPerfOverl Mesh overlapping - -When interpolation is performed between a source mesh S and a target -mesh T the aspect of overlapping is important. In fact if any cell of -of S is fully overlapped by cells of T and inversely any cell of T is -fully overlapped by cells of S the meshes S and T are said \b -coincidant and some general formulae in next sub section are simpler. -As far as possible in the next sub sections the formulae for -coincidant and non-coincidant meshes will be given. - -\subsection InterpKerRemapGlobal Global conservative remapping - -For fields with polynomial representation on each cell, the components of the discretized field \f$ \phi_s \f$ on the source side can be expressed as linear combinations of the components of the discretized field \f$ \phi_t \f$ on the target side, in terms of a matrix-vector product : - -\f[ - \phi_t=W.\phi_s. -\f] - -All the aim of interpolators is to compute W depending on a physical -quantities and the type of interpolation wanted (P0, P1, P1d etc...). - -For the \b intensive \b field \f$ \phi \f$ from the -source mesh \f$ S \f$ to the target mesh \f$ T \f$ the interpolation should preserve the -integral of \f$ \phi \f$ on any domain. At the discrete level, for any -target cell \f$ T_i \f$, the following \b general \b interpolation \b -equation \anchor InterpKerGenralEq has to -be always verified : - -\f[ -\int_{T_i} \phi = \sum_{S_j\cap T_i \neq \emptyset} \int_{T_i\cap S_j} \phi. -\f] - -To compute \f$ W_{ij} \f$ -this equation is used. The evaluation of integrals depends on the source and target meshes and on the nature of interpolation chosen : P0, P1, P1d etc... For the moment it is only possible to -remap fields with P0 representations. - -\subsection InterpKerRemapInt Conservative remapping of intensive physical quantities - -At the basis of many CFD numerical schemes is the fact that physical -quantities such as density, momentum per unit volume or energy per -unit volume obey some balance laws that should be preserved at the -discrete level on every cell. This property is critical for example to -accurately capture shockwaves. - -\subsection InterpKerP0P0Int cell-cell (P0->P0) conservative remapping of intensive physical quantities - -In the \ref InterpKerGenralEq "general interpolation equation" the -left hand side becomes : - -\f[ -\int_{T_i} \phi = (\sum_{S_j} Vol(T_i\cap S_j)).\phi_{T_i}. -\f] - -\note \f$ \sum_{S_j} Vol(T_i\cap S_j) = Vol(T_i) \f$ \ref InterpKerPerfOverl "in case of perfect overlapping". - -In the \ref InterpKerGenralEq "general interpolation equation" the -right hand side becomes : - -\f[ -\sum_{S_j\cap T_i \neq \emptyset} \int_{T_i\cap S_j} \phi = \sum_{S_j\cap T_i \neq \emptyset} {Vol(T_i\cap S_j)}.\phi_{S_j}. -\f] - -In the case where the \b intensive field values are constant on each -cell, the coefficients of the linear remapping matrix \f$ W \f$ are -given by the formula : - -\f[ - W_{ij}=\frac{Vol(T_i\cap S_j)}{ \sum_{S_j} Vol(T_i\cap S_j) }. -\f] - -and \ref InterpKerPerfOverl "in case of perfect overlapping" : - -\f[ - W_{ij}=\frac{Vol(T_i\cap S_j)}{ Vol(T_i) }. -\f] - -Where Vol represents the volume with mesh dimension of interpolation equals to 3, the -area when mesh dimension equals to 2, and length when mesh dimension equals to 1. - -\subsection InterpKerRemapExt Conservative remapping of extensive physical quantities - -In code coupling from neutronics to hydraulic code \b extensive field -of power is exchanged and the all power as to be kept the same. The -principle is to 'intensify' the field to move on from extensive field -\e P to an intensive one \f$ \phi \f$. - -\subsection InterpKerP0P0Ext cell-cell (P0->P0) conservative remapping of extensive physical quantities - -In the \ref InterpKerGenralEq "general interpolation equation" the -left hand side becomes : - -\f[ -\int_{T_i} \phi = P_{T_i}. -\f] - -In the \ref InterpKerGenralEq "general interpolation equation" the -right hand side becomes : - -\f[ -\sum_{S_j\cap T_i \neq \emptyset} \int_{T_i\cap S_j} \phi = -\sum_{S_j\cap T_i \neq \emptyset} \frac{Vol(T_i\cap S_j)}{\sum_{T_i} Vol(T_i \cap S_j)}.P_{S_j}. -\f] - -\note \f$ \sum_{T_i} Vol(T_i \cap S_j) = Vol(S_j) \f$ \ref InterpKerPerfOverl "in case of perfect overlapping". - -In the case where the \b extensive field values are constant on each -cell, the coefficients of the linear remapping matrix \f$ W \f$ are -given by the formula : - -\f[ - W_{ij}=\frac{Vol(T_i\cap S_j)}{ \sum_{T_i} Vol(T_i \cap S_j) }. -\f] - -and \ref InterpKerPerfOverl "in case of perfect overlapping" : - -\f[ - W_{ij}=\frac{Vol(T_i\cap S_j)}{ Vol(S_j) }. -\f] +the %interpolation kernel. \section InterpKerMainArchitecture Main architecture of interpolation kernel. -In %interpolation kernel, the algorithm that computes \f$ W_{ij} \f$ given cell i -in source mesh and cell j in target mesh is called intersector. +In the %interpolation kernel, algorithms that computes the intersection \f$ T_i\cap S_j\f$ given the locations and geometries of source cell \f$ S_j \f$ +and target cell \f$ T_i \f$ are called \ref InterpKerIntersectors. -As seen in \ref InterpKerTheory "the theory of interpolation", for all interpolation the aim is to -fill the W matrix (which is generally a sparse matrix). Fundamatally for each pair (i,j) \f$ W_{ij} \f$ is obtained -by calling each time the wanted intersector. The problem is that each call to algorithm +As can be seen in \ref InterpKerTheory "the theory of interpolation", all the proposed interpolators aim at +filling the interpolation matrix W (which is generally sparse). For each pair (i,j), \f$ W_{ij} \f$ is obtained +by calling the desired intersector. The problem is that each call to this algorithm is CPU-expensive. -To reduce the computation time a first filtering is done to found a -maximim of (i,j) pairs where \f$ W_{ij} \f$ is obviously equal to 0. Typically it -is the case when a cell in source mesh is too far from an another cell -in target mesh each other. +To reduce the computational time, a first filtering is done to detect +pairs (i,j) \f$ W_{ij} \f$ is obviously equal to 0. It is typically the case when a cell in the source mesh +is too far from an another cell in the target mesh each. So for a given type of interpolation, the computation of W is performed in two steps : -# A filtering process reduces the number of pairs of elements for which the calculation must be carried out by - eliminating pairs that do not intersect through a comparison of - their bounding boxes. It reduces as much as possible call to intersector. + eliminating the pairs whose bounding boxes do not intersect. -# For all remaining pairs calling for each intersector (see \ref interpolation2D, \ref interpolation3Dsurf or \ref interpolation3D). -Each interpolator inherits from INTERP_KERNEL::Interpolation ( whatever -its dimension and its type ) that is a -CRTP class in order to clearly see the main API without useless CPU cost. +Whatever its dimension and type, each interpolator inherits from INTERP_KERNEL::Interpolation which is a +template (CRTP) class than enable an easy access to the main API without useless CPU cost. \subsection InterpKerMeshType class MeshType Each Interpolators and Intersectors are parameterized (templated in C++ langage) with \c class \c MeshType . This type of generalization has been chosen to reduce at maximum overhead. \n -Thanks to this principle \b intersectors \b and \b interpolators \b are \b usable -\b with \b several \b formats \b without \b preformance \b loss. For example MED, VTK...\n +Thanks to this principle intersectors and interpolators are usable +with \bseveral \b mesh \b formats such as \c MED or \c VTK, \b without \b preformance \b loss. \c MeshType is a concept that should strictly fulfilled the following rules : @@ -185,40 +61,37 @@ rules : -# \code void releaseTempArrays() \endcode - Formats of arrays - the array returned by \c getCoordinatesPtr must be a \b full \b interlace array. - - the arrays returned by \c getConnectivityPtr and \c - - getConnectivityIndexPtr must be with the same principle as it is in \ref medmemConnArrays "medmem". Of course the numbering format may change according to \a My_numPol policy. + - the arrays returned by \c getConnectivityPtr and \c getConnectivityIndexPtr must be with the same principle as it is in \ref medmemConnArrays "medmem". Of course the numbering format may change according to \a My_numPol policy. -\note The arrays formats of connectivity is kept close to MED. It is -close to VTK too but slightly different. So it needs VTK side a copy -on wrap. To avoid this copy of a part of connectivity structure, iterator should be used. +Note that the array format for connectivity is kept close to MED. It is +close to VTK format too but slightly different. So it may require for the VTK side a copy +on wrap. To avoid this copy of a part of the connectivity structure, an iterator should be used. \subsection InterpKerMatrixType class MatrixType As already said, the matrix returned by interpolator is typically a sparse matrix. Instances of -\c class \c MatrixType are used to stores these results of -interpolation. To be able to be filled by the interpolator the \c MatrixType class has to match the following concept : +\c class \c MatrixType are used to store the resulting interpolation matrix. To be able to be filled by the interpolator the \c MatrixType class has to match the following concept : - Methods -# \code void resize(uint nbrows) \endcode -# \code Row &operator [] (uint irow) \endcode -\c class \c Row has to match at least following concept : +\c class \c Row has to match at least the following concept : - Methods - \code void insert(const std::pair& myPair) \endcode -\note \c std::vector\c < \c std::map > is a candidate for +Note that \c std::vector\c < \c std::map > is a candidate for \c MatrixType. -\section InterpKerGenUsage Usage of interpolation kernel. +\section InterpKerGenUsage Usage of interpolation tools: the REMAPPER classes. \subsection InterpKerHighLevUsage high-level usage -The simplest mode of usage of interpolator in sequential mode is to use REMAPPER classes. These classes fulfill HXX2SALOME rules to allow the user to use it -in coupling graphs. 2 REMAPPERS exist, ParaMEDMEM::MEDCouplingRemapper and Remapper. These classes are strongly linked to their corresponding data structure, respectively -MEDCoupling and MEDMEM. In return, all interpolation request and spare interpolation matrix are hidden from you. Here two examples of REMAPPER classes : +The simplest way of using the interpolation tools is in sequential mode to use the REMAPPER classes. These classes fulfill \c HXX2SALOME rules and may be used +in coupling graphs. Two sequential REMAPPERS exist, \c ParaMEDMEM::MEDCouplingRemapper and \ref medmemremapper . These classes are strongly linked to their corresponding data structure, respectively \ref medcoupling and \ref MEDMEM. -- If you intend to use MEDCoupling data struture, ParaMEDMEM::MEDCouplingRemapper class should be used : +- If you intend to use \ref MEDCoupling data struture, ParaMEDMEM::MEDCouplingRemapper class should be used : \code ... @@ -240,7 +113,7 @@ sourceField->decrRef(); med_target_mesh->decrRef(); \endcode -- If you intend to use MEDMEM data structure, Remapper class should be used : +- If you intend to use \ref MEDMEM data structure, \c medmemremapper class should be used : \code ... @@ -251,7 +124,7 @@ MEDMEM::MESH med_target_mesh(MED_DRIVER,targetFileName,"Target_Mesh"); FIELD sourceField(MED_DRIVER,sourceFileName,"Density",0,0); FIELD targetField; Remapper mapper; -mapper.prepare(med_source_mesh,med_target_mesh); +mapper.prepare(med_source_mesh,med_target_mesh,"P0P1"); mapper.transfer(sourceField,targetField); //use targetField ... @@ -342,4 +215,122 @@ readerTarget->Delete(); ... \endcode +\section InterpKerTheory Theory of conservative interpolation + +At the basis of many CFD numerical schemes is the fact that physical +quantities such as density, momentum per unit volume or energy per +unit volume obey some balance laws that should be preserved at the +discrete level on every cell. This property is critical for example to +accurately capture shockwaves. + +\subsection InterpKerPerfOverl Mesh overlapping + +When interpolation is performed between a source mesh S and a target +mesh T the aspect of overlapping is important. In fact if any cell of +of S is fully overlapped by cells of T and inversely any cell of T is +fully overlapped by cells of S the meshes S and T are said to be \b +coincident and some general formulae in next sub section are simpler. +As far as possible in the next sub sections the formulae for +coincident and non-coincident meshes will be given. + +\subsection InterpKerRemapGlobal Linear conservative remapping + +For fields with polynomial representation on each cell, the components of the discretized field \f$ \phi_s \f$ on the source side can be expressed as linear combinations of the components of the discretized field \f$ \phi_t \f$ on the target side, in terms of a matrix-vector product : + +\f[ + \phi_t=W.\phi_s. +\f] + +The objectives of interpolators is to compute the matrix W depending on their physical +properties (intensive or extensive field) and their mesh discretisation (P0, P1,...). + +It is often desired that the process interpolation preserve the +integral of \f$ \phi \f$ on any domain. At the discrete level, for any +target cell \f$ T_i \f$, the following \b general \b interpolation \b +equation \anchor InterpKerGenralEq has to +be always verified : + +\f[ +\int_{T_i} \phi = \sum_{S_j\cap T_i \neq \emptyset} \int_{T_i\cap S_j} \phi. +\f] + +This equation is used to compute \f$ W_{ij} \f$, based on the fields representation ( P0, P1, P1d etc..) and the +geometry of source and target mesh cells. : + +\subsection InterpKerRemapInt Conservative remapping of P0 (cell based) fields + +We assume that the field is represented by a vector with a discrete value on each cell. +This value can represent either +- an average value of the field in the cell (average density, velocity or temperature in the cell) in which case the representation is said to be \b intensive, +- an integrated value over the cell (total mass, power of the cell) in which case the representation is said to be \b extensive + +\subsection InterpKerP0P0Int cell-cell (P0->P0) conservative remapping of intensive fields + +In the \ref InterpKerGenralEq "general interpolation equation" the +left hand side becomes : + +\f[ +\int_{T_i} \phi = (\sum_{S_j} Vol(T_i\cap S_j)).\phi_{T_i}. +\f] + +Here Vol represents the volume when the mesh dimension is equal to 3, the +area when mesh dimension is equal to 2, and length when mesh dimension is equal to 1. + +Note that \f$ \sum_{S_j} Vol(T_i\cap S_j) = Vol(T_i) \f$ \ref InterpKerPerfOverl "in case of perfect overlapping". + +In the \ref InterpKerGenralEq "general interpolation equation" the +right hand side becomes : + +\f[ +\sum_{S_j\cap T_i \neq \emptyset} \int_{T_i\cap S_j} \phi = \sum_{S_j\cap T_i \neq \emptyset} {Vol(T_i\cap S_j)}.\phi_{S_j}. +\f] + +As the field values are constant on each +cell, the coefficients of the linear remapping matrix \f$ W \f$ are +given by the formula : + +\f[ + W_{ij}=\frac{Vol(T_i\cap S_j)}{ \sum_{S_j} Vol(T_i\cap S_j) }. +\f] + +and \ref InterpKerPerfOverl "in case of perfect overlapping" : + +\f[ + W_{ij}=\frac{Vol(T_i\cap S_j)}{ Vol(T_i) }. +\f] + +\subsection InterpKerP0P0Ext cell-cell (P0->P0) conservative remapping of extensive physical quantities + +In code coupling from neutronics to hydraulics, \b extensive field +of power is exchanged and the total power should remain the same. +The discrete values of the field represent the total power contained in the cell. +Hence in the \ref InterpKerGenralEq "general interpolation equation" the +left hand side becomes : + +\f[ +\int_{T_i} \phi = P_{T_i}, +\f] + +while the right hand side is now : + +\f[ +\sum_{S_j\cap T_i \neq \emptyset} \int_{T_i\cap S_j} \phi = +\sum_{S_j\cap T_i \neq \emptyset} \frac{Vol(T_i\cap S_j)}{\sum_{T_i} Vol(T_i \cap S_j)}.P_{S_j}. +\f] + +Note \f$ \sum_{T_i} Vol(T_i \cap S_j) = Vol(S_j) \f$ \ref InterpKerPerfOverl "in case of perfect overlapping". + +The coefficients of the linear remapping matrix \f$ W \f$ are then +given by the formula : + +\f[ + W_{ij}=\frac{Vol(T_i\cap S_j)}{ \sum_{T_i} Vol(T_i \cap S_j) }. +\f] + +and \ref InterpKerPerfOverl "in case of perfect overlapping" : + +\f[ + W_{ij}=\frac{Vol(T_i\cap S_j)}{ Vol(S_j) }. +\f] + */ diff --git a/doc/doxygen/main.dox b/doc/doxygen/main.dox index d7e4c3893..cbc0828d7 100644 --- a/doc/doxygen/main.dox +++ b/doc/doxygen/main.dox @@ -13,14 +13,13 @@ to suit the needs of its user. Instructions for configuring and installing the l \section outline Outline This user guide contains three different chapters that covers the core %MEDMEM library, the %ParaMEDMEM library and the %MEDSPLITTER tool: -- Chapter \ref medmem covers the %MEDMEM core library, i.e. the implementation of meshes, supports and fields and the associated drivers (for MED-file, VTK, GIBI). -- Chapter \ref interpkernel describes the interpolation and -localization library. - Chapter \ref medcoupling describes DataStructures used for cross process exchange of meshes and fields. - Chapter \ref paramedmem describes its MPI implementation, which is called %ParaMEDMEM. - Chapter \ref medloader describes API for I/O from or to a MED file coming from a \ref medcoupling data structure. +- Chapter \ref interpkernel describes the interpolation and localization library. +- Chapter \ref medmem covers the %MEDMEM core library, i.e. the implementation of meshes, supports and fields and the associated drivers (for MED-file, VTK, GIBI). - Chapter \ref tools describes various tools based on MEDMEM that can be helpful for handling MED files (conversion tools and splitting tools). diff --git a/doc/doxygen/medcoupling.dox b/doc/doxygen/medcoupling.dox index cd5fdb3d1..82c97d29d 100644 --- a/doc/doxygen/medcoupling.dox +++ b/doc/doxygen/medcoupling.dox @@ -20,77 +20,23 @@ developped to be compatible with HPC constraints (compact structures, limitation of copies and launching of CPU consuming algorithms only when absolutely needed ). -\section MEDCouplingMainConc Main Concepts - -- \ref MEDCouplingMeshesP "Meshes" -- \ref MEDCouplingFieldsP "Fields" - -\section MEDCouplingFirstSteps1 Building an array from scratch - -All of exemples given here make the assumption that the \c ParaMEDMEM -namespace is visible ( by calling for example \c using \c -namespace \c ParaMEDMEM; ). - -Here a description of typical usages to use MEDCoupling arrays. -In this example we will create arrays with 12 tuples constituted each -of 3 components. These arrays will be created using different ways. +\section MEDCouplingMainBasics Basics -\code +One of the most basic concept mainly used all over MEDCoupling is +MEDCoupling array. This concept is used all over +MEDCoupling/ParaMEDMEM/MEDLoader modules so it should be correctly +handled to play well with \ref MEDCouplingMeshesP "Meshes" and \ref MEDCouplingFieldsP "Fields". -const int nbOfNodes=12; -double coords[3*nbOfNodes]={ ... }; +It exists two type of arrays : + - double precision float array incarnated by ParaMEDMEM::DataArrayDouble class. + - integer array incarnated by ParaMEDMEM::DataArrayInt class. -DataArrayDouble *myCoords=0; -double *tmp=0; -\endcode +To know more about arrays \ref MEDCouplingArrayPage "click here for arrays documentation". -- no copy no ownership -\code -myCoords=DataArrayDouble::New(); -myCoords->useArray(coords,false,CPP_DEALLOC,nbOfNodes,3); -//now use myCoords as you need -... -//myCoords is no more usefully here : release it -myCoords->decrRef(); -\endcode - - -- no copy and ownership C++ -\code -myCoords=DataArrayDouble::New(); -tmp=new double[3*nbOfNodes]; -std::copy(coords,coords+3*nbOfNodes,tmp); -myCoords->useArray(tmp,true,CPP_DEALLOC,nbOfNodes,3); -//now use myCoords as you need -... -//myCoords is no more usefully, release it -myCoords->decrRef(); -\endcode - -- no copy and ownership C -\code -myCoords=DataArrayDouble::New(); -tmp=(double *)malloc(3*nbOfNodes*sizeof(double)); -std::copy(coords,coords+3*nbOfNodes,tmp); -myCoords->useArray(tmp,true,C_DEALLOC,nbOfNodes,3); -//now use myCoords as you need -... -//myCoords is no more usefully here : release it -myCoords->decrRef(); -\endcode +\section MEDCouplingMainConc Main Concepts -- copy -\code -myCoords=DataArrayDouble::New(); -myCoords->alloc(nbOfNodes,3); -tmp=myCoords->getPointer(); -std::copy(coords,coords+3*nbOfNodes,tmp); -myCoords->declareAsNew();//you have modified data pointed by internal pointer notify object -//now use myCoords as you need -... -//myCoords is no more usefully here : release it -myCoords->decrRef(); -\endcode +- \ref MEDCouplingMeshesP "Meshes" +- \ref MEDCouplingFieldsP "Fields" \section MEDCouplingFirstSteps2 Building unstructured mesh from scratch @@ -251,7 +197,21 @@ A mesh has a the following properties : mesh have the same dimension) - a space dimension (relative to coordinates) - a number of nodes -- a number of cells +- a number of cells + +In MEDCoupling library there is no presence of faces nor edges. + +As a mesh has one dimension and only once, that is to say every cells in +mesh have the same dimension called MeshDimension. + +That is to say the +MEDMEM vocabulary of faces and edges \b do \b not \b exist \b anymore here in +MEDCoupling. + +For exemple a mesh with a meshDimension equal to 1, have \b cells of type +NORM_SEG2. An another exemple, a mesh with a meshDimension equal +to 2, have \b cells of type +NORM_TRI3 and NORM_POLYGON for example. The class that incarnates the concept described above is : \ref ParaMEDMEM::MEDCouplingMesh. @@ -276,7 +236,7 @@ used by MEDCoupling to instanciate degenerated meshes as : represent fields used by system code. This type of mesh will have mesh dimension equal to -1. -The norm used for cells connectivity of different types, is the same as specified in MED file execpt +The norm used for cells connectivity of different types, is the same as specified in MED file except that connectivities are in represented in \b C \b format and \b not \b in \b FORTRAN \b format ! @@ -409,3 +369,190 @@ The most important methods are : - \ref ParaMEDMEM::MEDCouplingTimeDiscretization::getValueForTime "getValueForTime" */ + +/*! +\page MEDCouplingArrayPage MEDCoupling Arrays + +\section MEDCouplingArrayIntro Introduction + +This page will try to describe data arrays in MEDCoupling. Presently, +in MEDCoupling it exists two types of arrays : + +- double precision array incarnated by ParaMEDMEM::DataArrayDouble class. +- signed integer (32 bits) array incarnated by ParaMEDMEM::DataArrayInt class. + +\section MEDCouplingArrayBasics Basics concepts + +It will be presented in this section common concept shared by the two classes to \ref ParaMEDMEM::DataArrayDouble "DataArrayDouble" and \ref ParaMEDMEM::DataArrayInt "DataArrayInt". + +- The first thing is that an array has a name (stored as a C++ string). This name is often ignored in MEDCoupling algorithm when arrays are aggregated (field array, connectivity, coordinates). + The reason is that name is stored by the aggregating object. + But it can be very usefull for arrays not aggregated in bigger MEDCoupling object for groups ids and families ids for example. + +- The second thing is the data storage. For obvious reason, MEDCoupling DataArray stores data in a contiguous way in memory like \c std::vector does.\n + +- The third thing is linked to previous point. Data arrays are able to store vectorized data. It is usefull to store the data of a vectorial field. That's why MEDCoupling arrays uses the concepts + of components. To store an array for a vector field on cell with 3 components lying on a mesh having 5 cells. The array will contain 5*3=15 values grouped by 3. + The 5 groups containing each 3 elements are called \b tuples.\n \b Number \b of \b values \b stored \b in \b an \b array \b is \b equal \b to \b number \b of \b tuples + \b multiplied \b by \b number \b of \b components. \n + Generally speaking, except for vector field arrays, and array for nodes coordinates, the number of components is equal to one. + +- The fourth thing is linked to point 2 and 3 as MEDCoupling is developped in C++ the values of arrays are stored tuples by tuples, that is to say in full interlace mode.\n + That is to say, the 15 values in the example in point 3 will be stored like this :\n + \f$ x_0,y_0,z_0,x_1,y_1,z_1,x_2,y_2,z_2,x_3,y_3,z_3,x_4,y_4,z_4 \f$ where x stands for component #0, y for component #1 and z for component #2 + As consequence \b all \b algorithms \b in \b ParaMEDMEM \b are \b working \b in \b full \b interlace \b mode. + +- The fifth thing is that each components of an array has info stored in a string. If a unit is desired to be added on components the following convention should be used "MY_COMPO_INFO [MYUNIT]".\n + Unit should be put between "[" and "]" after info and one space character. + +- The sixth thing is that MEDCoupling arrays inherits from \ref ParaMEDMEM::TimeLabel "TimeLabel" class. It means that the time stamp attached to array indicates if yes or no the array has been modified. + In C++ if the access of data is direct using non const \c getPointer method it is the reponsability to the use to notify the possible modification. + Inversely if setIJ method is used to modify an array, take care of the fact that the time stamp of the array is modified on each call to setIJ. If huge amount of call to setIJ is required it + is better to use setIJSilent instead and call notifyNew right after instead. + + +\section MEDCouplingArraySteps0 Building an array from scratch in Python + +\verbatim +arrayDouble=DataArrayDouble.New(); +dataDouble=[0.,10.,20.,1.,11.,21.,2.,12.,22.,3.,13.,23.,4.,14.,24.] +arrayDouble.setValues(dataDouble,5,3);# 5 tuples containing each 3 components +##### +arrayInt=DataArrayInt.New(); +dataInt=[0, 10, 20, 1, 11, 21, 2, 12, 22, 3, 13, 23, 4, 14, 24] +arrayInt.setValues(dataInt,5,3);# 5 tuples containing each 3 components +\endverbatim + +\section MEDCouplingArraySteps1 Building an array from scratch in C++ + +All of exemples given here make the assumption that the \c ParaMEDMEM +namespace is visible ( by calling for example \c using \c +namespace \c ParaMEDMEM; ). + +Here a description of typical usages to use \ref ParaMEDMEM::DataArrayDouble "MEDCoupling arrays".\n +In this example we will create arrays with 12 tuples constituted each +of 3 components. These arrays will be created using different ways.\n + +The following code is only based using \ref ParaMEDMEM::DataArrayDouble "DataArrayDouble" +but the use of \ref ParaMEDMEM::DataArrayInt "DataArrayInt" is strictly equivalent. + +\code + +const int nbOfNodes=12; +double coords[3*nbOfNodes]={ ... }; + +DataArrayDouble *myCoords=0; +double *tmp=0; +\endcode + +- no copy no ownership +\code +myCoords=DataArrayDouble::New(); +myCoords->useArray(coords,false,CPP_DEALLOC,nbOfNodes,3); +//now use myCoords as you need +... +//myCoords is no more usefully here : release it +myCoords->decrRef(); +\endcode + + +- no copy and ownership C++ +\code +myCoords=DataArrayDouble::New(); +tmp=new double[3*nbOfNodes]; +std::copy(coords,coords+3*nbOfNodes,tmp); +myCoords->useArray(tmp,true,CPP_DEALLOC,nbOfNodes,3); +//now use myCoords as you need +... +//myCoords is no more usefully, release it +myCoords->decrRef(); +\endcode + +- no copy and ownership C +\code +myCoords=DataArrayDouble::New(); +tmp=(double *)malloc(3*nbOfNodes*sizeof(double)); +std::copy(coords,coords+3*nbOfNodes,tmp); +myCoords->useArray(tmp,true,C_DEALLOC,nbOfNodes,3); +//now use myCoords as you need +... +//myCoords is no more usefully here : release it +myCoords->decrRef(); +\endcode + +- copy +\code +myCoords=DataArrayDouble::New(); +myCoords->alloc(nbOfNodes,3); +tmp=myCoords->getPointer(); +std::copy(coords,coords+3*nbOfNodes,tmp); +myCoords->declareAsNew();//you have modified data pointed by internal pointer notify object +//now use myCoords as you need +... +//myCoords is no more usefully here : release it +myCoords->decrRef(); +\endcode + +\section MEDCouplingArrayRenumbering Array renumbering + +Here is presented all it is necessary to know concerning renumbering. +Renumbering is intensely required in %MEDLoader in %ParaMEDMEM. One of the user of renumbering is MED file for I/O where cells are sorted by type. +But it is also used on operations of node cell merging. It is also used in parallel mode when splitting of mesh is needed... + +Formally a renumbering is a mathematical application that can be surjective, injective or bijective. This application is defined using an instance of +\ref ParaMEDMEM::DataArrayInt "DataArrayInt". There are different ways to define this application. + +\subsection MEDCouplingArrayRenumberingO2N Old to new mode + +The old to new mode is particulary recommanded for surjective and bijective application. This is typically the case of \ref ParaMEDMEM::MEDCouplingUMesh::mergeNodes "MEDCouplingUMesh::mergeNodes" method. +Let's consider a call to \ref ParaMEDMEM::MEDCouplingUMesh::mergeNodes "mergeNodes" that reduces the number of nodes from 5 nodes to 3 nodes.\n +In old to new mode the array \b MySurjection that specifies this surjection will have 5 tuples and 1 component. The content of the 5*1 values will be in {0,1,2}.\n + +If \b MySujection equals [2,1,0,1,2], it means that : + +- old id #0 will have new id equal to 2 +- old id #1 will have new id equal to 1 +- old id #2 will have new id equal to 0 +- old id #3 will have new id equal to 1 like old id #1 +- old id #4 will have new id equal to 2 like old id #0 + +This is the most common mode of renumbering in MEDCoupling because there is more methods implying renumbering that reduce the number of entities than method that increase number of entities. + +Method in old to new mode that works on bijective applications : + +- \ref ParaMEDMEM::DataArrayDouble::renumber "DataArrayDouble::renumber" +- \ref ParaMEDMEM::DataArrayDouble::renumberInPlace "DataArrayDouble::renumberInPlace" + +Method in old to new mode that works on surjective applications : + +- \ref ParaMEDMEM::DataArrayDouble::renumberAndReduce "DataArrayDouble::renumberAndReduce" + +Sometimes the format old to new for sujections can be replaced by another format with 2 arrays. Less compact in memory. The \ref ParaMEDMEM::DataArrayInt::changeSurjectiveFormat "DataArrayInt::changeSurjectiveFormat" method performs that. + +\subsection MEDCouplingArrayRenumberingN2O New to old mode + +The new to old mode is particulary recommanded for strictly injective and bijective permutations. This is particulary usefull for methods that increase the number of entities like for example +\ref ParaMEDMEM::MEDCouplingUMesh::simplexize "MEDCouplingUMesh::simplexize".\n +All non static methods in \ref ParaMEDMEM::DataArrayDouble "DataArrayDouble" or \ref ParaMEDMEM::DataArrayInt "DataArrayInt" having as last letter \b R (meaning Reversed) in capital works with +the mode new to old. +Let's consider a call to \ref ParaMEDMEM::MEDCouplingUMesh::simplexize "simplexize" that increases the number of cell from 4 cells to 6 cells.\n +In new to old mode the array \b MyInjection that specifies this injection will have 6 tuples and 1 component. The content of the 5*1 values will be in {0,1,2,3}.\n +If \b MyInjection equals [2,0,1,1,3,0] it means that : + +- new id #0 comes from old id 2 +- new id #1 comes from old id 0 +- new id #2 comes from old id 1 +- new id #3 comes from old id 1 +- new id #4 comes from old id 3 +- new id #5 comes from old id 0 + +Method in new to old mode that works on bijective applications : + +- \ref ParaMEDMEM::DataArrayDouble::renumberR "DataArrayDouble::renumberR" +- \ref ParaMEDMEM::DataArrayDouble::renumberInPlace "DataArrayDouble::renumberInPlaceR" + +Method in new to old mode that works on surjective applications : + +- \ref ParaMEDMEM::DataArrayDouble::selectByTupleId "DataArrayDouble::selectByTupleId" + +*/ diff --git a/doc/doxygen/medfilebrowser.dox b/doc/doxygen/medfilebrowser.dox new file mode 100644 index 000000000..622f00666 --- /dev/null +++ b/doc/doxygen/medfilebrowser.dox @@ -0,0 +1,22 @@ + +/*! +\page MEDFILEBROWSER_class MEDFILEBROWSER + +\section MED_general General Information + +This object is used to get information about the different +meshes/fields that are contained in a file. +This enables the user to know about the file content without +loading med objects in memory. + +\section MEDFILEBROWSER_object_outline Outline +The methods are described in the following sections : +- \ref MEDFILEBROWSER_constructors +- \ref MEDFILEBROWSER_query + +For an example using these methods, one may see the Python scripts in the +directory \c $MED_ROOT_DIR/bin/salome/,\c med_test1.py, or C++ +example program in the directory \c $MED_SRC_DIR/src/MEDMEMBinTest, +\c duplicateMED.cxx. + +*/ diff --git a/doc/doxygen/medloader.dox b/doc/doxygen/medloader.dox index 9cb490e52..344a8422d 100644 --- a/doc/doxygen/medloader.dox +++ b/doc/doxygen/medloader.dox @@ -1,17 +1,49 @@ /*! -\page medloader MEDLoader +\page medloader %MEDLoader \section MEDLoaderIntro Introduction -MEDLoader is a package in charge of loading from a file or write to a file +%MEDLoader is a package in charge of loading from a file or write to a file in MED format a \ref medcoupling data structure. The fact that these functionalities are not merged in \ref medcoupling is explained by a willingness of reducing as much as possible the dependancies of \ref medcoupling libraries. As a MED file can combine several \ref medcoupling aspects in one (for exemple meshes in -MED file on different mesh dimension with families and groups) the API of MEDLoader is much more rich than simply read and write. +MED file on different mesh dimension with families and groups) the API +of %MEDLoader is much more rich than simply read and write. -MEDLoader offers \b static methods whose method names have the first +MEDCoupling mesh does \b not fit a MED file mesh, and a MEDCoupling +field does \b not fit a MED file field. But it is possible to emulate +with a very good fidelity a MED file mesh and a MED file field with +a collection of MEDCoupling instances for each. + +That's why %MEDLoader module offers two different approaches to perform Read/Write from/to MED +file. + +- Either the user is close too MEDCoupling concepts. This is the case +if pieces of information to access or to write are \b directly +mapped to a MEDCouplingMesh/MEDCouplingFieldDouble in MEDCoupling package. \nIn this case, the \ref MEDLoaderBasicAPI "basic API" is recommended in this case because simpler and faster. + +- Or the user knows the MED file concept well and if nature of +information to deal with do not fit exactly the class offered by +MEDCoupling, the \ref MEDLoaderAdvancedAPI "advanced API" is +recommended. This is typically the case for a user that wants to precisely set/get +mesh/group/family groups set on different level lying on a same field defined +partially... This API is faster, all information contained in file is represented, but +less check is performed.\n This API is recommended for users that want to operate directly on MED files (split of MED files for example) + +The two methods are \b not opposed, they are compatible each other so +it is possible to mix them. But the user should keep in mind that +behaviour of these two methods can vary. + +*/ + +/*! +\page MEDLoaderBasicAPI Basic %MEDLoader API. + +The aim of this page is to present basic API of MEDLoader. The goal of +this basic API is to perform a read or a write in one shot without any +internal state. That's why the basic API of MEDLoader offers \b only \b static methods whose method names have the first character in capital. You are intended to use these methods. The following chapters will try to describe in details some of important ones. @@ -24,7 +56,7 @@ name of meshes and fields are used by MEDLoader to use it as this into MED file. A field f with \ref ParaMEDMEM::MEDCouplingTimeDiscretization "time discretization" set to ONE_TIME, the value of \c f->getTime(time,iteration,order) are used by MEDLoader to store -identifies the field into MED file. All strings used by MEDLoader to +to identify the field into MED file. All strings used by MEDLoader to use it into MED file should fulfill the rules of MED file where length are limited. That's why the user should be aware of these constaints when trying to read/write a MED file using MEDLoader. @@ -35,7 +67,7 @@ MEDLoader tries to manage that by protecting the user by throwing exceptions whe Here we will describes some of basic concepts of MED files in order to use the best methods proposed by MEDLoader API. -\subsection MEDLoaderMEDFileGen Basics in MED files +\subsection BasicMEDLoaderAPIGen Basics in MED files First of all MEDLoader \b will \b not read MED files whose version is \b lower \b than \b 2.2. The MEDLoader::CheckFileForRead will perform @@ -68,11 +100,11 @@ This recalled specificities of MED file explains that it is necessary to specify each time, at field-read time, the type of field, the iteration and order number the mesh you are interested in. -\subsection MEDLoaderMEDFileMesh Meshes in MED files +\subsection BasicMEDLoaderAPIMesh Meshes in MED files In MED file meshes could combine in one unstructured mesh cells that have different dimension. For example it is possible to mix -MED_TETRA4, MED_TRIA6, MED_SEG2, MED_POINT0, MED_POLYGON, +MED_TETRA4, MED_TRIA6, MED_SEG2, MED_POINT1, MED_POLYGON, MED_POLYHEDRA in a same mesh. In MEDCouplingUMesh such a mix is not allowed as described \ref MEDCouplingUMeshes "here". So to \b read such mesh it is important to know which meshdimension you are interested to. In API @@ -102,7 +134,7 @@ help you to have this mesh dimension. \anchor MEDLoaderExample2 - Consider an another mesh called "Example2" in file "file2.med" containing MED_POLYHEDRA, MED_TETRA4, MED_QUAD8, MED_TRI6, MED_SEG2 -and MED_POINT0. In this case you will have : +and MED_POINT1. In this case you will have : \code assert(3==MEDLoader::ReadUMeshDimFromFile("file2.med","Example2")); @@ -125,7 +157,7 @@ To get 1D cells (MED_SEG2) you should type : MEDCouplingUMesh *m1D=MEDLoader::ReadUMeshFromFile("file2.med","Example2",-2); \endcode -And finally for 0D cells (MED_POINT0) you will write : +And finally for 0D cells (MED_POINT1) you will write : \code MEDCouplingUMesh *m0D=MEDLoader::ReadUMeshFromFile("file2.med","Example2",-3); @@ -137,7 +169,7 @@ file. This renumbering allows MEDLoader to conserve the order of MEDCoupling cells into the file. So if the renumbering of cells in MED file is not correct an exception will be thrown. -\subsection MEDLoaderMEDFilePoMesh Part of meshes in MED files +\subsection BasicMEDLoaderAPIPoMesh Part of meshes in MED files A mesh contains one or more families on nodes and/or on cells. A family is a partition (mathematical sense) of the mesh it lies to. A family can be described @@ -158,7 +190,7 @@ MEDLoader::ReadUMeshFromFamilies and MEDLoader::ReadUMeshFromGroups. This method allows you to combine several families and groups in the same returned mesh. -\subsection MEDLoaderMEDFileField Reading a field at one time step in MED files +\subsection BasicMEDLoaderAPIField Reading a field at one time step in MED files A field at one time step on one mesh, with one entity (cell, node) lies on all mesh on on a part of it. In this last case a definition of @@ -355,3 +387,253 @@ to other MEDLoader::Write* method the parameter of \b writeFromScratch is not needed here. */ + +/*! +\page MEDLoaderAdvancedAPI Advanced %MEDLoader API. + +This method is much closer to MED file organization than \ref +MEDLoaderBasicAPI "basic MEDLoader API". All MED file +concepts are exposed to the user. As a consequence, this advanced +API is lead to change with MED file data model enhancement. + +In reading mode, the user can scan entirely and directly the content of its MED file as it is organized in its MED file. +Inversely, in writing mode, the user can describe its data in the same +way that MED file does. + +\section AdvMEDLoaderBasics Some of basic parameters appearing in advanced API + +- Like basic %MEDLoader API there is a notion of \c meshDimRelToMax. +Each time This parameter appears in API, it will have the semantic +explain here. +The value of the parameter \c meshDimRelToMax is at most in {0,-1,-2,-3}. This relative value specifies a level +relative to value returned by \c myMedMesh->getMeshDimension(). + +A mesh containing MED_TETRA4, MED_TRI3, MED_QUAD4 and MED_POINT1 has a meshDimension +equal to 3. For \c meshDimRelToMax equal to 0 the user will +deal with cells whose type has a dimension equal to 3+0, that is to +say here MED_TETRA4. For \c meshDimRelToMax equal to -1 the user will +deal with cells witch dimension equal to 3-1 that is to say MED_TRI3 +and MED_QUAD4. + +An important method is \c getNonEmptyLevels() method. It returns all +non empty levels available. In the previous example, this method will +return {0,-1,-3}. -2 does not appear because no cells with dimension +equal to 1 (3-2) appear in MED file mesh (no MED_SEG2 not MED_SEG3). + +- Besides notion of \c meshDimRelToMax there is notion of \c meshDimRelToMaxExt. +\c meshDimRelToMaxExt is simply an extension of \c meshDimRelToMax for +nodes. + +The parameter of \c meshDimRelToMaxExt appears in +\ref ParaMEDMEM::MEDFileUMesh "umesh advanced API" of %MEDLoader with the following semantics. + +Some of MED file concepts are available both for cells and +nodes, (for example families, groups, numbering ) that's why for a simpler API this +concept has been introduced. \c meshDimRelToMaxExt parameter can take a value in at +most {1,0,-1,-2,-3}. +1 stands for node and 0,-1,-2,-3 has exactly the +same semantic than those described in \c meshDimRelToMax decribed +before. + +- A parameter that also often appears in advanced %MEDLoader API is \c renum. +This parameter by default in advanced %MEDLoader API is set to \c +true. +This parameter indicates if the user intend to take into account +of the renumbering array of cells of the current MED file mesh. +If no renumbering array is defined, this parameter is ignored by +%MEDLoader. + +If such renumbering exists and the \c renum parameter is +set to \c true, then the renumbering is taken into account. This is +exactly the behaviour of \ref MEDLoader::ReadUMeshFromFile "basic MEDLoader API". +If the user expects to ignore this renumbering even in case of +presence of renumbering array, false should be passed to \c renum +parameter. \b The \b parameter \b renum \b should \b be \b set \b with +\b cauton \b for \b users \b concerned \b by \b cells \b orders. + +- A laster important parameter is the \c mode during writing. The + available values for the parameter \c mode are : + - 2 : for a write from scratch. If file already exists, file will be + erased and replace by the content of the instance on which \c write + method has been calles. + - 1 : If the file does not exists equivalent to 2. If file already + exists, the write is done on APPEND mode. That is to say that no + data loss will occur. But in case that an element with same ids than + current instance already exists, the content is not written and an + exception is thrown. + - 0 : If the file does not exists equivalent to 2. If file already + exists write without any question. If an element with same ids + existed previously the content is overwritten by the content of the + current instance, that can lead to a file corruption. + +\section AdvMEDLoaderAPIReading Reading from a file with advanced API. + +Contrary to the basic %MEDLoader API, here after reading process, the user +has to deal with a new instance of class that fits the MED file model. +To access to a MEDCoupling mesh the user should request this class +instance. + +\subsection AdvMEDLoaderAPIMeshReading Reading a mesh. + +The class that incarnates Read/Write mesh in MED file is ParaMEDMEM::MEDFileUMesh. + +First of all, like basic %MEDLoader API, only MEDfile files whose version >= 2.2 are able +to be read with advanced API. + +To read a mesh having the name \c meshName in file \c fileName the +following simple code has to be written : + +\code + +MEDFileUMesh *myMedMesh=MEDFileUMesh::New(fileName,meshName); + +\endcode + +If the user do not know the name of the mesh inside MED file +'fileName' the following code should be written : + +\code + +MEDFileUMesh *myMedMesh=MEDFileUMesh::New(fileName); + +\endcode + +In this case the first mesh (in MED file sense) found in \c fileName +file will be loaded. + +Now the user can ask for mesh dimension of of \c myMedMesh instance by +calling \c myMedMesh->getMeshDimension(). This method returns the +highest level of present cell in MED file mesh \c myMedMesh. +This returned integer is computed and \b not those contained in MED file +that can be invalid. + +\n + +- Retrieving a mesh at a specified relative level \c meshDimRelToMax=mdrm : simply call + - \c myMedMesh->getMeshAtLevel(mdrm) + - or \c myMedMesh->getLevel0Mesh() or \c + myMedMesh->getLevelM1Mesh(), or \c myMedMesh->getLevelM2Mesh() + depending on the value of mdrm + + +- Retrieving a family at a specified level : + - Either an array of node/cell id + - \c getFamilyArr method or \c getFamiliesArr + - Or on \ref ParaMEDMEM::MEDCouplingUMesh "MEDCouplingUMesh" form by calling + - \c getFamily method or \c getFamilies + +- Retrieving a group at a specified level : + - Either an array of node/cell id + - \c getGroupArr method or \c getGroupsArr + - Or on \ref ParaMEDMEM::MEDCouplingUMesh "MEDCouplingUMesh" form by calling + - \c getGroup method or \c getGroups + +- Retrieving family field array : +Method \c getFamilyFieldAtLevel retrieves for a specified extended level the +family id of each cell or node. + +- Retrieving renumbering array : +Method \c getNumberFieldAtLevel returns, if it exists for a specified extended level, the +family id of each cell or node. If it does not exist an exception will +be thrown. + +An important point is that families and groups are \b not sorted in +MED file. No sort is stored in MED file explicitely for Groups and +Families. Advanced %MEDLoader API, uses the same order than underlying +mesh at specified level. + +\subsection AdvMEDLoaderAPIMeshReadingSampl Sample of reading a mesh. + +Here a typical use of \ref ParaMEDMEM::MEDCouplingUMesh "MEDCouplingUMesh" instance. + +\code + +const char fileName[]=...; +const char meshName[]=...; +MEDFileUMesh *medmesh=MEDFileUMesh::New(fileName,meshName); +std::vector nel=medmesh->getNonEmptyLevels(); +if(nel.size()<1) + throw INTERP_KERNEL::Exception("The test is not good for my file ! Expecting a multi level mesh to play with !"); +MEDCouplingUMesh *m0=medmesh->getMeshAtLevel(nel[1],false); +MEDCouplingUMesh *g1=medmesh->getGroup(nel[1],"mesh2",false); +DataArrayInt *dag1=medmesh->getGroupArr(nel[1],"mesh2",false); +MEDCouplingUMesh *g1bis=m0->buildPartOfMySelf(dag1->getConstPointer(),dag1->getConstPointer()+dag1->getNbOfElems()); +g1bis->setName(dag1->getName()); +if(!g1->isEqual(g1bis,1e-12)) + throw INTERP_KERNEL::Exception("hmmmm :g1 and g1bis should be equal..."); +// +dag1->decrRef(); +g1->decrRef(); +m0->decrRef(); +medmesh->decrRef(); + +\endcode + +\subsection AdvMEDLoaderAPIMeshWriting Writing a mesh. + +The use is very symetric to reading part. It is possible to either +build a \ref ParaMEDMEM::MEDFileUMesh "MEDFileUMesh" instance from +scratch, or to work with an existing instance coming from a loading +from a file. + +One important point is that coordinates of a mesh are shared by all +cells whatever their level. That's why the +\ref ParaMEDMEM::DataArrayDouble "DataArrayDouble" instance +should be shared by all \ref ParaMEDMEM::MEDCouplingUMesh "MEDCouplingUMesh" used in input parameter of +set* methods. If the user intend to build a \ref ParaMEDMEM::MEDFileUMesh "MEDFileUMesh" instance from +scratch, a call to \c setCoords should be done first. + + +Generally speaking traduce get* methods with set* methods have corresponding write semantic. + +Some differences still exist : + +- \c setMeshAtLevel, \c setMeshAtLevelOld simply call \c setMeshAtLevelGen with repectively \c newOrOld parameter +set to true and false. These method specifies if a renumbering computation is needed or not. \c setMeshAtLevelOld is faster +than \c setMeshAtLevel because no renumbering computation is done. If the user is not warranty about the order of its meshes to enter +it is better to use \c setMeshAtLevel method. + +- Groups definition : Groups constitution is time consuming because of the stored mode chosen by MED file to store them. Groups definition +lead to a partition computation which is time/mem consuming that's why groups should be defined at once and not with addGroup one by one that will lead to +compute a partition for each appended group. One important point to note is that DataArrayInt instance given in input to define groups should have its name +set to the desired group name. If not an exception will be thrown, because MED file does not support groups with no name. + +\subsection AdvMEDLoaderAPIMeshWritingSampl Sample of writing a mesh. + +\code + +MEDCouplingUMesh *m=...; //m is a mesh with meshDim=2 spaceDim=2 +MEDCouplingUMesh *m1=...; //m1 is a mesh with meshDim=1 spaceDim=2 same coords than m +MEDCouplingUMesh *m2=...; //m2 is a mesh with meshDim=0 spaceDim=2 same coords than m +MEDFileUMesh *mm=MEDFileUMesh::New(); +mm->setName("mm");//name needed to be non empty +mm->setDescription("Description mm"); +mm->setCoords(m1->getCoords()); +mm->setMeshAtLevel(-1,m1,false); +mm->setMeshAtLevel(0,m,false); +mm->setMeshAtLevel(-2,m2,false); +DataArrayInt *g1=DataArrayInt::New(); +g1->alloc(2,1); +g1->setName("G1"); +const int val1[2]={1,3}; +std::copy(val1,val1+2,g1->getPointer()); +DataArrayInt *g2=DataArrayInt::New(); +g2->alloc(3,1); +g2->setName("G2"); +const int val2[3]={1,2,3}; +std::copy(val2,val2+3,g2->getPointer()); +// +std::vector grps(2); +grps[0]=g1; grps[1]=g2; +mm->setGroupsAtLevel(0,grps,false); +// +g2->decrRef(); +g1->decrRef(); +// +mm->write(2); + + +\endcode + +*/ + diff --git a/doc/doxygen/medmem.dox b/doc/doxygen/medmem.dox index 8cc256ec4..41332123e 100644 --- a/doc/doxygen/medmem.dox +++ b/doc/doxygen/medmem.dox @@ -13,10 +13,9 @@ The Med libraries are oganized in multiple layers: - CORBA API to simplify distributed computation inside SALOME (Server Side). - MED Client classes to simplify and optimize interaction of distant objects within the local solver. -Thanks to Med Memory, any component can access a distant -mesh or field object. Two codes running on -different machines can thus exchange meshes and fields. -These meshes and fields can easily be read/written in a Med file +Thanks to Med Memory, any component can access a distant mesh or field +object. Two codes running on different machines can thus exchange +meshes and fields. These meshes and fields can easily be read/written in a Med file format, enabling access to the whole Salome suite of tools (CAD, meshing, Visualization, other components). @@ -26,13 +25,14 @@ In this document, we describe the API of the Med Memory library (available in C+ As will be seen in section \ref medmem_api, the API consists of very few classes: -- a general MED container : \ref MED_class, +- a MED-file browser : \ref MEDFILEBROWSER_class, - meshes : \ref mesh , - structured meshes : \ref grid , - supports and derived classes : \ref support , - mesh generation tool : \ref meshing , - fields : \ref field , -- \ref medmem_drivers "drivers for reading and writing" in MED, GIBI and VTK files. +- \ref medmem_drivers "drivers for reading and writing" in MED, GIBI, +VTK, EnSight and Porflow files. All these are detailed in the following sections. The C++ formalism will be used for the description in these sections. @@ -85,7 +85,7 @@ a temperature at times \a t=0.0 s, \a t=1.0 s, \a t=2.0 s will be considered as MEDMEM supports data exchange in following formats: - \b GIBI - reading and writing the mesh and the fields in ASCII format. - \b VTK - writing the mesh and the fields in ASCII and binary formats. -- \b EnSight - reading and writing the mesh and the fields in ASCII and binary formats. +- \b EnSight - reading and writing the mesh and the fields in EnSigth6 and EnSigth GOLD formats (ASCII and binary). - \b PORFLOW - reading the mesh in ASCII format. Limitation of length of names in GIBI format is overcome by storing names in the specific string pile of GIBI file. @@ -124,7 +124,7 @@ At a basic usage level, the API consists in few classes which are located in the \c MEDMEM C++ namespace (consult figure \ref fig_UML_light which gives an UML diagram view of the main Med Memory classes): -- \b MED the global container; +- \b MEDFILEBROWSER the class provinding information on meshes and fields conatained in a MED file; - \b MESH the class containing 2D or 3D mesh objects; - \b SUPPORT the class containing mainly a list of mesh elements; - \b FIELD the class template containing list of values lying on a particular support. @@ -146,8 +146,7 @@ of the mesh; - read/write such fields. Note that on the figure \ref fig_UML_light as well as on figure -\ref fig_UML that the -MED container controls the life cycle of all the objects it contains: its destructor will destroy all the objects it aggregates. On the other hand, the life cycle of mesh, support and field objects are independent. Destroying a support (resp. a field) will have no effect on the mesh (resp. support) which refers to it. But the user has to maintain the link: a mesh aggregates a support which aggregates a field. If the user has to delete Med Memory objects, the field has to be deleted first, then the support and finally the mesh. +\ref fig_UML the life cycle of mesh and field objects are independent. Destroying a field will have no effect on the mesh. But the user has to maintain the link: a mesh aggregates a support which aggregates a field. If the user has to delete Med Memory objects, the field has to be deleted first, then the support and finally the mesh. A more advanced usage of the Med Memory is possible through other classes. Figure \ref fig_UML gives a complete view of the Med Memory API. It includes : @@ -190,7 +189,7 @@ entities \c MED_CELL and \c MED_FACE (resp. \c MED_EDGE) are considered. In 1D, of course only mesh entities \c MED_CELL+ are considered. Using our naming convention (consult \ref medmem_naming), in $1$ D mesh only \b node and \b cell are considered. In 2D mesh, only \b node, \b cell and \b edge are considered. Finally in 3D mesh only -\b node}, \b cell and \b face are considered. +\b node, \b cell and \b face are considered. - The \c medGeometryElement enum which defines geometric types. The available types are linear and quadratic elements (consult @@ -232,11 +231,13 @@ describe the coupling between two parallel codes. The classes that make up the API of the library are : - communication interface : \ref comm_interface, - definition of processor groups : \ref processor_group, -- Data Exchange Channel (aka DEC, abstract class) : \ref dec, and its implementations : - - \ref interpkerneldec for a \ref InterpKerRemapGlobal based on intersecting elems volume computation, +- Data Exchange Channel \ref dec, and its implementations : + - \ref interpkerneldec for a \ref InterpKerRemapGlobal based on intersecting elements volume computation, - \ref noncoincidentdec for a non-conservative interpolation based on element localization, - \ref structuredcoincidentdec for remapping coincident meshes on a one-to-one basis. This class applies to structured topologies. - \ref explicitcoincidentdec for remapping coincident meshes on a one-to-one basis. This class applies to unstructured topologies, + - \ref overlapdec based on intersecting elems volume + computation when source and target meshes are on same process id */ @@ -276,4 +277,3 @@ The following options can be useful to configure MEDMEM : - \a --with-lam=${LAMDIR} specifies an install path for a LAM MPI library, - \a --with-mpich=${MPICHDIR} specifies an install path for a MPICH-1 library. */ ->>>>>>> 1.1.4.1.2.1 diff --git a/doc/doxygen/mesh.dox b/doc/doxygen/mesh.dox index 9a82793da..93a51d30f 100644 --- a/doc/doxygen/mesh.dox +++ b/doc/doxygen/mesh.dox @@ -3,7 +3,8 @@ \section mesh_general General information -The MESH class is dedicated to the handling of unstructured meshes. Two classes derive from it : MESHING supplies functions for creating meshes from scratch (c.f. \ref meshing), while GRID gives specific constructors for creating structured meshes. +The MESH class is dedicated to the handling of unstructured +meshes. Class MESHING deriving from it supplies functions for creating meshes from scratch (c.f. \ref meshing). \section mesh_connectivity Content of the connectivity array Underlying the unstructured meshes is the notion of connectivity. This section only covers meshes made out of standard elements, the \c MED_POLYGON and \c MED_POLYHEDRA case being detailed in section \ref polygon . @@ -12,12 +13,13 @@ Underlying the unstructured meshes is the notion of connectivity. This section o \image html connectivity_arrays_small.png "Nodal connectivity storage scheme" \image latex connectivity_arrays_small.eps "Nodal connectivity storage scheme" -In MEDMEM, an unstructured mesh nodal connectivity is defined with these arrays (if the mesh has no MED_POLYGON and MED_POLYHEDRA element) : -- the type array, which contains the number of cells for each present type -- the nodal connectivity array containing the connectivity of each cell, all cells being sorted by type, -- the connectivity index array, which indicates the beginning of each cell in the connectivity array, +In MEDMEM, an unstructured mesh nodal connectivity is defined with these arrays: +- the type array, which contains the number of cells for each present type; +- the nodal connectivity array containing the connectivity of each cell, all cells being sorted by type; +- the connectivity index array, which indicates the beginning of each cell in the connectivity array. -The cell types are ordered by their number of nodes. +The cell types are ordered by their number of nodes; MED_POLYGON and +MED_POLYHEDRA is always the last type, if present. As an example, let us consider a mesh made out of a linear triangle, two linear quadrangles and a quadratic triangle (c.f. figure \ref fig_connectivity_example ). \image html connectivity_example_small.png "Example for mesh connectivity" @@ -56,6 +58,7 @@ The description of MESH methods is given by the following sections : - Connectivity information methods are described in \ref MESH_connectivity. - The methods retrieving family information are given in \ref MESH_families. - The IO methods are given in \ref MESH_io. -- The methods for an advanced usage (applying algorithms to meshes) are given in \ref MESH_advanced. +- The methods for an advanced usage (applying algorithms to meshes) +are given in \ref MESH_advanced. */ diff --git a/doc/doxygen/meshing.dox b/doc/doxygen/meshing.dox index de2565a2c..0b97eb4db 100644 --- a/doc/doxygen/meshing.dox +++ b/doc/doxygen/meshing.dox @@ -12,7 +12,7 @@ dimensions are wrong, results are impredictable. All the arrays passed as arguments in the set methods are duplicated in MESHING object. The creation of a mesh should respect the following sequence : -- setting general information (name, description, dimensions, coordinate system, ...), +- setting general information (name, description, coordinate system, ...), - setting the nodes (number and coordinates), - setting the connectivity (types, connectivity arrays,...), - group creations. @@ -37,4 +37,4 @@ An example of mesh creation via MESHING is given in : - Python: \include MESHINGexample.py -*/ \ No newline at end of file +*/ diff --git a/doc/doxygen/polygon.dox b/doc/doxygen/polygon.dox index 75054cd7a..45d4cb5a7 100644 --- a/doc/doxygen/polygon.dox +++ b/doc/doxygen/polygon.dox @@ -4,12 +4,12 @@ The methods described in section \ref mesh do not take into account information about \c polygonal and \c polyhedral cells contained in a MESH object. -Indeed, in the MEDMEM library, the connectivity data -for these elements are stored separately . Therefore, -the methods that give access to this data are slightly different from -those of section \ref mesh. +Indeed, in the MEDMEM library, the connectivity data for these +elements are stored the same way as connectivity of standard +elements. Therefore, the methods that give access to this data are +same as those of section \ref mesh. -Also, the polygon and the polyhedra case differ in nature, +The polygon and the polyhedra case differ in nature, because in 3D, the list of nodes is not sufficient to described the shape of an element. A descending cell>face>nodes connectivity has to be established @@ -24,18 +24,16 @@ Let us consider the case illustrated in figure \ref fig_polygon_connectivity . \image latex polygon_connectivity_small.eps "Example for polygon connectivity" -- The standard element connectivity table writes : {2, 6, 7, 3, 3, 7, 8, 4 } -- The standard element connectivity index table writes : {1, 5, 9 } -- The polygon element connectivity table writes : {1, 2, 3, 4, 5 } -- The polygon element connectivity index table writes : {1, 6 } +- The connectivity table writes : {2, 6, 7, 3, 3, 7, 8, 4, 1, 2, 3, 4, 5 } +- The connectivity index table writes : {1, 5, 9, 14 } \section polyhedron_conn Polyhedron connectivity For polyhedra, in the nodal connectivity case, -one more array is required, because a -list of nodes does not suffice to describe a general polyhedron. -A general polyhedron is therefore described by a list of faces, -each of those being described by a list of nodes. +list of nodes does not suffice to describe a general polyhedron; +information of connectivity of each face is needed. +A general polyhedron is therefore described by a list of nodes of +all faces with -1 as separator between faces. Let us consider an example with the two tetrahedra represented on figure \ref fig_polyhedron_connectivity , the left one @@ -46,27 +44,15 @@ as a \c MED_POLYHEDRA element. \image html polyhedron_connectivity_small.png "Example for polyhedron connectivity. Node numbers are written with a normal font, while face numbers are written in italic font." \image latex polyhedron_connectivity_small.eps "Example for polyhedron connectivity. Node numbers are written with a normal font, while face numbers are written in italic font." -- The standard element index connectivity table writes : {1, 5 } -- The standard element connectivity table writes : {1, 2, 3, 4 } -- The polyhedra connectivity index table writes :{1, 5} -- The polyhedra connectivity face index table writes : {1, 4, 7, 10, 13} -- The polyhedra connectivity (face/node connectivity) table writes : {2, 3, 5, 2, 4, 5, 4, 5, 3, 2, 3, 4} - -Note that as they are not needed as such, the face numberings are not stored -in any array. Only the number of nodes per face is implicitly stored -in the polyhedra face connectivity index table. +- The connectivity table writes : {1, 2, 3, 4, 2, 5, 3, -1, 2, 4, 5, -1, 4, 3, 5, -1, 2, 3, 4} +- The index connectivity table writes : {1, 5, 20 } If there are two \c MED_POLYHEDRA elements that share a common face, the list of nodes is repeated twice in the polyhedron connectivity -array. - -\section poly_outline Outline -The methods associated to polygons/polyhedra are located in the following classes : -- access methods are stored in MESH : \ref MESH_poly -- creation methods are in MESHING : \ref MESHING_poly +array but with reversed order. \section poly_example Example The following example illustrates the creation method for a mesh that contains polygons and/or polyhedra : \include test_MEDMEM_MeshingPoly.cxx -*/ \ No newline at end of file +*/ diff --git a/doc/doxygen/static/doxygen.css b/doc/doxygen/static/doxygen.css index d8991647e..9d051a4be 100644 --- a/doc/doxygen/static/doxygen.css +++ b/doc/doxygen/static/doxygen.css @@ -1,381 +1,381 @@ -body { - font-family: Arial, Helvetica, sans-serif; - background-color: #ffffff; +/* The standard CSS for doxygen */ + +body, table, div, p, dl { + font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif; + font-size: 12px; } -h1 { - text-align: center; - text-decoration: none; - border: none; - line-height: 25px; - text-align: center; -// text-transform:uppercase; - background: #D9f4fd; - font-size: 12pt; - font-weight: bold; - border: 1px solid #CCCCCC; - -moz-border-radius: 8px; - -moz-box-shadow:5px 5px 5px rgba(0, 0, 0, 0.15); +/* @group Heading Levels */ + +h1 { + font-size: 150%; } h2 { - font-size: 12pt; - font-weight: bold; + font-size: 120%; } -table { - font-size: 10pt; +h3 { + font-size: 100%; } -CAPTION { - font-weight: bold +dt { + font-weight: bold; } -/* Link in the top navbar */ -A.qindex {} +div.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; +} -A.qindexRef {} +p.startli, p.startdd, p.starttd { + margin-top: 2px; +} -/* Link to any cross-referenced Doxygen element inside a code section - (ex: header) -*/ -A.code { - text-decoration: none; - font-weight: normal; - color: #4444ee +p.endli { + margin-bottom: 0px; } -A.codeRef { - font-weight: normal; - color: #4444ee +p.enddd { + margin-bottom: 4px; } -A:hover { - text-decoration: none; - background-color: lightblue; +p.endtd { + margin-bottom: 2px; } -div.contents { - font-family: Arial, Helvetica, sans-serif; - font-size: 10pt; +/* @end */ + +caption { + font-weight: bold; } -div.navpath { - font-size: 11pt; - border: 0 none; - text-align: left; +span.legend { + font-size: 70%; + text-align: center; } -div.version { - background-color:#ffffde; - border:1px solid #cccccc; - font-family: Arial, Helvetica, sans-serif; - font-size: 9pt; - text-align: center; - width:100px; - -moz-border-radius: 8px; -// -moz-box-shadow:5px 5px 5px rgba(0, 0, 0, 0.15); +h3.version { + font-size: 90%; + text-align: center; } -div.header { - background: url("head.png"); - background-color: #175783; - border: 1px solid; - height: 80px; - background-repeat: no-repeat; - margin-bottom: 10px; +div.qindex, div.navtab{ + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + padding: 2px; } -div.tabs { - text-align: justify; - margin-left : 2px; - margin-right : 2px; - margin-top : 2px; - margin-bottom : 2px - font-weight: bold; - color: #FFFFFF; -} - -div.footer { - background-color: #D9f4fd; - border: 1px solid #AAAAAA; - font-family: Arial, Helvetica, sans-serif; - font-size: 11px; - padding: 10px; - margin-top: 15px; -} - -DL.el { - margin-left: -1cm -} - -/* A code fragment (ex: header) */ -div.fragment { - border: none; -} - -/* In the alpha list (coumpound index), style of an alphabetical index letter */ -DIV.ah { - background-color: #CCCCCC; - font-weight: bold; - color: #ffffff; - margin-bottom: 3px; - margin-top: 3px -} - -/* Method name (+ type) */ -TD.md { - background-color: lightblue; - font-weight: bold; -} - -/* Method parameter (some of them) */ -TD.mdname1 { - background-color: lightblue; - font-weight: bold; color: #602020; -} - -/* Method parameter (some of them) */ -TD.mdname { - background-color: lightblue; - font-weight: bold; - color: #602020; - width: 600px; -} - -/* Separator between methods group (usually empty, seems not supported by IE) */ -DIV.groupHeader { - margin-left: 16px; - margin-top: 12px; - margin-bottom: 6px; - font-weight: bold -} - -DIV.groupText { - margin-left: 16px; - font-style: italic; - font-size: smaller -} - -/*div.div-page { - background-color: #FFFFFF; - margin-left: 1em; - margin-right: 1em; - margin-top: 1em; - margin-bottom: 0.1em; - - padding-left: 1em; - padding-right: 1em; - padding-top: 0.5em; - padding-bottom: 0.5em; - - border: 2px solid #0D299A; - border-width: 2px; - border-color: #0D299A; -}*/ - -div.tabs { - text-align: justify; - margin-left : 2px; - margin-right : 2px; - margin-top : 2px; - margin-bottom : 2px - font-weight: bold; - color: #FFFFFF; -} - -DIV.div-footer { - margin-left: 1em; - margin-right: 1em; - margin-bottom: 0.2em; - text-align: right; - font-size: 9pt; -} - -/* In File List, Coumpound List, etc, 1st column of the index */ -TD.indexkey { - background-color: #CCCCCC; - font-weight: bold; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px -} - -/* In File List, Coumpound List, etc, 2nd column of the index */ -TD.indexvalue { - background-color: #CCCCCC; - font-style: italic; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px -} - -span.keyword { color: #008000 } -span.keywordtype { color: #604020 } -span.keywordflow { color: #e08000 } -span.comment { color: #800000 } -span.preprocessor { color: #806020 } -span.stringliteral { color: #002080 } -span.charliteral { color: #008080 } +div.qindex, div.navpath { + width: 100%; + line-height: 140%; +} -/* @group Code Colorization */ +div.navtab { + margin-right: 15px; +} + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +a.qindex { + font-weight: bold; +} + +a.qindexHL { + font-weight: bold; + background-color: #9CAFD4; + color: #ffffff; + border: 1px double #869DCA; +} + +.contents a.qindexHL:visited { + color: #ffffff; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code { + color: #4665A2; +} + +a.codeRef { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} .fragment { font-family: monospace, fixed; - font-size: 10pt; + font-size: 105%; } pre.fragment { - width: 95%; - border: 1px solid #CCCCCC; - -moz-border-radius: 8px; - -moz-box-shadow:5px 5px 5px rgba(0, 0, 0, 0.15); - background-color:#EEF3F5; + border: 1px solid #C4CFE5; + background-color: #FBFCFD; padding: 4px 6px; - margin: 4px 1px 4px 1px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; +} + +div.ah { + background-color: black; + font-weight: bold; + color: #ffffff; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000); +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; } -/* Top Navigation style */ +div.version { + border:1px solid #0000FF; + color: #CCCCCC; + font-family: Arial, Helvetica, sans-serif; + font-size: 9pt; + text-align: center; + width:100px; + -moz-border-radius: 8px; + margin: 5px; +} + +div.footer1 { + background-color: #DFE5F1; + border: 1px solid #AAAAAA; + font-family: Arial, Helvetica, sans-serif; + font-size: 11px; + padding: 10px; + margin-top: 15px; +} + + +div.groupText { + margin-left: 16px; + font-style: italic; +} -div.navigation { - margin-bottom: 70px; +body { + background: white; + color: black; + margin: 0; } -/* Left navigation panel style */ +div.contents { + margin-top: 10px; + margin-left: 10px; + margin-right: 10px; +} -body.ftvtree { - background-color: #D9f4fd; - margin: 10px; +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; } -div.directory { - margin: 0; +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; } -div.directory.p { - margin: 0; +tr.memlist { + background-color: #EEF1F7; } -h3.swap { - font-size: 10pt; - margin-bottom: 0; +p.formulaDsp { + text-align: center; } -/* Link to any cross-referenced Doxygen element */ -a.el { - text-decoration: none; - font-family: Arial, Helvetica, sans-serif; - font-weight: bold; - font-size: 9pt; - color: #551a8b; +img.formulaDsp { + } -a.el:hover { - background-color: transparent; +img.formulaInl { + vertical-align: middle; } -a.elRef { - font-weight: normal; +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; } +div.center img { + border: 0px; +} -#MSearchBox { - -moz-border-radius:8px 8px 8px 8px; - background-color:white; - border:1px solid #84B0C7; - margin:0; - padding:0; - white-space:nowrap; +address.footer { + text-align: right; + padding-right: 12px; } -div.directory img { - vertical-align:-30%; +img.footer { + border: 0px; + vertical-align: middle; } -div.directory p { - white-space:nowrap; - margin: 0; +/* @group Code Colorization */ + +span.keyword { + color: #008000 } -div.directory-alt div { - display: none; - margin: 0px; +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 } +span.comment { + color: #800000 +} -div.directory div { - display: none; - margin: 0px; +span.preprocessor { + color: #806020 } -div.version { - background-color:#ffffde; - border:1px solid #cccccc; - font-family: Arial, Helvetica, sans-serif; - font-size: 9pt; - text-align: center; - width:100px; - -moz-border-radius: 8px; -// -moz-box-shadow:5px 5px 5px rgba(0, 0, 0, 0.15); -} - -/* In File List, Coumpound List, etc, 1st column of the index */ -TD.indexkey { - background-color: #DDDDEE; - font-weight: bold; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px -} - -/* In File List, Coumpound List, etc, 2nd column of the index */ -TD.indexvalue { - background-color: #EEEEFF; - font-style: italic; - padding-right : 10px; - padding-top : 2px; - padding-left : 10px; - padding-bottom : 2px; - margin-left : 0px; - margin-right : 0px; - margin-top : 2px; - margin-bottom : 2px +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 } +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} /* @group Member Descriptions */ +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + .mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams { - background-color: #FAFAFA; - border: none; - margin: 4px; - padding: 1px 0 0 8px; + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; } .mdescLeft, .mdescRight { - padding: 0px 8px 4px 8px; - color: #555; + padding: 0px 8px 4px 8px; + color: #555; } .memItemLeft, .memItemRight, .memTemplParams { - border-top: 1px solid #ccc; + border-top: 1px solid #C4CFE5; } .memItemLeft, .memTemplItemLeft { @@ -383,86 +383,448 @@ TD.indexvalue { } .memTemplParams { - color: #606060; + color: #4665A2; white-space: nowrap; } /* @end */ +/* @group Member Details */ + /* Styles for detailed member documentation */ .memtemplate { - font-size: 80%; - color: #606060; - font-weight: normal; - margin-left: 3px; + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; } .memnav { - background-color: #e8eef2; - border: 1px solid #84b0c7; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; } .memitem { - padding: 0; - margin-bottom: 10px; + padding: 0; + margin-bottom: 10px; } .memname { white-space: nowrap; font-weight: bold; -} - -.memproto, .memdoc { - border: 1px solid #84b0c7; + margin-left: 6px; } .memproto { - padding: 0; - background-color: #d5e1e8; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; font-weight: bold; - -webkit-border-top-left-radius: 8px; - -webkit-border-top-right-radius: 8px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - -moz-border-radius-topleft: 8px; - -moz-border-radius-topright: 8px; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 8px; + border-top-left-radius: 8px; + /* firefox specific markup */ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 8px; + -moz-border-radius-topleft: 8px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 8px; + -webkit-border-top-left-radius: 8px; + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; } - - .memdoc { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; padding: 2px 5px; - background-color: #eef3f5; + background-color: #FBFCFD; border-top-width: 0; - -webkit-border-bottom-left-radius: 8px; - -webkit-border-bottom-right-radius: 8px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* opera specific markup */ + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ -moz-border-radius-bottomleft: 8px; -moz-border-radius-bottomright: 8px; -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7); + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 8px; + -webkit-border-bottom-right-radius: 8px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7)); } .paramkey { - text-align: right; + text-align: right; } .paramtype { - white-space: nowrap; + white-space: nowrap; } .paramname { - color: #602020; - white-space: nowrap; + color: #602020; + white-space: nowrap; } .paramname em { - font-style: normal; + font-style: normal; +} + +.params, .retval, .exception, .tparams { + border-spacing: 6px 2px; +} + +.params .paramname, .retval .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + + + + +/* @end */ + +/* @group Directory (tree) */ + +/* for the tree view */ + +.ftvtree { + font-family: sans-serif; + margin: 0px; +} + +/* these are for tree view when used as main index */ + +.directory { + font-size: 9pt; + font-weight: bold; + margin: 5px; +} + +.directory h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} + +/* +The following two styles can be used to replace the root node title +with an image of your choice. Simply uncomment the next two styles, +specify the name of your image and be sure to set 'height' to the +proper pixel height of your image. +*/ + +/* +.directory h3.swap { + height: 61px; + background-repeat: no-repeat; + background-image: url("yourimage.gif"); +} +.directory h3.swap span { + display: none; +} +*/ + +.directory > h3 { + margin-top: 0; +} + +.directory p { + margin: 0px; + white-space: nowrap; +} + +.directory div { + display: none; + margin: 0px; +} + +.directory img { + vertical-align: -30%; +} + +/* these are for tree view when not used as main index */ + +.directory-alt { + font-size: 100%; + font-weight: bold; +} + +.directory-alt h3 { + margin: 0px; + margin-top: 1em; + font-size: 11pt; +} + +.directory-alt > h3 { + margin-top: 0; +} + +.directory-alt p { + margin: 0px; + white-space: nowrap; +} + +.directory-alt div { + display: none; + margin: 0px; +} + +.directory-alt img { + vertical-align: -30%; } /* @end */ +div.dynheader { + margin-top: 8px; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable { + border-collapse:collapse; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; +} + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +div.ingroups +{ + font-size: 8pt; + padding-left: 5px; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +dl +{ + padding: 0 0 0 10px; +} + +dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug +{ + border-left:4px solid; + padding: 0 0 0 6px; +} + +dl.note +{ + border-color: #D0D000; +} + +dl.warning, dl.attention +{ + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant +{ + border-color: #00D000; +} + +dl.deprecated +{ + border-color: #505050; +} + +dl.todo +{ + border-color: #00C0E0; +} + +dl.test +{ + border-color: #3030E0; +} + +dl.bug +{ + border-color: #C08050; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectname +{ + background-color: #175783; + border: 1px solid; + height: 80px; + background-repeat: no-repeat; +/* font: 300% arial,sans-serif;*/ + margin: 0px; + padding: 0px; +} + +#projectbrief +{ + font: 120% arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + background: url("head.png"); + background-color: #175783; + border: 1px solid; + height: 80px; + background-repeat: no-repeat; + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + diff --git a/doc/doxygen/static/footer.html b/doc/doxygen/static/footer.html index fdfb138ca..b344790a6 100755 --- a/doc/doxygen/static/footer.html +++ b/doc/doxygen/static/footer.html @@ -1,13 +1,12 @@ - - - - - - + + + +
+
+ Copyright © 2007-2011 CEA/DEN, EDF R&D, OPEN CASCADE
+ Copyright © 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+
+
+ \ No newline at end of file diff --git a/doc/doxygen/static/header.html.in b/doc/doxygen/static/header.html.in index bcf8c48ea..9792445cb 100755 --- a/doc/doxygen/static/header.html.in +++ b/doc/doxygen/static/header.html.in @@ -1,10 +1,22 @@ - - + + - - $title - - + +$title + + + + + + + + + -
-
Version: @VERSION@
\ No newline at end of file + +
+
Version: @VERSION@
+ +
-- 2.39.2