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,147 +38,98 @@ 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;
// Number of turns (same for PLUS and MINUS portions) (half values because
// half coils are defined)
Ns[Coil_1] = 1;
Ns[Coil_2] = 1;
// Global definitions (nothing to change):
// Current density in each coil portion for a unit current (will be multiplied
// by the actual total current in the coil)
js0[Coils] = Ns[]/Sc[] * Vector[0,0,SignBranch[]];
CoefGeos[Coils] = SignBranch[] * CoefGeo;
If(ConductorType == 2)
// Number of turns (same for PLUS and MINUS portions) (half values because
// half coils are defined)
Ns[Coil_1] = 100;
Ns[Coil_2] = 200;
// 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), in the case of
// stranded conductors
js0[Coils] = Ns[] / Sc[] * Vector[0, 0, SignBranch[]];
EndIf
// The reluctivity will be used
nu[] = 1/mu[];
// For a correct definition of the voltage
CoefGeos[Coils] = SignBranch[] * thickness_Core;
}
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
// PLUS and MINUS coil portions to be connected in series, with applied
// voltage on the resulting branch
Flag_CircuitCoupling = 1;
// 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
// Primary side
E_in = Region[10001]; // arbitrary region number (not linked to the mesh)
SourceV_Cir += Region[{E_in}];
R_in = Region[10002]; // arbitrary region number (not linked to the mesh)
Resistance_Cir += Region[{R_in}];
// Secondary side
R_out = Region[10101]; // arbitrary region number (not linked to the mesh)
Resistance_Cir += Region[{R_out}];
}
Function {
deg = Pi/180;
// Input RMS voltage (half of the voltage because of symmetry; half coils
// are defined)
val_E_in = 1.;
phase_E_in = 90 *deg; // Phase in radian (from phase in degree)
// High value for an open-circuit test; Low value for a short-circuit test;
// any value in-between for any charge
Resistance[R_out] = 1e6;
// 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;
// End-winding primary winding resistance for more realistic primary coil
// model
Resistance[R_in] = 1;
}
Constraint {
{ 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}; }
}
}
// 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.
{ 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))
{ Region E_in; Branch {1,4}; }
{ Region R_in; Branch {4,2}; }
{ Region Coil_1_P; Branch {2,3} ; }
{ Region Coil_1_M; Branch {3,1} ; }
}
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))
{ Region R_out; Branch {1,2}; }
{ Region Coil_2_P; Branch {2,3} ; }
{ Region Coil_2_M; Branch {3,1} ; }
}
}
}
// Here is the definition of the circuits on primary and secondary sides:
Group {
// Empty Groups to be filled
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)
SourceV_Cir += Region[{E_in}];
R_in = Region[10002]; // arbitrary region number (not linked to the mesh)
Resistance_Cir += Region[{R_in}];
// Secondary side
R_out = Region[10101]; // arbitrary region number (not linked to the mesh)
Resistance_Cir += Region[{R_out}];
}
EndIf
Function {
deg = Pi/180;
// Input RMS voltage (half of the voltage because of symmetry; half coils
// are defined)
val_E_in = 1.;
phase_E_in = 90 *deg; // Phase in radian (from phase in degree)
// High value for an open-circuit test; Low value for a short-circuit test;
// any value in-between for any charge
Resistance[R_out] = 1e6;
// End-winding primary winding resistance for more realistic primary coil
// model
Resistance[R_in] = 1e-3;
}
Constraint {
{ Name MagneticVectorPotential_2D;
......@@ -193,17 +139,46 @@ Constraint {
}
{ 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 {
}
}
{ Name Current_Cir ;
Case {
}
}
{ Name Voltage_Cir ;
Case {
{ 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 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}; }
{ Region Coil_1_P; Branch {2,3} ; }
{ Region Coil_1_M; Branch {3,1} ; }
}
Case Circuit_2 {
// PLUS and MINUS coil portions to be connected in series, together with
// 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} ; }
}
}
}
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