From 0e8421ec4fd2139cc8c4481fee1799c65bf47609 Mon Sep 17 00:00:00 2001 From: xinxiao Date: Mon, 16 Mar 2026 16:57:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E7=89=88gui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/app_quickstart.md | 44 + docs/case_template_summary.md | 90 ++ docs/gui_parameter_plan.md | 386 ++++++++ docs/parameter_registry.md | 351 +++++++ docs/project_status_overview.md | 369 +++++++ gui_support/app/EDFMSimulatorApp.m | 332 +++++++ gui_support/app/EDFM_Simulator_App.m | 917 ++++++++++++++++++ gui_support/app/EDFM_Simulator_App.mlapp | Bin 0 -> 173700 bytes gui_support/app/launch_edfm_simulator_app.m | 5 + gui_support/config/create_empty_config.m | 248 +++++ gui_support/config/load_config_json.m | 13 + gui_support/config/load_config_mat.m | 18 + gui_support/config/save_config_json.m | 21 + gui_support/config/save_config_mat.m | 14 + gui_support/results/load_results_mat.m | 18 + gui_support/results/save_results_mat.m | 14 + gui_support/runtime/run_case.m | 413 ++++++++ gui_support/templates/load_case_template.m | 25 + .../templates/load_case_template_case01.m | 189 ++++ 19 files changed, 3467 insertions(+) create mode 100644 docs/app_quickstart.md create mode 100644 docs/case_template_summary.md create mode 100644 docs/gui_parameter_plan.md create mode 100644 docs/parameter_registry.md create mode 100644 docs/project_status_overview.md create mode 100644 gui_support/app/EDFMSimulatorApp.m create mode 100644 gui_support/app/EDFM_Simulator_App.m create mode 100644 gui_support/app/EDFM_Simulator_App.mlapp create mode 100644 gui_support/app/launch_edfm_simulator_app.m create mode 100644 gui_support/config/create_empty_config.m create mode 100644 gui_support/config/load_config_json.m create mode 100644 gui_support/config/load_config_mat.m create mode 100644 gui_support/config/save_config_json.m create mode 100644 gui_support/config/save_config_mat.m create mode 100644 gui_support/results/load_results_mat.m create mode 100644 gui_support/results/save_results_mat.m create mode 100644 gui_support/runtime/run_case.m create mode 100644 gui_support/templates/load_case_template.m create mode 100644 gui_support/templates/load_case_template_case01.m diff --git a/docs/app_quickstart.md b/docs/app_quickstart.md new file mode 100644 index 0000000..d5f16e9 --- /dev/null +++ b/docs/app_quickstart.md @@ -0,0 +1,44 @@ +# App Quickstart + +## Launch + +From MATLAB, open the app with: + +```matlab +launch_edfm_simulator_app +``` + +File: + +- `gui_support/app/launch_edfm_simulator_app.m` + +## Current Scope + +The app currently provides: + +- tab layout by Part +- template loading +- config import/export as MAT +- result import/export as MAT +- unified run entry through `run_case(config)` +- run log capture +- basic result summary and plotting + +## Current Editing Style + +For large arrays and cell data, the app currently uses MATLAB literal text areas. + +Examples: + +- numeric arrays: `[1 2 3]` +- matrices: `[1 2; 3 4]` +- cell arrays: `{'w1', 1, [1 1 1], 0.089, 0, 1}` + +This keeps the first App Designer style version flexible while the parameter schema is still being stabilized. + +## Notes + +- The flow models are mutually exclusive. +- The GUI only uses the active `flow_model` branch at runtime. +- The current result page is a first-pass implementation. +- The current app class is written in App Designer style (`matlab.apps.AppBase`) as a text `.m` class instead of a binary `.mlapp`. diff --git a/docs/case_template_summary.md b/docs/case_template_summary.md new file mode 100644 index 0000000..6d1f09e --- /dev/null +++ b/docs/case_template_summary.md @@ -0,0 +1,90 @@ +# Case Template Summary + +This file captures the first-pass differences among the 7 existing example cases. +The goal is to turn these into GUI presets later instead of keeping 7 separate hard-coded entry scripts. + +## Shared Structure + +All current example `main1.m` scripts follow the same 8-part flow: + +1. model selection +2. matrix grid definition +3. fracture input +4. discretization +5. flow model and initial state +6. well and schedule +7. solver setup +8. execution + +## Template Summary + +| Case | Folder | Grid | Grid Model | Flow Model | Fracture Wells | Schedule Phases | Notes | +| --- | --- | --- | --- | --- | --- | --- | --- | +| 1 | `算例1-组分流-不规则非均质计算域` | `20 x 10 x 1` | SP | Multi-component | 1 | 3 | Component transport, surfactant/salt injection | +| 2 | `算例2-组分流-无效网格` | `20 x 20 x 3` | SP | Multi-component | 1 | 3 | Similar to case 1, but multi-layer and invalid-grid theme | +| 3 | `算例3-单重双重离散裂缝混合模型` | `20 x 10 x 1` | DP | Multi-component | 1 | 3 | Dual-medium setup | +| 4 | `算例4-气水两相流-压力导数曲线` | `20 x 10 x 1` | SP | Gas-water | 1 | 5 | Pressure derivative style schedule with very small early timesteps | +| 5 | `算例5-油水两相流-注焖采` | `20 x 10 x 1` | SP | Oil-water | 1 | 3 | Injection-soak-production schedule | +| 6 | `算例6-油水两相流-直井注压裂水平井采` | `20 x 10 x 2` | SP | Oil-water | 1 | 1 | Contains both conventional wells and fracture well | +| 7 | `算例7-油水两相流-不同裂缝制度不同` | `20 x 10 x 1` | SP | Oil-water | 6 | 4 | Multiple fracture-well controls with different stages | + +## Key Template Differences + +### Grid + +- Most cases use `dx = 50 * ones(1, 20)`. +- Most cases use `dy = 50 * ones(1, 10)`. +- `dz` differs by case: + - case 1: 1 layer + - case 2: 3 layers + - case 3: 1 layer + - case 4: 1 layer + - case 5: 1 layer + - case 6: 2 layers + - case 7: 1 layer + +### Discretization + +- Cases 1, 2, 4, 5, 6, 7 use single-medium mode. +- Case 3 uses dual-medium mode. + +### Flow Physics + +- Cases 1, 2, 3 use multi-component flow. +- Case 4 uses gas-water flow. +- Cases 5, 6, 7 use oil-water flow. + +### Wells + +- Cases 1 to 5 mainly define fracture well completions through `welloc`. +- Case 6 includes conventional wells in `well1` plus one fracture well in `well2`. +- Case 7 splits six fracture locations into six separately controlled fracture wells. + +### Schedule + +- Cases 1, 2, 3: 3-stage schedule +- Case 4: 5-stage schedule with aggressive timestep ramping +- Case 5: 3-stage schedule +- Case 6: 1-stage schedule +- Case 7: 4-stage schedule + +## Preset Design Recommendation + +Later, each GUI preset should contain: + +- display name +- source folder +- default `config` +- supported flow model +- supported grid model +- notes for the result page + +Suggested preset IDs: + +- `case01_multicomponent_irregular` +- `case02_multicomponent_invalid_grid` +- `case03_multicomponent_dp` +- `case04_gas_water_pressure_derivative` +- `case05_oil_water_huff_n_puff` +- `case06_oil_water_vertical_inj_fractured_horizontal_prod` +- `case07_oil_water_multi_fracture_regimes` diff --git a/docs/gui_parameter_plan.md b/docs/gui_parameter_plan.md new file mode 100644 index 0000000..da1b326 --- /dev/null +++ b/docs/gui_parameter_plan.md @@ -0,0 +1,386 @@ +# GUI Parameter And Run Architecture + +## Decision + +Use MATLAB `struct` as the primary runtime and persistence format. + +Reasons: + +- App Designer works naturally with nested `struct` data. +- Existing solver code already expects MATLAB variables and structs, not object models. +- `struct` avoids unnecessary conversion while the GUI is being built. +- JSON can still be added later as an optional export/import layer. + +Recommended flow: + +1. Load a case template into `config` as a MATLAB struct. +2. Let the GUI edit `config`. +3. Save or load `config` directly as MATLAB data first. +4. Convert `config` into solver inputs through a single entry point later: `run_case(config)`. + +## Unified Config Layout + +The GUI should be built around the following top-level fields: + +```matlab +config.meta +config.model +config.grid +config.fracture +config.discretization +config.flow +config.initial +config.wells +config.schedule +config.solver +config.output +``` + +## Part Mapping + +The existing `main1.m` scripts are structurally consistent and map well to the GUI: + +1. `model`: model selection +2. `grid`: matrix grid definition +3. `fracture`: fracture input and geometry +4. `discretization`: SP/DP discretization and medium setup +5. `flow` + `initial`: flow model, PVT, relative permeability, initial state +6. `wells` + `schedule`: wells, perforations, stage schedule +7. `solver`: nonlinear and timestep controls +8. `output`: run execution and result presentation + +## Parameter Layers + +The previous inventory mixed together direct inputs and fields created during preprocessing. +The GUI should distinguish them explicitly. + +### Layer A: Editable Input Parameters + +These are the parameters the GUI should expose directly or through advanced panels. + +### Layer B: Derived Or Runtime Fields + +These are generated by preprocessing, discretization, solver assembly, or postprocessing. +They should usually be displayed or logged, but not edited directly. + +## Core Parameter Inventory + +This is the revised first-pass grouping of parameters already identified in the repository. + +### `meta` + +- `case_name` +- `case_id` +- `description` +- `source_case_folder` +- `created_from_template` +- `version` + +### `model` + +- `modelflag` +- `grid_model` +- `flow_model` + +Known values: + +- `modelflag`: currently fixed to classical EDFM in all 7 examples +- `grid_model`: `1` single-medium, `2` dual-medium +- `flow_model`: `1` gas-water, `2` oil-water, `3` multi-component + +### `grid` + +Editable inputs: + +- `dx` +- `dy` +- `dz` +- `nx` +- `ny` +- `nz` +- `NTG` + +Derived by `GridProp_pre` and later preprocessing: + +- `coordinates` +- `nodes` +- `nP` +- `nmc` +- `dxv` +- `dyv` +- `dzv` +- `vm` +- `zm` +- `xrao` +- `yrao` +- `zrao` +- `cell_mid_coords` + +Important correction: + +- `boundary` is not defined in `GridProp_pre.m`. +- In case 1 it is defined in `grid_discretization_SP_model.m`. +- This means geometric grid size and reservoir validity boundary are separate parameter groups and should not be merged. + +### `fracture` + +- `input_style` +- `input_content` +- `f` +- `fellip` +- `fractureLines` +- `fractureHeights` +- `flowBarrierFlags` +- `frac_information` +- `nf` + +Observed input modes: + +- Engineering input table +- Vector input +- 2D line input +- Reserved `.fab` import mode + +### `discretization` + +Editable inputs: + +- `grid_model` +- `boundary` +- `invalid_layer` +- `valid_grids` generation rule +- matrix permeability definition rule +- matrix porosity definition rule +- matrix reference pressure `prpor` +- matrix compressibility `cpor` +- rock density `rock_density` +- fracture permeability `Kf` +- fracture aperture `Wf` +- fracture porosity `Porf` +- fracture reference pressure `prporf` +- fracture compressibility `cporf` +- `stress_factor_fracture` +- `stress_factor_matrix` +- `stress_factor_ref_pressure` +- dual-medium only: + - `kx_matrixLayer` + - `ky_matrixLayer` + - `kz_matrixLayer` + - `pori_matrixLayer` + - `sigma` + +Observed editable rock-property expressions in current cases: + +- case 1 SP: + - polygon `boundary` + - `kx/ky/kz` as spatial functions of `cell_mid_coords` + - `pori` as spatial function of `cell_mid_coords` +- cases 2/4/6: + - constant matrix properties + - `invalid_layer` controls inactive layers +- cases 5/7: + - constant matrix properties, different values from cases 2/4/6 +- case 3 DP: + - fracture-layer permeability set + - matrix-layer permeability set + - matrix-layer porosity + - shape factor `sigma` + +Derived fields: + +- fracture-matrix discretization result +- fracture-fracture discretization result +- EDFM connection data +- operator generation inputs for `OperatorRS` +- runtime fields added onto `r`, including `rock_density`, `valid_grids`, stress-factor fields, and dual-medium derived fields + +### `flow` + +Shared categories: + +- phase density +- reference pressure +- formation volume factor +- compressibility +- viscosity +- viscosity-pressure coefficient +- capillary pressure switch +- non-Darcy coefficient +- threshold pressure gradient +- matrix relative permeability table +- fracture relative permeability table + +Additional note: + +- Many of these are hidden inside helper files such as `gas_water_flow.m`, `oil_water_flow.m`, and `multi_component_flow.m`, so they must be treated as editable physics parameters even though they are not visible in `main1.m`. + +Gas-water specific: + +- `gas_prop.VL` +- `gas_prop.PL` +- `gas_prop.Kn` +- `gas_prop.Kn_modified_factor` +- `gas_prop.beta_non_Darcy_flow` +- `density_g_sc` +- `gas_model` +- gas PVT table or generated PVT parameters + +Oil-water specific: + +- `density_o_sc` +- `oil_model` +- oil PVT table or generated PVT parameters + +Multi-component specific: + +- `Ds` +- `Db` +- adsorption table `c_ca_table` +- chemistry parameters `R`, `Vm`, `Temperature`, `chemistry_cof` +- dynamic relative permeability tables `cs_Nc`, `kr_nosurf`, `kr_surf`, `PC` +- fracture counterparts of the same tables +- `number_state_variables` + +### `initial` + +Gas-water and oil-water: + +- `P` +- `Sw` + +Multi-component: + +- `P` +- `Sw` +- `Cs` +- `Cb` + +### `wells` + +Conventional well definition: + +- `well1` +- well name +- perforation count +- perforation grid indices +- wellbore radius +- skin +- well type + +Fracture-well definition: + +- `num_fracture_wells` +- `welloc` +- `perfnum` +- `well2` + +Combined runtime well structure: + +- `Wellc` + +### `schedule` + +- `number_phases` +- `well_schedules` +- `time` +- `dtmax` +- `dtmin` + +Per-row schedule fields observed: + +- well name +- well state +- well role +- control mode +- target value 1 +- target value 2 +- optional `Cs_inj` +- optional `Cb_inj` + +### `solver` + +- `yitap` +- `yitas` +- `omega` +- `Nmax` +- `epsave` +- `epsmax` + +### `output` + +Runtime outputs observed: + +- `Times` +- `OutputRs` +- `Wellpara` +- `trun` + +Useful progress fields for the future GUI: + +- current stage index +- current simulation time +- current `dt` +- Newton iteration count +- cumulative linear solve time +- cumulative Jacobian assembly time + +## Preset Strategy + +The seven example folders should be treated as presets, not as independent long-term entry points. + +Recommended future structure: + +- `load_case_template(1)` ... `load_case_template(7)` +- each template returns a complete `config` +- GUI edits the `config` +- `run_case(config)` executes the solver + +This avoids binding the GUI to seven different hard-coded scripts. + +## Run Page Scope + +Pause and abort are explicitly deferred for now. + +Current target for the run page: + +- show active case name +- show active stage +- show current simulation time +- show current timestep +- show Newton count +- show text log +- optionally plot selected well response during run + +The existing solver already prints progress with `fprintf`, but the proper GUI solution will be to add a progress callback later. + +## File-Level Sources Confirmed So Far + +Primary input sources already confirmed: + +- `main1.m` +- `GridProp_pre.m` +- `grid_discretization_SP_model.m` +- `grid_discretization_DP_model.m` +- `preprocess_heterogeneous.m` +- `gas_water_flow.m` +- `oil_water_flow.m` +- `multi_component_flow.m` + +This matters because not all user-facing parameters live in `main1.m`. +The parameter registry must therefore be built from the full call chain, not from entry scripts only. + +## Next Implementation Steps + +1. Build a complete field-level parameter registry file from the 7 case folders. +2. Keep `create_empty_config` as the primary configuration skeleton. +3. Use `run_case(config)` as the single runtime entry point for all three flow models. +4. Build App Designer pages around model-specific parameter panels. + +## Runtime Status + +Current runtime direction: + +- `run_case(config)` is now the unified execution entry. +- `flow_model` is treated as mutually exclusive. +- GUI should only show the active model's parameter set. +- Non-active model parameters should remain hidden and unused. diff --git a/docs/parameter_registry.md b/docs/parameter_registry.md new file mode 100644 index 0000000..ed29f84 --- /dev/null +++ b/docs/parameter_registry.md @@ -0,0 +1,351 @@ +# Parameter Registry + +This registry maps the current hard-coded parameters to a unified `config` structure. +It is intentionally field-oriented so the future GUI can be built against a stable schema. + +## Conventions + +- `Config Path`: target field in the unified config +- `Source Variable`: current variable name in code +- `Source File`: current MATLAB file where the parameter is defined +- `Cases`: which example folders currently use the field +- `Editable`: whether the GUI should expose the field +- `Notes`: behavior, enum meaning, or shape + +## Meta + +| Config Path | Source Variable | Source File | Cases | Editable | Notes | +| --- | --- | --- | --- | --- | --- | +| `meta.case_name` | none | template-level | all | yes | Display name | +| `meta.case_id` | none | template-level | all | yes | Stable preset ID | +| `meta.description` | none | template-level | all | yes | Free text | +| `meta.source_case_folder` | folder name | template-level | all | no | Traceability | +| `meta.created_from_template` | none | template-level | all | no | Preset source | +| `meta.version` | none | config system | all | no | Schema version | + +## Model + +| Config Path | Source Variable | Source File | Cases | Editable | Notes | +| --- | --- | --- | --- | --- | --- | +| `model.modelflag` | `modelflag` | `main1.m` | 1-7 | yes | Current examples use `1` | +| `model.grid_model` | `grid_model` | `main1.m` | 1-7 | yes | `1` SP, `2` DP | +| `model.flow_model` | `flow_model` | `main1.m` | 1-7 | yes | `1` gas-water, `2` oil-water, `3` multi-component | + +## Grid Geometry + +| Config Path | Source Variable | Source File | Cases | Editable | Notes | +| --- | --- | --- | --- | --- | --- | +| `grid.dx` | `dx` | `main1.m` | 1-7 | yes | Vector | +| `grid.dy` | `dy` | `main1.m` | 1-7 | yes | Vector | +| `grid.dz` | `dz` | `main1.m` | 1-7 | yes | Vector | +| `grid.nx` | `nx` | `main1.m` | 1-7 | no | Derived from `dx` | +| `grid.ny` | `ny` | `main1.m` | 1-7 | no | Derived from `dy` | +| `grid.nz` | `nz` | `main1.m` | 1-7 | no | Derived from `dz` | +| `grid.NTG` | `NTG` | `main1.m` | 1-7 | no | Array sized `nx*ny*nz` | + +Derived fields produced by `GridProp_pre.m`: + +- `grid.coordinates` +- `grid.nodes` +- `grid.nP` +- `grid.nmc` +- `grid.dxv` +- `grid.dyv` +- `grid.dzv` +- `grid.zm` +- `grid.vm` +- `grid.xrao` +- `grid.yrao` +- `grid.zrao` +- `grid.cell_mid_coords` + +## Fracture Input + +| Config Path | Source Variable | Source File | Cases | Editable | Notes | +| --- | --- | --- | --- | --- | --- | +| `fracture.input_style` | `input_style` | `main1.m` | 1-7 | yes | 1 engineering, 2 vector, 3 2D lines, 4 fab reserved | +| `fracture.input_content` | `input_content` | `main1.m` | 1-7 | yes | Engineering fracture table | +| `fracture.f` | `f` | `main1.m` / helper outputs | 1-7 | advanced | Vector fracture representation | +| `fracture.fellip` | `fellip` | `main1.m` / helper outputs | 1-7 | advanced | Elliptic fractures | +| `fracture.fractureLines` | `fractureLines` | `main1.m` | 1-7 | yes | Used in mode 3 | +| `fracture.fractureHeights` | `fractureHeights` | `main1.m` | 1-7 | yes | Used in mode 3 | +| `fracture.flowBarrierFlags` | `flowBarrierFlags` | `main1.m` | 1-7 | yes | Optional | +| `fracture.frac_information` | `frac_information` | helper outputs | 1-7 | no | Generated by helper functions | +| `fracture.nf` | `nf` | `main1.m` | 1-7 | no | Derived fracture count | + +## Discretization Selection + +| Config Path | Source Variable | Source File | Cases | Editable | Notes | +| --- | --- | --- | --- | --- | --- | +| `discretization.mode` | `grid_model` | `main1.m` | 1-7 | yes | Mirrors `model.grid_model` | +| `discretization.use_operator` | implicit | `main1.m` | 1-7 | no | `OperatorRS` is always called currently | + +## SP Rock And Boundary Parameters + +These are critical editable parameters and were previously undercounted. + +| Config Path | Source Variable | Source File | Cases | Editable | Notes | +| --- | --- | --- | --- | --- | --- | +| `discretization.sp.boundary_polygon` | `boundary` | `grid_discretization_SP_model.m` | 1 | yes | Irregular domain polygon | +| `discretization.sp.invalid_layer` | `invalid_layer` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | yes | Layer indices disabled from simulation | +| `discretization.sp.valid_grids` | `valid_grids` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | no | Derived from boundary/layers | +| `discretization.sp.matrix.kx` | `kx` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | yes | Array or generated field | +| `discretization.sp.matrix.ky` | `ky` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | yes | Array or generated field | +| `discretization.sp.matrix.kz` | `kz` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | yes | Array or generated field | +| `discretization.sp.matrix.pori` | `pori` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | yes | Array or generated field | +| `discretization.sp.matrix.prpor` | `prpor` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | yes | Matrix reference pressure | +| `discretization.sp.matrix.cpor` | `cpor` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | yes | Matrix compressibility | +| `discretization.sp.matrix.rock_density` | `rock_density` / `density_rock` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | yes | Naming is inconsistent across cases | +| `discretization.sp.fracture.Kf` | `Kf` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | yes | Fracture permeability | +| `discretization.sp.fracture.Wf` | `Wf` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | yes | Fracture aperture | +| `discretization.sp.fracture.Porf` | `Porf` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | yes | Fracture porosity | +| `discretization.sp.fracture.prporf` | `prporf` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | yes | Fracture reference pressure | +| `discretization.sp.fracture.cporf` | `cporf` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | yes | Fracture compressibility | +| `discretization.sp.stress.fracture_factor` | `stress_factor_fracture` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | yes | Stress sensitivity | +| `discretization.sp.stress.matrix_factor` | `stress_factor_matrix` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | yes | Stress sensitivity | +| `discretization.sp.stress.ref_pressure` | `stress_factor_ref_pressure` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | yes | Reference pressure | +| `discretization.sp.stress.Rpt` | `Rpt` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | yes | Unknown | +| `discretization.sp.stress.cf` | `cf` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | yes | Unknown | +| `discretization.sp.stress.ca` | `ca` | `grid_discretization_SP_model.m` | 1,2,4,5,6,7 | yes | Unknown | + +Case-specific notes: + +- Case 1 uses spatial functions and an irregular polygon boundary. +- Cases 2 and 4 use `invalid_layer` to deactivate the second layer when applicable. +- Cases 5 and 7 use different constant matrix properties than cases 2, 4, and 6. + +## DP Rock Parameters + +| Config Path | Source Variable | Source File | Cases | Editable | Notes | +| --- | --- | --- | --- | --- | --- | +| `discretization.dp.fracture_layer.kx` | `kx` | `grid_discretization_DP_model.m` | 3 | yes | Dual-medium fracture layer | +| `discretization.dp.fracture_layer.ky` | `ky` | `grid_discretization_DP_model.m` | 3 | yes | Dual-medium fracture layer | +| `discretization.dp.fracture_layer.kz` | `kz` | `grid_discretization_DP_model.m` | 3 | yes | Dual-medium fracture layer | +| `discretization.dp.fracture_layer.pori` | `pori` | `grid_discretization_DP_model.m` | 3 | no | Dual-medium fracture layer porosity | +| `discretization.dp.matrix_layer.kx` | `kx_matrixLayer` | `grid_discretization_DP_model.m` | 3 | yes | Matrix layer permeability | +| `discretization.dp.matrix_layer.ky` | `ky_matrixLayer` | `grid_discretization_DP_model.m` | 3 | yes | Matrix layer permeability | +| `discretization.dp.matrix_layer.kz` | `kz_matrixLayer` | `grid_discretization_DP_model.m` | 3 | yes | Matrix layer permeability | +| `discretization.dp.matrix_layer.pori` | `pori_matrixLayer` | `grid_discretization_DP_model.m` | 3 | yes | Matrix layer porosity | +| `discretization.dp.shape_factor` | `sigma` | `grid_discretization_DP_model.m` | 3 | yes | Interporosity shape factor | +| `discretization.dp.valid_grids` | `valid_grids` | `grid_discretization_DP_model.m` | 3 | no | All ones in current example | +| `discretization.dp.NTG` | `NTG` | `grid_discretization_DP_model.m` | 3 | yes | Reassigned in file | +| `discretization.dp.prpor` | `prpor` | `grid_discretization_DP_model.m` | 3 | yes | Reference pressure | +| `discretization.dp.cpor` | `cpor` | `grid_discretization_DP_model.m` | 3 | yes | Compressibility | +| `discretization.dp.fracture.Kf` | `Kf` | `grid_discretization_DP_model.m` | 3 | yes | Fracture permeability | +| `discretization.dp.fracture.Wf` | `Wf` | `grid_discretization_DP_model.m` | 3 | yes | Fracture aperture | +| `discretization.dp.fracture.Porf` | `Porf` | `grid_discretization_DP_model.m` | 3 | yes | Fracture porosity | +| `discretization.dp.fracture.prporf` | `prporf` | `grid_discretization_DP_model.m` | 3 | yes | Fracture reference pressure | +| `discretization.dp.fracture.cporf` | `cporf` | `grid_discretization_DP_model.m` | 3 | yes | Fracture compressibility | +| `discretization.dp.stress.fracture_factor` | `stress_factor_fracture` | `grid_discretization_DP_model.m` | 3 | yes | Stress sensitivity | +| `discretization.dp.stress.matrix_factor` | `stress_factor_matrix` | `grid_discretization_DP_model.m` | 3 | yes | Stress sensitivity | +| `discretization.dp.stress.ref_pressure` | `stress_factor_ref_pressure` | `grid_discretization_DP_model.m` | 3 | yes | Reference pressure | +| `discretization.dp.rock_density` | `rock_density` | `grid_discretization_DP_model.m` | 3 | yes | Rock density | +| `discretization.dp.Rpt` | `Rpt` | `grid_discretization_DP_model.m` | 3 | yes | Unknown | +| `discretization.dp.cf` | `cf` | `grid_discretization_DP_model.m` | 3 | yes | Unknown | +| `discretization.dp.ca` | `ca` | `grid_discretization_DP_model.m` | 3 | yes | Unknown | + +## Flow: Gas-Water + +| Config Path | Source Variable | Source File | Cases | Editable | Notes | +| --- | --- | --- | --- | --- | --- | +| `flow.gas_water.gas_prop.VL` | `gas_prop.VL` | `gas_water_flow.m` | 4 | yes | Langmuir volume | +| `flow.gas_water.gas_prop.PL` | `gas_prop.PL` | `gas_water_flow.m` | 4 | yes | Langmuir pressure | +| `flow.gas_water.gas_prop.Kn` | `gas_prop.Kn` | `gas_water_flow.m` | 4 | yes | Knudsen number | +| `flow.gas_water.gas_prop.Kn_modified_factor` | `gas_prop.Kn_modified_factor` | `gas_water_flow.m` | 4 | no | Derived | +| `flow.gas_water.gas_prop.beta_non_darcy_flow` | `gas_prop.beta_non_Darcy_flow` | `gas_water_flow.m` | 4 | yes | High-velocity term | +| `flow.gas_water.p_grad_threshold` | `p_grad_threshold` | `gas_water_flow.m` | 4 | yes | Threshold pressure gradient | +| `flow.gas_water.density_g_sc` | `density_g_sc` | `gas_water_flow.m` | 4 | yes | Gas density at standard conditions | +| `flow.gas_water.density_w_sc` | `density_w_sc` | `gas_water_flow.m` | 4 | yes | Water density at standard conditions | +| `flow.gas_water.gas_model` | `gas_model` | `gas_water_flow.m` | 4 | yes | 1 generated PVT, 2 tabulated PVT | +| `flow.gas_water.prg` | `prg` | `gas_water_flow.m` | 4 | yes | Only in model 1 | +| `flow.gas_water.Bgi` | `Bgi` | `gas_water_flow.m` | 4 | yes | Only in model 1 | +| `flow.gas_water.cg` | `cg` | `gas_water_flow.m` | 4 | yes | Only in model 1 | +| `flow.gas_water.vgi` | `vgi` | `gas_water_flow.m` | 4 | yes | Only in model 1 | +| `flow.gas_water.cvg` | `cvg` | `gas_water_flow.m` | 4 | yes | Only in model 1 | +| `flow.gas_water.Ppr` | `Ppr` | `gas_water_flow.m` | 4 | yes | Table or generated | +| `flow.gas_water.BG` | `BG` | `gas_water_flow.m` | 4 | yes | Table or generated | +| `flow.gas_water.MUG` | `MUG` | `gas_water_flow.m` | 4 | yes | Table or generated | +| `flow.gas_water.prw` | `prw` | `gas_water_flow.m` | 4 | yes | Water reference pressure | +| `flow.gas_water.Bwi` | `Bwi` | `gas_water_flow.m` | 4 | yes | Water volume factor | +| `flow.gas_water.cw` | `cw` | `gas_water_flow.m` | 4 | yes | Water compressibility | +| `flow.gas_water.vwi` | `vwi` | `gas_water_flow.m` | 4 | yes | Water viscosity | +| `flow.gas_water.cvw` | `cvw` | `gas_water_flow.m` | 4 | yes | Water viscosity-pressure coefficient | +| `flow.gas_water.ifpcgl` | `ifpcgl` | `gas_water_flow.m` | 4 | yes | Capillary pressure switch | +| `flow.gas_water.matrix_relperm_table` | `RPGW` | `gas_water_flow.m` | 4 | yes | Matrix table | +| `flow.gas_water.fracture_relperm_table` | `PRF` | `gas_water_flow.m` | 4 | yes | Fracture table | + +## Flow: Oil-Water + +| Config Path | Source Variable | Source File | Cases | Editable | Notes | +| --- | --- | --- | --- | --- | --- | +| `flow.oil_water.density_o_sc` | `density_o_sc` | `oil_water_flow.m` | 5,6,7 | yes | Oil density | +| `flow.oil_water.density_w_sc` | `density_w_sc` | `oil_water_flow.m` | 5,6,7 | yes | Water density | +| `flow.oil_water.oil_model` | `oil_model` | `oil_water_flow.m` | 5,6,7 | yes | 1 generated PVT, 2 tabulated | +| `flow.oil_water.pro` | `pro` | `oil_water_flow.m` | 5,6,7 | yes | Oil ref pressure | +| `flow.oil_water.Boi` | `Boi` | `oil_water_flow.m` | 5,6,7 | yes | Oil volume factor | +| `flow.oil_water.co` | `co` | `oil_water_flow.m` | 5,6,7 | yes | Oil compressibility | +| `flow.oil_water.voi` | `voi` | `oil_water_flow.m` | 5,6,7 | yes | Oil viscosity | +| `flow.oil_water.cvo` | `cvo` | `oil_water_flow.m` | 5,6,7 | yes | Oil viscosity-pressure coefficient | +| `flow.oil_water.Ppr` | `Ppr` | `oil_water_flow.m` | 5,6,7 | yes | Table or generated | +| `flow.oil_water.BO` | `BO` | `oil_water_flow.m` | 5,6,7 | yes | Table or generated | +| `flow.oil_water.MUO` | `MUO` | `oil_water_flow.m` | 5,6,7 | yes | Table or generated | +| `flow.oil_water.prw` | `prw` | `oil_water_flow.m` | 5,6,7 | yes | Water ref pressure | +| `flow.oil_water.Bwi` | `Bwi` | `oil_water_flow.m` | 5,6,7 | yes | Water volume factor | +| `flow.oil_water.cw` | `cw` | `oil_water_flow.m` | 5,6,7 | yes | Water compressibility | +| `flow.oil_water.vwi` | `vwi` | `oil_water_flow.m` | 5,6,7 | yes | Water viscosity | +| `flow.oil_water.cvw` | `cvw` | `oil_water_flow.m` | 5,6,7 | yes | Water viscosity-pressure coefficient | +| `flow.oil_water.ifpcow` | `ifpcow` | `oil_water_flow.m` | 5,6,7 | yes | Capillary pressure switch | +| `flow.oil_water.matrix_relperm_table` | `PRM` | `oil_water_flow.m` | 5,6,7 | yes | Matrix table | +| `flow.oil_water.fracture_relperm_table` | `PRF` | `oil_water_flow.m` | 5,6,7 | yes | Fracture table | +| `flow.oil_water.beta_non_darcy_flow` | `beta_non_Darcy_flow` | `oil_water_flow.m` | 5,6,7 | yes | Non-Darcy coefficient | +| `flow.oil_water.p_grad_threshold` | `p_grad_threshold` | `oil_water_flow.m` | 5,6,7 | yes | Threshold gradient | + +## Flow: Multi-Component + +| Config Path | Source Variable | Source File | Cases | Editable | Notes | +| --- | --- | --- | --- | --- | --- | +| `flow.multi_component.Ds` | `Ds` | `multi_component_flow.m` | 1,2,3 | yes | Surfactant diffusion | +| `flow.multi_component.Db` | `Db` | `multi_component_flow.m` | 1,2,3 | yes | Salt diffusion | +| `flow.multi_component.c_ca_table` | `c_ca_table` | `multi_component_flow.m` | 1,2,3 | yes | Adsorption table | +| `flow.multi_component.cs_data` | `cs_data` | `multi_component_flow.m` | 1,2,3 | no | Derived from table | +| `flow.multi_component.cb_data` | `cb_data` | `multi_component_flow.m` | 1,2,3 | no | Derived from table | +| `flow.multi_component.csa_data` | `csa_data` | `multi_component_flow.m` | 1,2,3 | no | Derived from table | +| `flow.multi_component.cba_data` | `cba_data` | `multi_component_flow.m` | 1,2,3 | no | Derived from table | +| `flow.multi_component.R` | `R` | `multi_component_flow.m` | 1,2,3 | yes | Chemistry constant | +| `flow.multi_component.Vm` | `Vm` | `multi_component_flow.m` | 1,2,3 | yes | Molar volume | +| `flow.multi_component.Temperature` | `Temperature` | `multi_component_flow.m` | 1,2,3 | yes | Temperature | +| `flow.multi_component.chemistry_cof` | `chemistry_cof` | `multi_component_flow.m` | 1,2,3 | no | Derived | +| `flow.multi_component.x_matrix!!!!` | `xm` | `multi_component_flow.m` | 1,2,3 | yes | Chemistry activity factor for matrix cells | +| `flow.multi_component.x_fracture!!!` | `xf` | `multi_component_flow.m` | 1,2,3 | yes | Chemistry activity factor for fracture cells | +| `flow.multi_component.cs_Nc` | `cs_Nc` | `multi_component_flow.m` | 1,2,3 | yes | Dynamic relative permeability mapping | +| `flow.multi_component.Nc_nosurf` | `Nc_nosurf` | `multi_component_flow.m` | 1,2,3 | no | Derived | +| `flow.multi_component.Nc_surf` | `Nc_surf` | `multi_component_flow.m` | 1,2,3 | no | Derived | +| `flow.multi_component.kr_nosurf` | `kr_nosurf` | `multi_component_flow.m` | 1,2,3 | yes | Relative permeability table | +| `flow.multi_component.kr_surf` | `kr_surf` | `multi_component_flow.m` | 1,2,3 | yes | Relative permeability table | +| `flow.multi_component.PC` | `PC` | `multi_component_flow.m` | 1,2,3 | yes | Capillary pressure table | +| `flow.multi_component.cs_Nc_fracture` | `cs_Nc_fracture` | `multi_component_flow.m` | 1,2,3 | yes | Fracture table | +| `flow.multi_component.kr_nosurf_fracture` | `kr_nosurf_fracture` | `multi_component_flow.m` | 1,2,3 | yes | Fracture table | +| `flow.multi_component.kr_surf_fracture` | `kr_surf_fracture` | `multi_component_flow.m` | 1,2,3 | yes | Fracture table | +| `flow.multi_component.PC_fracture` | `PC_fracture` | `multi_component_flow.m` | 1,2,3 | yes | Fracture capillary table | +| `flow.multi_component.ifpcgl` | `ifpcgl` | `multi_component_flow.m` | 1,2,3 | yes | Capillary pressure switch | +| `flow.multi_component.p_grad_threshold` | `p_grad_threshold` | `multi_component_flow.m` | 1,2,3 | yes | Threshold gradient | +| `flow.multi_component.gas_prop.VL` | `gas_prop.VL` | `multi_component_flow.m` | 1,2,3 | yes | Often zero for oil-like use | +| `flow.multi_component.gas_prop.PL` | `gas_prop.PL` | `multi_component_flow.m` | 1,2,3 | yes | Langmuir pressure | +| `flow.multi_component.gas_prop.Kn` | `gas_prop.Kn` | `multi_component_flow.m` | 1,2,3 | yes | Knudsen number | +| `flow.multi_component.gas_prop.Kn_modified_factor` | `gas_prop.Kn_modified_factor` | `multi_component_flow.m` | 1,2,3 | no | Derived | +| `flow.multi_component.gas_prop.stress_factor_fracture` | `gas_prop.stress_factor_fracture` | `multi_component_flow.m` | 1,2,3 | yes | Present in case-specific flow files | +| `flow.multi_component.gas_prop.stress_factor_matrix` | `gas_prop.stress_factor_matrix` | `multi_component_flow.m` | 1,2,3 | yes | Present in case-specific flow files | +| `flow.multi_component.gas_prop.stress_factor_ref_pressure` | `gas_prop.stress_factor_ref_pressure` | `multi_component_flow.m` | 1,2,3 | yes | Present in case-specific flow files | +| `flow.multi_component.gas_prop.beta_non_darcy_flow` | `gas_prop.beta_non_Darcy_flow` | `multi_component_flow.m` | 1,2,3 | yes | Non-Darcy coefficient | +| `flow.multi_component.density_g_sc` | `density_g_sc` | `multi_component_flow.m` | 1,2,3 | yes | Standard density | +| `flow.multi_component.gas_model` | `gas_model` | `multi_component_flow.m` | 1,2,3 | yes | 1 generated, 2 tabulated | +| `flow.multi_component.prg` | `prg` | `multi_component_flow.m` | 1,2,3 | yes | Ref pressure | +| `flow.multi_component.Bgi` | `Bgi` | `multi_component_flow.m` | 1,2,3 | yes | Volume factor | +| `flow.multi_component.cg` | `cg` | `multi_component_flow.m` | 1,2,3 | yes | Compressibility | +| `flow.multi_component.vgi` | `vgi` | `multi_component_flow.m` | 1,2,3 | yes | Viscosity | +| `flow.multi_component.cvg` | `cvg` | `multi_component_flow.m` | 1,2,3 | yes | Viscosity-pressure coefficient | +| `flow.multi_component.Ppr` | `Ppr` | `multi_component_flow.m` | 1,2,3 | yes | Table or generated | +| `flow.multi_component.BG` | `BG` | `multi_component_flow.m` | 1,2,3 | yes | Table or generated | +| `flow.multi_component.MUG` | `MUG` | `multi_component_flow.m` | 1,2,3 | yes | Table or generated | +| `flow.multi_component.density_w_sc` | `density_w_sc` | `multi_component_flow.m` | 1,2,3 | yes | Water density | +| `flow.multi_component.prw` | `prw` | `multi_component_flow.m` | 1,2,3 | yes | Water ref pressure | +| `flow.multi_component.Bwi` | `Bwi` | `multi_component_flow.m` | 1,2,3 | yes | Water volume factor | +| `flow.multi_component.cw` | `cw` | `multi_component_flow.m` | 1,2,3 | yes | Water compressibility | +| `flow.multi_component.vwi` | `vwi` | `multi_component_flow.m` | 1,2,3 | yes | Water viscosity | +| `flow.multi_component.cvw` | `cvw` | `multi_component_flow.m` | 1,2,3 | yes | Water viscosity-pressure coefficient | +| `flow.multi_component.number_state_variables` | `number_state_variables` | `multi_component_flow.m` | 1,2,3 | no | Fixed as 4 in current code | + +## Initial Conditions + +| Config Path | Source Variable | Source File | Cases | Editable | Notes | +| --- | --- | --- | --- | --- | --- | +| `initial.pressure` | `P` | flow files | 1-7 | yes | Initial pressure array | +| `initial.sw` | `Sw` | flow files | 1-7 | yes | Initial water saturation array | +| `initial.cs` | `Cs` | `multi_component_flow.m` | 1,2,3 | yes | Initial surfactant concentration | +| `initial.cb` | `Cb` | `multi_component_flow.m` | 1,2,3 | yes | Initial salt concentration | + +## Wells + +| Config Path | Source Variable | Source File | Cases | Editable | Notes | +| --- | --- | --- | --- | --- | --- | +| `wells.well1` | `well1` | `main1.m` | 1-7 | yes | Conventional wells table | +| `wells.num_fracture_wells` | `num_fracture_wells` | `main1.m` | 1-7 | yes | Count | +| `wells.welloc` | `welloc` | `main1.m` | 1-7 | yes | Fracture well coordinates | +| `wells.perfnum` | `perfnum` | helper output | 1-7 | no | Derived from `findWelloc` | +| `wells.well2` | `well2` | `main1.m` | 1-7 | yes | Fracture-well table | +| `wells.Wellc` | `Wellc` | helper output | 1-7 | no | Combined runtime structure | + +Conventional well row shape: + +- well name +- perforation count +- perforation grid index matrix +- well radius +- skin +- well type + +Fracture-well row shape: + +- well name +- perforation count +- perforation indices +- well radius +- skin +- well type + +## Schedule + +| Config Path | Source Variable | Source File | Cases | Editable | Notes | +| --- | --- | --- | --- | --- | --- | +| `schedule.number_phases` | `number_phases` | `main1.m` | 1-7 | yes | Stage count | +| `schedule.well_schedules` | `well_schedules` | `main1.m` | 1-7 | yes | Per-stage control rows | +| `schedule.time` | `time` | `main1.m` | 1-7 | yes | Stage duration vector | +| `schedule.dtmax` | `dtmax` | `main1.m` | 1-7 | yes | Max timestep per stage | +| `schedule.dtmin` | `dtmin` | `main1.m` | 1-7 | yes | Min timestep per stage | + +Schedule row fields observed: + +- well name +- well state +- well role +- control mode +- target value 1 +- target value 2 +- optional `Cs_inj` +- optional `Cb_inj` + +## Solver + +| Config Path | Source Variable | Source File | Cases | Editable | Notes | +| --- | --- | --- | --- | --- | --- | +| `solver.yitap` | `yitap` | `main1.m` | 1-7 | yes | Adaptive timestep control | +| `solver.yitas` | `yitas` | `main1.m` | 1-7 | yes | Adaptive timestep control | +| `solver.omega` | `omega` | `main1.m` | 1-7 | yes | Adaptive timestep control | +| `solver.Nmax` | `Nmax` | `main1.m` | 1-7 | yes | Max Newton iterations | +| `solver.epsave` | `epsave` | `main1.m` | 1-7 | yes | Average residual tolerance | +| `solver.epsmax` | `epsmax` | `main1.m` | 1-7 | yes | Max residual tolerance | + +## Runtime / Output + +| Config Path | Source Variable | Source File | Cases | Editable | Notes | +| --- | --- | --- | --- | --- | --- | +| `output.result_name` | none | future GUI | all | yes | Result label | +| `output.save_input_path` | none | future GUI | all | yes | Save location | +| `output.save_result_path` | none | future GUI | all | yes | Save location | +| `output.plot_requests` | none | future GUI | all | yes | Requested result plots | + +Runtime-only outputs: + +- `Times` +- `OutputRs` +- `Wellpara` +- `trun` + +## Known Inconsistencies To Normalize + +- `rock_density` and `density_rock` are both used in SP discretization files. +- Some fields are editable expressions in one case and constant arrays in another, especially `kx`, `ky`, `kz`, and `pori`. +- `boundary` exists in case 1 but not in the other SP examples. +- DP mode introduces extra fields absent from SP mode. + +These inconsistencies are exactly why the GUI must be built on a normalized `config` instead of the raw scripts. diff --git a/docs/project_status_overview.md b/docs/project_status_overview.md new file mode 100644 index 0000000..d76ee15 --- /dev/null +++ b/docs/project_status_overview.md @@ -0,0 +1,369 @@ +# EDFM GUI Project Status Overview + +## Project Goal + +Build a MATLAB GUI for the existing EDFM simulator so that users can: + +- edit simulation parameters through a graphical interface +- load and save input configurations +- run the solver from the GUI +- view run status and basic results +- import and export results +- eventually call existing plotting functions from the result page + +The current solver code already exists. +The main work is: + +1. extracting and organizing parameters from the existing case scripts and helper files +2. building a GUI around a unified configuration format and runtime entry point + +## Functional Scope Agreed So Far + +### GUI Structure + +The GUI should be organized by the `Part1` to `Part8` logic already present in the case `main1.m` files. + +Recommended page split: + +- `Part1 模型` +- `Part2 网格` +- `Part3 裂缝` +- `Part4 离散化/岩性` +- `Part5 流动模型` +- `Part6 井与制度` +- `Part7 求解器` +- `结果` + +There is also a top toolbar for: + +- template loading +- config import/export +- run +- result import/export + +### Data Management + +The main editable runtime format is now defined as MATLAB `struct`. + +Current persistence direction: + +- config import/export: `.mat` +- result import/export: `.mat` + +JSON is not the current priority. +It can be added later if needed. + +### Runtime Model Handling + +The three flow models are mutually exclusive: + +- `1`: gas-water +- `2`: oil-water +- `3`: multi-component + +The GUI should only show the active flow model's parameters. +Inactive model parameters should not be shown or used during runtime. + +## What Has Been Completed + +## 1. Parameter extraction and organization + +The repository has been reviewed across: + +- all 7 example case folders +- `main1.m` +- `GridProp_pre.m` +- `grid_discretization_SP_model.m` +- `grid_discretization_DP_model.m` +- `gas_water_flow.m` +- `oil_water_flow.m` +- `multi_component_flow.m` +- solver entry and main runtime functions + +Completed documents: + +- [`gui_parameter_plan.md`](C:\Users\Administrator\Videos\3D_EDFM_simulator_20260305\docs\gui_parameter_plan.md) +- [`case_template_summary.md`](C:\Users\Administrator\Videos\3D_EDFM_simulator_20260305\docs\case_template_summary.md) +- [`parameter_registry.md`](C:\Users\Administrator\Videos\3D_EDFM_simulator_20260305\docs\parameter_registry.md) + +These already cover: + +- overall GUI architecture +- 7-case summary +- field-level parameter registry +- separation of editable parameters and derived runtime fields + +## 2. Unified config skeleton + +Created: + +- [`create_empty_config.m`](C:\Users\Administrator\Videos\3D_EDFM_simulator_20260305\gui_support\config\create_empty_config.m) + +Current config structure includes: + +- `meta` +- `model` +- `grid` +- `fracture` +- `discretization` +- `flow` +- `initial` +- `wells` +- `schedule` +- `solver` +- `output` + +It now includes all major editable parameter groups identified so far. + +## 3. Config and result MAT import/export helpers + +Created: + +- [`load_config_mat.m`](C:\Users\Administrator\Videos\3D_EDFM_simulator_20260305\gui_support\config\load_config_mat.m) +- [`save_config_mat.m`](C:\Users\Administrator\Videos\3D_EDFM_simulator_20260305\gui_support\config\save_config_mat.m) +- [`load_results_mat.m`](C:\Users\Administrator\Videos\3D_EDFM_simulator_20260305\gui_support\results\load_results_mat.m) +- [`save_results_mat.m`](C:\Users\Administrator\Videos\3D_EDFM_simulator_20260305\gui_support\results\save_results_mat.m) + +## 4. Unified runtime entry point + +Created: + +- [`run_case.m`](C:\Users\Administrator\Videos\3D_EDFM_simulator_20260305\gui_support\runtime\run_case.m) + +This is now the intended runtime entry point instead of calling each case's `main1.m` directly. + +Current status: + +- grid preprocessing is routed through unified config +- fracture inputs are routed through unified config +- well and schedule setup are routed through unified config +- solver invocation is routed through unified config +- all three `flow_model` branches are now supported through the unified runtime path + +## 5. First template support + +Created: + +- [`load_case_template.m`](C:\Users\Administrator\Videos\3D_EDFM_simulator_20260305\gui_support\templates\load_case_template.m) +- [`load_case_template_case01.m`](C:\Users\Administrator\Videos\3D_EDFM_simulator_20260305\gui_support\templates\load_case_template_case01.m) + +Current template coverage: + +- `case01` + +This is enough to validate the unified config and runtime direction, but not yet enough for final GUI delivery. + +## 6. App Designer direction clarified + +Important conclusion: + +- a pure `.m` app class is not the right final form for this project if the user wants to edit the GUI in MATLAB App Designer +- the final GUI should be built as a real `.mlapp` +- the current recommended workflow is: + - manually draw the layout in App Designer + - keep stable component names + - then bind code to those components + +## What Still Needs To Be Done + +## 1. Draw the real `.mlapp` interface + +This is the next main task. + +Need to complete: + +- top toolbar +- all main tabs +- model-specific sub-tabs or dynamic sections +- all editable controls +- result page layout + +The drawing guide has been prepared conceptually, but the actual `.mlapp` still needs to be built manually in App Designer. + +## 2. Bind `.mlapp` code to existing backend + +After the UI is drawn, code still needs to be connected for: + +- startup default config loading +- template switching +- config import/export +- result import/export +- reading values from controls into `config` +- writing `config` back into controls +- calling `run_case(config)` +- refreshing result plots + +## 3. Expand template coverage + +Currently only `case01` has a template loader. + +Still needed: + +- `case02` +- `case03` +- `case04` +- `case05` +- `case06` +- `case07` + +These should eventually all become presets in the GUI. + +## 4. Strengthen flow-model config coverage + +The unified runtime path now supports all three model branches, but more practical work is still needed: + +- make sure default template values are complete for each model +- validate that GUI fields map cleanly to backend config fields +- ensure inactive model fields do not interfere with execution + +## 5. Improve editing experience for complex parameters + +Right now, many large arrays or nested cell structures are still best represented as text expressions. +This is acceptable for early integration but not ideal for end users. + +Likely future upgrades: + +- use `UITable` for well definitions +- use `UITable` for schedules +- use `UITable` for fracture engineering input +- use dedicated table editors for relperm/PVT/adsorption data + +## 6. Results page enhancement + +The final result page should support: + +- summary text +- well response curves +- Newton-vs-time or runtime diagnostics +- 2D and 3D plots +- selected existing post-processing functions + +This is only partially addressed so far. + +## Hard Parts + +## 1. Parameters are not only in `main1.m` + +This is the biggest structural difficulty. + +Important parameters are scattered across: + +- case `main1.m` +- grid preprocessing files +- SP/DP discretization files +- physics setup files +- solver-related helper files + +This makes GUI extraction error-prone if only entry scripts are inspected. + +## 2. Same function names appear in multiple case folders + +Several case folders contain same-named files such as: + +- `grid_discretization_SP_model.m` +- `multi_component_flow.m` + +This means runtime path resolution can break if the working directory or MATLAB path is not controlled carefully. + +The current backend addresses this by resolving case folders explicitly before running. + +## 3. MATLAB App Designer is not Qt-style UI-file driven + +Unlike Qt `.ui`, MATLAB `.mlapp` is not a simple open text UI definition format. +This means: + +- generating App Designer GUI purely by external text editing is unreliable +- manual drawing inside App Designer is the safer workflow + +## 4. Complex data entry is awkward in basic controls + +Several parameters are naturally tabular or nested: + +- fracture engineering input +- well definitions +- well schedules +- relperm tables +- adsorption tables + +These need careful component choice. +If handled with only `TextArea`, the app will work but will not be user-friendly. + +## 5. Encoding and Chinese path issues + +Some files and folders contain Chinese names. +Some comments also appear to have encoding issues. + +Risks: + +- MATLAB string/path handling may be fine, but external tooling and generated code may display garbage text +- hardcoding such paths in generated code is risky + +ASCII-safe identifiers and runtime folder resolution are preferred where possible. + +## Easy-To-Break Areas + +## 1. Component naming drift + +If the `.mlapp` component names are changed casually after backend code is written, callbacks and data binding will break quickly. + +Recommendation: + +- finalize component names early +- keep names stable + +## 2. Array/cell parsing from UI text + +If text areas are used for MATLAB expressions, malformed input can break parsing. + +Examples: + +- missing brackets +- malformed cell arrays +- inconsistent row widths + +Recommendation: + +- use text areas only as an intermediate step +- replace key inputs with `UITable` later + +## 3. Flow-model mutual exclusivity + +Gas-water, oil-water, and multi-component are mutually exclusive. +If the GUI keeps unrelated fields visible and active, users may edit values that are silently ignored or accidentally used. + +Recommendation: + +- show only the active model section +- hide or disable the others + +## 4. Schedule and well table consistency + +The solver expects consistent relations among: + +- `well1` +- `welloc` +- `well2` +- `well_schedules` +- `time` +- `dtmin` +- `dtmax` + +If the user edits one without updating the others, runtime errors are likely. + +## 5. Case-specific discretization assumptions + +Case 1 includes irregular boundary polygon logic. +Case 3 uses DP-specific fields. +Other cases use different rock defaults. + +If the GUI over-generalizes too early, it may hide case-specific assumptions that are required for correct runs. + +## Recommended Next Step + +The highest-value next step is: + +1. manually build the `.mlapp` layout in App Designer +2. keep component names fixed +3. then connect each page to the existing backend functions and config structure + +That is the safest path to a maintainable App Designer application. diff --git a/gui_support/app/EDFMSimulatorApp.m b/gui_support/app/EDFMSimulatorApp.m new file mode 100644 index 0000000..6eadafa --- /dev/null +++ b/gui_support/app/EDFMSimulatorApp.m @@ -0,0 +1,332 @@ +classdef EDFMSimulatorApp < matlab.apps.AppBase + properties (Access = public) + UIFigure matlab.ui.Figure + end + + properties (Access = private) + UI struct + Config struct + Results struct + end + + methods (Access = private) + function startup(app) + app.Config = load_case_template('case01'); + app.Results = struct(); + app.refreshUIFromConfig(); + app.appendLog('Loaded default template: case01'); + app.updateStatus('Ready'); + end + + function createComponents(app) + app.UIFigure = uifigure('Visible', 'off', 'Name', 'EDFM Simulator App'); + app.UIFigure.Position = [100 100 1500 900]; + + root = uigridlayout(app.UIFigure, [2 1]); + root.RowHeight = {44, '1x'}; + + top = uigridlayout(root, [1 9]); + top.ColumnWidth = {140, 110, 110, 110, 90, 110, 110, '1x', 180}; + app.UI.TemplateDropDown = uidropdown(top, 'Items', {'case01'}, 'Value', 'case01'); + app.UI.TemplateDropDown.Layout.Column = 1; + app.UI.LoadTemplateButton = uibutton(top, 'push', 'Text', 'Load Template', ... + 'ButtonPushedFcn', @(~,~) app.onLoadTemplate()); + app.UI.LoadTemplateButton.Layout.Column = 2; + app.UI.ImportConfigButton = uibutton(top, 'push', 'Text', 'Import Config', ... + 'ButtonPushedFcn', @(~,~) app.onImportConfig()); + app.UI.ImportConfigButton.Layout.Column = 3; + app.UI.ExportConfigButton = uibutton(top, 'push', 'Text', 'Export Config', ... + 'ButtonPushedFcn', @(~,~) app.onExportConfig()); + app.UI.ExportConfigButton.Layout.Column = 4; + app.UI.RunButton = uibutton(top, 'push', 'Text', 'Run', ... + 'ButtonPushedFcn', @(~,~) app.onRun()); + app.UI.RunButton.Layout.Column = 5; + app.UI.ImportResultButton = uibutton(top, 'push', 'Text', 'Import Result', ... + 'ButtonPushedFcn', @(~,~) app.onImportResult()); + app.UI.ImportResultButton.Layout.Column = 6; + app.UI.ExportResultButton = uibutton(top, 'push', 'Text', 'Export Result', ... + 'ButtonPushedFcn', @(~,~) app.onExportResult()); + app.UI.ExportResultButton.Layout.Column = 7; + app.UI.StatusLabel = uilabel(top, 'Text', 'Status: Ready', 'HorizontalAlignment', 'right'); + app.UI.StatusLabel.Layout.Column = 9; + + tabs = uitabgroup(root); + tabs.Layout.Row = 2; + app.UI.Tabs = tabs; + app.UI.Part1Tab = uitab(tabs, 'Title', 'Part1 Model'); + app.UI.Part2Tab = uitab(tabs, 'Title', 'Part2 Grid'); + app.UI.Part3Tab = uitab(tabs, 'Title', 'Part3 Fracture'); + app.UI.Part4Tab = uitab(tabs, 'Title', 'Part4 Discretization'); + app.UI.Part5Tab = uitab(tabs, 'Title', 'Part5 Flow'); + app.UI.Part6Tab = uitab(tabs, 'Title', 'Part6 Wells'); + app.UI.Part7Tab = uitab(tabs, 'Title', 'Part7 Solver'); + app.UI.RunTab = uitab(tabs, 'Title', 'Run'); + app.UI.ResultTab = uitab(tabs, 'Title', 'Results'); + + app.buildPart1(); + app.buildPart2(); + app.buildPart3(); + app.buildPart4(); + app.buildPart5(); + app.buildPart6(); + app.buildPart7(); + app.buildRunTab(); + app.buildResultTab(); + + app.UIFigure.Visible = 'on'; + end + + function buildPart1(app) + g = uigridlayout(app.UI.Part1Tab, [4 2]); g.RowHeight = {30,30,30,'1x'}; g.ColumnWidth = {160,'1x'}; + uilabel(g, 'Text', 'Model Flag'); app.UI.ModelFlag = uidropdown(g, 'Items', {'1'}); app.UI.ModelFlag.Layout.Column = 2; + lbl = uilabel(g, 'Text', 'Grid Model'); lbl.Layout.Row = 2; lbl.Layout.Column = 1; + app.UI.GridModel = uidropdown(g, 'Items', {'1','2'}); app.UI.GridModel.Layout.Row = 2; app.UI.GridModel.Layout.Column = 2; + lbl = uilabel(g, 'Text', 'Flow Model'); lbl.Layout.Row = 3; lbl.Layout.Column = 1; + app.UI.FlowModel = uidropdown(g, 'Items', {'1','2','3'}); app.UI.FlowModel.Layout.Row = 3; app.UI.FlowModel.Layout.Column = 2; + end + + function buildPart2(app) + g = uigridlayout(app.UI.Part2Tab, [4 2]); g.ColumnWidth = {130,'1x'}; g.RowHeight = {100,100,100,'1x'}; + app.createAreaField(g, 1, 'dx', 'Dx'); + app.createAreaField(g, 2, 'dy', 'Dy'); + app.createAreaField(g, 3, 'dz', 'Dz'); + app.createAreaField(g, 4, 'ntg', 'NTG'); + end + + function buildPart3(app) + g = uigridlayout(app.UI.Part3Tab, [5 2]); g.ColumnWidth = {160,'1x'}; g.RowHeight = {30,120,120,120,80}; + uilabel(g, 'Text', 'Input Style'); app.UI.InputStyle = uidropdown(g, 'Items', {'1','2','3','4'}); app.UI.InputStyle.Layout.Column = 2; + app.createAreaField(g, 2, 'fractureInput', 'Input Content'); + app.createAreaField(g, 3, 'fractureLines', 'Fracture Lines'); + app.createAreaField(g, 4, 'fractureHeights', 'Fracture Heights'); + app.createAreaField(g, 5, 'flowBarrier', 'Flow Barrier Flags'); + end + + function buildPart4(app) + g = uigridlayout(app.UI.Part4Tab, [7 2]); g.ColumnWidth = {180,'1x'}; g.RowHeight = {90,60,70,70,70,30,'1x'}; + app.createAreaField(g, 1, 'boundary', 'Boundary Polygon'); + app.createAreaField(g, 2, 'invalidLayer', 'Invalid Layer'); + app.createAreaField(g, 3, 'matrixKx', 'Matrix kx'); + app.createAreaField(g, 4, 'matrixKy', 'Matrix ky'); + app.createAreaField(g, 5, 'matrixKz', 'Matrix kz'); + app.createAreaField(g, 6, 'matrixPori', 'Matrix pori'); + panel = uipanel(g); panel.Layout.Row = 7; panel.Layout.Column = 2; sub = uigridlayout(panel, [1 6]); + uilabel(sub, 'Text', 'prpor'); app.UI.MatrixPrpor = uieditfield(sub, 'numeric'); + uilabel(sub, 'Text', 'cpor'); app.UI.MatrixCpor = uieditfield(sub, 'numeric'); + uilabel(sub, 'Text', 'rho'); app.UI.RockDensity = uieditfield(sub, 'numeric'); + end + + function buildPart5(app) + g = uigridlayout(app.UI.Part5Tab, [3 1]); g.RowHeight = {100,'1x',120}; + init = uipanel(g, 'Title', 'Initial State'); initg = uigridlayout(init, [2 4]); + uilabel(initg, 'Text', 'Pressure'); uilabel(initg, 'Text', 'Sw'); uilabel(initg, 'Text', 'Cs'); uilabel(initg, 'Text', 'Cb'); + app.UI.InitialPressure = uieditfield(initg, 'numeric'); app.UI.InitialPressure.Layout.Row = 2; + app.UI.InitialSw = uieditfield(initg, 'numeric'); app.UI.InitialSw.Layout.Row = 2; + app.UI.InitialCs = uieditfield(initg, 'numeric'); app.UI.InitialCs.Layout.Row = 2; + app.UI.InitialCb = uieditfield(initg, 'numeric'); app.UI.InitialCb.Layout.Row = 2; + subtabs = uitabgroup(g); + app.UI.GasTab = uitab(subtabs, 'Title', 'Gas-Water'); + app.UI.OilTab = uitab(subtabs, 'Title', 'Oil-Water'); + app.UI.MultiTab = uitab(subtabs, 'Title', 'Multi-Component'); + app.UI.GasArea = uitextarea(uigridlayout(app.UI.GasTab, [1 1])); + app.UI.OilArea = uitextarea(uigridlayout(app.UI.OilTab, [1 1])); + mg = uigridlayout(app.UI.MultiTab, [2 3]); + app.UI.MultiAdsorption = uitextarea(mg); app.UI.MultiNc = uitextarea(mg); app.UI.MultiPc = uitextarea(mg); + app.UI.MultiKrNoSurf = uitextarea(mg); app.UI.MultiKrSurf = uitextarea(mg); app.UI.MultiNote = uitextarea(mg, 'Editable', 'off', 'Value', {'Active flow model only.'}); + hint = uitextarea(g, 'Editable', 'off', 'Value', {'Flow models are mutually exclusive.', 'Only the selected model will be used at run time.'}); + hint.Layout.Row = 3; + end + + function buildPart6(app) + g = uigridlayout(app.UI.Part6Tab, [4 2]); g.ColumnWidth = {160,'1x'}; g.RowHeight = {110,110,140,'1x'}; + app.createAreaField(g, 1, 'well1', 'Well1'); + app.createAreaField(g, 2, 'welloc', 'Well Locations'); + app.createAreaField(g, 3, 'well2', 'Well2'); + p = uipanel(g); p.Layout.Row = 4; p.Layout.Column = 2; sub = uigridlayout(p, [1 4]); + app.UI.ScheduleArea = uitextarea(sub); app.UI.TimeArea = uitextarea(sub); app.UI.DtMinArea = uitextarea(sub); app.UI.DtMaxArea = uitextarea(sub); + lbl = uilabel(g, 'Text', 'Schedule / Time / dt'); lbl.Layout.Row = 4; lbl.Layout.Column = 1; + end + + function buildPart7(app) + g = uigridlayout(app.UI.Part7Tab, [2 6]); + names = {'YitaP','YitaS','Omega','Nmax','EpsAve','EpsMax'}; + for i = 1:numel(names) + lbl = uilabel(g, 'Text', names{i}); lbl.Layout.Row = 1; lbl.Layout.Column = i; + app.UI.(names{i}) = uieditfield(g, 'numeric'); + app.UI.(names{i}).Layout.Row = 2; app.UI.(names{i}).Layout.Column = i; + end + end + + function buildRunTab(app) + g = uigridlayout(app.UI.RunTab, [2 1]); g.RowHeight = {40,'1x'}; + uibutton(g, 'push', 'Text', 'Run Current Config', 'ButtonPushedFcn', @(~,~) app.onRun()); + app.UI.RunLog = uitextarea(g, 'Editable', 'off'); app.UI.RunLog.Layout.Row = 2; + end + + function buildResultTab(app) + g = uigridlayout(app.UI.ResultTab, [1 2]); g.ColumnWidth = {360,'1x'}; + app.UI.ResultSummary = uitextarea(g, 'Editable', 'off'); + app.UI.ResultAxes = uiaxes(g); title(app.UI.ResultAxes, 'Results'); + end + + function createAreaField(app, parent, row, field_name, label_text) + lbl = uilabel(parent, 'Text', label_text); + lbl.Layout.Row = row; + lbl.Layout.Column = 1; + app.UI.(field_name) = uitextarea(parent); + app.UI.(field_name).Layout.Row = row; + app.UI.(field_name).Layout.Column = 2; + end + + function onLoadTemplate(app) + app.Config = load_case_template(app.UI.TemplateDropDown.Value); + app.refreshUIFromConfig(); + app.appendLog(['Loaded template: ', app.UI.TemplateDropDown.Value]); + app.updateStatus('Template loaded'); + end + + function onImportConfig(app) + [f, p] = uigetfile('*.mat', 'Import Config'); if isequal(f, 0), return; end + app.Config = load_config_mat(fullfile(p, f)); + app.refreshUIFromConfig(); + app.appendLog(['Imported config: ', fullfile(p, f)]); + app.updateStatus('Config imported'); + end + + function onExportConfig(app) + app.pushUIToConfig(); + [f, p] = uiputfile('*.mat', 'Export Config', 'config.mat'); if isequal(f, 0), return; end + save_config_mat(app.Config, fullfile(p, f)); + app.appendLog(['Exported config: ', fullfile(p, f)]); + app.updateStatus('Config exported'); + end + + function onImportResult(app) + [f, p] = uigetfile('*.mat', 'Import Result'); if isequal(f, 0), return; end + app.Results = load_results_mat(fullfile(p, f)); + app.refreshResults(); + app.updateStatus('Result imported'); + end + + function onExportResult(app) + if isempty(fieldnames(app.Results)), uialert(app.UIFigure, 'No results available.', 'Export Result'); return; end + [f, p] = uiputfile('*.mat', 'Export Result', 'results.mat'); if isequal(f, 0), return; end + save_results_mat(app.Results, fullfile(p, f)); + app.appendLog(['Exported result: ', fullfile(p, f)]); + app.updateStatus('Result exported'); + end + + function onRun(app) + app.pushUIToConfig(); + app.updateStatus('Running'); + app.appendLog('Run started'); + drawnow; + try + log_text = evalc('[r, Times, OutputRs, Wellpara, trun] = run_case(app.Config);'); + app.Results = struct('r', r, 'Times', Times, 'OutputRs', {OutputRs}, 'Wellpara', {Wellpara}, 'trun', trun, 'captured_log', log_text); + app.appendLog(log_text); + app.refreshResults(); + app.UI.Tabs.SelectedTab = app.UI.ResultTab; + app.updateStatus('Run completed'); + catch ME + app.appendLog(getReport(ME, 'extended', 'hyperlinks', 'off')); + app.updateStatus('Run failed'); + uialert(app.UIFigure, ME.message, 'Run Failed'); + end + end + + function refreshUIFromConfig(app) + c = app.Config; + app.UI.ModelFlag.Value = string(c.model.modelflag); + app.UI.GridModel.Value = string(c.model.grid_model); + app.UI.FlowModel.Value = string(c.model.flow_model); + app.UI.Dx.Value = splitlines(app.toExpr(c.grid.dx)); app.UI.Dy.Value = splitlines(app.toExpr(c.grid.dy)); app.UI.Dz.Value = splitlines(app.toExpr(c.grid.dz)); app.UI.Ntg.Value = splitlines(app.toExpr(c.grid.NTG)); + app.UI.InputStyle.Value = string(c.fracture.input_style); app.UI.fractureInput.Value = splitlines(app.toExpr(c.fracture.input_content)); app.UI.fractureLines.Value = splitlines(app.toExpr(c.fracture.fractureLines)); app.UI.fractureHeights.Value = splitlines(app.toExpr(c.fracture.fractureHeights)); app.UI.flowBarrier.Value = splitlines(app.toExpr(c.fracture.flowBarrierFlags)); + app.UI.boundary.Value = splitlines(app.toExpr(c.discretization.sp.boundary_polygon)); app.UI.invalidLayer.Value = splitlines(app.toExpr(c.discretization.sp.invalid_layer)); app.UI.matrixKx.Value = splitlines(app.toExpr(c.discretization.sp.matrix.kx)); app.UI.matrixKy.Value = splitlines(app.toExpr(c.discretization.sp.matrix.ky)); app.UI.matrixKz.Value = splitlines(app.toExpr(c.discretization.sp.matrix.kz)); app.UI.matrixPori.Value = splitlines(app.toExpr(c.discretization.sp.matrix.pori)); + app.UI.MatrixPrpor.Value = c.discretization.sp.matrix.prpor; app.UI.MatrixCpor.Value = c.discretization.sp.matrix.cpor; app.UI.RockDensity.Value = c.discretization.sp.matrix.rock_density; + app.UI.GasArea.Value = splitlines(app.toExpr(c.flow.gas_water.matrix_relperm_table)); app.UI.OilArea.Value = splitlines(app.toExpr(c.flow.oil_water.matrix_relperm_table)); app.UI.MultiAdsorption.Value = splitlines(app.toExpr(c.flow.multi_component.c_ca_table)); app.UI.MultiNc.Value = splitlines(app.toExpr(c.flow.multi_component.cs_Nc)); app.UI.MultiPc.Value = splitlines(app.toExpr(c.flow.multi_component.PC)); app.UI.MultiKrNoSurf.Value = splitlines(app.toExpr(c.flow.multi_component.kr_nosurf)); app.UI.MultiKrSurf.Value = splitlines(app.toExpr(c.flow.multi_component.kr_surf)); + app.UI.InitialPressure.Value = app.scalarValue(c.initial.pressure); app.UI.InitialSw.Value = app.scalarValue(c.initial.sw); app.UI.InitialCs.Value = app.scalarValue(c.initial.cs); app.UI.InitialCb.Value = app.scalarValue(c.initial.cb); + app.UI.well1.Value = splitlines(app.toExpr(c.wells.well1)); app.UI.welloc.Value = splitlines(app.toExpr(c.wells.welloc)); app.UI.well2.Value = splitlines(app.toExpr(c.wells.well2)); app.UI.ScheduleArea.Value = splitlines(app.toExpr(c.schedule.well_schedules)); app.UI.TimeArea.Value = splitlines(app.toExpr(c.schedule.time)); app.UI.DtMinArea.Value = splitlines(app.toExpr(c.schedule.dtmin)); app.UI.DtMaxArea.Value = splitlines(app.toExpr(c.schedule.dtmax)); + app.UI.YitaP.Value = c.solver.yitap; app.UI.YitaS.Value = c.solver.yitas; app.UI.Omega.Value = c.solver.omega; app.UI.Nmax.Value = c.solver.Nmax; app.UI.EpsAve.Value = c.solver.epsave; app.UI.EpsMax.Value = c.solver.epsmax; + end + + function pushUIToConfig(app) + c = app.Config; + c.model.modelflag = str2double(app.UI.ModelFlag.Value); c.model.grid_model = str2double(app.UI.GridModel.Value); c.model.flow_model = str2double(app.UI.FlowModel.Value); + c.grid.dx = app.parseExpr(app.UI.Dx.Value); c.grid.dy = app.parseExpr(app.UI.Dy.Value); c.grid.dz = app.parseExpr(app.UI.Dz.Value); c.grid.NTG = app.parseExpr(app.UI.Ntg.Value); c.grid.nx = numel(c.grid.dx); c.grid.ny = numel(c.grid.dy); c.grid.nz = numel(c.grid.dz); + c.fracture.input_style = str2double(app.UI.InputStyle.Value); c.fracture.input_content = app.parseExpr(app.UI.fractureInput.Value); c.fracture.fractureLines = app.parseExpr(app.UI.fractureLines.Value); c.fracture.fractureHeights = app.parseExpr(app.UI.fractureHeights.Value); c.fracture.flowBarrierFlags = app.parseExpr(app.UI.flowBarrier.Value); + c.discretization.sp.boundary_polygon = app.parseExpr(app.UI.boundary.Value); c.discretization.sp.invalid_layer = app.parseExpr(app.UI.invalidLayer.Value); c.discretization.sp.matrix.kx = app.parseExpr(app.UI.matrixKx.Value); c.discretization.sp.matrix.ky = app.parseExpr(app.UI.matrixKy.Value); c.discretization.sp.matrix.kz = app.parseExpr(app.UI.matrixKz.Value); c.discretization.sp.matrix.pori = app.parseExpr(app.UI.matrixPori.Value); c.discretization.sp.matrix.prpor = app.UI.MatrixPrpor.Value; c.discretization.sp.matrix.cpor = app.UI.MatrixCpor.Value; c.discretization.sp.matrix.rock_density = app.UI.RockDensity.Value; + c.flow.gas_water.matrix_relperm_table = app.parseExpr(app.UI.GasArea.Value); c.flow.oil_water.matrix_relperm_table = app.parseExpr(app.UI.OilArea.Value); c.flow.multi_component.c_ca_table = app.parseExpr(app.UI.MultiAdsorption.Value); c.flow.multi_component.cs_Nc = app.parseExpr(app.UI.MultiNc.Value); c.flow.multi_component.PC = app.parseExpr(app.UI.MultiPc.Value); c.flow.multi_component.kr_nosurf = app.parseExpr(app.UI.MultiKrNoSurf.Value); c.flow.multi_component.kr_surf = app.parseExpr(app.UI.MultiKrSurf.Value); + c.initial.pressure = app.UI.InitialPressure.Value; c.initial.sw = app.UI.InitialSw.Value; c.initial.cs = app.UI.InitialCs.Value; c.initial.cb = app.UI.InitialCb.Value; + c.wells.well1 = app.parseExpr(app.UI.well1.Value); c.wells.welloc = app.parseExpr(app.UI.welloc.Value); c.wells.num_fracture_wells = numel(c.wells.welloc); c.wells.well2 = app.parseExpr(app.UI.well2.Value); + c.schedule.well_schedules = app.parseExpr(app.UI.ScheduleArea.Value); c.schedule.time = app.parseExpr(app.UI.TimeArea.Value); c.schedule.dtmin = app.parseExpr(app.UI.DtMinArea.Value); c.schedule.dtmax = app.parseExpr(app.UI.DtMaxArea.Value); c.schedule.number_phases = size(c.schedule.well_schedules, 1); + c.solver.yitap = app.UI.YitaP.Value; c.solver.yitas = app.UI.YitaS.Value; c.solver.omega = app.UI.Omega.Value; c.solver.Nmax = app.UI.Nmax.Value; c.solver.epsave = app.UI.EpsAve.Value; c.solver.epsmax = app.UI.EpsMax.Value; + app.Config = c; + end + + function refreshResults(app) + if isempty(fieldnames(app.Results)), app.UI.ResultSummary.Value = {'No results loaded.'}; cla(app.UI.ResultAxes); return; end + summary = {}; + if isfield(app.Results, 'Times'), summary{end+1} = ['Time steps: ', num2str(numel(app.Results.Times))]; end %#ok + if isfield(app.Results, 'trun') && isstruct(app.Results.trun) + if isfield(app.Results.trun, 'run_time'), summary{end+1} = ['Run time: ', num2str(app.Results.trun.run_time)]; end %#ok + if isfield(app.Results.trun, 'Newton_step'), summary{end+1} = ['Newton steps: ', num2str(app.Results.trun.Newton_step)]; end %#ok + end + app.UI.ResultSummary.Value = summary; + cla(app.UI.ResultAxes); + if isfield(app.Results, 'trun') && isfield(app.Results.trun, 'Newtons_vs_time') && ~isempty(app.Results.trun.Newtons_vs_time) + plot(app.UI.ResultAxes, app.Results.trun.Newtons_vs_time(:,1), app.Results.trun.Newtons_vs_time(:,2), '-o'); title(app.UI.ResultAxes, 'Newtons vs Time'); xlabel(app.UI.ResultAxes, 'Time'); ylabel(app.UI.ResultAxes, 'Newton Count'); + elseif isfield(app.Results, 'Times') && ~isempty(app.Results.Times) + plot(app.UI.ResultAxes, app.Results.Times, 1:numel(app.Results.Times), '-o'); title(app.UI.ResultAxes, 'Time Step Index'); xlabel(app.UI.ResultAxes, 'Time'); ylabel(app.UI.ResultAxes, 'Step'); + end + end + + function appendLog(app, txt) + lines = string(txt); lines = splitlines(lines); + current = string(app.UI.RunLog.Value); + if isequal(current, ""), app.UI.RunLog.Value = cellstr(lines); else, app.UI.RunLog.Value = cellstr([current; lines]); end + end + + function updateStatus(app, txt) + app.UI.StatusLabel.Text = ['Status: ', txt]; + end + + function out = parseExpr(app, lines) %#ok + txt = strtrim(strjoin(string(lines), newline)); + if txt == "", out = []; else, out = eval(txt); end %#ok + end + + function txt = toExpr(app, value) %#ok + if isempty(value), txt = '[]'; return; end + if isnumeric(value) || islogical(value), txt = mat2str(value); return; end + if ischar(value), txt = ['''', strrep(value, '''', ''''''), '''']; return; end + if isstring(value) && isscalar(value), txt = ['''', strrep(char(value), '''', ''''''), '''']; return; end + if iscell(value) + rows = cell(size(value,1),1); + for i = 1:size(value,1) + cols = cell(1,size(value,2)); + for j = 1:size(value,2), cols{j} = app.toExpr(value{i,j}); end + rows{i} = strjoin(cols, ', '); + end + txt = ['{', strjoin(rows, [';', newline]), '}']; return; + end + txt = evalc('disp(value)'); + end + + function value = scalarValue(app, raw) %#ok + if isempty(raw), value = 0; elseif isscalar(raw), value = raw; else, value = raw(1); end + end + end + + methods (Access = public) + function app = EDFMSimulatorApp() + createComponents(app); + registerApp(app, app.UIFigure); + runStartupFcn(app, @(~,~) app.startup()); + end + + function delete(app) + delete(app.UIFigure); + end + end +end diff --git a/gui_support/app/EDFM_Simulator_App.m b/gui_support/app/EDFM_Simulator_App.m new file mode 100644 index 0000000..0731d68 --- /dev/null +++ b/gui_support/app/EDFM_Simulator_App.m @@ -0,0 +1,917 @@ +classdef EDFM_Simulator_App < matlab.apps.AppBase + + % Properties that correspond to app components + properties (Access = public) + UIFigure matlab.ui.Figure + MainGrid matlab.ui.container.GridLayout + TopGrid matlab.ui.container.GridLayout + + TemplateDropDown matlab.ui.control.DropDown + LoadTemplateButton matlab.ui.control.Button + ImportConfigButton matlab.ui.control.Button + ExportConfigButton matlab.ui.control.Button + RunButton matlab.ui.control.Button + ImportResultButton matlab.ui.control.Button + ExportResultButton matlab.ui.control.Button + StatusLabel matlab.ui.control.Label + + MainTabGroup matlab.ui.container.TabGroup + Part1Tab matlab.ui.container.Tab + Part2Tab matlab.ui.container.Tab + Part3Tab matlab.ui.container.Tab + Part4Tab matlab.ui.container.Tab + Part5Tab matlab.ui.container.Tab + Part6Tab matlab.ui.container.Tab + Part7Tab matlab.ui.container.Tab + RunTab matlab.ui.container.Tab + ResultTab matlab.ui.container.Tab + + Part1Grid matlab.ui.container.GridLayout + ModelFlagLabel matlab.ui.control.Label + ModelFlagDropDown matlab.ui.control.DropDown + GridModelLabel matlab.ui.control.Label + GridModelDropDown matlab.ui.control.DropDown + FlowModelLabel matlab.ui.control.Label + FlowModelDropDown matlab.ui.control.DropDown + + Part2Grid matlab.ui.container.GridLayout + DxLabel matlab.ui.control.Label + DxTextArea matlab.ui.control.TextArea + DyLabel matlab.ui.control.Label + DyTextArea matlab.ui.control.TextArea + DzLabel matlab.ui.control.Label + DzTextArea matlab.ui.control.TextArea + NTGLabel matlab.ui.control.Label + NTGTextArea matlab.ui.control.TextArea + + Part3Grid matlab.ui.container.GridLayout + FractureInputStyleLabel matlab.ui.control.Label + FractureInputStyleDropDown matlab.ui.control.DropDown + FractureInputLabel matlab.ui.control.Label + FractureInputTextArea matlab.ui.control.TextArea + FractureLinesLabel matlab.ui.control.Label + FractureLinesTextArea matlab.ui.control.TextArea + FractureHeightsLabel matlab.ui.control.Label + FractureHeightsTextArea matlab.ui.control.TextArea + FlowBarrierFlagsLabel matlab.ui.control.Label + FlowBarrierFlagsTextArea matlab.ui.control.TextArea + + Part4Grid matlab.ui.container.GridLayout + BoundaryLabel matlab.ui.control.Label + BoundaryTextArea matlab.ui.control.TextArea + InvalidLayerLabel matlab.ui.control.Label + InvalidLayerTextArea matlab.ui.control.TextArea + MatrixKxLabel matlab.ui.control.Label + MatrixKxTextArea matlab.ui.control.TextArea + MatrixKyLabel matlab.ui.control.Label + MatrixKyTextArea matlab.ui.control.TextArea + MatrixKzLabel matlab.ui.control.Label + MatrixKzTextArea matlab.ui.control.TextArea + MatrixPoriLabel matlab.ui.control.Label + MatrixPoriTextArea matlab.ui.control.TextArea + MatrixPrporLabel matlab.ui.control.Label + MatrixPrporField matlab.ui.control.NumericEditField + MatrixCporLabel matlab.ui.control.Label + MatrixCporField matlab.ui.control.NumericEditField + RockDensityLabel matlab.ui.control.Label + RockDensityField matlab.ui.control.NumericEditField + FractureKfLabel matlab.ui.control.Label + FractureKfTextArea matlab.ui.control.TextArea + FractureWfLabel matlab.ui.control.Label + FractureWfTextArea matlab.ui.control.TextArea + FracturePorfLabel matlab.ui.control.Label + FracturePorfTextArea matlab.ui.control.TextArea + + Part5Grid matlab.ui.container.GridLayout + InitialPanel matlab.ui.container.Panel + InitialGrid matlab.ui.container.GridLayout + InitialPressureLabel matlab.ui.control.Label + InitialPressureField matlab.ui.control.NumericEditField + InitialSwLabel matlab.ui.control.Label + InitialSwField matlab.ui.control.NumericEditField + InitialCsLabel matlab.ui.control.Label + InitialCsField matlab.ui.control.NumericEditField + InitialCbLabel matlab.ui.control.Label + InitialCbField matlab.ui.control.NumericEditField + + FlowSubTabGroup matlab.ui.container.TabGroup + GasWaterTab matlab.ui.container.Tab + OilWaterTab matlab.ui.container.Tab + MultiComponentTab matlab.ui.container.Tab + + GasWaterGrid matlab.ui.container.GridLayout + GasRelPermLabel matlab.ui.control.Label + GasRelPermTextArea matlab.ui.control.TextArea + GasPVTLabel matlab.ui.control.Label + GasPVTTextArea matlab.ui.control.TextArea + + OilWaterGrid matlab.ui.container.GridLayout + OilRelPermLabel matlab.ui.control.Label + OilRelPermTextArea matlab.ui.control.TextArea + OilPVTLabel matlab.ui.control.Label + OilPVTTextArea matlab.ui.control.TextArea + + MultiComponentGrid matlab.ui.container.GridLayout + AdsorptionLabel matlab.ui.control.Label + AdsorptionTextArea matlab.ui.control.TextArea + NcTableLabel matlab.ui.control.Label + NcTableTextArea matlab.ui.control.TextArea + KrNoSurfLabel matlab.ui.control.Label + KrNoSurfTextArea matlab.ui.control.TextArea + KrSurfLabel matlab.ui.control.Label + KrSurfTextArea matlab.ui.control.TextArea + PcTableLabel matlab.ui.control.Label + PcTableTextArea matlab.ui.control.TextArea + + Part6Grid matlab.ui.container.GridLayout + Well1Label matlab.ui.control.Label + Well1Table matlab.ui.control.Table + FractureWellLocationLabel matlab.ui.control.Label + FractureWellLocationTable matlab.ui.control.Table + Well2Label matlab.ui.control.Label + Well2Table matlab.ui.control.Table + ScheduleLabel matlab.ui.control.Label + ScheduleTable matlab.ui.control.Table + TimeLabel matlab.ui.control.Label + TimeTextArea matlab.ui.control.TextArea + DtMinLabel matlab.ui.control.Label + DtMinTextArea matlab.ui.control.TextArea + DtMaxLabel matlab.ui.control.Label + DtMaxTextArea matlab.ui.control.TextArea + + Part7Grid matlab.ui.container.GridLayout + YitaPLabel matlab.ui.control.Label + YitaPField matlab.ui.control.NumericEditField + YitaSLabel matlab.ui.control.Label + YitaSField matlab.ui.control.NumericEditField + OmegaLabel matlab.ui.control.Label + OmegaField matlab.ui.control.NumericEditField + NmaxLabel matlab.ui.control.Label + NmaxField matlab.ui.control.NumericEditField + EpsAveLabel matlab.ui.control.Label + EpsAveField matlab.ui.control.NumericEditField + EpsMaxLabel matlab.ui.control.Label + EpsMaxField matlab.ui.control.NumericEditField + + RunGrid matlab.ui.container.GridLayout + RunCurrentConfigButton matlab.ui.control.Button + CurrentStageLabel matlab.ui.control.Label + CurrentTimeLabel matlab.ui.control.Label + CurrentDtLabel matlab.ui.control.Label + RunLogTextArea matlab.ui.control.TextArea + + ResultGrid matlab.ui.container.GridLayout + ResultLeftGrid matlab.ui.container.GridLayout + ResultSummaryLabel matlab.ui.control.Label + ResultSummaryTextArea matlab.ui.control.TextArea + ResultTypeLabel matlab.ui.control.Label + ResultTypeDropDown matlab.ui.control.DropDown + PlotResultButton matlab.ui.control.Button + ResultAxes matlab.ui.control.UIAxes + end + + % Component initialization + methods (Access = private) + + % Create UIFigure and components + function createComponents(app) + + % Create UIFigure and hide until all components are created + app.UIFigure = uifigure('Visible', 'off'); + app.UIFigure.Position = [100 100 1500 920]; + app.UIFigure.Name = 'EDFM Simulator App'; + + % Create MainGrid + app.MainGrid = uigridlayout(app.UIFigure); + app.MainGrid.ColumnWidth = {'1x'}; + app.MainGrid.RowHeight = {48, '1x'}; + app.MainGrid.Padding = [8 8 8 8]; + + % Create TopGrid + app.TopGrid = uigridlayout(app.MainGrid); + app.TopGrid.Layout.Row = 1; + app.TopGrid.Layout.Column = 1; + app.TopGrid.RowHeight = {'1x'}; + app.TopGrid.ColumnWidth = {140, 110, 110, 110, 90, 110, 110, '1x', 180}; + app.TopGrid.ColumnSpacing = 8; + app.TopGrid.Padding = [0 0 0 0]; + + % Create top controls + app.TemplateDropDown = uidropdown(app.TopGrid); + app.TemplateDropDown.Layout.Row = 1; + app.TemplateDropDown.Layout.Column = 1; + app.TemplateDropDown.Items = {'case01'}; + app.TemplateDropDown.Value = 'case01'; + + app.LoadTemplateButton = uibutton(app.TopGrid, 'push'); + app.LoadTemplateButton.Layout.Row = 1; + app.LoadTemplateButton.Layout.Column = 2; + app.LoadTemplateButton.Text = 'Load Template'; + + app.ImportConfigButton = uibutton(app.TopGrid, 'push'); + app.ImportConfigButton.Layout.Row = 1; + app.ImportConfigButton.Layout.Column = 3; + app.ImportConfigButton.Text = 'Import Config'; + + app.ExportConfigButton = uibutton(app.TopGrid, 'push'); + app.ExportConfigButton.Layout.Row = 1; + app.ExportConfigButton.Layout.Column = 4; + app.ExportConfigButton.Text = 'Export Config'; + + app.RunButton = uibutton(app.TopGrid, 'push'); + app.RunButton.Layout.Row = 1; + app.RunButton.Layout.Column = 5; + app.RunButton.Text = 'Run'; + + app.ImportResultButton = uibutton(app.TopGrid, 'push'); + app.ImportResultButton.Layout.Row = 1; + app.ImportResultButton.Layout.Column = 6; + app.ImportResultButton.Text = 'Import Result'; + + app.ExportResultButton = uibutton(app.TopGrid, 'push'); + app.ExportResultButton.Layout.Row = 1; + app.ExportResultButton.Layout.Column = 7; + app.ExportResultButton.Text = 'Export Result'; + + app.StatusLabel = uilabel(app.TopGrid); + app.StatusLabel.Layout.Row = 1; + app.StatusLabel.Layout.Column = 9; + app.StatusLabel.HorizontalAlignment = 'right'; + app.StatusLabel.Text = 'Status: Ready'; + + % Create MainTabGroup + app.MainTabGroup = uitabgroup(app.MainGrid); + app.MainTabGroup.Layout.Row = 2; + app.MainTabGroup.Layout.Column = 1; + + % Create tabs + app.Part1Tab = uitab(app.MainTabGroup); + app.Part1Tab.Title = 'Part1 Model'; + + app.Part2Tab = uitab(app.MainTabGroup); + app.Part2Tab.Title = 'Part2 Grid'; + + app.Part3Tab = uitab(app.MainTabGroup); + app.Part3Tab.Title = 'Part3 Fracture'; + + app.Part4Tab = uitab(app.MainTabGroup); + app.Part4Tab.Title = 'Part4 Discretization'; + + app.Part5Tab = uitab(app.MainTabGroup); + app.Part5Tab.Title = 'Part5 Flow'; + + app.Part6Tab = uitab(app.MainTabGroup); + app.Part6Tab.Title = 'Part6 Wells'; + + app.Part7Tab = uitab(app.MainTabGroup); + app.Part7Tab.Title = 'Part7 Solver'; + + app.RunTab = uitab(app.MainTabGroup); + app.RunTab.Title = 'Run'; + + app.ResultTab = uitab(app.MainTabGroup); + app.ResultTab.Title = 'Results'; + + % ---------------- Part1 ---------------- + app.Part1Grid = uigridlayout(app.Part1Tab); + app.Part1Grid.ColumnWidth = {180, '1x'}; + app.Part1Grid.RowHeight = {32, 32, 32, '1x'}; + app.Part1Grid.Padding = [12 12 12 12]; + + app.ModelFlagLabel = uilabel(app.Part1Grid); + app.ModelFlagLabel.Layout.Row = 1; + app.ModelFlagLabel.Layout.Column = 1; + app.ModelFlagLabel.Text = 'Model Flag'; + + app.ModelFlagDropDown = uidropdown(app.Part1Grid); + app.ModelFlagDropDown.Layout.Row = 1; + app.ModelFlagDropDown.Layout.Column = 2; + app.ModelFlagDropDown.Items = {'1'}; + app.ModelFlagDropDown.Value = '1'; + + app.GridModelLabel = uilabel(app.Part1Grid); + app.GridModelLabel.Layout.Row = 2; + app.GridModelLabel.Layout.Column = 1; + app.GridModelLabel.Text = 'Grid Model'; + + app.GridModelDropDown = uidropdown(app.Part1Grid); + app.GridModelDropDown.Layout.Row = 2; + app.GridModelDropDown.Layout.Column = 2; + app.GridModelDropDown.Items = {'1', '2'}; + app.GridModelDropDown.Value = '1'; + + app.FlowModelLabel = uilabel(app.Part1Grid); + app.FlowModelLabel.Layout.Row = 3; + app.FlowModelLabel.Layout.Column = 1; + app.FlowModelLabel.Text = 'Flow Model'; + + app.FlowModelDropDown = uidropdown(app.Part1Grid); + app.FlowModelDropDown.Layout.Row = 3; + app.FlowModelDropDown.Layout.Column = 2; + app.FlowModelDropDown.Items = {'1', '2', '3'}; + app.FlowModelDropDown.Value = '3'; + + % ---------------- Part2 ---------------- + app.Part2Grid = uigridlayout(app.Part2Tab); + app.Part2Grid.ColumnWidth = {140, '1x'}; + app.Part2Grid.RowHeight = {110, 110, 110, '1x'}; + app.Part2Grid.Padding = [12 12 12 12]; + + app.DxLabel = uilabel(app.Part2Grid); + app.DxLabel.Layout.Row = 1; + app.DxLabel.Layout.Column = 1; + app.DxLabel.Text = 'dx'; + + app.DxTextArea = uitextarea(app.Part2Grid); + app.DxTextArea.Layout.Row = 1; + app.DxTextArea.Layout.Column = 2; + + app.DyLabel = uilabel(app.Part2Grid); + app.DyLabel.Layout.Row = 2; + app.DyLabel.Layout.Column = 1; + app.DyLabel.Text = 'dy'; + + app.DyTextArea = uitextarea(app.Part2Grid); + app.DyTextArea.Layout.Row = 2; + app.DyTextArea.Layout.Column = 2; + + app.DzLabel = uilabel(app.Part2Grid); + app.DzLabel.Layout.Row = 3; + app.DzLabel.Layout.Column = 1; + app.DzLabel.Text = 'dz'; + + app.DzTextArea = uitextarea(app.Part2Grid); + app.DzTextArea.Layout.Row = 3; + app.DzTextArea.Layout.Column = 2; + + app.NTGLabel = uilabel(app.Part2Grid); + app.NTGLabel.Layout.Row = 4; + app.NTGLabel.Layout.Column = 1; + app.NTGLabel.Text = 'NTG'; + + app.NTGTextArea = uitextarea(app.Part2Grid); + app.NTGTextArea.Layout.Row = 4; + app.NTGTextArea.Layout.Column = 2; + + % ---------------- Part3 ---------------- + app.Part3Grid = uigridlayout(app.Part3Tab); + app.Part3Grid.ColumnWidth = {170, '1x'}; + app.Part3Grid.RowHeight = {32, 120, 120, 120, 90}; + app.Part3Grid.Padding = [12 12 12 12]; + + app.FractureInputStyleLabel = uilabel(app.Part3Grid); + app.FractureInputStyleLabel.Layout.Row = 1; + app.FractureInputStyleLabel.Layout.Column = 1; + app.FractureInputStyleLabel.Text = 'Input Style'; + + app.FractureInputStyleDropDown = uidropdown(app.Part3Grid); + app.FractureInputStyleDropDown.Layout.Row = 1; + app.FractureInputStyleDropDown.Layout.Column = 2; + app.FractureInputStyleDropDown.Items = {'1', '2', '3', '4'}; + app.FractureInputStyleDropDown.Value = '1'; + + app.FractureInputLabel = uilabel(app.Part3Grid); + app.FractureInputLabel.Layout.Row = 2; + app.FractureInputLabel.Layout.Column = 1; + app.FractureInputLabel.Text = 'Input Content'; + + app.FractureInputTextArea = uitextarea(app.Part3Grid); + app.FractureInputTextArea.Layout.Row = 2; + app.FractureInputTextArea.Layout.Column = 2; + + app.FractureLinesLabel = uilabel(app.Part3Grid); + app.FractureLinesLabel.Layout.Row = 3; + app.FractureLinesLabel.Layout.Column = 1; + app.FractureLinesLabel.Text = 'Fracture Lines'; + + app.FractureLinesTextArea = uitextarea(app.Part3Grid); + app.FractureLinesTextArea.Layout.Row = 3; + app.FractureLinesTextArea.Layout.Column = 2; + + app.FractureHeightsLabel = uilabel(app.Part3Grid); + app.FractureHeightsLabel.Layout.Row = 4; + app.FractureHeightsLabel.Layout.Column = 1; + app.FractureHeightsLabel.Text = 'Fracture Heights'; + + app.FractureHeightsTextArea = uitextarea(app.Part3Grid); + app.FractureHeightsTextArea.Layout.Row = 4; + app.FractureHeightsTextArea.Layout.Column = 2; + + app.FlowBarrierFlagsLabel = uilabel(app.Part3Grid); + app.FlowBarrierFlagsLabel.Layout.Row = 5; + app.FlowBarrierFlagsLabel.Layout.Column = 1; + app.FlowBarrierFlagsLabel.Text = 'Flow Barrier Flags'; + + app.FlowBarrierFlagsTextArea = uitextarea(app.Part3Grid); + app.FlowBarrierFlagsTextArea.Layout.Row = 5; + app.FlowBarrierFlagsTextArea.Layout.Column = 2; + + % ---------------- Part4 ---------------- + app.Part4Grid = uigridlayout(app.Part4Tab); + app.Part4Grid.ColumnWidth = {180, '1x', 180, '1x'}; + app.Part4Grid.RowHeight = {90, 60, 90, 90, 90, 32, '1x'}; + app.Part4Grid.Padding = [12 12 12 12]; + + app.BoundaryLabel = uilabel(app.Part4Grid); + app.BoundaryLabel.Layout.Row = 1; + app.BoundaryLabel.Layout.Column = 1; + app.BoundaryLabel.Text = 'Boundary Polygon'; + + app.BoundaryTextArea = uitextarea(app.Part4Grid); + app.BoundaryTextArea.Layout.Row = 1; + app.BoundaryTextArea.Layout.Column = [2 4]; + + app.InvalidLayerLabel = uilabel(app.Part4Grid); + app.InvalidLayerLabel.Layout.Row = 2; + app.InvalidLayerLabel.Layout.Column = 1; + app.InvalidLayerLabel.Text = 'Invalid Layer'; + + app.InvalidLayerTextArea = uitextarea(app.Part4Grid); + app.InvalidLayerTextArea.Layout.Row = 2; + app.InvalidLayerTextArea.Layout.Column = [2 4]; + + app.MatrixKxLabel = uilabel(app.Part4Grid); + app.MatrixKxLabel.Layout.Row = 3; + app.MatrixKxLabel.Layout.Column = 1; + app.MatrixKxLabel.Text = 'Matrix kx'; + + app.MatrixKxTextArea = uitextarea(app.Part4Grid); + app.MatrixKxTextArea.Layout.Row = 3; + app.MatrixKxTextArea.Layout.Column = 2; + + app.MatrixKyLabel = uilabel(app.Part4Grid); + app.MatrixKyLabel.Layout.Row = 3; + app.MatrixKyLabel.Layout.Column = 3; + app.MatrixKyLabel.Text = 'Matrix ky'; + + app.MatrixKyTextArea = uitextarea(app.Part4Grid); + app.MatrixKyTextArea.Layout.Row = 3; + app.MatrixKyTextArea.Layout.Column = 4; + + app.MatrixKzLabel = uilabel(app.Part4Grid); + app.MatrixKzLabel.Layout.Row = 4; + app.MatrixKzLabel.Layout.Column = 1; + app.MatrixKzLabel.Text = 'Matrix kz'; + + app.MatrixKzTextArea = uitextarea(app.Part4Grid); + app.MatrixKzTextArea.Layout.Row = 4; + app.MatrixKzTextArea.Layout.Column = 2; + + app.MatrixPoriLabel = uilabel(app.Part4Grid); + app.MatrixPoriLabel.Layout.Row = 4; + app.MatrixPoriLabel.Layout.Column = 3; + app.MatrixPoriLabel.Text = 'Matrix pori'; + + app.MatrixPoriTextArea = uitextarea(app.Part4Grid); + app.MatrixPoriTextArea.Layout.Row = 4; + app.MatrixPoriTextArea.Layout.Column = 4; + + app.FractureKfLabel = uilabel(app.Part4Grid); + app.FractureKfLabel.Layout.Row = 5; + app.FractureKfLabel.Layout.Column = 1; + app.FractureKfLabel.Text = 'Fracture Kf'; + + app.FractureKfTextArea = uitextarea(app.Part4Grid); + app.FractureKfTextArea.Layout.Row = 5; + app.FractureKfTextArea.Layout.Column = 2; + + app.FractureWfLabel = uilabel(app.Part4Grid); + app.FractureWfLabel.Layout.Row = 5; + app.FractureWfLabel.Layout.Column = 3; + app.FractureWfLabel.Text = 'Fracture Wf'; + + app.FractureWfTextArea = uitextarea(app.Part4Grid); + app.FractureWfTextArea.Layout.Row = 5; + app.FractureWfTextArea.Layout.Column = 4; + + app.MatrixPrporLabel = uilabel(app.Part4Grid); + app.MatrixPrporLabel.Layout.Row = 6; + app.MatrixPrporLabel.Layout.Column = 1; + app.MatrixPrporLabel.Text = 'Matrix prpor'; + + app.MatrixPrporField = uieditfield(app.Part4Grid, 'numeric'); + app.MatrixPrporField.Layout.Row = 6; + app.MatrixPrporField.Layout.Column = 2; + + app.MatrixCporLabel = uilabel(app.Part4Grid); + app.MatrixCporLabel.Layout.Row = 6; + app.MatrixCporLabel.Layout.Column = 3; + app.MatrixCporLabel.Text = 'Matrix cpor'; + + app.MatrixCporField = uieditfield(app.Part4Grid, 'numeric'); + app.MatrixCporField.Layout.Row = 6; + app.MatrixCporField.Layout.Column = 4; + + app.RockDensityLabel = uilabel(app.Part4Grid); + app.RockDensityLabel.Layout.Row = 7; + app.RockDensityLabel.Layout.Column = 1; + app.RockDensityLabel.Text = 'Rock Density'; + + app.RockDensityField = uieditfield(app.Part4Grid, 'numeric'); + app.RockDensityField.Layout.Row = 7; + app.RockDensityField.Layout.Column = 2; + + app.FracturePorfLabel = uilabel(app.Part4Grid); + app.FracturePorfLabel.Layout.Row = 7; + app.FracturePorfLabel.Layout.Column = 3; + app.FracturePorfLabel.Text = 'Fracture Porf'; + + app.FracturePorfTextArea = uitextarea(app.Part4Grid); + app.FracturePorfTextArea.Layout.Row = 7; + app.FracturePorfTextArea.Layout.Column = 4; + + % ---------------- Part5 ---------------- + app.Part5Grid = uigridlayout(app.Part5Tab); + app.Part5Grid.ColumnWidth = {'1x'}; + app.Part5Grid.RowHeight = {110, '1x'}; + app.Part5Grid.Padding = [12 12 12 12]; + + app.InitialPanel = uipanel(app.Part5Grid); + app.InitialPanel.Layout.Row = 1; + app.InitialPanel.Layout.Column = 1; + app.InitialPanel.Title = 'Initial State'; + + app.InitialGrid = uigridlayout(app.InitialPanel); + app.InitialGrid.ColumnWidth = {120, 120, 120, 120}; + app.InitialGrid.RowHeight = {26, 32}; + + app.InitialPressureLabel = uilabel(app.InitialGrid); + app.InitialPressureLabel.Layout.Row = 1; + app.InitialPressureLabel.Layout.Column = 1; + app.InitialPressureLabel.Text = 'Pressure'; + + app.InitialPressureField = uieditfield(app.InitialGrid, 'numeric'); + app.InitialPressureField.Layout.Row = 2; + app.InitialPressureField.Layout.Column = 1; + + app.InitialSwLabel = uilabel(app.InitialGrid); + app.InitialSwLabel.Layout.Row = 1; + app.InitialSwLabel.Layout.Column = 2; + app.InitialSwLabel.Text = 'Sw'; + + app.InitialSwField = uieditfield(app.InitialGrid, 'numeric'); + app.InitialSwField.Layout.Row = 2; + app.InitialSwField.Layout.Column = 2; + + app.InitialCsLabel = uilabel(app.InitialGrid); + app.InitialCsLabel.Layout.Row = 1; + app.InitialCsLabel.Layout.Column = 3; + app.InitialCsLabel.Text = 'Cs'; + + app.InitialCsField = uieditfield(app.InitialGrid, 'numeric'); + app.InitialCsField.Layout.Row = 2; + app.InitialCsField.Layout.Column = 3; + + app.InitialCbLabel = uilabel(app.InitialGrid); + app.InitialCbLabel.Layout.Row = 1; + app.InitialCbLabel.Layout.Column = 4; + app.InitialCbLabel.Text = 'Cb'; + + app.InitialCbField = uieditfield(app.InitialGrid, 'numeric'); + app.InitialCbField.Layout.Row = 2; + app.InitialCbField.Layout.Column = 4; + + app.FlowSubTabGroup = uitabgroup(app.Part5Grid); + app.FlowSubTabGroup.Layout.Row = 2; + app.FlowSubTabGroup.Layout.Column = 1; + + app.GasWaterTab = uitab(app.FlowSubTabGroup); + app.GasWaterTab.Title = 'Gas-Water'; + + app.OilWaterTab = uitab(app.FlowSubTabGroup); + app.OilWaterTab.Title = 'Oil-Water'; + + app.MultiComponentTab = uitab(app.FlowSubTabGroup); + app.MultiComponentTab.Title = 'Multi-Component'; + + app.GasWaterGrid = uigridlayout(app.GasWaterTab); + app.GasWaterGrid.ColumnWidth = {180, '1x'}; + app.GasWaterGrid.RowHeight = {140, '1x'}; + app.GasWaterGrid.Padding = [12 12 12 12]; + + app.GasRelPermLabel = uilabel(app.GasWaterGrid); + app.GasRelPermLabel.Layout.Row = 1; + app.GasRelPermLabel.Layout.Column = 1; + app.GasRelPermLabel.Text = 'Gas RelPerm Table'; + + app.GasRelPermTextArea = uitextarea(app.GasWaterGrid); + app.GasRelPermTextArea.Layout.Row = 1; + app.GasRelPermTextArea.Layout.Column = 2; + + app.GasPVTLabel = uilabel(app.GasWaterGrid); + app.GasPVTLabel.Layout.Row = 2; + app.GasPVTLabel.Layout.Column = 1; + app.GasPVTLabel.Text = 'Gas PVT Text'; + + app.GasPVTTextArea = uitextarea(app.GasWaterGrid); + app.GasPVTTextArea.Layout.Row = 2; + app.GasPVTTextArea.Layout.Column = 2; + + app.OilWaterGrid = uigridlayout(app.OilWaterTab); + app.OilWaterGrid.ColumnWidth = {180, '1x'}; + app.OilWaterGrid.RowHeight = {140, '1x'}; + app.OilWaterGrid.Padding = [12 12 12 12]; + + app.OilRelPermLabel = uilabel(app.OilWaterGrid); + app.OilRelPermLabel.Layout.Row = 1; + app.OilRelPermLabel.Layout.Column = 1; + app.OilRelPermLabel.Text = 'Oil RelPerm Table'; + + app.OilRelPermTextArea = uitextarea(app.OilWaterGrid); + app.OilRelPermTextArea.Layout.Row = 1; + app.OilRelPermTextArea.Layout.Column = 2; + + app.OilPVTLabel = uilabel(app.OilWaterGrid); + app.OilPVTLabel.Layout.Row = 2; + app.OilPVTLabel.Layout.Column = 1; + app.OilPVTLabel.Text = 'Oil PVT Text'; + + app.OilPVTTextArea = uitextarea(app.OilWaterGrid); + app.OilPVTTextArea.Layout.Row = 2; + app.OilPVTTextArea.Layout.Column = 2; + + app.MultiComponentGrid = uigridlayout(app.MultiComponentTab); + app.MultiComponentGrid.ColumnWidth = {180, '1x', 180, '1x'}; + app.MultiComponentGrid.RowHeight = {120, 120, 120}; + app.MultiComponentGrid.Padding = [12 12 12 12]; + + app.AdsorptionLabel = uilabel(app.MultiComponentGrid); + app.AdsorptionLabel.Layout.Row = 1; + app.AdsorptionLabel.Layout.Column = 1; + app.AdsorptionLabel.Text = 'Adsorption Table'; + + app.AdsorptionTextArea = uitextarea(app.MultiComponentGrid); + app.AdsorptionTextArea.Layout.Row = 1; + app.AdsorptionTextArea.Layout.Column = 2; + + app.NcTableLabel = uilabel(app.MultiComponentGrid); + app.NcTableLabel.Layout.Row = 1; + app.NcTableLabel.Layout.Column = 3; + app.NcTableLabel.Text = 'Nc Table'; + + app.NcTableTextArea = uitextarea(app.MultiComponentGrid); + app.NcTableTextArea.Layout.Row = 1; + app.NcTableTextArea.Layout.Column = 4; + + app.KrNoSurfLabel = uilabel(app.MultiComponentGrid); + app.KrNoSurfLabel.Layout.Row = 2; + app.KrNoSurfLabel.Layout.Column = 1; + app.KrNoSurfLabel.Text = 'Kr No Surf'; + + app.KrNoSurfTextArea = uitextarea(app.MultiComponentGrid); + app.KrNoSurfTextArea.Layout.Row = 2; + app.KrNoSurfTextArea.Layout.Column = 2; + + app.KrSurfLabel = uilabel(app.MultiComponentGrid); + app.KrSurfLabel.Layout.Row = 2; + app.KrSurfLabel.Layout.Column = 3; + app.KrSurfLabel.Text = 'Kr Surf'; + + app.KrSurfTextArea = uitextarea(app.MultiComponentGrid); + app.KrSurfTextArea.Layout.Row = 2; + app.KrSurfTextArea.Layout.Column = 4; + + app.PcTableLabel = uilabel(app.MultiComponentGrid); + app.PcTableLabel.Layout.Row = 3; + app.PcTableLabel.Layout.Column = 1; + app.PcTableLabel.Text = 'Pc Table'; + + app.PcTableTextArea = uitextarea(app.MultiComponentGrid); + app.PcTableTextArea.Layout.Row = 3; + app.PcTableTextArea.Layout.Column = [2 4]; + + % ---------------- Part6 ---------------- + app.Part6Grid = uigridlayout(app.Part6Tab); + app.Part6Grid.ColumnWidth = {180, '1x'}; + app.Part6Grid.RowHeight = {120, 120, 120, 160, 80, 80, '1x'}; + app.Part6Grid.Padding = [12 12 12 12]; + + app.Well1Label = uilabel(app.Part6Grid); + app.Well1Label.Layout.Row = 1; + app.Well1Label.Layout.Column = 1; + app.Well1Label.Text = 'Well1'; + + app.Well1Table = uitable(app.Part6Grid); + app.Well1Table.Layout.Row = 1; + app.Well1Table.Layout.Column = 2; + + app.FractureWellLocationLabel = uilabel(app.Part6Grid); + app.FractureWellLocationLabel.Layout.Row = 2; + app.FractureWellLocationLabel.Layout.Column = 1; + app.FractureWellLocationLabel.Text = 'Fracture Well Locations'; + + app.FractureWellLocationTable = uitable(app.Part6Grid); + app.FractureWellLocationTable.Layout.Row = 2; + app.FractureWellLocationTable.Layout.Column = 2; + + app.Well2Label = uilabel(app.Part6Grid); + app.Well2Label.Layout.Row = 3; + app.Well2Label.Layout.Column = 1; + app.Well2Label.Text = 'Well2'; + + app.Well2Table = uitable(app.Part6Grid); + app.Well2Table.Layout.Row = 3; + app.Well2Table.Layout.Column = 2; + + app.ScheduleLabel = uilabel(app.Part6Grid); + app.ScheduleLabel.Layout.Row = 4; + app.ScheduleLabel.Layout.Column = 1; + app.ScheduleLabel.Text = 'Schedule'; + + app.ScheduleTable = uitable(app.Part6Grid); + app.ScheduleTable.Layout.Row = 4; + app.ScheduleTable.Layout.Column = 2; + + app.TimeLabel = uilabel(app.Part6Grid); + app.TimeLabel.Layout.Row = 5; + app.TimeLabel.Layout.Column = 1; + app.TimeLabel.Text = 'Time'; + + app.TimeTextArea = uitextarea(app.Part6Grid); + app.TimeTextArea.Layout.Row = 5; + app.TimeTextArea.Layout.Column = 2; + + app.DtMinLabel = uilabel(app.Part6Grid); + app.DtMinLabel.Layout.Row = 6; + app.DtMinLabel.Layout.Column = 1; + app.DtMinLabel.Text = 'dtmin'; + + app.DtMinTextArea = uitextarea(app.Part6Grid); + app.DtMinTextArea.Layout.Row = 6; + app.DtMinTextArea.Layout.Column = 2; + + app.DtMaxLabel = uilabel(app.Part6Grid); + app.DtMaxLabel.Layout.Row = 7; + app.DtMaxLabel.Layout.Column = 1; + app.DtMaxLabel.Text = 'dtmax'; + + app.DtMaxTextArea = uitextarea(app.Part6Grid); + app.DtMaxTextArea.Layout.Row = 7; + app.DtMaxTextArea.Layout.Column = 2; + + % ---------------- Part7 ---------------- + app.Part7Grid = uigridlayout(app.Part7Tab); + app.Part7Grid.ColumnWidth = {100, 100, 100, 100, 100, 100}; + app.Part7Grid.RowHeight = {26, 32, '1x'}; + app.Part7Grid.Padding = [12 12 12 12]; + + app.YitaPLabel = uilabel(app.Part7Grid); + app.YitaPLabel.Layout.Row = 1; + app.YitaPLabel.Layout.Column = 1; + app.YitaPLabel.Text = 'yitap'; + + app.YitaPField = uieditfield(app.Part7Grid, 'numeric'); + app.YitaPField.Layout.Row = 2; + app.YitaPField.Layout.Column = 1; + + app.YitaSLabel = uilabel(app.Part7Grid); + app.YitaSLabel.Layout.Row = 1; + app.YitaSLabel.Layout.Column = 2; + app.YitaSLabel.Text = 'yitas'; + + app.YitaSField = uieditfield(app.Part7Grid, 'numeric'); + app.YitaSField.Layout.Row = 2; + app.YitaSField.Layout.Column = 2; + + app.OmegaLabel = uilabel(app.Part7Grid); + app.OmegaLabel.Layout.Row = 1; + app.OmegaLabel.Layout.Column = 3; + app.OmegaLabel.Text = 'omega'; + + app.OmegaField = uieditfield(app.Part7Grid, 'numeric'); + app.OmegaField.Layout.Row = 2; + app.OmegaField.Layout.Column = 3; + + app.NmaxLabel = uilabel(app.Part7Grid); + app.NmaxLabel.Layout.Row = 1; + app.NmaxLabel.Layout.Column = 4; + app.NmaxLabel.Text = 'Nmax'; + + app.NmaxField = uieditfield(app.Part7Grid, 'numeric'); + app.NmaxField.Layout.Row = 2; + app.NmaxField.Layout.Column = 4; + + app.EpsAveLabel = uilabel(app.Part7Grid); + app.EpsAveLabel.Layout.Row = 1; + app.EpsAveLabel.Layout.Column = 5; + app.EpsAveLabel.Text = 'epsave'; + + app.EpsAveField = uieditfield(app.Part7Grid, 'numeric'); + app.EpsAveField.Layout.Row = 2; + app.EpsAveField.Layout.Column = 5; + + app.EpsMaxLabel = uilabel(app.Part7Grid); + app.EpsMaxLabel.Layout.Row = 1; + app.EpsMaxLabel.Layout.Column = 6; + app.EpsMaxLabel.Text = 'epsmax'; + + app.EpsMaxField = uieditfield(app.Part7Grid, 'numeric'); + app.EpsMaxField.Layout.Row = 2; + app.EpsMaxField.Layout.Column = 6; + + % ---------------- RunTab ---------------- + app.RunGrid = uigridlayout(app.RunTab); + app.RunGrid.ColumnWidth = {140, 180, 180, '1x'}; + app.RunGrid.RowHeight = {36, '1x'}; + app.RunGrid.Padding = [12 12 12 12]; + + app.RunCurrentConfigButton = uibutton(app.RunGrid, 'push'); + app.RunCurrentConfigButton.Layout.Row = 1; + app.RunCurrentConfigButton.Layout.Column = 1; + app.RunCurrentConfigButton.Text = 'Run Current Config'; + + app.CurrentStageLabel = uilabel(app.RunGrid); + app.CurrentStageLabel.Layout.Row = 1; + app.CurrentStageLabel.Layout.Column = 2; + app.CurrentStageLabel.Text = 'Stage: -'; + + app.CurrentTimeLabel = uilabel(app.RunGrid); + app.CurrentTimeLabel.Layout.Row = 1; + app.CurrentTimeLabel.Layout.Column = 3; + app.CurrentTimeLabel.Text = 'Time: -'; + + app.CurrentDtLabel = uilabel(app.RunGrid); + app.CurrentDtLabel.Layout.Row = 1; + app.CurrentDtLabel.Layout.Column = 4; + app.CurrentDtLabel.Text = 'dt: -'; + + app.RunLogTextArea = uitextarea(app.RunGrid); + app.RunLogTextArea.Layout.Row = 2; + app.RunLogTextArea.Layout.Column = [1 4]; + app.RunLogTextArea.Editable = 'off'; + + % ---------------- ResultTab ---------------- + app.ResultGrid = uigridlayout(app.ResultTab); + app.ResultGrid.ColumnWidth = {360, '1x'}; + app.ResultGrid.RowHeight = {'1x'}; + app.ResultGrid.Padding = [12 12 12 12]; + + app.ResultLeftGrid = uigridlayout(app.ResultGrid); + app.ResultLeftGrid.Layout.Row = 1; + app.ResultLeftGrid.Layout.Column = 1; + app.ResultLeftGrid.ColumnWidth = {'1x'}; + app.ResultLeftGrid.RowHeight = {24, 180, 24, 32, 36, '1x'}; + + app.ResultSummaryLabel = uilabel(app.ResultLeftGrid); + app.ResultSummaryLabel.Layout.Row = 1; + app.ResultSummaryLabel.Layout.Column = 1; + app.ResultSummaryLabel.Text = 'Result Summary'; + + app.ResultSummaryTextArea = uitextarea(app.ResultLeftGrid); + app.ResultSummaryTextArea.Layout.Row = 2; + app.ResultSummaryTextArea.Layout.Column = 1; + app.ResultSummaryTextArea.Editable = 'off'; + + app.ResultTypeLabel = uilabel(app.ResultLeftGrid); + app.ResultTypeLabel.Layout.Row = 3; + app.ResultTypeLabel.Layout.Column = 1; + app.ResultTypeLabel.Text = 'Result Type'; + + app.ResultTypeDropDown = uidropdown(app.ResultLeftGrid); + app.ResultTypeDropDown.Layout.Row = 4; + app.ResultTypeDropDown.Layout.Column = 1; + app.ResultTypeDropDown.Items = {'Time Steps', 'Newtons vs Time'}; + app.ResultTypeDropDown.Value = 'Time Steps'; + + app.PlotResultButton = uibutton(app.ResultLeftGrid, 'push'); + app.PlotResultButton.Layout.Row = 5; + app.PlotResultButton.Layout.Column = 1; + app.PlotResultButton.Text = 'Plot Result'; + + app.ResultAxes = uiaxes(app.ResultGrid); + app.ResultAxes.Layout.Row = 1; + app.ResultAxes.Layout.Column = 2; + title(app.ResultAxes, 'Results'); + xlabel(app.ResultAxes, 'X'); + ylabel(app.ResultAxes, 'Y'); + + % Show the figure after all components are created + app.UIFigure.Visible = 'on'; + end + end + + % App creation and deletion + methods (Access = public) + + % Construct app + function app = EDFM_Simulator_App + + % Create UIFigure and components + createComponents(app) + + % Register the app with App Designer + registerApp(app, app.UIFigure) + + if nargout == 0 + clear app + end + end + + % Code that executes before app deletion + function delete(app) + + % Delete UIFigure when app is deleted + delete(app.UIFigure) + end + end +end diff --git a/gui_support/app/EDFM_Simulator_App.mlapp b/gui_support/app/EDFM_Simulator_App.mlapp new file mode 100644 index 0000000000000000000000000000000000000000..cbb91799f22a3d1149e3ee912a1ba82426890726 GIT binary patch literal 173700 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�bi_BI*K#qjIe4QNyU7NQzkeqieAhJ^= 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 i && ~isempty(wells_config.well2{i, 1}) + well2(i, :) = wells_config.well2(i, :); + well2{i, 2} = length(perfnum{i, 1}); + well2{i, 3} = perfnum{i, 1}; + else + well2(i, :) = {sprintf('wf%d', i), length(perfnum{i, 1}), perfnum{i, 1}, 0.178/2, 0, 4}; + end +end +end diff --git a/gui_support/templates/load_case_template.m b/gui_support/templates/load_case_template.m new file mode 100644 index 0000000..a6d9696 --- /dev/null +++ b/gui_support/templates/load_case_template.m @@ -0,0 +1,25 @@ +function config = load_case_template(case_id) +%LOAD_CASE_TEMPLATE Load a predefined case template into unified config. + +arguments + case_id +end + +case_key = normalize_case_id(case_id); + +switch case_key + case "case01" + config = load_case_template_case01(); + otherwise + error('load_case_template:UnsupportedCase', ... + 'Unsupported case template: %s', string(case_key)); +end +end + +function case_key = normalize_case_id(case_id) +if isnumeric(case_id) + case_key = "case" + compose("%02d", case_id); +else + case_key = lower(string(case_id)); +end +end diff --git a/gui_support/templates/load_case_template_case01.m b/gui_support/templates/load_case_template_case01.m new file mode 100644 index 0000000..48b78ba --- /dev/null +++ b/gui_support/templates/load_case_template_case01.m @@ -0,0 +1,189 @@ +function config = load_case_template_case01() +%LOAD_CASE_TEMPLATE_CASE01 Build config for case 1. + +config = create_empty_config(); + +config.meta.case_name = 'case01_multicomponent_irregular_domain'; +config.meta.case_id = 'case01'; +config.meta.description = 'Multicomponent flow with irregular heterogeneous domain'; +config.meta.source_case_folder = 'CASE01_FOLDER'; +config.meta.created_from_template = 'case01'; + +config.model.modelflag = 1; +config.model.grid_model = 1; +config.model.flow_model = 3; + +config.grid.dx = 50 * ones(1, 20); +config.grid.dy = 50 * ones(1, 10); +config.grid.dz = 10 * ones(1, 1); +config.grid.nx = numel(config.grid.dx); +config.grid.ny = numel(config.grid.dy); +config.grid.nz = numel(config.grid.dz); +config.grid.NTG = ones(config.grid.nx * config.grid.ny * config.grid.nz, 1); + +config.fracture.input_style = 1; +config.fracture.input_content = { + [255,255,5],90,90,0,200,10,1; + [305,255,5],90,90,0,200,10,1; + [355,255,5],90,90,0,200,10,1; + [405,255,5],90,90,0,200,10,1; + [455,255,5],90,90,0,200,10,1; + [505,255,5],90,90,0,200,10,1; + [555,255,5],90,90,0,200,10,1; + [605,255,5],90,90,0,200,10,1; + [655,255,5],90,90,0,200,10,1; + [705,255,5],90,90,0,200,10,1; + [755,255,5],90,90,0,200,10,1; + }; +config.fracture.flowBarrierFlags = []; + +config.discretization.mode = 1; +config.discretization.sp.boundary_polygon = [ + 0,100; + 800,50; + 1000,150; + 1000,350; + 800,450; + 0,400; + 0,100]; +config.discretization.sp.invalid_layer = []; +config.discretization.sp.matrix.prpor = 20; +config.discretization.sp.matrix.cpor = 1.0e-5; +config.discretization.sp.matrix.rock_density = 2700; +config.discretization.sp.fracture.prporf = 20; +config.discretization.sp.fracture.cporf = 1.0e-5; +config.discretization.sp.stress.fracture_factor = 0.0; +config.discretization.sp.stress.matrix_factor = 0.0; +config.discretization.sp.stress.ref_pressure = 20; + +config.flow.multi_component.Ds = 0.76e-9; +config.flow.multi_component.Db = 2.2e-9; +config.flow.multi_component.c_ca_table = [ + 0 0 0; + 0.05 1 0.075; + 0.1 1.75 0.125; + 0.2 3 0.2; + 0.5 4.35 0.325; + 1 4.55 0.365]; +config.flow.multi_component.R = 0.008314; +config.flow.multi_component.Vm = 18.02e-6; +config.flow.multi_component.Temperature = 293.15; +config.flow.multi_component.x_matrix = 0.9; +config.flow.multi_component.x_fracture = 1.0; +config.flow.multi_component.cs_Nc = [ + 0 1.6e-6 30; + 0.1 9.5e-6 10; + 0.2 2.5e-5 4; + 0.5 5.8e-5 1.4; + 1 8.2e-5 1; + 2 8.8e-5 0.75]; +config.flow.multi_component.kr_nosurf = [ + 0 0 0.64; + 0.25 0 0.64; + 0.30 0.072 0.6; + 0.40 0.14 0.56; + 0.50 0.26 0.48; + 0.60 0.4 0.38; + 0.70 0.56 0.26; + 0.85 0.88 0; + 1 0.88 0]; +config.flow.multi_component.kr_surf = [ + 0 0 0.6; + 0.18 0 0.6; + 0.25 0.056 0.56; + 0.30 0.1 0.52; + 0.40 0.19 0.42; + 0.50 0.29 0.3; + 0.60 0.37 0.19; + 0.75 0.46 0; + 1 0.46 0]; +config.flow.multi_component.PC = [ + 0 3.8916; + 0.2 3.8916; + 0.316 0.5796; + 0.435 0.3724; + 0.562 0.2425; + 0.614 0.0608; + 0.702 0.0372; + 0.812 0.0137; + 0.875 0.0104; + 0.906 0.009; + 0.937 0.0075; + 0.969 0.0059; + 1 0]; +config.flow.multi_component.cs_Nc_fracture = config.flow.multi_component.cs_Nc; +config.flow.multi_component.kr_nosurf_fracture = config.flow.multi_component.kr_nosurf; +config.flow.multi_component.kr_surf_fracture = config.flow.multi_component.kr_surf; +config.flow.multi_component.PC_fracture = config.flow.multi_component.PC; +config.flow.multi_component.ifpcgl = 0; +config.flow.multi_component.p_grad_threshold = 0.01; +config.flow.multi_component.gas_prop.VL = 0.0; +config.flow.multi_component.gas_prop.PL = 3.5; +config.flow.multi_component.gas_prop.Kn = 0; +config.flow.multi_component.gas_prop.stress_factor_fracture = 0.0; +config.flow.multi_component.gas_prop.stress_factor_matrix = 0.0; +config.flow.multi_component.gas_prop.stress_factor_ref_pressure = 20; +config.flow.multi_component.gas_prop.beta_non_darcy_flow = 0; +config.flow.multi_component.density_g_sc = 800; +config.flow.multi_component.gas_model = 1; +config.flow.multi_component.prg = 20; +config.flow.multi_component.Bgi = 1; +config.flow.multi_component.cg = 5e-4; +config.flow.multi_component.vgi = 6; +config.flow.multi_component.cvg = 0; +config.flow.multi_component.density_w_sc = 1000; +config.flow.multi_component.prw = 20; +config.flow.multi_component.Bwi = 1.0; +config.flow.multi_component.cw = 4.0e-4; +config.flow.multi_component.vwi = 1; +config.flow.multi_component.cvw = 0; +config.flow.multi_component.number_state_variables = 4; + +config.initial.pressure = 20; +config.initial.sw = 0.2; +config.initial.cs = 0.0; +config.initial.cb = 0.0; + +config.wells.well1 = {}; +config.wells.num_fracture_wells = 1; +config.wells.welloc = { + [ + 255,255,5; + 305,255,5; + 355,255,5; + 405,255,5; + 455,255,5; + 505,255,5; + 555,255,5; + 605,255,5; + 655,255,5; + 705,255,5; + 755,255,5 + ]}; +config.wells.well2 = { + 'w1', 0, [], 0.178/2, 0, 4 + }; + +config.schedule.number_phases = 3; +config.schedule.time = [10; 30; 200]; +config.schedule.dtmax = [0.1; 0.5; 0.5]; +config.schedule.dtmin = [0.001; 0.001; 0.001]; +config.schedule.well_schedules = { + { + 'w1','open','inj','const_pwf',40,40,'Cs_inj',0.5,'Cb_inj',1 + }; + { + 'w1','open','pro','const_q',0,0 + }; + { + 'w1','open','pro','const_pwf',10,10 + }}; + +config.solver.yitap = 5; +config.solver.yitas = 0.04; +config.solver.omega = 0.5; +config.solver.Nmax = 50; +config.solver.epsave = 1e-6; +config.solver.epsmax = 1e-6; + +config.output.result_name = 'case01_default_run';