Salome HOME
Documentation reorganization
[tools/medcoupling.git] / doc / tutorial / medloader_advancedAPI1_en.rst
1
2 Reading, Writing a MED file using MEDLoader's advanced API
3 ----------------------------------------------------------
4
5 The advanced API is incarnated by the MEDFile* classes in the MEDLoader library.
6
7 * MEDFileMesh, MEDFileUMesh, MEDFileCMesh
8 * MEDFileMeshes, MEDFileMeshMultiTS
9 * MEDFileField1TS, MEDFileFieldMultiTS
10 * MEDFileFields, MEDFileFieldGlobs
11 * MEDFileData
12
13 Objective
14 ~~~~~~~~~
15
16 Write a mesh and a field from scratch, re-read them and compare the result.
17
18 Topics covered:
19
20 * Read/Write Mesh using MEDLoader's advanced API
21 * Read/Write Field using MEDLoader's advanced API
22
23 Implementation start
24 ~~~~~~~~~~~~~~~~~~~~
25
26 To implement this exercise we use the Python scripting language and import the MEDLoader Python module.
27 The whole MEDCoupling module is fully included in MEDLoader. No need to import MEDCoupling when MEDLoader has been loaded. ::
28
29         from MEDLoader import *
30
31 Writing and Reading meshes using MEDLoader's advanced API
32 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
33
34 First of all, creation of a mesh "targetMesh". ::
35
36         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 ];
37         targetConn=[0,3,4,1, 1,4,2, 4,5,2, 6,7,4,3, 7,8,5,4];
38         targetMesh=MEDCouplingUMesh.New("MyMesh",2);
39         targetMesh.allocateCells(5);
40         targetMesh.insertNextCell(NORM_TRI3,3,targetConn[4:7]);
41         targetMesh.insertNextCell(NORM_TRI3,3,targetConn[7:10]);
42         targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[0:4]);
43         targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[10:14]);
44         targetMesh.insertNextCell(NORM_QUAD4,4,targetConn[14:18]);
45         targetMesh.finishInsertingCells();
46         myCoords=DataArrayDouble.New(targetCoords,9,2);
47         targetMesh.setCoords(myCoords);
48         
49
50 .. note:: targetMesh is grouped by geometric type.
51
52 Build "targetMesh1" representing the sub-constituents (faces) of "targetMesh" reduced to cell ids [3,4,7,8]. 
53 ::
54
55         targetMeshConsti=targetMesh.buildDescendingConnectivity()[0]
56         targetMesh1=targetMeshConsti[[3,4,7,8]]
57         targetMesh1.setName(targetMesh.getName())
58
59 .. note:: "targetMesh1" will be recorded as a part of the same global mesh in the MED file, so it must have the same name!
60
61 Then we are ready to write targetMesh and targetMesh1 into TargetMesh2.med. ::
62
63         meshMEDFile=MEDFileUMesh.New()
64         meshMEDFile.setMeshAtLevel(0,targetMesh)
65         meshMEDFile.setMeshAtLevel(-1,targetMesh1)
66         meshMEDFile.write("TargetMesh2.med",2) # 2 stands for write from scratch
67
68 Create 2 groups on level 0. The first called "grp0_Lev0" on cells [0,1,3] and the second called "grp1_Lev0" on cells [1,2,3,4] ::       
69
70         grp0_0=DataArrayInt.New([0,1,3]) ; grp0_0.setName("grp0_Lev0")
71         grp1_0=DataArrayInt.New([1,2,3,4]) ; grp1_0.setName("grp1_Lev0")
72         meshMEDFile.setGroupsAtLevel(0,[grp0_0,grp1_0])
73
74 Create 3 groups on level -1. The 1st called "grp0_LevM1" on cells [0,1], the 2nd called "grp1_LevM1" on cells [0,1,2], and the 3rd called "grp2_LevM1" on cells [1,2,3] ::
75
76         grp0_M1=DataArrayInt.New([0,1]) ; grp0_M1.setName("grp0_LevM1")
77         grp1_M1=DataArrayInt.New([0,1,2]) ; grp1_M1.setName("grp1_LevM1")
78         grp2_M1=DataArrayInt.New([1,2,3]) ; grp2_M1.setName("grp2_LevM1")
79         meshMEDFile.setGroupsAtLevel(-1,[grp0_M1,grp1_M1,grp2_M1])
80         
81
82 Then trying to read it. ::
83
84         meshMEDFileRead=MEDFileMesh.New("TargetMesh2.med")
85         meshRead0=meshMEDFileRead.getMeshAtLevel(0)
86         meshRead1=meshMEDFileRead.getMeshAtLevel(-1)
87         print "Is the mesh at level 0 read in file equals targetMesh ? %s"%(meshRead0.isEqual(targetMesh,1e-12))
88         print "Is the mesh at level -1 read in file equals targetMesh ? %s"%(meshRead1.isEqual(targetMesh1,1e-12))
89
90 Print available levels for group "grp0_Lev0" ::
91
92         print meshMEDFileRead.getGrpNonEmptyLevels("grp0_Lev0")
93
94 Request for cell ids of group "grp0_Lev0" ::
95
96         grp0_0_read=meshMEDFileRead.getGroupArr(0,"grp0_Lev0")
97         print "Is group \"grp0_Lev0\" are the same ? %s"%(grp0_0_read.isEqual(grp0_0))
98
99 Writing and Reading fields
100 ~~~~~~~~~~~~~~~~~~~~~~~~~~
101
102 Creation of a simple vector field on cells called f.  ::
103
104         f=MEDCouplingFieldDouble.New(ON_CELLS,ONE_TIME)
105         f.setTime(5.6,7,8)
106         f.setArray(targetMesh.getBarycenterAndOwner())
107         f.setMesh(targetMesh)
108         f.setName("AFieldName")
109
110 Put f into a MEDFileField1TS for preparation of MED writing ::
111
112         fMEDFile=MEDFileField1TS.New()
113         fMEDFile.setFieldNoProfileSBT(f)
114
115 Append field to "TargetMesh2.med" ::
116
117         fMEDFile.write("TargetMesh2.med",0) # 0 is very important here because we want to append to TargetMesh2.med and not to overwrite it
118
119 Read it : ::
120
121         fMEDFileRead=MEDFileField1TS.New("TargetMesh2.med",f.getName(),7,8)
122         fRead1=fMEDFileRead.getFieldOnMeshAtLevel(ON_CELLS,0,meshMEDFileRead) # fastest method. No reading of the supporting mesh.
123         fRead2=fMEDFileRead.getFieldAtLevel(ON_CELLS,0) # like above but mesh is re-read from file...
124         print "Does the field f remain the same using fast method ? %s"%(fRead1.isEqual(f,1e-12,1e-12))
125         print "Does the field f remain the same using slow method ? %s"%(fRead2.isEqual(f,1e-12,1e-12))
126         
127 Writing and Reading fields on a "profile"
128 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
129
130 Build a reduction on cells [1,2,3] of f and call it fPart. ::
131
132         pfl=DataArrayInt.New([1,2,3]) ; pfl.setName("My1stPfl")
133         fPart=f.buildSubPart(pfl)
134         fPart.setName("fPart")
135
136 Put it into MEDFileField1TS data structure. ::
137
138         fMEDFile2=MEDFileField1TS.New()
139         fMEDFile2.setFieldProfile(fPart,meshMEDFileRead,0,pfl)
140         fMEDFile2.write("TargetMesh2.med",0) # 0 is very important here because we want to append to TargetMesh2.med and not to scratch it
141
142 Read "fPart" field from File "TargetMesh2.med". ::
143
144         fMEDFileRead2=MEDFileField1TS.New("TargetMesh2.med",fPart.getName(),7,8)
145         fPartRead,pflRead=fMEDFileRead2.getFieldWithProfile(ON_CELLS,0,meshMEDFileRead)
146         print fPartRead.isEqualWithoutConsideringStr(fPart.getArray(),1e-12)
147         print pflRead.isEqualWithoutConsideringStr(pfl)
148
149 Solution
150 ~~~~~~~~
151
152 :ref:`python_testMEDLoaderAdvancedAPI1_solution`