Skip to content
Merged
Show file tree
Hide file tree
Changes from 33 commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
be1a1d8
physical group for electrostatci simulation
Oct 16, 2024
dc044f8
first step for integrating electrostatic simulation in FEMMT. THe ex…
Nov 11, 2024
1a36066
merge main into branch
Nov 11, 2024
d8707a2
adding the stored energy in the core to the log
Nov 12, 2024
7f71c6b
modifying the code for stored energy in the core in FEMM
Nov 12, 2024
293512f
excluding the left part from the outer boundary. Applying neumann in…
Nov 14, 2024
03e22a0
try for extracting the capacitances
Nov 21, 2024
8fc4d33
calculating C through charges
Nov 30, 2024
ae8fa27
adding potenial to a core, and adjust drawing temprarly for some purpose
Dec 30, 2024
096eae0
the insulations are taking into account in the electrostatic simulation
Jan 12, 2025
8148cf6
modifying insulation delta for top and bot
Jan 16, 2025
b690c2b
ttt
Jan 17, 2025
51b1e4d
just another permitivity used for the insulation
Jan 28, 2025
ee2be7c
implementing the insulation of bobbin from datasheet partially. Not a…
Jan 28, 2025
6986d49
implementing the insulation around the winding. In addition a kapton …
Feb 4, 2025
a3dcd81
temprarly for measurement
Feb 9, 2025
554450b
implementing layer insulation
Feb 22, 2025
117f5fc
Some_measurements_example
Apr 14, 2025
e72ffbd
running the code for magnetic simulation
Apr 14, 2025
538df5f
edit winding scheme for hexagonal
Apr 30, 2025
3702d0b
litz wire study
May 12, 2025
3091469
move bobbin parameters to the insulation class
May 28, 2025
48b8948
fixing the bugs of running the simulation without turn, kapton insula…
Jun 4, 2025
e435d4b
Resolved merge conflicts and completed merge from main into electrost…
Jun 4, 2025
c9a1dbc
fix basic_transformer and coorect dimensions of PQ40/40
Jun 8, 2025
b720ec2
deleting winding_test file to fix merging
Jun 8, 2025
6f3919f
delete old capacitance functions
Jun 8, 2025
4510aff
making basic_inductor and basic_transformer files same as in the ori…
Jun 8, 2025
8c092af
add discription of capacitance functions
Jun 8, 2025
b324a53
modified inductor file
Jun 8, 2025
7201d89
modifying test file for the new features
Jun 9, 2025
7280631
removing the ṕrinting of local stored energy
Jun 9, 2025
aa09196
add bobbin mdimensions. NOte that PQ16/11.6 dimensions are not known…
Jun 11, 2025
3250eec
resolving some merge conflicts and changing some names
Jun 16, 2025
4c33a98
collecting insulation material properties
Jun 24, 2025
6097798
add electrostatic tests to the test file
Jun 24, 2025
0b1f079
remove some functions that are not needed. Fixing the test file bugs
Jul 2, 2025
f0ddd9e
reducing the function of getting the capacitances into small functions
Jul 6, 2025
e38bb84
fixing pycodestyle
Jul 6, 2025
954f003
fix typo
gituser789 Jul 7, 2025
dfe18af
fix pyspelling
gituser789 Jul 7, 2025
710f775
rename Values to be values
Jul 7, 2025
9fa0cd4
fix case-sensitive folder structure for linux
gituser789 Jul 7, 2025
e8d43c9
Merge branch 'electrostatic_solver' of github.com:upb-lea/FEM_Magneti…
gituser789 Jul 7, 2025
5c6bd9b
adding some descriptions
Jul 7, 2025
3f848ea
fix gmsh version
gituser789 Jul 8, 2025
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
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@ femmt/thermal/solver/PostOperation.pro
femmt/examples/paper_thermal_validation.py
!femmt/examples/example_log.json
femmt/examples/example_results
<<<<<<< HEAD
Comment thread
Abujazar marked this conversation as resolved.
Outdated
femmt/examples/EMC_Analyze.py
=======
Comment thread
Abujazar marked this conversation as resolved.
Outdated

# pyspelling
dictionary.dic
>>>>>>> main
Comment thread
Abujazar marked this conversation as resolved.
Outdated
1,930 changes: 1,884 additions & 46 deletions femmt/component.py

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions femmt/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,12 @@ def update_paths(self, working_directory: str, electro_magnetic_folder_path: str

# Setup file paths
self.e_m_results_log_path = os.path.join(self.results_folder_path, "log_electro_magnetic.json")
###
# for electrostatic
self.electrostatic_results_log_path = os.path.join(self.results_folder_path, "log_electro_static.json")
self.capacitance_result_log_path = os.path.join(self.results_folder_path, "capacitance_result.json")
self.capacitance_matrix_path = os.path.join(self.results_folder_path, "log_capacitance_matrix.json")
###
self.coordinates_description_log_path = os.path.join(self.results_folder_path, "log_coordinates_description.json")
self.reluctance_log_path = os.path.join(self.results_folder_path, "log_reluctance_and_inductance.json")
self.material_log_path = os.path.join(self.results_folder_path, "log_material.json")
Expand Down
873 changes: 683 additions & 190 deletions femmt/drawing.py

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions femmt/dtos.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,14 @@ class StackedCoreDimensions:
window_h_top: float
window_h_bot: float

@dataclass
class BobbinDimensions:
"""Defines the dimensions of a default core."""

bobbin_inner_diameter: float
bobbin_window_w: float
bobbin_window_h: float
bobbin_h: float

@dataclass
class ConductorRow:
Expand Down
164 changes: 164 additions & 0 deletions femmt/electro_magnetic/Values_electrostatic.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
PostOperation Get_global UsingPost EleSta {
// energy stored in air
Print[ energy[Domain], OnGlobal, Format TimeTable, File > StrCat[DirResVals,"Energy_Stored_Component.dat"], LastTimeStepOnly, StoreInVariable $energy_Component];
Print[ energy[Air], OnGlobal, Format TimeTable, File > StrCat[DirResVals,"Energy_Stored_Air.dat"], LastTimeStepOnly, StoreInVariable $energy_Air];
Print[ energy[Core], OnGlobal, Format TimeTable, File > StrCat[DirResVals,"Energy_Stored_Core.dat"], LastTimeStepOnly, StoreInVariable $energy_Core];
// Print[ energy[Insulation_bobbin], OnGlobal, Format TimeTable, File > StrCat[DirResVals,"Energy_Stored_bobbin.dat"], LastTimeStepOnly, StoreInVariable $energy_bobbin];
// Print[ energy[Insulation_cond], OnGlobal, Format TimeTable, File > StrCat[DirResVals,"Energy_Stored_Cond_insulation.dat"], LastTimeStepOnly, StoreInVariable $energy_cond_insulation];

// average voltage of the core
Print[ Avg_Voltage_Core[Core], OnGlobal, Format TimeTable, File > StrCat[DirResCirc,"Avg_Core_voltage.dat"], LastTimeStepOnly, StoreInVariable $Avg_Voltage_Core];

// Charges
Print[ Charge[Air], OnGlobal, Format TimeTable, File > StrCat[DirResVals,"charge_Air.dat"], LastTimeStepOnly, StoreInVariable $Charge_Air];
Print[ Charge[Core], OnGlobal, Format TimeTable, File > StrCat[DirResVals,"charge_Core.dat"], LastTimeStepOnly, StoreInVariable $Charge_Core];
// voltage and charges on windings
For n In {1:n_windings}
Print[ U, OnRegion Winding~{n}, Format TimeTable, File > Sprintf[StrCat[DirResCirc,"U_%g.dat"], n] , LastTimeStepOnly];
EndFor
For n In {1:n_windings}
Print[ Q, OnRegion Winding~{n}, Format TimeTable, File > Sprintf[StrCat[DirResCirc,"Q_%g.dat"], n] , LastTimeStepOnly];
EndFor
Print[ Q, OnRegion Core, Format TimeTable, File > Sprintf[StrCat[DirResCirc,"Q_Core.dat"]] , LastTimeStepOnly];

// print charge and voltage for each turn in separate file (Just another way)
For winding_number In {1:n_windings}
nbturns~{winding_number} = NbrCond~{winding_number} / SymFactor;

// Print charge for each turn in the winding
For turn_number In {1:nbturns~{winding_number}}
Print[ U, OnRegion Turn~{winding_number}~{turn_number}, Format TimeTable,
File > Sprintf[StrCat[DirResCirc, "U_%g_%g.dat"], winding_number, turn_number], LastTimeStepOnly];
Print[ Q, OnRegion Turn~{winding_number}~{turn_number}, Format TimeTable,
File > Sprintf[StrCat[DirResCirc, "Q_%g_%g.dat"], winding_number, turn_number], LastTimeStepOnly];
EndFor
EndFor

// print voltages for each turn
For winding_number In {1:n_windings}
nbturns~{winding_number} = NbrCond~{winding_number} / SymFactor;

// Print voltage for each turn in the winding
For turn_number In {1:nbturns~{winding_number}}
Print[ U~{winding_number}~{turn_number},
OnRegion Turn~{winding_number}~{turn_number}, Format Table, File > Sprintf[StrCat[DirResValsVoltage~{winding_number},
"voltage_%g_%g.dat"], winding_number, turn_number], LastTimeStepOnly, StoreInVariable $U~{winding_number}~{turn_number}];
EndFor
EndFor

// print charges for each turn
For winding_number In {1:n_windings}
nbturns~{winding_number} = NbrCond~{winding_number} / SymFactor;

// Print charge for each turn in the winding
For turn_number In {1:nbturns~{winding_number}}
Print[ Q~{winding_number}~{turn_number},
OnRegion Turn~{winding_number}~{turn_number}, Format Table, File > Sprintf[StrCat[DirResValsCharge~{winding_number},
"Charge_%g_%g.dat"], winding_number, turn_number], LastTimeStepOnly, StoreInVariable $Q~{winding_number}~{turn_number}];
EndFor
EndFor


// Calculate and print capacitance through the stored energy
If (Flag_voltage)
For winding_number In {1:n_windings}
nbturns~{winding_number} = NbrCond~{winding_number} / SymFactor;

// Loop through each turn as the reference turn
For turn_number1 In {1:nbturns~{winding_number}}
// Loop through every other turn, including the reference turn itself
Print[ Capacitance_Between_Turns_Core~{winding_number}~{turn_number1},
OnRegion DomainCond~{winding_number}~{turn_number1}, Format Table, File > Sprintf[StrCat[DirResValsTurn~{turn_number1},
"C_%g_%g_Core.dat"], winding_number, turn_number1], LastTimeStepOnly];
For turn_number2 In {1:nbturns~{winding_number}}
// Print the calculated capacitance between each pair of turns
/*Print[ Capacitance_Between_Turns~{winding_number}~{turn_number1}~{turn_number2}[Domain],
OnGlobal, Format TimeTable,
File > Sprintf[StrCat[DirResValsTurn~{turn_number1}, "C_%g_%g_%g.dat"], winding_number, turn_number1, turn_number2] ];*/
// Using this for $...
Print[ Capacitance_Between_Turns~{winding_number}~{turn_number1}~{turn_number2},
OnRegion DomainCond~{winding_number}~{turn_number1}, Format Table, File > Sprintf[StrCat[DirResValsTurn~{turn_number1},
"C_%g_%g_%g.dat"], winding_number, turn_number1, turn_number2], LastTimeStepOnly];
EndFor
// Print capacitance between this turn and turns in other windings
For other_winding_number In {1:n_windings}
If (other_winding_number != winding_number)
nbturns~{other_winding_number} = NbrCond~{other_winding_number} / SymFactor;

// Loop through each turn in the other winding
For turn_number2 In {1:nbturns~{other_winding_number}}
// Print the calculated capacitance between each pair of turns in different windings
Print[ Capacitance_Cross~{winding_number}~{turn_number1}~{other_winding_number}~{turn_number2},
OnRegion DomainCond~{winding_number}~{turn_number1}, Format Table, File > Sprintf[StrCat[DirResValsTurn~{turn_number1},
"C_Cross_%g_%g_%g_%g.dat"], winding_number, turn_number1, other_winding_number, turn_number2], LastTimeStepOnly];
EndFor
EndIf
EndFor
EndFor
EndFor
EndIf



// Capacitances from QV relation on each turn of the same winding
If (Flag_voltage)
// Capacitance Calculation Between Turns for Each Winding (from charges)
For winding_number In {1:n_windings}
nbturns~{winding_number} = NbrCond~{winding_number} / SymFactor;

// Loop through each turn to define its capacitance relative to other turns
For turn_number1 In {1:nbturns~{winding_number}}
// Print the self-capacitance value
Print[Capacitance_Turn_Core~{winding_number}~{turn_number1},
OnRegion Turn~{winding_number}~{turn_number1},
Format Table,
File > Sprintf[StrCat[DirResValsCapacitanceFromQV~{winding_number}, "C_%g_%g_Core.dat"], winding_number, turn_number1],
LastTimeStepOnly];
For turn_number2 In {1:nbturns~{winding_number}}
// Calculate capacitance for every pair of turns, where turn_number1 is the reference voltage turn
If (turn_number1 == turn_number2)
// Print the self-capacitance value
Print[Capacitance_Turn_Self~{winding_number}~{turn_number1},
OnRegion Turn~{winding_number}~{turn_number1},
Format Table,
File > Sprintf[StrCat[DirResValsCapacitanceFromQV~{winding_number}, "C_%g_%g_%g.dat"], winding_number, turn_number1, turn_number2],
LastTimeStepOnly];
Else
// Print the mutual capacitance value
Print[Capacitance_Turn~{winding_number}~{turn_number1}~{turn_number2},
OnRegion Turn~{winding_number}~{turn_number1},
Format Table,
File > Sprintf[StrCat[DirResValsCapacitanceFromQV~{winding_number}, "C_%g_%g_%g.dat"], winding_number, turn_number1, turn_number2],
LastTimeStepOnly];
EndIf
EndFor
EndFor
EndFor
EndIf

// Print Capacitance Between Turns of Different Windings
For winding_number1 In {1:n_windings}
nbturns1~{winding_number1} = NbrCond~{winding_number1} / SymFactor;

For winding_number2 In {1:n_windings}
If (winding_number1 != winding_number2)
nbturns2~{winding_number2} = NbrCond~{winding_number2} / SymFactor;

For turn_number1 In {1:nbturns1~{winding_number1}}
For turn_number2 In {1:nbturns2~{winding_number2}}
// Print the mutual capacitance value between different windings
Print[Capacitance_Turn_Windings~{winding_number1}~{turn_number1}~{winding_number2}~{turn_number2},
OnRegion Turn~{winding_number1}~{turn_number1},
Format Table,
File > Sprintf[StrCat[DirResValsCapacitanceFromQV~{winding_number1},
"C_%g_%g_%g_%g.dat"], winding_number1, turn_number1, winding_number2, turn_number2],
LastTimeStepOnly];
EndFor
EndFor
EndIf
EndFor
EndFor



}
25 changes: 25 additions & 0 deletions femmt/electro_magnetic/fields_electrostatic.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
PostOperation Map_local UsingPost EleSta {

// Potentials for the entire domain
ExtGmsh = ".pos";
Print[ u0, OnElementsOf Region[{Domain}], Name "Potential / V", File StrCat[DirResFields, "Potential", ExtGmsh], LastTimeStepOnly ] ;
Print[ u0, OnElementsOf Region[{Core}], Name "Average Potential on Core / V", File StrCat[DirResFields, "Voltage_Core_Map", ExtGmsh], LastTimeStepOnly ];

// Electric Field vector in the entire domain
Print[ e, OnElementsOf Region[{Domain}], Name "Electric Field", File StrCat[DirResFields, "Efield", ExtGmsh], LastTimeStepOnly ] ;
//Print[ Welocal, OnElementsOf Region[{Domain}], Name "Stored Energy", File StrCat[DirResFields, "We", ExtGmsh], LastTimeStepOnly ] ;
Print[ MagE, OnElementsOf Region[{Domain}], Name "Magnitude Electric Field / V/m", File StrCat[DirResFields, "MagE", ExtGmsh], LastTimeStepOnly ] ;

// Displacement Field vector in the entire domain
Print[ d, OnElementsOf Region[{Domain}], Name "Electric Field Density", File StrCat[DirResFields, "Dfield", ExtGmsh], LastTimeStepOnly ] ;
Print[ MagD, OnElementsOf Region[{Domain}], Name "Magnitude Electric Field Density / C/m^2", File StrCat[DirResFields, "MagD", ExtGmsh], LastTimeStepOnly ] ;


// Settings for visualization output (optional)
Echo[ Str["View[PostProcessing.NbViews-1].Light=0;
View[PostProcessing.NbViews-1].LineWidth = 2;
View[PostProcessing.NbViews-1].RangeType=3;
View[PostProcessing.NbViews-1].IntervalsType=1;
View[PostProcessing.NbViews-1].NbIso = 25;"],
File OptionPos];
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why is there an empty file?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it is deleted

Empty file.
Loading
Loading