Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
8713a51
alternative approximation
AHaumer Aug 6, 2026
e7bd7df
added compariosnSignals
AHaumer Aug 6, 2026
10cc8a1
fixed html bugs
AHaumer Aug 6, 2026
aa29b4a
fixed html bug
AHaumer Aug 6, 2026
ea50918
put meaningful data in BaseData record
AHaumer Aug 6, 2026
a86bf36
small enhancements of documentation
AHaumer Aug 7, 2026
80b35c6
added (artificial but realistic) CastIron as BaseData to SSEE
AHaumer Aug 10, 2026
28f21bf
corrected misleading naming in internal functions
AHaumer Aug 10, 2026
847e7a4
improved documentation
AHaumer Aug 14, 2026
653b16f
corrected link in documentation
AHaumer Aug 15, 2026
435e0e6
added a function app_mu_r(inline)
AHaumer Aug 16, 2026
6ade8d0
an enumeration should not have the same name as a SI-Unit
AHaumer Aug 17, 2026
6da68ae
increased robustness of SSEE-functions
AHaumer Aug 18, 2026
fd593d5
Update Modelica/Magnetic/FluxTubes/BaseClasses/FixedShape.mo
AHaumer Aug 19, 2026
372a9ad
following HansOlsson's advice
AHaumer Aug 19, 2026
31515f6
Merge branch 'master' into FluxTubes_Material
AHaumer Sep 7, 2026
80b7561
reverted "input" A (BaseClasses.FixedShape)
AHaumer Sep 10, 2026
b60c60e
Merge branch 'master' into FluxTubes_Material
AHaumer Sep 10, 2026
5368d71
Merge branch 'master' into FluxTubes_Material
AHaumer Oct 13, 2026
7c8b051
Flux tubes material proposal (#10)
christiankral Oct 13, 2026
29da7b6
added the pre-processing tool for FluxTubes/Material/Approximation/SSEE
AHaumer Oct 13, 2026
52fa7f9
corrected link to preprocessing tool
AHaumer Oct 13, 2026
871c8bf
alternative approximation
AHaumer Aug 6, 2026
ef91ff7
added compariosnSignals
AHaumer Aug 6, 2026
1e99745
fixed html bugs
AHaumer Aug 6, 2026
1d088d2
fixed html bug
AHaumer Aug 6, 2026
c08d5ab
put meaningful data in BaseData record
AHaumer Aug 6, 2026
7fb0994
small enhancements of documentation
AHaumer Aug 7, 2026
9d19680
added (artificial but realistic) CastIron as BaseData to SSEE
AHaumer Aug 10, 2026
f61b093
corrected misleading naming in internal functions
AHaumer Aug 10, 2026
22467bb
improved documentation
AHaumer Aug 14, 2026
5002d82
corrected link in documentation
AHaumer Aug 15, 2026
9ac57d9
added a function app_mu_r(inline)
AHaumer Aug 16, 2026
d6fd746
an enumeration should not have the same name as a SI-Unit
AHaumer Aug 17, 2026
5b40795
increased robustness of SSEE-functions
AHaumer Aug 18, 2026
e76d3a2
Update Modelica/Magnetic/FluxTubes/BaseClasses/FixedShape.mo
AHaumer Aug 19, 2026
4f4b8ce
following HansOlsson's advice
AHaumer Aug 19, 2026
a57702a
reverted "input" A (BaseClasses.FixedShape)
AHaumer Sep 10, 2026
ae1f377
Flux tubes material proposal (#10)
christiankral Oct 13, 2026
0571678
added the pre-processing tool for FluxTubes/Material/Approximation/SSEE
AHaumer Oct 13, 2026
170d9ee
corrected link to preprocessing tool
AHaumer Oct 13, 2026
65a7baf
Utilities: added check of rawData and increased documentation
AHaumer Oct 28, 2026
2b02ab7
Merge branch 'FluxTubes_Material' of https://github.com/AHaumer/Model…
AHaumer Oct 28, 2026
1937676
enhanced check of rawData
AHaumer Oct 29, 2026
2a61411
enhanced check of rawData, added 4 materials and added 2 lines in Bas…
AHaumer Oct 29, 2026
8ae30ca
Merge branch 'master' into FluxTubes_Material
AHaumer Oct 29, 2026
4a1441b
improved documentation
AHaumer Oct 29, 2026
64be1ce
Merge branch 'FluxTubes_Material' of https://github.com/AHaumer/Model…
AHaumer Oct 29, 2026
7dbc0e1
documented the used smoothing parameter
AHaumer Oct 30, 2026
be73f20
corrected typo
AHaumer Oct 30, 2026
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
78 changes: 48 additions & 30 deletions Modelica/Magnetic/FluxTubes/BaseClasses/FixedShape.mo
Original file line number Diff line number Diff line change
@@ -1,42 +1,60 @@
within Modelica.Magnetic.FluxTubes.BaseClasses;
partial model FixedShape "Base class for flux tubes with fixed shape during simulation; linear or non-linear material characteristics"
import Modelica.Magnetic.FluxTubes.Types.MagType;
import Modelica.Magnetic.FluxTubes.Material.SoftMagnetic.SSEE.Functions.app_J;
import Modelica.Magnetic.FluxTubes.Material.SoftMagnetic.SSEE.Functions.app_mu_r;

extends Interfaces.TwoPort;

// Material
// The parameter nonLinearPermeability is kept for backwards compatibility reasons,
// and will be replaced by a member "Linear" in the enumeration MagType in the next major release
parameter Boolean nonLinearPermeability=true
"= true, if non-linear rel. permeability is used, otherwise constant rel. permeability"
annotation (Dialog(group="Material"), Evaluate=true);
parameter SI.RelativePermeability mu_rConst=1
"Constant relative permeability; used if nonLinearPermeability = false"
annotation (Dialog(group="Material", enable=not nonLinearPermeability));

parameter FluxTubes.Material.SoftMagnetic.BaseData material=
Material.SoftMagnetic.BaseData()
"Ferromagnetic material characteristics; used if nonLinearPermeability = true"
annotation (choicesAllMatching=true, Dialog(group="Material", enable=
nonLinearPermeability));

SI.Reluctance R_m "Magnetic reluctance";
SI.Permeance G_m "Magnetic permeance";
SI.MagneticFluxDensity B "Magnetic flux density";
SI.CrossSection A "Cross-sectional area penetrated by magnetic flux";
SI.MagneticFieldStrength H "Magnetic field strength";

SI.RelativePermeability mu_r "Relative magnetic permeability";

annotation (Dialog(tab="Material"), Evaluate=true);
parameter Modelica.Units.SI.RelativePermeability mu_rConst=1
"Constant relative permeability; used if nonLinearPermeability=false"
annotation (Dialog(tab="Material", enable=not nonLinearPermeability));
parameter MagType magType=MagType.Roschke
"Choose the approximation of the magnetization characteristic"
annotation (Evaluate=true, Dialog(tab="Material", enable=nonLinearPermeability));
parameter Modelica.Magnetic.FluxTubes.Material.SoftMagnetic.BaseData material=
Modelica.Magnetic.FluxTubes.Material.SoftMagnetic.BaseData()
"Ferromagnetic material characteristics, approximation according to Roschke"
annotation (choicesAllMatching=true, Dialog(tab="Material", enable=
nonLinearPermeability and magType ==MagType.Roschke));
parameter Modelica.Magnetic.FluxTubes.Material.SoftMagnetic.SSEE.BaseData
materialSSEE=Modelica.Magnetic.FluxTubes.Material.SoftMagnetic.SSEE.BaseData()
"Ferromagnetic material characteristics, approximation SSEE"
annotation (choicesAllMatching=true, Dialog(tab="Material", enable=
nonLinearPermeability and magType ==MagType.SSEE));

extends FluxTubes.Interfaces.TwoPort;
Modelica.Units.SI.CrossSection A "Cross-sectional area";
Modelica.Units.SI.Reluctance R_m "Magnetic reluctance";
Modelica.Units.SI.Permeance G_m "Magnetic permeance";
Modelica.Units.SI.MagneticFluxDensity B(start=0) "Magnetic flux density";
Modelica.Units.SI.MagneticPolarization J "Magnetic polarization";
Modelica.Units.SI.MagneticFieldStrength H(start=0) "Magnetic field strength";
Modelica.Units.SI.RelativePermeability mu_r(start=mu_rConst)
"Relative magnetic permeability";
protected
Real B_N "Absolute value of normalized B";

Real B_N=abs(B/material.B_myMax) "Absolute value of normalized B";
equation
B_N = abs(B/material.B_myMax);
mu_r = if nonLinearPermeability then
1 + (material.mu_i - 1 + material.c_a*B_N)/(1 + material.c_b*B_N + B_N^material.n) else mu_rConst;

R_m = 1/G_m;
V_m = Phi*R_m;
B = Phi/A;
H = B/(mu_0*mu_r);

if nonLinearPermeability then
if magType==MagType.Roschke then
mu_r = 1 + (material.mu_i - 1 + material.c_a*B_N)/(1 + material.c_b*B_N + B_N^material.n);
J = mu_0*(mu_r - 1)*H;
else //if magType == MagType.SSEE then
mu_r = app_mu_r(H, materialSSEE);
J = app_J(H, materialSSEE);
end if;
else // not nonLinearPermeability i.e. magType == MagType.Linear
mu_r = mu_rConst;
J = mu_0*(mu_r - 1)*H;
end if;
B = mu_0*H + J;
Phi = B*A;
annotation (Documentation(info="<html>
<p>
Please refer to the description of the sub-package <a href=\"modelica://Modelica.Magnetic.FluxTubes.Shapes.FixedShape\">Shapes.FixedShape</a> for utilisation of this partial model.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
within Modelica.Magnetic.FluxTubes.Examples.BasicExamples;
model CompareCharacteristics "Investigate magnetic characteristic"
extends Modelica.Icons.Example;
import Modelica.Magnetic.FluxTubes.Material.SoftMagnetic.SSEE.Functions.makeTable;
import Modelica.Magnetic.FluxTubes.Material.SoftMagnetic.SSEE.Functions.app_J;
import Modelica.Magnetic.FluxTubes.Material.SoftMagnetic.SSEE.Functions.app_mu_r;
import Modelica.Magnetic.FluxTubes.Material.SoftMagnetic.SSEE.Functions.app_mu_rd;
parameter Modelica.Magnetic.FluxTubes.Material.SoftMagnetic.SSEE.M350_50A
material annotation (Placement(transformation(extent={{-10,10},{10,30}})));
constant Modelica.Units.SI.Time Tend=1;
parameter Modelica.Units.SI.MagneticFieldStrength Hmin=0 "Start of H";
parameter Modelica.Units.SI.MagneticFieldStrength Hmax=50000 "End of H";
Modelica.Units.SI.MagneticFieldStrength H=Hmin + (Hmax - Hmin)*time/Tend
"Driving field strength";
parameter Modelica.Units.SI.Area wA=1 "Number of turns x area";
Modelica.Units.SI.MagneticPolarization Jraw=combiTable1Ds.y[1] "Raw data";
Modelica.Units.SI.MagneticPolarization J=app_J(H, material) "Approx. polarization";
Modelica.Units.SI.MagneticFluxDensity B=mu_0*H + J "Approx. flux density";
Modelica.Units.SI.RelativePermeability mu_r=app_mu_r(H, material) "Approx. relative permeability";
Modelica.Units.SI.RelativePermeability mu_rd=app_mu_rd(H, material) "Approx. relative differential permeability";
Modelica.Units.SI.MagneticFlux psi=wA*B "Flux linkage";
// differentiable due to definition of derJ=mu_0*(mu_rd - 1)*derH
Modelica.Units.SI.Voltage v=-der(psi) "Induced voltage";
Modelica.Units.SI.Voltage v_Alt1=-wA*mu_0*mu_rd*der(H) "Induced voltage (alternative calculation 1)";
Modelica.Units.SI.Voltage v_Alt2=-wA*(mu_0*der(H) + der(J)) "Induced voltage (alternative calculation 2)";
Modelica.Units.SI.Voltage v_Alt3=-wA*mu_0*(mu_r*der(H) + der(mu_r)*H) "Induced voltage (alternative calculation 3)";
Modelica.Blocks.Sources.RealExpression realExpression(y=H)
annotation (Placement(transformation(extent={{-40,-30},{-20,-10}})));
Modelica.Blocks.Tables.CombiTable1Ds combiTable1Ds(
table=makeTable(material),
smoothness=Modelica.Blocks.Types.Smoothness.MonotoneContinuousDerivative2,
extrapolation=Modelica.Blocks.Types.Extrapolation.HoldLastPoint)
annotation (Placement(transformation(extent={{-10,-30},{10,-10}})));
equation
connect(combiTable1Ds.u, realExpression.y)
annotation (Line(points={{-12,-20},{-19,-20}},
color={0,0,127}));
annotation (experiment(
StopTime = 1,
Interval=0.0001,
Tolerance=1e-06), Documentation(info="<html>
<p>
Magnetic field strength <code>H</code> is varied within 1 second from <code>Hmin</code> to <code>Hmax</code>.
Magnetic polarization <code>J</code>, magnetic flux density <code>B</code>, relative permeability <code>mu_r</code>, differential relative permeability <code>mu_rd</code>,
magnetic flux linkage <code>psi</code> and induced voltage <code>v</code> are calculated and plotted versus H to investigate the characteristic of the chosen material.
Additionally, all approximation functions are tested.
</p>
</html>"));
end CompareCharacteristics;
118 changes: 118 additions & 0 deletions Modelica/Magnetic/FluxTubes/Examples/BasicExamples/CompareModels.mo
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
within Modelica.Magnetic.FluxTubes.Examples.BasicExamples;
model CompareModels
"Compare non-hysteretic model and Tellinen/Everett"
extends Modelica.Icons.Example;
parameter Modelica.Units.SI.Current I=1 "Excitation peak current";
Modelica.Units.SI.MagneticFieldStrength H1=coreNon_Hys.H
"Field strength in non-hysteretic core";
Modelica.Units.SI.MagneticFluxDensity B1=coreNon_Hys.B
"Flux density in non-hysteretic core";
Modelica.Units.SI.MagneticPolarization J1=B1 - mu_0*H1
"Magnetic polarization in non-hysteretic core";
Modelica.Units.SI.MagneticFieldStrength H2=coreEverett.H
"Field strength in hysteretic core = H1";
Modelica.Units.SI.MagneticFluxDensity B2=coreEverett.B
"Flux density in hysteretic core";
Modelica.Units.SI.MagneticPolarization J2=B2 - mu_0*H2
"Magnetic polarization in hysteretic core";
Modelica.Electrical.Analog.Sources.SignalCurrent signalCurrent1 annotation (
Placement(transformation(
extent={{-10,-10},{10,10}},
rotation=90,
origin={0,50})));
Modelica.Electrical.Analog.Sources.SignalCurrent signalCurrent2 annotation (
Placement(transformation(
extent={{-10,-10},{10,10}},
rotation=90,
origin={0,-50})));
Modelica.Electrical.Analog.Basic.Ground groundE1
annotation (Placement(transformation(extent={{-10,10},{10,30}})));
Modelica.Electrical.Analog.Basic.Ground groundE2
annotation (Placement(transformation(extent={{-10,-90},{10,-70}})));
FluxTubes.Basic.ElectroMagneticConverter excitingCoil1(N=700) annotation (
Placement(transformation(
extent={{-10,-10},{10,10}},
rotation=0,
origin={20,50})));
FluxTubes.Basic.ElectroMagneticConverter excitingCoil2(N=700) annotation (
Placement(transformation(
extent={{-10,-10},{10,10}},
rotation=0,
origin={20,-50})));
FluxTubes.Shapes.FixedShape.GenericFluxTube coreNon_Hys(
magType=Modelica.Magnetic.FluxTubes.Types.MagType.SSEE,
mu_rConst=1000,
material=
Modelica.Magnetic.FluxTubes.Material.SoftMagnetic.ElectricSheet.M330_50A(),
materialSSEE=
Modelica.Magnetic.FluxTubes.Material.SoftMagnetic.SSEE.M330_50A(),
area=0.000112,
l=0.94) annotation (Placement(transformation(
extent={{-10,-10},{10,10}},
rotation=270,
origin={40,50})));
FluxTubes.Shapes.HysteresisAndMagnets.GenericHystTellinenEverett coreEverett(
mat=FluxTubes.Material.HysteresisEverettParameter.M330_50A(),
l=0.94,
A=0.000112,
includeEddyCurrents=false,
H(fixed=false),
MagRel(fixed=true)) annotation (Placement(transformation(
extent={{-10,-10},{10,10}},
rotation=270,
origin={40,-50})));
FluxTubes.Basic.Ground groundM1
annotation (Placement(transformation(extent={{30,10},{50,30}})));
FluxTubes.Basic.Ground groundM2
annotation (Placement(transformation(extent={{30,-90},{50,-70}})));
Modelica.Blocks.Sources.Sine sine(amplitude=I, f=50) annotation (Placement(
transformation(
extent={{-10,-10},{10,10}},
rotation=0,
origin={-50,0})));
equation
connect(signalCurrent1.p, groundE1.p)
annotation (Line(points={{0,40},{0,30}}, color={0,0,255}));
connect(signalCurrent2.p, groundE2.p)
annotation (Line(points={{0,-60},{0,-70}}, color={0,0,255}));
connect(signalCurrent1.n, excitingCoil1.p)
annotation (Line(points={{0,60},{10,60}}, color={0,0,255}));
connect(signalCurrent1.p, excitingCoil1.n)
annotation (Line(points={{0,40},{10,40}}, color={0,0,255}));
connect(signalCurrent2.n, excitingCoil2.p)
annotation (Line(points={{0,-40},{10,-40}}, color={0,0,255}));
connect(signalCurrent2.p, excitingCoil2.n)
annotation (Line(points={{0,-60},{10,-60}}, color={0,0,255}));
connect(coreNon_Hys.port_n, groundM1.port)
annotation (Line(points={{40,40},{40,30}}, color={255,127,0}));
connect(excitingCoil1.port_n, coreNon_Hys.port_n)
annotation (Line(points={{30,40},{40,40}}, color={255,127,0}));
connect(excitingCoil1.port_p, coreNon_Hys.port_p)
annotation (Line(points={{30,60},{40,60}}, color={255,127,0}));
connect(coreEverett.port_n, groundM2.port)
annotation (Line(points={{40,-60},{40,-70}}, color={255,127,0}));
connect(excitingCoil2.port_n, coreEverett.port_n)
annotation (Line(points={{30,-60},{40,-60}}, color={255,127,0}));
connect(excitingCoil2.port_p, coreEverett.port_p)
annotation (Line(points={{30,-40},{40,-40}}, color={255,127,0}));
connect(sine.y, signalCurrent1.i) annotation (Line(points={{-39,0},{-20,0},{-20,
50},{-12,50}}, color={0,0,127}));
connect(sine.y, signalCurrent2.i) annotation (Line(points={{-39,0},{-20,0},{-20,
-50},{-12,-50}}, color={0,0,127}));
annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
coordinateSystem(preserveAspectRatio=false)),
experiment(
StopTime=0.1,
Interval=1e-05,
Tolerance=1e-06),
Documentation(info="<html>
<p>
This model compares the magnetization characteristic of a non-hysteretic model with a Tellinen/Everett model including hysteresis, both for M330-50A.
</p>
<p>
Plot <code>B1</code> (flux density of the non-hysteretic model) and <code>B2</code> (flux density of the hysteretic model)
versus <code>H1</code> (field strength, which is the same as <code>H2</code> due to the same geometry of the core and the same excitation).
Try different excitation peak currents <code>I</code>.
</p>
</html>"));
end CompareModels;
Loading
Loading