2 Reading, Writing a MED file using MEDLoader's advanced API
3 ----------------------------------------------------------
5 The advanced API is incarnated by the MEDFile* classes in the MEDLoader library.
7 * MEDFileMesh, MEDFileUMesh, MEDFileCMesh
8 * MEDFileMeshes, MEDFileMeshMultiTS
9 * MEDFileField1TS, MEDFileFieldMultiTS
10 * MEDFileFields, MEDFileFieldGlobs
16 Write a mesh and a field from scratch, re-read them and compare the result.
20 * Read/Write Mesh using MEDLoader's advanced API
21 * Read/Write Field using MEDLoader's advanced API
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. ::
29 from MEDLoader import *
31 Writing and Reading meshes using MEDLoader's advanced API
32 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
34 First of all, creation of a mesh "targetMesh". ::
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);
50 .. note:: targetMesh is grouped by geometric type.
52 Build "targetMesh1" representing the sub-constituents (faces) of "targetMesh" reduced to cell ids [3,4,7,8].
55 targetMeshConsti=targetMesh.buildDescendingConnectivity()[0]
56 targetMesh1=targetMeshConsti[[3,4,7,8]]
57 targetMesh1.setName(targetMesh.getName())
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!
61 Then we are ready to write targetMesh and targetMesh1 into TargetMesh2.med. ::
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
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] ::
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])
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] ::
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])
82 Then trying to read it. ::
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))
90 Print available levels for group "grp0_Lev0" ::
92 print meshMEDFileRead.getGrpNonEmptyLevels("grp0_Lev0")
94 Request for cell ids of group "grp0_Lev0" ::
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))
99 Writing and Reading fields
100 ~~~~~~~~~~~~~~~~~~~~~~~~~~
102 Creation of a simple vector field on cells called f. ::
104 f=MEDCouplingFieldDouble.New(ON_CELLS,ONE_TIME)
106 f.setArray(targetMesh.getBarycenterAndOwner())
107 f.setMesh(targetMesh)
108 f.setName("AFieldName")
110 Put f into a MEDFileField1TS for preparation of MED writing ::
112 fMEDFile=MEDFileField1TS.New()
113 fMEDFile.setFieldNoProfileSBT(f)
115 Append field to "TargetMesh2.med" ::
117 fMEDFile.write("TargetMesh2.med",0) # 0 is very important here because we want to append to TargetMesh2.med and not to overwrite it
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))
127 Writing and Reading fields on a "profile"
128 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
130 Build a reduction on cells [1,2,3] of f and call it fPart. ::
132 pfl=DataArrayInt.New([1,2,3]) ; pfl.setName("My1stPfl")
133 fPart=f.buildSubPart(pfl)
134 fPart.setName("fPart")
136 Put it into MEDFileField1TS data structure. ::
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
142 Read "fPart" field from File "TargetMesh2.med". ::
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)
152 :ref:`python_testMEDLoaderAdvancedAPI1_solution`