]> SALOME platform Git repositories - tools/medcoupling.git/blob - doc/tutorial/medloader_basicAPI1_fr.rst
Salome HOME
Merge branch 'master' of https://codev-tuleap.cea.fr/plugins/git/salome/medcoupling
[tools/medcoupling.git] / doc / tutorial / medloader_basicAPI1_fr.rst
1
2 Lecture, écriture d'un fichier MED grâce à l'API basique de MEDLoader
3 ---------------------------------------------------------------------
4
5 L'API basique de MEDLoader est contenue dans la classe ``MEDLoader``.
6 Toutes les méthodes de cette classe sont *statiques* (elles ne dépendent pas d'une instance particulière de la
7 classe), leurs noms commencent par une majuscule. 
8 L'ensemble des lectures/écritures sont exécutées à chaque appel de méthode et aucun état interne à la classe n'est
9 enregistré.
10
11 Objectif
12 ~~~~~~~~
13
14 Ecrire un maillage et un champ à partir de rien, les relire et comparer les résultats.
15
16 Points abordés: en utilisant l'API basique de ``MEDLoader``
17
18 * Ecrire un fichier
19 * Lire un fichier
20
21 Début d'implémentation
22 ~~~~~~~~~~~~~~~~~~~~~~
23
24 Cet exercice repose comme tous les autres sur le language de script Python. On charge 
25 le module Python ``MEDLoader``.
26
27 Pour information, le module ``MEDCoupling`` complet est inclus dans ``MEDLoader``. Pas besoin de l'importer
28 si ``MEDLoader`` a été chargé. ::
29
30         import MEDLoader as ml
31
32 Lecture, écriture d'un maillage
33 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
34
35 Tout d'abord créons un maillage ``targetMesh`` composé de plusieurs types géométriques. ::
36
37         targetCoords = [-0.3,-0.3, 0.2,-0.3, 0.7,-0.3, -0.3,0.2, 0.2,0.2, 0.7,0.2, -0.3,0.7, 0.2,0.7, 0.7,0.7 ]
38         targetConn = [0,3,4,1, 1,4,2, 4,5,2, 6,7,4,3, 7,8,5,4]
39         targetMesh = ml.MEDCouplingUMesh("MyMesh",2)
40         targetMesh.allocateCells(5)
41         targetMesh.insertNextCell(ml.NORM_TRI3,3,targetConn[4:7])
42         targetMesh.insertNextCell(ml.NORM_TRI3,3,targetConn[7:10])
43         targetMesh.insertNextCell(ml.NORM_QUAD4,4,targetConn[0:4])
44         targetMesh.insertNextCell(ml.NORM_QUAD4,4,targetConn[10:14])
45         targetMesh.insertNextCell(ml.NORM_QUAD4,4,targetConn[14:18])
46         myCoords = ml.DataArrayDouble(targetCoords,9,2)
47         myCoords.setInfoOnComponents(["X [km]","YY [mm]"])
48         targetMesh.setCoords(myCoords)
49
50 .. note:: Le maillage ``targetMesh`` est ordonné par type géométrique.
51
52 Le maillage peut alors directement être écrit ... ::
53
54         ml.WriteUMesh("TargetMesh.med",targetMesh,True)  # True means 'from scratch'
55
56 ... et relu. ::
57
58         meshRead = ml.ReadUMeshFromFile("TargetMesh.med",targetMesh.getName(),0)
59         print "Is the read mesh equal to 'targetMesh' ?", meshRead.isEqual(targetMesh,1e-12)
60
61 Lire/Ecrire un champ sur un pas de temps
62 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
63
64 Nous créons maintenant un champ de vecteurs ``f`` aux cellules (P0) avec ``targetMesh`` comme support. 
65 Ce champ correspond par exemple au temps physique 5.6, repéré par l'itération 7 et la sous-itération 8. 
66 Nous en profitons pour rappeler
67 que dans les champs MEDCoupling, le temps physique est donné pour information seulement, le stockage et la plupart des
68 fonctions de l'API se basent sur les deux derniers entiers. ::
69
70         f = ml.MEDCouplingFieldDouble.New(ml.ON_CELLS, ml.ONE_TIME)
71         f.setTime(5.6,7,8)                              # Declare the timestep associated to the field 
72         f.setArray(targetMesh.computeCellCenterOfMass())
73         f.setMesh(targetMesh)
74         f.setName("AFieldName")
75         ml.WriteField("MyFirstField.med",f,True)
76
77 Question subsidiaire : à quoi correspond le champ ainsi créé ?
78
79 .. note:: Le maillage **et** le champ sont écrits d'un seul coup dans le fichier "MyFirstField.med".
80
81 Nous relisons ensuite MyFirstField.med : ::
82
83         f2 = ml.ReadFieldCell("MyFirstField.med", f.getMesh().getName(), 0, f.getName(), 7, 8)
84         print "Is the read field identical to 'f' ?", f2.isEqual(f,1e-12,1e-12)
85         
86 .. note:: Lors de la lecture du champ, on doit donc connaître: son nom, le nom de sa mesh de support
87         et le pas de temps voulu. Des fonctions du type ``MEDFileFields.getFieldsNames()`` ou encore 
88         ``MEDFileMeshes.getMeshesNames()`` aident à cela.
89         
90 .. note:: Le nom ``ReadFieldCell()`` rappelle que le champ doit être lu aux cellules. Souvenez-vous que suivant la 
91         norme MED fichier, un même champ peut avoir une partie de ses données stockées aux cellules, mais aussi 
92         simultanément aux noeuds, aux points de Gauss, etc ... même si ce genre de mélange exotique n'est généralement
93         pas conseillé.
94
95 Lire/Ecrire un champ sur plusieurs pas de temps
96 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
97
98 Ici contrairement au cas précédent, nous écrivons en plusieurs fois dans le *même* fichier MED.
99 Ecrivons tout d'abord le maillage. ::
100
101         ml.WriteUMesh("MySecondField.med",f.getMesh(),True)
102         
103 Ensuite, nous écrivons seulement les informations relatives au champ (principalement son tableau de valeurs en fait
104 ). ::
105
106         ml.WriteFieldUsingAlreadyWrittenMesh("MySecondField.med",f)   # mesh is not re-written
107         
108 Nous rajoutons ensuite un second pas de temps sur le *même* maillage. ::
109
110         f2 = f.clone(True)         # 'True' means that we need a deep copy  
111         f2.getArray()[:] = 2.0
112         f2.setTime(7.8,9,10)
113         ml.WriteFieldUsingAlreadyWrittenMesh("MySecondField.med",f2)
114
115 Maintenant le fichier "MySecondField.med" contient le maillage et un champ à deux pas de temps porté par ce maillage.
116
117 Nous pouvons relire tout cela avec des méthodes similaires à ce qui a été vu précédemment : ::
118
119         f3 = ml.ReadFieldCell("MySecondField.med",f.getMesh().getName(),0,f.getName(),7,8)
120         print "Is the field read in file equals to 'f' ?", f.isEqual(f3,1e-12,1e-12)
121         f4 = ml.ReadFieldCell("MySecondField.med",f.getMesh().getName(),0,f.getName(),9,10)
122         print "Is the field read in file equals to 'f2' ?", f2.isEqual(f4,1e-12,1e-12)
123
124 Solution
125 ~~~~~~~~
126
127 :ref:`python_testMEDLoaderBasicAPI1_solution`