rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
GlobalSpace.m
1 classdef GlobalSpace < ILocalizedOperator
2 
3  properties(Constant)
4  id = 'L_global';
5 
6  ret_vars = {'saturation', 'velocity', 'pressure'};
7  arg_vars = {'saturation', 'velocity', 'pressure'};
8  arg_vars_short = {'S', 'U', 'P'};
9  end
10 
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;
16  end
17 
18  methods
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;
25 
26  if nargout == 2
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, []);
31  elseif nargout > 2
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, []);
36  end
37 
38  INC = [INCS; INCU; INCP; INCM];
39  INCoff = [INCSoff; INCUoff; INCPoff; INCMoff];
40 
41  if nargout > 2
42  J = [JS;
43  JU;
44  JP;
45  JM];
46  end
47  end
48 
49 
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;
53  else
54  ret_size = length(NU_ind)+1;
55  end
56  end
57 
58  function arg_size = arg_size(this, model_data)
59  arg_size = 2 * model_data.grid.nelements + model_data.gn_edges;
60  end
61 
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];
69  end
70 
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;
74 
75  TMS = TM(TM<=Uoff);
76  TMU = TM(TM>Uoff & TM<Poff)-Uoff;
77  TMP = TM(TM>Poff) - Poff;
78 
79  [nmdS, eindS, eindS_local] = ILocalizedOperator.compute_TM_global_edge(model_data, TMS);
80  eindU = Fv.TwoPhase.VelocitySpace.compute_TM
81  eindP = ILocalizedOperator.compute_TM_global_edge(model_data, TMP)+Poff;
82  end
83 
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));
88  end
89 
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);
94  end
95 
96  end
97 
98 end
99 
Interface for a localized operator that fulfills the so-called -independent DOF dependence.