pyvale 2025.4.0__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.

Files changed (153) hide show
  1. pyvale/__init__.py +78 -64
  2. pyvale/analyticmeshgen.py +102 -0
  3. pyvale/{core/analyticsimdatafactory.py → analyticsimdatafactory.py} +44 -16
  4. pyvale/analyticsimdatagenerator.py +323 -0
  5. pyvale/blendercalibrationdata.py +15 -0
  6. pyvale/blenderlightdata.py +26 -0
  7. pyvale/blendermaterialdata.py +15 -0
  8. pyvale/blenderrenderdata.py +30 -0
  9. pyvale/blenderscene.py +488 -0
  10. pyvale/blendertools.py +420 -0
  11. pyvale/{core/camera.py → camera.py} +15 -15
  12. pyvale/{core/cameradata.py → cameradata.py} +27 -22
  13. pyvale/{core/cameradata2d.py → cameradata2d.py} +8 -6
  14. pyvale/camerastereo.py +217 -0
  15. pyvale/{core/cameratools.py → cameratools.py} +220 -26
  16. pyvale/{core/cython → cython}/rastercyth.py +11 -7
  17. pyvale/data/__init__.py +5 -7
  18. pyvale/data/cal_target.tiff +0 -0
  19. pyvale/data/case00_HEX20_out.e +0 -0
  20. pyvale/data/case00_HEX27_out.e +0 -0
  21. pyvale/data/case00_HEX8_out.e +0 -0
  22. pyvale/data/case00_TET10_out.e +0 -0
  23. pyvale/data/case00_TET14_out.e +0 -0
  24. pyvale/data/case00_TET4_out.e +0 -0
  25. pyvale/{core/dataset.py → dataset.py} +91 -16
  26. pyvale/{core/errorcalculator.py → errorcalculator.py} +13 -16
  27. pyvale/{core/errordriftcalc.py → errordriftcalc.py} +14 -14
  28. pyvale/{core/errorintegrator.py → errorintegrator.py} +25 -28
  29. pyvale/{core/errorrand.py → errorrand.py} +39 -46
  30. pyvale/errorsyscalib.py +134 -0
  31. pyvale/{core/errorsysdep.py → errorsysdep.py} +25 -29
  32. pyvale/{core/errorsysfield.py → errorsysfield.py} +59 -52
  33. pyvale/{core/errorsysindep.py → errorsysindep.py} +85 -182
  34. pyvale/examples/__init__.py +5 -7
  35. pyvale/examples/basics/ex1_1_basicscalars_therm2d.py +131 -0
  36. pyvale/examples/basics/ex1_2_sensormodel_therm2d.py +158 -0
  37. pyvale/examples/basics/ex1_3_customsens_therm3d.py +216 -0
  38. pyvale/examples/basics/ex1_4_basicerrors_therm3d.py +153 -0
  39. pyvale/examples/basics/ex1_5_fielderrs_therm3d.py +168 -0
  40. pyvale/examples/basics/ex1_6_caliberrs_therm2d.py +133 -0
  41. pyvale/examples/basics/ex1_7_spatavg_therm2d.py +123 -0
  42. pyvale/examples/basics/ex2_1_basicvectors_disp2d.py +112 -0
  43. pyvale/examples/basics/ex2_2_vectorsens_disp2d.py +111 -0
  44. pyvale/examples/basics/ex2_3_sensangle_disp2d.py +139 -0
  45. pyvale/examples/basics/ex2_4_chainfielderrs_disp2d.py +196 -0
  46. pyvale/examples/basics/ex2_5_vectorfields3d_disp3d.py +109 -0
  47. pyvale/examples/basics/ex3_1_basictensors_strain2d.py +114 -0
  48. pyvale/examples/basics/ex3_2_tensorsens2d_strain2d.py +111 -0
  49. pyvale/examples/basics/ex3_3_tensorsens3d_strain3d.py +182 -0
  50. pyvale/examples/basics/ex4_1_expsim2d_thermmech2d.py +171 -0
  51. pyvale/examples/basics/ex4_2_expsim3d_thermmech3d.py +252 -0
  52. pyvale/examples/{analyticdatagen → genanalyticdata}/ex1_1_scalarvisualisation.py +6 -9
  53. pyvale/examples/{analyticdatagen → genanalyticdata}/ex1_2_scalarcasebuild.py +8 -11
  54. pyvale/examples/{analyticdatagen → genanalyticdata}/ex2_1_analyticsensors.py +9 -12
  55. pyvale/examples/imagedef2d/ex_imagedef2d_todisk.py +8 -15
  56. pyvale/examples/renderblender/ex1_1_blenderscene.py +121 -0
  57. pyvale/examples/renderblender/ex1_2_blenderdeformed.py +119 -0
  58. pyvale/examples/renderblender/ex2_1_stereoscene.py +128 -0
  59. pyvale/examples/renderblender/ex2_2_stereodeformed.py +131 -0
  60. pyvale/examples/renderblender/ex3_1_blendercalibration.py +120 -0
  61. pyvale/examples/{rasterisation → renderrasterisation}/ex_rastenp.py +6 -7
  62. pyvale/examples/{rasterisation → renderrasterisation}/ex_rastercyth_oneframe.py +5 -7
  63. pyvale/examples/{rasterisation → renderrasterisation}/ex_rastercyth_static_cypara.py +6 -13
  64. pyvale/examples/{rasterisation → renderrasterisation}/ex_rastercyth_static_pypara.py +9 -12
  65. pyvale/examples/{ex1_4_thermal2d.py → visualisation/ex1_1_plot_traces.py} +33 -20
  66. pyvale/examples/{features/ex_animation_tools_3dmonoblock.py → visualisation/ex2_1_animate_sim.py} +37 -31
  67. pyvale/experimentsimulator.py +175 -0
  68. pyvale/{core/field.py → field.py} +6 -14
  69. pyvale/fieldconverter.py +351 -0
  70. pyvale/{core/fieldsampler.py → fieldsampler.py} +9 -10
  71. pyvale/{core/fieldscalar.py → fieldscalar.py} +17 -18
  72. pyvale/{core/fieldtensor.py → fieldtensor.py} +23 -26
  73. pyvale/{core/fieldtransform.py → fieldtransform.py} +9 -5
  74. pyvale/{core/fieldvector.py → fieldvector.py} +14 -16
  75. pyvale/{core/generatorsrandom.py → generatorsrandom.py} +29 -52
  76. pyvale/{core/imagedef2d.py → imagedef2d.py} +11 -8
  77. pyvale/{core/integratorfactory.py → integratorfactory.py} +12 -13
  78. pyvale/{core/integratorquadrature.py → integratorquadrature.py} +57 -32
  79. pyvale/integratorrectangle.py +165 -0
  80. pyvale/{core/integratorspatial.py → integratorspatial.py} +9 -10
  81. pyvale/{core/integratortype.py → integratortype.py} +7 -8
  82. pyvale/output.py +17 -0
  83. pyvale/pyvaleexceptions.py +11 -0
  84. pyvale/{core/raster.py → raster.py} +8 -8
  85. pyvale/{core/rastercy.py → rastercy.py} +11 -10
  86. pyvale/{core/rasternp.py → rasternp.py} +12 -13
  87. pyvale/{core/rendermesh.py → rendermesh.py} +10 -19
  88. pyvale/{core/sensorarray.py → sensorarray.py} +7 -8
  89. pyvale/{core/sensorarrayfactory.py → sensorarrayfactory.py} +64 -78
  90. pyvale/{core/sensorarraypoint.py → sensorarraypoint.py} +39 -41
  91. pyvale/{core/sensordata.py → sensordata.py} +7 -8
  92. pyvale/sensordescriptor.py +213 -0
  93. pyvale/{core/sensortools.py → sensortools.py} +8 -9
  94. pyvale/simcases/case00_HEX20.i +5 -5
  95. pyvale/simcases/case00_HEX27.i +5 -5
  96. pyvale/simcases/case00_HEX8.i +242 -0
  97. pyvale/simcases/case00_TET10.i +2 -2
  98. pyvale/simcases/case00_TET14.i +2 -2
  99. pyvale/simcases/case00_TET4.i +242 -0
  100. pyvale/simcases/run_1case.py +1 -1
  101. pyvale/simtools.py +67 -0
  102. pyvale/visualexpplotter.py +191 -0
  103. pyvale/{core/visualimagedef.py → visualimagedef.py} +13 -10
  104. pyvale/{core/visualimages.py → visualimages.py} +10 -9
  105. pyvale/visualopts.py +493 -0
  106. pyvale/{core/visualsimanimator.py → visualsimanimator.py} +47 -19
  107. pyvale/visualsimsensors.py +318 -0
  108. pyvale/visualtools.py +136 -0
  109. pyvale/visualtraceplotter.py +142 -0
  110. {pyvale-2025.4.0.dist-info → pyvale-2025.5.1.dist-info}/METADATA +17 -14
  111. pyvale-2025.5.1.dist-info/RECORD +172 -0
  112. {pyvale-2025.4.0.dist-info → pyvale-2025.5.1.dist-info}/WHEEL +1 -1
  113. pyvale/core/__init__.py +0 -7
  114. pyvale/core/analyticmeshgen.py +0 -59
  115. pyvale/core/analyticsimdatagenerator.py +0 -160
  116. pyvale/core/cython/rastercyth.c +0 -32267
  117. pyvale/core/experimentsimulator.py +0 -99
  118. pyvale/core/fieldconverter.py +0 -154
  119. pyvale/core/integratorrectangle.py +0 -88
  120. pyvale/core/optimcheckfuncs.py +0 -153
  121. pyvale/core/sensordescriptor.py +0 -101
  122. pyvale/core/visualexpplotter.py +0 -151
  123. pyvale/core/visualopts.py +0 -180
  124. pyvale/core/visualsimplotter.py +0 -182
  125. pyvale/core/visualtools.py +0 -81
  126. pyvale/core/visualtraceplotter.py +0 -256
  127. pyvale/examples/analyticdatagen/__init__.py +0 -7
  128. pyvale/examples/ex1_1_thermal2d.py +0 -89
  129. pyvale/examples/ex1_2_thermal2d.py +0 -111
  130. pyvale/examples/ex1_3_thermal2d.py +0 -113
  131. pyvale/examples/ex1_5_thermal2d.py +0 -105
  132. pyvale/examples/ex2_1_thermal3d .py +0 -87
  133. pyvale/examples/ex2_2_thermal3d.py +0 -51
  134. pyvale/examples/ex2_3_thermal3d.py +0 -109
  135. pyvale/examples/ex3_1_displacement2d.py +0 -47
  136. pyvale/examples/ex3_2_displacement2d.py +0 -79
  137. pyvale/examples/ex3_3_displacement2d.py +0 -104
  138. pyvale/examples/ex3_4_displacement2d.py +0 -105
  139. pyvale/examples/ex4_1_strain2d.py +0 -57
  140. pyvale/examples/ex4_2_strain2d.py +0 -79
  141. pyvale/examples/ex4_3_strain2d.py +0 -100
  142. pyvale/examples/ex5_1_multiphysics2d.py +0 -78
  143. pyvale/examples/ex6_1_multiphysics2d_expsim.py +0 -118
  144. pyvale/examples/ex6_2_multiphysics3d_expsim.py +0 -158
  145. pyvale/examples/features/__init__.py +0 -7
  146. pyvale/examples/features/ex_area_avg.py +0 -89
  147. pyvale/examples/features/ex_calibration_error.py +0 -108
  148. pyvale/examples/features/ex_chain_field_errs.py +0 -141
  149. pyvale/examples/features/ex_field_errs.py +0 -78
  150. pyvale/examples/features/ex_sensor_single_angle_batch.py +0 -110
  151. pyvale-2025.4.0.dist-info/RECORD +0 -157
  152. {pyvale-2025.4.0.dist-info → pyvale-2025.5.1.dist-info}/licenses/LICENSE +0 -0
  153. {pyvale-2025.4.0.dist-info → pyvale-2025.5.1.dist-info}/top_level.txt +0 -0
@@ -1,108 +0,0 @@
1
- '''
2
- ================================================================================
3
- DEV: calibration check
4
-
5
- pyvale: the python validation engine
6
- License: MIT
7
- Copyright (C) 2025 The Computer Aided Validation Team
8
- ================================================================================
9
- '''
10
- import matplotlib.pyplot as plt
11
- import numpy as np
12
- import mooseherder as mh
13
- import pyvale
14
-
15
-
16
- def assumed_calib(signal: np.ndarray) -> np.ndarray:
17
- return 24.3*signal + 0.616
18
-
19
-
20
- def truth_calib(signal: np.ndarray) -> np.ndarray:
21
- return -0.01897 + 25.41881*signal - 0.42456*signal**2 + 0.04365*signal**3
22
-
23
-
24
- def main() -> None:
25
- """pyvale example: sensor calibration error
26
- Based on K-type thermocouple calibration
27
- """
28
- n_divs = 10000
29
- signal_calib_range = np.array((0,6))
30
- v = np.linspace(signal_calib_range[0],signal_calib_range[1],n_divs)
31
-
32
- temp_truth = -0.01897 + 25.41881*v - 0.42456*v**2 + 0.04365*v**3
33
- temp_assumed = 24.3*v + 0.616
34
- calib_error = temp_assumed - temp_truth
35
- print()
36
- print(80*"-")
37
- print(f"Calibration error over signal:"+\
38
- f" {signal_calib_range[0]} to {signal_calib_range[1]} mV")
39
- print(calib_error)
40
- print(f"Max calib error: {np.max(calib_error)}")
41
- print(f"Min calib error: {np.min(calib_error)}")
42
- print()
43
-
44
- data_path = pyvale.DataSet.thermal_2d_path()
45
- sim_data = mh.ExodusReader(data_path).read_all_sim_data()
46
- # Scale to mm to make 3D visualisation scaling easier
47
- sim_data.coords = sim_data.coords*1000.0
48
-
49
- descriptor = pyvale.SensorDescriptorFactory.temperature_descriptor()
50
-
51
- field_key = 'temperature'
52
- t_field = pyvale.FieldScalar(sim_data,
53
- field_key=field_key,
54
- spat_dims=2)
55
-
56
- n_sens = (4,1,1)
57
- x_lims = (0.0,100.0)
58
- y_lims = (0.0,50.0)
59
- z_lims = (0.0,0.0)
60
- sens_pos = pyvale.create_sensor_pos_array(n_sens,x_lims,y_lims,z_lims)
61
-
62
- use_sim_time = False
63
- if use_sim_time:
64
- sample_times = None
65
- else:
66
- sample_times = np.linspace(0.0,np.max(sim_data.time),50)
67
-
68
- sens_data = pyvale.SensorData(positions=sens_pos,
69
- sample_times=sample_times)
70
-
71
- tc_array = pyvale.SensorArrayPoint(sens_data,
72
- t_field,
73
- descriptor)
74
-
75
- cal_err = pyvale.ErrSysCalibration(assumed_calib,
76
- truth_calib,
77
- signal_calib_range,
78
- n_cal_divs=10000)
79
- sys_err_int = pyvale.ErrIntegrator([cal_err],
80
- sens_data,
81
- tc_array.get_measurement_shape())
82
- tc_array.set_error_integrator(sys_err_int)
83
-
84
- measurements = tc_array.get_measurements()
85
-
86
- print('\n'+80*'-')
87
- print('For a sensor: measurement = truth + sysematic error + random error')
88
- print(f'measurements.shape = {measurements.shape} = '+
89
- '(n_sensors,n_field_components,n_timesteps)\n')
90
- print("The truth, systematic error and random error arrays have the same "+
91
- "shape.")
92
-
93
- print(80*'-')
94
- print('Looking at the last 5 time steps (measurements) of sensor 0:')
95
- pyvale.print_measurements(tc_array,
96
- (0,1),
97
- (0,1),
98
- (measurements.shape[2]-5,measurements.shape[2]))
99
- print(80*'-')
100
-
101
- pyvale.plot_time_traces(tc_array,field_key)
102
- plt.show()
103
-
104
-
105
-
106
-
107
- if __name__ == "__main__":
108
- main()
@@ -1,141 +0,0 @@
1
- """
2
- ================================================================================
3
- example: displacement sensors on a 2d plate
4
-
5
- pyvale: the python validation engine
6
- License: MIT
7
- Copyright (C) 2025 The Computer Aided Validation Team
8
- ================================================================================
9
- """
10
- import numpy as np
11
- import matplotlib.pyplot as plt
12
- import mooseherder as mh
13
- import pyvale
14
-
15
- def main() -> None:
16
- data_path = pyvale.DataSet.mechanical_2d_path()
17
- sim_data = mh.ExodusReader(data_path).read_all_sim_data()
18
- # Scale to mm to make 3D visualisation scaling easier
19
- sim_data.coords = sim_data.coords*1000.0 # type: ignore
20
-
21
- descriptor = pyvale.SensorDescriptorFactory.displacement_descriptor()
22
-
23
- spat_dims = 2
24
- field_key = "disp"
25
- components = ("disp_x","disp_y")
26
- disp_field = pyvale.FieldVector(sim_data,field_key,components,spat_dims)
27
-
28
- n_sens = (2,3,1)
29
- x_lims = (0.0,100.0)
30
- y_lims = (0.0,150.0)
31
- z_lims = (0.0,0.0)
32
- sensor_positions = pyvale.create_sensor_pos_array(n_sens,x_lims,y_lims,z_lims)
33
-
34
- use_sim_time = True
35
- if use_sim_time:
36
- sample_times = None
37
- else:
38
- sample_times = np.linspace(0.0,np.max(sim_data.time),50)
39
-
40
- sensor_data = pyvale.SensorData(positions=sensor_positions,
41
- sample_times=sample_times)
42
-
43
- disp_sens_array = pyvale.SensorArrayPoint(sensor_data,
44
- disp_field,
45
- descriptor)
46
-
47
- pos_offset = -1.0*np.ones_like(sensor_positions)
48
- pos_offset[:,2] = 0 # in 2d we only have offset in x and y so zero z
49
- pos_error_data = pyvale.ErrFieldData(pos_offset_xyz=pos_offset)
50
-
51
- angle_offset = np.zeros_like(sensor_positions)
52
- angle_offset[:,0] = 1.0 # only rotate about z in 2D
53
- angle_error_data = pyvale.ErrFieldData(ang_offset_zyx=angle_offset)
54
-
55
- time_offset = 2.0*np.ones_like(disp_sens_array.get_sample_times())
56
- time_error_data = pyvale.ErrFieldData(time_offset=time_offset)
57
-
58
- field_errs = []
59
- field_errs.append(pyvale.ErrSysField(disp_field,
60
- time_error_data))
61
- field_errs.append(pyvale.ErrSysField(disp_field,
62
- time_error_data))
63
-
64
- field_errs.append(pyvale.ErrSysField(disp_field,
65
- pos_error_data))
66
- field_errs.append(pyvale.ErrSysField(disp_field,
67
- pos_error_data))
68
-
69
- field_errs.append(pyvale.ErrSysField(disp_field,
70
- angle_error_data))
71
- field_errs.append(pyvale.ErrSysField(disp_field,
72
- angle_error_data))
73
-
74
- err_int_opts = pyvale.ErrIntOpts(force_dependence=True,
75
- store_all_errs=True)
76
- error_int = pyvale.ErrIntegrator(field_errs,
77
- sensor_data,
78
- disp_sens_array.get_measurement_shape(),
79
- err_int_opts)
80
- disp_sens_array.set_error_integrator(error_int)
81
-
82
- measurements = disp_sens_array.calc_measurements()
83
-
84
- sens_data_by_chain = error_int.get_sens_data_by_chain()
85
- if sens_data_by_chain is not None:
86
- for ii,ss in enumerate(sens_data_by_chain):
87
- print(80*"-")
88
- if ss is not None:
89
- print(f"SensorData @ [{ii}]")
90
- print("TIME")
91
- print(ss.sample_times)
92
- print()
93
- print("POSITIONS")
94
- print(ss.positions)
95
- print()
96
- print("ANGLES")
97
- for aa in ss.angles:
98
- print(aa.as_euler("zyx",degrees=True))
99
- print()
100
- print(80*"-")
101
-
102
- print()
103
- print(80*"=")
104
- sens_data_accumulated = error_int.get_sens_data_accumulated()
105
- print("TIME")
106
- print(sens_data_accumulated.sample_times)
107
- print()
108
- print("POSITIONS")
109
- print(sens_data_accumulated.positions)
110
- print()
111
- print("ANGLES")
112
- for aa in sens_data_accumulated.angles:
113
- print(aa.as_euler("zyx",degrees=True))
114
- print()
115
- print(80*"=")
116
-
117
- print(80*"-")
118
- sens_num = 4
119
- print("The last 5 time steps (measurements) of sensor {sens_num}:")
120
- pyvale.print_measurements(disp_sens_array,
121
- (sens_num-1,sens_num),
122
- (0,1),
123
- (measurements.shape[2]-5,measurements.shape[2]))
124
- print(80*"-")
125
-
126
- plot_field = "disp_x"
127
-
128
- if plot_field == "disp_x":
129
- pv_plot = pyvale.plot_point_sensors_on_sim(disp_sens_array,"disp_x")
130
- pv_plot.show()
131
- elif plot_field == "disp_y":
132
- pv_plot = pyvale.plot_point_sensors_on_sim(disp_sens_array,"disp_y")
133
- pv_plot.show()
134
-
135
- pyvale.plot_time_traces(disp_sens_array,"disp_x")
136
- pyvale.plot_time_traces(disp_sens_array,"disp_y")
137
- plt.show()
138
-
139
-
140
- if __name__ == "__main__":
141
- main()
@@ -1,78 +0,0 @@
1
- '''
2
- ================================================================================
3
- Example: thermocouples on a 2d plate
4
-
5
- pyvale: the python validation engine
6
- License: MIT
7
- Copyright (C) 2025 The Computer Aided Validation Team
8
- ================================================================================
9
- '''
10
- import numpy as np
11
- import matplotlib.pyplot as plt
12
- import mooseherder as mh
13
- import pyvale
14
-
15
-
16
- def main() -> None:
17
- """pyvale example: point sensors on a 2D thermal simulation
18
- ----------------------------------------------------------------------------
19
- """
20
- data_path = pyvale.DataSet.thermal_2d_path()
21
- sim_data = mh.ExodusReader(data_path).read_all_sim_data()
22
- field_key = list(sim_data.node_vars.keys())[0] # type: ignore
23
- # Scale to mm to make 3D visualisation scaling easier
24
- sim_data.coords = sim_data.coords*1000.0 # type: ignore
25
-
26
- n_sens = (4,1,1)
27
- x_lims = (0.0,100.0)
28
- y_lims = (0.0,50.0)
29
- z_lims = (0.0,0.0)
30
- sens_pos = pyvale.create_sensor_pos_array(n_sens,x_lims,y_lims,z_lims)
31
-
32
- sample_times = np.linspace(0.0,np.max(sim_data.time),50) # | None
33
-
34
- sensor_data = pyvale.SensorData(positions=sens_pos,
35
- sample_times=sample_times)
36
-
37
- tc_array = pyvale.SensorArrayFactory \
38
- .thermocouples_no_errs(sim_data,
39
- sensor_data,
40
- field_key,
41
- spat_dims=2)
42
-
43
- #---------------------------------------------------------------------------
44
- # Standard independent systematic errors
45
- pos_rand = pyvale.GeneratorNormal(std=1.0) # mm
46
- pos_lock = np.full_like(sensor_data.positions,False,dtype=bool)
47
- pos_lock[:,2] = True
48
- field_err_data = pyvale.ErrFieldData(
49
- pos_rand_xyz=(pos_rand,pos_rand,pos_rand),
50
- pos_lock_xyz=pos_lock
51
- )
52
-
53
- err_chain = []
54
- err_chain.append(pyvale.ErrSysField(tc_array.get_field(),
55
- field_err_data))
56
- err_int = pyvale.ErrIntegrator(err_chain,
57
- sensor_data,
58
- tc_array.get_measurement_shape())
59
- tc_array.set_error_integrator(err_int)
60
-
61
-
62
- #---------------------------------------------------------------------------
63
- measurements = tc_array.calc_measurements()
64
- print(80*'-')
65
- sens_num = 4
66
- print('The last 5 time steps (measurements) of sensor {sens_num}:')
67
- pyvale.print_measurements(tc_array,
68
- (sens_num-1,sens_num),
69
- (0,1),
70
- (measurements.shape[2]-5,measurements.shape[2]))
71
- print(80*'-')
72
-
73
- pyvale.plot_time_traces(tc_array,field_key)
74
- plt.show()
75
-
76
-
77
- if __name__ == '__main__':
78
- main()
@@ -1,110 +0,0 @@
1
- """
2
- ================================================================================
3
- Example: displacement sensors on a 2d plate
4
-
5
- pyvale: the python validation engine
6
- License: MIT
7
- Copyright (C) 2025 The Computer Aided Validation Team
8
- ================================================================================
9
- """
10
- import numpy as np
11
- import matplotlib.pyplot as plt
12
- from scipy.spatial.transform import Rotation
13
- import mooseherder as mh
14
- import pyvale
15
-
16
- def main() -> None:
17
- """pyvale example: single rotation batch processing
18
- ----------------------------------------------------------------------------
19
- - Tests that when only one sensor rotation is provided that
20
- all sensors are assumed to have the same rotation and batch processed.
21
- """
22
- data_path = pyvale.DataSet.mechanical_2d_path()
23
- sim_data = mh.ExodusReader(data_path).read_all_sim_data()
24
- # Scale to mm to make 3D visualisation scaling easier
25
- sim_data.coords = sim_data.coords*1000.0 # type: ignore
26
-
27
- descriptor = pyvale.SensorDescriptorFactory.displacement_descriptor()
28
-
29
- spat_dims = 2
30
- field_key = "disp"
31
- components = ("disp_x","disp_y")
32
- disp_field = pyvale.FieldVector(sim_data,field_key,components,spat_dims)
33
-
34
- #---------------------------------------------------------------------------
35
- n_sens = (2,3,1)
36
- x_lims = (0.0,100.0)
37
- y_lims = (0.0,150.0)
38
- z_lims = (0.0,0.0)
39
- sensor_positions = pyvale.create_sensor_pos_array(n_sens,
40
- x_lims,
41
- y_lims,
42
- z_lims)
43
-
44
- use_sim_time = False
45
- if use_sim_time:
46
- sample_times = None
47
- else:
48
- sample_times = np.linspace(0.0,np.max(sim_data.time),50)
49
-
50
- # Provide only a single rotation for the 6 sensors
51
- sensor_angles = (Rotation.from_euler("zyx", [180, 0, 0], degrees=True),)
52
-
53
- sensor_data_norot = pyvale.SensorData(positions=sensor_positions,
54
- sample_times=sample_times)
55
-
56
-
57
- sensor_data_rot = pyvale.SensorData(positions=sensor_positions,
58
- sample_times=sample_times,
59
- angles=sensor_angles)
60
-
61
- #---------------------------------------------------------------------------
62
- disp_sensors_norot = pyvale.SensorArrayPoint(sensor_data_norot,
63
- disp_field,
64
- descriptor)
65
-
66
-
67
- disp_sensors_rot = pyvale.SensorArrayPoint(sensor_data_rot,
68
- disp_field,
69
- descriptor)
70
-
71
-
72
-
73
- measurements_norot = disp_sensors_norot.calc_measurements()
74
- measurements_rot = disp_sensors_rot.calc_measurements()
75
-
76
- #---------------------------------------------------------------------------
77
- sens_to_print = 1
78
- print(80*"-")
79
- print(f"The last 5 time steps (measurements) of non-rotated sensor {sens_to_print}:")
80
- pyvale.print_measurements(disp_sensors_norot,
81
- (sens_to_print-1,sens_to_print),
82
- (0,1),
83
- (measurements_norot.shape[2]-5,measurements_norot.shape[2]))
84
- print(80*"-")
85
- print(f"The last 5 time steps (measurements) of rotated sensor {sens_to_print}:")
86
- pyvale.print_measurements(disp_sensors_rot,
87
- (sens_to_print-1,sens_to_print),
88
- (0,1),
89
- (measurements_rot.shape[2]-5,measurements_rot.shape[2]))
90
- print(80*"-")
91
-
92
- #---------------------------------------------------------------------------
93
- plot_field = "disp_x"
94
-
95
- if plot_field == "disp_x":
96
- pv_plot = pyvale.plot_point_sensors_on_sim(disp_sensors_rot,"disp_x")
97
- pv_plot.show(cpos="xy")
98
- elif plot_field == "disp_y":
99
- pv_plot = pyvale.plot_point_sensors_on_sim(disp_sensors_rot,"disp_y")
100
- pv_plot.show(cpos="xy")
101
-
102
- (fig,ax) = pyvale.plot_time_traces(disp_sensors_norot,plot_field)
103
- ax.set_title("No rotation")
104
- (fig,ax) = pyvale.plot_time_traces(disp_sensors_rot,plot_field)
105
- ax.set_title("Rotated")
106
- plt.show()
107
-
108
-
109
- if __name__ == "__main__":
110
- main()
@@ -1,157 +0,0 @@
1
- pyvale/__init__.py,sha256=PqkK7XYVq-fU1Ru6qCM7TsvhU9clsFUpOBJn-VrNO58,2647
2
- pyvale/core/__init__.py,sha256=s5K8rchT4t5ZDL-Oanu_1tZNGJeDhG401_lVVdt_zz4,273
3
- pyvale/core/analyticmeshgen.py,sha256=aPtZoxsqtC1eWRnIVJ_jGPLoo0T8PhiB7LstxA2HMpM,1865
4
- pyvale/core/analyticsimdatafactory.py,sha256=nild0oc9-JQkqhAJvR9q1JE2RVGiI-s0XdeBr8c4yUs,1953
5
- pyvale/core/analyticsimdatagenerator.py,sha256=40UW3lV60WP5iXDQQ0gnxXQ18XnBO8gTrR3h6NXX1Q4,6036
6
- pyvale/core/camera.py,sha256=RAKalMlanzHM7Q4kKKIhqKVOVzKMUaexhPhI4WF6Q70,5362
7
- pyvale/core/cameradata.py,sha256=rbS8BJ-4F5T51o9D3YxFa2cWiXxq7nK4SpKwueEjKu4,2036
8
- pyvale/core/cameradata2d.py,sha256=Xy9pVQ71y3oHfyMa-w7vU4fnryLCdsSFPdc5FJZK2aI,2678
9
- pyvale/core/cameratools.py,sha256=Vf9-3kXsvd_TK-imzp0iXcc6ClkozeZ3Y89wOUmP_II,13482
10
- pyvale/core/dataset.py,sha256=GMuAKbvBGHdGwq0GEdPsO9hdu2e8f4Z4gpb1wGEbvkw,9681
11
- pyvale/core/errorcalculator.py,sha256=My1a_-oThNPYxFa3sT188GT1I7dExKhrD6AnWz4S2IU,3497
12
- pyvale/core/errordriftcalc.py,sha256=aW8-wRfohIWZt-rklXpeLMuZrqbWQgut7vYoHi-O_ig,4474
13
- pyvale/core/errorintegrator.py,sha256=JOkDE-vGm0Ibz_Tbxj-l6Oqp6_kCYNDuAnvc80rL7B8,14103
14
- pyvale/core/errorrand.py,sha256=rVmnB9zLhtpvh9v4DEFYvFujycRWWHAgmhEl2r0czeM,22667
15
- pyvale/core/errorsysdep.py,sha256=9gRjaxAJGIcqvGKrYlUleu9tzAviguTLND8GcNH6DvY,11816
16
- pyvale/core/errorsysfield.py,sha256=oLG2XxqitrrRUgf70IS5Jau0fmAtekJsL9bkdd_glAA,16799
17
- pyvale/core/errorsysindep.py,sha256=Ci5clfG-FpE6UZzvDZYAeAynn9V9luLQB19XJkc7xvA,33988
18
- pyvale/core/experimentsimulator.py,sha256=TNawo8YEQ-4u8JeD3o2HNfzrEW9hafcdFcLbQubG7_s,3579
19
- pyvale/core/field.py,sha256=WPAyA2SRyGsjvaTGUDYR4w8ia3_tNveb1-AV-xucVSA,4624
20
- pyvale/core/fieldconverter.py,sha256=4WucIzpvlHYCN53mkIQP9zTgHvlBBuknNTN9aYqpbjM,5517
21
- pyvale/core/fieldsampler.py,sha256=6uRTitrkM0y2PpfwjIbwuSdVdo7QfEFrw8O06GOH8pI,4459
22
- pyvale/core/fieldscalar.py,sha256=J50DFLbTrj6L4QTOwuxHRfxsQAac2nTphY6uRhJ4Xvc,5970
23
- pyvale/core/fieldtensor.py,sha256=coIPVI1zjm-mCdrriD-kg8UmQqj9-3bdcDrnFM5sz-8,8276
24
- pyvale/core/fieldtransform.py,sha256=VGwY2Oox879iK47xI20iEuaAAQMvtSD9LwpLcZACjlI,17863
25
- pyvale/core/fieldvector.py,sha256=p5NQsZElpAYUuabSXGj0N-4cBjBBQn8d2bwwU5Z9Aek,7988
26
- pyvale/core/generatorsrandom.py,sha256=IUu4kSAtIsiUAzQPVflU0IBeJjyWdWPJ7pKz8t2WUGs,18393
27
- pyvale/core/imagedef2d.py,sha256=NG46-NT1vCo_c-LuwVjSlRF0hUYr6da5jp56bjed-Ro,25073
28
- pyvale/core/integratorfactory.py,sha256=-FmP9Pk5GclHXjXEsosILUferNPnnT6tGX2AaFHrGb8,9651
29
- pyvale/core/integratorquadrature.py,sha256=5Znz33T4JkgZNxwPz-fdsZ-JDLknmkLl5sux4SJq7lY,6709
30
- pyvale/core/integratorrectangle.py,sha256=PNWqU9SNXayltpPrfn4249Aqb0DJv8uz6IoDneQl78s,2951
31
- pyvale/core/integratorspatial.py,sha256=tinYZv5EjrzixXiRJQ_xqXKWfwOUtb7DPAFbpbrL2qQ,3225
32
- pyvale/core/integratortype.py,sha256=hoEt8UPbuJeiBxcGdwo3N9rHIYFF4tX2rIj6jcJXzhI,1305
33
- pyvale/core/optimcheckfuncs.py,sha256=Xw0QbZPnc_5tIlb1j5ePIfyA5n1FZ-rm4S-dYFsnnYM,4196
34
- pyvale/core/raster.py,sha256=4gY6DautLivikSyDgGfgaMcYhp3OQRljoGQKjorodgA,784
35
- pyvale/core/rastercy.py,sha256=jfh8OuFlrnNzKL2-eDxgcDAq_DrFjbVoWOM8-QVM1KU,2891
36
- pyvale/core/rasternp.py,sha256=oWtU8kUTVragGdrDoVYrNpbO3-ONE6iI_f0smdl_iP8,26010
37
- pyvale/core/rendermesh.py,sha256=RkYuygr9VIa3I_-fHGp26Exup9VbDbRfcK0ObL6VwkQ,5601
38
- pyvale/core/sensorarray.py,sha256=mwWrmMb07eX1eKR_XGP-uK1adyP3Jy65moAHMg9zE8A,7025
39
- pyvale/core/sensorarrayfactory.py,sha256=6GYIJR1s0YnEjD2YSTnPKVG-TQIU8_ojUSctcMq8cUk,8353
40
- pyvale/core/sensorarraypoint.py,sha256=oybgwykzuzStH62zmy19P9TFKGMMFiyfS0SoR2i4wu4,11263
41
- pyvale/core/sensordata.py,sha256=dAI7IGINGHKbOGw60eqOpQWH7rJaMjzXIG9Ft1O19FE,2770
42
- pyvale/core/sensordescriptor.py,sha256=g6TJgteMZGDb_ruDnAoYOLrh0uAHpUeklEu-gfaaxFY,2960
43
- pyvale/core/sensortools.py,sha256=aLnWZUbat0SJVz2beDuoLlKNlHfL9mdCRR4ffHFAO9g,5737
44
- pyvale/core/visualexpplotter.py,sha256=1_b4f4feXrbmvAi3x_oV74bJfapktT1-oHKQIMq2X8w,6029
45
- pyvale/core/visualimagedef.py,sha256=21usk59QjrAgGc4rM6K-qqPYlIoFhdfLu3trL1O0EL8,2732
46
- pyvale/core/visualimages.py,sha256=krA5tGlqgXn_88cFgA2xgONVtzlNXHZzg9TKwdHlc_8,2854
47
- pyvale/core/visualopts.py,sha256=9utGwztzwRy_XDzqW-Fgr9KruDtfWT4gI5JU020OX_o,4730
48
- pyvale/core/visualsimanimator.py,sha256=LLO1HcdrNbbyH4cjXJYIiBKtPo17q1Dfpyeeq-tZi_0,3225
49
- pyvale/core/visualsimplotter.py,sha256=PthkhhvRCVRvFuMAHXjoNfVDGU-wZ7A1DyWMp-bOIAM,6829
50
- pyvale/core/visualtools.py,sha256=uuE8U0W39Iwb0ImBZWu5JsnQ0Vr9U45HQMa3-Iy1Wjw,2983
51
- pyvale/core/visualtraceplotter.py,sha256=ldN8qLvAcyGikaxIZPe2-L4LgO-HETgCQSqDUx03H6E,10511
52
- pyvale/core/cython/rastercyth.c,sha256=Enq3RciGDUqfPubatA08eTcdTY-MUMXNT4ZgpBp8zd8,1225306
53
- pyvale/core/cython/rastercyth.py,sha256=BXIDdta-ofIPiYB1Dt9i3BSa0B0vcuqwNxIJuon5geI,24377
54
- pyvale/data/__init__.py,sha256=s5K8rchT4t5ZDL-Oanu_1tZNGJeDhG401_lVVdt_zz4,273
55
- pyvale/data/case13_out.e,sha256=cqgs7TbyDtrlV4AxXUzULa0Qu50gbp_3VeQkehNT82g,150820
56
- pyvale/data/case16_out.e,sha256=hmkiJQo4phaAPiEa9mgjggcUMn_yY2h348DSqMIj0pA,11614464
57
- pyvale/data/case17_out.e,sha256=C5Zx0Xx8_iZqypPFbcutGPQtO5VNQaJmqg9YxWi0FHc,6095004
58
- pyvale/data/case18_1_out.e,sha256=4ITunHIxCBCekUPipSv8j7IKDlhlwTaHe1e3wTN4qLE,1470776
59
- pyvale/data/case18_2_out.e,sha256=Uz8U1TMBSe1YkRE4nRFMQ38Y11UQo9wb1cIbTRPua1Y,1470776
60
- pyvale/data/case18_3_out.e,sha256=8dTnKLQOSCL-gle-1shL68GBQPW1go05aDvjO6AawAg,1470776
61
- pyvale/data/case25_out.e,sha256=LWnCKG7GDUvzCs7GI1h25dhIhq6_qJgXnkhiTmdynPw,93748
62
- pyvale/data/case26_out.e,sha256=UAoxPN0K1bbk9R0r2hDehuQZVCPHcAV5NA1PckRyXDY,225744
63
- pyvale/data/optspeckle_2464x2056px_spec5px_8bit_gblur1px.tiff,sha256=cRmbiTzxc8QJ_aO9dc7YT21lV1c9K7pH-L9uQZvUQ8M,5046422
64
- pyvale/examples/__init__.py,sha256=s5K8rchT4t5ZDL-Oanu_1tZNGJeDhG401_lVVdt_zz4,273
65
- pyvale/examples/ex1_1_thermal2d.py,sha256=AmlYnr5_IcGK8J--R3LcLlrj6p9JW7SR_WtC5ks-iVo,3407
66
- pyvale/examples/ex1_2_thermal2d.py,sha256=8FmN_XpowxtKqX6sZJnRvSdMETaft9yp-t1oHLRbmtQ,3932
67
- pyvale/examples/ex1_3_thermal2d.py,sha256=f6sS821VrIv8ORDXjl8xVH8wP7mvcRWPtNy4wAgWVpo,4058
68
- pyvale/examples/ex1_4_thermal2d.py,sha256=8JnBKAKqOJcdg2SHd2U8dES2087CiFamE_oZaI0ifi8,3085
69
- pyvale/examples/ex1_5_thermal2d.py,sha256=HeSABfbtPLfQQ0ywicJdN5nzJqpVh98mmQrBpIjt0NM,3964
70
- pyvale/examples/ex2_1_thermal3d .py,sha256=pYXoYtVYUwu650YWx1z-U8tquVrbU7J-2Ev35nQD2gc,3299
71
- pyvale/examples/ex2_2_thermal3d.py,sha256=1oH4xmFo-6hpBka0wCzVzr1x7G2XgYRbn_ndhMnAgEY,1674
72
- pyvale/examples/ex2_3_thermal3d.py,sha256=CKPTyLHhWzqvUsTNNshTnN6AL7I1_ZUSdkmsWOuOTu4,3560
73
- pyvale/examples/ex3_1_displacement2d.py,sha256=0utwxMuVqLFXd6-k9bWRa7PXfR5YJq-A_F7dPtNS5nE,1619
74
- pyvale/examples/ex3_2_displacement2d.py,sha256=Qwf9S95pFtl8pHff3LGovzYmM6o-eMBCAzcCEzDBw9g,2636
75
- pyvale/examples/ex3_3_displacement2d.py,sha256=3sAPV-ycdssqFLs6q__op0RWqHK9gB83SZOpYH4vclU,3649
76
- pyvale/examples/ex3_4_displacement2d.py,sha256=H99FecuNCFgLaeYDD_CZdO5DlfHQ9xq2vS50jih6VBg,3991
77
- pyvale/examples/ex4_1_strain2d.py,sha256=444MYF3J6dDIbLT5RGNAWnGI_2QP7hZoe6ScVrOIkco,1932
78
- pyvale/examples/ex4_2_strain2d.py,sha256=mGoFLAIiimaQHSh7xWnup9urz1aS6IqxzOUo-BUrrZs,2734
79
- pyvale/examples/ex4_3_strain2d.py,sha256=G4Nw6PjpPOfbgZvWgQV4xg_wJvSwGUj7TUyCE5lXuKs,3518
80
- pyvale/examples/ex5_1_multiphysics2d.py,sha256=UbRDLwvJbpMmq2VdiHuG9jZdvdqMtM3X_Af0dGJhkps,2837
81
- pyvale/examples/ex6_1_multiphysics2d_expsim.py,sha256=NSH-U4l_3DQMtEHBPTYa37QiRFFsiC3zO7hCZk17-DU,4336
82
- pyvale/examples/ex6_2_multiphysics3d_expsim.py,sha256=Dem29f6j7uRFQfdn4TYK_t7ALoY9v20yI9tjwAnXIBI,5916
83
- pyvale/examples/analyticdatagen/__init__.py,sha256=s5K8rchT4t5ZDL-Oanu_1tZNGJeDhG401_lVVdt_zz4,273
84
- pyvale/examples/analyticdatagen/ex1_1_scalarvisualisation.py,sha256=X8OaNz1bYSiFVj7AZP1u8w7r0T0yTST8C5gHpzf1nE4,973
85
- pyvale/examples/analyticdatagen/ex1_2_scalarcasebuild.py,sha256=iXY9wqoBUCaDwkLH1zMahxefsvX3TBbPjSrPGYUiuGQ,1317
86
- pyvale/examples/analyticdatagen/ex2_1_analyticsensors.py,sha256=ln5U4g7XP-oLvtoAhAH_ombM01czEiPeG6pmzGVpyTc,2889
87
- pyvale/examples/features/__init__.py,sha256=s5K8rchT4t5ZDL-Oanu_1tZNGJeDhG401_lVVdt_zz4,273
88
- pyvale/examples/features/ex_animation_tools_3dmonoblock.py,sha256=4gNCiX831iankXOZrf_uji4iciRryhiFcaBUUSArvGc,2940
89
- pyvale/examples/features/ex_area_avg.py,sha256=rNuwLwQwEikZ9Hz8i2AQPqsN8EY8mOTi73f8LDEgCf8,3110
90
- pyvale/examples/features/ex_calibration_error.py,sha256=CoB2HulJ68XH7K1p6sQSCjKzRsjlUspcu2ELijvB3f8,3566
91
- pyvale/examples/features/ex_chain_field_errs.py,sha256=BfkwFm9u8iZQfqtmvdZB7qMZzSTexvsKOkxkDREhf1M,4993
92
- pyvale/examples/features/ex_field_errs.py,sha256=80w8GOpMS_NXay9XinNCx5XsPqwzPVzFWZJRZXm2Iq4,2762
93
- pyvale/examples/features/ex_sensor_single_angle_batch.py,sha256=oiLKI46PBpluJXRBC9TUaEm709Wknqv-o0To1tY--tc,4295
94
- pyvale/examples/imagedef2d/ex_imagedef2d_todisk.py,sha256=zA5EE_hq1ZeZijV6mpppqp14tH1VCjgo6m1MHVH2k2k,3039
95
- pyvale/examples/rasterisation/ex_rastenp.py,sha256=AZnFx7g0m6LJqSLsPgoMzHdHvS-jH2AEsj33_GHG8Bk,4849
96
- pyvale/examples/rasterisation/ex_rastercyth_oneframe.py,sha256=RXfHecn-4qIEszJ2x8F33LRQuUTgE_P-MY6G4DE_UJE,7439
97
- pyvale/examples/rasterisation/ex_rastercyth_static_cypara.py,sha256=M8RqQLo0dBlqCvLny3G3Ir3tPVVBacpwYt_YSwsVrGQ,6953
98
- pyvale/examples/rasterisation/ex_rastercyth_static_pypara.py,sha256=fBNJi6b8EFDah5dOr3eSUA-4hblFJJ13Dy5p68AVW3I,6931
99
- pyvale/simcases/case00_HEX20.i,sha256=nxYk6_N2t3Xyfsi0tXDuqBuaN55ySlytCVswzunTi1M,5209
100
- pyvale/simcases/case00_HEX27.i,sha256=11XkgwGB8fmYiw8bJMrRTkoeq-5qZXER91o62DT__bs,5209
101
- pyvale/simcases/case00_TET10.i,sha256=sDCznjavre3lw08vaL_fFHdO8Qk_Ohp7pHR4zy2RhME,5209
102
- pyvale/simcases/case00_TET14.i,sha256=U4QJY2IxRmJ5OC2gayN0VtKiHeWH0ySwSVLKbTte4t4,5209
103
- pyvale/simcases/case01.i,sha256=R6t_uui6DywA1m5HLt4EsdkGDzobpGrfxBrfIY-5YiI,2184
104
- pyvale/simcases/case02.i,sha256=gOPdUDVDnMUgqevcRO7vT5HnXTY64a7rmugSgkUqQ0s,3406
105
- pyvale/simcases/case03.i,sha256=6LkfehTSTXuJ390mdn6tYp2Tkgo15KVpGmFmBrHo-AA,2848
106
- pyvale/simcases/case04.i,sha256=Ao5z2qey2eJrqW1TmCm6LZRDeTwPTOFtMNPocH4zQO4,3757
107
- pyvale/simcases/case05.i,sha256=VO2D38xsUrZmEMuEJF6JzjF_InpGAdrf9y_5FhvvvDw,5959
108
- pyvale/simcases/case06.i,sha256=DLMHzOp3Kgu4EIXSg58Ltz4NRVTPC-dZbJp-g-vY3Uo,7298
109
- pyvale/simcases/case07.geo,sha256=DxJjqex1zlQewGEcr_JiwbHSDczhOi-34ogvwAFfx_Q,4442
110
- pyvale/simcases/case07.i,sha256=73YrdZUAGCddorbBBxY-oK0tLOw12lISYR5xzzi3ddc,1921
111
- pyvale/simcases/case08.geo,sha256=d9QEIzMRRXynWOAHx07i8RxTA-uvKNVvpMAEBVZamKs,4795
112
- pyvale/simcases/case08.i,sha256=G4MqwcZWAaKcXD3toDNtaghbJ3rxiZHWvL-zT6n021Y,3253
113
- pyvale/simcases/case09.geo,sha256=zW9w_MQlfdbzXat7XfttiAP5HKIo6aCnUBWyGd8SlQQ,6858
114
- pyvale/simcases/case09.i,sha256=3tZCH7MtvjE4GPLO-Tsigm8kmvc_Ma8H9kZ2e5wb3uQ,1924
115
- pyvale/simcases/case10.geo,sha256=y4RRENzZyfzUey-wNK3dr448_j7ta70EgxReoaKP2vY,6839
116
- pyvale/simcases/case10.i,sha256=5X7xsgqiXAZDx-q5erxiWg1XOdGlmfD9UZ7i4Lqg-nk,6377
117
- pyvale/simcases/case11.geo,sha256=HDEMxIpANKUrDEgBfokxDohEoVpWMcfAcKJ1Rr8RW8c,10429
118
- pyvale/simcases/case11.i,sha256=f34kuvrDNKjqjiyV0BmCeH3ZDDJFUTtkKmorK4YbAhc,3093
119
- pyvale/simcases/case12.geo,sha256=FQ-Ck1LBsqnV4HDdLbIP1U2cRot7dRBTIlQ1n6GnxgE,12477
120
- pyvale/simcases/case12.i,sha256=N-lJnOenl_PQhhatkjMLhUGNNGKLV0QPjLiWU0QfXGo,7932
121
- pyvale/simcases/case13.i,sha256=q1KLk_S9AC15-ZNV_PydIp2QZsf_EUE1sth6a3t8cG8,3308
122
- pyvale/simcases/case14.i,sha256=-Yq-ecGcs153-t-fHNM4kWBR3d4_joxmM7WAnm4O57w,3502
123
- pyvale/simcases/case15.geo,sha256=Sgat1JQJeBCaSlGEEJ1o_WSZMpLpDkbhIrTaUKDiRX4,10429
124
- pyvale/simcases/case15.i,sha256=88TAhiFxU9jGKnxJu8Ne4pWnbh9pHKkzSs0e0IjfUDM,3187
125
- pyvale/simcases/case16.geo,sha256=SHB_GMofxN6WYq8JZ1Ktm8B8F_0L7K5hu4-DHtm3CX4,12554
126
- pyvale/simcases/case16.i,sha256=TJDlkIcdQz2JypfVDobYXg6N86rk03w-AUlIdWV1l7s,8758
127
- pyvale/simcases/case17.geo,sha256=lBMnrWGnYYivRqOIg5hfExRVr_jRjs1Zd9-f_ugitwA,4442
128
- pyvale/simcases/case17.i,sha256=G0o57umdzOkzWoroREpV1IH6DA8QM2zAhdemul6-Y7w,3056
129
- pyvale/simcases/case18.i,sha256=W3Hu6wwWCwOzxwZFmEB2tMlQ1VeCrs-r8erdbFWrqd0,6292
130
- pyvale/simcases/case18_1.i,sha256=W3Hu6wwWCwOzxwZFmEB2tMlQ1VeCrs-r8erdbFWrqd0,6292
131
- pyvale/simcases/case18_2.i,sha256=9Y2F3FCrLUJ78cP95CUKvsdCWGkWQLZbcqQ_WbeWPVs,6292
132
- pyvale/simcases/case18_3.i,sha256=0K1IDUiK1WSjWJOpJi7hvUqJApFD4Z0m9JkCkivAevM,6292
133
- pyvale/simcases/case19.geo,sha256=nT1Hch8Llv96z3QAPYqzpzIlaV01xXf1sozuA-m0-7I,9102
134
- pyvale/simcases/case19.i,sha256=jRDSAWaC-bTxCeFgSyj1gapbo6iqteySuPR5QhPLKqo,2191
135
- pyvale/simcases/case20.geo,sha256=TKBX8JKDwXKyXfXCi6fmOzDV_7_1Kpfpne9yeute11o,9102
136
- pyvale/simcases/case20.i,sha256=wAQGXJbY_VniZPG-PzeL5-Sk6_ZUiwuf8zRV3c8nEz0,6655
137
- pyvale/simcases/case21.geo,sha256=AzFNKkQp7-a9PojtR4y0GNI6g12BLvTRvkHDglYPRFQ,2387
138
- pyvale/simcases/case21.i,sha256=QjKU97PMsswLkaGkutC7gdJhGY8lRq5VEf5b-gRhT4E,3417
139
- pyvale/simcases/case22.geo,sha256=3OHJhFTm9P_G6vIB9fqgcpeT1DQt5xq5tWxOsRhvj2A,2491
140
- pyvale/simcases/case22.i,sha256=b3IeO0hs4IU0PJlS_MIkF1gtPkKYQXklfNs5rhy9KNc,3189
141
- pyvale/simcases/case23.geo,sha256=53NyuNJrPBgUWRHhgz0zS2fCZ8lavn_flpnfLUO2GNY,5448
142
- pyvale/simcases/case23.i,sha256=0sRJTmiieHxb4YBnYH5foJGteQZfn5Fo0Z3TkDuLSoQ,3188
143
- pyvale/simcases/case24.geo,sha256=3qiwipPbwaOjmPySISOZycYKdXCSDFrQpccnXHWhiU0,2408
144
- pyvale/simcases/case24.i,sha256=6scn1ujqyQ2FUHm30NNZPwTzXD9w7AEDkzbrncah-xQ,2950
145
- pyvale/simcases/case25.geo,sha256=k33GLvsApxTbxDbnOGueA3rTIazqcgYQ5DP37kCAPA4,2492
146
- pyvale/simcases/case25.i,sha256=8lArbbZOCJ4aLuJCaEO5FW1kzJI4JquOmbA-nVpNRRI,2994
147
- pyvale/simcases/case26.geo,sha256=7Qj0siF2FqgElxcmtX_7UDp4tdX6scnJgKffpP6iRQY,5468
148
- pyvale/simcases/case26.i,sha256=V-pS7MeAo9vl3QUDtu-i6MQyeftryxSj0r8n7t6hY0k,2992
149
- pyvale/simcases/run_1case.py,sha256=sueVRRLxBgND0HgnJeWh97BY2aJ65I8U-IM0ve6VHMA,1922
150
- pyvale/simcases/run_all_cases.py,sha256=9b3JYcxC8PA2CR-htum7wCICwwnLNeC01xAhk0m6yxw,1903
151
- pyvale/simcases/run_build_case.py,sha256=IlyZC_VU095ayi7nz57xSSboTeJB54y7nsQXpBTUXFM,1938
152
- pyvale/simcases/run_example_cases.py,sha256=l5KOQvPMNRUkJMotaReG2nmrFtVBNWCwKVezNyRwKb0,1910
153
- pyvale-2025.4.0.dist-info/licenses/LICENSE,sha256=h2qWsRIazuLLhALyUsCP6aE0DFcswL9SSSt9sgMzZi4,1099
154
- pyvale-2025.4.0.dist-info/METADATA,sha256=X7fD1kYbYuXFMD-n_f_UM4l1GLuGPLSC5sxt-RcUcP0,6923
155
- pyvale-2025.4.0.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
156
- pyvale-2025.4.0.dist-info/top_level.txt,sha256=u1d_f4iZ3b3_96Rb_zrs9hyrpC4yE5e1Lg6Ey_Wgr0c,7
157
- pyvale-2025.4.0.dist-info/RECORD,,