Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 7 additions & 14 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,9 @@ jobs:
- name: linux64
image: ubuntu-22.04
cmake-args: -G "Unix Makefiles"
- name: darwin64
image: macos-13
cmake-args: -G "Unix Makefiles" -D CMAKE_OSX_ARCHITECTURES=x86_64
runs-on: ${{ matrix.image }}
steps:
- uses: actions/checkout@v4.1.7
- uses: actions/checkout@v7
with:
submodules: recursive
- run: |
Expand All @@ -39,7 +36,7 @@ jobs:
cmake ${{ matrix.cmake-args }} -B ${{ matrix.name }} .
cmake --build ${{ matrix.name }} --config Release
ctest --test-dir ${{ matrix.name }} --build-config Release
- uses: actions/upload-artifact@v4.4.0
- uses: actions/upload-artifact@v7
with:
name: ${{ matrix.name }}
path: SDF
Expand All @@ -48,25 +45,21 @@ jobs:
runs-on: ubuntu-22.04
needs: [build]
steps:
- uses: actions/checkout@v4.1.7
- uses: actions/download-artifact@v4.1.8
- uses: actions/checkout@v7
- uses: actions/download-artifact@v8
with:
name: win64
path: SDF
- uses: actions/download-artifact@v4.1.8
- uses: actions/download-artifact@v8
with:
name: win32
path: SDF
- uses: actions/download-artifact@v4.1.8
- uses: actions/download-artifact@v8
with:
name: linux64
path: SDF
- uses: actions/download-artifact@v4.1.8
with:
name: darwin64
path: SDF
- run: find -type f -name .gitignore -delete
- uses: actions/upload-artifact@v4.4.0
- uses: actions/upload-artifact@v7
with:
name: SDF-Modelica
path: |
Expand Down
14 changes: 13 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required (VERSION 3.2)
cmake_minimum_required (VERSION 3.20)

set (CMAKE_CXX_STANDARD 14)

Expand Down Expand Up @@ -99,3 +99,15 @@ set_property(TARGET ModelicaSDF_Test PROPERTY VS_DEBUGGER_WORKING_DIRECTORY "${C
enable_testing()

add_test(NAME ModelicaSDF_Test COMMAND $<TARGET_FILE:ModelicaSDF_Test> WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/C/tests")

add_library(NDTable SHARED
SDF/Resources/C-Sources/NDTable.h
SDF/Resources/C-Sources/ModelicaNDTable.c
SDF/Resources/C-Sources/NDTable.h
ThirdParty/ModelicaUtilities.h
ThirdParty/ModelicaUtilities.c
)

target_include_directories(NDTable PUBLIC
ThirdParty
)
113 changes: 71 additions & 42 deletions SDF/Examples/InterpolationMethods.mo
Original file line number Diff line number Diff line change
@@ -1,39 +1,49 @@
within SDF.Examples;
model InterpolationMethods "Interpolate a sampled signal using different interpolation methods"
model InterpolationMethods "Interpolate a sampled signal using different interpolation and extrapolation methods"
extends Modelica.Icons.Example;

parameter Real x[:] = linspace(0,2,6) * Modelica.Constants.pi;
parameter Real x[:] = linspace(0, 2, 6) * Modelica.Constants.pi;
parameter Real y[size(x, 1)] = Modelica.Math.sin(x);
parameter Real data[:] = cat(1, {1}, {size(x, 1)}, x, y);

parameter String filename = Modelica.Utilities.Files.loadResource("modelica://SDF/Resources/Data/Examples/sine.sdf");
parameter String dataset = "/y";

NDTable linear(
Modelica.Blocks.Sources.Ramp ramp(
duration=1,
offset=-1,
height=8.3)
annotation (Placement(transformation(extent={{-80,-30},{-60,-10}})));

NDTable hold(
nin=1,
readFromFile=false,
data=data,
interpMethod=SDF.Types.InterpolationMethod.Linear,
interpMethod=SDF.Types.InterpolationMethod.Hold,
extrapMethod=SDF.Types.ExtrapolationMethod.Linear,
filename=filename,
dataset=dataset)
annotation (Placement(transformation(extent={{-10,10},{10,30}})));
annotation (Placement(transformation(extent={{-40,40},{-20,60}})));

Modelica.Blocks.Sources.Ramp ramp(
duration=1,
offset=-1,
height=8.3)
annotation (Placement(transformation(extent={{-70,-10},{-50,10}})));
NDTable nearest(
nin=1,
readFromFile=false,
data=data,
interpMethod=SDF.Types.InterpolationMethod.Nearest,
extrapMethod=SDF.Types.ExtrapolationMethod.Linear,
filename=filename,
dataset=dataset)
annotation (Placement(transformation(extent={{0,40},{20,60}})));

NDTable hold(
NDTable linear(
nin=1,
readFromFile=false,
data=data,
interpMethod=SDF.Types.InterpolationMethod.Hold,
extrapMethod=SDF.Types.ExtrapolationMethod.Hold,
interpMethod=SDF.Types.InterpolationMethod.Linear,
extrapMethod=SDF.Types.ExtrapolationMethod.Linear,
filename=filename,
dataset=dataset)
annotation (Placement(transformation(extent={{-10,90},{10,110}})));
annotation (Placement(transformation(extent={{40,40},{60,60}})));

NDTable akima(
nin=1,
Expand All @@ -43,56 +53,75 @@ model InterpolationMethods "Interpolate a sampled signal using different interpo
extrapMethod=SDF.Types.ExtrapolationMethod.Linear,
filename=filename,
dataset=dataset)
annotation (Placement(transformation(extent={{-10,-30},{10,-10}})));
annotation (Placement(transformation(extent={{-40,0},{-20,20}})));

NDTable nearest(
NDTable fritsch_butland(
nin=1,
readFromFile=false,
data=data,
interpMethod=SDF.Types.InterpolationMethod.Nearest,
extrapMethod=SDF.Types.ExtrapolationMethod.Hold,
interpMethod=SDF.Types.InterpolationMethod.FritschButland,
extrapMethod=SDF.Types.ExtrapolationMethod.Linear,
filename=filename,
dataset=dataset)
annotation (Placement(transformation(extent={{-10,50},{10,70}})));
annotation (Placement(transformation(extent={{0,0},{20,20}})));

NDTable fritsch_butland(
NDTable steffen(
nin=1,
readFromFile=false,
data=data,
interpMethod=SDF.Types.InterpolationMethod.Steffen,
extrapMethod=SDF.Types.ExtrapolationMethod.Linear,
interpMethod=SDF.Types.InterpolationMethod.FritschButland,
filename=filename,
dataset=dataset)
annotation (Placement(transformation(extent={{-10,-70},{10,-50}})));
annotation (Placement(transformation(extent={{40,0},{60,20}})));

NDTable steffen(
NDTable extrap_hold(
nin=1,
readFromFile=false,
data=data,
interpMethod=SDF.Types.InterpolationMethod.Linear,
extrapMethod=SDF.Types.ExtrapolationMethod.Hold,
filename=filename,
dataset=dataset)
annotation (Placement(transformation(extent={{-20,-60},{0,-40}})));

NDTable extrap_linear(
nin=1,
readFromFile=false,
data=data,
interpMethod=SDF.Types.InterpolationMethod.Linear,
extrapMethod=SDF.Types.ExtrapolationMethod.Linear,
interpMethod=SDF.Types.InterpolationMethod.Steffen,
filename=filename,
dataset=dataset)
annotation (Placement(transformation(extent={{-10,-110},{10,-90}})));
annotation (Placement(transformation(extent={{20,-60},{40,-40}})));

equation
connect(ramp.y, hold.u[1]) annotation (Line(points={{-49,0},{-30,0},{-30,100},
{-12,100}},
color={0,0,127}));
connect(ramp.y, akima.u[1]) annotation (Line(points={{-49,0},{-30,0},{-30,-20},
{-12,-20}}, color={0,0,127}));
connect(ramp.y, linear.u[1]) annotation (Line(points={{-49,0},{-30,0},{-30,20},
{-12,20}}, color={0,0,127}));
connect(ramp.y, nearest.u[1]) annotation (Line(points={{-49,0},{-30,0},{-30,
60},{-12,60}},
connect(ramp.y, hold.u[1]) annotation (Line(points={{-59,-20},{-50,-20},{-50,
50},{-42,50}},
color={0,0,127}));
connect(ramp.y, fritsch_butland.u[1]) annotation (Line(points={{-49,0},{-30,0},
{-30,-60},{-12,-60}}, color={0,0,127}));
connect(ramp.y, steffen.u[1]) annotation (Line(points={{-49,0},{-30,0},{-30,
-100},{-12,-100}},
color={0,0,127}));
connect(akima.u[1], ramp.y) annotation (Line(points={{-42,10},{-50,10},{-50,
-20},{-59,-20}},
color={0,0,127}));
connect(nearest.u[1], ramp.y) annotation (Line(points={{-2,50},{-10,50},{-10,
-20},{-59,-20}},
color={0,0,127}));
connect(fritsch_butland.u[1], ramp.y) annotation (Line(points={{-2,10},{-10,
10},{-10,-20},{-59,-20}},
color={0,0,127}));
connect(linear.u[1], ramp.y) annotation (Line(points={{38,50},{30,50},{30,-20},
{-59,-20}},
color={0,0,127}));
connect(steffen.u[1], ramp.y) annotation (Line(points={{38,10},{30,10},{30,
-20},{-59,-20}},
color={0,0,127}));
connect(extrap_hold.u[1], ramp.y) annotation (Line(points={{-22,-50},{-30,-50},
{-30,-20},{-59,-20}},
color={0,0,127}));
connect(extrap_linear.u[1], ramp.y) annotation (Line(points={{18,-50},{10,-50},
{10,-20},{-59,-20}},
color={0,0,127}));
annotation (
Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-100,-120},{
100,120}})),
Icon(coordinateSystem(extent={{-100,-80},{100,100}})));
Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-100,-100},{
100,100}})),
Icon(coordinateSystem(extent={{-100,-100},{100,120}})));
end InterpolationMethods;
68 changes: 66 additions & 2 deletions SDF/NDTable.mo
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,22 @@ parameter SDF.Types.InterpolationMethod interpMethod=SDF.Types.InterpolationMeth
"Interpolation method";
parameter SDF.Types.ExtrapolationMethod extrapMethod=SDF.Types.ExtrapolationMethod.None
"Extrapolation method";
parameter Boolean enableDy_du=false "Enable partial derivative output dy_du"
annotation(Evaluate=true);

parameter Real data[:] = { 0} "Table data (as returned by readTableData())" annotation(Dialog(enable=not readFromFile), Evaluate=true);
parameter Real data[:] = { 0} "Table data (as returned by readTableData())" annotation(Dialog(enable=not readFromFile), Evaluate=true);

Modelica.Blocks.Interfaces.RealOutput dy_du[nin] if enableDy_du
"Partial derivatives of y with respect to each input u[i]"
annotation (Placement(
transformation(extent={{-10,-10},{10,10}},
rotation=0,
origin={110,-60}),
visible=enableDy_du));

protected
Modelica.Blocks.Interfaces.RealInput local_dy_du[nin] annotation(HideResult=true);

function evaluate
input SDF.Types.ExternalNDTable table;
input Real[:] params;
Expand All @@ -25,21 +37,73 @@ protected
external "C" value = ModelicaNDTable_evaluate(table, size(params, 1), params, interpMethod, extrapMethod) annotation (
Include="#include <ModelicaNDTable.c>",
IncludeDirectory="modelica://SDF/Resources/C-Sources");
annotation(
derivative(zeroDerivative = table,
zeroDerivative = interpMethod,
zeroDerivative = extrapMethod) = evaluate_der);
end evaluate;

function evaluate_der
input SDF.Types.ExternalNDTable table;
input Real[:] params;
input SDF.Types.InterpolationMethod interpMethod;
input SDF.Types.ExtrapolationMethod extrapMethod;
input Real[size(params, 1)] der_params;
output Real der_value;
external "C" der_value = ModelicaNDTable_evaluate_derivative(
table,
size(params, 1),
params,
interpMethod,
extrapMethod,
der_params)
annotation (
Include="#include <ModelicaNDTable.c>",
IncludeDirectory="modelica://SDF/Resources/C-Sources");
end evaluate_der;

function evaluatePartialDerivatives
input SDF.Types.ExternalNDTable table;
input Real[:] params;
input SDF.Types.InterpolationMethod interpMethod;
input SDF.Types.ExtrapolationMethod extrapMethod;
output Real derivatives[size(params, 1)];
external "C" ModelicaNDTable_evaluate_partial_derivatives(
table,
size(params, 1),
params,
interpMethod,
extrapMethod,
derivatives) annotation (
Include="#include <ModelicaNDTable.c>",
IncludeDirectory="modelica://SDF/Resources/C-Sources");
end evaluatePartialDerivatives;

SDF.Types.ExternalNDTable externalTable=SDF.Types.ExternalNDTable(nin, if readFromFile then SDF.Functions.readTableData(
Modelica.Utilities.Files.loadResource(filename),
dataset,
dataUnit,
scaleUnits) else data);

equation
y = evaluate(
y = evaluate(
externalTable,
u,
interpMethod,
extrapMethod);

if enableDy_du then
connect(dy_du, local_dy_du);
local_dy_du = evaluatePartialDerivatives(
externalTable,
u,
interpMethod,
extrapMethod);
else
local_dy_du = zeros(nin);
end if;


annotation (Documentation(info="<html>
<body>
<p>The <strong>NDTable</strong> block is a multi-dimensional lookup-table (up to 32 dimensions) that supports various inter- and extrapolation methods.</p>
Expand Down
Loading