gea-program 0.35.0__tar.gz → 0.36.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.
- {gea_program-0.35.0/gea_program.egg-info → gea_program-0.36.0}/PKG-INFO +18 -1
- {gea_program-0.35.0 → gea_program-0.36.0}/README.md +17 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/__init__.py +1 -1
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/__main__.py +45 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/acceptance_tests.py +188 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/geodesy.py +1 -0
- gea_program-0.36.0/gea/help/well3d.md +11 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/helplib.py +2 -1
- gea_program-0.36.0/gea/reference/volve_3d.provenance.json +198 -0
- gea_program-0.36.0/gea/reference/volve_surfaces.json.gz +0 -0
- gea_program-0.36.0/gea/reference/volve_traj_F-10.xml.gz +0 -0
- gea_program-0.36.0/gea/reference/volve_traj_F-4.xml.gz +0 -0
- gea_program-0.36.0/gea/reference/volve_traj_F-5_12.25in.xml.gz +0 -0
- gea_program-0.36.0/gea/reference/volve_traj_F-5_17.5in.xml.gz +0 -0
- gea_program-0.36.0/gea/reference/volve_traj_F-5_36in.xml.gz +0 -0
- gea_program-0.36.0/gea/reference/volve_traj_F-5_8.5in.xml.gz +0 -0
- gea_program-0.36.0/gea/reference/volve_well_picks.csv.gz +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/service.py +25 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/web/app.html +199 -2
- gea_program-0.36.0/gea/well3d.py +688 -0
- {gea_program-0.35.0 → gea_program-0.36.0/gea_program.egg-info}/PKG-INFO +18 -1
- {gea_program-0.35.0 → gea_program-0.36.0}/gea_program.egg-info/SOURCES.txt +11 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/pyproject.toml +1 -1
- {gea_program-0.35.0 → gea_program-0.36.0}/LICENSE +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/BENCH_TEST_PROTOCOL.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/accuracy_statement.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/alarm_engine.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/backup.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/bench.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/blind_harness.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/acex_lomonosov_age_depth_model.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/acex_lomonosov_age_depth_model.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/agassiz77_canada_temperature.csv +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/agassiz77_canada_temperature.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/barbados_110_consolidation.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/barbados_110_consolidation.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/bengal_u1452_grain_size.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/bengal_u1452_grain_size.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/blake_164_methane_isotopes.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/blake_164_methane_isotopes.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/chicxulub_m0077a_pwave_velocity.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/collingwood_1_28_ks_complete.las +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/collingwood_1_28_ks_complete.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/costa_rica_odp_friction_envelope.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/costa_rica_odp_friction_envelope.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/dead_sea_5017_debrite_xrf_ms.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/dsdp_504b_physical_properties.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/dsdp_504b_physical_properties.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/dsdp_504b_sound_velocity.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/dsdp_504b_sound_velocity.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/elgygytgyn_5011_turbidites.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/elgygytgyn_5011_turbidites.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/epica_domec_co2_800kyr.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/epica_domec_co2_800kyr.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/fram_909_organic_petrography.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/fram_909_organic_petrography.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/gbr_325_coral_uth_ages.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/gbr_325_coral_uth_ages.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/gisp2_greenland_temperature.csv +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/gisp2_greenland_temperature.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/gom_308_t2p_insitu.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/gom_308_t2p_insitu.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/guaymas_385_dom_d13c.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/guaymas_385_dom_d13c.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/hikurangi_u1520_friction_insitu.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/hikurangi_u1520_friction_insitu.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/hydrate_ridge_204_ncr_hydrate.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/iodp_u1324_pore_pressure.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/iodp_u1324_pore_pressure.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/jfast_c0019_slow_slip_events.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/jfast_c0019_slow_slip_events.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/kennetcook_2_p129_excerpt.las +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/kennetcook_2_p129_excerpt.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/ktb_hb_bhgm_density.dat +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/ktb_hb_bhgm_density.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/ktb_hb_complog_6020_excerpt.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/ktb_hb_complog_6020_excerpt.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/ktb_hb_hlog246_temperature.dat +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/ktb_hb_hlog246_temperature.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/ktb_hb_rockmech_compress.dat +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/ktb_hb_rockmech_compress.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.dat +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/ktb_hb_tvd_0_9080_excerpt.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/ktb_vb_rockmech_compress.dat +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/ktb_vb_rockmech_compress.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/ktb_vb_vlog251_temperature.dat +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/ktb_vb_vlog251_temperature.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/l06_06_nl_survey.csv +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/l06_06_nl_survey.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/l07_01_nl_excerpt.las +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/l07_01_nl_excerpt.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/mariana_1200_serpentinite_geochem.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/mariana_1200_serpentinite_geochem.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/med_160_sapropels.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/med_160_sapropels.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/nankai_megasplay_shear_strength.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/nankai_megasplay_shear_strength.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/odp_1027b_thermal_conductivity.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/odp_1027b_thermal_conductivity.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/odp_1027c_cork_temperature.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/odp_1027c_cork_temperature.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/odp_1165b_thermal_conductivity.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/odp_1165b_thermal_conductivity.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/odp_1274a_mantle_peridotite_mad.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/odp_504b_dike_elastic_moduli.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/odp_504b_dike_elastic_moduli.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/odp_504b_leg137_borehole_fluids.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/odp_504b_leg137_borehole_fluids.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/odp_735b_gabbro_elastic_moduli.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/peru_201_sulfate_reduction.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/peru_201_sulfate_reduction.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/scorpio_e1_sa_excerpt.las +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/scorpio_e1_sa_excerpt.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/sumatra_362_cohesion.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/sumatra_362_cohesion.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/university_6_17_no1_tx_excerpt.las +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/university_6_17_no1_tx_excerpt.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/ursa_308_xrd_mineralogy.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/ursa_308_xrd_mineralogy.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/volve_15_9_19_sr_excerpt.las +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/volve_15_9_19_sr_excerpt.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/volve_15_9_19a_core_excerpt.csv +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/volve_15_9_19a_core_excerpt.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/volve_f12_f14_production_excerpt.csv +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/volve_f12_f14_production_excerpt.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/walvis_208_petm_carbonate.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/walvis_208_petm_carbonate.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/woodlark_1109_rock_eval.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog/woodlark_1109_rock_eval.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog_map.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/catalog_register.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/certificates.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/cli.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/client_reports.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/config_versioning.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/conformance.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/control_room.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/correlation.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/dashboard.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/deviation.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/dlis.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/dnp3.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/doctor.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/downhole_engine.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/drift_monitor.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/earth_model.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/edr.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/elevation.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/etp.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/etp12_schemas.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/example_register_map.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/fat_sat.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/files.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/fixtures/README.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/fixtures/comcat_delaware_basin_2026-09.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/fixtures/comcat_youngstown_2011-2012.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/fixtures/ne_110m_coastline.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/follower.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/forward_model.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/friction_priors.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/gamma.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/gauge_aging.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/gauge_specs.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/gravity_reference.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/hartip.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/TESTER_GUIDE.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/alarms.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/audit-update.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/backup.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/catalog.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/charts.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/conformance.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/control-room.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/data-in.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/dlis.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/doctor.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/drift.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/edr.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/etp.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/field-ports.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/files.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/historian.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/instruments.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/interval.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/map.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/month-end.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/notifications.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/osdu.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/patches.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/ppdm.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/quakeml.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/quality.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/seedlink.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/seismic.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/setup.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/site.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/sites.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/slip.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/soak.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/sra.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/start.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/structure.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/tools.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/transients.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/upkeep.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/vibration.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/help/well-tests.md +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/housekeeping.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/interval.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/inverse_engine.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/jobs.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/live_ports.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/loadtest.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/matplotlib_demo.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/modbus.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/modbus_rtu.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/model_card.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/month_end.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/mqtt_port.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/notify.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/opcua_port.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/operator_app.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/osdu.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/patches.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/permits.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/piwebapi.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/ports.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/ppdm.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/profile_catalog.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/project.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/qt6_downhole_app.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/quakeml.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/reconciler.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/reference/IU_ANMO_10_BHZ_response.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/reference/IU_ANMO_10_BHZ_response.xml +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/reference/libmseed_steim.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/reference/libmseed_steim1_4096.mseed +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/reference/libmseed_steim2_4096.mseed +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/reference/libmseed_steim2_512.mseed +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/reference/tool_sources.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/reference/us_outline.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/reference/us_outline.provenance.json +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/rock_inventory.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/sample_record.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/sample_well_profile.csv +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/sbom.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/seedlink.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/segy.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/seismic.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/seismic_array.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/seismic_assoc.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/seismic_detect.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/seismic_film.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/seismic_harmonic.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/seismic_qc.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/seismic_response.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/seismic_signature.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/seismic_track.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/seismic_uncertainty.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/seismic_unlisted.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/sensor_swap.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/series_cache.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/service_life.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/setup_checklist.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/shapefile.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/shell.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/shut_in.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/site_map.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/sla_report.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/slip.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/soak.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/sra.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/store_forward.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/strata_join.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/structure.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/supervisor.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/survey_cmd.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/survey_view.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/telemetry.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/tool_catalog.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/tool_library.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/tool_taxonomy.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/transient.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/vibration.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/well_assembler.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/well_test_validation.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/wits0.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/witsml.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea/workspace.py +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea_program.egg-info/dependency_links.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea_program.egg-info/entry_points.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea_program.egg-info/requires.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/gea_program.egg-info/top_level.txt +0 -0
- {gea_program-0.35.0 → gea_program-0.36.0}/setup.cfg +0 -0
- {gea_program-0.35.0 → gea_program-0.36.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.
|
|
3
|
+
Version: 0.36.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
|
|
@@ -648,6 +648,23 @@ 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
|
+
### The well in 3D
|
|
652
|
+
|
|
653
|
+
The 3D tab draws each well's path from its directional survey by the
|
|
654
|
+
minimum-curvature method, below sea level from its declared rig floor, among
|
|
655
|
+
the mapped formations - interpreted horizon surfaces, or a formation-top
|
|
656
|
+
map's contours at their elevations - with its picks on it. Colour the wells
|
|
657
|
+
by formation, inclination, dogleg severity, or a drilling recorder's gamma,
|
|
658
|
+
rate of penetration or weight on bit along the bit depth; replay the bit
|
|
659
|
+
going down the hole from the recorder's bit depth or the survey stations'
|
|
660
|
+
own times. Turn, pan and zoom by pointer, touch or keys. The Volve field
|
|
661
|
+
(Equinor's open data: three original surveys, the field's formation picks,
|
|
662
|
+
five mapped horizons) ships as the worked example, checked against itself.
|
|
663
|
+
Until then the workspace's formation-top contours are drawn on their own.
|
|
664
|
+
A workspace well is drawn once it has a position, a reference elevation and
|
|
665
|
+
a survey: `gea trajectory` attaches one, verbatim, with its azimuth
|
|
666
|
+
reference stated. `gea well3d`, `gea help well3d`.
|
|
667
|
+
|
|
651
668
|
### The control room
|
|
652
669
|
|
|
653
670
|
The Control room tab opens the wall: a screen read from across the room, one
|
|
@@ -609,6 +609,23 @@ 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
|
+
### The well in 3D
|
|
613
|
+
|
|
614
|
+
The 3D tab draws each well's path from its directional survey by the
|
|
615
|
+
minimum-curvature method, below sea level from its declared rig floor, among
|
|
616
|
+
the mapped formations - interpreted horizon surfaces, or a formation-top
|
|
617
|
+
map's contours at their elevations - with its picks on it. Colour the wells
|
|
618
|
+
by formation, inclination, dogleg severity, or a drilling recorder's gamma,
|
|
619
|
+
rate of penetration or weight on bit along the bit depth; replay the bit
|
|
620
|
+
going down the hole from the recorder's bit depth or the survey stations'
|
|
621
|
+
own times. Turn, pan and zoom by pointer, touch or keys. The Volve field
|
|
622
|
+
(Equinor's open data: three original surveys, the field's formation picks,
|
|
623
|
+
five mapped horizons) ships as the worked example, checked against itself.
|
|
624
|
+
Until then the workspace's formation-top contours are drawn on their own.
|
|
625
|
+
A workspace well is drawn once it has a position, a reference elevation and
|
|
626
|
+
a survey: `gea trajectory` attaches one, verbatim, with its azimuth
|
|
627
|
+
reference stated. `gea well3d`, `gea help well3d`.
|
|
628
|
+
|
|
612
629
|
### The control room
|
|
613
630
|
|
|
614
631
|
The Control room tab opens the wall: a screen read from across the room, one
|
|
@@ -475,6 +475,23 @@ def main(argv=None) -> int:
|
|
|
475
475
|
p_ck.add_argument("--note", type=str, default="", help="--confirm: what it was checked against (required)")
|
|
476
476
|
p_ck.add_argument("--actor", type=str, default="cli")
|
|
477
477
|
|
|
478
|
+
p_tj = sub.add_parser("trajectory", help="attach a well's directional survey (WITSML trajectory or a table of MD, Inc, Azi), kept verbatim beside the well, so the 3D tab can draw its path")
|
|
479
|
+
p_tj.add_argument("--workspace", type=str, required=True)
|
|
480
|
+
p_tj.add_argument("--well", type=str, required=True)
|
|
481
|
+
p_tj.add_argument("--file", type=str, required=True)
|
|
482
|
+
p_tj.add_argument("--azimuth-reference", type=str, required=True, choices=("grid", "true", "magnetic"))
|
|
483
|
+
p_tj.add_argument("--grid", type=str, default=None, help="grid azimuths: the grid, e.g. TX_CENTRAL or UTM14N")
|
|
484
|
+
p_tj.add_argument("--declination", type=float, default=None, help="magnetic azimuths: the declination used, degrees east positive")
|
|
485
|
+
p_tj.add_argument("--md-unit", type=str, default="ft", choices=("ft", "m"))
|
|
486
|
+
p_tj.add_argument("--depth-reference", type=str, default=None, help="KB, DF or GL: must match the well's declared reference elevation")
|
|
487
|
+
p_tj.add_argument("--source", type=str, required=True, help='where the survey came from, e.g. "RRC imaged records, directional survey"')
|
|
488
|
+
p_tj.add_argument("--actor", type=str, default="cli")
|
|
489
|
+
|
|
490
|
+
p_3d = sub.add_parser("well3d", help="the 3D scene in words: each well's path, how it was checked, the surfaces and the replay (the 3D tab draws it)")
|
|
491
|
+
p_3d.add_argument("--scene", type=str, default="volve", choices=("volve", "workspace"))
|
|
492
|
+
p_3d.add_argument("--workspace", type=str, default=None)
|
|
493
|
+
p_3d.add_argument("--json", action="store_true")
|
|
494
|
+
|
|
478
495
|
p_wl = sub.add_parser("wall", help="the control-room board as text: a line per well, worst first, its state and why (the same board the wall screen shows)")
|
|
479
496
|
p_wl.add_argument("--workspace", type=str, default=None, help="the workspace folder, e.g. C:\\site")
|
|
480
497
|
p_wl.add_argument("--json", action="store_true")
|
|
@@ -1937,6 +1954,34 @@ def main(argv=None) -> int:
|
|
|
1937
1954
|
else:
|
|
1938
1955
|
print(_SC.text(r))
|
|
1939
1956
|
return 0 if r["ready"] else 2
|
|
1957
|
+
elif a.cmd in ("trajectory", "well3d"):
|
|
1958
|
+
import json as _json
|
|
1959
|
+
from . import well3d as _W3
|
|
1960
|
+
from .cli import _safe_stdout
|
|
1961
|
+
from .workspace import Workspace, WorkspaceError
|
|
1962
|
+
_safe_stdout()
|
|
1963
|
+
ws = None
|
|
1964
|
+
if a.cmd == "trajectory" or a.scene == "workspace":
|
|
1965
|
+
if not a.workspace:
|
|
1966
|
+
raise SystemExit(f"{a.cmd} needs --workspace, e.g. --workspace C:\\site")
|
|
1967
|
+
try:
|
|
1968
|
+
ws = Workspace(a.workspace)
|
|
1969
|
+
except WorkspaceError as e:
|
|
1970
|
+
raise SystemExit(f"{a.cmd}: {e}")
|
|
1971
|
+
if a.cmd == "trajectory":
|
|
1972
|
+
try:
|
|
1973
|
+
with open(a.file, "rb") as f:
|
|
1974
|
+
content = f.read()
|
|
1975
|
+
r = _W3.attach_trajectory(ws, a.well, a.file, content, a.actor, a.azimuth_reference, a.md_unit, a.depth_reference, a.grid,
|
|
1976
|
+
a.declination, a.source)
|
|
1977
|
+
except (ValueError, OSError, WorkspaceError) as e:
|
|
1978
|
+
raise SystemExit(f"trajectory: {e}")
|
|
1979
|
+
print(f"{a.well}: {r['stations']} stations, {r['md_range_m'][0]:,.1f} to {r['md_range_m'][1]:,.1f} m MD, azimuths {r['azimuth_reference']}"
|
|
1980
|
+
+ (f" ({r['grid']})" if r.get('grid') else "") + f"; kept as wells/{a.well}/trajectory/{r['file']}")
|
|
1981
|
+
return 0
|
|
1982
|
+
sc = _W3.scene(ws, a.scene)
|
|
1983
|
+
print(_json.dumps(sc, indent=1) if a.json else _W3.text(sc))
|
|
1984
|
+
return 0
|
|
1940
1985
|
elif a.cmd in ("wall", "handover"):
|
|
1941
1986
|
import json as _json
|
|
1942
1987
|
from . import control_room as _CR
|
|
@@ -8613,6 +8613,193 @@ def section_cd_control_room(tmp: str) -> None:
|
|
|
8613
8613
|
+ (f" [failed: {', '.join(failed3)}]" if failed3 else ""))
|
|
8614
8614
|
|
|
8615
8615
|
|
|
8616
|
+
|
|
8617
|
+
def section_ce_well3d(tmp: str) -> None:
|
|
8618
|
+
"""Section CE - the well in 3D: the minimum-curvature method against a known arc and against the survey companies'
|
|
8619
|
+
own positions, the shipped Volve excerpt checked against itself (frame, picks, surfaces, provenance), a workspace
|
|
8620
|
+
well drawn from an attached survey among its formation-top contours with its recorder replay, the API and the tab."""
|
|
8621
|
+
import base64 as _b64
|
|
8622
|
+
import gzip as _gz
|
|
8623
|
+
import hashlib as _hl
|
|
8624
|
+
import http.cookiejar
|
|
8625
|
+
import math as _m
|
|
8626
|
+
import subprocess as _sp
|
|
8627
|
+
import urllib.request
|
|
8628
|
+
import urllib.error
|
|
8629
|
+
from . import edr as E
|
|
8630
|
+
from . import geodesy as G
|
|
8631
|
+
from . import helplib as H
|
|
8632
|
+
from . import shapefile as SF
|
|
8633
|
+
from . import well3d as W
|
|
8634
|
+
from .workspace import Workspace
|
|
8635
|
+
from .service import Service, Users
|
|
8636
|
+
pkg = Path(__file__).parent
|
|
8637
|
+
d = Path(tmp, "ce"); d.mkdir()
|
|
8638
|
+
|
|
8639
|
+
R = 1000.0
|
|
8640
|
+
q = W.min_curvature([0.0, _m.pi * R / 2], [0.0, 90.0], [0.0, 0.0])
|
|
8641
|
+
p_arc = W.Path([0.0, _m.pi * R / 2], [0.0, 90.0], [0.0, 0.0], 0.0, 0.0, 0.0)
|
|
8642
|
+
mid = p_arc.at(_m.pi * R / 4)
|
|
8643
|
+
tr4 = W.read_witsml_trajectory(_gz.decompress((pkg / "reference" / "volve_traj_F-4.xml.gz").read_bytes()).decode())[0]
|
|
8644
|
+
tr10 = W.read_witsml_trajectory(_gz.decompress((pkg / "reference" / "volve_traj_F-10.xml.gz").read_bytes()).decode())[0]
|
|
8645
|
+
f5 = [t for n in ("36in", "17.5in", "12.25in", "8.5in") for t in W.read_witsml_trajectory(_gz.decompress((pkg / "reference" / f"volve_traj_F-5_{n}.xml.gz").read_bytes()).decode())]
|
|
8646
|
+
rep5, _ = W.replay_from_stations(f5)
|
|
8647
|
+
rep4, note4 = W.replay_from_stations([tr4])
|
|
8648
|
+
csv_ok = "MD (ft),Inc (deg),Azi (deg)\n0,0,0\n1000,0,0\n2000,10,90\n3000,30,90\n4000,45,95\n5750,60,100\n"
|
|
8649
|
+
refused = []
|
|
8650
|
+
for bad in ("Depth,Angle\n0,0\n", "MD,Inc,Azi\n0,0,0\n0,1,2\n", "MD,Inc,Azi\n0,0,0\n100,x,2\n", "MD,Inc,Azi\n0,0,0\n100,200,2\n"):
|
|
8651
|
+
try:
|
|
8652
|
+
W.read_survey_csv(bad)
|
|
8653
|
+
except ValueError:
|
|
8654
|
+
refused.append(True)
|
|
8655
|
+
st_csv = W.read_survey_csv(csv_ok, "ft")
|
|
8656
|
+
c1 = {
|
|
8657
|
+
"arc": abs(q["n"][1] - R) < 1e-9 and abs(q["v"][1] - R) < 1e-9 and abs(mid[1] - R * (1 - _m.cos(_m.pi / 4))) < 1e-6
|
|
8658
|
+
and abs(mid[2] - R * _m.sin(_m.pi / 4)) < 1e-6 and abs(q["dls"][1] - 90.0 / (_m.pi * R / 2) * 30.0) < 1e-9,
|
|
8659
|
+
"units": tr4["azi_ref"] == "true north" and abs(tr4["stations"][40]["incl"] - _m.degrees(0.446106147512686)) < 1e-9 and tr10["grid_cor_deg"] == -0.95
|
|
8660
|
+
and len(tr4["stations"]) == 87 and abs(st_csv[-1]["md"] - 5750 * 0.3048) < 1e-9,
|
|
8661
|
+
"company": all(x is not None and x < 0.01 for x in (W.file_position_miss(tr4["stations"]), W.file_position_miss(tr10["stations"]),
|
|
8662
|
+
W.file_position_miss(f5[-1]["stations"]))),
|
|
8663
|
+
"csv": len(refused) == 4,
|
|
8664
|
+
"replay": rep5 is not None and len(rep5["t"]) == 100 and rep5["t"][0].startswith("2007-11-16") and rep5["t"][-1].startswith("2008-07-29")
|
|
8665
|
+
and rep4 is None and "1 distinct time" in note4 and all(m0 <= m1 or t0 < t1 for (t0, m0), (t1, m1) in zip(zip(rep5["t"], rep5["md"]), zip(rep5["t"][1:], rep5["md"][1:]))),
|
|
8666
|
+
}
|
|
8667
|
+
failed1 = [k for k, v in c1.items() if not v]
|
|
8668
|
+
ok(not failed1,
|
|
8669
|
+
"CE1 the minimum-curvature method: a quarter circle of 1,000 m radius ends 1,000 m out and 1,000 m down, and its middle lies on the arc "
|
|
8670
|
+
"(292.9 m out, 707.1 m down), not on a chord; the WITSML reader takes radians and degrees alike; the paths computed from the Volve files "
|
|
8671
|
+
"reproduce the TVD and displacements the survey companies wrote in them to under a centimetre; a survey table without its columns, with a "
|
|
8672
|
+
"repeated depth or a bad row refused; the replay only from stations measured while drilling (F-5: 100 steps, Nov 2007 to Jul 2008; F-4's "
|
|
8673
|
+
"one-time resurvey not replayed)"
|
|
8674
|
+
+ (f" [failed: {', '.join(failed1)}]" if failed1 else ""))
|
|
8675
|
+
|
|
8676
|
+
sc = W.volve_scene()
|
|
8677
|
+
wl = {w["id"]: w for w in sc["wells"]}
|
|
8678
|
+
picks = W.volve_picks()
|
|
8679
|
+
dms = lambda dd, mm, ss: dd + mm / 60 + ss / 3600
|
|
8680
|
+
frame = []
|
|
8681
|
+
for wn, la, lo in (("NO 15/9-F-1 C", dms(58, 26, 29.907), dms(1, 53, 14.708)), ("NO 15/9-F-11 B", dms(58, 26, 29.960), dms(1, 53, 14.870))):
|
|
8682
|
+
sb = next(p for p in picks if p["WELL"] == wn and p["PICKS"] == "Seabed")
|
|
8683
|
+
a = G.unproject(float(sb["EASTING"]), float(sb["NORTHING"]), G.utm(31, True, "INTL1924"))
|
|
8684
|
+
b = G.unproject(float(sb["EASTING"]), float(sb["NORTHING"]), G.utm(31, True, "WGS84"))
|
|
8685
|
+
frame.append((G.geodesic_m(a[0], a[1], la, lo)["distance_m"], G.geodesic_m(b[0], b[1], la, lo)["distance_m"]))
|
|
8686
|
+
prov = json.loads((pkg / "reference" / "volve_3d.provenance.json").read_text(encoding="utf-8"))
|
|
8687
|
+
hashes_ok = all(_hl.sha256((pkg / "reference" / k).read_bytes()).hexdigest() == v["sha256"] for k, v in prov["outputs"].items())
|
|
8688
|
+
pts = prov["outputs"]["volve_surfaces.json.gz"]["points"]
|
|
8689
|
+
# the repository stores every text file with LF line ends (.gitattributes: text=auto eol=lf), so a package file holding
|
|
8690
|
+
# CRLF would reach a checkout - and the published wheel - as different bytes from the ones hashed here
|
|
8691
|
+
crlf = []
|
|
8692
|
+
for dp, dn, fn in os.walk(pkg):
|
|
8693
|
+
dn[:] = [x for x in dn if x not in ("__pycache__", "catalog_operator")]
|
|
8694
|
+
for f_ in fn:
|
|
8695
|
+
b_ = Path(dp, f_).read_bytes()
|
|
8696
|
+
if b"\0" not in b_[:8000] and b"\r\n" in b_:
|
|
8697
|
+
crlf.append(os.path.relpath(os.path.join(dp, f_), pkg))
|
|
8698
|
+
c2 = {
|
|
8699
|
+
"frame": all(a < 0.1 and 140 < b < 160 for a, b in frame) and "ED50" in sc["frame"]["crs"],
|
|
8700
|
+
"picks": all(wl[k]["pick_miss_max_m"] < 0.3 and abs(wl[k]["ref_elev_m"] - 54.9) < 1e-6 for k in ("F-4", "F-5", "F-10"))
|
|
8701
|
+
and abs(wl["F-10"]["td_md"] - 5300.07) < 0.01 and len(sc["picks_only"]) == 31,
|
|
8702
|
+
"azimuth": wl["F-4"]["azimuth"]["applied"] == "as grid" and "14 m" in wl["F-4"]["azimuth"]["note"] and wl["F-5"]["azimuth"]["file_reference"] == "grid north",
|
|
8703
|
+
"surfaces": len(sc["surfaces"]) == 5 and all(s["affine_miss_m"] < 0.01 and s["tie_median_m"] < 7.0 and len(s["ties"]) >= 23 for s in sc["surfaces"])
|
|
8704
|
+
and all(pts[s["id"]] == [s["n_source_points"], s["n_points"]] for s in sc["surfaces"])
|
|
8705
|
+
and [s["id"] for s in sc["surfaces"]] == ["Ty", "SHETLAND", "BCU", "Hugin_Fm_Top", "Hugin_Base"],
|
|
8706
|
+
"line_ends": not crlf and all(k.endswith(".gz") or b"\r\n" not in (pkg / "reference" / k).read_bytes() for k in prov["outputs"]),
|
|
8707
|
+
"provenance": hashes_ok and "commercial purposes" in prov["license"] and "may not be sold" in prov["license"] and len(prov["sources"]) == 12
|
|
8708
|
+
and all(len(v["commit"]) == 40 for v in prov["sources"].values()) and "Equinor ASA" in sc["attribution"] and "not sold" in sc["attribution"],
|
|
8709
|
+
}
|
|
8710
|
+
failed2 = [k for k, v in c2.items() if not v]
|
|
8711
|
+
ok(not failed2,
|
|
8712
|
+
"CE2 the Volve excerpt checked against itself: its eastings and northings are ED50 zone 31N (the slots unproject within 0.1 m of the "
|
|
8713
|
+
"operator's own log headers, about 150 m off if read as WGS84); the three paths land on Equinor's picks to under 0.3 m from a 54.9 m rig "
|
|
8714
|
+
"floor; 15/9-F-4's azimuths read as grid, with the 14 m it would miss by otherwise stated; five surfaces drawn as delivered, every fourth "
|
|
8715
|
+
"line, each within a few metres of its picks at the median; every shipped file hashed in its provenance with the pinned public copy it "
|
|
8716
|
+
"came from (and no package file with CRLF line ends, which a checkout would change from the bytes hashed), the licence (commercial use, no sale) and the attribution on the page"
|
|
8717
|
+
+ (f" [failed: {', '.join(failed2)}]" if failed2 else ""))
|
|
8718
|
+
|
|
8719
|
+
ev = E.selftest_events(str(d))
|
|
8720
|
+
wsp = str(d / "ws"); ws = Workspace.create(wsp, "Pad 3", actor="tester")
|
|
8721
|
+
wb = ws.add_well_file(ev["path"], display="Well B", actor="tester"); wc = ws.add_well_file(ev["path"], display="Well C", actor="tester")
|
|
8722
|
+
ws.set_well(wb["id"], surface={"lat": 31.42, "lon": -104.10, "datum": "NAD83", "elevation": {"ft": 3000.0, "datum": "KB", "source": "test plat"}}, actor="tester")
|
|
8723
|
+
lat1, lon1 = 31.42, -104.10
|
|
8724
|
+
kmlon = 1.0 / (111.195 * _m.cos(_m.radians(lat1)))
|
|
8725
|
+
SF.write(str(d / "Top_A"), "PolyLine", [([[(lon1 + (i - 1.5) * kmlon + 0.0005 * k, lat1 - 0.05 + 0.001 * k) for k in range(100)]], {"ElevTop_ft": -1500.0 - 100.0 * i}) for i in range(4)],
|
|
8726
|
+
[("ElevTop_ft", "F", 10, 1)], SF.NAD83_GEOGCS)
|
|
8727
|
+
SF.write(str(d / "Faults"), "PolyLine", [([[(lon1 - 0.02 + 0.001 * j, lat1) for j in range(40)]], {"TYPE": "normal fault"})], [("TYPE", "C", 20, 0)], SF.NAD83_GEOGCS)
|
|
8728
|
+
ws.add_layer(str(d / "Top_A.shp"), "Top A", actor="tester", formation="A", role="top", citation="test")
|
|
8729
|
+
ws.add_layer(str(d / "Faults.shp"), "Faults", actor="tester", citation="test")
|
|
8730
|
+
sc0 = W.workspace_scene(ws) # no survey yet: the formation tops alone
|
|
8731
|
+
att_refused = 0
|
|
8732
|
+
for kw in ({"azimuth_reference": ""}, {"azimuth_reference": "grid"}, {"azimuth_reference": "magnetic"}, {"azimuth_reference": "true", "source": " "}):
|
|
8733
|
+
k = {"azimuth_reference": "true", "source": "s", **kw}
|
|
8734
|
+
try:
|
|
8735
|
+
W.attach_trajectory(ws, wb["id"], "s.csv", csv_ok.encode(), "tester", k["azimuth_reference"], "ft", None, None, None, k["source"])
|
|
8736
|
+
except ValueError:
|
|
8737
|
+
att_refused += 1
|
|
8738
|
+
ws.refresh_dashboard(actor="tester")
|
|
8739
|
+
Users(str(Path(wsp, "users.json"))).add("v", "viewer-pass-1", "viewer"); Users(str(Path(wsp, "users.json"))).add("op", "op-pass-123", "operator")
|
|
8740
|
+
svc = Service(wsp, port=0, scheduler=False).start()
|
|
8741
|
+
base_url = svc.url.rstrip("/")
|
|
8742
|
+
|
|
8743
|
+
def opener(name, pw):
|
|
8744
|
+
o = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(http.cookiejar.CookieJar()))
|
|
8745
|
+
rq = urllib.request.Request(base_url + "/api/login", method="POST", data=json.dumps({"name": name, "password": pw}).encode())
|
|
8746
|
+
rq.add_header("Content-Type", "application/json"); rq.add_header("X-GEA-Action", "1"); o.open(rq, timeout=30)
|
|
8747
|
+
return o
|
|
8748
|
+
|
|
8749
|
+
def call(o, method, path, body=None):
|
|
8750
|
+
rq = urllib.request.Request(base_url + path, method=method, data=(json.dumps(body).encode() if body is not None else None))
|
|
8751
|
+
if method == "POST":
|
|
8752
|
+
rq.add_header("Content-Type", "application/json"); rq.add_header("X-GEA-Action", "1")
|
|
8753
|
+
try:
|
|
8754
|
+
with o.open(rq, timeout=120) as rr_:
|
|
8755
|
+
return rr_.status, json.loads(rr_.read())
|
|
8756
|
+
except urllib.error.HTTPError as e:
|
|
8757
|
+
return e.code, json.loads(e.read())
|
|
8758
|
+
try:
|
|
8759
|
+
V, O = opener("v", "viewer-pass-1"), opener("op", "op-pass-123")
|
|
8760
|
+
st_l, ls = call(V, "GET", "/api/3d/scenes")
|
|
8761
|
+
st_v, vs = call(V, "GET", "/api/3d/scene/volve")
|
|
8762
|
+
st_n, _ = call(V, "GET", "/api/3d/scene/nope")
|
|
8763
|
+
body = {"filename": "survey.csv", "content_b64": _b64.b64encode(csv_ok.encode()).decode(), "azimuth_reference": "grid", "grid": "TX_CENTRAL",
|
|
8764
|
+
"md_unit": "ft", "source": "test survey"}
|
|
8765
|
+
st_pv, _ = call(V, "POST", f"/api/wells/{wb['id']}/trajectory", body)
|
|
8766
|
+
st_b64, _ = call(O, "POST", f"/api/wells/{wb['id']}/trajectory", {**body, "content_b64": "%%%"})
|
|
8767
|
+
st_at, at = call(O, "POST", f"/api/wells/{wb['id']}/trajectory", body)
|
|
8768
|
+
st_w, wsc = call(V, "GET", "/api/3d/scene/workspace")
|
|
8769
|
+
finally:
|
|
8770
|
+
svc.stop()
|
|
8771
|
+
kept = (Path(wsp, "wells", wb["id"], "trajectory", "survey.csv").read_bytes() == csv_ok.encode())
|
|
8772
|
+
audit = [e["action"] for e in ws.audit_log(500)]
|
|
8773
|
+
cli = _sp.run([sys.executable, "-m", "gea", "well3d", "--scene", "workspace", "--workspace", wsp], capture_output=True, text=True, cwd=str(pkg.parent))
|
|
8774
|
+
page_src = (pkg / "web" / "app.html").read_text(encoding="utf-8")
|
|
8775
|
+
help_md = (pkg / "help" / "well3d.md").read_text(encoding="utf-8")
|
|
8776
|
+
w0 = (wsc.get("wells") or [{}])[0]
|
|
8777
|
+
c3 = {
|
|
8778
|
+
"attach": att_refused == 4 and st_pv == 403 and st_b64 == 400 and st_at == 200 and at["stations"] == 6 and at["grid"] == "TX_CENTRAL" and kept
|
|
8779
|
+
and at["sha256"] == _hl.sha256(csv_ok.encode()).hexdigest() and "well.trajectory" in audit,
|
|
8780
|
+
"scene": st_l == 200 and [s["id"] for s in ls["scenes"]] == ["workspace", "volve"] and st_v == 200 and len(vs["wells"]) == 3 and st_n == 404
|
|
8781
|
+
and st_w == 200 and len(wsc["wells"]) == 1 and abs(w0["td_md"] - 1752.6) < 0.01 and "TX_CENTRAL grid north" in w0["azimuth"]["applied"]
|
|
8782
|
+
and w0["replay"]["kind"] == "drilling recorder" and "Gamma" in w0["channels"] and not w0["replay"]["t"][0].endswith("Z")
|
|
8783
|
+
and [n["id"] for n in wsc["not_placed"]] == [wc["id"]] and wsc["layers"][0]["lines"][0]["z"] == round(1500 * 0.3048, 1)
|
|
8784
|
+
and any(n["display"] == "Faults" and "no depth" in n["why"] for n in wsc["layers_not_drawn"]),
|
|
8785
|
+
"tops_alone": sc0["wells"] == [] and [l["name"] for l in sc0["layers"]] == ["Top A"] and sc0["frame"]["area"] == "the placed wells"
|
|
8786
|
+
and {n["id"]: n["why"] for n in sc0["not_placed"]}[wb["id"]] == "no directional survey attached",
|
|
8787
|
+
"cli": cli.returncode == 0 and "Well B: 6 stations" in cli.stdout and "contour lines at their elevations" in cli.stdout,
|
|
8788
|
+
"page": all(x in page_src for x in ("VIEWS['3d']", "['#/3d', '3D']", "getContext('webgl'", "OES_element_index_uint", "w3Tube", "w3SurfMesh",
|
|
8789
|
+
"/api/3d/scene/", "w3Play", "the recorder's clock", "ArrowLeft", "see-through", "/trajectory`", "w3Hit")),
|
|
8790
|
+
"help": any(t["topic"] == "well3d" for t in H.topics()) and not H.check("well3d") and H.VIEW_TOPIC.get("3d") == "well3d"
|
|
8791
|
+
and "a well with no survey" in help_md.split("will not call a measurement")[1],
|
|
8792
|
+
}
|
|
8793
|
+
failed3 = [k for k, v in c3.items() if not v]
|
|
8794
|
+
ok(not failed3,
|
|
8795
|
+
"CE3 a workspace well in 3D: a survey attached only with its azimuth reference stated (a grid named, a declination given) and its source, "
|
|
8796
|
+
"kept byte for byte and audited; the path turned from TX_CENTRAL grid north by the convergence there, set below sea level from the "
|
|
8797
|
+
"declared rig floor among the formation-top contours at their elevations (a fault trace listed as having no depth; the tops drawn alone "
|
|
8798
|
+
"before any survey), the recorder's bit depth replayed on its own clock and its gamma along the path; a well without a position listed, not drawn; the API, the CLI and the 3D "
|
|
8799
|
+
"tab (WebGL by hand, the replay, turn and zoom by pointer and keys); the help page"
|
|
8800
|
+
+ (f" [failed: {', '.join(failed3)}]" if failed3 else ""))
|
|
8801
|
+
|
|
8802
|
+
|
|
8616
8803
|
def main() -> int:
|
|
8617
8804
|
print("GEA-Program - ACCEPTANCE SUITE (the product gate)")
|
|
8618
8805
|
# a handle a job subprocess still holds at the end must not turn a finished gate into a traceback on Windows:
|
|
@@ -8698,6 +8885,7 @@ def main() -> int:
|
|
|
8698
8885
|
section_cb_charts(tmp)
|
|
8699
8886
|
section_cc_site_map(tmp)
|
|
8700
8887
|
section_cd_control_room(tmp)
|
|
8888
|
+
section_ce_well3d(tmp)
|
|
8701
8889
|
if _FAILS:
|
|
8702
8890
|
print(f"[ACCEPTANCE] {len(_FAILS)} FAILURES ({_PASS} passed):")
|
|
8703
8891
|
for f in _FAILS:
|
|
@@ -48,6 +48,7 @@ ELLIPSOIDS: Dict[str, Tuple[float, float]] = {
|
|
|
48
48
|
'GRS80': (6378137.0, 298.257222101),
|
|
49
49
|
'CLARKE1866': (6378206.4, 294.9786982),
|
|
50
50
|
'BESSEL': (6377397.155, 299.1528128), # Bessel 1841: the DHDN ellipsoid the German Gauss-Krueger grids sit on
|
|
51
|
+
'INTL1924': (6378388.0, 297.0), # International 1924 (Hayford): the ED50 ellipsoid the North Sea UTM grids sit on
|
|
51
52
|
}
|
|
52
53
|
|
|
53
54
|
# datum -> ellipsoid, the three-parameter shift to WGS84 (metres, geocentric), and what that shift is worth
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# The well in 3D
|
|
2
|
+
|
|
3
|
+
> Each well's path from its directional survey, set among the mapped formations - interpreted horizon surfaces, or a formation-top map's contours at their elevations - with its picks on it, coloured by what was measured along it, and the drill string replayed from the record. The Volve field in the Norwegian North Sea ships with the program as the worked example: three wells' original surveys, the field's formation picks and five mapped surfaces, released by Equinor.
|
|
4
|
+
|
|
5
|
+
**The command**: the 3D tab. Choose the scene - this workspace's wells, or Volve. Drag to turn the view, shift-drag (or the right button) to pan, the wheel or a pinch to zoom; on the keyboard, the arrows turn, + and − zoom and Home resets. Colour the wells by formation (the mapped surface above each depth, from the well's own picks), by inclination or dogleg severity from the survey, or - for a well with a drilling-recorder export - by its channels (gamma, rate of penetration, weight on bit) along the bit depth. Tick the surfaces and layers on and off, see through them, show every pick, and stretch the depth by 1 to 5 times. Point at a well or a pick for its measured depth, its depth below sea level, its offset from the slot, the inclination there and the formation it is in. Under Replay, pick a well and press Play or drag the slider: the bit moves down the hole, the hole drilled so far in full colour and the rest faded. A workspace well needs three things to be drawn: its surface position and its reference elevation (Setup) and its directional survey - a WITSML trajectory or a table of measured depth, inclination and azimuth - attached on this tab or with `gea trajectory --workspace C:\site --well Well-30636033 --file survey.csv --azimuth-reference grid --grid TX_CENTRAL --source "RRC imaged records, directional survey"`. Until a workspace well can be drawn, its formation-top contour layers are drawn on their own over the area the Map opens on, the depth stretched 20 times (any of 1 to 50 can be chosen). `gea well3d --scene volve` prints the Volve scene and its checks; `--scene workspace --workspace C:\site` prints this workspace's.
|
|
6
|
+
|
|
7
|
+
**What it writes**: the survey you attach, byte for byte, in the well's folder (`wells/<well>/trajectory/`), with how to read it in the well's record - the azimuth reference (grid with the grid named, true, or magnetic with the declination), the depth unit, the depth reference, where it came from and its SHA-256 - and an audit line. The view itself writes nothing. The Volve files are in the program's reference folder with their provenance (`reference/volve_3d.provenance.json`): the public copies they were taken from, each at a pinned commit, with the hashes as fetched; `tools/build_volve_3d.py` rebuilds them.
|
|
8
|
+
|
|
9
|
+
**The number to check**: a path against the survey company's own positions - for Volve the minimum-curvature path computed here reproduces the TVD and displacements written in each trajectory file to under a centimetre, and lands on Equinor's formation picks (which carry their own eastings, northings and depths) to under 0.3 m; a surface against the picks - the table under the view gives, for each surface, how far it sits from every pick of its formation (median a few metres, more at wells the interpretation did not honour); the frame - the Volve slot eastings and northings, unprojected on ED50 zone 31N, land within 0.1 m of the latitudes and longitudes in the operator's own log headers.
|
|
10
|
+
|
|
11
|
+
**What this page will not call a measurement**: a path between survey stations as surveyed - it follows the minimum-curvature arc, the industry's assumption, not a measurement; a well with no survey - it is not drawn, and its picks, where they exist, are shown as points; the hole above a survey table's first station - taken as vertical, the tie-in the table implies, and said so; a surface between its grid nodes, or a contour map between its lines - the surface is drawn as delivered (here every fourth inline and crossline, no point moved) and a contour is drawn only where it was mapped; a fault trace, which has no depth, or an isopach, which is a thickness and not a position; any rock or fluid property between wells - nothing here measures one; the Volve replay as second by second - its times are the survey stations' own time stamps while drilling, so it shows the hole growing station by station (a resurvey run in one go, like 15/9-F-4's, carries one time and is not replayed); a drilling recorder's clock as UTC - its times are shown as the recorder wrote them.
|
|
@@ -44,6 +44,7 @@ INDEX: List[tuple] = [
|
|
|
44
44
|
('dlis', 'The DLIS log', 'a well log as it is delivered (API RP66 V1), read as the standard lays it out: the frames, the channels, what was skipped; into the strata survey'),
|
|
45
45
|
('historian', 'The historian pull', 'an operator\'s gauge history out of the PI System through PI Web API, read-only, every value with its archive time and flags'),
|
|
46
46
|
('map', 'The site map', 'everything with a position in one frame: the placed wells, the structure layers, the stress directions, the stations and response areas over the state and county outline; what every layer says about any spot'),
|
|
47
|
+
('well3d', 'The well in 3D', 'each well\'s path from its directional survey, set among the mapped formation surfaces and contours with its picks, coloured by what was measured along it, and the drill string replayed from the record; the Volve field shipped as the worked example'),
|
|
47
48
|
('charts', 'The charts', 'a well\'s channels stacked on one axis with a linked cursor, zoom and pan from every sample, time or depth for a drilling recorder, the depth events marked, and the drilling progress of every well'),
|
|
48
49
|
('control-room', 'The control room', 'the wall screen read from across the room - a tile per well, worst first, its state in a shape and a word, refreshed by itself and saying when it has stopped - and the shift handover, signed by one operator and acknowledged by the next'),
|
|
49
50
|
('setup', 'The setup checklist', 'what this workspace still needs before its reports can be handed over - each well\'s location, elevation and number, the client site, the backup, the reports - read from the workspace as it stands, each with its form or button'),
|
|
@@ -72,7 +73,7 @@ REQUIRED_LINES = ('**The command**', '**What it writes**', '**The number to chec
|
|
|
72
73
|
VIEW_TOPIC: Dict[str, str] = {
|
|
73
74
|
'home': 'start', 'wells': 'data-in', 'well': 'drift', 'live': 'patches', 'patch': 'patches', 'files': 'files', 'alarms': 'alarms',
|
|
74
75
|
'approvals': 'well-tests', 'config': 'site', 'reports': 'drift', 'verify': 'start', 'survey': 'data-in', 'jobs': 'site',
|
|
75
|
-
'admin': 'site', 'prefs': 'site', 'search': 'start', 'welcome': 'start', 'seismic': 'seismic', 'seismic_station': 'seismic', 'track': 'seismic', 'sar': 'seismic', 'sites': 'sites', 'setup': 'setup', 'map': 'map', 'control': 'control-room', 'wall': 'control-room', 'audit': 'audit-update', 'tools': 'tools', 'catalog': 'catalog',
|
|
76
|
+
'admin': 'site', 'prefs': 'site', 'search': 'start', 'welcome': 'start', 'seismic': 'seismic', 'seismic_station': 'seismic', 'track': 'seismic', 'sar': 'seismic', 'sites': 'sites', 'setup': 'setup', 'map': 'map', '3d': 'well3d', 'control': 'control-room', 'wall': 'control-room', 'audit': 'audit-update', 'tools': 'tools', 'catalog': 'catalog',
|
|
76
77
|
}
|
|
77
78
|
|
|
78
79
|
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
{
|
|
2
|
+
"entry": "volve_3d",
|
|
3
|
+
"kind": "REAL_FIELD_EXCERPT_FOR_THE_3D_VIEW",
|
|
4
|
+
"field": "Volve, Norwegian North Sea (blocks 15/9), operated by Statoil/Equinor, decommissioned 2016",
|
|
5
|
+
"publisher": "Equinor ASA, with the former Volve licence partners ExxonMobil Exploration and Production Norway AS and Bayerngas Norge AS",
|
|
6
|
+
"license": "Equinor's 'Terms and conditions for licence to data - Volve' (2020): use, copy and adapt for non-commercial and commercial purposes; Equinor and the former partners attributed and a notice referring to the terms included when shared; the licensed material may not be sold; no use that suggests endorsement. (The 2018 release carried CC BY-NC-SA 4.0; Equinor replaced it.)",
|
|
7
|
+
"license_url": "https://cdn.equinor.com/files/h61q9gi9/global/de6532f6134b9a953f6c41bac47a0c055a3712d3.pdf?equinor-hrs-terms-and-conditions-for-licence-to-data-volve.pdf=",
|
|
8
|
+
"attribution": "Contains data from the Volve field released by Equinor ASA and the former Volve licence partners ExxonMobil Exploration and Production Norway AS and Bayerngas Norge AS.",
|
|
9
|
+
"access": "The release itself (Equinor's data village) was not reachable from the build machine; the files were taken from public GitHub copies, each at a pinned commit, hashed as fetched. Byte identity with the original release is not claimed; the checks below are what tie the copies to the field and to each other.",
|
|
10
|
+
"crs": "ED50 / UTM zone 31N (International 1924 ellipsoid), metres - as delivered; depths below mean sea level, positive down",
|
|
11
|
+
"checks": [
|
|
12
|
+
"the slot eastings and northings of 15/9-F-1 C and 15/9-F-11 B, unprojected on ED50 zone 31N, land 0.02 m and 0.09 m from the latitudes and longitudes in those wells' own LAS headers (and about 148 m away if read as WGS84) - the frame is ED50 zone 31N",
|
|
13
|
+
"the minimum-curvature path computed from each trajectory file's measured depths, inclinations and azimuths reproduces the TVD and displacements written in the file to under a centimetre (15/9-F-4, -F-5, -F-10)",
|
|
14
|
+
"the paths land on Equinor's own formation picks, which carry eastings, northings and depths, to under 0.3 m",
|
|
15
|
+
"the horizons are in depth below sea level (they tie to the picks' TVDSS, not to their two-way times): median miss 2 to 6 m by surface at the 23-28 wells picked for each, larger at a few wells the interpretation did not honour (listed per surface in the scene)"
|
|
16
|
+
],
|
|
17
|
+
"findings": [
|
|
18
|
+
"15/9-F-4's definitive survey (Baker Hughes, gyro, 2016) says true north; Equinor's picks on F-4 agree with it to 0.1 m read as grid azimuths and miss by up to 14 m with the 0.95 degree convergence applied. The scene reads it as grid and says so.",
|
|
19
|
+
"15/9-F-4's 2016 survey stamps every station with one time (a resurvey): it is not a record of drilling and is not replayed.",
|
|
20
|
+
"The seabed horizon in the same copy is two blocks, the second in two-way time; it is not used.",
|
|
21
|
+
"No copy of the real-time drilling logs from the wells' drilling (2007-2009) was found under an open licence; the 2016 logs that are copied are plug-and-abandonment work with the string near surface. The Volve replay therefore follows the survey stations' own times."
|
|
22
|
+
],
|
|
23
|
+
"sources": {
|
|
24
|
+
"traj_F-4": {
|
|
25
|
+
"repository": "https://github.com/f0nzie/volve-drilling",
|
|
26
|
+
"commit": "3698c43d4adc0ee11ffa8fd5f876fa961c9c846d",
|
|
27
|
+
"path": "witsml/Norway-Statoil-NO 15_$47$_9-F-4/1/trajectory/1.xml",
|
|
28
|
+
"url": "https://raw.githubusercontent.com/f0nzie/volve-drilling/3698c43d4adc0ee11ffa8fd5f876fa961c9c846d/witsml/Norway-Statoil-NO%2015_%2447%24_9-F-4/1/trajectory/1.xml",
|
|
29
|
+
"bytes": 105291,
|
|
30
|
+
"sha256": "5cabe2a1751828791b7cc669349b5ec6f01e7ea223ed5448a768cb2998f15aba"
|
|
31
|
+
},
|
|
32
|
+
"traj_F-5_36in": {
|
|
33
|
+
"repository": "https://github.com/maribickpostanes/Interactive-Well-Trajectory-Plot",
|
|
34
|
+
"commit": "6231dc346f6a6f38be21404005d930d7d3abbc89",
|
|
35
|
+
"path": "4.xml",
|
|
36
|
+
"url": "https://raw.githubusercontent.com/maribickpostanes/Interactive-Well-Trajectory-Plot/6231dc346f6a6f38be21404005d930d7d3abbc89/4.xml",
|
|
37
|
+
"bytes": 23542,
|
|
38
|
+
"sha256": "b33d44a09ed776de47ba5c31c5ed0e93f1330fdc9297dd6b5338bd2d8386a379"
|
|
39
|
+
},
|
|
40
|
+
"traj_F-5_17.5in": {
|
|
41
|
+
"repository": "https://github.com/maribickpostanes/Interactive-Well-Trajectory-Plot",
|
|
42
|
+
"commit": "6231dc346f6a6f38be21404005d930d7d3abbc89",
|
|
43
|
+
"path": "1.xml",
|
|
44
|
+
"url": "https://raw.githubusercontent.com/maribickpostanes/Interactive-Well-Trajectory-Plot/6231dc346f6a6f38be21404005d930d7d3abbc89/1.xml",
|
|
45
|
+
"bytes": 94850,
|
|
46
|
+
"sha256": "594d10eaf39fb32d52e331f2abae0b11f9e2bf94b14519c8ab74e060f5123229"
|
|
47
|
+
},
|
|
48
|
+
"traj_F-5_12.25in": {
|
|
49
|
+
"repository": "https://github.com/maribickpostanes/Interactive-Well-Trajectory-Plot",
|
|
50
|
+
"commit": "6231dc346f6a6f38be21404005d930d7d3abbc89",
|
|
51
|
+
"path": "2.xml",
|
|
52
|
+
"url": "https://raw.githubusercontent.com/maribickpostanes/Interactive-Well-Trajectory-Plot/6231dc346f6a6f38be21404005d930d7d3abbc89/2.xml",
|
|
53
|
+
"bytes": 185688,
|
|
54
|
+
"sha256": "53491d5cc358e789cd623315d462ae4572f75871294e7beecf0b27489a0b6adc"
|
|
55
|
+
},
|
|
56
|
+
"traj_F-5_8.5in": {
|
|
57
|
+
"repository": "https://github.com/maribickpostanes/Interactive-Well-Trajectory-Plot",
|
|
58
|
+
"commit": "6231dc346f6a6f38be21404005d930d7d3abbc89",
|
|
59
|
+
"path": "3.xml",
|
|
60
|
+
"url": "https://raw.githubusercontent.com/maribickpostanes/Interactive-Well-Trajectory-Plot/6231dc346f6a6f38be21404005d930d7d3abbc89/3.xml",
|
|
61
|
+
"bytes": 237904,
|
|
62
|
+
"sha256": "07ee7ddaa1f553f364d86c7a4cb25f03318c89cd42e2fc7466fe5fbbafe5ed61"
|
|
63
|
+
},
|
|
64
|
+
"traj_F-10": {
|
|
65
|
+
"repository": "https://github.com/viandika/volve_horizon_trajectory",
|
|
66
|
+
"commit": "3f79910a685257159662426235934b089d61df05",
|
|
67
|
+
"path": "witsml/Norway-StatoilHydro-15_$47$_9-F-10/trajectory/1.xml",
|
|
68
|
+
"url": "https://raw.githubusercontent.com/viandika/volve_horizon_trajectory/3f79910a685257159662426235934b089d61df05/witsml/Norway-StatoilHydro-15_%2447%24_9-F-10/trajectory/1.xml",
|
|
69
|
+
"bytes": 1175176,
|
|
70
|
+
"sha256": "11e653b84eab32c3cfe838ad5840d8ee23c53596e21d982bda682d14343e6608"
|
|
71
|
+
},
|
|
72
|
+
"well_picks": {
|
|
73
|
+
"repository": "https://github.com/yohanesnuwara/MLGeo",
|
|
74
|
+
"commit": "3b089e0e50fc69207b84616c6cb364b5c5ca2960",
|
|
75
|
+
"path": "well_logs/Volve_well_picks_modified.csv",
|
|
76
|
+
"url": "https://raw.githubusercontent.com/yohanesnuwara/MLGeo/3b089e0e50fc69207b84616c6cb364b5c5ca2960/well_logs/Volve_well_picks_modified.csv",
|
|
77
|
+
"bytes": 36016,
|
|
78
|
+
"sha256": "53ed9f062d53a584d05ad9388763a1844ecb5a580e216752dff86fad15e6e1a6"
|
|
79
|
+
},
|
|
80
|
+
"hz_Ty": {
|
|
81
|
+
"repository": "https://github.com/viandika/volve_horizon_trajectory",
|
|
82
|
+
"commit": "3f79910a685257159662426235934b089d61df05",
|
|
83
|
+
"path": "horizon/Ty.csv",
|
|
84
|
+
"url": "https://raw.githubusercontent.com/viandika/volve_horizon_trajectory/3f79910a685257159662426235934b089d61df05/horizon/Ty.csv",
|
|
85
|
+
"bytes": 17127830,
|
|
86
|
+
"sha256": "521b606b722fd9531839e239d1a2709cfb1a001d808c4673da05e22fb7121065"
|
|
87
|
+
},
|
|
88
|
+
"hz_SHETLAND": {
|
|
89
|
+
"repository": "https://github.com/viandika/volve_horizon_trajectory",
|
|
90
|
+
"commit": "3f79910a685257159662426235934b089d61df05",
|
|
91
|
+
"path": "horizon/SHETLAND.csv",
|
|
92
|
+
"url": "https://raw.githubusercontent.com/viandika/volve_horizon_trajectory/3f79910a685257159662426235934b089d61df05/horizon/SHETLAND.csv",
|
|
93
|
+
"bytes": 16546631,
|
|
94
|
+
"sha256": "3db1e224b1530458da2a2e7f2f6c88f442d28a19a46500635251152ca45b6ee6"
|
|
95
|
+
},
|
|
96
|
+
"hz_BCU": {
|
|
97
|
+
"repository": "https://github.com/viandika/volve_horizon_trajectory",
|
|
98
|
+
"commit": "3f79910a685257159662426235934b089d61df05",
|
|
99
|
+
"path": "horizon/BCU.csv",
|
|
100
|
+
"url": "https://raw.githubusercontent.com/viandika/volve_horizon_trajectory/3f79910a685257159662426235934b089d61df05/horizon/BCU.csv",
|
|
101
|
+
"bytes": 16377412,
|
|
102
|
+
"sha256": "0051c5f2f8daafd349a7f5497d5947324b95b2bc85c7ca3ca0439fe8b52b181d"
|
|
103
|
+
},
|
|
104
|
+
"hz_Hugin_Fm_Top": {
|
|
105
|
+
"repository": "https://github.com/viandika/volve_horizon_trajectory",
|
|
106
|
+
"commit": "3f79910a685257159662426235934b089d61df05",
|
|
107
|
+
"path": "horizon/Hugin_Fm_Top.csv",
|
|
108
|
+
"url": "https://raw.githubusercontent.com/viandika/volve_horizon_trajectory/3f79910a685257159662426235934b089d61df05/horizon/Hugin_Fm_Top.csv",
|
|
109
|
+
"bytes": 8575041,
|
|
110
|
+
"sha256": "6bb2f7902f80beb9fd28ce177dc3a2aa3916d3dd4f4b33da9a72ee42f23bbd0b"
|
|
111
|
+
},
|
|
112
|
+
"hz_Hugin_Base": {
|
|
113
|
+
"repository": "https://github.com/viandika/volve_horizon_trajectory",
|
|
114
|
+
"commit": "3f79910a685257159662426235934b089d61df05",
|
|
115
|
+
"path": "horizon/Hugin_Base.csv",
|
|
116
|
+
"url": "https://raw.githubusercontent.com/viandika/volve_horizon_trajectory/3f79910a685257159662426235934b089d61df05/horizon/Hugin_Base.csv",
|
|
117
|
+
"bytes": 13244504,
|
|
118
|
+
"sha256": "49f01696f493f0b07881729be318d5277eb43219387e628b41ea4c40d017d7ec"
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
"outputs": {
|
|
122
|
+
"volve_traj_F-4.xml.gz": {
|
|
123
|
+
"from": "traj_F-4",
|
|
124
|
+
"how": "verbatim, gzip-compressed",
|
|
125
|
+
"sha256_uncompressed": "5cabe2a1751828791b7cc669349b5ec6f01e7ea223ed5448a768cb2998f15aba",
|
|
126
|
+
"sha256": "1f596ea1512023a24f2e4c6041fe367c512708ecbc40f1d88052f6ae630820c9"
|
|
127
|
+
},
|
|
128
|
+
"volve_traj_F-5_36in.xml.gz": {
|
|
129
|
+
"from": "traj_F-5_36in",
|
|
130
|
+
"how": "verbatim, gzip-compressed",
|
|
131
|
+
"sha256_uncompressed": "b33d44a09ed776de47ba5c31c5ed0e93f1330fdc9297dd6b5338bd2d8386a379",
|
|
132
|
+
"sha256": "20b97830ec7a581af292151cb2f8a35dd71727ee983679fe8cc0fbe8d71bdc0e"
|
|
133
|
+
},
|
|
134
|
+
"volve_traj_F-5_17.5in.xml.gz": {
|
|
135
|
+
"from": "traj_F-5_17.5in",
|
|
136
|
+
"how": "verbatim, gzip-compressed",
|
|
137
|
+
"sha256_uncompressed": "594d10eaf39fb32d52e331f2abae0b11f9e2bf94b14519c8ab74e060f5123229",
|
|
138
|
+
"sha256": "ca43a64658b68319a7b081d59ae0a8c0fa12555800a2968008a065cc3faacb3d"
|
|
139
|
+
},
|
|
140
|
+
"volve_traj_F-5_12.25in.xml.gz": {
|
|
141
|
+
"from": "traj_F-5_12.25in",
|
|
142
|
+
"how": "verbatim, gzip-compressed",
|
|
143
|
+
"sha256_uncompressed": "53491d5cc358e789cd623315d462ae4572f75871294e7beecf0b27489a0b6adc",
|
|
144
|
+
"sha256": "9d1cc1a0c5b4092b7725e75115e3e7d868f5a267a187a3a159d3422943a10ffb"
|
|
145
|
+
},
|
|
146
|
+
"volve_traj_F-5_8.5in.xml.gz": {
|
|
147
|
+
"from": "traj_F-5_8.5in",
|
|
148
|
+
"how": "verbatim, gzip-compressed",
|
|
149
|
+
"sha256_uncompressed": "07ee7ddaa1f553f364d86c7a4cb25f03318c89cd42e2fc7466fe5fbbafe5ed61",
|
|
150
|
+
"sha256": "2f1edd95306e12ca2452c1e2bf67654395521cdfbcea83318ed933bae3c8c317"
|
|
151
|
+
},
|
|
152
|
+
"volve_traj_F-10.xml.gz": {
|
|
153
|
+
"from": "traj_F-10",
|
|
154
|
+
"how": "verbatim, gzip-compressed",
|
|
155
|
+
"sha256_uncompressed": "11e653b84eab32c3cfe838ad5840d8ee23c53596e21d982bda682d14343e6608",
|
|
156
|
+
"sha256": "960287f00ef31924fc926fe97652162b0bf5ee672453eec8000f8ddff7a3be80"
|
|
157
|
+
},
|
|
158
|
+
"volve_well_picks.csv.gz": {
|
|
159
|
+
"from": "well_picks",
|
|
160
|
+
"how": "verbatim (CRLF line ends as delivered), gzip-compressed",
|
|
161
|
+
"sha256_uncompressed": "53ed9f062d53a584d05ad9388763a1844ecb5a580e216752dff86fad15e6e1a6",
|
|
162
|
+
"sha256": "3cfe17d07f14f20a7b6faa72353950f9f9d5ffd71b263f68f8a755d6e58b3858"
|
|
163
|
+
},
|
|
164
|
+
"volve_surfaces.json.gz": {
|
|
165
|
+
"from": [
|
|
166
|
+
"hz_Ty",
|
|
167
|
+
"hz_SHETLAND",
|
|
168
|
+
"hz_BCU",
|
|
169
|
+
"hz_Hugin_Fm_Top",
|
|
170
|
+
"hz_Hugin_Base"
|
|
171
|
+
],
|
|
172
|
+
"how": "subsampled to every 4th inline and crossline",
|
|
173
|
+
"points": {
|
|
174
|
+
"Ty": [
|
|
175
|
+
241541,
|
|
176
|
+
15116
|
|
177
|
+
],
|
|
178
|
+
"SHETLAND": [
|
|
179
|
+
233358,
|
|
180
|
+
14610
|
|
181
|
+
],
|
|
182
|
+
"BCU": [
|
|
183
|
+
230971,
|
|
184
|
+
14472
|
|
185
|
+
],
|
|
186
|
+
"Hugin_Fm_Top": [
|
|
187
|
+
184066,
|
|
188
|
+
11499
|
|
189
|
+
],
|
|
190
|
+
"Hugin_Base": [
|
|
191
|
+
186756,
|
|
192
|
+
11706
|
|
193
|
+
]
|
|
194
|
+
},
|
|
195
|
+
"sha256": "5786b29bd9185702323429415472cc2c8e164d9a78ba67dba052d6589a00bcbf"
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|