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.
- {emerge-1.0.0 → emerge-1.0.2}/.bumpversion.toml +1 -1
- {emerge-1.0.0 → emerge-1.0.2}/PKG-INFO +18 -4
- {emerge-1.0.0 → emerge-1.0.2}/README.md +15 -3
- {emerge-1.0.0 → emerge-1.0.2}/emerge/__init__.py +7 -8
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/elements/femdata.py +4 -3
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/elements/nedelec2.py +8 -4
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/elements/nedleg2.py +6 -2
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/__init__.py +1 -1
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/pcb.py +149 -66
- emerge-1.0.2/emerge/_emerge/geo/pcb_tools/dxf.py +361 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/polybased.py +23 -74
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/shapes.py +31 -16
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geometry.py +120 -21
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/mesh3d.py +62 -43
- {emerge-1.0.0/emerge/_emerge → emerge-1.0.2/emerge/_emerge/mth}/_cache_check.py +2 -2
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/mth/optimized.py +69 -3
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/periodic.py +19 -17
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/assembly/assembler.py +27 -5
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/assembly/generalized_eigen_hb.py +2 -3
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/assembly/periodicbc.py +0 -1
- emerge-1.0.2/emerge/_emerge/physics/microwave/assembly/robin_abc_order2.py +375 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/assembly/robinbc.py +37 -38
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/microwave_3d.py +11 -19
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/microwave_bc.py +38 -21
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/microwave_data.py +3 -26
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/port_functions.py +4 -4
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/plot/pyvista/display.py +13 -2
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/plot/simple_plots.py +4 -1
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/selection.py +12 -9
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/simmodel.py +68 -34
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/solver.py +28 -16
- emerge-1.0.2/emerge/beta/dxf.py +1 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/lib.py +1 -0
- emerge-1.0.2/emerge/materials/__init__.py +1 -0
- emerge-1.0.2/emerge/materials/isola.py +294 -0
- emerge-1.0.2/emerge/materials/rogers.py +58 -0
- {emerge-1.0.0 → emerge-1.0.2}/examples/demo10_sgh.py +3 -3
- {emerge-1.0.0 → emerge-1.0.2}/examples/demo11_lumped_element_filter.py +1 -1
- {emerge-1.0.0 → emerge-1.0.2}/examples/demo12_mode_alignment.py +1 -1
- {emerge-1.0.0 → emerge-1.0.2}/examples/demo13_helix_antenna.py +1 -1
- {emerge-1.0.0 → emerge-1.0.2}/examples/demo14_boundary_selection.py +1 -1
- {emerge-1.0.0 → emerge-1.0.2}/examples/demo1_stepped_imp_filter.py +1 -3
- {emerge-1.0.0 → emerge-1.0.2}/examples/demo2_combline_filter.py +1 -1
- {emerge-1.0.0 → emerge-1.0.2}/examples/demo3_coupled_line_filter.py +1 -1
- {emerge-1.0.0 → emerge-1.0.2}/examples/demo4_patch_antenna.py +1 -1
- {emerge-1.0.0 → emerge-1.0.2}/examples/demo5_revolve.py +4 -4
- {emerge-1.0.0 → emerge-1.0.2}/examples/demo6_striplines_with_vias.py +1 -1
- {emerge-1.0.0 → emerge-1.0.2}/examples/demo7_periodic_cells.py +1 -1
- {emerge-1.0.0 → emerge-1.0.2}/examples/demo8_waveguide_bpf_synthesis.py +2 -2
- {emerge-1.0.0 → emerge-1.0.2}/examples/demo9_dielectric_resonator.py +1 -1
- {emerge-1.0.0 → emerge-1.0.2}/pyproject.toml +5 -1
- emerge-1.0.2/src/__init__.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/uv.lock +64 -2
- emerge-1.0.0/emerge/_emerge/physics/microwave/__init__.py +0 -1
- {emerge-1.0.0 → emerge-1.0.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/.gitignore +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/.python-version +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/LICENSE +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/THIRD_PARTY_LICENSES.md +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/UMFPACK_Install_windows.md +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/UMFPACK_installer_windows.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/__main__.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/__init__.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/bc.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/cacherun.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/const.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/coord.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/cs.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/dataset.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/elements/__init__.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/elements/index_interp.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/elements/ned2_interp.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/horn.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/modeler.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/operations.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/pcb_tools/calculator.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/pcb_tools/macro.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/pmlbox.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo/step.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/geo2d.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/howto.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/logsettings.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/material.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/mesher.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/mth/common_functions.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/mth/integrals.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/mth/pairing.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/__init__.py +0 -0
- {emerge-1.0.0/emerge/_emerge/plot → emerge-1.0.2/emerge/_emerge/physics/microwave}/__init__.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/adaptive_freq.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/assembly/curlcurl.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/assembly/generalized_eigen.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/periodic.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/sc.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/simjob.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/sparam.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/physics/microwave/touchstone.py +0 -0
- {emerge-1.0.0/emerge/_emerge/projects → emerge-1.0.2/emerge/_emerge/plot}/__init__.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/plot/display.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/plot/matplotlib/mpldisplay.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/plot/pyvista/__init__.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/plot/pyvista/display_settings.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/plot.py +0 -0
- {emerge-1.0.0/src → emerge-1.0.2/emerge/_emerge/projects}/__init__.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/projects/_gen_base.txt +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/projects/_load_base.txt +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/projects/generate_project.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/settings.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/simulation_data.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/solve_interfaces/cudss_interface.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/solve_interfaces/pardiso_interface.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/_emerge/system.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/cli.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/ext.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/plot.py +0 -0
- {emerge-1.0.0 → emerge-1.0.2}/emerge/pyvista.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: emerge
|
|
3
|
-
Version: 1.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.
|
|
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.
|
|
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.
|
|
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="
|
|
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
|
-
|
|
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)
|
|
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
|