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.

Files changed (47) hide show
  1. emerge/_emerge/bc.py +11 -8
  2. emerge/_emerge/cs.py +2 -2
  3. emerge/_emerge/elements/femdata.py +14 -14
  4. emerge/_emerge/elements/index_interp.py +1 -1
  5. emerge/_emerge/elements/ned2_interp.py +1 -1
  6. emerge/_emerge/elements/nedelec2.py +4 -4
  7. emerge/_emerge/elements/nedleg2.py +9 -9
  8. emerge/_emerge/geo/horn.py +1 -1
  9. emerge/_emerge/geo/modeler.py +18 -19
  10. emerge/_emerge/geo/operations.py +13 -10
  11. emerge/_emerge/geo/pcb.py +70 -69
  12. emerge/_emerge/geo/pcb_tools/macro.py +14 -13
  13. emerge/_emerge/geo/pmlbox.py +1 -1
  14. emerge/_emerge/geometry.py +46 -32
  15. emerge/_emerge/logsettings.py +3 -3
  16. emerge/_emerge/material.py +11 -11
  17. emerge/_emerge/mesh3d.py +81 -59
  18. emerge/_emerge/mesher.py +26 -21
  19. emerge/_emerge/mth/pairing.py +2 -2
  20. emerge/_emerge/periodic.py +34 -31
  21. emerge/_emerge/physics/microwave/adaptive_freq.py +14 -11
  22. emerge/_emerge/physics/microwave/assembly/assembler.py +61 -57
  23. emerge/_emerge/physics/microwave/assembly/generalized_eigen.py +43 -8
  24. emerge/_emerge/physics/microwave/assembly/robinbc.py +5 -5
  25. emerge/_emerge/physics/microwave/microwave_3d.py +40 -20
  26. emerge/_emerge/physics/microwave/microwave_bc.py +114 -95
  27. emerge/_emerge/physics/microwave/microwave_data.py +33 -33
  28. emerge/_emerge/physics/microwave/simjob.py +12 -12
  29. emerge/_emerge/physics/microwave/sparam.py +12 -12
  30. emerge/_emerge/physics/microwave/touchstone.py +1 -1
  31. emerge/_emerge/plot/display.py +12 -6
  32. emerge/_emerge/plot/pyvista/display.py +44 -39
  33. emerge/_emerge/plot/pyvista/display_settings.py +1 -1
  34. emerge/_emerge/plot/simple_plots.py +15 -15
  35. emerge/_emerge/selection.py +35 -39
  36. emerge/_emerge/simmodel.py +29 -39
  37. emerge/_emerge/simulation_data.py +19 -14
  38. emerge/_emerge/solve_interfaces/pardiso_interface.py +24 -18
  39. emerge/_emerge/solver.py +52 -52
  40. emerge/lib.py +243 -243
  41. {emerge-0.5.0.dist-info → emerge-0.5.2.dist-info}/METADATA +1 -1
  42. emerge-0.5.2.dist-info/RECORD +81 -0
  43. emerge/_emerge/plot/grapher.py +0 -93
  44. emerge-0.5.0.dist-info/RECORD +0 -82
  45. {emerge-0.5.0.dist-info → emerge-0.5.2.dist-info}/WHEEL +0 -0
  46. {emerge-0.5.0.dist-info → emerge-0.5.2.dist-info}/entry_points.txt +0 -0
  47. {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 = None
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: FEMBasis = None
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: int = 0
129
- self._simend: int = 0
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/1e6}MHz.')
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
- port.voltage_integration_points = (start, end)
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 list(pec_edges) if i in set(edge_ids)])
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
- a = a*csqrt(1/(2*bc.Z0))
960
- b = b*csqrt(1/(2*bc.Z0))
979
+ a_sig = a*csqrt(1/(2*bc.Z0))
980
+ b_sig = b*csqrt(1/(2*bc.Z0))
961
981
 
962
- return b, a
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,:])))