gea-program 0.24.0__tar.gz → 0.26.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. {gea_program-0.24.0/gea_program.egg-info → gea_program-0.26.0}/PKG-INFO +30 -2
  2. {gea_program-0.24.0 → gea_program-0.26.0}/README.md +29 -1
  3. {gea_program-0.24.0 → gea_program-0.26.0}/gea/__init__.py +1 -1
  4. {gea_program-0.24.0 → gea_program-0.26.0}/gea/__main__.py +137 -5
  5. {gea_program-0.24.0 → gea_program-0.26.0}/gea/acceptance_tests.py +311 -1
  6. gea_program-0.26.0/gea/catalog_register.py +146 -0
  7. {gea_program-0.24.0 → gea_program-0.26.0}/gea/client_reports.py +27 -0
  8. gea_program-0.26.0/gea/friction_priors.py +133 -0
  9. gea_program-0.26.0/gea/help/catalog.md +11 -0
  10. gea_program-0.26.0/gea/help/slip.md +11 -0
  11. {gea_program-0.24.0 → gea_program-0.26.0}/gea/helplib.py +2 -0
  12. {gea_program-0.24.0 → gea_program-0.26.0}/gea/model_card.py +4 -2
  13. {gea_program-0.24.0 → gea_program-0.26.0}/gea/rock_inventory.py +26 -0
  14. {gea_program-0.24.0 → gea_program-0.26.0}/gea/service.py +47 -2
  15. {gea_program-0.24.0 → gea_program-0.26.0}/gea/shapefile.py +25 -5
  16. gea_program-0.26.0/gea/slip.py +276 -0
  17. {gea_program-0.24.0 → gea_program-0.26.0}/gea/structure.py +1 -1
  18. {gea_program-0.24.0 → gea_program-0.26.0}/gea/survey_cmd.py +9 -1
  19. {gea_program-0.24.0 → gea_program-0.26.0}/gea/web/app.html +44 -5
  20. {gea_program-0.24.0 → gea_program-0.26.0}/gea/workspace.py +157 -3
  21. {gea_program-0.24.0 → gea_program-0.26.0/gea_program.egg-info}/PKG-INFO +30 -2
  22. {gea_program-0.24.0 → gea_program-0.26.0}/gea_program.egg-info/SOURCES.txt +5 -0
  23. {gea_program-0.24.0 → gea_program-0.26.0}/pyproject.toml +1 -1
  24. {gea_program-0.24.0 → gea_program-0.26.0}/LICENSE +0 -0
  25. {gea_program-0.24.0 → gea_program-0.26.0}/gea/BENCH_TEST_PROTOCOL.md +0 -0
  26. {gea_program-0.24.0 → gea_program-0.26.0}/gea/accuracy_statement.py +0 -0
  27. {gea_program-0.24.0 → gea_program-0.26.0}/gea/alarm_engine.py +0 -0
  28. {gea_program-0.24.0 → gea_program-0.26.0}/gea/backup.py +0 -0
  29. {gea_program-0.24.0 → gea_program-0.26.0}/gea/bench.py +0 -0
  30. {gea_program-0.24.0 → gea_program-0.26.0}/gea/blind_harness.py +0 -0
  31. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/acex_lomonosov_age_depth_model.provenance.json +0 -0
  32. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/acex_lomonosov_age_depth_model.txt +0 -0
  33. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/agassiz77_canada_temperature.csv +0 -0
  34. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/agassiz77_canada_temperature.provenance.json +0 -0
  35. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/barbados_110_consolidation.provenance.json +0 -0
  36. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/barbados_110_consolidation.txt +0 -0
  37. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/bengal_u1452_grain_size.provenance.json +0 -0
  38. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/bengal_u1452_grain_size.txt +0 -0
  39. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/blake_164_methane_isotopes.provenance.json +0 -0
  40. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/blake_164_methane_isotopes.txt +0 -0
  41. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.provenance.json +0 -0
  42. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.txt +0 -0
  43. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/collingwood_1_28_ks_complete.las +0 -0
  44. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/collingwood_1_28_ks_complete.provenance.json +0 -0
  45. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/costa_rica_odp_friction_envelope.provenance.json +0 -0
  46. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/costa_rica_odp_friction_envelope.txt +0 -0
  47. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.provenance.json +0 -0
  48. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.txt +0 -0
  49. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/dsdp_504b_physical_properties.provenance.json +0 -0
  50. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/dsdp_504b_physical_properties.txt +0 -0
  51. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/dsdp_504b_sound_velocity.provenance.json +0 -0
  52. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/dsdp_504b_sound_velocity.txt +0 -0
  53. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/elgygytgyn_5011_turbidites.provenance.json +0 -0
  54. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/elgygytgyn_5011_turbidites.txt +0 -0
  55. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/epica_domec_co2_800kyr.provenance.json +0 -0
  56. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/epica_domec_co2_800kyr.txt +0 -0
  57. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/fram_909_organic_petrography.provenance.json +0 -0
  58. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/fram_909_organic_petrography.txt +0 -0
  59. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/gbr_325_coral_uth_ages.provenance.json +0 -0
  60. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/gbr_325_coral_uth_ages.txt +0 -0
  61. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/gisp2_greenland_temperature.csv +0 -0
  62. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/gisp2_greenland_temperature.provenance.json +0 -0
  63. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/gom_308_t2p_insitu.provenance.json +0 -0
  64. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/gom_308_t2p_insitu.txt +0 -0
  65. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/guaymas_385_dom_d13c.provenance.json +0 -0
  66. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/guaymas_385_dom_d13c.txt +0 -0
  67. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/hikurangi_u1520_friction_insitu.provenance.json +0 -0
  68. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/hikurangi_u1520_friction_insitu.txt +0 -0
  69. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.provenance.json +0 -0
  70. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.txt +0 -0
  71. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/iodp_u1324_pore_pressure.provenance.json +0 -0
  72. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/iodp_u1324_pore_pressure.txt +0 -0
  73. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/jfast_c0019_slow_slip_events.provenance.json +0 -0
  74. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/jfast_c0019_slow_slip_events.txt +0 -0
  75. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/kennetcook_2_p129_excerpt.las +0 -0
  76. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/kennetcook_2_p129_excerpt.provenance.json +0 -0
  77. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/ktb_hb_bhgm_density.dat +0 -0
  78. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/ktb_hb_bhgm_density.provenance.json +0 -0
  79. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/ktb_hb_complog_6020_excerpt.provenance.json +0 -0
  80. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/ktb_hb_complog_6020_excerpt.txt +0 -0
  81. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/ktb_hb_hlog246_temperature.dat +0 -0
  82. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/ktb_hb_hlog246_temperature.provenance.json +0 -0
  83. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/ktb_hb_rockmech_compress.dat +0 -0
  84. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/ktb_hb_rockmech_compress.provenance.json +0 -0
  85. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.dat +0 -0
  86. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.provenance.json +0 -0
  87. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/ktb_vb_rockmech_compress.dat +0 -0
  88. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/ktb_vb_rockmech_compress.provenance.json +0 -0
  89. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/ktb_vb_vlog251_temperature.dat +0 -0
  90. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/ktb_vb_vlog251_temperature.provenance.json +0 -0
  91. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/l06_06_nl_survey.csv +0 -0
  92. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/l06_06_nl_survey.provenance.json +0 -0
  93. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/l07_01_nl_excerpt.las +0 -0
  94. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/l07_01_nl_excerpt.provenance.json +0 -0
  95. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/mariana_1200_serpentinite_geochem.provenance.json +0 -0
  96. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/mariana_1200_serpentinite_geochem.txt +0 -0
  97. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/med_160_sapropels.provenance.json +0 -0
  98. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/med_160_sapropels.txt +0 -0
  99. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/nankai_megasplay_shear_strength.provenance.json +0 -0
  100. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/nankai_megasplay_shear_strength.txt +0 -0
  101. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/odp_1027b_thermal_conductivity.provenance.json +0 -0
  102. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/odp_1027b_thermal_conductivity.txt +0 -0
  103. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/odp_1027c_cork_temperature.provenance.json +0 -0
  104. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/odp_1027c_cork_temperature.txt +0 -0
  105. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/odp_1165b_thermal_conductivity.provenance.json +0 -0
  106. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/odp_1165b_thermal_conductivity.txt +0 -0
  107. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.provenance.json +0 -0
  108. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.txt +0 -0
  109. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/odp_504b_dike_elastic_moduli.provenance.json +0 -0
  110. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/odp_504b_dike_elastic_moduli.txt +0 -0
  111. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/odp_504b_leg137_borehole_fluids.provenance.json +0 -0
  112. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/odp_504b_leg137_borehole_fluids.txt +0 -0
  113. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.provenance.json +0 -0
  114. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.txt +0 -0
  115. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/peru_201_sulfate_reduction.provenance.json +0 -0
  116. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/peru_201_sulfate_reduction.txt +0 -0
  117. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/scorpio_e1_sa_excerpt.las +0 -0
  118. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/scorpio_e1_sa_excerpt.provenance.json +0 -0
  119. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/sumatra_362_cohesion.provenance.json +0 -0
  120. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/sumatra_362_cohesion.txt +0 -0
  121. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/university_6_17_no1_tx_excerpt.las +0 -0
  122. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/university_6_17_no1_tx_excerpt.provenance.json +0 -0
  123. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/ursa_308_xrd_mineralogy.provenance.json +0 -0
  124. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/ursa_308_xrd_mineralogy.txt +0 -0
  125. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/volve_15_9_19_sr_excerpt.las +0 -0
  126. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/volve_15_9_19_sr_excerpt.provenance.json +0 -0
  127. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/volve_15_9_19a_core_excerpt.csv +0 -0
  128. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/volve_15_9_19a_core_excerpt.provenance.json +0 -0
  129. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/volve_f12_f14_production_excerpt.csv +0 -0
  130. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/volve_f12_f14_production_excerpt.provenance.json +0 -0
  131. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/walvis_208_petm_carbonate.provenance.json +0 -0
  132. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/walvis_208_petm_carbonate.txt +0 -0
  133. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/woodlark_1109_rock_eval.provenance.json +0 -0
  134. {gea_program-0.24.0 → gea_program-0.26.0}/gea/catalog/woodlark_1109_rock_eval.txt +0 -0
  135. {gea_program-0.24.0 → gea_program-0.26.0}/gea/certificates.py +0 -0
  136. {gea_program-0.24.0 → gea_program-0.26.0}/gea/cli.py +0 -0
  137. {gea_program-0.24.0 → gea_program-0.26.0}/gea/config_versioning.py +0 -0
  138. {gea_program-0.24.0 → gea_program-0.26.0}/gea/conformance.py +0 -0
  139. {gea_program-0.24.0 → gea_program-0.26.0}/gea/correlation.py +0 -0
  140. {gea_program-0.24.0 → gea_program-0.26.0}/gea/dashboard.py +0 -0
  141. {gea_program-0.24.0 → gea_program-0.26.0}/gea/deviation.py +0 -0
  142. {gea_program-0.24.0 → gea_program-0.26.0}/gea/dlis.py +0 -0
  143. {gea_program-0.24.0 → gea_program-0.26.0}/gea/dnp3.py +0 -0
  144. {gea_program-0.24.0 → gea_program-0.26.0}/gea/doctor.py +0 -0
  145. {gea_program-0.24.0 → gea_program-0.26.0}/gea/downhole_engine.py +0 -0
  146. {gea_program-0.24.0 → gea_program-0.26.0}/gea/drift_monitor.py +0 -0
  147. {gea_program-0.24.0 → gea_program-0.26.0}/gea/earth_model.py +0 -0
  148. {gea_program-0.24.0 → gea_program-0.26.0}/gea/elevation.py +0 -0
  149. {gea_program-0.24.0 → gea_program-0.26.0}/gea/etp.py +0 -0
  150. {gea_program-0.24.0 → gea_program-0.26.0}/gea/etp12_schemas.json +0 -0
  151. {gea_program-0.24.0 → gea_program-0.26.0}/gea/example_register_map.json +0 -0
  152. {gea_program-0.24.0 → gea_program-0.26.0}/gea/fat_sat.py +0 -0
  153. {gea_program-0.24.0 → gea_program-0.26.0}/gea/files.py +0 -0
  154. {gea_program-0.24.0 → gea_program-0.26.0}/gea/follower.py +0 -0
  155. {gea_program-0.24.0 → gea_program-0.26.0}/gea/forward_model.py +0 -0
  156. {gea_program-0.24.0 → gea_program-0.26.0}/gea/gamma.py +0 -0
  157. {gea_program-0.24.0 → gea_program-0.26.0}/gea/gauge_aging.py +0 -0
  158. {gea_program-0.24.0 → gea_program-0.26.0}/gea/gauge_specs.py +0 -0
  159. {gea_program-0.24.0 → gea_program-0.26.0}/gea/geodesy.py +0 -0
  160. {gea_program-0.24.0 → gea_program-0.26.0}/gea/gravity_reference.py +0 -0
  161. {gea_program-0.24.0 → gea_program-0.26.0}/gea/hartip.py +0 -0
  162. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/TESTER_GUIDE.md +0 -0
  163. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/alarms.md +0 -0
  164. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/audit-update.md +0 -0
  165. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/backup.md +0 -0
  166. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/conformance.md +0 -0
  167. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/data-in.md +0 -0
  168. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/dlis.md +0 -0
  169. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/doctor.md +0 -0
  170. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/drift.md +0 -0
  171. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/etp.md +0 -0
  172. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/field-ports.md +0 -0
  173. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/files.md +0 -0
  174. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/historian.md +0 -0
  175. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/instruments.md +0 -0
  176. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/interval.md +0 -0
  177. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/month-end.md +0 -0
  178. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/notifications.md +0 -0
  179. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/osdu.md +0 -0
  180. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/patches.md +0 -0
  181. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/ppdm.md +0 -0
  182. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/quakeml.md +0 -0
  183. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/quality.md +0 -0
  184. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/seedlink.md +0 -0
  185. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/seismic.md +0 -0
  186. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/site.md +0 -0
  187. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/sites.md +0 -0
  188. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/soak.md +0 -0
  189. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/sra.md +0 -0
  190. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/start.md +0 -0
  191. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/structure.md +0 -0
  192. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/transients.md +0 -0
  193. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/upkeep.md +0 -0
  194. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/vibration.md +0 -0
  195. {gea_program-0.24.0 → gea_program-0.26.0}/gea/help/well-tests.md +0 -0
  196. {gea_program-0.24.0 → gea_program-0.26.0}/gea/housekeeping.py +0 -0
  197. {gea_program-0.24.0 → gea_program-0.26.0}/gea/interval.py +0 -0
  198. {gea_program-0.24.0 → gea_program-0.26.0}/gea/inverse_engine.py +0 -0
  199. {gea_program-0.24.0 → gea_program-0.26.0}/gea/jobs.py +0 -0
  200. {gea_program-0.24.0 → gea_program-0.26.0}/gea/live_ports.py +0 -0
  201. {gea_program-0.24.0 → gea_program-0.26.0}/gea/loadtest.py +0 -0
  202. {gea_program-0.24.0 → gea_program-0.26.0}/gea/matplotlib_demo.py +0 -0
  203. {gea_program-0.24.0 → gea_program-0.26.0}/gea/modbus.py +0 -0
  204. {gea_program-0.24.0 → gea_program-0.26.0}/gea/modbus_rtu.py +0 -0
  205. {gea_program-0.24.0 → gea_program-0.26.0}/gea/month_end.py +0 -0
  206. {gea_program-0.24.0 → gea_program-0.26.0}/gea/mqtt_port.py +0 -0
  207. {gea_program-0.24.0 → gea_program-0.26.0}/gea/notify.py +0 -0
  208. {gea_program-0.24.0 → gea_program-0.26.0}/gea/opcua_port.py +0 -0
  209. {gea_program-0.24.0 → gea_program-0.26.0}/gea/operator_app.py +0 -0
  210. {gea_program-0.24.0 → gea_program-0.26.0}/gea/osdu.py +0 -0
  211. {gea_program-0.24.0 → gea_program-0.26.0}/gea/patches.py +0 -0
  212. {gea_program-0.24.0 → gea_program-0.26.0}/gea/permits.py +0 -0
  213. {gea_program-0.24.0 → gea_program-0.26.0}/gea/piwebapi.py +0 -0
  214. {gea_program-0.24.0 → gea_program-0.26.0}/gea/ports.py +0 -0
  215. {gea_program-0.24.0 → gea_program-0.26.0}/gea/ppdm.py +0 -0
  216. {gea_program-0.24.0 → gea_program-0.26.0}/gea/profile_catalog.py +0 -0
  217. {gea_program-0.24.0 → gea_program-0.26.0}/gea/project.py +0 -0
  218. {gea_program-0.24.0 → gea_program-0.26.0}/gea/qt6_downhole_app.py +0 -0
  219. {gea_program-0.24.0 → gea_program-0.26.0}/gea/quakeml.py +0 -0
  220. {gea_program-0.24.0 → gea_program-0.26.0}/gea/reconciler.py +0 -0
  221. {gea_program-0.24.0 → gea_program-0.26.0}/gea/reference/IU_ANMO_10_BHZ_response.provenance.json +0 -0
  222. {gea_program-0.24.0 → gea_program-0.26.0}/gea/reference/IU_ANMO_10_BHZ_response.xml +0 -0
  223. {gea_program-0.24.0 → gea_program-0.26.0}/gea/reference/libmseed_steim.provenance.json +0 -0
  224. {gea_program-0.24.0 → gea_program-0.26.0}/gea/reference/libmseed_steim1_4096.mseed +0 -0
  225. {gea_program-0.24.0 → gea_program-0.26.0}/gea/reference/libmseed_steim2_4096.mseed +0 -0
  226. {gea_program-0.24.0 → gea_program-0.26.0}/gea/reference/libmseed_steim2_512.mseed +0 -0
  227. {gea_program-0.24.0 → gea_program-0.26.0}/gea/sample_record.py +0 -0
  228. {gea_program-0.24.0 → gea_program-0.26.0}/gea/sample_well_profile.csv +0 -0
  229. {gea_program-0.24.0 → gea_program-0.26.0}/gea/sbom.py +0 -0
  230. {gea_program-0.24.0 → gea_program-0.26.0}/gea/seedlink.py +0 -0
  231. {gea_program-0.24.0 → gea_program-0.26.0}/gea/segy.py +0 -0
  232. {gea_program-0.24.0 → gea_program-0.26.0}/gea/seismic.py +0 -0
  233. {gea_program-0.24.0 → gea_program-0.26.0}/gea/seismic_array.py +0 -0
  234. {gea_program-0.24.0 → gea_program-0.26.0}/gea/seismic_assoc.py +0 -0
  235. {gea_program-0.24.0 → gea_program-0.26.0}/gea/seismic_detect.py +0 -0
  236. {gea_program-0.24.0 → gea_program-0.26.0}/gea/seismic_film.py +0 -0
  237. {gea_program-0.24.0 → gea_program-0.26.0}/gea/seismic_harmonic.py +0 -0
  238. {gea_program-0.24.0 → gea_program-0.26.0}/gea/seismic_qc.py +0 -0
  239. {gea_program-0.24.0 → gea_program-0.26.0}/gea/seismic_response.py +0 -0
  240. {gea_program-0.24.0 → gea_program-0.26.0}/gea/seismic_signature.py +0 -0
  241. {gea_program-0.24.0 → gea_program-0.26.0}/gea/seismic_track.py +0 -0
  242. {gea_program-0.24.0 → gea_program-0.26.0}/gea/seismic_uncertainty.py +0 -0
  243. {gea_program-0.24.0 → gea_program-0.26.0}/gea/seismic_unlisted.py +0 -0
  244. {gea_program-0.24.0 → gea_program-0.26.0}/gea/sensor_swap.py +0 -0
  245. {gea_program-0.24.0 → gea_program-0.26.0}/gea/service_life.py +0 -0
  246. {gea_program-0.24.0 → gea_program-0.26.0}/gea/shell.py +0 -0
  247. {gea_program-0.24.0 → gea_program-0.26.0}/gea/shut_in.py +0 -0
  248. {gea_program-0.24.0 → gea_program-0.26.0}/gea/sla_report.py +0 -0
  249. {gea_program-0.24.0 → gea_program-0.26.0}/gea/soak.py +0 -0
  250. {gea_program-0.24.0 → gea_program-0.26.0}/gea/sra.py +0 -0
  251. {gea_program-0.24.0 → gea_program-0.26.0}/gea/store_forward.py +0 -0
  252. {gea_program-0.24.0 → gea_program-0.26.0}/gea/strata_join.py +0 -0
  253. {gea_program-0.24.0 → gea_program-0.26.0}/gea/supervisor.py +0 -0
  254. {gea_program-0.24.0 → gea_program-0.26.0}/gea/survey_view.py +0 -0
  255. {gea_program-0.24.0 → gea_program-0.26.0}/gea/telemetry.py +0 -0
  256. {gea_program-0.24.0 → gea_program-0.26.0}/gea/tool_library.py +0 -0
  257. {gea_program-0.24.0 → gea_program-0.26.0}/gea/transient.py +0 -0
  258. {gea_program-0.24.0 → gea_program-0.26.0}/gea/vibration.py +0 -0
  259. {gea_program-0.24.0 → gea_program-0.26.0}/gea/well_assembler.py +0 -0
  260. {gea_program-0.24.0 → gea_program-0.26.0}/gea/well_test_validation.py +0 -0
  261. {gea_program-0.24.0 → gea_program-0.26.0}/gea/wits0.py +0 -0
  262. {gea_program-0.24.0 → gea_program-0.26.0}/gea/witsml.py +0 -0
  263. {gea_program-0.24.0 → gea_program-0.26.0}/gea_program.egg-info/dependency_links.txt +0 -0
  264. {gea_program-0.24.0 → gea_program-0.26.0}/gea_program.egg-info/entry_points.txt +0 -0
  265. {gea_program-0.24.0 → gea_program-0.26.0}/gea_program.egg-info/requires.txt +0 -0
  266. {gea_program-0.24.0 → gea_program-0.26.0}/gea_program.egg-info/top_level.txt +0 -0
  267. {gea_program-0.24.0 → gea_program-0.26.0}/setup.cfg +0 -0
  268. {gea_program-0.24.0 → gea_program-0.26.0}/tests/test_acceptance.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gea-program
3
- Version: 0.24.0
3
+ Version: 0.26.0
4
4
  Summary: GEA-Program: downhole gauge monitoring - canonical measurement records, quality rules, drift evaluation with a re-fit change log, well-test validation, alarm management, model cards, store-and-forward, monthly SLA measurement, FAT/SAT protocols and a dashboard, generated from live objects in the client's reporting outline.
5
5
  Author: Daniel T. Murphy
6
6
  License: MPL-2.0
@@ -125,7 +125,7 @@ gea dashboard --catalog-well volve_f12_f14_production_excerpt:15/9-F-12:10000 --
125
125
  gea client-report --report accuracy --out client_report
126
126
  gea model-cards --out model_cards
127
127
  gea sbom --out sbom
128
- gea accept # the product gate (359 checks)
128
+ gea accept # the product gate (365 checks)
129
129
  gea help drift # the help library, by the job (16 pages; the same text is on every dashboard page)
130
130
  gea guide # the click-by-click tester guide (docs/TESTER_GUIDE.md)
131
131
  gea gui # the desktop window (pip install "gea-program[desktop]")
@@ -648,6 +648,34 @@ against it; `gea seedlink --config ... --hello` prints what a server says of
648
648
  itself; `gea help seedlink`. A TexNet station is served by EarthScope at
649
649
  `rtserve.iris.washington.edu:18000`, network `TX`.
650
650
 
651
+ ### Slip tendency on the mapped faults
652
+
653
+ The stress state the site declares - the three gradients and the ambient
654
+ pore pressure with their source, the SHmax azimuth with its source or from
655
+ the World Stress Map records near the well (`add-stress-map wsm2016.csv`,
656
+ `wsm --lat --lon`) - resolved on every mapped fault trace within the radius
657
+ of a well at the depth of its declared interval: the slip tendency at the
658
+ ambient and the increased pore pressure, the pressure to slip, the margin
659
+ left after the increase, worst and best declared case. The dip comes from
660
+ the layer where it states one (the Hennings 2021 BEG/TexNet layers do, and
661
+ publish their own pressure-to-slip, printed beside this arithmetic); UTM and
662
+ state-plane layers are unprojected from their .prj parameters. `set-stress`,
663
+ `slip --well`, `gea slip`; the SRA packet's section 2e; `gea help slip`. A
664
+ statement on declared inputs, not a probability and not a verdict.
665
+
666
+ ### The catalogue accounted for
667
+
668
+ `gea catalog --list` is the register of the 52 shipped public datasets: for
669
+ each, what in this program reads it, or CARRIED, NO BAND with the reason;
670
+ the gate holds the register to the code both ways and reads every entry.
671
+ `gea survey --catalog <entry>` runs the strata survey on any catalogue log
672
+ with its provenance; `gea catalog --friction` reads seven laboratory
673
+ datasets on natural fault and sediment samples as the measured friction
674
+ envelope (0.21-0.90 on 70 measurements, none from the Permian) against
675
+ Byerlee's 0.6; `gea catalog --core` checks the published sandstone range
676
+ against the Volve core (65 of 70 plugs inside), an evaluation on the rock
677
+ inventory model card. `gea help catalog`.
678
+
651
679
  ### The log as delivered, and the historian
652
680
 
653
681
  A well log arrives as DLIS (API RP66 V1); `gea/dlis.py` reads the container
@@ -86,7 +86,7 @@ gea dashboard --catalog-well volve_f12_f14_production_excerpt:15/9-F-12:10000 --
86
86
  gea client-report --report accuracy --out client_report
87
87
  gea model-cards --out model_cards
88
88
  gea sbom --out sbom
89
- gea accept # the product gate (359 checks)
89
+ gea accept # the product gate (365 checks)
90
90
  gea help drift # the help library, by the job (16 pages; the same text is on every dashboard page)
91
91
  gea guide # the click-by-click tester guide (docs/TESTER_GUIDE.md)
92
92
  gea gui # the desktop window (pip install "gea-program[desktop]")
@@ -609,6 +609,34 @@ against it; `gea seedlink --config ... --hello` prints what a server says of
609
609
  itself; `gea help seedlink`. A TexNet station is served by EarthScope at
610
610
  `rtserve.iris.washington.edu:18000`, network `TX`.
611
611
 
612
+ ### Slip tendency on the mapped faults
613
+
614
+ The stress state the site declares - the three gradients and the ambient
615
+ pore pressure with their source, the SHmax azimuth with its source or from
616
+ the World Stress Map records near the well (`add-stress-map wsm2016.csv`,
617
+ `wsm --lat --lon`) - resolved on every mapped fault trace within the radius
618
+ of a well at the depth of its declared interval: the slip tendency at the
619
+ ambient and the increased pore pressure, the pressure to slip, the margin
620
+ left after the increase, worst and best declared case. The dip comes from
621
+ the layer where it states one (the Hennings 2021 BEG/TexNet layers do, and
622
+ publish their own pressure-to-slip, printed beside this arithmetic); UTM and
623
+ state-plane layers are unprojected from their .prj parameters. `set-stress`,
624
+ `slip --well`, `gea slip`; the SRA packet's section 2e; `gea help slip`. A
625
+ statement on declared inputs, not a probability and not a verdict.
626
+
627
+ ### The catalogue accounted for
628
+
629
+ `gea catalog --list` is the register of the 52 shipped public datasets: for
630
+ each, what in this program reads it, or CARRIED, NO BAND with the reason;
631
+ the gate holds the register to the code both ways and reads every entry.
632
+ `gea survey --catalog <entry>` runs the strata survey on any catalogue log
633
+ with its provenance; `gea catalog --friction` reads seven laboratory
634
+ datasets on natural fault and sediment samples as the measured friction
635
+ envelope (0.21-0.90 on 70 measurements, none from the Permian) against
636
+ Byerlee's 0.6; `gea catalog --core` checks the published sandstone range
637
+ against the Volve core (65 of 70 plugs inside), an evaluation on the rock
638
+ inventory model card. `gea help catalog`.
639
+
612
640
  ### The log as delivered, and the historian
613
641
 
614
642
  A well log arrives as DLIS (API RP66 V1); `gea/dlis.py` reads the container
@@ -123,7 +123,7 @@ from .profile_catalog import (
123
123
  read_pangaea_txt,
124
124
  )
125
125
 
126
- __version__ = "0.24.0"
126
+ __version__ = "0.26.0"
127
127
  __all__ = [
128
128
  "aging_rate", "rate_psi_yr", "accuracy_psi",
129
129
  "Sensor", "SimulatorConfig", "DownholeEngine",
@@ -278,6 +278,19 @@ def main(argv=None) -> int:
278
278
  p_lp.add_argument("--stream-csv", type=str, default=None, help="also write a historian-style CSV the other commands ingest")
279
279
  p_lp.add_argument("--selftest", action="store_true", help="etp: the codec round-trip and a session against the simulated store on the loopback")
280
280
 
281
+ p_sl = sub.add_parser("slip", help="slip tendency on the mapped faults of a layer at a position, from declared gradients: --layer --lat --lon --depth-ft --sv --shmin --shmax (--shmax-azimuth or --wsm)")
282
+ p_sl.add_argument("--layer", type=str, required=True); p_sl.add_argument("--member", type=str, default=None); p_sl.add_argument("--feature-kind", type=str, choices=["fault", "fold"], default=None)
283
+ p_sl.add_argument("--lat", type=float, required=True); p_sl.add_argument("--lon", type=float, required=True); p_sl.add_argument("--radius-km", type=float, default=25.0)
284
+ p_sl.add_argument("--depth-ft", type=float, required=True)
285
+ p_sl.add_argument("--sv", type=float, required=True); p_sl.add_argument("--shmin", type=float, required=True); p_sl.add_argument("--shmax", type=float, required=True)
286
+ p_sl.add_argument("--pp", type=float, default=0.433); p_sl.add_argument("--shmax-azimuth", type=float, default=None); p_sl.add_argument("--wsm", type=str, default=None, help="the WSM database CSV: the azimuth from its records within 100 km")
287
+ p_sl.add_argument("--dips", type=float, nargs="+", default=[60.0, 75.0, 90.0]); p_sl.add_argument("--mu", type=float, nargs="+", default=[0.6]); p_sl.add_argument("--delta-pp", type=float, default=0.0)
288
+ p_sl.add_argument("--json", action="store_true")
289
+ p_cat = sub.add_parser("catalog", help="the shipped catalogue: --list every entry with what reads it; --unused the carried ones; --check reads every entry; --friction the measured friction envelope; --core the core check; --entry X --info | --stream-csv")
290
+ p_cat.add_argument("--list", action="store_true"); p_cat.add_argument("--unused", action="store_true"); p_cat.add_argument("--check", action="store_true")
291
+ p_cat.add_argument("--friction", action="store_true"); p_cat.add_argument("--core", action="store_true")
292
+ p_cat.add_argument("--entry", type=str, default=None); p_cat.add_argument("--info", action="store_true"); p_cat.add_argument("--stream-csv", type=str, default=None)
293
+ p_cat.add_argument("--json", action="store_true")
281
294
  p_dl = sub.add_parser("dlis", help="a DLIS (RP66 V1) well log: --info describes it (origin, channels, frames, what was skipped); --frame --out writes the frame as a historian-style CSV; --to-las writes LAS 2.0")
282
295
  p_dl.add_argument("--file", type=str, required=True)
283
296
  p_dl.add_argument("--info", action="store_true")
@@ -314,7 +327,8 @@ def main(argv=None) -> int:
314
327
  "add-seismic", "refresh-seismic", "remove-seismic", "sar-film", "refresh-all", "add-track", "refresh-track", "remove-track",
315
328
  "seismic-dataset", "seismic-field", "add-site", "sites", "site-report", "remove-site", "rename",
316
329
  "set-well", "sra-define", "sra-report", "associate", "osdu-export", "quakeml-export", "well-identity", "vibration-report",
317
- "add-live-station", "live-fold", "live-run", "month-end", "add-layer", "layers", "remove-layer", "structure", "interval"])
330
+ "add-live-station", "live-fold", "live-run", "month-end", "add-layer", "layers", "remove-layer", "structure", "interval",
331
+ "set-stress", "add-stress-map", "wsm", "slip"])
318
332
  p_ws.add_argument("--stations", type=str, nargs="+", default=None, help="add-track: two or more array station ids of this workspace")
319
333
  p_ws.add_argument("--site", type=str, default=None, help="site-report/remove-site: the site id")
320
334
  p_ws.add_argument("--api", type=str, default=None, help="set-well: the API number")
@@ -394,6 +408,18 @@ def main(argv=None) -> int:
394
408
  p_ws.add_argument("--formation-name", type=str, default=None, help="add-layer: the formation a contours layer maps (Wolfcamp)")
395
409
  p_ws.add_argument("--role", type=str, choices=["top", "isopach", "base"], default=None, help="add-layer: what the contours are of that formation: its top elevation, its thickness, or its base")
396
410
  p_ws.add_argument("--base-interval-ft", type=float, default=None, help="set-well: base of the disposal interval, ft")
411
+ p_ws.add_argument("--feature-kind", type=str, choices=["fault", "fold"], default=None, help="add-layer: what every feature of a structure layer is when its attributes do not say")
412
+ p_ws.add_argument("--sv", type=float, default=None, help="set-stress: vertical stress gradient, psi/ft")
413
+ p_ws.add_argument("--shmin", type=float, default=None, help="set-stress: minimum horizontal stress gradient, psi/ft")
414
+ p_ws.add_argument("--shmax", type=float, default=None, help="set-stress: maximum horizontal stress gradient, psi/ft")
415
+ p_ws.add_argument("--pp", type=float, default=None, help="set-stress: ambient pore-pressure gradient, psi/ft (hydrostatic 0.433 unless declared)")
416
+ p_ws.add_argument("--shmax-azimuth", type=float, default=None, help="set-stress: SHmax azimuth, degrees from north (or leave it to the stress map)")
417
+ p_ws.add_argument("--azimuth-source", type=str, default=None, help="set-stress: where the azimuth came from")
418
+ p_ws.add_argument("--gradients-source", type=str, default=None, help="set-stress: where the gradients came from")
419
+ p_ws.add_argument("--dips", type=float, nargs="+", default=None, help="set-stress: the dips to run when the layer states none (default 60 75 90)")
420
+ p_ws.add_argument("--mu", type=float, nargs="+", default=None, help="set-stress: the friction coefficients to run (default 0.6)")
421
+ p_ws.add_argument("--delta-pp", type=float, default=None, help="set-stress / slip: the pore-pressure increase to judge at, psi")
422
+ p_ws.add_argument("--depth-ft", type=float, default=None, help="slip: the depth to judge at (default the midpoint of the declared interval)")
397
423
  p_ws.add_argument("--depth-ref", type=str, choices=["TVD", "MD"], default=None, help="set-well: the interval depths are true vertical (TVD) or measured (MD) depth")
398
424
  p_ws.add_argument("--ref-elev-ft", type=float, default=None, help="set-well: the reference elevation the depths are measured from, ft above sea level")
399
425
  p_ws.add_argument("--ref-elev-datum", type=str, choices=["KB", "GL", "DF"], default=None, help="set-well: what that elevation is: kelly bushing, ground level, derrick floor")
@@ -689,6 +715,7 @@ def main(argv=None) -> int:
689
715
  p_sy = sub.add_parser("survey", help="a LAS or DLIS file in, one strata report out (--demo: the bundled public KTB excerpt); --out writes report.txt + survey.json")
690
716
  p_sy.add_argument("--file", type=str, default=None, help="LAS 2.0 or DLIS (RP66 V1) file")
691
717
  p_sy.add_argument("--frame", type=str, default=None, help="DLIS: the frame to read when the file holds several (gea dlis --file X --info lists them)")
718
+ p_sy.add_argument("--catalog", type=str, default=None, help="a catalogue LAS entry instead of a file (gea catalog --list names them)")
692
719
  p_sy.add_argument("--demo", action="store_true")
693
720
  p_sy.add_argument("--family", type=str, default="continental_crystalline", help="prior family for the estimator")
694
721
  p_sy.add_argument("--lat", type=float, default=None)
@@ -823,9 +850,9 @@ def main(argv=None) -> int:
823
850
  elif a.cmd == "survey":
824
851
  import json as _json
825
852
  from .survey_cmd import run_survey
826
- if not (a.file or a.demo):
827
- raise SystemExit("survey needs --file <LAS or DLIS> or --demo")
828
- txt, machine = run_survey(path=a.file, demo=a.demo, family=a.family, lat=a.lat, elev=a.elev, frame=a.frame)
853
+ if not (a.file or a.demo or a.catalog):
854
+ raise SystemExit("survey needs --file <LAS or DLIS>, --catalog <entry> or --demo")
855
+ txt, machine = run_survey(path=a.file, demo=a.demo, family=a.family, lat=a.lat, elev=a.elev, frame=a.frame, catalog=a.catalog)
829
856
  print(txt)
830
857
  if a.out:
831
858
  os.makedirs(a.out, exist_ok=True)
@@ -2089,7 +2116,7 @@ def main(argv=None) -> int:
2089
2116
  elif a.action == "add-layer":
2090
2117
  if not a.layer or not a.name:
2091
2118
  raise SystemExit("add-layer needs --name <display> and --layer <shapefile zip | folder | .shp>")
2092
- L = ws.add_layer(a.layer, a.name, actor=a.actor, citation=a.citation, member=a.member, formation=a.formation_name, role=a.role)
2119
+ L = ws.add_layer(a.layer, a.name, actor=a.actor, citation=a.citation, member=a.member, formation=a.formation_name, role=a.role, feature_kind=a.feature_kind)
2093
2120
  tc = ", ".join(f"{k} {v}" for k, v in list(L["type_counts"].items())[:6])
2094
2121
  print(f"layer {L['id']} ({L['kind']}): {L['n_features']} {L['shape_type']} features, {L['crs']['kind']} {L['crs'].get('datum') or ''}, extent lon {L['bbox'][0]:.3f}..{L['bbox'][2]:.3f} lat {L['bbox'][1]:.3f}..{L['bbox'][3]:.3f}"
2095
2122
  + (f"; contour value {L['value_attr']}" if L.get('value_attr') else ''))
@@ -2118,6 +2145,32 @@ def main(argv=None) -> int:
2118
2145
  for line in L["lines"]:
2119
2146
  print(" " + line)
2120
2147
  return 0 if r["status"] == "OK" else 1
2148
+ elif a.action == "set-stress":
2149
+ st = ws.set_stress({"sv_psi_ft": a.sv, "shmin_psi_ft": a.shmin, "shmax_psi_ft": a.shmax, "pp_psi_ft": a.pp, "shmax_azimuth_deg": a.shmax_azimuth,
2150
+ "azimuth_source": a.azimuth_source, "gradients_source": a.gradients_source, "dips_deg": a.dips, "mus": a.mu, "delta_pp_psi": a.delta_pp, "note": a.note or ""}, actor=a.actor)
2151
+ print(f"stress: Sv {st['sv_psi_ft']} Shmin {st['shmin_psi_ft']} SHmax {st['shmax_psi_ft']} Pp {st['pp_psi_ft']} psi/ft ({st['gradients_source']}); "
2152
+ f"SHmax azimuth {st.get('shmax_azimuth_deg', 'from the stress map')} ({st.get('azimuth_source', '')}); dips {st['dips_deg']}; mu {st['mus']}; delta Pp {st['delta_pp_psi']} psi"); return 0
2153
+ elif a.action == "add-stress-map":
2154
+ if not a.file:
2155
+ raise SystemExit("add-stress-map needs --file <wsm.csv>")
2156
+ r = ws.add_stress_map(a.file, actor=a.actor, citation=a.citation)
2157
+ print(f"stress map: {r['n_records']} records kept as {r['file']} (sha256 {r['sha256'][:16]})"); return 0
2158
+ elif a.action == "wsm":
2159
+ if a.lat is None or a.lon is None:
2160
+ raise SystemExit("wsm needs --lat --lon [--radius-km]")
2161
+ r = ws.wsm_at(a.lat, a.lon, a.radius_km if a.radius_km is not None else 100.0)
2162
+ print(r.get("statement") or f"{r['status']}: {r.get('note', '')}")
2163
+ for rec in r.get("records", [])[:10]:
2164
+ print(f" {rec['distance_km']:7.1f} km {rec['azimuth']:5.0f} deg {rec['quality']} {rec['regime'] or '?':3s} {rec['type']:4s} {rec['locality'][:40]}")
2165
+ return 0 if r.get("n") else 1
2166
+ elif a.action == "slip":
2167
+ if not a.well:
2168
+ raise SystemExit("slip needs --well <id>")
2169
+ r = ws.well_slip(a.well, a.radius_km if a.radius_km is not None else 25.0, delta_pp_psi=a.delta_pp, depth_ft=a.depth_ft, actor=a.actor)
2170
+ print(f"slip {a.well}: {r['status']}")
2171
+ for line in r["lines"]:
2172
+ print(" " + line)
2173
+ return 0 if r["status"] == "OK" else 1
2121
2174
  elif a.action == "interval":
2122
2175
  if not a.well:
2123
2176
  raise SystemExit("interval needs --well <id>")
@@ -2298,6 +2351,85 @@ def main(argv=None) -> int:
2298
2351
  stop.set()
2299
2352
  print("etp-sim: stopped")
2300
2353
  return 0
2354
+ elif a.cmd == "slip":
2355
+ import json as _json
2356
+ from . import shapefile as _SF, slip as _SL, friction_priors as _FP
2357
+ try:
2358
+ L = _SF.read(a.layer, member=a.member)
2359
+ except (ValueError, OSError) as e:
2360
+ raise SystemExit(f"slip: {e}")
2361
+ if a.feature_kind:
2362
+ L.declared_kind = a.feature_kind
2363
+ az, az_src = a.shmax_azimuth, "declared"
2364
+ if az is None and a.wsm:
2365
+ nb = _SL.wsm_nearby(_SL.read_wsm(a.wsm), a.lat, a.lon, 100.0)
2366
+ if not nb["n"]:
2367
+ raise SystemExit("slip: no World Stress Map record of quality A/B/C within 100 km; declare --shmax-azimuth with its source")
2368
+ az, az_src = nb["azimuth_mean"], nb["statement"]
2369
+ if az is None:
2370
+ raise SystemExit("slip: give --shmax-azimuth or --wsm <wsm.csv>")
2371
+ faults = _SL.faults_in_radius(L, a.lat, a.lon, a.radius_km)
2372
+ r = _SL.statement(faults, a.depth_ft, {"sv_psi_ft": a.sv, "shmin_psi_ft": a.shmin, "shmax_psi_ft": a.shmax, "pp_psi_ft": a.pp}, az, tuple(a.dips), tuple(a.mu), a.delta_pp,
2373
+ sources={"shmax_azimuth": az_src, "gradients": "the command line"})
2374
+ r["friction_envelope"] = _FP.envelope()
2375
+ if a.json:
2376
+ print(_json.dumps(r, indent=1, default=str)); return 0
2377
+ for line in r["lines"]:
2378
+ print(line)
2379
+ print(r["friction_envelope"].get("statement", ""))
2380
+ return 0
2381
+ elif a.cmd == "catalog":
2382
+ import json as _json
2383
+ from . import catalog_register as _CR
2384
+ if a.friction:
2385
+ from . import friction_priors as _FP
2386
+ print(_json.dumps({"measured": _FP.measured(), "envelope": _FP.envelope()}, indent=1, default=str) if a.json else _FP.text()); return 0
2387
+ if a.core:
2388
+ from .rock_inventory import core_check
2389
+ c = core_check()
2390
+ print(_json.dumps(c, indent=1) if a.json else (f"core check ({c.get('entry')}): {c.get('how')}\n grain density {c['grain_density']['min']}-{c['grain_density']['max']} g/cc, porosity "
2391
+ f"{c['porosity_frac']['min']:.3f}-{c['porosity_frac']['max']:.3f}, bulk {c['bulk_density']['min']}-{c['bulk_density']['max']} g/cc; {c['outside']} plug(s) outside the range\n source: {c['source']} [{c['license']}]" if c.get('status') == 'OK' else str(c)))
2392
+ return 0
2393
+ if a.check:
2394
+ rows = _CR.check_all()
2395
+ bad = [r for r in rows if not r["ok"]]
2396
+ for r in rows:
2397
+ print(f" {'ok ' if r['ok'] else 'BAD'} {r['entry']:<40s} {r['shape']}")
2398
+ print(f"catalog: {len(rows) - len(bad)} of {len(rows)} entries read through their own readers" + (f"; {len(bad)} did not" if bad else ""))
2399
+ return 0 if not bad else 1
2400
+ if a.entry:
2401
+ from .profile_catalog import CATALOG as _CAT
2402
+ e = _CAT.get(a.entry)
2403
+ if e is None:
2404
+ raise SystemExit(f"catalog: no entry {a.entry!r} (gea catalog --list)")
2405
+ if a.stream_csv:
2406
+ st = e.stream()
2407
+ import csv as _csv
2408
+ with open(a.stream_csv, "w", newline="", encoding="utf-8") as f:
2409
+ wr = _csv.writer(f)
2410
+ wr.writerow([st.index_kind] + list(st.channels)); wr.writerow([""] + [st.channels[c].unit for c in st.channels])
2411
+ for i in range(len(st.index)):
2412
+ wr.writerow([float(st.index[i])] + ["" if st.channels[c].values[i] != st.channels[c].values[i] else float(st.channels[c].values[i]) for c in st.channels])
2413
+ print(f"{a.entry}: {len(st.index)} rows x {len(st.channels)} channels -> {a.stream_csv}")
2414
+ reg = next(r for r in _CR.register() if r["entry"] == a.entry)
2415
+ if a.json:
2416
+ print(_json.dumps({"register": reg, "provenance": e.provenance}, indent=1, default=str))
2417
+ else:
2418
+ print(f"{a.entry}: {reg['kind']} ({reg['tier']}), {reg['file']} {reg['bytes']:,} bytes, {reg['status']}")
2419
+ for u in reg["used_by"]:
2420
+ print(" used by:", u)
2421
+ for k in ("well", "source_database", "source_url", "license", "fetch_date", "coverage", "purpose"):
2422
+ if e.provenance.get(k):
2423
+ print(f" {k}: {str(e.provenance[k])[:300]}")
2424
+ print(" reads as:", _CR.check_entry(e)["shape"])
2425
+ return 0
2426
+ rows = _CR.register()
2427
+ if a.json:
2428
+ print(_json.dumps({"entries": rows, "audit": _CR.audit()}, indent=1, default=str)); return 0
2429
+ print(_CR.text(rows, unused_only=a.unused))
2430
+ if a.unused:
2431
+ print(f"\n {_CR.NO_BAND_REASON}")
2432
+ return 0
2301
2433
  elif a.cmd == "dlis":
2302
2434
  import json as _json
2303
2435
  from .dlis import DlisError, DlisFile, read as _read_dlis