emerge 1.0.0__tar.gz → 1.0.2__tar.gz

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 (117) hide show
  1. {emerge-1.0.0 → emerge-1.0.2}/.bumpversion.toml +1 -1
  2. {emerge-1.0.0 → emerge-1.0.2}/PKG-INFO +18 -4
  3. {emerge-1.0.0 → emerge-1.0.2}/README.md +15 -3
  4. {emerge-1.0.0 → emerge-1.0.2}/emerge/__init__.py +7 -8
  5. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/elements/femdata.py +4 -3
  6. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/elements/nedelec2.py +8 -4
  7. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/elements/nedleg2.py +6 -2
  8. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/__init__.py +1 -1
  9. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/pcb.py +149 -66
  10. emerge-1.0.2/emerge/_emerge/geo/pcb_tools/dxf.py +361 -0
  11. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/polybased.py +23 -74
  12. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/shapes.py +31 -16
  13. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geometry.py +120 -21
  14. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/mesh3d.py +62 -43
  15. {emerge-1.0.0/emerge/_emerge → emerge-1.0.2/emerge/_emerge/mth}/_cache_check.py +2 -2
  16. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/mth/optimized.py +69 -3
  17. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/periodic.py +19 -17
  18. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/assembly/assembler.py +27 -5
  19. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/assembly/generalized_eigen_hb.py +2 -3
  20. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/assembly/periodicbc.py +0 -1
  21. emerge-1.0.2/emerge/_emerge/physics/microwave/assembly/robin_abc_order2.py +375 -0
  22. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/assembly/robinbc.py +37 -38
  23. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/microwave_3d.py +11 -19
  24. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/microwave_bc.py +38 -21
  25. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/microwave_data.py +3 -26
  26. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/port_functions.py +4 -4
  27. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/plot/pyvista/display.py +13 -2
  28. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/plot/simple_plots.py +4 -1
  29. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/selection.py +12 -9
  30. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/simmodel.py +68 -34
  31. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/solver.py +28 -16
  32. emerge-1.0.2/emerge/beta/dxf.py +1 -0
  33. {emerge-1.0.0 → emerge-1.0.2}/emerge/lib.py +1 -0
  34. emerge-1.0.2/emerge/materials/__init__.py +1 -0
  35. emerge-1.0.2/emerge/materials/isola.py +294 -0
  36. emerge-1.0.2/emerge/materials/rogers.py +58 -0
  37. {emerge-1.0.0 → emerge-1.0.2}/examples/demo10_sgh.py +3 -3
  38. {emerge-1.0.0 → emerge-1.0.2}/examples/demo11_lumped_element_filter.py +1 -1
  39. {emerge-1.0.0 → emerge-1.0.2}/examples/demo12_mode_alignment.py +1 -1
  40. {emerge-1.0.0 → emerge-1.0.2}/examples/demo13_helix_antenna.py +1 -1
  41. {emerge-1.0.0 → emerge-1.0.2}/examples/demo14_boundary_selection.py +1 -1
  42. {emerge-1.0.0 → emerge-1.0.2}/examples/demo1_stepped_imp_filter.py +1 -3
  43. {emerge-1.0.0 → emerge-1.0.2}/examples/demo2_combline_filter.py +1 -1
  44. {emerge-1.0.0 → emerge-1.0.2}/examples/demo3_coupled_line_filter.py +1 -1
  45. {emerge-1.0.0 → emerge-1.0.2}/examples/demo4_patch_antenna.py +1 -1
  46. {emerge-1.0.0 → emerge-1.0.2}/examples/demo5_revolve.py +4 -4
  47. {emerge-1.0.0 → emerge-1.0.2}/examples/demo6_striplines_with_vias.py +1 -1
  48. {emerge-1.0.0 → emerge-1.0.2}/examples/demo7_periodic_cells.py +1 -1
  49. {emerge-1.0.0 → emerge-1.0.2}/examples/demo8_waveguide_bpf_synthesis.py +2 -2
  50. {emerge-1.0.0 → emerge-1.0.2}/examples/demo9_dielectric_resonator.py +1 -1
  51. {emerge-1.0.0 → emerge-1.0.2}/pyproject.toml +5 -1
  52. emerge-1.0.2/src/__init__.py +0 -0
  53. {emerge-1.0.0 → emerge-1.0.2}/uv.lock +64 -2
  54. emerge-1.0.0/emerge/_emerge/physics/microwave/__init__.py +0 -1
  55. {emerge-1.0.0 → emerge-1.0.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  56. {emerge-1.0.0 → emerge-1.0.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  57. {emerge-1.0.0 → emerge-1.0.2}/.gitignore +0 -0
  58. {emerge-1.0.0 → emerge-1.0.2}/.python-version +0 -0
  59. {emerge-1.0.0 → emerge-1.0.2}/LICENSE +0 -0
  60. {emerge-1.0.0 → emerge-1.0.2}/THIRD_PARTY_LICENSES.md +0 -0
  61. {emerge-1.0.0 → emerge-1.0.2}/UMFPACK_Install_windows.md +0 -0
  62. {emerge-1.0.0 → emerge-1.0.2}/UMFPACK_installer_windows.py +0 -0
  63. {emerge-1.0.0 → emerge-1.0.2}/emerge/__main__.py +0 -0
  64. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/__init__.py +0 -0
  65. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/bc.py +0 -0
  66. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/cacherun.py +0 -0
  67. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/const.py +0 -0
  68. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/coord.py +0 -0
  69. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/cs.py +0 -0
  70. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/dataset.py +0 -0
  71. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/elements/__init__.py +0 -0
  72. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/elements/index_interp.py +0 -0
  73. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/elements/ned2_interp.py +0 -0
  74. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/horn.py +0 -0
  75. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/modeler.py +0 -0
  76. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/operations.py +0 -0
  77. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/pcb_tools/calculator.py +0 -0
  78. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/pcb_tools/macro.py +0 -0
  79. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/pmlbox.py +0 -0
  80. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/step.py +0 -0
  81. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo2d.py +0 -0
  82. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/howto.py +0 -0
  83. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/logsettings.py +0 -0
  84. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/material.py +0 -0
  85. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/mesher.py +0 -0
  86. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/mth/common_functions.py +0 -0
  87. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/mth/integrals.py +0 -0
  88. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/mth/pairing.py +0 -0
  89. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/__init__.py +0 -0
  90. {emerge-1.0.0/emerge/_emerge/plot → emerge-1.0.2/emerge/_emerge/physics/microwave}/__init__.py +0 -0
  91. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/adaptive_freq.py +0 -0
  92. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/assembly/curlcurl.py +0 -0
  93. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/assembly/generalized_eigen.py +0 -0
  94. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/periodic.py +0 -0
  95. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/sc.py +0 -0
  96. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/simjob.py +0 -0
  97. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/sparam.py +0 -0
  98. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/touchstone.py +0 -0
  99. {emerge-1.0.0/emerge/_emerge/projects → emerge-1.0.2/emerge/_emerge/plot}/__init__.py +0 -0
  100. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/plot/display.py +0 -0
  101. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/plot/matplotlib/mpldisplay.py +0 -0
  102. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/plot/pyvista/__init__.py +0 -0
  103. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/plot/pyvista/display_settings.py +0 -0
  104. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/plot.py +0 -0
  105. {emerge-1.0.0/src → emerge-1.0.2/emerge/_emerge/projects}/__init__.py +0 -0
  106. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/projects/_gen_base.txt +0 -0
  107. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/projects/_load_base.txt +0 -0
  108. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/projects/generate_project.py +0 -0
  109. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/settings.py +0 -0
  110. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/simulation_data.py +0 -0
  111. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/solve_interfaces/cudss_interface.py +0 -0
  112. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/solve_interfaces/pardiso_interface.py +0 -0
  113. {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/system.py +0 -0
  114. {emerge-1.0.0 → emerge-1.0.2}/emerge/cli.py +0 -0
  115. {emerge-1.0.0 → emerge-1.0.2}/emerge/ext.py +0 -0
  116. {emerge-1.0.0 → emerge-1.0.2}/emerge/plot.py +0 -0
  117. {emerge-1.0.0 → emerge-1.0.2}/emerge/pyvista.py +0 -0
@@ -1,5 +1,5 @@
1
1
  [tool.bumpversion]
2
- current_version = "1.0.0"
2
+ current_version = "1.0.2"
3
3
  parse = "(?P<major>\\d+)\\.(?P<minor>\\d+)\\.(?P<patch>\\d+)"
4
4
  serialize = ["{major}.{minor}.{patch}"]
5
5
  search = "{current_version}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: emerge
3
- Version: 1.0.0
3
+ Version: 1.0.2
4
4
  Summary: An open source EM FEM simulator in Python
5
5
  Project-URL: Homepage, https://github.com/FennisRobert/EMerge
6
6
  Project-URL: Issues, https://github.com/FennisRobert/EMerge/issues
@@ -20,6 +20,8 @@ Provides-Extra: cudss
20
20
  Requires-Dist: cupy-cuda12x; extra == 'cudss'
21
21
  Requires-Dist: nvidia-cudss-cu12; extra == 'cudss'
22
22
  Requires-Dist: nvmath-python[cu12]; extra == 'cudss'
23
+ Provides-Extra: dxf
24
+ Requires-Dist: ezdxf; extra == 'dxf'
23
25
  Provides-Extra: umfpack
24
26
  Requires-Dist: scikit-umfpack; (sys_platform != 'win32') and extra == 'umfpack'
25
27
  Description-Content-Type: text/markdown
@@ -42,8 +44,17 @@ pip install emerge
42
44
  On MacOS and Linux you can install it with the very fast UMFPACK through scikit-umfpack
43
45
 
44
46
  ```
45
- brew install swig suite-sparse #MacOS
47
+ brew install cmake swig suite-sparse #MacOS
46
48
  sudo apt-get install libsuitesparse-dev #Linux
49
+ ```
50
+ Then on MacOS do:
51
+ ```
52
+ export PKG_CONFIG_PATH="/opt/homebrew/lib/pkgconfig:$PKG_CONFIG_PATH"
53
+ export CFLAGS="-I/opt/homebrew/include"
54
+ export LDFLAGS="-L/opt/homebrew/lib"
55
+ ```
56
+ Finally:
57
+ ```
47
58
  pip install emerge[umfpack]
48
59
  ```
49
60
 
@@ -53,11 +64,13 @@ If you have a new NVidia card you can try the first test implementation of the c
53
64
  ```
54
65
  pip install emerge[cudss]
55
66
  ```
56
- The `scikit-umfpack` solver can be installed on Windows as well from binaries with conda. This is a bit more complicated and is described in the installation guide.
67
+ The `scikit-umfpack` solver can be installed on Windows as well from binaries with conda. This is a bit more complicated and is described in the installation guide which can be downloaded from the official website:
68
+
69
+ https://www.emerge-software.com/resources
57
70
 
58
71
  ## Compatibility
59
72
 
60
- As far as I know, the library should work on all systems. PyPARDISO is not supported on ARM but the current SuperLU and UMFPACK solvers work on ARM as well. Both SuperLU and UMFPACK can run on multi-processing implementations as long as you do entry-point protection:
73
+ As far as I know, the library should work on all systems. PARDISO is not supported on ARM but the current SuperLU and UMFPACK solvers work on ARM as well. Both SuperLU and UMFPACK can run on multi-processing implementations as long as you do entry-point protection:
61
74
  ```
62
75
  import emerge as em
63
76
 
@@ -88,6 +101,7 @@ To run this FEM library you need the following libraries
88
101
  Optional:
89
102
  - scikit-umfpack
90
103
  - cudss
104
+ - ezdxf
91
105
 
92
106
  ## Resources / Manual
93
107
 
@@ -16,8 +16,17 @@ pip install emerge
16
16
  On MacOS and Linux you can install it with the very fast UMFPACK through scikit-umfpack
17
17
 
18
18
  ```
19
- brew install swig suite-sparse #MacOS
19
+ brew install cmake swig suite-sparse #MacOS
20
20
  sudo apt-get install libsuitesparse-dev #Linux
21
+ ```
22
+ Then on MacOS do:
23
+ ```
24
+ export PKG_CONFIG_PATH="/opt/homebrew/lib/pkgconfig:$PKG_CONFIG_PATH"
25
+ export CFLAGS="-I/opt/homebrew/include"
26
+ export LDFLAGS="-L/opt/homebrew/lib"
27
+ ```
28
+ Finally:
29
+ ```
21
30
  pip install emerge[umfpack]
22
31
  ```
23
32
 
@@ -27,11 +36,13 @@ If you have a new NVidia card you can try the first test implementation of the c
27
36
  ```
28
37
  pip install emerge[cudss]
29
38
  ```
30
- The `scikit-umfpack` solver can be installed on Windows as well from binaries with conda. This is a bit more complicated and is described in the installation guide.
39
+ The `scikit-umfpack` solver can be installed on Windows as well from binaries with conda. This is a bit more complicated and is described in the installation guide which can be downloaded from the official website:
40
+
41
+ https://www.emerge-software.com/resources
31
42
 
32
43
  ## Compatibility
33
44
 
34
- As far as I know, the library should work on all systems. PyPARDISO is not supported on ARM but the current SuperLU and UMFPACK solvers work on ARM as well. Both SuperLU and UMFPACK can run on multi-processing implementations as long as you do entry-point protection:
45
+ As far as I know, the library should work on all systems. PARDISO is not supported on ARM but the current SuperLU and UMFPACK solvers work on ARM as well. Both SuperLU and UMFPACK can run on multi-processing implementations as long as you do entry-point protection:
35
46
  ```
36
47
  import emerge as em
37
48
 
@@ -62,6 +73,7 @@ To run this FEM library you need the following libraries
62
73
  Optional:
63
74
  - scikit-umfpack
64
75
  - cudss
76
+ - ezdxf
65
77
 
66
78
  ## Resources / Manual
67
79
 
@@ -18,7 +18,7 @@ along with this program; if not, see
18
18
  """
19
19
  import os
20
20
 
21
- __version__ = "1.0.0"
21
+ __version__ = "1.0.2"
22
22
 
23
23
  ############################################################
24
24
  # HANDLE ENVIRONMENT VARIABLES #
@@ -27,17 +27,16 @@ __version__ = "1.0.0"
27
27
  NTHREADS = "1"
28
28
  os.environ["EMERGE_STD_LOGLEVEL"] = os.getenv("EMERGE_STD_LOGLEVEL", default="INFO")
29
29
  os.environ["EMERGE_FILE_LOGLEVEL"] = os.getenv("EMERGE_FILE_LOGLEVEL", default="DEBUG")
30
- os.environ["OMP_NUM_THREADS"] = os.getenv("OMP_NUM_THREADS", default="4")
30
+ os.environ["OMP_NUM_THREADS"] = os.getenv("OMP_NUM_THREADS", default="1")
31
31
  os.environ["MKL_NUM_THREADS"] = os.getenv("MKL_NUM_THREADS", default="4")
32
32
  os.environ["OPENBLAS_NUM_THREADS"] = NTHREADS
33
33
  os.environ["VECLIB_MAXIMUM_THREADS"] = NTHREADS
34
34
  os.environ["NUMEXPR_NUM_THREADS"] = NTHREADS
35
35
 
36
-
37
36
  ############################################################
38
37
  # IMPORT MODULES #
39
38
  ############################################################
40
- from ._emerge import _cache_check
39
+
41
40
  from ._emerge.logsettings import LOG_CONTROLLER
42
41
  from loguru import logger
43
42
 
@@ -54,8 +53,7 @@ from ._emerge.coord import Line
54
53
  from ._emerge import geo
55
54
  from ._emerge.selection import Selection, FaceSelection, DomainSelection, EdgeSelection
56
55
  from ._emerge.geometry import select
57
- from ._emerge.mth.common_functions import norm, coax_rout, coax_rin
58
- from ._emerge.physics.microwave.sc import stratton_chu
56
+ #from ._emerge.mth.common_functions import norm, coax_rout, coax_rin
59
57
  from ._emerge.periodic import RectCell, HexCell
60
58
  from ._emerge.mesher import Algorithm2D, Algorithm3D
61
59
  from . import lib
@@ -65,10 +63,11 @@ howto = _HowtoClass()
65
63
 
66
64
  logger.debug('Importing complete!')
67
65
 
68
-
69
66
  ############################################################
70
67
  # CONSTANTS #
71
68
  ############################################################
72
69
 
73
70
  CENTER = geo.Alignment.CENTER
74
- CORNER = geo.Alignment.CORNER
71
+ CORNER = geo.Alignment.CORNER
72
+ EISO = lib.EISO
73
+ EOMNI = lib.EOMNI
@@ -19,9 +19,7 @@ from __future__ import annotations
19
19
  from ..mesh3d import Mesh3D
20
20
  import numpy as np
21
21
  from typing import Callable
22
- from scipy.sparse import csr_matrix # type: ignore
23
22
 
24
- from ..mth.optimized import matmul
25
23
 
26
24
  class FEMBasis:
27
25
 
@@ -48,6 +46,8 @@ class FEMBasis:
48
46
 
49
47
  def interpolate_Ef(self, field: np.ndarray, basis: np.ndarray | None = None, origin: np.ndarray | None = None, tetids: np.ndarray | None = None) -> Callable:
50
48
  '''Generates the Interpolation function as a function object for a given coordiante basis and origin.'''
49
+ from ..mth.optimized import matmul
50
+
51
51
  if basis is None:
52
52
  basis = np.eye(3)
53
53
 
@@ -124,7 +124,8 @@ class FEMBasis:
124
124
  N = self.n_tri_dofs**2
125
125
  return slice(itri*N,(itri+1)*N)
126
126
 
127
- def generate_csr(self, data: np.ndarray) -> csr_matrix:
127
+ def generate_csr(self, data: np.ndarray):
128
+ from scipy.sparse import csr_matrix # type: ignore
128
129
  ids = np.argwhere(data!=0)[:,0]
129
130
  return csr_matrix((data[ids], (self._rows[ids], self._cols[ids])), shape=(self.n_field, self.n_field))
130
131
  ### QUANTITIES
@@ -19,9 +19,6 @@ from __future__ import annotations
19
19
  import numpy as np
20
20
  from ..mesh3d import Mesh3D
21
21
  from .femdata import FEMBasis
22
- from .ned2_interp import ned2_tet_interp, ned2_tet_interp_curl
23
- from ..mth.optimized import local_mapping
24
- from .index_interp import index_interp
25
22
 
26
23
  ############### Nedelec2 Class
27
24
 
@@ -72,6 +69,7 @@ class Nedelec2(FEMBasis):
72
69
  '''
73
70
  Interpolate the provided field data array at the given xs, ys and zs coordinates
74
71
  '''
72
+ from .ned2_interp import ned2_tet_interp
75
73
  if tetids is None:
76
74
  tetids = self._all_tet_ids
77
75
  vals = ned2_tet_interp(np.array([xs, ys, zs]), field, self.mesh.tets, self.mesh.tris, self.mesh.edges, self.mesh.nodes, self.tet_to_field, tetids)
@@ -83,8 +81,11 @@ class Nedelec2(FEMBasis):
83
81
  """
84
82
  Interpolates the curl of the field at the given points.
85
83
  """
84
+ from .ned2_interp import ned2_tet_interp_curl
85
+
86
86
  if tetids is None:
87
87
  tetids = self._all_tet_ids
88
+
88
89
  vals = ned2_tet_interp_curl(np.array([xs, ys, zs]), field, self.mesh.tets, self.mesh.tris, self.mesh.edges, self.mesh.nodes, self.tet_to_field, c, tetids)
89
90
  if not usenan:
90
91
  vals = np.nan_to_num(vals)
@@ -97,7 +98,7 @@ class Nedelec2(FEMBasis):
97
98
  usenan: bool = True) -> np.ndarray:
98
99
  if tetids is None:
99
100
  tetids = self._all_tet_ids
100
-
101
+ from .index_interp import index_interp
101
102
  vals = index_interp(np.array([xs, ys, zs]), self.mesh.tets, self.mesh.nodes, tetids)
102
103
  if not usenan:
103
104
  vals[vals==-1]==0
@@ -106,15 +107,18 @@ class Nedelec2(FEMBasis):
106
107
  ###### INDEX MAPPINGS
107
108
 
108
109
  def local_tet_to_triid(self, itet: int) -> np.ndarray:
110
+ from ..mth.optimized import local_mapping
109
111
  tri_ids = self.tet_to_field[6:10, itet] - self.n_edges
110
112
  global_tri_map = self.mesh.tris[:, tri_ids]
111
113
  return local_mapping(self.mesh.tets[:, itet], global_tri_map)
112
114
 
113
115
  def local_tet_to_edgeid(self, itet: int) -> np.ndarray:
116
+ from ..mth.optimized import local_mapping
114
117
  global_edge_map = self.mesh.edges[:, self.tet_to_field[:6,itet]]
115
118
  return local_mapping(self.mesh.tets[:, itet], global_edge_map)
116
119
 
117
120
  def local_tri_to_edgeid(self, itri: int) -> np.ndarray:
121
+ from ..mth.optimized import local_mapping
118
122
  global_edge_map = self.mesh.edges[:, self.tri_to_field[:3,itri]]
119
123
  return local_mapping(self.mesh.tris[:, itri], global_edge_map)
120
124
 
@@ -19,8 +19,6 @@ from __future__ import annotations
19
19
  import numpy as np
20
20
  from ..mesh3d import SurfaceMesh
21
21
  from .femdata import FEMBasis
22
- from .ned2_interp import ned2_tri_interp_full, ned2_tri_interp_curl
23
- from ..mth.optimized import matinv
24
22
  from ..cs import CoordinateSystem
25
23
  from ..const import MU0, C0
26
24
 
@@ -74,6 +72,8 @@ class FieldFunctionClass:
74
72
  return np.array([Fx, Fy, Fz])*self.constant
75
73
 
76
74
  def calcE(self, xs: np.ndarray, ys: np.ndarray, usenan: bool = False) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
75
+ from .ned2_interp import ned2_tri_interp_full
76
+
77
77
  coordinates = np.array([xs, ys])
78
78
  vals = ned2_tri_interp_full(coordinates,
79
79
  self.field,
@@ -85,6 +85,7 @@ class FieldFunctionClass:
85
85
  return vals
86
86
 
87
87
  def calcH(self, xs: np.ndarray, ys: np.ndarray, usenan: bool = False) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
88
+ from .ned2_interp import ned2_tri_interp_curl
88
89
  coordinates = np.array([xs, ys])
89
90
 
90
91
  vals = ned2_tri_interp_curl(coordinates,
@@ -176,6 +177,7 @@ class NedelecLegrange2(FEMBasis):
176
177
 
177
178
  def interpolate_Hf(self, field: np.ndarray, k0: float, ur: np.ndarray, beta: float) -> FieldFunctionClass:
178
179
  '''Generates the Interpolation function as a function object for a given coordiante basis and origin.'''
180
+ from ..mth.optimized import matinv
179
181
  constant = 1j / ((k0*C0)*MU0)
180
182
  urinv = np.zeros_like(ur)
181
183
 
@@ -185,6 +187,7 @@ class NedelecLegrange2(FEMBasis):
185
187
  return FieldFunctionClass(field, self.cs, self.local_nodes, self.mesh.tris, self.tri_to_field, 'H', urinv, beta, constant)
186
188
 
187
189
  def tri_interpolate(self, field, xs: np.ndarray, ys: np.ndarray, usenan: bool = False) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
190
+ from .ned2_interp import ned2_tri_interp_full
188
191
  coordinates = np.array([xs, ys])
189
192
  vals = ned2_tri_interp_full(coordinates,
190
193
  field,
@@ -196,6 +199,7 @@ class NedelecLegrange2(FEMBasis):
196
199
  return vals
197
200
 
198
201
  def tri_interpolate_curl(self, field, xs: np.ndarray, ys: np.ndarray, diadic: np.ndarray | None = None, beta: float = 0.0, usenan: bool = False) -> tuple[np.ndarray, np.ndarray, np.ndarray]:
202
+ from .ned2_interp import ned2_tri_interp_curl
199
203
  coordinates = np.array([xs, ys])
200
204
  if diadic is None:
201
205
  diadic = np.eye(3)[:,:,np.newaxis()] * np.ones((self.mesh.n_tris)) # type: ignore
@@ -15,7 +15,7 @@
15
15
  # along with this program; if not, see
16
16
  # <https://www.gnu.org/licenses/>.
17
17
 
18
- from .pcb import PCB
18
+ from .pcb import PCB, PCBLayer
19
19
  from .pmlbox import pmlbox
20
20
  from .horn import Horn
21
21
  from .shapes import Cylinder, CoaxCylinder, Box, XYPlate, HalfSphere, Sphere, Plate, OldBox, Alignment, Cone