diff --git a/gui_support/app/EDFMAppController.m b/gui_support/app/EDFMAppController.m index 306ab1d..32374e2 100644 --- a/gui_support/app/EDFMAppController.m +++ b/gui_support/app/EDFMAppController.m @@ -14,7 +14,9 @@ classdef EDFMAppController < handle end function startup(obj) - obj.setDropDownItems('TemplateDropDown', {'case01'}, 'case01'); + obj.setDropDownItems('TemplateDropDown', ... + {'case01', 'case02', 'case03', 'case04', 'case05', 'case06', 'case07'}, ... + 'case01'); obj.setDropDownItems('ResultTypeDropDown', {'Time Steps', 'Newtons vs Time'}, 'Time Steps'); obj.setDropDownItems('ModelFlagDropDown', {'1'}, '1'); obj.setDropDownItems('ModelGridModelDropDown', {'1', '2'}, '1'); diff --git a/gui_support/app/EDFM_Simulator_App.mlapp b/gui_support/app/EDFM_Simulator_App.mlapp index 45cc869..f84b6f4 100644 Binary files a/gui_support/app/EDFM_Simulator_App.mlapp and b/gui_support/app/EDFM_Simulator_App.mlapp differ diff --git a/gui_support/runtime/run_case.m b/gui_support/runtime/run_case.m index 01ba6d0..0a0bc58 100644 --- a/gui_support/runtime/run_case.m +++ b/gui_support/runtime/run_case.m @@ -97,6 +97,18 @@ case_id = lower(string(meta_config.case_id)); switch case_id case "case01" source_case_folder = find_case_folder_by_index(project_root, 1); + case "case02" + source_case_folder = find_case_folder_by_index(project_root, 2); + case "case03" + source_case_folder = find_case_folder_by_index(project_root, 3); + case "case04" + source_case_folder = find_case_folder_by_index(project_root, 4); + case "case05" + source_case_folder = find_case_folder_by_index(project_root, 5); + case "case06" + source_case_folder = find_case_folder_by_index(project_root, 6); + case "case07" + source_case_folder = find_case_folder_by_index(project_root, 7); otherwise if isempty(source_case_folder) || startsWith(string(source_case_folder), "CASE") source_case_folder = ''; diff --git a/gui_support/templates/build_basic_case_template.m b/gui_support/templates/build_basic_case_template.m new file mode 100644 index 0000000..5429dc9 --- /dev/null +++ b/gui_support/templates/build_basic_case_template.m @@ -0,0 +1,54 @@ +function config = build_basic_case_template(case_id, case_name, description, model, grid, fracture, initial, wells, schedule, solver) +%BUILD_BASIC_CASE_TEMPLATE Create a config template for legacy case migration. + +config = create_empty_config(); + +case_num = sscanf(char(case_id), 'case%d'); + +config.meta.case_name = case_name; +config.meta.case_id = case_id; +config.meta.description = description; +config.meta.source_case_folder = sprintf('CASE%02d_FOLDER', case_num); +config.meta.created_from_template = case_id; + +config.model.modelflag = model.modelflag; +config.model.grid_model = model.grid_model; +config.model.flow_model = model.flow_model; + +config.grid.dx = grid.dx; +config.grid.dy = grid.dy; +config.grid.dz = grid.dz; +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 = fracture.input_content; +config.fracture.flowBarrierFlags = []; + +config.initial.pressure = initial.pressure; +config.initial.sw = initial.sw; +config.initial.cs = initial.cs; +config.initial.cb = initial.cb; + +config.wells.well1 = wells.well1; +config.wells.num_fracture_wells = numel(wells.welloc); +config.wells.welloc = wells.welloc; +config.wells.well2 = wells.well2; + +config.schedule.number_phases = numel(schedule.time); +config.schedule.time = schedule.time; +config.schedule.dtmax = schedule.dtmax; +config.schedule.dtmin = schedule.dtmin; +config.schedule.well_schedules = schedule.well_schedules; + +config.solver.yitap = solver.yitap; +config.solver.yitas = solver.yitas; +config.solver.omega = solver.omega; +config.solver.Nmax = solver.Nmax; +config.solver.epsave = solver.epsave; +config.solver.epsmax = solver.epsmax; + +config.output.result_name = sprintf('%s_default_run', case_id); +end diff --git a/gui_support/templates/load_case_template.m b/gui_support/templates/load_case_template.m index a6d9696..e275054 100644 --- a/gui_support/templates/load_case_template.m +++ b/gui_support/templates/load_case_template.m @@ -10,6 +10,18 @@ case_key = normalize_case_id(case_id); switch case_key case "case01" config = load_case_template_case01(); + case "case02" + config = load_case_template_case02(); + case "case03" + config = load_case_template_case03(); + case "case04" + config = load_case_template_case04(); + case "case05" + config = load_case_template_case05(); + case "case06" + config = load_case_template_case06(); + case "case07" + config = load_case_template_case07(); otherwise error('load_case_template:UnsupportedCase', ... 'Unsupported case template: %s', string(case_key)); diff --git a/gui_support/templates/load_case_template_case02.m b/gui_support/templates/load_case_template_case02.m new file mode 100644 index 0000000..b243bff --- /dev/null +++ b/gui_support/templates/load_case_template_case02.m @@ -0,0 +1,56 @@ +function config = load_case_template_case02() +%LOAD_CASE_TEMPLATE_CASE02 Build config for case 2. + +config = build_basic_case_template( ... + 'case02', ... + 'case02_multicomponent_invalid_grid', ... + 'Multicomponent flow with invalid-grid geometry', ... + struct('modelflag', 1, 'grid_model', 1, 'flow_model', 3), ... + struct( ... + 'dx', 50 * ones(1, 20), ... + 'dy', 50 * ones(1, 20), ... + 'dz', 10 * ones(1, 3)), ... + struct('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,25],90,90,0,200,10,1; + [605,255,25],90,90,0,200,10,1; + [655,255,25],90,90,0,200,10,1; + [705,255,25],90,90,0,200,10,1; + [755,255,25],90,90,0,200,10,1 + }}), ... + struct('pressure', 20, 'sw', 0.2, 'cs', 0.0, 'cb', 50.0), ... + struct( ... + 'well1', {{}}, ... + 'welloc', {{[ + 255,255,5; + 305,255,5; + 355,255,5; + 405,255,5; + 455,255,5; + 505,255,5; + 555,255,25; + 605,255,25; + 655,255,25; + 705,255,25; + 755,255,25 + ]}}, ... + 'well2', {{ + 'w1', 0, [], 0.178/2, 0, 4 + }}), ... + struct( ... + 'time', [10; 30; 200], ... + 'dtmax', [0.1; 0.5; 0.5], ... + 'dtmin', [0.001; 0.001; 0.001], ... + '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} + }}), ... + struct('yitap', 5, 'yitas', 0.04, 'omega', 0.5, 'Nmax', 50, 'epsave', 1e-6, 'epsmax', 1e-6)); +end diff --git a/gui_support/templates/load_case_template_case03.m b/gui_support/templates/load_case_template_case03.m new file mode 100644 index 0000000..a478647 --- /dev/null +++ b/gui_support/templates/load_case_template_case03.m @@ -0,0 +1,56 @@ +function config = load_case_template_case03() +%LOAD_CASE_TEMPLATE_CASE03 Build config for case 3. + +config = build_basic_case_template( ... + 'case03', ... + 'case03_multicomponent_dp_model', ... + 'Multicomponent flow with mixed single/double porosity discretization', ... + struct('modelflag', 1, 'grid_model', 2, 'flow_model', 3), ... + struct( ... + 'dx', 50 * ones(1, 20), ... + 'dy', 50 * ones(1, 10), ... + 'dz', 10 * ones(1, 1)), ... + struct('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 + }}), ... + struct('pressure', 20, 'sw', 0.2, 'cs', 0.0, 'cb', 50.0), ... + struct( ... + 'well1', {{}}, ... + '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 + ]}}, ... + 'well2', {{ + 'w1', 0, [], 0.178/2, 0, 4 + }}), ... + struct( ... + 'time', [10; 30; 200], ... + 'dtmax', [0.1; 0.5; 5], ... + 'dtmin', [0.001; 0.001; 0.001], ... + '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} + }}), ... + struct('yitap', 5, 'yitas', 0.04, 'omega', 0.5, 'Nmax', 50, 'epsave', 1e-6, 'epsmax', 1e-6)); +end diff --git a/gui_support/templates/load_case_template_case04.m b/gui_support/templates/load_case_template_case04.m new file mode 100644 index 0000000..1cb35e2 --- /dev/null +++ b/gui_support/templates/load_case_template_case04.m @@ -0,0 +1,58 @@ +function config = load_case_template_case04() +%LOAD_CASE_TEMPLATE_CASE04 Build config for case 4. + +config = build_basic_case_template( ... + 'case04', ... + 'case04_gas_water_pressure_derivative', ... + 'Gas-water flow with pressure derivative curve schedule', ... + struct('modelflag', 1, 'grid_model', 1, 'flow_model', 1), ... + struct( ... + 'dx', 50 * ones(1, 20), ... + 'dy', 50 * ones(1, 10), ... + 'dz', 10 * ones(1, 1)), ... + struct('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 + }}), ... + struct('pressure', 20, 'sw', 0.2, 'cs', 0.0, 'cb', 0.0), ... + struct( ... + 'well1', {{}}, ... + '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 + ]}}, ... + 'well2', {{ + 'w1', 0, [], 0.178/2, 0, 4 + }}), ... + struct( ... + 'time', [1e-3; 99e-3; 0.9; 100; 900], ... + 'dtmax', [2e-5; 2e-4; 2e-3; 2; 10], ... + 'dtmin', [1e-5; 1e-4; 1e-3; 1e-2; 1e-2], ... + 'well_schedules', {{ + {'w1','open','pro','const_q',10000,10000}; + {'w1','open','pro','const_q',10000,10000}; + {'w1','open','pro','const_q',10000,10000}; + {'w1','open','pro','const_q',10000,10000}; + {'w1','open','pro','const_q',10000,10000} + }}), ... + struct('yitap', 5, 'yitas', 0.04, 'omega', 0.5, 'Nmax', 50, 'epsave', 1e-6, 'epsmax', 1e-6)); +end diff --git a/gui_support/templates/load_case_template_case05.m b/gui_support/templates/load_case_template_case05.m new file mode 100644 index 0000000..b290537 --- /dev/null +++ b/gui_support/templates/load_case_template_case05.m @@ -0,0 +1,56 @@ +function config = load_case_template_case05() +%LOAD_CASE_TEMPLATE_CASE05 Build config for case 5. + +config = build_basic_case_template( ... + 'case05', ... + 'case05_oil_water_huff_and_puff', ... + 'Oil-water flow with huff-and-puff schedule', ... + struct('modelflag', 1, 'grid_model', 1, 'flow_model', 2), ... + struct( ... + 'dx', 50 * ones(1, 20), ... + 'dy', 50 * ones(1, 10), ... + 'dz', 10 * ones(1, 1)), ... + struct('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 + }}), ... + struct('pressure', 20, 'sw', 0.2, 'cs', 0.0, 'cb', 0.0), ... + struct( ... + 'well1', {{}}, ... + '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 + ]}}, ... + 'well2', {{ + 'w1', 0, [], 0.178/2, 0, 4 + }}), ... + struct( ... + 'time', [10; 30; 200], ... + 'dtmax', [0.5; 1; 5], ... + 'dtmin', [0.001; 0.001; 0.001], ... + 'well_schedules', {{ + {'w1','open','inj','const_pwf',40,40}; + {'w1','open','pro','const_q',0,0}; + {'w1','open','pro','const_pwf',10,10} + }}), ... + struct('yitap', 5, 'yitas', 0.04, 'omega', 0.5, 'Nmax', 50, 'epsave', 1e-6, 'epsmax', 1e-6)); +end diff --git a/gui_support/templates/load_case_template_case06.m b/gui_support/templates/load_case_template_case06.m new file mode 100644 index 0000000..e5b1269 --- /dev/null +++ b/gui_support/templates/load_case_template_case06.m @@ -0,0 +1,65 @@ +function config = load_case_template_case06() +%LOAD_CASE_TEMPLATE_CASE06 Build config for case 6. + +config = build_basic_case_template( ... + 'case06', ... + 'case06_oil_water_vertical_injector_frac_horizontal_producer', ... + 'Oil-water flow with vertical injectors and fractured horizontal producer', ... + struct('modelflag', 1, 'grid_model', 1, 'flow_model', 2), ... + struct( ... + 'dx', 50 * ones(1, 20), ... + 'dy', 50 * ones(1, 10), ... + 'dz', 10 * ones(1, 2)), ... + struct('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,15],90,90,0,200,10,1; + [605,255,15],90,90,0,200,10,1; + [655,255,15],90,90,0,200,10,1; + [705,255,15],90,90,0,200,10,1; + [755,255,15],90,90,0,200,10,1 + }}), ... + struct('pressure', 20, 'sw', 0.2, 'cs', 0.0, 'cb', 0.0), ... + struct( ... + 'well1', {{ + 'w1', 2, [20 10 1;20 10 2], 0.178/2, 0, 1; + 'w2', 2, [80 10 1;80 10 2], 0.178/2, 0, 1; + 'w3', 1, [20 40 1], 0.178/2, 0, 1; + 'w4', 1, [80 40 1], 0.178/2, 0, 1 + }}, ... + 'welloc', {{[ + 255,255,5; + 305,255,5; + 355,255,5; + 405,255,5; + 455,255,5; + 505,255,5; + 555,255,15; + 605,255,15; + 655,255,15; + 705,255,15; + 755,255,15 + ]}}, ... + 'well2', {{ + 'w5', 0, [], 0.178/2, 0, 4 + }}), ... + struct( ... + 'time', 200, ... + 'dtmax', 2, ... + 'dtmin', 0.001, ... + 'well_schedules', {{ + { + 'w1','open','inj','const_pwf',35,35; + 'w2','open','inj','const_pwf',35,35; + 'w3','open','inj','const_pwf',35,35; + 'w4','open','inj','const_pwf',35,35; + 'w5','open','pro','const_pwf',10,10 + } + }}), ... + struct('yitap', 5, 'yitas', 0.04, 'omega', 0.5, 'Nmax', 50, 'epsave', 1e-6, 'epsmax', 1e-6)); +end diff --git a/gui_support/templates/load_case_template_case07.m b/gui_support/templates/load_case_template_case07.m new file mode 100644 index 0000000..b501476 --- /dev/null +++ b/gui_support/templates/load_case_template_case07.m @@ -0,0 +1,73 @@ +function config = load_case_template_case07() +%LOAD_CASE_TEMPLATE_CASE07 Build config for case 7. + +config = build_basic_case_template( ... + 'case07', ... + 'case07_oil_water_multiple_fracture_regimes', ... + 'Oil-water flow with different fracture operating regimes', ... + struct('modelflag', 1, 'grid_model', 1, 'flow_model', 2), ... + struct( ... + 'dx', 50 * ones(1, 20), ... + 'dy', 50 * ones(1, 10), ... + 'dz', 10 * ones(1, 1)), ... + struct('input_content', { ... + { + [255,255,5],90,90,0,200,10,1; + [355,255,5],90,90,0,200,10,1; + [455,255,5],90,90,0,200,10,1; + [555,255,5],90,90,0,200,10,1; + [655,255,5],90,90,0,200,10,1; + [755,255,5],90,90,0,200,10,1 + }}), ... + struct('pressure', 20, 'sw', 0.2, 'cs', 0.0, 'cb', 0.0), ... + struct( ... + 'well1', {{}}, ... + 'welloc', {{[255,255,5]}, {[355,255,5]}, {[455,255,5]}, {[555,255,5]}, {[655,255,5]}, {[755,255,5]}}, ... + 'well2', {{ + 'w1_f1', 0, [], 0.178/2, 0, 4; + 'w1_f2', 0, [], 0.178/2, 0, 4; + 'w1_f3', 0, [], 0.178/2, 0, 4; + 'w1_f4', 0, [], 0.178/2, 0, 4; + 'w1_f5', 0, [], 0.178/2, 0, 4; + 'w1_f6', 0, [], 0.178/2, 0, 4 + }}), ... + struct( ... + 'time', [10; 10; 10; 200], ... + 'dtmax', [0.5; 0.5; 0.5; 1], ... + 'dtmin', [0.001; 0.001; 0.001; 0.001], ... + 'well_schedules', {{ + { + 'w1_f1','open','inj','const_pwf',40,40; + 'w1_f2','open','inj','const_pwf',40,40; + 'w1_f3','open','inj','const_pwf',40,40; + 'w1_f4','open','inj','const_pwf',40,40; + 'w1_f5','open','inj','const_pwf',40,40; + 'w1_f6','open','inj','const_pwf',40,40 + }; + { + 'w1_f1','open','pro','const_q',0,0; + 'w1_f2','open','inj','const_pwf',40,40; + 'w1_f3','open','pro','const_q',0,0; + 'w1_f4','open','inj','const_pwf',40,40; + 'w1_f5','open','pro','const_q',0,0; + 'w1_f6','open','inj','const_pwf',40,40 + }; + { + 'w1_f1','open','pro','const_pwf',10,10; + 'w1_f2','open','pro','const_q',0,0; + 'w1_f3','open','pro','const_pwf',10,10; + 'w1_f4','open','pro','const_q',0,0; + 'w1_f5','open','pro','const_pwf',10,10; + 'w1_f6','open','pro','const_q',0,0 + }; + { + 'w1_f1','open','pro','const_pwf',10,10; + 'w1_f2','open','pro','const_pwf',10,10; + 'w1_f3','open','pro','const_pwf',10,10; + 'w1_f4','open','pro','const_pwf',10,10; + 'w1_f5','open','pro','const_pwf',10,10; + 'w1_f6','open','pro','const_pwf',10,10 + } + }}), ... + struct('yitap', 5, 'yitas', 0.04, 'omega', 0.5, 'Nmax', 50, 'epsave', 1e-6, 'epsmax', 1e-6)); +end