pyvale 2025.4.1__py3-none-any.whl → 2025.5.1__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 pyvale might be problematic. Click here for more details.
- pyvale/__init__.py +18 -3
- pyvale/analyticmeshgen.py +1 -0
- pyvale/analyticsimdatafactory.py +18 -13
- pyvale/analyticsimdatagenerator.py +105 -72
- pyvale/blendercalibrationdata.py +15 -0
- pyvale/blenderlightdata.py +26 -0
- pyvale/blendermaterialdata.py +15 -0
- pyvale/blenderrenderdata.py +30 -0
- pyvale/blenderscene.py +488 -0
- pyvale/blendertools.py +420 -0
- pyvale/camera.py +6 -5
- pyvale/cameradata.py +25 -7
- pyvale/cameradata2d.py +6 -4
- pyvale/camerastereo.py +217 -0
- pyvale/cameratools.py +206 -11
- pyvale/cython/rastercyth.py +6 -2
- pyvale/data/cal_target.tiff +0 -0
- pyvale/dataset.py +73 -14
- pyvale/errorcalculator.py +8 -10
- pyvale/errordriftcalc.py +10 -9
- pyvale/errorintegrator.py +19 -21
- pyvale/errorrand.py +33 -39
- pyvale/errorsyscalib.py +134 -0
- pyvale/errorsysdep.py +19 -22
- pyvale/errorsysfield.py +49 -41
- pyvale/errorsysindep.py +79 -175
- pyvale/examples/basics/ex1_1_basicscalars_therm2d.py +131 -0
- pyvale/examples/basics/ex1_2_sensormodel_therm2d.py +158 -0
- pyvale/examples/basics/ex1_3_customsens_therm3d.py +216 -0
- pyvale/examples/basics/ex1_4_basicerrors_therm3d.py +153 -0
- pyvale/examples/basics/ex1_5_fielderrs_therm3d.py +168 -0
- pyvale/examples/basics/ex1_6_caliberrs_therm2d.py +133 -0
- pyvale/examples/basics/ex1_7_spatavg_therm2d.py +123 -0
- pyvale/examples/basics/ex2_1_basicvectors_disp2d.py +112 -0
- pyvale/examples/basics/ex2_2_vectorsens_disp2d.py +111 -0
- pyvale/examples/basics/ex2_3_sensangle_disp2d.py +139 -0
- pyvale/examples/basics/ex2_4_chainfielderrs_disp2d.py +196 -0
- pyvale/examples/basics/ex2_5_vectorfields3d_disp3d.py +109 -0
- pyvale/examples/basics/ex3_1_basictensors_strain2d.py +114 -0
- pyvale/examples/basics/ex3_2_tensorsens2d_strain2d.py +111 -0
- pyvale/examples/basics/ex3_3_tensorsens3d_strain3d.py +182 -0
- pyvale/examples/basics/ex4_1_expsim2d_thermmech2d.py +171 -0
- pyvale/examples/basics/ex4_2_expsim3d_thermmech3d.py +252 -0
- pyvale/examples/{analyticdatagen → genanalyticdata}/ex1_1_scalarvisualisation.py +6 -9
- pyvale/examples/{analyticdatagen → genanalyticdata}/ex1_2_scalarcasebuild.py +8 -11
- pyvale/examples/{analyticdatagen → genanalyticdata}/ex2_1_analyticsensors.py +9 -12
- pyvale/examples/imagedef2d/ex_imagedef2d_todisk.py +8 -15
- pyvale/examples/renderblender/ex1_1_blenderscene.py +121 -0
- pyvale/examples/renderblender/ex1_2_blenderdeformed.py +119 -0
- pyvale/examples/renderblender/ex2_1_stereoscene.py +128 -0
- pyvale/examples/renderblender/ex2_2_stereodeformed.py +131 -0
- pyvale/examples/renderblender/ex3_1_blendercalibration.py +120 -0
- pyvale/examples/{rasterisation → renderrasterisation}/ex_rastenp.py +3 -2
- pyvale/examples/{rasterisation → renderrasterisation}/ex_rastercyth_oneframe.py +2 -2
- pyvale/examples/{rasterisation → renderrasterisation}/ex_rastercyth_static_cypara.py +3 -8
- pyvale/examples/{rasterisation → renderrasterisation}/ex_rastercyth_static_pypara.py +6 -7
- pyvale/examples/{ex1_4_thermal2d.py → visualisation/ex1_1_plot_traces.py} +32 -16
- pyvale/examples/{features/ex_animation_tools_3dmonoblock.py → visualisation/ex2_1_animate_sim.py} +37 -31
- pyvale/experimentsimulator.py +107 -30
- pyvale/field.py +2 -9
- pyvale/fieldconverter.py +98 -22
- pyvale/fieldsampler.py +2 -2
- pyvale/fieldscalar.py +10 -10
- pyvale/fieldtensor.py +15 -17
- pyvale/fieldtransform.py +7 -2
- pyvale/fieldvector.py +6 -7
- pyvale/generatorsrandom.py +25 -47
- pyvale/imagedef2d.py +6 -2
- pyvale/integratorfactory.py +2 -2
- pyvale/integratorquadrature.py +50 -24
- pyvale/integratorrectangle.py +85 -7
- pyvale/integratorspatial.py +4 -4
- pyvale/integratortype.py +3 -3
- pyvale/output.py +17 -0
- pyvale/pyvaleexceptions.py +11 -0
- pyvale/raster.py +6 -5
- pyvale/rastercy.py +6 -4
- pyvale/rasternp.py +6 -4
- pyvale/rendermesh.py +6 -2
- pyvale/sensorarray.py +2 -2
- pyvale/sensorarrayfactory.py +52 -65
- pyvale/sensorarraypoint.py +29 -30
- pyvale/sensordata.py +2 -2
- pyvale/sensordescriptor.py +138 -25
- pyvale/sensortools.py +3 -3
- pyvale/simtools.py +67 -0
- pyvale/visualexpplotter.py +99 -57
- pyvale/visualimagedef.py +11 -7
- pyvale/visualimages.py +6 -4
- pyvale/visualopts.py +372 -58
- pyvale/visualsimanimator.py +42 -13
- pyvale/visualsimsensors.py +318 -0
- pyvale/visualtools.py +69 -13
- pyvale/visualtraceplotter.py +52 -165
- {pyvale-2025.4.1.dist-info → pyvale-2025.5.1.dist-info}/METADATA +17 -14
- pyvale-2025.5.1.dist-info/RECORD +172 -0
- {pyvale-2025.4.1.dist-info → pyvale-2025.5.1.dist-info}/WHEEL +1 -1
- pyvale/examples/analyticdatagen/__init__.py +0 -5
- pyvale/examples/ex1_1_thermal2d.py +0 -86
- pyvale/examples/ex1_2_thermal2d.py +0 -108
- pyvale/examples/ex1_3_thermal2d.py +0 -110
- pyvale/examples/ex1_5_thermal2d.py +0 -102
- pyvale/examples/ex2_1_thermal3d .py +0 -84
- pyvale/examples/ex2_2_thermal3d.py +0 -51
- pyvale/examples/ex2_3_thermal3d.py +0 -106
- pyvale/examples/ex3_1_displacement2d.py +0 -44
- pyvale/examples/ex3_2_displacement2d.py +0 -76
- pyvale/examples/ex3_3_displacement2d.py +0 -101
- pyvale/examples/ex3_4_displacement2d.py +0 -102
- pyvale/examples/ex4_1_strain2d.py +0 -54
- pyvale/examples/ex4_2_strain2d.py +0 -76
- pyvale/examples/ex4_3_strain2d.py +0 -97
- pyvale/examples/ex5_1_multiphysics2d.py +0 -75
- pyvale/examples/ex6_1_multiphysics2d_expsim.py +0 -115
- pyvale/examples/ex6_2_multiphysics3d_expsim.py +0 -160
- pyvale/examples/features/__init__.py +0 -5
- pyvale/examples/features/ex_area_avg.py +0 -89
- pyvale/examples/features/ex_calibration_error.py +0 -108
- pyvale/examples/features/ex_chain_field_errs.py +0 -141
- pyvale/examples/features/ex_field_errs.py +0 -78
- pyvale/examples/features/ex_sensor_single_angle_batch.py +0 -110
- pyvale/optimcheckfuncs.py +0 -153
- pyvale/visualsimplotter.py +0 -182
- pyvale-2025.4.1.dist-info/RECORD +0 -163
- {pyvale-2025.4.1.dist-info → pyvale-2025.5.1.dist-info}/licenses/LICENSE +0 -0
- {pyvale-2025.4.1.dist-info → pyvale-2025.5.1.dist-info}/top_level.txt +0 -0
pyvale/integratorquadrature.py
CHANGED
|
@@ -1,17 +1,16 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ==============================================================================
|
|
2
2
|
# pyvale: the python validation engine
|
|
3
3
|
# License: MIT
|
|
4
4
|
# Copyright (C) 2025 The Computer Aided Validation Team
|
|
5
|
-
#
|
|
5
|
+
# ==============================================================================
|
|
6
6
|
|
|
7
7
|
from typing import Callable
|
|
8
8
|
import numpy as np
|
|
9
9
|
from pyvale.field import IField
|
|
10
10
|
from pyvale.integratorspatial import (IIntegratorSpatial,
|
|
11
|
-
|
|
11
|
+
create_int_pt_array)
|
|
12
12
|
from pyvale.sensordata import SensorData
|
|
13
13
|
|
|
14
|
-
#TODO: Docstrings
|
|
15
14
|
|
|
16
15
|
class Quadrature2D(IIntegratorSpatial):
|
|
17
16
|
"""Gaussian quadrature numerical integrator for spatial averaging in 2D.
|
|
@@ -23,7 +22,7 @@ class Quadrature2D(IIntegratorSpatial):
|
|
|
23
22
|
Implements the `IIntegratorSpatial` interface allowing for interoperability
|
|
24
23
|
of different spatial integration algorithms for modelling sensor averaging.
|
|
25
24
|
"""
|
|
26
|
-
__slots__ = ("_field","_area","
|
|
25
|
+
__slots__ = ("_field","_area","_gauss_pts_num","_gauss_pt_offsets"
|
|
27
26
|
,"_gauss_weight_func","_gauss_pts","_averages","_sens_data")
|
|
28
27
|
|
|
29
28
|
def __init__(self,
|
|
@@ -31,8 +30,7 @@ class Quadrature2D(IIntegratorSpatial):
|
|
|
31
30
|
sens_data: SensorData,
|
|
32
31
|
gauss_pt_offsets: np.ndarray,
|
|
33
32
|
gauss_weight_func: Callable) -> None:
|
|
34
|
-
"""
|
|
35
|
-
|
|
33
|
+
"""
|
|
36
34
|
Parameters
|
|
37
35
|
----------
|
|
38
36
|
field : IField
|
|
@@ -57,7 +55,7 @@ class Quadrature2D(IIntegratorSpatial):
|
|
|
57
55
|
self._area = self._sens_data.spatial_dims[0] * \
|
|
58
56
|
self._sens_data.spatial_dims[1]
|
|
59
57
|
|
|
60
|
-
self.
|
|
58
|
+
self._gauss_pts_num = gauss_pt_offsets.shape[0]
|
|
61
59
|
self._gauss_pt_offsets = gauss_pt_offsets
|
|
62
60
|
self._gauss_weight_func = gauss_weight_func
|
|
63
61
|
|
|
@@ -66,43 +64,61 @@ class Quadrature2D(IIntegratorSpatial):
|
|
|
66
64
|
self._averages = None
|
|
67
65
|
|
|
68
66
|
def calc_integrals(self, sens_data: SensorData | None = None) -> np.ndarray:
|
|
69
|
-
"""
|
|
67
|
+
"""Calculates the numerical integrals for each sensor based on the
|
|
68
|
+
specified sensor data and numerical integration options (i.e. geometry
|
|
69
|
+
and integration points).
|
|
70
70
|
|
|
71
71
|
Parameters
|
|
72
72
|
----------
|
|
73
73
|
sens_data : SensorData | None, optional
|
|
74
|
-
|
|
74
|
+
Specifies the sensor parameters used to calculate the averages, by
|
|
75
|
+
default None. Is a sensor data object is passed a reference to that
|
|
76
|
+
object is stored by this class and used in later calculations. If
|
|
77
|
+
None then it uses the SensorData object stored by this class.
|
|
78
|
+
Defaults to None.
|
|
75
79
|
|
|
76
80
|
Returns
|
|
77
81
|
-------
|
|
78
82
|
np.ndarray
|
|
79
|
-
|
|
83
|
+
Array of virtual sensor integrals with shape=(n_sensors,n_comps,
|
|
84
|
+
n_timsteps). Note this is consistent with pyvales measurement array.
|
|
80
85
|
"""
|
|
81
86
|
self._averages = self.calc_averages(sens_data)
|
|
82
87
|
return self._area*self.get_averages()
|
|
83
88
|
|
|
84
89
|
def get_integrals(self) -> np.ndarray:
|
|
85
|
-
"""
|
|
90
|
+
"""Gets the most recent calculation of the spatial averages for all
|
|
91
|
+
sensors in the sensor array without performing any new interpolation. If
|
|
92
|
+
the averages have not been calculated they are first calculated and then
|
|
93
|
+
returned.
|
|
86
94
|
|
|
87
95
|
Returns
|
|
88
96
|
-------
|
|
89
97
|
np.ndarray
|
|
90
|
-
|
|
98
|
+
Array of virtual sensor averages with shape=(n_sensors,n_comps,
|
|
99
|
+
n_timsteps). Note this is consistent with pyvales measurement array.
|
|
91
100
|
"""
|
|
92
101
|
return self._area*self.get_averages()
|
|
93
102
|
|
|
94
103
|
def calc_averages(self, sens_data: SensorData | None = None) -> np.ndarray:
|
|
95
|
-
"""
|
|
104
|
+
"""Calculates the spatial averages for each sensor based on the
|
|
105
|
+
specified sensor data and numerical integration options (i.e. geometry
|
|
106
|
+
and integration points).
|
|
96
107
|
|
|
97
108
|
Parameters
|
|
98
109
|
----------
|
|
99
110
|
sens_data : SensorData | None, optional
|
|
100
|
-
|
|
111
|
+
Specifies the sensor parameters used to calculate the averages, by
|
|
112
|
+
default None. Is a sensor data object is passed a reference to that
|
|
113
|
+
object is stored by this class and used in later calculations. If
|
|
114
|
+
None then it uses the SensorData object stored by this class.
|
|
115
|
+
Defaults to None.
|
|
101
116
|
|
|
102
117
|
Returns
|
|
103
118
|
-------
|
|
104
119
|
np.ndarray
|
|
105
|
-
|
|
120
|
+
Array of virtual sensor averages with shape=(n_sensors,n_comps,
|
|
121
|
+
n_timsteps). Note this is consistent with pyvales measurement array.
|
|
106
122
|
"""
|
|
107
123
|
if sens_data is not None:
|
|
108
124
|
self._sens_data = sens_data
|
|
@@ -121,7 +137,7 @@ class Quadrature2D(IIntegratorSpatial):
|
|
|
121
137
|
gauss_vals.shape[2])
|
|
122
138
|
|
|
123
139
|
# shape=(n_gauss_pts,n_sens,n_comps,n_timesteps)
|
|
124
|
-
gauss_vals = gauss_vals.reshape((self.
|
|
140
|
+
gauss_vals = gauss_vals.reshape((self._gauss_pts_num,)+meas_shape,
|
|
125
141
|
order='F')
|
|
126
142
|
|
|
127
143
|
# shape=(n_gauss_pts,n_sens,n_comps,n_timesteps)
|
|
@@ -138,12 +154,16 @@ class Quadrature2D(IIntegratorSpatial):
|
|
|
138
154
|
return self._averages
|
|
139
155
|
|
|
140
156
|
def get_averages(self) -> np.ndarray:
|
|
141
|
-
"""
|
|
157
|
+
"""Gets the most recent calculation of the spatial averages for all
|
|
158
|
+
sensors in the sensor array without performing any new interpolation. If
|
|
159
|
+
the averages have not been calculated they are first calculated and then
|
|
160
|
+
returned.
|
|
142
161
|
|
|
143
162
|
Returns
|
|
144
163
|
-------
|
|
145
164
|
np.ndarray
|
|
146
|
-
|
|
165
|
+
Array of virtual sensor averages with shape=(n_sensors,n_comps,
|
|
166
|
+
n_timsteps). Note this is consistent with pyvales measurement array.
|
|
147
167
|
"""
|
|
148
168
|
if self._averages is None:
|
|
149
169
|
self._averages = self.calc_averages()
|
|
@@ -159,29 +179,35 @@ def create_gauss_weights_2d_4pts(meas_shape: tuple[int,int,int]) -> np.ndarray:
|
|
|
159
179
|
Parameters
|
|
160
180
|
----------
|
|
161
181
|
meas_shape : tuple[int,int,int]
|
|
162
|
-
|
|
182
|
+
Shape of the measurement array, shape=(n_sensors,n_field_comps,
|
|
183
|
+
n_time_steps).
|
|
163
184
|
|
|
164
185
|
Returns
|
|
165
186
|
-------
|
|
166
187
|
np.ndarray
|
|
167
|
-
|
|
188
|
+
Array of gaussian quadrature weights with shape = (n_gauss_pts,n_sensors
|
|
189
|
+
,n_field_comps,n_time_steps).
|
|
168
190
|
"""
|
|
169
191
|
#shape=(4,)+meas_shape
|
|
170
192
|
return np.ones((4,)+meas_shape)
|
|
171
193
|
|
|
172
194
|
|
|
173
195
|
def create_gauss_weights_2d_9pts(meas_shape: tuple[int,int,int]) -> np.ndarray:
|
|
174
|
-
"""
|
|
196
|
+
"""Helper function that creates an array of weights for gaussian quadrature
|
|
197
|
+
integration. This function provides the weights for 2D integrator with 9
|
|
198
|
+
integration points.
|
|
175
199
|
|
|
176
200
|
Parameters
|
|
177
201
|
----------
|
|
178
202
|
meas_shape : tuple[int,int,int]
|
|
179
|
-
|
|
203
|
+
Shape of the measurement array, shape=(n_sensors,n_field_comps,
|
|
204
|
+
n_time_steps).
|
|
180
205
|
|
|
181
206
|
Returns
|
|
182
207
|
-------
|
|
183
208
|
np.ndarray
|
|
184
|
-
|
|
209
|
+
Array of gaussian quadrature weights with shape = (n_gauss_pts,n_sensors
|
|
210
|
+
,n_field_comps,n_time_steps).
|
|
185
211
|
"""
|
|
186
212
|
# shape=(9,)+meas_shape
|
|
187
213
|
gauss_weights = np.vstack((25/81 * np.ones((4,)+meas_shape),
|
pyvale/integratorrectangle.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ==============================================================================
|
|
2
2
|
# pyvale: the python validation engine
|
|
3
3
|
# License: MIT
|
|
4
4
|
# Copyright (C) 2025 The Computer Aided Validation Team
|
|
5
|
-
#
|
|
5
|
+
# ==============================================================================
|
|
6
6
|
|
|
7
7
|
import numpy as np
|
|
8
8
|
from pyvale.field import IField
|
|
@@ -10,13 +10,19 @@ from pyvale.integratorspatial import (IIntegratorSpatial,
|
|
|
10
10
|
create_int_pt_array)
|
|
11
11
|
from pyvale.sensordata import SensorData
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
#TODO: Docstrings
|
|
15
|
-
|
|
16
13
|
#NOTE: code below is very similar to quadrature integrator should be able to
|
|
17
14
|
# refactor into injected classes/functions
|
|
18
15
|
|
|
19
16
|
class Rectangle2D(IIntegratorSpatial):
|
|
17
|
+
"""Rectangular numerical integrator for spatial averaging in 2D. Used to
|
|
18
|
+
model spatial averaging of sensors over a rectangular area which is
|
|
19
|
+
specified in the SensorData object. Handles sampling of the physical field
|
|
20
|
+
at the integration points and averages them back to a single value per
|
|
21
|
+
sensor location as specified in the SensorData object.
|
|
22
|
+
|
|
23
|
+
Implements the `IIntegratorSpatial` interface allowing for interoperability
|
|
24
|
+
of different spatial integration algorithms for modelling sensor averaging.
|
|
25
|
+
"""
|
|
20
26
|
__slots__ = ("_field","sens_data","_area","_area_int","_n_int_pts",
|
|
21
27
|
"_int_pt_offsets","_int_pts","_averages")
|
|
22
28
|
|
|
@@ -24,7 +30,20 @@ class Rectangle2D(IIntegratorSpatial):
|
|
|
24
30
|
field: IField,
|
|
25
31
|
sens_data: SensorData,
|
|
26
32
|
int_pt_offsets: np.ndarray) -> None:
|
|
27
|
-
|
|
33
|
+
"""
|
|
34
|
+
Parameters
|
|
35
|
+
----------
|
|
36
|
+
field : IField
|
|
37
|
+
A physical field interface that will be sampled at the integration
|
|
38
|
+
points and averaged back to single value per sensor.
|
|
39
|
+
sens_data : SensorData
|
|
40
|
+
Parameters of the sensor array including the sensor locations,
|
|
41
|
+
sampling times, type of spatial integrator and its dimensions. See
|
|
42
|
+
the `SensorData` dataclass for more details.
|
|
43
|
+
int_pt_offsets : np.ndarray
|
|
44
|
+
Offsets from the central location of the integration area with
|
|
45
|
+
shape=(n_gauss_pts,coord[X,Y,Z])
|
|
46
|
+
"""
|
|
28
47
|
self._field = field
|
|
29
48
|
self._sens_data = sens_data
|
|
30
49
|
|
|
@@ -41,15 +60,63 @@ class Rectangle2D(IIntegratorSpatial):
|
|
|
41
60
|
|
|
42
61
|
|
|
43
62
|
def calc_integrals(self, sens_data: SensorData | None = None) -> np.ndarray:
|
|
63
|
+
"""Calculates the numerical integrals for each sensor based on the
|
|
64
|
+
specified sensor data and numerical integration options (i.e. geometry
|
|
65
|
+
and integration points).
|
|
66
|
+
|
|
67
|
+
Parameters
|
|
68
|
+
----------
|
|
69
|
+
sens_data : SensorData | None, optional
|
|
70
|
+
Specifies the sensor parameters used to calculate the averages, by
|
|
71
|
+
default None. Is a sensor data object is passed a reference to that
|
|
72
|
+
object is stored by this class and used in later calculations. If
|
|
73
|
+
None then it uses the SensorData object stored by this class.
|
|
74
|
+
Defaults to None.
|
|
75
|
+
|
|
76
|
+
Returns
|
|
77
|
+
-------
|
|
78
|
+
np.ndarray
|
|
79
|
+
Array of virtual sensor integrals with shape=(n_sensors,n_comps,
|
|
80
|
+
n_timsteps). Note this is consistent with pyvales measurement array.
|
|
81
|
+
"""
|
|
44
82
|
self._averages = self.calc_averages(sens_data)
|
|
45
83
|
return self._area*self.get_averages()
|
|
46
84
|
|
|
47
85
|
|
|
48
86
|
def get_integrals(self) -> np.ndarray:
|
|
87
|
+
"""Gets the most recent calculation of the spatial averages for all
|
|
88
|
+
sensors in the sensor array without performing any new interpolation. If
|
|
89
|
+
the averages have not been calculated they are first calculated and then
|
|
90
|
+
returned.
|
|
91
|
+
|
|
92
|
+
Returns
|
|
93
|
+
-------
|
|
94
|
+
np.ndarray
|
|
95
|
+
Array of virtual sensor averages with shape=(n_sensors,n_comps,
|
|
96
|
+
n_timsteps). Note this is consistent with pyvales measurement array.
|
|
97
|
+
"""
|
|
49
98
|
return self._area*self.get_averages()
|
|
50
99
|
|
|
51
100
|
def calc_averages(self, sens_data: SensorData | None = None) -> np.ndarray:
|
|
52
|
-
|
|
101
|
+
"""Calculates the spatial averages for each sensor based on the
|
|
102
|
+
specified sensor data and numerical integration options (i.e. geometry
|
|
103
|
+
and integration points).
|
|
104
|
+
|
|
105
|
+
Parameters
|
|
106
|
+
----------
|
|
107
|
+
sens_data : SensorData | None, optional
|
|
108
|
+
Specifies the sensor parameters used to calculate the averages, by
|
|
109
|
+
default None. Is a sensor data object is passed a reference to that
|
|
110
|
+
object is stored by this class and used in later calculations. If
|
|
111
|
+
None then it uses the SensorData object stored by this class.
|
|
112
|
+
Defaults to None.
|
|
113
|
+
|
|
114
|
+
Returns
|
|
115
|
+
-------
|
|
116
|
+
np.ndarray
|
|
117
|
+
Array of virtual sensor averages with shape=(n_sensors,n_comps,
|
|
118
|
+
n_timsteps). Note this is consistent with pyvales measurement array.
|
|
119
|
+
"""
|
|
53
120
|
if sens_data is not None:
|
|
54
121
|
self._sens_data = sens_data
|
|
55
122
|
|
|
@@ -78,6 +145,17 @@ class Rectangle2D(IIntegratorSpatial):
|
|
|
78
145
|
|
|
79
146
|
|
|
80
147
|
def get_averages(self) -> np.ndarray:
|
|
148
|
+
"""Gets the most recent calculation of the spatial averages for all
|
|
149
|
+
sensors in the sensor array without performing any new interpolation. If
|
|
150
|
+
the averages have not been calculated they are first calculated and then
|
|
151
|
+
returned.
|
|
152
|
+
|
|
153
|
+
Returns
|
|
154
|
+
-------
|
|
155
|
+
np.ndarray
|
|
156
|
+
Array of virtual sensor averages with shape=(n_sensors,n_comps,
|
|
157
|
+
n_timsteps). Note this is consistent with pyvales measurement array.
|
|
158
|
+
"""
|
|
81
159
|
if self._averages is None:
|
|
82
160
|
self._averages = self.calc_averages()
|
|
83
161
|
|
pyvale/integratorspatial.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ==============================================================================
|
|
2
2
|
# pyvale: the python validation engine
|
|
3
3
|
# License: MIT
|
|
4
4
|
# Copyright (C) 2025 The Computer Aided Validation Team
|
|
5
|
-
#
|
|
5
|
+
# ==============================================================================
|
|
6
6
|
|
|
7
7
|
from abc import ABC, abstractmethod
|
|
8
8
|
import numpy as np
|
|
@@ -71,7 +71,7 @@ class IIntegratorSpatial(ABC):
|
|
|
71
71
|
Array of simulated sensor measurements. shape=(num_sensors,
|
|
72
72
|
num_field_components,num_time_steps).
|
|
73
73
|
"""
|
|
74
|
-
|
|
74
|
+
|
|
75
75
|
|
|
76
76
|
@abstractmethod
|
|
77
77
|
def get_averages(self) -> np.ndarray:
|
|
@@ -85,5 +85,5 @@ class IIntegratorSpatial(ABC):
|
|
|
85
85
|
Array of simulated sensor measurements. shape=(num_sensors,
|
|
86
86
|
num_field_components,num_time_steps).
|
|
87
87
|
"""
|
|
88
|
-
|
|
88
|
+
|
|
89
89
|
|
pyvale/integratortype.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ==============================================================================
|
|
2
2
|
# pyvale: the python validation engine
|
|
3
3
|
# License: MIT
|
|
4
4
|
# Copyright (C) 2025 The Computer Aided Validation Team
|
|
5
|
-
#
|
|
5
|
+
# ==============================================================================
|
|
6
6
|
|
|
7
7
|
import enum
|
|
8
8
|
|
|
@@ -24,7 +24,7 @@ class EIntSpatialType(enum.Enum):
|
|
|
24
24
|
Gaussian quadrature 2D integrator over 4 points.
|
|
25
25
|
|
|
26
26
|
QUAD9PT
|
|
27
|
-
|
|
27
|
+
Gaussian quadrature 2D integrator over 9 points.
|
|
28
28
|
"""
|
|
29
29
|
|
|
30
30
|
RECT1PT = enum.auto()
|
pyvale/output.py
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# ==============================================================================
|
|
2
|
+
# pyvale: the python validation engine
|
|
3
|
+
# License: MIT
|
|
4
|
+
# Copyright (C) 2025 The Computer Aided Validation Team
|
|
5
|
+
# ==============================================================================
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
"""
|
|
10
|
+
NOTE: this module is a feature under developement.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
# TODO: remove this? but check blender tests
|
|
14
|
+
|
|
15
|
+
@dataclass(slots=True)
|
|
16
|
+
class Outputs():
|
|
17
|
+
base_dir = Path.home()
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# ==============================================================================
|
|
2
|
+
# pyvale: the python validation engine
|
|
3
|
+
# License: MIT
|
|
4
|
+
# Copyright (C) 2025 The Computer Aided Validation Team
|
|
5
|
+
# ==============================================================================
|
|
6
|
+
|
|
7
|
+
class BlenderError(Exception):
|
|
8
|
+
pass
|
|
9
|
+
|
|
10
|
+
class VisError(Exception):
|
|
11
|
+
pass
|
pyvale/raster.py
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ==============================================================================
|
|
2
2
|
# pyvale: the python validation engine
|
|
3
3
|
# License: MIT
|
|
4
4
|
# Copyright (C) 2025 The Computer Aided Validation Team
|
|
5
|
-
#
|
|
5
|
+
# ==============================================================================
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
NOTE: this module is a feature under developement.
|
|
9
|
+
"""
|
|
6
10
|
|
|
7
11
|
from abc import ABC, abstractmethod
|
|
8
12
|
import numpy as np
|
|
9
13
|
|
|
10
|
-
# NOTE: This module is a feature under developement.
|
|
11
|
-
|
|
12
|
-
|
|
13
14
|
# NOTE:
|
|
14
15
|
# - Need to render a single frame static/deformed
|
|
15
16
|
# - Need to render all frames static/deformed
|
pyvale/rastercy.py
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ==============================================================================
|
|
2
2
|
# pyvale: the python validation engine
|
|
3
3
|
# License: MIT
|
|
4
4
|
# Copyright (C) 2025 The Computer Aided Validation Team
|
|
5
|
-
#
|
|
5
|
+
# ==============================================================================
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
NOTE: this module is a feature under developement.
|
|
9
|
+
"""
|
|
6
10
|
|
|
7
11
|
from pathlib import Path
|
|
8
12
|
from multiprocessing.pool import Pool
|
|
@@ -11,8 +15,6 @@ from pyvale.cameradata import CameraData
|
|
|
11
15
|
from pyvale.rendermesh import RenderMeshData
|
|
12
16
|
import pyvale.cython.rastercyth as rastercyth
|
|
13
17
|
|
|
14
|
-
# NOTE: This module is a feature under developement.
|
|
15
|
-
|
|
16
18
|
class RasterCY:
|
|
17
19
|
@staticmethod
|
|
18
20
|
def raster_static_mesh(cam_data: CameraData,
|
pyvale/rasternp.py
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ==============================================================================
|
|
2
2
|
# pyvale: the python validation engine
|
|
3
3
|
# License: MIT
|
|
4
4
|
# Copyright (C) 2025 The Computer Aided Validation Team
|
|
5
|
-
#
|
|
5
|
+
# ==============================================================================
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
NOTE: this module is a feature under developement.
|
|
9
|
+
"""
|
|
6
10
|
|
|
7
11
|
from pathlib import Path
|
|
8
12
|
from multiprocessing.pool import Pool
|
|
@@ -13,8 +17,6 @@ from pyvale.cameratools import CameraTools
|
|
|
13
17
|
from pyvale.rendermesh import RenderMeshData
|
|
14
18
|
import pyvale.cython.rastercyth as rastercyth
|
|
15
19
|
|
|
16
|
-
# NOTE: This module is a feature under developement.
|
|
17
|
-
|
|
18
20
|
class RasterNP:
|
|
19
21
|
@staticmethod
|
|
20
22
|
def world_to_raster_coords(cam_data: CameraData,
|
pyvale/rendermesh.py
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ==============================================================================
|
|
2
2
|
# pyvale: the python validation engine
|
|
3
3
|
# License: MIT
|
|
4
4
|
# Copyright (C) 2025 The Computer Aided Validation Team
|
|
5
|
-
#
|
|
5
|
+
# ==============================================================================
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
NOTE: this module is a feature under developement.
|
|
9
|
+
"""
|
|
6
10
|
|
|
7
11
|
from enum import Enum
|
|
8
12
|
from dataclasses import dataclass, field
|
pyvale/sensorarray.py
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
#
|
|
1
|
+
# ==============================================================================
|
|
2
2
|
# pyvale: the python validation engine
|
|
3
3
|
# License: MIT
|
|
4
4
|
# Copyright (C) 2025 The Computer Aided Validation Team
|
|
5
|
-
#
|
|
5
|
+
# ==============================================================================
|
|
6
6
|
|
|
7
7
|
from abc import ABC, abstractmethod
|
|
8
8
|
import numpy as np
|