6 ret_vars = {
'saturation',
'velocity',
'pressure'};
7 arg_vars = {
'saturation',
'velocity',
'pressure'};
8 arg_vars_short = {
'S',
'U',
'P'};
11 properties(Access=
private)
12 prs_op =
Fv.TwoPhase.PressureMean;
13 div_op =
Fv.TwoPhase.DivergenceSpace;
14 sat_op =
Fv.TwoPhase.SaturationSpace;
15 vel_op =
Fv.TwoPhase.VelocitySpace;
19 function [INC, INCoff, J] = apply(this, model, model_data, sim_data, NU_ind)
20 Uoff = model_data.grid.nelements;
21 Poff = Uoff + model_data.gn_edges;
22 NU_indS = NU_ind(NU_ind<=Uoff);
23 NU_indU = NU_ind(NU_ind>Uoff & NU_ind<=Poff) - Uoff;
24 NU_indP = NU_ind(NU_ind>Poff) - Poff;
27 [INCS, INCSoff] = sat_op.apply(this, model, model_data, sim_data, NU_indS);
28 [INCU, INCUoff] = vel_op.apply(this, model, model_data, sim_data, NU_indU);
29 [INCP, INCPoff] = div_op.apply(this, model, model_data, sim_data, NU_indP);
30 [INCM, INCMoff] = prs_op.apply(this, model, model_data, sim_data, []);
32 [INCS, INCSoff, JS] = sat_op.apply(this, model, model_data, sim_data, NU_indS);
33 [INCU, INCUoff, JU] = vel_op.apply(this, model, model_data, sim_data, NU_indU);
34 [INCP, INCPoff, JP] = div_op.apply(this, model, model_data, sim_data, NU_indP);
35 [INCM, INCMoff, JM] = prs_op.apply(this, model, model_data, sim_data, []);
38 INC = [INCS; INCU; INCP; INCM];
39 INCoff = [INCSoff; INCUoff; INCPoff; INCMoff];
50 function ret_size = ret_size(this, model_data, NU_ind)
51 if nargin == 2 || isempty(NU_ind)
52 ret_size = 2*ret_size + model_data.gn_edges +1;
54 ret_size = length(NU_ind)+1;
58 function arg_size = arg_size(this, model_data)
59 arg_size = 2 * model_data.grid.nelements + model_data.gn_edges;
62 function ipm = inner_product_matrix(this, model_data)
63 nT = size(model_data.WT);
64 nE = size(model_data.WE);
65 ipm = [model_data.WT; sparse(nT(1),nE(2)+nT(2)+1);
66 sparse(nE(1),nT(2)), model_data.WE, sparse(nE(1),nT(2)+1);
67 sparse(nT(1),nT(2)+nE(2)), model_data.WT, sparse(nT(1),1);
68 sparse(1, nT(2)*2+nE(2)), 1];
71 function [nmd, eind, eind_local] = compute_TM_global(this, model_data, TM)
72 Uoff = model_data.grid.nelements;
73 Poff = Uoff + model_data.gn_edges;
76 TMU = TM(TM>Uoff & TM<Poff)-Uoff;
77 TMP = TM(TM>Poff) - Poff;
79 [nmdS, eindS, eindS_local] =
ILocalizedOperator.compute_TM_global_edge(model_data, TMS);
80 eindU =
Fv.TwoPhase.VelocitySpace.compute_TM
84 function opdata = fill_opdata(this, rmodel, detailed_data)
85 MM = get_by_description(rmodel.M, 'L_global');
86 opdata.S_lower = detailed_data.model_data.opdata.S_lower(detailed_data.TM(1:MM));
87 opdata.S_upper = detailed_data.model_data.opdata.S_upper(detailed_data.TM(1:MM));
90 function opdata = copy_extract_opdata(this, opdata_copy, rmodel,
id)
91 MM = get_by_description(rmodel.M,
id);
92 opdata.S_lower = opdata_copy.S_lower(1:MM);
93 opdata.S_upper = opdata_copy.S_upper(1:MM);
Interface for a localized operator that fulfills the so-called -independent DOF dependence.