Skip to content
Draft
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
69 changes: 42 additions & 27 deletions Modelica/Magnetic/FluxTubes/BaseClasses/FixedShape.mo
Original file line number Diff line number Diff line change
@@ -1,42 +1,57 @@
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.Magnetization;

extends Interfaces.TwoPort;

// Material
// This parameter is kept for backwards compatibility reasons, might be replaced by a member "Linear" in the enumeration Magnetization
parameter Boolean nonLinearPermeability=true
"= true, if non-linear rel. permeability is used, otherwise constant rel. permeability"
annotation (Dialog(group="Material"), Evaluate=true);
annotation (Dialog(tab="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));

"Constant relative permeability; used if nonLinearPermeability=false"
annotation (Dialog(tab="Material", enable=not nonLinearPermeability));
parameter Magnetization magnetization=Magnetization.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 magnetization==Magnetization.Roschke));
parameter Modelica.Magnetic.FluxTubes.Material.SoftMagnetic.Macfadyen.BaseData
materialMacfadyen=Modelica.Magnetic.FluxTubes.Material.SoftMagnetic.Macfadyen.BaseData()
"Ferromagnetic material characteristics, approximation according to Macfadyen"
annotation (choicesAllMatching=true, Dialog(tab="Material",
enable=nonLinearPermeability and magnetization == Magnetization.Macfadyen));

extends Modelica.Magnetic.FluxTubes.Interfaces.TwoPort;
input SI.CrossSection A "Cross-sectional area";
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";

SI.MagneticFluxDensity B(start=0) "Magnetic flux density";
SI.MagneticPolarization J "Magnetic polarization";
SI.MagneticFieldStrength H(start=0) "Magnetic field strength";
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";
constant Real epsilon=1e3*Modelica.Constants.eps;
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 magnetization == Magnetization.Roschke then
mu_r = 1 + (material.mu_i - 1 + material.c_a*B_N)/(1 + material.c_b*B_N + B_N^material.n);
else // if magnetization == Magnetization.Macfadyen then
mu_r = smooth(1, (if noEvent(abs(H)<epsilon) then materialMacfadyen.mu_ri else
(1 + sum({materialMacfadyen.Chi_mk[k]*materialMacfadyen.Hk[k]/max(epsilon, abs(H))*(1 - exp(-abs(H)/materialMacfadyen.Hk[k])) for k in 1:materialMacfadyen.N}) -
materialMacfadyen.Chi_mc*exp(-abs(H)/materialMacfadyen.Hc))));
end if;
else // not nonLinearPermeability i.e. magnetization == Magnetization.Linear
mu_r = mu_rConst;
end if;
Phi = B*A;
B = mu_0*mu_r*H;
J = mu_0*(mu_r - 1)*H;
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
112 changes: 112 additions & 0 deletions Modelica/Magnetic/FluxTubes/Examples/BasicExamples/CompareModels.mo
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
within Modelica.Magnetic.FluxTubes.Examples.BasicExamples;
model CompareModels "Compare non-hysteretic model and Tellinen/Everett"
extends Modelica.Icons.Example;
parameter SI.Current I=1 "Excitation peak current";
SI.MagneticFieldStrength H1=coreNon_Hys.H "Field Strength in non-hysteretic core";
SI.MagneticFluxDensity B1=coreNon_Hys.B "Flux Density in non-hysteretic core";
SI.MagneticPolarization J1=B1 - mu_0*H1 "Magnetic polarisation in non-hysteretic core";
SI.MagneticFieldStrength H2=coreEverett.H "Field Strength in hysteretic core = H1";
SI.MagneticFluxDensity B2=coreEverett.B "Flux Density in hysteretic core";
SI.MagneticPolarization J2=B2 - mu_0*H2 "Magnetic polarisation 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}})));
Modelica.Magnetic.FluxTubes.Basic.ElectroMagneticConverter excitingCoil1(N=700)
annotation (Placement(transformation(
extent={{-10,-10},{10,10}},
rotation=0,
origin={20,50})));
Modelica.Magnetic.FluxTubes.Basic.ElectroMagneticConverter excitingCoil2(N=700)
annotation (Placement(transformation(
extent={{-10,-10},{10,10}},
rotation=0,
origin={20,-50})));
Modelica.Magnetic.FluxTubes.Shapes.FixedShape.GenericFluxTube
coreNon_Hys(
magnetization=Modelica.Magnetic.FluxTubes.Types.Magnetization.Macfadyen,
mu_rConst=1000,
material=
Modelica.Magnetic.FluxTubes.Material.SoftMagnetic.ElectricSheet.M330_50A(),
materialMacfadyen=
Modelica.Magnetic.FluxTubes.Material.SoftMagnetic.Macfadyen.M330_50A(),
area=0.000112,
l=0.94) annotation (Placement(transformation(
extent={{-10,-10},{10,10}},
rotation=270,
origin={40,50})));
Modelica.Magnetic.FluxTubes.Shapes.HysteresisAndMagnets.GenericHystTellinenEverett
coreEverett(
mat=Modelica.Magnetic.FluxTubes.Material.HysteresisEverettParameter.M330_50A(),
l=0.94,
A=0.000112,
MagRel(fixed=true))
annotation (Placement(transformation(
extent={{-10,-10},{10,10}},
rotation=270,
origin={40,-50})));
Modelica.Magnetic.FluxTubes.Basic.Ground groundM1
annotation (Placement(transformation(extent={{30,10},{50,30}})));
Modelica.Magnetic.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>B1</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;
172 changes: 172 additions & 0 deletions Modelica/Magnetic/FluxTubes/Examples/BasicExamples/EIcore.mo
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
within Modelica.Magnetic.FluxTubes.Examples.BasicExamples;
model EIcore "An iron core with shape E and I"
extends Modelica.Icons.Example;
parameter SI.Length delta=0.5e-3 "Air gap";
parameter SI.Current I=5 "Excitation current";
parameter Modelica.Magnetic.FluxTubes.Material.SoftMagnetic.MaterialSettings
materialSettings(magnetization=Modelica.Magnetic.FluxTubes.Types.Magnetization.Macfadyen,
materialMacfadyen=
Modelica.Magnetic.FluxTubes.Material.SoftMagnetic.Macfadyen.M330_50A())
annotation (Placement(transformation(extent={{20,50},{40,70}})));
Modelica.Magnetic.FluxTubes.Shapes.FixedShape.Cuboid yokeUL(
nonLinearPermeability=materialSettings.nonLinearPermeability,
mu_rConst=materialSettings.mu_rConst,
magnetization=materialSettings.magnetization,
material=materialSettings.material,
materialMacfadyen=materialSettings.materialMacfadyen,
l(displayUnit="mm") = 0.075,
a(displayUnit="mm") = 0.04,
b(displayUnit="mm") = 0.02)
"Upper Left yoke" annotation (Placement(transformation(extent={{-40,90},{-60,70}})));
Modelica.Magnetic.FluxTubes.Shapes.FixedShape.Cuboid yokeUR(
nonLinearPermeability=materialSettings.nonLinearPermeability,
mu_rConst=materialSettings.mu_rConst,
magnetization=materialSettings.magnetization,
material=materialSettings.material,
materialMacfadyen=materialSettings.materialMacfadyen,
l(displayUnit="mm") = 0.075,
a(displayUnit="mm") = 0.04,
b(displayUnit="mm") = 0.02)
"Upper RIght yoke" annotation (Placement(transformation(extent={{40,70},{60,90}})));
Modelica.Magnetic.FluxTubes.Shapes.FixedShape.Cuboid yokeLL(
nonLinearPermeability=materialSettings.nonLinearPermeability,
mu_rConst=materialSettings.mu_rConst,
magnetization=materialSettings.magnetization,
material=materialSettings.material,
materialMacfadyen=materialSettings.materialMacfadyen,
l(displayUnit="mm") = 0.075,
a(displayUnit="mm") = 0.04,
b(displayUnit="mm") = 0.02)
"Lower Left yoke" annotation (Placement(transformation(extent={{-60,-90},{-40,-70}})));
Modelica.Magnetic.FluxTubes.Shapes.FixedShape.Cuboid yokeLR(
nonLinearPermeability=materialSettings.nonLinearPermeability,
mu_rConst=materialSettings.mu_rConst,
magnetization=materialSettings.magnetization,
material=materialSettings.material,
materialMacfadyen=materialSettings.materialMacfadyen,
l(displayUnit="mm") = 0.075,
a(displayUnit="mm") = 0.04,
b(displayUnit="mm") = 0.02)
"Lower Right yoke" annotation (Placement(transformation(extent={{60,-90},{40,-70}})));
Modelica.Magnetic.FluxTubes.Shapes.FixedShape.Cuboid legL(
nonLinearPermeability=materialSettings.nonLinearPermeability,
mu_rConst=materialSettings.mu_rConst,
magnetization=materialSettings.magnetization,
material=materialSettings.material,
materialMacfadyen=materialSettings.materialMacfadyen,
l(displayUnit="mm") = 0.1,
a(displayUnit="mm") = 0.04,
b(displayUnit="mm") = 0.02)
"Left leg" annotation (Placement(transformation(
extent={{10,10},{-10,-10}},
rotation=90,
origin={-80,0})));
Modelica.Magnetic.FluxTubes.Shapes.FixedShape.Cuboid legR(
nonLinearPermeability=materialSettings.nonLinearPermeability,
mu_rConst=materialSettings.mu_rConst,
magnetization=materialSettings.magnetization,
material=materialSettings.material,
materialMacfadyen=materialSettings.materialMacfadyen,
l(displayUnit="mm") = 0.1,
a(displayUnit="mm") = 0.04,
b(displayUnit="mm") = 0.02)
"Right leg" annotation (Placement(transformation(
extent={{10,10},{-10,-10}},
rotation=90,
origin={80,0})));
Modelica.Magnetic.FluxTubes.Shapes.FixedShape.Cuboid legM(
nonLinearPermeability=materialSettings.nonLinearPermeability,
mu_rConst=materialSettings.mu_rConst,
magnetization=materialSettings.magnetization,
material=materialSettings.material,
materialMacfadyen=materialSettings.materialMacfadyen,
l(displayUnit="mm") = 0.1 - delta,
a(displayUnit="mm") = 0.04,
b(displayUnit="mm") = 0.04)
"Middle leg" annotation (Placement(transformation(extent={{10,10},{-10,
-10}}, rotation=270)));
Modelica.Magnetic.FluxTubes.Shapes.FixedShape.Cuboid airgap(
nonLinearPermeability=false,
mu_rConst=1,
l(displayUnit="mm") = delta,
a(displayUnit="mm") = 0.04,
b(displayUnit="mm") = 0.04)
"Airgap" annotation (Placement(transformation(
extent={{10,10},{-10,-10}},
rotation=270,
origin={0,-30})));
Modelica.Magnetic.FluxTubes.Basic.Ground groundM
annotation (Placement(transformation(extent={{-10,-100},{10,-80}})));
Modelica.Magnetic.FluxTubes.Basic.ElectroMagneticConverter coil(N=100)
annotation (Placement(transformation(extent={{-20,20},{0,40}})));
Modelica.Electrical.Analog.Sources.SineCurrent sineCurrent(I=I, f=10)
annotation (Placement(transformation(
extent={{-10,-10},{10,10}},
rotation=90,
origin={-60,30})));
Modelica.Electrical.Analog.Basic.Ground groundE
annotation (Placement(transformation(extent={{-50,0},{-30,20}})));
Modelica.Magnetic.FluxTubes.Sensors.MagneticFluxSensor magFluxSensor
annotation (Placement(transformation(
extent={{-10,-10},{10,10}},
rotation=90,
origin={0,-60})));
Modelica.Blocks.Math.Gain fluxDensity(k=1/(airgap.a*airgap.b))
annotation (Placement(transformation(extent={{20,-70},{40,-50}})));
equation
connect(coil.port_p, yokeUL.port_p)
annotation (Line(points={{0,40},{0,80},{-40,80}}, color={255,127,0}));
connect(yokeUL.port_n, legL.port_p)
annotation (Line(points={{-60,80},{-80,80},{-80,10}}, color={255,127,0}));
connect(legL.port_n, yokeLL.port_p) annotation (Line(points={{-80,-10},{-80,-80},
{-60,-80}}, color={255,127,0}));
connect(yokeLL.port_n, groundM.port)
annotation (Line(points={{-40,-80},{0,-80}}, color={255,127,0}));
connect(groundM.port, yokeLR.port_n)
annotation (Line(points={{0,-80},{40,-80}}, color={255,127,0}));
connect(yokeLR.port_p, legR.port_n)
annotation (Line(points={{60,-80},{80,-80},{80,-10}}, color={255,127,0}));
connect(legR.port_p, yokeUR.port_n)
annotation (Line(points={{80,10},{80,80},{60,80}}, color={255,127,0}));
connect(yokeUR.port_p, yokeUL.port_p)
annotation (Line(points={{40,80},{-40,80}}, color={255,127,0}));
connect(coil.port_n, legM.port_n)
annotation (Line(points={{0,20},{0,10}}, color={255,127,0}));
connect(legM.port_p, airgap.port_n)
annotation (Line(points={{0,-10},{0,-20}}, color={255,127,0}));
connect(sineCurrent.n, coil.p)
annotation (Line(points={{-60,40},{-20,40}}, color={0,0,255}));
connect(sineCurrent.p,groundE. p)
annotation (Line(points={{-60,20},{-40,20}}, color={0,0,255}));
connect(groundE.p, coil.n)
annotation (Line(points={{-40,20},{-20,20}}, color={0,0,255}));
connect(magFluxSensor.Phi, fluxDensity.u)
annotation (Line(points={{10,-60},{18,-60}}, color={0,0,127}));
connect(magFluxSensor.port_p, groundM.port)
annotation (Line(points={{0,-70},{0,-80}}, color={255,127,0}));
connect(airgap.port_p, magFluxSensor.port_n)
annotation (Line(points={{0,-40},{0,-50}}, color={255,127,0}));
annotation (experiment(
Interval=0.0001,
Tolerance=1e-06), Documentation(info="<html>
<p>
This is a core shaped as an E and an I with an airgap.
</p>
<table border=\"0\" cellspacing=\"0\" cellpadding=\"2\">
<caption><strong>Fig. 1:</strong> EI - core</caption>
<tr>
<td>
<img src=\"modelica://Modelica/Resources/Images/Magnetic/FluxTubes/Examples/BasicExamples/EIcore.png\">
</td>
</tr>
</table>
<p>
You might vary different parameters:
</p>
<ul>
<li>The current amplitude <code>I</code></li>
<li>The length of the airgap <code>delta</code></li>
<li>The material for all shapes at once via the record <code>materialSettings</code></li>
</ul>
</html>"));
end EIcore;
Loading