Skip to content

Commit

Permalink
refs #21: Add function to get variable dimension for MAT
Browse files Browse the repository at this point in the history
  • Loading branch information
tbeu committed Sep 29, 2017
1 parent 4738dee commit 4a58077
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 0 deletions.
1 change: 1 addition & 0 deletions ExternData/Examples/package.mo
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ package Examples "Test examples"
model MATTest "MAT-file read test"
extends Modelica.Icons.Example;
inner parameter MATFile matfile(fileName=Modelica.Utilities.Files.loadResource("modelica://ExternData/Resources/Examples/test_v7.3.mat")) annotation(Placement(transformation(extent={{-80,60},{-60,80}})));
parameter Integer m = matfile.getArrayRows2D("table1") "Number of rows in 2D array";
Modelica.Blocks.Sources.TimeTable timeTable(table=matfile.getRealArray2D("table1", 3, 2)) annotation(Placement(transformation(extent={{-50,60},{-30,80}})));
annotation(experiment(StopTime=1),
Documentation(info="<html><p>This example model reads the table parameter from variable table1 of the HDF5-based MAT-file <a href=\"modelica://ExternData/Resources/Examples/test_v7.3.mat\">test_v7.3.mat</a>. The table parameter is read as Real array of dimension 3x2 by function <a href=\"modelica://ExternData.MATFile.getRealArray2D\">ExternData.MATFile.getRealArray2D</a>. The read parameter is assigned by a parameter binding to the appropriate model parameter.</p></html>"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ EXPORTS
ED_destroyMAT
ED_getDoubleArray2DFromMAT
ED_getStringArray1DFromMAT
ED_getArray2DDimensionsFromMAT
13 changes: 13 additions & 0 deletions ExternData/Resources/C-Sources/ED_MATFile.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,3 +144,16 @@ void ED_getStringArray1DFromMAT(void* _mat, const char* varName, const char** a,
}
}
}

void ED_getArray2DDimensionsFromMAT(void* _mat, const char* varName, int* m, int* n)
{
MATFile* mat = (MATFile*)_mat;
*m = 0;
*n = 0;
if (NULL != mat) {
int dim[2];
ModelicaIO_readMatrixSizes(mat->fileName, varName, dim);
*m = dim[0];
*n = dim[1];
}
}
1 change: 1 addition & 0 deletions ExternData/Resources/Include/ED_MATFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,6 @@ void* ED_createMAT(const char* fileName, int verbose);
void ED_destroyMAT(void* _mat);
void ED_getDoubleArray2DFromMAT(void* _mat, const char* varName, double* a, size_t m, size_t n);
void ED_getStringArray1DFromMAT(void* _mat, const char* varName, const char** a, size_t m);
void ED_getArray2DDimensionsFromMAT(void* _mat, const char* varName, int* m, int* n);

#endif
44 changes: 44 additions & 0 deletions ExternData/package.mo
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,9 @@ package ExternData "Library for data I/O of CSV, INI, JSON, MATLAB MAT, TIR, Exc
final parameter Types.ExternMATFile mat=Types.ExternMATFile(fileName, verboseRead) "External MAT file object";
final function getRealArray2D = Functions.MAT.getRealArray2D(final mat=mat) "Get 2D Real values from MAT-file" annotation(Documentation(info="<html></html>"));
final function getStringArray1D = Functions.MAT.getStringArray1D(final mat=mat) "Get 1D String values from MAT-file" annotation(Documentation(info="<html></html>"));
final function getArraySize2D = Functions.MAT.getArraySize2D(final mat=mat) "Get the size of a 2D array in a MAT file" annotation(Documentation(info="<html></html>"));
final function getArrayRows2D = Functions.MAT.getArrayRows2D(final mat=mat) "Get first dimension of 2D array in MAT file" annotation(Documentation(info="<html></html>"));
final function getArrayColumns2D = Functions.MAT.getArrayColumns2D(final mat=mat) "Get second dimension of 2D array in MAT file" annotation(Documentation(info="<html></html>"));
annotation(
Documentation(info="<html><p>Record that wraps the external object <a href=\"modelica://ExternData.Types.ExternMATFile\">ExternMATFile</a> and the <a href=\"modelica://ExternData.Functions.MAT\">MAT</a> read functions for data access of <a href=\"https://en.wikipedia.org/wiki/MATLAB\">MATLAB</a> MAT-files.</p><p>See <a href=\"modelica://ExternData.Examples.MATTest\">Examples.MATTest</a> for an example.</p></html>"),
defaultComponentName="matfile",
Expand Down Expand Up @@ -604,6 +607,47 @@ package ExternData "Library for data I/O of CSV, INI, JSON, MATLAB MAT, TIR, Exc
Include = "#include \"ED_MATFile.h\"",
Library = {"ED_MATFile", "hdf5", "zlib", "dl"});
end getStringArray1D;
function getArraySize2D "Get dimensions of 2D array in MAT file"
extends Modelica.Icons.Function;
input String varName "Variable name";
input Types.ExternMATFile mat "External MATLAB MAT-file object";
output Integer m "Number of rows in array";
output Integer n "Number of columns in array";
external "C" ED_getArray2DDimensionsFromMAT(mat, varName, m, n) annotation(
__iti_dll = "ITI_ED_MATFile.dll",
__iti_dllNoExport = true,
Include = "#include \"ED_MATFile.h\"",
Library = {"ED_MATFile", "hdf5", "zlib", "dl"});
end getArraySize2D;
function getArrayRows2D "Get first dimension of 2D array in MAT file"
extends Modelica.Icons.Function;
input String varName "Variable name";
input Types.ExternMATFile mat "External MATLAB MAT-file object";
output Integer m "Number of rows in array";
protected
Integer n[1] "Number of columns in array";
external "C" ED_getArray2DDimensionsFromMAT(mat, varName, m, n) annotation(
__iti_dll = "ITI_ED_MATFile.dll",
__iti_dllNoExport = true,
Include = "#include \"ED_MATFile.h\"",
Library = {"ED_MATFile", "hdf5", "zlib", "dl"});
end getArrayRows2D;
function getArrayColumns2D "Get second dimension of 2D array in MAT file"
extends Modelica.Icons.Function;
input String varName "Variable name";
input Types.ExternMATFile mat "External MATLAB MAT-file object";
output Integer n "Number of columns in array";
protected
Integer m[1] "Number of rows in array";
external "C" ED_getArray2DDimensionsFromMAT(mat, varName, m, n) annotation(
__iti_dll = "ITI_ED_MATFile.dll",
__iti_dllNoExport = true,
Include = "#include \"ED_MATFile.h\"",
Library = {"ED_MATFile", "hdf5", "zlib", "dl"});
end getArrayColumns2D;
annotation(Icon(coordinateSystem(preserveAspectRatio=false, extent={{-100,-100},{100,100}}), graphics={Text(lineColor={128,128,128},extent={{-90,-90},{90,90}},textString="f")}));
end MAT;
Expand Down

0 comments on commit 4a58077

Please sign in to comment.