From 8658b4bb6ad717d07721b1e9fb383dc4aea3f5e2 Mon Sep 17 00:00:00 2001 From: nadir Date: Wed, 31 May 2006 12:20:06 +0000 Subject: [PATCH] correction for docs and for some bug discovered. valid for an other beta version V3_2_0b2. --- doc/MEDMEM/MEDMEM_Content.tex.in | 360 ++++++++------ doc/MEDMEM/MEDMEM_UML.png.in | Bin 6379 -> 6942 bytes doc/MEDMEM/MEDMEM_UML_light.png.in | Bin 3829 -> 2803 bytes doc/MEDMEM/MEDMEM_UsersGuide.tex.in | 6 +- doc/MEDMEM/MESHINGexample.py | 696 ++++++++++++++++++++++++++++ doc/MEDMEM/MESHconnectivities.cxx | 14 +- doc/MEDMEM/Makefile.in | 2 +- 7 files changed, 933 insertions(+), 145 deletions(-) create mode 100644 doc/MEDMEM/MESHINGexample.py diff --git a/doc/MEDMEM/MEDMEM_Content.tex.in b/doc/MEDMEM/MEDMEM_Content.tex.in index e0e9dd9bd..109e8bc66 100644 --- a/doc/MEDMEM/MEDMEM_Content.tex.in +++ b/doc/MEDMEM/MEDMEM_Content.tex.in @@ -52,13 +52,12 @@ of very few classes: All these are detailed in the following sections. The C++ formalism will be used for the description in these sections. - Python syntax is very similar and is given in - appendix \ref{app:python}. + Python syntax is very similar and is given in appendix \ref{sec:python}. \section{Naming conventions} -The naming conventions are rather straightforward, but -the reader used to the MED-file semantics will find that -there are a few noticeable differences. +The naming conventions are rather straightforward, but the user used to the +Med-File semantics may find that there are a few noticeable differences (see +the following section). \begin{description} \item[cell] entity of dimension equal to the mesh dimension ($1$, $2$ or $3$). \item[component] in a field, represents a value that is available for each @@ -101,14 +100,33 @@ default value). hexahedron, etc...). \end{description} +\section{Limitations and advantages regarding Med-File} +The Med Memory may only read meshes defined by their nodale connectivities. +Following this assumption, in Med File framework all elements defined +in the mesh should be stored as a {\bf MED\_MAILLE}. + +The Med Memory is able to read meshes defined by their nodale connectivities, +and where somme geometric faces are stored as a {\bf MED\_FACE} or a +{\bf MED\_ARETE} Med files. Which is not really Med File compliant. + +{\bf MED\_MAILLE}, {\bf MED\_FACE} and {\bf MED\_ARETE} should be taken in the +Med File sense. In future version, meshes defined by their descending +connectivities could be treated. + +The field notion in Med File and Med Memory is quite different. In Med memory +a field is of course its name, but as well its iteration number, its order +number and finally its corresponding sot of values. But in Med File a field is +only flagged by its name. + \chapter{Med Memory API}\label{sec:objects} \section{Conventions} \begin{itemize} -\item -In this document, one refers to the main user documentation \cite{RefManualMedMemory} -where the variable \verb+$MED_ROOT_DIR+ is the Med Memory directory installation. +\item In this document, one refers to the main user documentation +\cite{RefManualMedMemory} where the variable \verb+$MED_ROOT_DIR+ (resp. +\verb+$MED_SRC_DIR+) is the Med Memory directory installation (resp. sources +directory). \item All numberings start at one (take care of array index !). @@ -138,46 +156,47 @@ programer. \section{Classes} At a basic usage level, the API consists in few classes which are located in -the \verb+MEDMEM+ C++ namespace : +the \verb+MEDMEM+ C++ namespace (consult figure \ref{fig:uml_light} which gives +an UML diagram view of the main Med Memory classes~: \begin{description} \item[MED] the global container; \item[MESH] the class containing 2D or 3D mesh objects; -\item[SUPPORT] the class containing descriptions of list of elements; +\item[SUPPORT] the class containing mainly a list of mesh elements; \item[FIELD] the class template containing list of values lying on a particular support. \end{description} - -Figure \ref{fig:uml_light} gives a view of the UML diagram of the classes that -are sufficient for most integrations in the Salome platform, couplings using -the Med Memory libraries. With these classes, it is possible to : -\begin{itemize} -\item read/write meshes from MED-files; -\item create fields containing scalar or vectorial values on list of elements -of the mesh; -\item communicate these fields between different components; -\item read/write such fields. -\end{itemize} - -Note on this figure that the MED container controls the life cycle of all the -objects it contains : its destruction 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 will have no effect on the fields -which refer to it. - \begin{center} \begin{figure} \includegraphics[width=15cm]{MEDMEM_UML_light.png} \caption{UML diagram of basic Med Memory API classes.}\label{fig:uml_light} \end{figure} \end{center} +The API of those classes is quite sufficient for most of the component +integrations in the Salome platform. The use of the Med Memory libraries may +make easier the code coupling in the Salome framework. With these classes, it +is possible to~: +\begin{itemize} +\item read/write meshes and fields from MED-files; +\item create fields containing scalar or vectorial values on list of elements +of the mesh; +\item communicate these fields between different components; +\item read/write such fields. +\end{itemize} +Note that on the figure \ref{fig:uml_light} as well as \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 mesh) will have no effect on the fields (resp. on the support) +which refer to it. But the user has to maintain the link~: a mesh agregates a +support which agregates 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 : \begin{description} \item[GROUP] a class inherited from the SUPPORT class used to create supports -linked to mesh groups (restricted list of elements used for setting boundary -conditions, initial values or transferring data from one component to the -other); +linked to mesh groups. It stores restricted list of elements used to set +boundary conditions, initial values. \item[FAMILY] which is used to manipulate a certain kind of support and does not intersect each other; \item[MESHING] which builds meshes from scratch, it can be used to transform @@ -187,20 +206,19 @@ mesh); \item[Driver classes] which enable the user to get a fine control of the I/O operations. \end{description} - \begin{center} \begin{figure} \includegraphics[width=15cm]{MEDMEM_UML.png} \caption{UML diagram of Med Memory API classes.}\label{fig:uml} \end{figure} \end{center} - \section{Enums} A few enums are defined in the \verb+MED_EN+ namespace : \begin{itemize} \item The \verb+medGeometryElement+ enum which defines geometry types. The -available types are linear and quadratic elements (c.f. [DR??]). The -entries of the enum are quite self-explanatory : +available types are linear and quadratic elements (consult +\cite{RefManualMedMemory}). The entries of the enum are quite +self-explanatory~: \begin{itemize} \item \verb+MED_NONE+ \item \verb+MED_POINT1+ @@ -277,6 +295,14 @@ should never delete it. One can add as well some MESH or FIELD object via the {\method{addMesh}} and the {\method{addField}} respectively. +To write a complete MED object in an available writing format, on may use +{\method{addDriver}} and then {\method{write}}. + +For an example using these methods, one may see the Python scripts in the +directory \verb+$MED_ROOT_DIR/bin/salome/+,\verb+testMedObj.py+, or C++ +example program in the directory \verb+$MED_SRC_DIR/src/MEDMEM+, +\verb+duplicateMED.cxx+. + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{How to use MESH object} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -292,9 +318,11 @@ We could get some general information about a MESH object such as~: \item the space dimension (\method{getSpaceDimension}) \item the mesh dimension (\method{getMeshDimension}) \end{itemize} -\fileCxx{MESHgeneral.cxx} -\filePython{MESHgeneral.py} +Here is a small C++ example program which the Python version may be found in +\ref{MESHgeneral.py}. + +\fileCxx{MESHgeneral.cxx} \section{Information about nodes} @@ -321,9 +349,11 @@ an array where values are ordered like (\verb+X1,Y1,Z1, X2,Y2,Z2, ...+). \item I want to get one particular value of coordinate~: use \method{getCoordinate} which returns the value of \( i^{th} \) node and \( j^{th} \) axis. \end{enumerate} -\fileCxx{MESHcoordinates.cxx} -\filePython{MESHcoordinates.py} +Here is a small C++ example program which the Python version may be found in +\ref{MESHcoordinates.py}. + +\fileCxx{MESHcoordinates.cxx} \section{Information about cells} @@ -429,102 +459,25 @@ To get nodal connectivity of polyhedral elements, it is necessary use together and \method{getPolyhedronIndex} (see example \myref{MESHconnectivities.cxx}). \end{enumerate} -\fileCxx{MESHconnectivities.cxx} - -\filePython{MESHconnectivities.py} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\chapter{How to use MESHING object} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -This class is a derivated class of MESH class to build a MESH object from -scratch (use of set methods). - -All verifications are under user responsability : If arrays values or arrays -dimensions are wrongs, results are impredicable. - -All arrays in arguments in set methods are duplicated in MESHING object. - -\section{Build a MESHING} - -\label{BuildMeshing} - -\subsection{Coordinates} -First we must defined points coordinates of the mesh. We use -\method{setCoordinates}. +Here is a small C++ example program which the Python version may be found in +\ref{MESHconnectivities.py}. -\textbf{C++ Example~:} -\begin{verbatim} -MESHING myMeshing ; -const int SpaceDimension=2; -const int NumberOfNodes=6; -int * Coordinates = new int[SpaceDimension*NumberOfNodes] ; -string System="CARTESIAN"; -medModeSwitch MED_FULL_INTERLACE ; -myMeshing.setCoordinates(SpaceDimension,NumberOfNodes,Coordinates,System,Mode); -\end{verbatim} - -Then you could set the coordinates names and units (with -\method{setCoordinatesNames} and \method{setCoordinatesUnits}). - -\subsection{Connectivities} - -When coordinates are defined, we could defined connectivities. - -First we must defined connectivity of MED\_CELL elements. -After, we could defined constituent connectivity if necesary -(MED\_FACE and/or MED\_EDGE). - -For each connectivities, you could use some methods in the following order : -\begin{itemize} -\item \method{setNumberOfTypes} to set the number of differents geometrics -types (3 for example). This method allocates all arrays which size is this -number ; -\item \method{setTypes} to set the differents geometrics types -({MED\_TETRA4,MED\_PYRA5,MED\_HEXA8} for example). Types should be given -in increasing order of number of nodes for this type ; -\item \method{setNumberOfElements} to set the number of elements for -each geometric type. This method allocates connectivities array ; -\item \method{setConnectivity} to set the connectivity in MED\_FULL\_INTERLACE -mode for each geometric type (use \method{setPolygonsConnectivity} and -\method{setPolyhedraConnectivity} for poly elements); -\end{itemize} - -\textbf{C++ Example~:} -\begin{verbatim} -MESHING myMeshing ; -myMeshing.setCoordinates(SpaceDimension,NumberOfNodes,Coordinates,System,Mode); - -myMeshing.setNumberOfTypes(2,MED_CELL); -myMeshing.setTypes({MED_TRIA3,MED_QUAD4},MED_CELL); -myMeshing.setNumberOfElements({3,2},MED_CELL); // 3 MED_TRIA3 and 2 MED_QUAD4 -myMeshing.setConnectivity({1,2,3,6,8,9,4,5,6},MED_CELL,MED_TRIA3); -myMeshing.setConnectivity({1,3,4,5,4,5,7,8},MED_CELL,MED_QUAD4); -\end{verbatim} - - -\section{Defined a GROUP object} - -To add a group in a MESHING object, use \method{addGroup}. +\fileCxx{MESHconnectivities.cxx} -This method duplicate the GROUP object in the MESH object. +\section{Information about FAMILY and GROUP} -To build this GROUP object, use SUPPORT methods \ref{CreateSupport} to set all attributes. +If one wants to get from a MESH object -\subsection{WARNING} -For instance, translation from GROUP objects to FAMILY objects are not completed ! -You MUST set GROUP objects as if they are FAMILY objects. -This feature will be fully implemented in next release of med memory. +To write a complete MESH object in an available writing format, on may use +{\method{addDriver}} and then {\method{write}}. -\section{Example} - -\fileCxx{MESHINGexample.cxx} - -%\filePython{MESHINGexample.py} +For an example using these methods, one may see the Python scripts in the +directory \verb+$MED_ROOT_DIR/bin/salome/+,\verb+med_test1.py+, or C++ example +program in the directory \verb+$MED_SRC_DIR/src/MEDMEM+, \verb+med_test.cxx+. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{How to use SUPPORT object} @@ -665,9 +618,10 @@ interlace). \item Third return the $j^{th}$ component of $i^{th}$ element. \end{itemize} -\fileCxx{FIELDgeneral.cxx} +Here is a small C++ example program which the Python version may be found in +\ref{FIELDgeneral.py}. -\filePython{FIELDgeneral.py} +\fileCxx{FIELDgeneral.cxx} \section{Create a Field} @@ -687,9 +641,102 @@ You \textbf{SHOULD} also set unit of your components with \method{setMEDComponen To set value, use \method{setValueIJ} to put new value of field. +Here is a small C++ example program which the Python version may be found in +\ref{FIELDcreate.py}. + \fileCxx{FIELDcreate.cxx} -\filePython{FIELDcreate.py} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\chapter{How to use MESHING object} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +This class is a derivated class of MESH class to build a MESH object from +scratch (use of set methods). + +All verifications are under user responsability : If arrays values or arrays +dimensions are wrongs, results are impredicable. + +All arrays in arguments in set methods are duplicated in MESHING object. + +\section{Build a MESHING} + +\label{BuildMeshing} + +\subsection{Coordinates} + +First we must defined points coordinates of the mesh. We use +\method{setCoordinates}. + +\textbf{C++ Example~:} +\begin{verbatim} +MESHING myMeshing ; +const int SpaceDimension=2; +const int NumberOfNodes=6; +int * Coordinates = new int[SpaceDimension*NumberOfNodes] ; +string System="CARTESIAN"; +medModeSwitch MED_FULL_INTERLACE ; +myMeshing.setCoordinates(SpaceDimension,NumberOfNodes,Coordinates,System,Mode); +\end{verbatim} + +Then you could set the coordinates names and units (with +\method{setCoordinatesNames} and \method{setCoordinatesUnits}). + +\subsection{Connectivities} + +When coordinates are defined, we could defined connectivities. + +First we must defined connectivity of MED\_CELL elements. +After, we could defined constituent connectivity if necesary +(MED\_FACE and/or MED\_EDGE). + +For each connectivities, you could use some methods in the following order : +\begin{itemize} +\item \method{setNumberOfTypes} to set the number of differents geometrics +types (3 for example). This method allocates all arrays which size is this +number ; +\item \method{setTypes} to set the differents geometrics types +({MED\_TETRA4,MED\_PYRA5,MED\_HEXA8} for example). Types should be given +in increasing order of number of nodes for this type ; +\item \method{setNumberOfElements} to set the number of elements for +each geometric type. This method allocates connectivities array ; +\item \method{setConnectivity} to set the connectivity in MED\_FULL\_INTERLACE +mode for each geometric type (use \method{setPolygonsConnectivity} and +\method{setPolyhedraConnectivity} for poly elements); +\end{itemize} + +\textbf{C++ Example~:} +\begin{verbatim} +MESHING myMeshing ; +myMeshing.setCoordinates(SpaceDimension,NumberOfNodes,Coordinates,System,Mode); + +myMeshing.setNumberOfTypes(2,MED_CELL); +myMeshing.setTypes({MED_TRIA3,MED_QUAD4},MED_CELL); +myMeshing.setNumberOfElements({3,2},MED_CELL); // 3 MED_TRIA3 and 2 MED_QUAD4 +myMeshing.setConnectivity({1,2,3,6,8,9,4,5,6},MED_CELL,MED_TRIA3); +myMeshing.setConnectivity({1,3,4,5,4,5,7,8},MED_CELL,MED_QUAD4); +\end{verbatim} + + +\section{Defined a GROUP object} + +To add a group in a MESHING object, use \method{addGroup}. + +This method duplicate the GROUP object in the MESH object. + +To build this GROUP object, use SUPPORT methods \ref{CreateSupport} to set all attributes. + +\subsection{WARNING} + +For instance, translation from GROUP objects to FAMILY objects are not completed ! + +You MUST set GROUP objects as if they are FAMILY objects. + +This feature will be fully implemented in next release of med memory. + +Here is a small C++ example program which the Python version may be found in +\ref{MESHINGexample.py}. + +\fileCxx{MESHINGexample.cxx} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \chapter{Using drivers} @@ -731,9 +778,10 @@ rem 2 : Since the driver has read the object, the associated file is closed. You can reread the object with the default driver by calling the read() method : myObject.read(). -\fileCxx{MEDMEM_InvokingDriverAtObjectCreationTime.cxx} +Here is a small C++ example program which the Python version may be found in +\ref{MEDMEM_InvokingDriverAtObjectCreationTime.py}. -\filePython{MEDMEM_InvokingDriverAtObjectCreationTime.py} +\fileCxx{MEDMEM_InvokingDriverAtObjectCreationTime.cxx} \subsection{Invoking a driver from the standard driver method of an object\label{sec:invoking_a_driver_from_the_std_drv_method}} @@ -755,9 +803,10 @@ write() methods. rem 2 : If you use more than a driver you need to keep the driver handlers (myDriverI ). -\fileCxx{MEDMEM_InvokingDriverFromStandardObjectMethod.cxx} +Here is a small C++ example program which the Python version may be found in +\ref{MEDMEM_InvokingDriverFromStandardObjectMethod.py}. -\filePython{MEDMEM_InvokingDriverFromStandardObjectMethod.py} +\fileCxx{MEDMEM_InvokingDriverFromStandardObjectMethod.cxx} \subsection{Invoking a driver and attaching it to an existing object} @@ -776,9 +825,10 @@ Don't forget to close the file with myRdOnlyDriver->close(). ToDo : By now when you create such specific drivers, the object doesn't know anything about it. -\fileCxx{MEDMEM_InvokingDriverByAttachingItToAnObject.cxx} +Here is a small C++ example program which the Python version may be found in +\ref{MEDMEM_InvokingDriverByAttachingItToAnObject.py}. -\filePython{MEDMEM_InvokingDriverByAttachingItToAnObject.py} +\fileCxx{MEDMEM_InvokingDriverByAttachingItToAnObject.cxx} \section{Using the MED driver} @@ -867,3 +917,43 @@ myGibiMeshDriver.open() ; myGibiMeshDriver.read() ; myGibiMeshDriver.close() ; \end{verbatim} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\chapter{Appendix: Python example scripts.}\label{sec:python} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\section{Full Python example for \ref{MESHgeneral.cxx}~:} +\label{MESHgeneral.py} +\verbatiminput{@srcdir@/MESHgeneral.py} + +\section{Full Python example for \ref{MESHcoordinates.cxx}~:} +\label{MESHcoordinates.py} +\verbatiminput{@srcdir@/MESHcoordinates.py} + +\section{Full Python example for \ref{MESHconnectivities.cxx}~:} +\label{MESHconnectivities.py} +\verbatiminput{@srcdir@/MESHconnectivities.py} + +\section{Full Python example for \ref{FIELDgeneral.cxx}~:} +\label{FIELDgeneral.py} +\verbatiminput{@srcdir@/FIELDgeneral.py} + +\section{Full Python example for \ref{FIELDcreate.cxx}~:} +\label{FIELDcreate.py} +\verbatiminput{@srcdir@/FIELDcreate.py} + +\section{Full Python example for \ref{MESHINGexample.cxx}~:} +\label{MESHINGexample.py} +\verbatiminput{@srcdir@/MESHINGexample.py} + +\section{Full Python example for \ref{MEDMEM_InvokingDriverAtObjectCreationTime.cxx}~:} +\label{MEDMEM_InvokingDriverAtObjectCreationTime.py} +\verbatiminput{@srcdir@/MEDMEM_InvokingDriverAtObjectCreationTime.py} + +\section{Full Python example for \ref{MEDMEM_InvokingDriverFromStandardObjectMethod.cxx}~:} +\label{MEDMEM_InvokingDriverFromStandardObjectMethod.py} +\verbatiminput{@srcdir@/MEDMEM_InvokingDriverFromStandardObjectMethod.py} + +\section{Full Python example for \ref{MEDMEM_InvokingDriverByAttachingItToAnObject.cxx}~:} +\label{MEDMEM_InvokingDriverByAttachingItToAnObject.py} +\verbatiminput{@srcdir@/MEDMEM_InvokingDriverByAttachingItToAnObject.py} diff --git a/doc/MEDMEM/MEDMEM_UML.png.in b/doc/MEDMEM/MEDMEM_UML.png.in index dfa05ef3b18e39821e7552241783344d90ff2e2f..28418d122041560577d4b5e8e68227d82d52ca18 100644 GIT binary patch literal 6942 zcmc&(2~-qEw;omr_K1pLGit;Dk_41ybpZiIHjTLb!l)=T0|FvOP*D?s5n?MiC`eFb z)u5<2Y=TiV2xH?2ZY;{;0w^E~xDf%7^}p2v6Z4Y){pWx0yz|bSIdiAF>fZ0(`&HHL zs)!X%_H1R2GKKB-@p( zRvA-Ql@|}LTxjc@K5IkS#mrleMfP)6M7t(y`G02_V#b>MA$+2|V!UUEvFtNNnvleJ@Uc= z+yg&8zR4}l}jL0HO)I4iybqYKbVCYGE-EEKS zeeq4>5HjRCc<5yQCyOu+Ihz#3cpmAL-m3C&2O6Ye`A{7mzO^)EKQ}`$;jb|XBa`M} z#`3sgPSdI0!5?@|x16b%X$CAx=DQB{wq5flUtl*sn*4(Tbe{dR>6L2IK{aY+=eHlg z1d+FXZ|KFmoE^W3B2LUICMq_S+p2Iy4KufRsP2%*yrsek>wR=H`T9HjibfQ%I1j8uy1F6SZH>6NeUw5FJEdObZfx zglh6MBj^h?X?}h<=`$)=^D;GY3R1mkFs36DjQxFl*BF8zDp|*G`C4qKB z`6?yjJBF^{au+fJU%YNqxS?!>Ihf;=SSoPB0F~6VRQN9#!1TYxFjlXW(0t>LLo_5p z1y@grngK0RBvJuEA}|2S7yq(XVZs5jF1r|l_jPOan9xPtAxXOq=1W@8JV9BCy7`#u zOgSg?wCK%qIK%|~(8^}*4Jctg`r90n+isKNLlhGJ8} zJ*nv+x`T_AX2`%F&4e@V;>8md$wHD?G+(0hWz!^;_^%f^6cZ-u?zn^xohyEctkQ`b zKM`;!tmBAp-APTDfq20gJC$0J@6M>^lf@wlD7mf+vyd;*de-o3q8_bRs)j3?s0S(( zAmS{_V!>|(*E&lR5sO=@*1|BTKo)*&crpcHu84v&T%s9nwkV_DD1{c~!2gZ%Fjoy( z$ol_}@&C}XQZ*E|Km`aJC6<+jZ8Tiymoruxw$X6$A#6VSn$ob1gi8i~Pv!EZIVoM! zrI$9HQM`W-#(OgKp@v?+!f1=3lPt3PTbzcSXQuz?KeZ`#K?Tx()wtacH~kH5%*;aU zr;PccMR|KmB-!PQN36-S7u420n_m2D_O*?P+AYe>t&!voKiq!lmR)#v2CqxB=sv4d zExlBYe)WjxF>q_6yQ1n{D=1fTz|~OD@MUH~a0)i1qy^;}DHZG*#)7v^w9W!f(Cby{ z-Gv*08#7$Mndg~>gW$*@+IE_J0HrdChZ zu%3d!P&Fogt)aQ;?^1p zuCcZHb*Z!t!y{Ad1}H-;%2Y4UNH5O=_d4PnHE^Q2Wx)c~ci$AwU$x_7Oyn5Bqz&;T z&iV1Vupw3+!Dtr|k+ZRf^(tC}heF;*%%Ax2rBDA}{ES^-m%b)=l`Ibt4!jgiCKY5D zcB=ZR`|f+$^^mK(&$SF@bm4p9b54gg-?c2xbwL1|o&te_M+>tce`slsh3qZK!l^mH zKPOpa&jW9Oh|CA#fL^E#eDsqT3pa`10Q=5~rE#E`elI4{H*e{?^i`2nLh$*rl8)tH z2B&pw6jnJ_Sh$?&NW52GIr&J5QS!OoUEc&({-fY(Xi?-AbCLhIg%!GPOO7Mkv*r@t zW+XN|(hy%M$lx|QghZNs{E$i$xZQcOBvcu=VbUWcPZvF|T;_#u$L%Wn6qkpU+K0c3 z*qa>tDE7ixOe^JXudcV%y3MJFw*mfLxZV3SjJJY5xYr~xwaegmOs{QLI#f9UmSWN2 zxi>T@aY#+uxnD4wtoeq5*9(k+XS??%df*Vna*kcg)*WpfI^J)WzR=!HxSRN@r!S-TyM*?Dm1^feN|UHm&!dzniNb8ocXQ64iy@&CYpwO6zTDadVy>F zasSIhUAqb%5+$vh=(z>e1O~uG5DbxS(x<3nBq6vefGKh+H}1gV9;fZ1Ct_meoi%L_ zobrS7KR5#+o_HP6nUJW4HCOdVzG+>OzcuRIgsx3Ez2NLicB9_}dhVy65?>B)noyM8 zxw9zocJ+8_LSuTbRg>s2@kooL{s@)HexcPL=bjPC*}BxnMv~15kSlH5@>?lB#s#ij(FVpNo+Px z&O&JsLwm7>m$}=W>8xS_n9i-=)?IFj6{+@aSdE?*6SIe#hO*A*)+UcZ8elf?Z0T){ zTcQfzT0|rJ5EwlUb?dm_>zywdkY#FSp*oe^s5s`SEFIs|zxnmW1M;AanQuNq1Q6yW zCEhGVQ;%8gPy{s@{iuF=0ez8iz%QBFl3B=fA5jxk%|+Hx!2T?LKC?fw^qB}o!4#7= zCIkS>=l;8owo|2;-<$7i{9+*M8w5zw@$>N2ump)Em*tAZ=x(83X($^30lE$+m@;wE9@Uwhbn`rK2d zjdDffEsxU&u;_G0}*jeFF#nBD5Z^jE0)+zP_9SWE8L4h}a^_!?ms?8r$VR!w!0Eu4tKvF|^J~YvE z`MlQ9Fl96NZ0wfF{of6VS7dyjk(Qp@!-+b$AGrzd0Z~skp(;s`K$!+6o*L_p8)f9e z3n^0y31gTL0$^dx6Kn&E1|Q%pi>Wfns8MxD#VaTc1qq6{qNKF)(`Je&aLlj8%w}>i z0V?4Alc`#{T1XGCK;3kcXM3@ULNQ*8dM-rG;!YZc-{3iI02my%9vBz62&xio%%g{cBOJD4Zb7 z1_692NtgM!{NchpSrj9JooD1I6~i3SFmZz7-P_tDs!ZOdRCi2%5Iuji6E$P!CIu7; zl7rc_yF0@)^W$K0tGq!X*bm%sMl#yWNr$(!`$85h#UN>-L8o#F_MeB}MR-kXOmIc$ z3Tsu3$>t%l<&1rYWqyBU*Ko-2liq#}YMjIw@lRCeU}e3^O*Zdi+Do^PWb)NXiAzsC zaZ!1MAG}r0k4Fv|2}0P-&8qi16zGZ(NAWUZVtX-hdK`lTLSIu7wlWG!s~NHB6%hmQNVgu?%4C^1vTuulC0Mz3&q{ zDj*u3J0g7LLyvXE7)-=$#z^v!Rz)1PTx%vZXV;%<`^P^;So8w@AQ3P#pyaY{XYgt$ zj&{$ojH*B26Jim+`j0V`FM*v8M;sA?@YfL9HiTH}s08oAqxezlWu16HwG zL>|-|UVZ5yom{31B9eqBWKj)wlv3_^k3qzK&<3k=PUt?8fm)Z1*n@1~;N{>_4~Cs0 z;u-Jq$Mq0RPdEqoy}$9flnfkRACKcEWHpUt~6xQ@3h93dgs!TZ36 zWL)h0<1RKc9z3~0P%(vhw(l+DWA12!L6|mZ8gzb|$7XAFHe$St(y#7rqsX#IcRaoX zDE3RA=8?t&X|I|Vx21k>ajfKfhb)rowjn1h{x*@J!zb(3h=^kNyfqWd`nY%+MrYk7 zgxRyX3*oqI{j=p$9@!tV@WSnng8vy9-M7w7?;wda554SqI;flSAeNlF52v~>h2b>O zq};UA5z>=nU2_~xu=wyuy9NzVqJYd0%5E>*9q$w7razazcpa025B-I9ZcS|;I?8}P z#b6kYaVoqKE68Br7z|Q%@W{*t1CY#c&{>l5)Zq8ia~~}~WO1q7Hap@rjFM!$xu$#8 z4-G}a1*fet?-T0=jk;?Sj*b*D4QD`$0GX}%v$zh4x8lbzP}Jnc9~{IvEQI_LoKgrJ(Om8G-{<0VWh zgFO@lMcq_z)!c5ec3L&h5xj*DQTJ(5ft&3>WyZ1;GvqOx1$rOpi9LV)!@LFIwYvAM zx^-#ThG>@4nf#`JsgutXzAY_ZV%M#5lgT6hPF}+G>1Pa$pt23F;htnB_haOlrJsI< z<%O#I(5-7N5BV?D1m3f7ih*;goC61(@Ik_xx;?V8U@ozhv^+?g$s>y*?Jq(y zAdUQdW3U1H)8jV|&f~#B7DgZTgab9C-PaqBuOY_2{Dx-nor1I}nOee?X1UTiT5BQM z0L*$6lja+YRt|%=F5qGeAVN5qP$1#oJ(PpU!dD7z6#w7i_K?tT6nF6_PsSCg0_6DU zz|-~M%1ST%AWg8=S2dX*9aOF)ej6?yOTvLvQ0-{wVA(*-w1E<-m>^=w;uNF-we`3n z412`%VSwY7H)tL(W~GBDm;?XqAar2)_k$L}2`V}|LoP}z z&0l8Tgp%Z=zvAv#k~xay@*&u$1udbl%|qfOM|Wc-=WhxuRQ8Ew|EG;mD~=9_ zsDK2gkWL$(VRheEhl?fWlR4Knc|{@2ASn3B!-hU0z(HWQzww1ygY+5Y%n7I)B^6}$ zp!Yeh8-)bE_(q=*CKXDJ!8&RI0Zt8JEs_e>Dd;T#T99xuw`MYC!w5OB8vTx5@J0lg zs7u$~acDspyzppm*r-MYA7Qrwjas1oF#v&&3LyiUZ^0ZnXRkGsAZa?*J@_c?RihD8 zB!kg8P)}r+F@-cBZ#<{-^G3L9kQ}iJzi%Ldbei7{UoRSdRdnQfZ_KsVA)Rj;JM=~X z;tfRAf#76Pdq_F9x5-~8eB`+I)kET9YHZCRW49#6%d39+t*vJC*L_LCRg;1PHXxj= z2OH_RzPSAu$38O?i$Iu#xFWw3;~lE^Hr|Tg16^>}P#g=}ip%0;^5=C<1FFoGO4n9A zrhkL88(mlU$R6~gUUksx@`g5Z)psgGaV2SMV7j@R(Fa}Izcv-T>D9ryf H_ppBgO>1_B literal 6379 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 Czk3`2 diff --git a/doc/MEDMEM/MEDMEM_UML_light.png.in b/doc/MEDMEM/MEDMEM_UML_light.png.in index 153b3be11920644a34ba8e933bf10e8877d7d8c6..8eff5fa9c564a18200e14ddeff717d653cc8eff1 100644 GIT binary patch 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 literal 3829 zcmb_f2~<;88V(>#l~~(SAp|M4i`1cFUkQs#4U|Qw6g)*6mqubAWRbEd5|AZ86s_`{ z>8WT?2Em28)PNvLo0NdiM@>@_t%zXCA_xow5KsdokojK%F72G2(;3e@IeGWKfBF7< zzyH7Y|8i}}>bY~Mb4Vo8+@L_ePe>&5g(Q;M@fXZt#)_F6NFu!`4f69@m(()w+vdY} zF5CKF?-QKAdFp}p_?eEf&t9pqcSgtlK^m{7I@`njc_q%|`~Gu03x2d@w*M5q>2A9jbRI*M;&3kE1&5*x2S}PawDzBAc1RRqv}Pv;dT5g=Om8@g7$p_z)P% zUYZ~7WI?U{F{n4?bjWQ{g{;A#kIl58`ufis@mTa)(Rx{U^FEtdSdoDD361@ObKAYN z$bw}MgE16{&KPM9=b&i5eG!dq~e6aYeTVe$MYg*j#yyQk68HNpH=QGF#3En=--72by!s%ZB4N{O@5tZXs zJ9`@;@RWQG4uW28`Gq)ZfGV`PN%@wE=I1dSsptT;QxTU%6;?!%f6aeAo*)Y`(RvVE zS(zMoxs@!Z;e_W7lPi;%PKC5jMIk(An+%%FHReFUE^dLmfFcdMAiWfzA+Cq~He;XHCej6&J-LQ*#I<=oy^ zQ^RnyE|6xmT;_=GC+28`5id9P(Xdoj@xHH!Ofqg#aOs(IJM-QMIDx2Sh^)%JjI$5C zusG|AP2PyCgDqfYFq?Dn4CYn_tY@ieupaw1f~s7>oZ9pz%m)0)|ZgL zbG6Cvv_9VqJpVOd5KIyB3@!;t@*(;REWTOd9=zR%iX)tX&0=uL-7(J#QCy$6s=F8> z?21v0j<@9-tf49a2>cRl(MU=YMQvG#U|93yKooh*#e|f3Fd5Kp7jU zVPniLZt#6af$~adZE3n@zf|(kP0@w6?Zw($fBO1{B^k_%b>i*r-J{16))eINqgaf0 zOV5wf`N`UTw(S?N1yP!9-MAk;q|>#U*?z4Mada3>T1m6wXTl1dq>g@VkJT_C>RL=R9PrUJIvuH6;3IRN(NC$$JG@w-kT7LfTcWd(c0 zGX@Nr5mgL~Haqxg4e9RLk&MK~Sch>3v~ucI&Bo+U3mU(bg<}_ESGp+WiUQQ1~`4&0J))t+TL?Gj|x z+mw7heX}en;_yBH9}PhctXzgl8!`eMn_sL=k_=> zhc^DK8&h7VU}vL)_530vjT$!9c)9yD5=ATSOBM2cx>gGX&LjN`)CEjtqiF2?PI|I- zb(BG0g!H)MI{B@b;8C6Ya{7m*wl!Y2}!L0W2!{PdSO`KHc^~V=pKs zhTb)3W@E#jIK|u1Jd1}8$n>%HEtK-S@w7;y*q%gouHovWW${BUZpV(%ild#WVY{4t zM>}|mt9+kGLtiWhs-5cQG$(w=Kqxxp*WN;ChNf;J}ipnsqjga#$D?t{+Od$&tx!f{Bos^6-Z<-2y~oE- z#);NryWat6N#AxkNzrfznfk0Bs z2+f#7kqoH!JM4_fF+Bl3Kp18SdrG-4Bp~Ehyj>-+Hkxe_=uZ#Z>Kn>piIE)Qk^WnG z%oK!Ct$L4?BV~F$9>)ggW@i{R;mB1f~$~YnJZEYZ`Tu7$8~4~oU{R!0c>x$Q+lJU!RkZFesJ}C6iqeF zc%vi`B*D$i_<%h#;&3J&xJ|;(^vnno|Br0z^86K^h4aM2pWy$$;D|IH z&J8RT<-V=(aSKrM!rct*+&&Hvm8~`d##f^C&N^UY+0}F?I<$U!j8t) zuITuiEHu6An+o^hrr0oO3A`$hJrs>cp}zms^i8J_iD90*6)k%Kc6M@E^e{In_`cy3 z(Md4SEWUQ|bokiLH|Sx;?m;j$atTigx95`kJ=t0t<%9=bulGSWlp__#gI8Wc9FOM` ziahl0SG_kxFDpMHoJo*qr`NxXC~oS>B^r%!>S#{d{5AR=M~xlQ3+H6avFOQ=x2aTe|em_O1mhY z=%%iqQpd*)7txtK-GDu}v2Q`j*Itkf)pwBAgV4%AD+Qo^0K19;*q`@!q4I~Ie27KW i>m#aoCM43D38y)S%W5}$RyzvqEGfu8#83PoE9*Zg(E-2! diff --git a/doc/MEDMEM/MEDMEM_UsersGuide.tex.in b/doc/MEDMEM/MEDMEM_UsersGuide.tex.in index 8da8ce3e2..a0ea7cd2a 100644 --- a/doc/MEDMEM/MEDMEM_UsersGuide.tex.in +++ b/doc/MEDMEM/MEDMEM_UsersGuide.tex.in @@ -72,7 +72,7 @@ % |___________________________________________________________________________| % \title{User's Guide Of Med Memory V 3.2} -\author{Patrick Goldbronn \and Eric Fayolle \and Nadir Bouhamou \and Jerome Roy \and Nicolas Crouzet} +\author{Patrick Goldbronn \and Eric Fayolle \and Nadir Bouhamou \and Jerome Roy \and Nicolas Crouzet \and Vincent Bergeaud} % ___________________________________________________________________________ % | | @@ -120,6 +120,10 @@ \bibitem{RefManualMedFile} \newblock {Reference Manual for Med File~:} \\ +{\sc V. Lefebvre \and E. Fayolle} \\ +\newblock {Projet PAL: Définition du modèle d'échange de données MED V2.2} +\newblock {\it Note technique EDF/SINETICS} +\newblock {HI-26-03-012/A} \\ \newblock {\verb+http://www-drn2.cea.fr/MED/MEDMEM/DOC/html/index.html+} \bibitem{RefManualMedMemory} diff --git a/doc/MEDMEM/MESHINGexample.py b/doc/MEDMEM/MESHINGexample.py new file mode 100644 index 000000000..9d88636d6 --- /dev/null +++ b/doc/MEDMEM/MESHINGexample.py @@ -0,0 +1,696 @@ +################################################################################### +# +# This Python script uses the wrapped C++ class MESHING to buid a mesh from only +# primitive data like coordinates (Pythoin double array) and connectivity (Python +# integer arrays). It is the Python equivalent of the C++ program +# test_MEDMEM_Meshing.cxx in the ../MEDMEM directory of the SALOME distribution +# +################################################################################### + +from libMEDMEM_Swig import * + +# files name to save the generated MESH(ING) in different format +# Med V2.1 Med V2.2 and vtk + +med21FileName = "toto21.med" + +med22FileName = "toto22.med" + +vtkFileName = "toto.vtk" + +myMeshing = MESHING() + +myMeshing.setName("meshing") + +# definition of the coordinates + +spaceDimension = 3 + +numberOfNodes = 19 + +coordinates = [] + +coordinate = [0.0, 0.0, 0.0] +coordinates.append(coordinate[0]) +coordinates.append(coordinate[1]) +coordinates.append(coordinate[2]) +coordinate = [0.0, 0.0, 1.0] +coordinates.append(coordinate[0]) +coordinates.append(coordinate[1]) +coordinates.append(coordinate[2]) +coordinate = [2.0, 0.0, 1.0] +coordinates.append(coordinate[0]) +coordinates.append(coordinate[1]) +coordinates.append(coordinate[2]) +coordinate = [0.0, 2.0, 1.0] +coordinates.append(coordinate[0]) +coordinates.append(coordinate[1]) +coordinates.append(coordinate[2]) +coordinate = [-2.0, 0.0, 1.0] +coordinates.append(coordinate[0]) +coordinates.append(coordinate[1]) +coordinates.append(coordinate[2]) +coordinate = [0.0, -2.0, 1.0] +coordinates.append(coordinate[0]) +coordinates.append(coordinate[1]) +coordinates.append(coordinate[2]) +coordinate = [1.0, 1.0, 2.0] +coordinates.append(coordinate[0]) +coordinates.append(coordinate[1]) +coordinates.append(coordinate[2]) +coordinate = [-1.0, 1.0, 2.0] +coordinates.append(coordinate[0]) +coordinates.append(coordinate[1]) +coordinates.append(coordinate[2]) +coordinate = [-1.0, -1.0, 2.0] +coordinates.append(coordinate[0]) +coordinates.append(coordinate[1]) +coordinates.append(coordinate[2]) +coordinate = [1.0, -1.0, 2.0] +coordinates.append(coordinate[0]) +coordinates.append(coordinate[1]) +coordinates.append(coordinate[2]) +coordinate = [1.0, 1.0, 3.0] +coordinates.append(coordinate[0]) +coordinates.append(coordinate[1]) +coordinates.append(coordinate[2]) +coordinate = [-1.0, 1.0, 3.0] +coordinates.append(coordinate[0]) +coordinates.append(coordinate[1]) +coordinates.append(coordinate[2]) +coordinate = [-1.0, -1.0, 3.0] +coordinates.append(coordinate[0]) +coordinates.append(coordinate[1]) +coordinates.append(coordinate[2]) +coordinate = [1.0, -1.0, 3.0] +coordinates.append(coordinate[0]) +coordinates.append(coordinate[1]) +coordinates.append(coordinate[2]) +coordinate = [1.0, 1.0, 4.0] +coordinates.append(coordinate[0]) +coordinates.append(coordinate[1]) +coordinates.append(coordinate[2]) +coordinate = [-1.0, 1.0, 4.0] +coordinates.append(coordinate[0]) +coordinates.append(coordinate[1]) +coordinates.append(coordinate[2]) +coordinate = [-1.0, -1.0, 4.0] +coordinates.append(coordinate[0]) +coordinates.append(coordinate[1]) +coordinates.append(coordinate[2]) +coordinate = [1.0, -1.0, 4.0] +coordinates.append(coordinate[0]) +coordinates.append(coordinate[1]) +coordinates.append(coordinate[2]) +coordinate = [0.0, 0.0, 5.0] +coordinates.append(coordinate[0]) +coordinates.append(coordinate[1]) +coordinates.append(coordinate[2]) + +myMeshing.setCoordinates(spaceDimension,numberOfNodes,coordinates,"CARTESIAN",MED_FULL_INTERLACE) + +for i in range(spaceDimension): + unit = "cm " + if (i == 0): + name = "X " + elif (i == 1): + name = "Y " + elif (i == 2): + name = "Z " + + myMeshing.setCoordinateName(name,i) + myMeshing.setCoordinateUnit(unit,i) + +# definition of connectivities +# cell part + +numberOfTypes = 3 +entity = MED_CELL + +types = [] +numberOfElements = [] + +types.append(MED_TETRA4) +numberOfElements.append(12) + +types.append(MED_PYRA5) +numberOfElements.append(2) + +types.append(MED_HEXA8) +numberOfElements.append(2) + +myMeshing.setNumberOfTypes(numberOfTypes,entity) +myMeshing.setTypes(types,entity) +myMeshing.setNumberOfElements(numberOfElements,entity) + +connectivityTetra = [] + +connectivity = [1,2,3,6] +connectivityTetra.append(connectivity[0]) +connectivityTetra.append(connectivity[1]) +connectivityTetra.append(connectivity[2]) +connectivityTetra.append(connectivity[3]) +connectivity = [1,2,4,3] +connectivityTetra.append(connectivity[0]) +connectivityTetra.append(connectivity[1]) +connectivityTetra.append(connectivity[2]) +connectivityTetra.append(connectivity[3]) +connectivity = [1,2,5,4] +connectivityTetra.append(connectivity[0]) +connectivityTetra.append(connectivity[1]) +connectivityTetra.append(connectivity[2]) +connectivityTetra.append(connectivity[3]) +connectivity = [1,2,6,5] +connectivityTetra.append(connectivity[0]) +connectivityTetra.append(connectivity[1]) +connectivityTetra.append(connectivity[2]) +connectivityTetra.append(connectivity[3]) +connectivity = [2,7,4,3] +connectivityTetra.append(connectivity[0]) +connectivityTetra.append(connectivity[1]) +connectivityTetra.append(connectivity[2]) +connectivityTetra.append(connectivity[3]) +connectivity = [2,8,5,4] +connectivityTetra.append(connectivity[0]) +connectivityTetra.append(connectivity[1]) +connectivityTetra.append(connectivity[2]) +connectivityTetra.append(connectivity[3]) +connectivity = [2,9,6,5] +connectivityTetra.append(connectivity[0]) +connectivityTetra.append(connectivity[1]) +connectivityTetra.append(connectivity[2]) +connectivityTetra.append(connectivity[3]) +connectivity = [2,10,3,6] +connectivityTetra.append(connectivity[0]) +connectivityTetra.append(connectivity[1]) +connectivityTetra.append(connectivity[2]) +connectivityTetra.append(connectivity[3]) +connectivity = [2,7,3,10] +connectivityTetra.append(connectivity[0]) +connectivityTetra.append(connectivity[1]) +connectivityTetra.append(connectivity[2]) +connectivityTetra.append(connectivity[3]) +connectivity = [2,8,4,7] +connectivityTetra.append(connectivity[0]) +connectivityTetra.append(connectivity[1]) +connectivityTetra.append(connectivity[2]) +connectivityTetra.append(connectivity[3]) +connectivity = [2,9,5,8] +connectivityTetra.append(connectivity[0]) +connectivityTetra.append(connectivity[1]) +connectivityTetra.append(connectivity[2]) +connectivityTetra.append(connectivity[3]) +connectivity = [2,10,6,9] +connectivityTetra.append(connectivity[0]) +connectivityTetra.append(connectivity[1]) +connectivityTetra.append(connectivity[2]) +connectivityTetra.append(connectivity[3]) + +myMeshing.setConnectivity(connectivityTetra,entity,types[0]) + +connectivityPyra = [] +connectivity = [7,8,9,10,2] +connectivityPyra.append(connectivity[0]) +connectivityPyra.append(connectivity[1]) +connectivityPyra.append(connectivity[2]) +connectivityPyra.append(connectivity[3]) +connectivityPyra.append(connectivity[4]) +connectivity = [15,18,17,16,19] +connectivityPyra.append(connectivity[0]) +connectivityPyra.append(connectivity[1]) +connectivityPyra.append(connectivity[2]) +connectivityPyra.append(connectivity[3]) +connectivityPyra.append(connectivity[4]) + +myMeshing.setConnectivity(connectivityPyra,entity,types[1]) + +connectivityHexa = [] +connectivity = [11,12,13,14,7,8,9,10] +connectivityHexa.append(connectivity[0]) +connectivityHexa.append(connectivity[1]) +connectivityHexa.append(connectivity[2]) +connectivityHexa.append(connectivity[3]) +connectivityHexa.append(connectivity[4]) +connectivityHexa.append(connectivity[5]) +connectivityHexa.append(connectivity[6]) +connectivityHexa.append(connectivity[7]) +connectivity = [15,16,17,18,11,12,13,14] +connectivityHexa.append(connectivity[0]) +connectivityHexa.append(connectivity[1]) +connectivityHexa.append(connectivity[2]) +connectivityHexa.append(connectivity[3]) +connectivityHexa.append(connectivity[4]) +connectivityHexa.append(connectivity[5]) +connectivityHexa.append(connectivity[6]) +connectivityHexa.append(connectivity[7]) + +myMeshing.setConnectivity(connectivityHexa,entity,types[2]) + +# face part + +numberOfTypes = 2 +entity = MED_FACE + +types = [] +numberOfElements = [] + +types.append(MED_TRIA3) +numberOfElements.append(4) + +types.append(MED_QUAD4) +numberOfElements.append(4) + +myMeshing.setNumberOfTypes(numberOfTypes,entity) +myMeshing.setTypes(types,entity) +myMeshing.setNumberOfElements(numberOfElements,entity) + +connectivityTria = [] +connectivity = [1,4,3] +connectivityTria.append(connectivity[0]) +connectivityTria.append(connectivity[1]) +connectivityTria.append(connectivity[2]) +connectivity = [1,5,4] +connectivityTria.append(connectivity[0]) +connectivityTria.append(connectivity[1]) +connectivityTria.append(connectivity[2]) +connectivity = [1,6,5] +connectivityTria.append(connectivity[0]) +connectivityTria.append(connectivity[1]) +connectivityTria.append(connectivity[2]) +connectivity = [1,3,6] +connectivityTria.append(connectivity[0]) +connectivityTria.append(connectivity[1]) +connectivityTria.append(connectivity[2]) + +myMeshing.setConnectivity(connectivityTria,entity,types[0]) + +connectivityQuad = [] +connectivity = [7,8,9,10] +connectivityQuad.append(connectivity[0]) +connectivityQuad.append(connectivity[1]) +connectivityQuad.append(connectivity[2]) +connectivityQuad.append(connectivity[3]) +connectivity = [11,12,13,14] +connectivityQuad.append(connectivity[0]) +connectivityQuad.append(connectivity[1]) +connectivityQuad.append(connectivity[2]) +connectivityQuad.append(connectivity[3]) +connectivity = [11,7,8,12] +connectivityQuad.append(connectivity[0]) +connectivityQuad.append(connectivity[1]) +connectivityQuad.append(connectivity[2]) +connectivityQuad.append(connectivity[3]) +connectivity = [12,8,9,13] +connectivityQuad.append(connectivity[0]) +connectivityQuad.append(connectivity[1]) +connectivityQuad.append(connectivity[2]) +connectivityQuad.append(connectivity[3]) + +myMeshing.setConnectivity(connectivityQuad,entity,types[1]) + +meshDimension = spaceDimension # because there 3D cells in the mesh +myMeshing.setMeshDimension(meshDimension) + +# edge part + +# adding GROUPs +# on Node + +myGroup = GROUP() +myGroup.setName("SomeNodes") +myGroup.setMesh(myMeshing) +myGroup.setEntity(MED_NODE) +myGroup.setNumberOfGeometricType(1) + +myTypes = [MED_NONE] +myGroup.setGeometricType(myTypes) + +myNumberOfElements = [4] +myGroup.setNumberOfElements(myNumberOfElements) + +index = [1,5] +values = [1,4,5,7] +myGroup.setNumber(index,values) + +myMeshing.addGroup(myGroup) + +myGroup = GROUP() +myGroup.setName("OtherNodes") +myGroup.setMesh(myMeshing) +myGroup.setEntity(MED_NODE) +myGroup.setNumberOfGeometricType(1) + +myTypes = [MED_NONE] +myGroup.setGeometricType(myTypes) + +myNumberOfElements = [3] +myGroup.setNumberOfElements(myNumberOfElements) + +index = [1,4] +values = [2,3,6] +myGroup.setNumber(index,values) + +myMeshing.addGroup(myGroup) + +# on Cell + +myGroup = GROUP() +myGroup.setName("SomeCells") +myGroup.setMesh(myMeshing) +myGroup.setEntity(MED_CELL) +myGroup.setNumberOfGeometricType(3) + +myTypes = [MED_TETRA4,MED_PYRA5,MED_HEXA8] +myGroup.setGeometricType(myTypes) + +myNumberOfElements = [4,1,2] +myGroup.setNumberOfElements(myNumberOfElements) + +index = [1,5,6,8] +values = [ + 2,7,8,12, + 13, + 15,16 + ] +myGroup.setNumber(index,values) + +myMeshing.addGroup(myGroup) + +myGroup = GROUP() +myGroup.setName("OtherCells") +myGroup.setMesh(myMeshing) +myGroup.setEntity(MED_CELL) +myGroup.setNumberOfGeometricType(2) + +myTypes = [MED_TETRA4,MED_PYRA5] +myGroup.setGeometricType(myTypes) + +myNumberOfElements = [4,1] +myGroup.setNumberOfElements(myNumberOfElements) + +index = [1,5,6] +values = [ + 3,4,5,9, + 14 + ] +myGroup.setNumber(index,values) + +myMeshing.addGroup(myGroup) + +# on Face + +myGroup = GROUP() +myGroup.setName("SomeFaces") +myGroup.setMesh(myMeshing) +myGroup.setEntity(MED_FACE) +myGroup.setNumberOfGeometricType(2) + +myTypes = [MED_TRIA3,MED_QUAD4] +myGroup.setGeometricType(myTypes) + +myNumberOfElements = [2,3] +myGroup.setNumberOfElements(myNumberOfElements) + +index = [1,3,6] +values = [ + 2,4, + 5,6,8 + ] +myGroup.setNumber(index,values) + +myMeshing.addGroup(myGroup) + +myGroup = GROUP() +myGroup.setName("OtherFaces") +myGroup.setMesh(myMeshing) +myGroup.setEntity(MED_FACE) +myGroup.setNumberOfGeometricType(1) + +myTypes = [MED_TRIA3] +myGroup.setGeometricType(myTypes) + +myNumberOfElements = [2] +myGroup.setNumberOfElements(myNumberOfElements) + +index = [1,3] +values = [ + 1,3 + ] +myGroup.setNumber(index,values) + +myMeshing.addGroup(myGroup) + +# saving of the generated mesh in MED 2.1, 2.2 and VTK format + +medFileVersion = getMedFileVersionForWriting() +print "Med File Version For Writing ",medFileVersion + +if (medFileVersion == V22): + setMedFileVersionForWriting(V21) + +idMedV21 = myMeshing.addDriver(MED_DRIVER,med21FileName,myMeshing.getName()) +myMeshing.write(idMedV21) + +medFileVersion = getMedFileVersionForWriting() +if (medFileVersion == V21): + setMedFileVersionForWriting(V22) + +idMedV22 = myMeshing.addDriver(MED_DRIVER,med22FileName,myMeshing.getName()) +myMeshing.write(idMedV22) + +idVtk = myMeshing.addDriver(VTK_DRIVER,vtkFileName,myMeshing.getName()) +myMeshing.write(idVtk) + +# we build now 8 fields : 4 fields double (integer) : +# 2 fields on nodes (cells) : +# 1 scalar (vector) + +supportOnNodes = SUPPORT(myMeshing,"On_All_Nodes",MED_NODE) +numberOfNodes = supportOnNodes.getNumberOfElements(MED_ALL_ELEMENTS) + +supportOnCells = SUPPORT(myMeshing,"On_All_Cells",MED_CELL) +numberOfCells = supportOnCells.getNumberOfElements(MED_ALL_ELEMENTS) + +fieldDoubleScalarOnNodes = FIELDDOUBLE(supportOnNodes,1) +fieldDoubleScalarOnNodes.setName("fieldScalarDoubleNode") +fieldDoubleScalarOnNodes.setIterationNumber(-1) +fieldDoubleScalarOnNodes.setOrderNumber(-1) +fieldDoubleScalarOnNodes.setTime(0.0) + +fieldDoubleScalarOnNodes.setComponentName(1,"Vx") +fieldDoubleScalarOnNodes.setComponentDescription(1,"comp1") +fieldDoubleScalarOnNodes.setMEDComponentUnit(1,"unit1") + +fieldDoubleVectorOnNodes = FIELDDOUBLE(supportOnNodes,spaceDimension) +fieldDoubleVectorOnNodes.setName("fieldVectorDoubleNode") +fieldDoubleVectorOnNodes.setIterationNumber(-1) +fieldDoubleVectorOnNodes.setOrderNumber(-1) +fieldDoubleVectorOnNodes.setTime(0.0) + +fieldDoubleVectorOnNodes.setComponentName(1,"Vx") +fieldDoubleVectorOnNodes.setComponentDescription(1,"comp1") +fieldDoubleVectorOnNodes.setMEDComponentUnit(1,"unit1") +fieldDoubleVectorOnNodes.setComponentName(2,"Vy") +fieldDoubleVectorOnNodes.setComponentDescription(2,"comp2") +fieldDoubleVectorOnNodes.setMEDComponentUnit(2,"unit2") +fieldDoubleVectorOnNodes.setComponentName(3,"Vz") +fieldDoubleVectorOnNodes.setComponentDescription(3,"comp3") +fieldDoubleVectorOnNodes.setMEDComponentUnit(3,"unit3") + +fieldDoubleScalarOnCells = FIELDDOUBLE(supportOnCells,1) +fieldDoubleScalarOnCells.setName("fieldScalarDoubleCell") +fieldDoubleScalarOnCells.setIterationNumber(-1) +fieldDoubleScalarOnCells.setOrderNumber(-1) +fieldDoubleScalarOnCells.setTime(0.0) + +fieldDoubleScalarOnCells.setComponentName(1,"Vx") +fieldDoubleScalarOnCells.setComponentDescription(1,"comp1") +fieldDoubleScalarOnCells.setMEDComponentUnit(1,"unit1") + +fieldDoubleVectorOnCells = FIELDDOUBLE(supportOnCells,spaceDimension) +fieldDoubleVectorOnCells.setName("fieldVectorrDoubleCell") +fieldDoubleVectorOnCells.setIterationNumber(-1) +fieldDoubleVectorOnCells.setOrderNumber(-1) +fieldDoubleVectorOnCells.setTime(0.0) + +fieldDoubleVectorOnCells.setComponentName(1,"Vx") +fieldDoubleVectorOnCells.setComponentDescription(1,"comp1") +fieldDoubleVectorOnCells.setMEDComponentUnit(1,"unit1") +fieldDoubleVectorOnCells.setComponentName(2,"Vy") +fieldDoubleVectorOnCells.setComponentDescription(2,"comp2") +fieldDoubleVectorOnCells.setMEDComponentUnit(2,"unit2") +fieldDoubleVectorOnCells.setComponentName(3,"Vz") +fieldDoubleVectorOnCells.setComponentDescription(3,"comp3") +fieldDoubleVectorOnCells.setMEDComponentUnit(3,"unit3") + +fieldIntScalarOnNodes = FIELDINT(supportOnNodes,1) +fieldIntScalarOnNodes.setName("fieldScalarIntNode") +fieldIntScalarOnNodes.setIterationNumber(-1) +fieldIntScalarOnNodes.setOrderNumber(-1) +fieldIntScalarOnNodes.setTime(0.0) + +fieldIntScalarOnNodes.setComponentName(1,"Vx") +fieldIntScalarOnNodes.setComponentDescription(1,"comp1") +fieldIntScalarOnNodes.setMEDComponentUnit(1,"unit1") + +fieldIntVectorOnNodes = FIELDINT(supportOnNodes,spaceDimension) +fieldIntVectorOnNodes.setName("fieldVectorIntNode") +fieldIntVectorOnNodes.setIterationNumber(-1) +fieldIntVectorOnNodes.setOrderNumber(-1) +fieldIntVectorOnNodes.setTime(0.0) + +fieldIntVectorOnNodes.setComponentName(1,"Vx") +fieldIntVectorOnNodes.setComponentDescription(1,"comp1") +fieldIntVectorOnNodes.setMEDComponentUnit(1,"unit1") +fieldIntVectorOnNodes.setComponentName(2,"Vy") +fieldIntVectorOnNodes.setComponentDescription(2,"comp2") +fieldIntVectorOnNodes.setMEDComponentUnit(2,"unit2") +fieldIntVectorOnNodes.setComponentName(3,"Vz") +fieldIntVectorOnNodes.setComponentDescription(3,"comp3") +fieldIntVectorOnNodes.setMEDComponentUnit(3,"unit3") + +fieldIntScalarOnCells = FIELDINT(supportOnCells,1) +fieldIntScalarOnCells.setName("fieldScalarIntCell") +fieldIntScalarOnCells.setIterationNumber(-1) +fieldIntScalarOnCells.setOrderNumber(-1) +fieldIntScalarOnCells.setTime(0.0) + +fieldIntScalarOnCells.setComponentName(1,"Vx") +fieldIntScalarOnCells.setComponentDescription(1,"comp1") +fieldIntScalarOnCells.setMEDComponentUnit(1,"unit1") + +fieldIntVectorOnCells = FIELDINT(supportOnCells,spaceDimension) +fieldIntVectorOnCells.setName("fieldVectorrIntCell") +fieldIntVectorOnCells.setIterationNumber(-1) +fieldIntVectorOnCells.setOrderNumber(-1) +fieldIntVectorOnCells.setTime(0.0) + +fieldIntVectorOnCells.setComponentName(1,"Vx") +fieldIntVectorOnCells.setComponentDescription(1,"comp1") +fieldIntVectorOnCells.setMEDComponentUnit(1,"unit1") +fieldIntVectorOnCells.setComponentName(2,"Vy") +fieldIntVectorOnCells.setComponentDescription(2,"comp2") +fieldIntVectorOnCells.setMEDComponentUnit(2,"unit2") +fieldIntVectorOnCells.setComponentName(3,"Vz") +fieldIntVectorOnCells.setComponentDescription(3,"comp3") +fieldIntVectorOnCells.setMEDComponentUnit(3,"unit3") + +for i in range(numberOfNodes): + valueInt1 = i+1 + valueInt2 = i+2 + valueInt3 = i+3 + valueDbl1 = valueInt1*0.1 + valueDbl2 = valueInt2*0.1 + valueDbl3 = valueInt3*0.1 + fieldDoubleScalarOnNodes.setValueIJ(i+1,1,valueDbl1) + + fieldIntScalarOnNodes.setValueIJ(i+1,1,valueInt1) + + fieldDoubleVectorOnNodes.setValueIJ(i+1,1,valueDbl1) + fieldDoubleVectorOnNodes.setValueIJ(i+1,2,valueDbl2) + fieldDoubleVectorOnNodes.setValueIJ(i+1,3,valueDbl3) + + fieldIntVectorOnNodes.setValueIJ(i+1,1,valueInt1) + fieldIntVectorOnNodes.setValueIJ(i+1,2,valueInt2) + fieldIntVectorOnNodes.setValueIJ(i+1,3,valueInt3) + +for i in range(numberOfCells): + valueInt1 = i+1 + valueInt2 = i+2 + valueInt3 = i+3 + valueDbl1 = valueInt1*0.1 + valueDbl2 = valueInt2*0.1 + valueDbl3 = valueInt3*0.1 + fieldDoubleScalarOnCells.setValueIJ(i+1,1,valueDbl1) + + fieldIntScalarOnCells.setValueIJ(i+1,1,valueInt1) + + fieldDoubleVectorOnCells.setValueIJ(i+1,1,valueDbl1) + fieldDoubleVectorOnCells.setValueIJ(i+1,2,valueDbl2) + fieldDoubleVectorOnCells.setValueIJ(i+1,3,valueDbl3) + + fieldIntVectorOnCells.setValueIJ(i+1,1,valueInt1) + fieldIntVectorOnCells.setValueIJ(i+1,2,valueInt2) + fieldIntVectorOnCells.setValueIJ(i+1,3,valueInt3) + +medFileVersion = getMedFileVersionForWriting() +print "Med File Version For Writing ",medFileVersion + +if (medFileVersion == V22): + setMedFileVersionForWriting(V21) + +idMedV21 = fieldDoubleScalarOnNodes.addDriver(MED_DRIVER,med21FileName,fieldDoubleScalarOnNodes.getName()) +fieldDoubleScalarOnNodes.write(idMedV21) + +idMedV21 = fieldIntScalarOnNodes.addDriver(MED_DRIVER,med21FileName,fieldIntScalarOnNodes.getName()) +fieldIntScalarOnNodes.write(idMedV21) + +idMedV21 = fieldDoubleVectorOnNodes.addDriver(MED_DRIVER,med21FileName,fieldDoubleVectorOnNodes.getName()) +fieldDoubleVectorOnNodes.write(idMedV21) + +idMedV21 = fieldIntVectorOnNodes.addDriver(MED_DRIVER,med21FileName,fieldIntVectorOnNodes.getName()) +fieldIntVectorOnNodes.write(idMedV21) + +idMedV21 = fieldDoubleScalarOnCells.addDriver(MED_DRIVER,med21FileName,fieldDoubleScalarOnCells.getName()) +fieldDoubleScalarOnCells.write(idMedV21) + +idMedV21 = fieldIntScalarOnCells.addDriver(MED_DRIVER,med21FileName,fieldIntScalarOnCells.getName()) +fieldIntScalarOnCells.write(idMedV21) + +idMedV21 = fieldDoubleVectorOnCells.addDriver(MED_DRIVER,med21FileName,fieldDoubleVectorOnCells.getName()) +fieldDoubleVectorOnCells.write(idMedV21) + +idMedV21 = fieldIntVectorOnCells.addDriver(MED_DRIVER,med21FileName,fieldIntVectorOnCells.getName()) +fieldIntVectorOnCells.write(idMedV21) + +medFileVersion = getMedFileVersionForWriting() +if (medFileVersion == V21): + setMedFileVersionForWriting(V22) + +idMedV22 = fieldDoubleScalarOnNodes.addDriver(MED_DRIVER,med22FileName,fieldDoubleScalarOnNodes.getName()) +fieldDoubleScalarOnNodes.write(idMedV22) + +idMedV22 = fieldIntScalarOnNodes.addDriver(MED_DRIVER,med22FileName,fieldIntScalarOnNodes.getName()) +fieldIntScalarOnNodes.write(idMedV22) + +idMedV22 = fieldDoubleVectorOnNodes.addDriver(MED_DRIVER,med22FileName,fieldDoubleVectorOnNodes.getName()) +fieldDoubleVectorOnNodes.write(idMedV22) + +idMedV22 = fieldIntVectorOnNodes.addDriver(MED_DRIVER,med22FileName,fieldIntVectorOnNodes.getName()) +fieldIntVectorOnNodes.write(idMedV22) + +idMedV22 = fieldDoubleScalarOnCells.addDriver(MED_DRIVER,med22FileName,fieldDoubleScalarOnCells.getName()) +fieldDoubleScalarOnCells.write(idMedV22) + +idMedV22 = fieldIntScalarOnCells.addDriver(MED_DRIVER,med22FileName,fieldIntScalarOnCells.getName()) +fieldIntScalarOnCells.write(idMedV22) + +idMedV22 = fieldDoubleVectorOnCells.addDriver(MED_DRIVER,med22FileName,fieldDoubleVectorOnCells.getName()) +fieldDoubleVectorOnCells.write(idMedV22) + +idMedV22 = fieldIntVectorOnCells.addDriver(MED_DRIVER,med22FileName,fieldIntVectorOnCells.getName()) +fieldIntVectorOnCells.write(idMedV22) + +idVtk = fieldDoubleScalarOnNodes.addDriver(VTK_DRIVER,vtkFileName,fieldDoubleScalarOnNodes.getName()) +fieldDoubleScalarOnNodes.writeAppend(idVtk) + +idVtk = fieldIntScalarOnNodes.addDriver(VTK_DRIVER,vtkFileName,fieldIntScalarOnNodes.getName()) +fieldIntScalarOnNodes.writeAppend(idVtk) + +idVtk = fieldDoubleVectorOnNodes.addDriver(VTK_DRIVER,vtkFileName,fieldDoubleVectorOnNodes.getName()) +fieldDoubleVectorOnNodes.writeAppend(idVtk) + +idVtk = fieldIntVectorOnNodes.addDriver(VTK_DRIVER,vtkFileName,fieldIntVectorOnNodes.getName()) +fieldIntVectorOnNodes.writeAppend(idVtk) + +idVtk = fieldDoubleScalarOnCells.addDriver(VTK_DRIVER,vtkFileName,fieldDoubleScalarOnCells.getName()) +fieldDoubleScalarOnCells.writeAppend(idVtk) + +idVtk = fieldIntScalarOnCells.addDriver(VTK_DRIVER,vtkFileName,fieldIntScalarOnCells.getName()) +fieldIntScalarOnCells.writeAppend(idVtk) + +idVtk = fieldDoubleVectorOnCells.addDriver(VTK_DRIVER,vtkFileName,fieldDoubleVectorOnCells.getName()) +fieldDoubleVectorOnCells.writeAppend(idVtk) + +idVtk = fieldIntVectorOnCells.addDriver(VTK_DRIVER,vtkFileName,fieldIntVectorOnCells.getName()) +fieldIntVectorOnCells.writeAppend(idVtk) diff --git a/doc/MEDMEM/MESHconnectivities.cxx b/doc/MEDMEM/MESHconnectivities.cxx index 680308d7f..1580d640f 100644 --- a/doc/MEDMEM/MESHconnectivities.cxx +++ b/doc/MEDMEM/MESHconnectivities.cxx @@ -2,7 +2,6 @@ // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS // #include "MEDMEM_Mesh.hxx" -#include "MEDMEM_CellModel.hxx" using namespace MEDMEM ; using namespace MED_EN ; @@ -22,16 +21,15 @@ int main (int argc, char ** argv) { // we get all type for cell entity : int NumberOfTypes = myMesh.getNumberOfTypes(MED_CELL) ; - const CELLMODEL * Types = myMesh.getCellsTypes(MED_CELL) ; - cout << "Show Connectivity (Nodal) :" << endl ; - // this example use access with a specified medGeometryElement through - // CELLMODEL class + // this example use access with a specified medGeometryElement array + const medGeometryElement * Types = myMesh.getTypes(MED_CELL); + string * cellTypeNames = myMesh.getCellTypeNames(MED_CELL); for (int i=0; i