1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2020 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3
4 // This library is free software; you can redistribute it and/or
5 // modify it under the terms of the GNU Lesser General Public
6 // License as published by the Free Software Foundation; either
7 // version 2.1 of the License, or (at your option) any later version.
8
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 // Lesser General Public License for more details.
13
14 // You should have received a copy of the GNU Lesser General Public
15 // License along with this library; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
18
19 #ifndef LIBMESH_MATLAB_IO_H
20 #define LIBMESH_MATLAB_IO_H
21
22 // Local includes
23 #include "libmesh/libmesh_common.h"
24 #include "libmesh/mesh_input.h"
25
26 // C++ includes
27
28 namespace libMesh
29 {
30
31 // Forward declarations
32 class MeshBase;
33
34 /**
35 * This class implements reading meshes in the Matlab PDE toolkit
36 * in a proprietary format.
37 *
38 * A VALID INPUT FILE for this type of mesh should be
39 * generated in Matlab with the following steps:
40 * 1.) Draw the domain and triangulate it in the GUI
41 * 2.) Export the mesh to matlab using Mesh->Export Mesh
42 * 3.) Create a file with this script:
43 * \code
44 * fid = fopen('filename', 'w');
45 * fprintf(fid, '%d %d \n', length(p), length(t));
46 * fprintf(fid, '%f %f \n', p);
47 * fprintf(fid, '%d %d %d %d \n', t);
48 * fclose(fid);
49 * \endcode
50 *
51 * What's going on here?
52 * There is no standard for exporting PDE toolkit meshes
53 * to files in Matlab. When you choose "export mesh" in the GUI,
54 * it returns three matrices that it likes to call
55 * p, e, and t. All meshes (as far as I can tell) that
56 * come from the PDE toolkit are 2D triangle meshes.
57 *
58 * p is the point matrix...
59 * Row 1: x coordinate
60 * Row 2: y coordinate
61 *
62 * e is the edge matrix ...
63 * Row 1: starting point number (dummy)
64 * Row 2: ending point number (dummy)
65 * Row 3: starting parameter value (?) (dummy)
66 * Row 4: ending parameter value (?) (dummy)
67 * Row 5: boundary segment number (?) (dummy)
68 * Row 6: left-hand subdomain number (dummy)
69 * Row 7: right-hand subdomain number (dummy)
70 *
71 * t is the triangle matrix ...
72 * Row 1: Node number 1
73 * Row 2: Node number 2
74 * Row 3: Node number 3
75 * Row 4: subdomain number (dummy)
76 *
77 * There are some important things to notice here:
78 * o The implied ordering of the p matrix is 1..N
79 * o The e matrix is entirely irrelevant in this code
80 * o All of the matrices are row based
81 *
82 * \author John W. Peterson
83 * \date 2004
84 */
85 class MatlabIO : public MeshInput<MeshBase>
86 {
87 public:
88 /**
89 * Constructor. Takes a non-const Mesh reference which it
90 * will fill up with elements.
91 */
92 explicit
93 MatlabIO (MeshBase &);
94
95 /**
96 * Reads in a matlab data file based on the string
97 * you pass it.
98 */
99 virtual void read (const std::string & name) override;
100
101 private:
102 /**
103 * Implementation of the read() function. This function
104 * is called by the public interface function and implements
105 * reading the file.
106 */
107 void read_stream (std::istream & in);
108 };
109
110
111 // ------------------------------------------------------------
112 // MatlabIO inline members
113 inline
MatlabIO(MeshBase & mesh_in)114 MatlabIO::MatlabIO (MeshBase & mesh_in) :
115 MeshInput<MeshBase> (mesh_in)
116 {}
117
118 } // namespace libMesh
119
120
121 #endif // LIBMESH_MATLAB_IO_H
122