Skip to content
Snippets Groups Projects
Commit 6b867d59 authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

simplify the model by always using circuit coupling (current source is...

simplify the model by always using circuit coupling (current source is explained in electromagnet.pro)
parent 24e6b390
No related branches found
No related tags found
No related merge requests found
......@@ -3,7 +3,6 @@
Features:
- Use of a generic template formulation library
- Frequency- and time-domain dynamic solutions
- Circuit coupling used as a black-box (see Tutorial 8 for details)
To compute the solution in a terminal:
......@@ -17,13 +16,9 @@
Include "transfo_common.pro";
DefineConstant[
type_Conds = {2, Choices{1 = "Massive", 2 = "Coil"}, Highlight "Blue",
ConductorType = {2, Choices{1 = "Massive", 2 = "Coil"}, Highlight "Blue",
Name "Parameters/01Conductor type"}
type_Source = {2, Choices{1 = "Current", 2 = "Voltage"}, Highlight "Blue",
Name "Parameters/02Source type"}
type_Analysis = {1, Choices{1 = "Frequency-domain", 2 = "Time-domain"}, Highlight "Blue",
Name "Parameters/03Analysis type"}
Freq = {50, Min 0, Max 1e3, Step 1,
Freq = {1, Min 0, Max 1e3, Step 1,
Name "Parameters/Frequency"}
];
......@@ -43,81 +38,71 @@ Group {
// Abstract regions that will be used in the "Lib_Magnetodynamics2D_av_Cir.pro"
// template file included below;
Vol_Mag = Region[{Air, Core, Coils}]; // full magnetic domain
If (type_Conds == 1)
If (ConductorType == 1)
Vol_C_Mag = Region[{Coils}]; // massive conductors
ElseIf (type_Conds == 2)
ElseIf (ConductorType == 2)
Vol_S_Mag = Region[{Coils}]; // stranded conductors (coils)
EndIf
}
Function {
mu0 = 4e-7*Pi;
mur_Core = 1000;
mu[Air] = 1 * mu0;
mur_Core = 100;
mu[Core] = mur_Core * mu0;
mu[Coils] = 1 * mu0;
sigma[Coils] = 1e7;
// For a correct definition of the voltage
CoefGeo = thickness_Core;
nu[] = 1 / mu[];
// To be defined separately for each coil portion
Sc[Coil_1_P] = SurfaceArea[];
SignBranch[Coil_1_P] = 1; // To fix the convention of positive current (1:
// along Oz, -1: along -Oz)
sigma[Coils] = 1e7;
Sc[Coil_1_M] = SurfaceArea[];
// To be defined separately for each coil portion, to fix the convention of
// positive current (1: along Oz, -1: along -Oz)
SignBranch[Coil_1_P] = 1;
SignBranch[Coil_1_M] = -1;
Sc[Coil_2_P] = SurfaceArea[];
SignBranch[Coil_2_P] = 1;
Sc[Coil_2_M] = SurfaceArea[];
SignBranch[Coil_2_M] = -1;
If(ConductorType == 2)
// Number of turns (same for PLUS and MINUS portions) (half values because
// half coils are defined)
Ns[Coil_1] = 1;
Ns[Coil_2] = 1;
Ns[Coil_1] = 100;
Ns[Coil_2] = 200;
// Global definitions (nothing to change):
// To be defined separately for each coil portion:
Sc[Coil_1_P] = SurfaceArea[];
Sc[Coil_1_M] = SurfaceArea[];
Sc[Coil_2_P] = SurfaceArea[];
Sc[Coil_2_M] = SurfaceArea[];
// Current density in each coil portion for a unit current (will be multiplied
// by the actual total current in the coil)
// Current density in each coil portion for a unit current (will be
// multiplied by the actual total current in the coil), in the case of
// stranded conductors
js0[Coils] = Ns[] / Sc[] * Vector[0, 0, SignBranch[]];
CoefGeos[Coils] = SignBranch[] * CoefGeo;
// The reluctivity will be used
nu[] = 1/mu[];
}
If(type_Analysis == 1)
Flag_FrequencyDomain = 1;
Else
Flag_FrequencyDomain = 0;
EndIf
If (type_Source == 1) // current
Flag_CircuitCoupling = 0;
ElseIf (type_Source == 2) // voltage
// For a correct definition of the voltage
CoefGeos[Coils] = SignBranch[] * thickness_Core;
}
// PLUS and MINUS coil portions to be connected in series, with applied
// voltage on the resulting branch
// We will use a circuit coupling to connect the PLUS and MINUS portions of the
// coil in series, for both the primary and secondary. We will then apply a
// voltage source (with a small resistance in series) on the resulting branch on
// the primary, and connect a resistive load on the resulting branch on the
// secondary.
Flag_CircuitCoupling = 1;
// Note that the voltage will not be equally distributed in the PLUS and MINUS
// parts, which is the reason why we must apply the total voltage through a
// circuit -- and we cannot simply use a current source like in Tutorial 7a.
// Here is the definition of the circuits on primary and secondary sides:
Group {
// Empty Groups to be filled
Resistance_Cir = Region[{}];
Inductance_Cir = Region[{}] ;
Capacitance_Cir = Region[{}] ;
SourceV_Cir = Region[{}]; // Voltage sources
SourceI_Cir = Region[{}]; // Current sources
Resistance_Cir = Region[{}]; // all resistances
Inductance_Cir = Region[{}] ; // all inductances
Capacitance_Cir = Region[{}] ; // all capacitances
SourceV_Cir = Region[{}]; // all voltage sources
SourceI_Cir = Region[{}]; // all current sources
// Primary side
E_in = Region[10001]; // arbitrary region number (not linked to the mesh)
......@@ -143,27 +128,41 @@ ElseIf (type_Source == 2) // voltage
// End-winding primary winding resistance for more realistic primary coil
// model
Resistance[R_in] = 1;
Resistance[R_in] = 1e-3;
}
Constraint {
{ Name MagneticVectorPotential_2D;
Case {
{ Region Sur_Air_Ext; Value 0; }
}
}
{ Name Current_2D;
Case {
}
}
{ Name Voltage_2D;
Case {
}
}
{ Name Current_Cir ;
Case {
}
}
{ Name Voltage_Cir ;
Case {
{ Region E_in; Value val_E_in; TimeFunction F_Cos_wt_p[]{2*Pi*Freq, phase_E_in}; }
{ Region E_in; Value val_E_in;
// F_Cos_wt_p[] is a built-in function with two parameters (w and p),
// that can be used to evaluate cos(w * t + p) in both frequency- and
// time-domain
TimeFunction F_Cos_wt_p[]{2*Pi*Freq, phase_E_in}; }
}
}
{ Name ElectricalCircuit ; Type Network ;
Case Circuit_1 {
// PLUS and MINUS coil portions to be connected in series, together with
// E_in (an additional resistor should be defined to represent the
// Coil_1 end-winding (not considered in the 2D model))
// E_in; an additional resistor is defined in series to represent the
// Coil_1 end-winding, which is not considered in the 2D model.
{ Region E_in; Branch {1,4}; }
{ Region R_in; Branch {4,2}; }
......@@ -172,38 +171,14 @@ ElseIf (type_Source == 2) // voltage
}
Case Circuit_2 {
// PLUS and MINUS coil portions to be connected in series, together with
// R_out (an additional resistor should be defined to represent the
// Coil_2 end-winding (not considered in the 2D model))
// R_out (an additional resistor could be defined to represent the Coil_2
// end-winding - but we can directly add it to R_out as well)
{ Region R_out; Branch {1,2}; }
{ Region Coil_2_P; Branch {2,3} ; }
{ Region Coil_2_M; Branch {3,1} ; }
}
}
}
EndIf
Constraint {
{ Name MagneticVectorPotential_2D;
Case {
{ Region Sur_Air_Ext; Value 0; }
}
}
{ Name Current_2D;
Case {
If (type_Source == 1)
// Current in each coil (same for PLUS and MINUS portions)
{ Region Coil_1; Value 1; TimeFunction F_Sin_wt_p[]{2*Pi*Freq, 0}; }
{ Region Coil_2; Value 0; }
EndIf
}
}
{ Name Voltage_2D;
Case {
}
}
}
Include "Lib_Magnetodynamics2D_av_Cir.pro";
......@@ -214,40 +189,19 @@ PostOperation {
Print[ j, OnElementsOf Region[{Vol_C_Mag, Vol_S_Mag}], Format Gmsh, File "j.pos" ];
Print[ b, OnElementsOf Vol_Mag, Format Gmsh, File "b.pos" ];
Print[ az, OnElementsOf Vol_Mag, Format Gmsh, File "az.pos" ];
If (type_Analysis == 1) // frequency domain
If (type_Source == 1) // current
// In text file UI.txt: voltage and current for each coil portion (note
// that the voltage is not equally distributed in PLUS and MINUS
// portions, which is the reason why we must apply the total voltage
// through a circuit -> type_Source == 2)
Echo[ "Coil_1_P", Format Table, File "UI.txt" ];
Print[ U, OnRegion Coil_1_P, Format FrequencyTable, File > "UI.txt" ];
Print[ I, OnRegion Coil_1_P, Format FrequencyTable, File > "UI.txt"];
Echo[ "Coil_1_M", Format Table, File > "UI.txt" ];
Print[ U, OnRegion Coil_1_M, Format FrequencyTable, File > "UI.txt" ];
Print[ I, OnRegion Coil_1_M, Format FrequencyTable, File > "UI.txt"];
Echo[ "Coil_2_P", Format Table, File > "UI.txt" ];
Print[ U, OnRegion Coil_2_P, Format FrequencyTable, File > "UI.txt" ];
Print[ I, OnRegion Coil_2_P, Format FrequencyTable, File > "UI.txt"];
Echo[ "Coil_2_M", Format Table, File > "UI.txt" ];
Print[ U, OnRegion Coil_2_M, Format FrequencyTable, File > "UI.txt" ];
Print[ I, OnRegion Coil_2_M, Format FrequencyTable, File > "UI.txt"];
ElseIf (type_Source == 2)
// In text file UI.txt: voltage and current of the primary coil (from E_in)
// (real and imaginary parts!)
If (Flag_FrequencyDomain)
// In text file UI.txt: voltage and current of the primary coil (from
// E_in) (real and imaginary parts!)
Echo[ "E_in", Format Table, File "UI.txt" ];
Print[ U, OnRegion E_in, Format FrequencyTable, File > "UI.txt" ];
Print[ I, OnRegion E_in, Format FrequencyTable, File > "UI.txt"];
// In text file UI.txt: voltage and current of the secondary coil (from R_out)
// In text file UI.txt: voltage and current of the secondary coil (from
// R_out)
Echo[ "R_out", Format Table, File > "UI.txt" ];
Print[ U, OnRegion R_out, Format FrequencyTable, File > "UI.txt" ];
Print[ I, OnRegion R_out, Format FrequencyTable, File > "UI.txt"];
EndIf
EndIf
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment