emerge 0.5.0__py3-none-any.whl → 0.5.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of emerge might be problematic. Click here for more details.
- emerge/_emerge/bc.py +11 -8
- emerge/_emerge/cs.py +2 -2
- emerge/_emerge/elements/femdata.py +14 -14
- emerge/_emerge/elements/index_interp.py +1 -1
- emerge/_emerge/elements/ned2_interp.py +1 -1
- emerge/_emerge/elements/nedelec2.py +4 -4
- emerge/_emerge/elements/nedleg2.py +9 -9
- emerge/_emerge/geo/horn.py +1 -1
- emerge/_emerge/geo/modeler.py +18 -19
- emerge/_emerge/geo/operations.py +13 -10
- emerge/_emerge/geo/pcb.py +70 -69
- emerge/_emerge/geo/pcb_tools/macro.py +14 -13
- emerge/_emerge/geo/pmlbox.py +1 -1
- emerge/_emerge/geometry.py +46 -32
- emerge/_emerge/logsettings.py +3 -3
- emerge/_emerge/material.py +11 -11
- emerge/_emerge/mesh3d.py +81 -59
- emerge/_emerge/mesher.py +26 -21
- emerge/_emerge/mth/pairing.py +2 -2
- emerge/_emerge/periodic.py +34 -31
- emerge/_emerge/physics/microwave/adaptive_freq.py +14 -11
- emerge/_emerge/physics/microwave/assembly/assembler.py +61 -57
- emerge/_emerge/physics/microwave/assembly/generalized_eigen.py +43 -8
- emerge/_emerge/physics/microwave/assembly/robinbc.py +5 -5
- emerge/_emerge/physics/microwave/microwave_3d.py +40 -20
- emerge/_emerge/physics/microwave/microwave_bc.py +114 -95
- emerge/_emerge/physics/microwave/microwave_data.py +33 -33
- emerge/_emerge/physics/microwave/simjob.py +12 -12
- emerge/_emerge/physics/microwave/sparam.py +12 -12
- emerge/_emerge/physics/microwave/touchstone.py +1 -1
- emerge/_emerge/plot/display.py +12 -6
- emerge/_emerge/plot/pyvista/display.py +44 -39
- emerge/_emerge/plot/pyvista/display_settings.py +1 -1
- emerge/_emerge/plot/simple_plots.py +15 -15
- emerge/_emerge/selection.py +35 -39
- emerge/_emerge/simmodel.py +29 -39
- emerge/_emerge/simulation_data.py +19 -14
- emerge/_emerge/solve_interfaces/pardiso_interface.py +24 -18
- emerge/_emerge/solver.py +52 -52
- emerge/lib.py +243 -243
- {emerge-0.5.0.dist-info → emerge-0.5.2.dist-info}/METADATA +1 -1
- emerge-0.5.2.dist-info/RECORD +81 -0
- emerge/_emerge/plot/grapher.py +0 -93
- emerge-0.5.0.dist-info/RECORD +0 -82
- {emerge-0.5.0.dist-info → emerge-0.5.2.dist-info}/WHEEL +0 -0
- {emerge-0.5.0.dist-info → emerge-0.5.2.dist-info}/entry_points.txt +0 -0
- {emerge-0.5.0.dist-info → emerge-0.5.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -20,10 +20,11 @@ from ...material import Material
|
|
|
20
20
|
from ...mesh3d import Mesh3D
|
|
21
21
|
from ...coord import Line
|
|
22
22
|
from ...elements.femdata import FEMBasis
|
|
23
|
+
from ...elements.nedelec2 import Nedelec2
|
|
23
24
|
from ...solver import DEFAULT_ROUTINE, SolveRoutine
|
|
24
25
|
from ...system import called_from_main_function
|
|
25
26
|
from ...selection import FaceSelection
|
|
26
|
-
from scipy.sparse.linalg import inv as sparse_inverse
|
|
27
|
+
from scipy.sparse.linalg import inv as sparse_inverse # type: ignore
|
|
27
28
|
from .microwave_bc import MWBoundaryConditionSet, PEC, ModalPort, LumpedPort, PortBC
|
|
28
29
|
from .microwave_data import MWData
|
|
29
30
|
from .assembly.assembler import Assembler
|
|
@@ -110,11 +111,11 @@ class Microwave3D:
|
|
|
110
111
|
self.resolution: float = 1
|
|
111
112
|
|
|
112
113
|
self.mesher: Mesher = mesher
|
|
113
|
-
self.mesh: Mesh3D =
|
|
114
|
+
self.mesh: Mesh3D = Mesh3D(self.mesher)
|
|
114
115
|
|
|
115
116
|
self.assembler: Assembler = Assembler()
|
|
116
117
|
self.bc: MWBoundaryConditionSet = MWBoundaryConditionSet(None)
|
|
117
|
-
self.basis:
|
|
118
|
+
self.basis: Nedelec2 | None = None
|
|
118
119
|
self.solveroutine: SolveRoutine = DEFAULT_ROUTINE
|
|
119
120
|
self.set_order(order)
|
|
120
121
|
self.cache_matrices: bool = True
|
|
@@ -125,8 +126,8 @@ class Microwave3D:
|
|
|
125
126
|
|
|
126
127
|
## Data
|
|
127
128
|
self._params: dict[str, float] = dict()
|
|
128
|
-
self._simstart:
|
|
129
|
-
self._simend:
|
|
129
|
+
self._simstart: float = 0.0
|
|
130
|
+
self._simend: float = 0.0
|
|
130
131
|
|
|
131
132
|
def reset_data(self):
|
|
132
133
|
self.data = MWData()
|
|
@@ -167,7 +168,7 @@ class Microwave3D:
|
|
|
167
168
|
Returns:
|
|
168
169
|
list[PortBC]: A list of all port boundary conditions
|
|
169
170
|
"""
|
|
170
|
-
return sorted(self.bc.oftype(PortBC), key=lambda x: x.number)
|
|
171
|
+
return sorted(self.bc.oftype(PortBC), key=lambda x: x.number) # type: ignore
|
|
171
172
|
|
|
172
173
|
|
|
173
174
|
def _initialize_bcs(self) -> None:
|
|
@@ -190,7 +191,7 @@ class Microwave3D:
|
|
|
190
191
|
Args:
|
|
191
192
|
frequency (float | list[float] | np.ndarray): The frequency points.
|
|
192
193
|
"""
|
|
193
|
-
logger.info(f'Setting frequency as {frequency
|
|
194
|
+
logger.info(f'Setting frequency as {frequency}Hz.')
|
|
194
195
|
if isinstance(frequency, (tuple, list, np.ndarray)):
|
|
195
196
|
self.frequencies = list(frequency)
|
|
196
197
|
else:
|
|
@@ -307,7 +308,7 @@ class Microwave3D:
|
|
|
307
308
|
port.vintline = Line.from_points(start, end, 21)
|
|
308
309
|
|
|
309
310
|
logger.info(f'Ending node = {_dimstring(end)}')
|
|
310
|
-
|
|
311
|
+
|
|
311
312
|
port.v_integration = True
|
|
312
313
|
|
|
313
314
|
def _compute_integration_line(self, group1: list[int], group2: list[int]) -> tuple[np.ndarray, np.ndarray]:
|
|
@@ -347,9 +348,11 @@ class Microwave3D:
|
|
|
347
348
|
list[int]: A list of node integers of island 1.
|
|
348
349
|
list[int]: A list of node integers of island 2.
|
|
349
350
|
'''
|
|
351
|
+
if self.basis is None:
|
|
352
|
+
raise ValueError('The field basis is not yet defined.')
|
|
350
353
|
|
|
351
354
|
logger.debug('Finding PEC TEM conductors')
|
|
352
|
-
pecs: list[PEC] = self.bc.oftype(PEC)
|
|
355
|
+
pecs: list[PEC] = self.bc.oftype(PEC) # type: ignore
|
|
353
356
|
mesh = self.mesh
|
|
354
357
|
|
|
355
358
|
# Process all PEC Boundary Conditions
|
|
@@ -366,16 +369,15 @@ class Microwave3D:
|
|
|
366
369
|
edge_ids = list(mesh.tri_to_edge[:,itri].flatten())
|
|
367
370
|
pec_edges.extend(edge_ids)
|
|
368
371
|
|
|
369
|
-
pec_edges = set(pec_edges)
|
|
372
|
+
pec_edges = list(set(pec_edges))
|
|
370
373
|
|
|
371
374
|
tri_ids = mesh.get_triangles(port.tags)
|
|
372
375
|
edge_ids = list(mesh.tri_to_edge[:,tri_ids].flatten())
|
|
373
376
|
|
|
374
|
-
pec_port = np.array([i for i in
|
|
377
|
+
pec_port = np.array([i for i in pec_edges if i in set(edge_ids)])
|
|
375
378
|
|
|
376
379
|
pec_islands = mesh.find_edge_groups(pec_port)
|
|
377
380
|
|
|
378
|
-
self.basis._pec_islands = pec_islands
|
|
379
381
|
logger.debug(f'Found {len(pec_islands)} PEC islands.')
|
|
380
382
|
|
|
381
383
|
if len(pec_islands) != 2:
|
|
@@ -415,7 +417,7 @@ class Microwave3D:
|
|
|
415
417
|
TEM: bool = False,
|
|
416
418
|
target_kz = None,
|
|
417
419
|
target_neff = None,
|
|
418
|
-
freq: float = None) -> None:
|
|
420
|
+
freq: float | None = None) -> None:
|
|
419
421
|
''' Execute a modal analysis on a given ModalPort boundary condition.
|
|
420
422
|
|
|
421
423
|
Parameters:
|
|
@@ -442,6 +444,9 @@ class Microwave3D:
|
|
|
442
444
|
self._initialize_field()
|
|
443
445
|
self._initialize_bc_data()
|
|
444
446
|
|
|
447
|
+
if self.basis is None:
|
|
448
|
+
raise SimulationError('Cannot proceed, the current basis class is undefined.')
|
|
449
|
+
|
|
445
450
|
logger.debug('Retreiving material properties.')
|
|
446
451
|
ertet = self.mesh.retreive(lambda mat,x,y,z: mat.fer3d_mat(x,y,z), self.mesher.volumes)
|
|
447
452
|
urtet = self.mesh.retreive(lambda mat,x,y,z: mat.fur3d_mat(x,y,z), self.mesher.volumes)
|
|
@@ -557,7 +562,7 @@ class Microwave3D:
|
|
|
557
562
|
def frequency_domain(self,
|
|
558
563
|
parallel: bool = False,
|
|
559
564
|
njobs: int = 2,
|
|
560
|
-
harddisc_threshold: int = None,
|
|
565
|
+
harddisc_threshold: int | None = None,
|
|
561
566
|
harddisc_path: str = 'EMergeSparse',
|
|
562
567
|
frequency_groups: int = -1,
|
|
563
568
|
multi_processing: bool = False,
|
|
@@ -595,6 +600,9 @@ class Microwave3D:
|
|
|
595
600
|
self._initialize_field()
|
|
596
601
|
self._initialize_bc_data()
|
|
597
602
|
|
|
603
|
+
if self.basis is None:
|
|
604
|
+
raise SimulationError('Cannot proceed, the simulation basis class is undefined.')
|
|
605
|
+
|
|
598
606
|
er = self.mesh.retreive(lambda mat,x,y,z: mat.fer3d_mat(x,y,z), self.mesher.volumes)
|
|
599
607
|
ur = self.mesh.retreive(lambda mat,x,y,z: mat.fur3d_mat(x,y,z), self.mesher.volumes)
|
|
600
608
|
cond = self.mesh.retreive(lambda mat,x,y,z: mat.cond, self.mesher.volumes)[0,0,:]
|
|
@@ -777,6 +785,9 @@ class Microwave3D:
|
|
|
777
785
|
self._initialize_field()
|
|
778
786
|
self._initialize_bc_data()
|
|
779
787
|
|
|
788
|
+
if self.basis is None:
|
|
789
|
+
raise SimulationError('Cannot proceed. The simulation basis class is undefined.')
|
|
790
|
+
|
|
780
791
|
er = self.mesh.retreive(lambda mat,x,y,z: mat.fer3d_mat(x,y,z), self.mesher.volumes)
|
|
781
792
|
ur = self.mesh.retreive(lambda mat,x,y,z: mat.fur3d_mat(x,y,z), self.mesher.volumes)
|
|
782
793
|
cond = self.mesh.retreive(lambda mat,x,y,z: mat.cond, self.mesher.volumes)[0,0,:]
|
|
@@ -839,6 +850,8 @@ class Microwave3D:
|
|
|
839
850
|
ur (np.ndarray): The domain μᵣ
|
|
840
851
|
cond (np.ndarray): The domain conductivity
|
|
841
852
|
"""
|
|
853
|
+
if self.basis is None:
|
|
854
|
+
raise SimulationError('Cannot post-process. Simulation basis function is undefined.')
|
|
842
855
|
mesh = self.mesh
|
|
843
856
|
all_ports = self.bc.oftype(PortBC)
|
|
844
857
|
port_numbers = [port.port_number for port in all_ports]
|
|
@@ -863,7 +876,7 @@ class Microwave3D:
|
|
|
863
876
|
scalardata = self.data.scalar.new(freq=freq, **self._params)
|
|
864
877
|
scalardata.k0 = k0
|
|
865
878
|
scalardata.freq = freq
|
|
866
|
-
scalardata.init_sp(port_numbers)
|
|
879
|
+
scalardata.init_sp(port_numbers) # type: ignore
|
|
867
880
|
|
|
868
881
|
fielddata = self.data.field.new(freq=freq, **self._params)
|
|
869
882
|
fielddata.freq = freq
|
|
@@ -881,7 +894,7 @@ class Microwave3D:
|
|
|
881
894
|
k0 = k0,
|
|
882
895
|
beta = active_port.get_beta(k0),
|
|
883
896
|
Z0 = active_port.portZ0(k0),
|
|
884
|
-
Pout= active_port.power)
|
|
897
|
+
Pout = active_port.power)
|
|
885
898
|
scalardata.add_port_properties(active_port.port_number,
|
|
886
899
|
mode_number=active_port.mode_number,
|
|
887
900
|
k0 = k0,
|
|
@@ -899,7 +912,7 @@ class Microwave3D:
|
|
|
899
912
|
# Compute the S-parameters
|
|
900
913
|
# Define the field interpolation function
|
|
901
914
|
fieldf = self.basis.interpolate_Ef(solution, tetids=all_port_tets)
|
|
902
|
-
Pout = 0
|
|
915
|
+
Pout = 0.0 + 0j
|
|
903
916
|
|
|
904
917
|
# Active port power
|
|
905
918
|
logger.debug('Active ports:')
|
|
@@ -947,19 +960,26 @@ class Microwave3D:
|
|
|
947
960
|
"""
|
|
948
961
|
from .sparam import sparam_field_power, sparam_mode_power
|
|
949
962
|
if bc.v_integration:
|
|
963
|
+
if bc.vintline is None:
|
|
964
|
+
raise SimulationError('Trying to compute characteristic impedance but no integration line is defined.')
|
|
965
|
+
if bc.Z0 is None:
|
|
966
|
+
raise SimulationError('Trying to compute the impedance of a boundary condition with no characteristic impedance.')
|
|
967
|
+
|
|
950
968
|
V = bc.vintline.line_integral(fieldfunction)
|
|
951
969
|
|
|
952
970
|
if bc.active:
|
|
971
|
+
if bc.voltage is None:
|
|
972
|
+
raise ValueError('Cannot compute port S-paramer with a None port voltage.')
|
|
953
973
|
a = bc.voltage
|
|
954
974
|
b = (V-bc.voltage)
|
|
955
975
|
else:
|
|
956
976
|
a = 0
|
|
957
977
|
b = V
|
|
958
978
|
|
|
959
|
-
|
|
960
|
-
|
|
979
|
+
a_sig = a*csqrt(1/(2*bc.Z0))
|
|
980
|
+
b_sig = b*csqrt(1/(2*bc.Z0))
|
|
961
981
|
|
|
962
|
-
return
|
|
982
|
+
return b_sig, a_sig
|
|
963
983
|
else:
|
|
964
984
|
if bc.modetype(k0) == 'TEM':
|
|
965
985
|
const = 1/(np.sqrt((urp[0,0,:] + urp[1,1,:] + urp[2,2,:])/(erp[0,0,:] + erp[1,1,:] + erp[2,2,:])))
|