pyvale 2025.7.2__cp311-cp311-musllinux_1_2_i686.whl → 2025.8.1__cp311-cp311-musllinux_1_2_i686.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 (176) hide show
  1. pyvale/__init__.py +12 -92
  2. pyvale/blender/__init__.py +23 -0
  3. pyvale/{pyvaleexceptions.py → blender/blenderexceptions.py} +0 -3
  4. pyvale/{blenderlightdata.py → blender/blenderlightdata.py} +3 -3
  5. pyvale/{blendermaterialdata.py → blender/blendermaterialdata.py} +1 -1
  6. pyvale/{blenderrenderdata.py → blender/blenderrenderdata.py} +5 -3
  7. pyvale/{blenderscene.py → blender/blenderscene.py} +33 -30
  8. pyvale/{blendertools.py → blender/blendertools.py} +14 -10
  9. pyvale/dataset/__init__.py +7 -0
  10. pyvale/dataset/dataset.py +443 -0
  11. pyvale/dic/__init__.py +20 -0
  12. pyvale/{dic2d.py → dic/dic2d.py} +31 -36
  13. pyvale/dic/dic2dconv.py +6 -0
  14. pyvale/{dic2dcpp.cpython-311-i386-linux-musl.so → dic/dic2dcpp.cpython-311-i386-linux-musl.so} +0 -0
  15. pyvale/{dicdataimport.py → dic/dicdataimport.py} +8 -8
  16. pyvale/{dicregionofinterest.py → dic/dicregionofinterest.py} +1 -1
  17. pyvale/{dicresults.py → dic/dicresults.py} +1 -1
  18. pyvale/{dicstrain.py → dic/dicstrain.py} +9 -9
  19. pyvale/examples/basics/{ex1_1_basicscalars_therm2d.py → ex1a_basicscalars_therm2d.py} +12 -9
  20. pyvale/examples/basics/{ex1_2_sensormodel_therm2d.py → ex1b_sensormodel_therm2d.py} +17 -14
  21. pyvale/examples/basics/{ex1_3_customsens_therm3d.py → ex1c_customsens_therm3d.py} +27 -24
  22. pyvale/examples/basics/{ex1_4_basicerrors_therm3d.py → ex1d_basicerrors_therm3d.py} +32 -29
  23. pyvale/examples/basics/{ex1_5_fielderrs_therm3d.py → ex1e_fielderrs_therm3d.py} +19 -15
  24. pyvale/examples/basics/{ex1_6_caliberrs_therm2d.py → ex1f_caliberrs_therm2d.py} +20 -16
  25. pyvale/examples/basics/{ex1_7_spatavg_therm2d.py → ex1g_spatavg_therm2d.py} +19 -16
  26. pyvale/examples/basics/{ex2_1_basicvectors_disp2d.py → ex2a_basicvectors_disp2d.py} +13 -10
  27. pyvale/examples/basics/{ex2_2_vectorsens_disp2d.py → ex2b_vectorsens_disp2d.py} +19 -15
  28. pyvale/examples/basics/{ex2_3_sensangle_disp2d.py → ex2c_sensangle_disp2d.py} +21 -18
  29. pyvale/examples/basics/{ex2_4_chainfielderrs_disp2d.py → ex2d_chainfielderrs_disp2d.py} +31 -29
  30. pyvale/examples/basics/{ex2_5_vectorfields3d_disp3d.py → ex2e_vectorfields3d_disp3d.py} +21 -18
  31. pyvale/examples/basics/{ex3_1_basictensors_strain2d.py → ex3a_basictensors_strain2d.py} +16 -14
  32. pyvale/examples/basics/{ex3_2_tensorsens2d_strain2d.py → ex3b_tensorsens2d_strain2d.py} +17 -14
  33. pyvale/examples/basics/{ex3_3_tensorsens3d_strain3d.py → ex3c_tensorsens3d_strain3d.py} +25 -22
  34. pyvale/examples/basics/{ex4_1_expsim2d_thermmech2d.py → ex4a_expsim2d_thermmech2d.py} +17 -14
  35. pyvale/examples/basics/{ex4_2_expsim3d_thermmech3d.py → ex4b_expsim3d_thermmech3d.py} +37 -34
  36. pyvale/examples/basics/ex5_nomesh.py +24 -0
  37. pyvale/examples/dic/ex1_2_blenderdeformed.py +174 -0
  38. pyvale/examples/dic/ex1_region_of_interest.py +6 -3
  39. pyvale/examples/dic/ex2_plate_with_hole.py +21 -18
  40. pyvale/examples/dic/ex3_plate_with_hole_strain.py +8 -6
  41. pyvale/examples/dic/ex4_dic_blender.py +17 -15
  42. pyvale/examples/dic/ex5_dic_challenge.py +19 -14
  43. pyvale/examples/genanalyticdata/ex1_1_scalarvisualisation.py +16 -10
  44. pyvale/examples/genanalyticdata/ex1_2_scalarcasebuild.py +3 -3
  45. pyvale/examples/genanalyticdata/ex2_1_analyticsensors.py +29 -23
  46. pyvale/examples/genanalyticdata/ex2_2_analyticsensors_nomesh.py +67 -0
  47. pyvale/examples/imagedef2d/ex_imagedef2d_todisk.py +12 -9
  48. pyvale/examples/mooseherder/ex0_create_moose_config.py +65 -0
  49. pyvale/examples/mooseherder/ex1a_modify_moose_input.py +71 -0
  50. pyvale/examples/mooseherder/ex1b_modify_gmsh_input.py +69 -0
  51. pyvale/examples/mooseherder/ex2a_run_moose_once.py +80 -0
  52. pyvale/examples/mooseherder/ex2b_run_gmsh_once.py +64 -0
  53. pyvale/examples/mooseherder/ex2c_run_both_once.py +114 -0
  54. pyvale/examples/mooseherder/ex3_run_moose_seq_para.py +157 -0
  55. pyvale/examples/mooseherder/ex4_run_gmsh-moose_seq_para.py +176 -0
  56. pyvale/examples/mooseherder/ex5_run_moose_paramulti.py +136 -0
  57. pyvale/examples/mooseherder/ex6_read_moose_exodus.py +163 -0
  58. pyvale/examples/mooseherder/ex7a_read_moose_herd_results.py +153 -0
  59. pyvale/examples/mooseherder/ex7b_read_multi_herd_results.py +116 -0
  60. pyvale/examples/mooseherder/ex7c_read_multi_gmshmoose_results.py +127 -0
  61. pyvale/examples/mooseherder/ex7d_readconfig_multi_gmshmoose_results.py +143 -0
  62. pyvale/examples/mooseherder/ex8_read_existing_sweep_output.py +72 -0
  63. pyvale/examples/renderblender/ex1_1_blenderscene.py +24 -20
  64. pyvale/examples/renderblender/ex1_2_blenderdeformed.py +22 -18
  65. pyvale/examples/renderblender/ex2_1_stereoscene.py +36 -29
  66. pyvale/examples/renderblender/ex2_2_stereodeformed.py +26 -20
  67. pyvale/examples/renderblender/ex3_1_blendercalibration.py +24 -17
  68. pyvale/examples/renderrasterisation/ex_rastenp.py +14 -12
  69. pyvale/examples/renderrasterisation/ex_rastercyth_oneframe.py +14 -15
  70. pyvale/examples/renderrasterisation/ex_rastercyth_static_cypara.py +13 -11
  71. pyvale/examples/renderrasterisation/ex_rastercyth_static_pypara.py +13 -11
  72. pyvale/mooseherder/__init__.py +32 -0
  73. pyvale/mooseherder/directorymanager.py +416 -0
  74. pyvale/mooseherder/exodusreader.py +763 -0
  75. pyvale/mooseherder/gmshrunner.py +163 -0
  76. pyvale/mooseherder/inputmodifier.py +236 -0
  77. pyvale/mooseherder/mooseconfig.py +226 -0
  78. pyvale/mooseherder/mooseherd.py +527 -0
  79. pyvale/mooseherder/mooserunner.py +303 -0
  80. pyvale/mooseherder/outputreader.py +22 -0
  81. pyvale/mooseherder/simdata.py +92 -0
  82. pyvale/mooseherder/simrunner.py +31 -0
  83. pyvale/mooseherder/sweepreader.py +356 -0
  84. pyvale/mooseherder/sweeptools.py +76 -0
  85. pyvale/sensorsim/__init__.py +82 -0
  86. pyvale/{camera.py → sensorsim/camera.py} +7 -7
  87. pyvale/{camerasensor.py → sensorsim/camerasensor.py} +7 -7
  88. pyvale/{camerastereo.py → sensorsim/camerastereo.py} +2 -2
  89. pyvale/{cameratools.py → sensorsim/cameratools.py} +4 -4
  90. pyvale/{cython → sensorsim/cython}/rastercyth.c +596 -596
  91. pyvale/{cython → sensorsim/cython}/rastercyth.cpython-311-i386-linux-musl.so +0 -0
  92. pyvale/{cython → sensorsim/cython}/rastercyth.py +16 -17
  93. pyvale/{errorcalculator.py → sensorsim/errorcalculator.py} +1 -1
  94. pyvale/{errorintegrator.py → sensorsim/errorintegrator.py} +2 -2
  95. pyvale/{errorrand.py → sensorsim/errorrand.py} +4 -4
  96. pyvale/{errorsyscalib.py → sensorsim/errorsyscalib.py} +2 -2
  97. pyvale/{errorsysdep.py → sensorsim/errorsysdep.py} +2 -2
  98. pyvale/{errorsysfield.py → sensorsim/errorsysfield.py} +8 -8
  99. pyvale/{errorsysindep.py → sensorsim/errorsysindep.py} +3 -3
  100. pyvale/sensorsim/exceptions.py +8 -0
  101. pyvale/{experimentsimulator.py → sensorsim/experimentsimulator.py} +23 -3
  102. pyvale/{field.py → sensorsim/field.py} +1 -1
  103. pyvale/{fieldconverter.py → sensorsim/fieldconverter.py} +72 -19
  104. pyvale/sensorsim/fieldinterp.py +37 -0
  105. pyvale/sensorsim/fieldinterpmesh.py +124 -0
  106. pyvale/sensorsim/fieldinterppoints.py +55 -0
  107. pyvale/{fieldsampler.py → sensorsim/fieldsampler.py} +4 -4
  108. pyvale/{fieldscalar.py → sensorsim/fieldscalar.py} +28 -24
  109. pyvale/{fieldtensor.py → sensorsim/fieldtensor.py} +33 -31
  110. pyvale/{fieldvector.py → sensorsim/fieldvector.py} +33 -31
  111. pyvale/{imagedef2d.py → sensorsim/imagedef2d.py} +9 -5
  112. pyvale/{integratorfactory.py → sensorsim/integratorfactory.py} +6 -6
  113. pyvale/{integratorquadrature.py → sensorsim/integratorquadrature.py} +3 -3
  114. pyvale/{integratorrectangle.py → sensorsim/integratorrectangle.py} +3 -3
  115. pyvale/{integratorspatial.py → sensorsim/integratorspatial.py} +1 -1
  116. pyvale/{rastercy.py → sensorsim/rastercy.py} +5 -5
  117. pyvale/{rasternp.py → sensorsim/rasternp.py} +9 -9
  118. pyvale/{rasteropts.py → sensorsim/rasteropts.py} +1 -1
  119. pyvale/{renderer.py → sensorsim/renderer.py} +1 -1
  120. pyvale/{rendermesh.py → sensorsim/rendermesh.py} +5 -5
  121. pyvale/{renderscene.py → sensorsim/renderscene.py} +2 -2
  122. pyvale/{sensorarray.py → sensorsim/sensorarray.py} +1 -1
  123. pyvale/{sensorarrayfactory.py → sensorsim/sensorarrayfactory.py} +12 -12
  124. pyvale/{sensorarraypoint.py → sensorsim/sensorarraypoint.py} +10 -8
  125. pyvale/{sensordata.py → sensorsim/sensordata.py} +1 -1
  126. pyvale/{sensortools.py → sensorsim/sensortools.py} +2 -20
  127. pyvale/sensorsim/simtools.py +174 -0
  128. pyvale/{visualexpplotter.py → sensorsim/visualexpplotter.py} +3 -3
  129. pyvale/{visualimages.py → sensorsim/visualimages.py} +2 -2
  130. pyvale/{visualsimanimator.py → sensorsim/visualsimanimator.py} +4 -4
  131. pyvale/{visualsimplotter.py → sensorsim/visualsimplotter.py} +5 -5
  132. pyvale/{visualsimsensors.py → sensorsim/visualsimsensors.py} +12 -12
  133. pyvale/{visualtools.py → sensorsim/visualtools.py} +1 -1
  134. pyvale/{visualtraceplotter.py → sensorsim/visualtraceplotter.py} +2 -2
  135. pyvale/simcases/case17.geo +3 -0
  136. pyvale/simcases/case17.i +4 -4
  137. pyvale/simcases/run_1case.py +1 -9
  138. pyvale/simcases/run_all_cases.py +1 -1
  139. pyvale/simcases/run_build_case.py +1 -1
  140. pyvale/simcases/run_example_cases.py +1 -1
  141. pyvale/verif/__init__.py +12 -0
  142. pyvale/{analyticsimdatafactory.py → verif/analyticsimdatafactory.py} +2 -2
  143. pyvale/{analyticsimdatagenerator.py → verif/analyticsimdatagenerator.py} +2 -2
  144. pyvale/verif/psens.py +125 -0
  145. pyvale/verif/psensconst.py +18 -0
  146. pyvale/verif/psensmech.py +227 -0
  147. pyvale/verif/psensmultiphys.py +187 -0
  148. pyvale/verif/psensscalar.py +347 -0
  149. pyvale/verif/psenstensor.py +123 -0
  150. pyvale/verif/psensvector.py +116 -0
  151. {pyvale-2025.7.2.dist-info → pyvale-2025.8.1.dist-info}/METADATA +6 -7
  152. pyvale-2025.8.1.dist-info/RECORD +263 -0
  153. pyvale/dataset.py +0 -415
  154. pyvale/simtools.py +0 -67
  155. pyvale-2025.7.2.dist-info/RECORD +0 -215
  156. /pyvale/{blendercalibrationdata.py → blender/blendercalibrationdata.py} +0 -0
  157. /pyvale/{dicchecks.py → dic/dicchecks.py} +0 -0
  158. /pyvale/{dicspecklegenerator.py → dic/dicspecklegenerator.py} +0 -0
  159. /pyvale/{dicspecklequality.py → dic/dicspecklequality.py} +0 -0
  160. /pyvale/{dicstrainresults.py → dic/dicstrainresults.py} +0 -0
  161. /pyvale/{cameradata.py → sensorsim/cameradata.py} +0 -0
  162. /pyvale/{cameradata2d.py → sensorsim/cameradata2d.py} +0 -0
  163. /pyvale/{errordriftcalc.py → sensorsim/errordriftcalc.py} +0 -0
  164. /pyvale/{fieldtransform.py → sensorsim/fieldtransform.py} +0 -0
  165. /pyvale/{generatorsrandom.py → sensorsim/generatorsrandom.py} +0 -0
  166. /pyvale/{imagetools.py → sensorsim/imagetools.py} +0 -0
  167. /pyvale/{integratortype.py → sensorsim/integratortype.py} +0 -0
  168. /pyvale/{output.py → sensorsim/output.py} +0 -0
  169. /pyvale/{raster.py → sensorsim/raster.py} +0 -0
  170. /pyvale/{sensordescriptor.py → sensorsim/sensordescriptor.py} +0 -0
  171. /pyvale/{visualimagedef.py → sensorsim/visualimagedef.py} +0 -0
  172. /pyvale/{visualopts.py → sensorsim/visualopts.py} +0 -0
  173. /pyvale/{analyticmeshgen.py → verif/analyticmeshgen.py} +0 -0
  174. {pyvale-2025.7.2.dist-info → pyvale-2025.8.1.dist-info}/WHEEL +0 -0
  175. {pyvale-2025.7.2.dist-info → pyvale-2025.8.1.dist-info}/licenses/LICENSE +0 -0
  176. {pyvale-2025.7.2.dist-info → pyvale-2025.8.1.dist-info}/top_level.txt +0 -0
@@ -16,8 +16,11 @@ Test case: Scalar field point sensors (thermocouples) on a 2D thermal simulation
16
16
 
17
17
  import numpy as np
18
18
  import matplotlib.pyplot as plt
19
- import mooseherder as mh
20
- import pyvale as pyv
19
+
20
+ # Pyvale imports
21
+ import pyvale.mooseherder as mh
22
+ import pyvale.sensorsim as sens
23
+ import pyvale.dataset as dataset
21
24
 
22
25
  #%%
23
26
  # First we are going to build a custom sensor array so we can control how
@@ -29,16 +32,16 @@ import pyvale as pyv
29
32
  # area averaged without and area averaging error. The first part of this is
30
33
  # the same as the 3D thermal example we have used previously then we control
31
34
  # the area averaging using the sensor data object.
32
- data_path = pyv.DataSet.thermal_2d_path()
35
+ data_path = dataset.thermal_2d_path()
33
36
  sim_data = mh.ExodusReader(data_path).read_all_sim_data()
34
- sim_data = pyv.scale_length_units(scale=1000.0,
37
+ sim_data = sens.scale_length_units(scale=1000.0,
35
38
  sim_data=sim_data,
36
39
  disp_comps=None)
37
40
 
38
- descriptor = pyv.SensorDescriptorFactory.temperature_descriptor()
41
+ descriptor = sens.SensorDescriptorFactory.temperature_descriptor()
39
42
 
40
43
  field_key = "temperature"
41
- t_field = pyv.FieldScalar(sim_data,
44
+ t_field = sens.FieldScalar(sim_data,
42
45
  field_key=field_key,
43
46
  elem_dims=2)
44
47
 
@@ -46,7 +49,7 @@ n_sens = (4,1,1)
46
49
  x_lims = (0.0,100.0)
47
50
  y_lims = (0.0,50.0)
48
51
  z_lims = (0.0,0.0)
49
- sens_pos = pyv.create_sensor_pos_array(n_sens,x_lims,y_lims,z_lims)
52
+ sens_pos = sens.create_sensor_pos_array(n_sens,x_lims,y_lims,z_lims)
50
53
 
51
54
  sample_times = np.linspace(0.0,np.max(sim_data.time),50) # | None
52
55
 
@@ -59,15 +62,15 @@ sample_times = np.linspace(0.0,np.max(sim_data.time),50) # | None
59
62
  # additional integration point requires an additional interpolation of the
60
63
  # physical field.
61
64
  sensor_dims = np.array([20.0,20.0,0]) # units = mm
62
- sensor_data = pyv.SensorData(positions=sens_pos,
65
+ sensor_data = sens.SensorData(positions=sens_pos,
63
66
  sample_times=sample_times,
64
- spatial_averager=pyv.EIntSpatialType.QUAD4PT,
67
+ spatial_averager=sens.EIntSpatialType.QUAD4PT,
65
68
  spatial_dims=sensor_dims)
66
69
 
67
70
  #%%
68
71
  # We have added spatial averaging to our sensor data so we can now create
69
72
  # our sensor array as we have done in previous examples.
70
- tc_array = pyv.SensorArrayPoint(sensor_data,
73
+ tc_array = sens.SensorArrayPoint(sensor_data,
71
74
  t_field,
72
75
  descriptor)
73
76
 
@@ -75,8 +78,8 @@ tc_array = pyv.SensorArrayPoint(sensor_data,
75
78
  # We are also going to create a field error that includes area averaging as
76
79
  # an error. We do this by adding the option to our field error data class
77
80
  # specifying rectangular integration with 1 point.
78
- area_avg_err_data = pyv.ErrFieldData(
79
- spatial_averager=pyv.EIntSpatialType.RECT1PT,
81
+ area_avg_err_data = sens.ErrFieldData(
82
+ spatial_averager=sens.EIntSpatialType.RECT1PT,
80
83
  spatial_dims=np.array((5.0,5.0)),
81
84
  )
82
85
 
@@ -85,9 +88,9 @@ area_avg_err_data = pyv.ErrFieldData(
85
88
  # with any of our other error models but we will isolate it for now so we
86
89
  # can see what it does.
87
90
  err_chain = []
88
- err_chain.append(pyv.ErrSysField(t_field,
91
+ err_chain.append(sens.ErrSysField(t_field,
89
92
  area_avg_err_data))
90
- error_int = pyv.ErrIntegrator(err_chain,
93
+ error_int = sens.ErrIntegrator(err_chain,
91
94
  sensor_data,
92
95
  tc_array.get_measurement_shape())
93
96
  tc_array.set_error_integrator(error_int)
@@ -107,11 +110,11 @@ time_print = slice(measurements.shape[2]-time_last,measurements.shape[2])
107
110
  print(f"These are the last {time_last} virtual measurements of sensor "
108
111
  + f"{sens_print}:")
109
112
 
110
- pyv.print_measurements(tc_array,sens_print,comp_print,time_print)
113
+ sens.print_measurements(tc_array,sens_print,comp_print,time_print)
111
114
 
112
115
  print(80*"-")
113
116
 
114
- pyv.plot_time_traces(tc_array,field_key)
117
+ sens.plot_time_traces(tc_array,field_key)
115
118
  plt.show()
116
119
 
117
120
  #%%
@@ -20,8 +20,11 @@ Test case: point displacement sensors on a 2D plate with hole loaded in tension
20
20
  """
21
21
 
22
22
  import matplotlib.pyplot as plt
23
- import mooseherder as mh
24
- import pyvale as pyv
23
+
24
+ # Pyvale imports
25
+ import pyvale.mooseherder as mh
26
+ import pyvale.sensorsim as sens
27
+ import pyvale.dataset as dataset
25
28
 
26
29
  #%%
27
30
  # Here we load a pre-packaged dataset from pyvale that is the output of a
@@ -29,7 +32,7 @@ import pyvale as pyv
29
32
  # rectangular plate with a central hole that is loaded in tension (we will
30
33
  # see a visualisation of the mesh and results later). We use `mooseherder` to
31
34
  # load the exodus file into a `SimData` object.
32
- data_path = pyv.DataSet.mechanical_2d_path()
35
+ data_path = dataset.mechanical_2d_path()
33
36
  sim_data = mh.ExodusReader(data_path).read_all_sim_data()
34
37
 
35
38
  #%%
@@ -38,7 +41,7 @@ sim_data = mh.ExodusReader(data_path).read_all_sim_data()
38
41
  # the variable names you have in your SimData object.
39
42
  field_name = "disp"
40
43
  field_comps = ("disp_x","disp_y")
41
- sim_data = pyv.scale_length_units(scale=1000.0,
44
+ sim_data = sens.scale_length_units(scale=1000.0,
42
45
  sim_data=sim_data,
43
46
  disp_comps=field_comps)
44
47
 
@@ -53,11 +56,11 @@ n_sens = (2,3,1)
53
56
  x_lims = (0.0,100.0)
54
57
  y_lims = (0.0,150.0)
55
58
  z_lims = (0.0,0.0)
56
- sens_pos = pyv.create_sensor_pos_array(n_sens,x_lims,y_lims,z_lims)
59
+ sens_pos = sens.create_sensor_pos_array(n_sens,x_lims,y_lims,z_lims)
57
60
 
58
- sens_data = pyv.SensorData(positions=sens_pos)
61
+ sens_data = sens.SensorData(positions=sens_pos)
59
62
 
60
- disp_sens_array = pyv.SensorArrayFactory \
63
+ disp_sens_array = sens.SensorArrayFactory \
61
64
  .disp_sensors_basic_errs(sim_data,
62
65
  sens_data,
63
66
  elem_dims=2,
@@ -92,7 +95,7 @@ time_print = slice(measurements.shape[2]-time_last,measurements.shape[2])
92
95
  print(f"These are the last {time_last} virtual measurements of sensor "
93
96
  + f"{sens_print}:")
94
97
 
95
- pyv.print_measurements(disp_sens_array,sens_print,comp_print,time_print)
98
+ sens.print_measurements(disp_sens_array,sens_print,comp_print,time_print)
96
99
 
97
100
  print(80*"-")
98
101
 
@@ -101,13 +104,13 @@ print(80*"-")
101
104
  # simulation mesh and visulise the sensor locations with respect to these
102
105
  # fields.
103
106
  for ff in field_comps:
104
- pv_plot = pyv.plot_point_sensors_on_sim(disp_sens_array,ff)
107
+ pv_plot = sens.plot_point_sensors_on_sim(disp_sens_array,ff)
105
108
  pv_plot.show(cpos="xy")
106
109
 
107
110
  #%%
108
111
  # We can also plot the traces for each component of the displacement field.
109
112
  for ff in field_comps:
110
- pyv.plot_time_traces(disp_sens_array,ff)
113
+ sens.plot_time_traces(disp_sens_array,ff)
111
114
 
112
115
  plt.show()
113
116
 
@@ -19,18 +19,22 @@ Test case: point displacement sensors on a 2D plate with hole loaded in tension
19
19
 
20
20
  import numpy as np
21
21
  import matplotlib.pyplot as plt
22
- import mooseherder as mh
23
- import pyvale as pyv
22
+
23
+ # Pyvale imports
24
+ import pyvale.mooseherder as mh
25
+ import pyvale.sensorsim as sens
26
+ import pyvale.dataset as dataset
27
+
24
28
 
25
29
 
26
30
  #%%
27
31
  # First we load the same 2D solid mechanics simulation we had previously as
28
32
  # a `SimData` object and then we scale everything to millimeters.
29
- data_path = pyv.DataSet.mechanical_2d_path()
33
+ data_path = dataset.mechanical_2d_path()
30
34
  sim_data = mh.ExodusReader(data_path).read_all_sim_data()
31
35
  field_name = "disp"
32
36
  field_comps = ("disp_x","disp_y")
33
- sim_data = pyv.scale_length_units(scale=1000.0,
37
+ sim_data = sens.scale_length_units(scale=1000.0,
34
38
  sim_data=sim_data,
35
39
  disp_comps=field_comps)
36
40
 
@@ -45,25 +49,25 @@ sim_data = pyv.scale_length_units(scale=1000.0,
45
49
  # parameter does not need to match the number of field components. For
46
50
  # example: it is possible to have a surface mesh (elem_dims=2) where we
47
51
  # have all 3 components of the displacement field.
48
- disp_field = pyv.FieldVector(sim_data,field_name,field_comps,elem_dims=2)
52
+ disp_field = sens.FieldVector(sim_data,field_name,field_comps,elem_dims=2)
49
53
 
50
54
  #%%
51
55
  # As we saw previously for scalar fields we define our sensor data object
52
56
  # which determines how many point sensors we have and their sampling times.
53
57
  # For vector field sensors we can also define the sensor orientation here
54
58
  # which we will demonstrate in the next example.
55
- n_sens = (2,3,1)
59
+ n_sens = (1,4,1)
56
60
  x_lims = (0.0,100.0)
57
61
  y_lims = (0.0,150.0)
58
62
  z_lims = (0.0,0.0)
59
- sens_pos = pyv.create_sensor_pos_array(n_sens,x_lims,y_lims,z_lims)
63
+ sens_pos = sens.create_sensor_pos_array(n_sens,x_lims,y_lims,z_lims)
60
64
 
61
65
  #%%
62
66
  # We set custom sampling times here but we could also set this to None so
63
67
  # that the sensors sample at the simulation time steps.
64
68
  sample_times = np.linspace(0.0,np.max(sim_data.time),50)
65
69
 
66
- sens_data = pyv.SensorData(positions=sens_pos,
70
+ sens_data = sens.SensorData(positions=sens_pos,
67
71
  sample_times=sample_times)
68
72
 
69
73
  #%%
@@ -71,7 +75,7 @@ sens_data = pyv.SensorData(positions=sens_pos,
71
75
  # sensor which will be used for labelling sensor placement visualisation or
72
76
  # for time traces. It is also possible to use the sensor descriptor factory
73
77
  # to get the same sensor descriptor object with these defaults.
74
- descriptor = pyv.SensorDescriptor(name="Disp.",
78
+ descriptor = sens.SensorDescriptor(name="Disp.",
75
79
  symbol=r"u",
76
80
  units=r"mm",
77
81
  tag="DS",
@@ -81,7 +85,7 @@ descriptor = pyv.SensorDescriptor(name="Disp.",
81
85
  # The point sensor array class is generic and will take any field class
82
86
  # that implements the field interface. So here we just pass in the vector
83
87
  # field to create our vector field sensor array.
84
- disp_sens_array = pyv.SensorArrayPoint(sens_data,
88
+ disp_sens_array = sens.SensorArrayPoint(sens_data,
85
89
  disp_field,
86
90
  descriptor)
87
91
 
@@ -91,9 +95,9 @@ disp_sens_array = pyv.SensorArrayPoint(sens_data,
91
95
  # the next example we will look at some field errors to do with sensor
92
96
  # orientation that
93
97
  error_chain = []
94
- error_chain.append(pyv.ErrSysUnif(low=-0.01,high=0.01)) # units = mm
95
- error_chain.append(pyv.ErrRandNorm(std=0.01)) # units = mm
96
- error_int = pyv.ErrIntegrator(error_chain,
98
+ error_chain.append(sens.ErrSysUnif(low=-0.01,high=0.01)) # units = mm
99
+ error_chain.append(sens.ErrRandNorm(std=0.01)) # units = mm
100
+ error_int = sens.ErrIntegrator(error_chain,
97
101
  sens_data,
98
102
  disp_sens_array.get_measurement_shape())
99
103
  disp_sens_array.set_error_integrator(error_int)
@@ -105,13 +109,13 @@ disp_sens_array.calc_measurements()
105
109
  # simulation mesh and visulise the sensor locations with respect to these
106
110
  # fields.
107
111
  for ff in field_comps:
108
- pv_plot = pyv.plot_point_sensors_on_sim(disp_sens_array,ff)
112
+ pv_plot = sens.plot_point_sensors_on_sim(disp_sens_array,ff)
109
113
  pv_plot.show(cpos="xy")
110
114
 
111
115
  #%%
112
116
  # We can also plot the traces for each component of the displacement field.
113
117
  for ff in field_comps:
114
- pyv.plot_time_traces(disp_sens_array,ff)
118
+ sens.plot_time_traces(disp_sens_array,ff)
115
119
 
116
120
  plt.show()
117
121
 
@@ -23,39 +23,42 @@ Test case: point displacement sensors on a 2D plate with hole loaded in tension
23
23
  import numpy as np
24
24
  import matplotlib.pyplot as plt
25
25
  from scipy.spatial.transform import Rotation
26
- import mooseherder as mh
27
- import pyvale as pyv
26
+
27
+ # Pyvale imports
28
+ import pyvale.mooseherder as mh
29
+ import pyvale.sensorsim as sens
30
+ import pyvale.dataset as dataset
28
31
 
29
32
  #%%
30
33
  # First we are going to setup the same displacement sensor array on the 2D
31
34
  # solid mechanics test case we have used previously. This will serve as a
32
35
  # baseline with no sensor rotation.
33
- data_path = pyv.DataSet.mechanical_2d_path()
36
+ data_path = dataset.mechanical_2d_path()
34
37
  sim_data = mh.ExodusReader(data_path).read_all_sim_data()
35
38
 
36
39
  field_name = "disp"
37
40
  field_comps = ("disp_x","disp_y")
38
- sim_data = pyv.scale_length_units(scale=1000.0,
41
+ sim_data = sens.scale_length_units(scale=1000.0,
39
42
  sim_data=sim_data,
40
43
  disp_comps=field_comps)
41
44
 
42
- descriptor = pyv.SensorDescriptorFactory.displacement_descriptor()
45
+ descriptor = sens.SensorDescriptorFactory.displacement_descriptor()
43
46
 
44
- disp_field = pyv.FieldVector(sim_data,field_name,field_comps,elem_dims=2)
47
+ disp_field = sens.FieldVector(sim_data,field_name,field_comps,elem_dims=2)
45
48
 
46
49
  n_sens = (2,3,1)
47
50
  x_lims = (0.0,100.0)
48
51
  y_lims = (0.0,150.0)
49
52
  z_lims = (0.0,0.0)
50
- sens_pos = pyv.create_sensor_pos_array(n_sens,x_lims,y_lims,z_lims)
53
+ sens_pos = sens.create_sensor_pos_array(n_sens,x_lims,y_lims,z_lims)
51
54
 
52
55
 
53
56
  sample_times = np.linspace(0.0,np.max(sim_data.time),50)
54
57
 
55
- sens_data_norot = pyv.SensorData(positions=sens_pos,
58
+ sens_data_norot = sens.SensorData(positions=sens_pos,
56
59
  sample_times=sample_times)
57
60
 
58
- disp_sens_norot = pyv.SensorArrayPoint(sens_data_norot,
61
+ disp_sens_norot = sens.SensorArrayPoint(sens_data_norot,
59
62
  disp_field,
60
63
  descriptor)
61
64
 
@@ -78,11 +81,11 @@ sens_angles = sens_pos.shape[0] * \
78
81
  sens_angles = (Rotation.from_euler("zyx", [45, 0, 0], degrees=True),)
79
82
 
80
83
 
81
- sens_data_rot = pyv.SensorData(positions=sens_pos,
84
+ sens_data_rot = sens.SensorData(positions=sens_pos,
82
85
  sample_times=sample_times,
83
86
  angles=sens_angles)
84
87
 
85
- disp_sens_rot = pyv.SensorArrayPoint(sens_data_rot,
88
+ disp_sens_rot = sens.SensorArrayPoint(sens_data_rot,
86
89
  disp_field,
87
90
  descriptor)
88
91
 
@@ -93,13 +96,13 @@ disp_sens_rot = pyv.SensorArrayPoint(sens_data_rot,
93
96
  # the random generator should provide the perturbation in degrees.
94
97
  angle_offset = np.zeros_like(sens_pos)
95
98
  angle_offset[:,0] = 2.0 # only rotate about z in 2D
96
- angle_rand = (pyv.GenNormal(std=2.0),None,None)
97
- angle_error_data = pyv.ErrFieldData(ang_offset_zyx=angle_offset,
99
+ angle_rand = (sens.GenNormal(std=2.0),None,None)
100
+ angle_error_data = sens.ErrFieldData(ang_offset_zyx=angle_offset,
98
101
  ang_rand_zyx=angle_rand)
99
102
 
100
103
 
101
- sys_err_rot = pyv.ErrSysField(disp_field,angle_error_data)
102
- sys_err_int = pyv.ErrIntegrator([sys_err_rot],
104
+ sys_err_rot = sens.ErrSysField(disp_field,angle_error_data)
105
+ sys_err_int = sens.ErrIntegrator([sys_err_rot],
103
106
  sens_data_rot,
104
107
  disp_sens_rot.get_measurement_shape())
105
108
  disp_sens_rot.set_error_integrator(sys_err_int)
@@ -121,7 +124,7 @@ print("ROTATED SENSORS WITH ANGLE ERRORS:")
121
124
  print(f"These are the last {time_last} virtual measurements of sensor "
122
125
  + f"{sens_print} for {field_comps[comp_print]}:")
123
126
 
124
- pyv.print_measurements(disp_sens_rot,sens_print,comp_print,time_print)
127
+ sens.print_measurements(disp_sens_rot,sens_print,comp_print,time_print)
125
128
 
126
129
  print(80*"-")
127
130
 
@@ -129,9 +132,9 @@ print(80*"-")
129
132
  # We can now plot the traces for the non-rotated and rotated sensors to
130
133
  # compare them:
131
134
  for ff in field_comps:
132
- (_,ax) = pyv.plot_time_traces(disp_sens_norot,ff)
135
+ (_,ax) = sens.plot_time_traces(disp_sens_norot,ff)
133
136
  ax.set_title("No Rotation")
134
- (_,ax) = pyv.plot_time_traces(disp_sens_rot,ff)
137
+ (_,ax) = sens.plot_time_traces(disp_sens_rot,ff)
135
138
  ax.set_title("Rotated with Errors")
136
139
 
137
140
  plt.show()
@@ -24,36 +24,39 @@ Test case: point displacement sensors on a 2D plate with hole loaded in tension
24
24
 
25
25
  import numpy as np
26
26
  import matplotlib.pyplot as plt
27
- import mooseherder as mh
28
- import pyvale as pyv
27
+
28
+ # Pyvale imports
29
+ import pyvale.mooseherder as mh
30
+ import pyvale.sensorsim as sens
31
+ import pyvale.dataset as dataset
29
32
 
30
33
  #%%
31
34
  # We start by building the same displacement sensor array applied to a 2D
32
35
  # solid mechanics simulation that we have analysed previously.
33
- data_path = pyv.DataSet.mechanical_2d_path()
36
+ data_path = dataset.mechanical_2d_path()
34
37
  sim_data = mh.ExodusReader(data_path).read_all_sim_data()
35
38
  field_name = "disp"
36
39
  field_comps = ("disp_x","disp_y")
37
- sim_data = pyv.scale_length_units(scale=1000.0,
40
+ sim_data = sens.scale_length_units(scale=1000.0,
38
41
  sim_data=sim_data,
39
42
  disp_comps=field_comps)
40
43
 
41
- descriptor = pyv.SensorDescriptorFactory.displacement_descriptor()
44
+ descriptor = sens.SensorDescriptorFactory.displacement_descriptor()
42
45
 
43
- disp_field = pyv.FieldVector(sim_data,field_name,field_comps,elem_dims=2)
46
+ disp_field = sens.FieldVector(sim_data,field_name,field_comps,elem_dims=2)
44
47
 
45
48
  n_sens = (2,3,1)
46
49
  x_lims = (0.0,100.0)
47
50
  y_lims = (0.0,150.0)
48
51
  z_lims = (0.0,0.0)
49
- sensor_positions = pyv.create_sensor_pos_array(n_sens,x_lims,y_lims,z_lims)
52
+ sensor_positions = sens.create_sensor_pos_array(n_sens,x_lims,y_lims,z_lims)
50
53
 
51
54
  sample_times = np.linspace(0.0,np.max(sim_data.time),50)
52
55
 
53
- sensor_data = pyv.SensorData(positions=sensor_positions,
56
+ sensor_data = sens.SensorData(positions=sensor_positions,
54
57
  sample_times=sample_times)
55
58
 
56
- disp_sens_array = pyv.SensorArrayPoint(sensor_data,
59
+ disp_sens_array = sens.SensorArrayPoint(sensor_data,
57
60
  disp_field,
58
61
  descriptor)
59
62
 
@@ -66,16 +69,16 @@ disp_sens_array = pyv.SensorArrayPoint(sensor_data,
66
69
  # We will apply a position offset of -1.0mm in the x and y axes.
67
70
  pos_offset = -1.0*np.ones_like(sensor_positions)
68
71
  pos_offset[:,2] = 0.0 # in 2d we only have offset in x and y so zero z
69
- pos_error_data = pyv.ErrFieldData(pos_offset_xyz=pos_offset)
72
+ pos_error_data = sens.ErrFieldData(pos_offset_xyz=pos_offset)
70
73
 
71
74
  #%%
72
75
  # We will apply a rotation offset about the z axis of 1 degree
73
76
  angle_offset = np.zeros_like(sensor_positions)
74
77
  angle_offset[:,0] = 1.0 # only rotate about z in 2D
75
- angle_error_data = pyv.ErrFieldData(ang_offset_zyx=angle_offset)
78
+ angle_error_data = sens.ErrFieldData(ang_offset_zyx=angle_offset)
76
79
 
77
80
  time_offset = 2.0*np.ones_like(disp_sens_array.get_sample_times())
78
- time_error_data = pyv.ErrFieldData(time_offset=time_offset)
81
+ time_error_data = sens.ErrFieldData(time_offset=time_offset)
79
82
 
80
83
  #%%
81
84
  # Now we add all our field errors to our error chain. We add each error
@@ -83,26 +86,25 @@ time_error_data = pyv.ErrFieldData(time_offset=time_offset)
83
86
  # error dependence to `DEPENDENT` so that the sensor state is accumulated
84
87
  # over the error chain as field errors are `INDEPENDENT` by default.
85
88
  err_chain = []
86
- err_chain.append(pyv.ErrSysField(disp_field,
89
+ err_chain.append(sens.ErrSysField(disp_field,
87
90
  time_error_data,
88
- pyv.EErrDep.DEPENDENT))
89
- err_chain.append(pyv.ErrSysField(disp_field,
91
+ sens.EErrDep.DEPENDENT))
92
+ err_chain.append(sens.ErrSysField(disp_field,
90
93
  time_error_data,
91
- pyv.EErrDep.DEPENDENT))
94
+ sens.EErrDep.DEPENDENT))
92
95
 
93
- err_chain.append(pyv.ErrSysField(disp_field,
96
+ err_chain.append(sens.ErrSysField(disp_field,
94
97
  pos_error_data,
95
- pyv.EErrDep.DEPENDENT))
96
- err_chain.append(pyv.ErrSysField(disp_field,
98
+ sens.EErrDep.DEPENDENT))
99
+ err_chain.append(sens.ErrSysField(disp_field,
97
100
  pos_error_data,
98
- pyv.EErrDep.DEPENDENT))
99
-
100
- err_chain.append(pyv.ErrSysField(disp_field,
101
+ sens.EErrDep.DEPENDENT))
102
+ err_chain.append(sens.ErrSysField(disp_field,
101
103
  angle_error_data,
102
- pyv.EErrDep.DEPENDENT))
103
- err_chain.append(pyv.ErrSysField(disp_field,
104
+ sens.EErrDep.DEPENDENT))
105
+ err_chain.append(sens.ErrSysField(disp_field,
104
106
  angle_error_data,
105
- pyv.EErrDep.DEPENDENT))
107
+ sens.EErrDep.DEPENDENT))
106
108
 
107
109
  #%%
108
110
  # Instead of setting the dependence for each individual error above we could
@@ -113,13 +115,13 @@ err_chain.append(pyv.ErrSysField(disp_field,
113
115
  # each error in the chain to the total error rather than just being able to
114
116
  # analyse the total systematic and total random error which is the default.
115
117
  # Note that this option will use more memory.
116
- err_int_opts = pyv.ErrIntOpts(force_dependence=pyv.EErrDep.DEPENDENT,
118
+ err_int_opts = sens.ErrIntOpts(force_dependence=sens.EErrDep.DEPENDENT,
117
119
  store_all_errs=True)
118
120
 
119
121
  #%%
120
122
  # Now we build our error integrator, add it to our sensor array and then run
121
123
  # our sensor simulation to obtain some virtual measurements.
122
- error_int = pyv.ErrIntegrator(err_chain,
124
+ error_int = sens.ErrIntegrator(err_chain,
123
125
  sensor_data,
124
126
  disp_sens_array.get_measurement_shape(),
125
127
  err_int_opts)
@@ -185,13 +187,13 @@ print("ROTATED SENSORS WITH ANGLE ERRORS:")
185
187
  print(f"These are the last {time_last} virtual measurements of sensor "
186
188
  + f"{sens_print} for {field_comps[comp_print]}:")
187
189
 
188
- pyv.print_measurements(disp_sens_array,sens_print,comp_print,time_print)
190
+ sens.print_measurements(disp_sens_array,sens_print,comp_print,time_print)
189
191
 
190
192
  print(80*"-")
191
193
 
192
194
  #%%
193
195
  # Finally, we plot the time traces for all field components.
194
196
  for ff in field_comps:
195
- pyv.plot_time_traces(disp_sens_array,ff)
197
+ sens.plot_time_traces(disp_sens_array,ff)
196
198
 
197
199
  plt.show()
@@ -21,15 +21,18 @@ Test case: Simple 3D cube thermo-mechanical in tension with temp gradient.
21
21
 
22
22
  import numpy as np
23
23
  import matplotlib.pyplot as plt
24
- import mooseherder as mh
25
- import pyvale as pyv
24
+
25
+ # Pyvale imports
26
+ import pyvale.mooseherder as mh
27
+ import pyvale.sensorsim as sens
28
+ import pyvale.dataset as dataset
26
29
 
27
30
 
28
31
  #%%
29
32
  # First we load our simulation as a `SimData` object. In this case we are
30
33
  # loading a 10mm cube loaded in tension in the y direction with the addition
31
34
  # of a thermal gradient in the y direction.
32
- data_path = pyv.DataSet.element_case_path(pyv.EElemTest.HEX20)
35
+ data_path = dataset.element_case_output_path(dataset.EElemTest.HEX20)
33
36
  sim_data = mh.ExodusReader(data_path).read_all_sim_data()
34
37
 
35
38
  #%%
@@ -37,40 +40,40 @@ sim_data = mh.ExodusReader(data_path).read_all_sim_data()
37
40
  # displacement field component here.
38
41
  field_name = "disp"
39
42
  field_comps = ("disp_x","disp_y","disp_z")
40
- sim_data = pyv.scale_length_units(scale=1000.0,
43
+ sim_data = sens.scale_length_units(scale=1000.0,
41
44
  sim_data=sim_data,
42
45
  disp_comps=field_comps)
43
46
 
44
47
  #%%
45
48
  # We use a helper function to print the extent of the dimensions in our
46
- # `SimData` object to help us locate our sensors on the cube.
47
- pyv.print_dimensions(sim_data)
49
+ # `SimTools` object to help us locate our sensors on the cube.
50
+ sens.SimTools.print_dimensions(sim_data)
48
51
 
49
- descriptor = pyv.SensorDescriptorFactory.displacement_descriptor()
52
+ descriptor = sens.SensorDescriptorFactory.displacement_descriptor()
50
53
 
51
54
  #%%
52
55
  # We pass in the string keys for the three vector field components as they
53
56
  # appear in our `SimData` object as well as specifying that our elements are
54
57
  # 3 dimensional.
55
- disp_field = pyv.FieldVector(sim_data,field_name,field_comps,elem_dims=3)
58
+ disp_field = sens.FieldVector(sim_data,field_name,field_comps,elem_dims=3)
56
59
 
57
60
  #%%
58
61
  # Here we manually define our sensor positions to place a sensor on the
59
62
  # centre of each face of our 10mm cube. From here everything is the same as
60
63
  # for our 2D vector field sensor arrays.
61
64
  sensor_positions = np.array(((5.0,0.0,5.0),
62
- (5.0,10.0,5.0),
63
- (5.0,5.0,0.0),
64
- (5.0,5.0,10.0),
65
- (0.0,5.0,5.0),
66
- (10.0,5.0,5.0),))
65
+ (5.0,10.0,5.0),
66
+ (5.0,5.0,0.0),
67
+ (5.0,5.0,10.0),
68
+ (0.0,5.0,5.0),
69
+ (10.0,5.0,5.0),))
67
70
 
68
71
  sample_times = np.linspace(0.0,np.max(sim_data.time),50)
69
72
 
70
- sensor_data = pyv.SensorData(positions=sensor_positions,
73
+ sensor_data = sens.SensorData(positions=sensor_positions,
71
74
  sample_times=sample_times)
72
75
 
73
- disp_sens_array = pyv.SensorArrayPoint(sensor_data,
76
+ disp_sens_array = sens.SensorArrayPoint(sensor_data,
74
77
  disp_field,
75
78
  descriptor)
76
79
 
@@ -79,7 +82,7 @@ measurements = disp_sens_array.calc_measurements()
79
82
  #%%
80
83
  # Let's have a look at the y displacement field in relation to the location
81
84
  # of our displacement sensors.
82
- pv_plot = pyv.plot_point_sensors_on_sim(disp_sens_array,"disp_y")
85
+ pv_plot = sens.plot_point_sensors_on_sim(disp_sens_array,"disp_y")
83
86
  pv_plot.show()
84
87
 
85
88
  #%%
@@ -96,7 +99,7 @@ time_print = slice(measurements.shape[2]-time_last,measurements.shape[2])
96
99
  print(f"These are the last {time_last} virtual measurements of sensor "
97
100
  + f"{sens_print} for {field_comps[comp_print]}:")
98
101
 
99
- pyv.print_measurements(disp_sens_array,sens_print,comp_print,time_print)
102
+ sens.print_measurements(disp_sens_array,sens_print,comp_print,time_print)
100
103
 
101
104
  print(80*"-")
102
105
 
@@ -106,6 +109,6 @@ print(80*"-")
106
109
  # maximum y displacement, and that all sensors on the sides of the cube
107
110
  # should give the same results.
108
111
  for ff in field_comps:
109
- pyv.plot_time_traces(disp_sens_array,ff)
112
+ sens.plot_time_traces(disp_sens_array,ff)
110
113
 
111
114
  plt.show()