rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
Interface.m
1 classdef Interface
2 
3  methods
4 
5  function diff = Phi(this, glob, S, model)
6 
7  max_S = max(S(:));
8 % S_sorted = sort(S(:));
9 
10  if ~isfield(model, 'h')
11  h = 1e-6; %max(min(abs(S_sorted(2:end) - S_sorted(1:end-1))), 1e-3);
12  else
13  h = model.h;
14  end
15 
16  intrange = 0:h:max_S;
17  intlength = length(intrange)-1;
18  int_args = phi(this, [], intrange, model);
19  if isnan(int_args.K(1))
20  int_args.K(1) = 0;
21  end
22 
23  ints = cumsum(int_args.K .* [1, ones(1, intlength)*h]);
24  S_indices = floor(S/h)+1;
25 
26  diff.K = ints(S_indices);
27  diff.epsilon = max(diff.K);
28  end
29 
30  function diff = phi(this, glob, S, model)
31  % function diff = phi(this, glob, S, model)
32  % returns the function `\phi(s)`.
33  %
34  kw = water_permeability(this, glob, S, model);
35 
36  ko = oil_permeability(this, glob, S, model);
37 
38  pc_derivative = capillary_pressure_derivative(this, glob, S, model);
39 
40  diff.K = kw .* ko ./ (kw + ko) .* pc_derivative;
41  diff.epsilon = max(diff.K);
42  end
43 
44  function ddiff = phi_derivative(this, glob, S, model)
45  % function ddiff = phi_derivative(this, glob, S, model)
46  % returns the derivative `\phi'(s)`.
47  kw = water_permeability(this, glob, S, model);
48 
49  dkw = water_permeability_derivative(this, glob, S, model);
50 
51  ko = oil_permeability(this, glob, S, model);
52 
53  dko = oil_permeability_derivative(this, glob, S, model);
54 
55  pc_derivative = capillary_pressure_derivative(this, glob, S, model);
56 
57  pc_sec_derivative = capillary_pressure_second_derivative(this, glob, S, model);
58 
59  oben = ko .* kw .* pc_derivative;
60 
61  oben_der = dko .* kw .* pc_derivative + ko .* dkw .* pc_derivative + ko .* kw .* pc_sec_derivative;
62 
63  unten = kw + ko;
64 
65  unten_der = dkw + dko;
66 
67  nominator = (oben_der .* unten - unten_der .* oben);
68  denominator = unten .* unten;
69  denominator(nominator == 0) = 1;
70  ddiff.K = nominator ./ denominator;
71  assert(all(~isinf(ddiff.K)));
72  assert(all(~isnan(ddiff.K)));
73  ddiff.epsilon = max(ddiff.K);
74  end
75 
76  function fw = waterflow(this, glob, S, model)
77  % function fw = waterflow(this, glob, S, model)
78 
79  kw = water_permeability(this, glob, S, model);
80 
81  ko = oil_permeability(this, glob, S, model);
82 
83  fw = kw./(kw + ko);
84  end
85 
86  function dfw = waterflow_derivative(this, glob, S, model)
87  % function dfw = waterflow_derivative(this, glob, S, model)
88 
89  kw = water_permeability(this, glob, S, model);
90 
91  dkw = water_permeability_derivative(this, glob, S, model);
92 
93  ko = oil_permeability(this, glob, S, model);
94 
95  dko = oil_permeability_derivative(this, glob, S, model);
96 
97  unten = kw + ko;
98 
99  unten_der = dkw + dko;
100 
101  dfw = (dkw .* unten - unten_der .* kw) ./ (unten .* unten);
102 
103  end
104 
105  function fwU = waterflow_flux(this, glob, S, U, model)
106  % function fwU = waterflow_flux(this, glob, S, U, model)
107  % returns the waterflow flux over the boundaries `f_w(s) \cdot \underscore{u}`.
108 
109  kw = water_permeability(this, glob, S, model);
110 
111  assert(size(U) == [size(kw, 1), 2]);
112  ko = oil_permeability(this, glob, S, model);
113  scalar = kw./(kw + ko);
114 
115  fwU = [ scalar, scalar ] .* U;
116 
117  end
118 
119  function fw_deriv_U = waterflow_deriv_flux(this, glob, S, U, model)
120  % function fwU = waterflow_deriv_flux(this, glob, S, model)
121  % returns the waterflow flux over the boundaries, actually only `\underscore{u}`.
122 
123  fw_deriv_U = U;
124 
125  end
126 
127  function m = total_mobility(this, glob, S, model)
128  % function m = total_mobility(this, glob, S, model)
129 
130  kw = water_permeability(this, glob, S, model);
131  ko = oil_permeability(this, glob, S, model);
132  m.K = kw + ko;
133  m.epsilon = max(m.K);
134 
135  end
136 
137  function m = total_mobility_deriv(this, glob, S, model)
138  % function m = total_mobility(this, glob, S, model)
139 
140  dkw = water_permeability_derivative(this, glob, S, model);
141  dko = oil_permeability_derivative(this, glob, S, model);
142  m.K = dkw + dko;
143  m.epsilon = max(m.K);
144 
145  end
146 
147 
148  function m = total_mobility_dual(this, glob, S, NBI, Sdir, dir_NBI, model)
149  % function m = total_mobility_dual(this, glob, S, NBI, Sdir, dir_NBI, model)
150 
151  mob = total_mobility(this, glob, S, model);
152  mobn = mob(NBI);
153  mob = repmat(mob, 4, 1);
154 
155  assert(size(mob) == size(mobn));
157  m = 1 ./ ( (2 ./ mob) + (2 ./ mobn) );
158  end
159 
160  function p = visualize(this)
161  Stest = 0:0.01:1;
162 
163  descr = [];
164  descr = default_descr(this, descr);
165 
166  glob = [];
167 
168  kw = water_permeability(this, glob, Stest, descr);
169  ko = oil_permeability(this, glob, Stest, descr);
170  pc = capillary_pressure(this, glob, Stest, descr);
171  dpc = capillary_pressure_derivative(this, glob, Stest, descr);
172  ph = phi(this, glob, Stest, descr);
173  Ph = Phi(this, glob, Stest, descr);
174 
175  fw = waterflow(this, glob, Stest, descr);
176  m = total_mobility(this, glob, Stest, descr);
177 
178  p = figure;
179 
180  subplot(2,3,1); plot(Stest, kw, Stest, ko); title('kw, ko');
181  sp=subplot(2,3,2); plot(Stest, pc); set(sp, 'YScale', 'log'); title('p_c');
182  sp=subplot(2,3,3); plot(Stest, dpc); set(sp, 'YScale', 'log'); title('p_c''');
183  subplot(2,3,4); plot(Stest, ph.K, Stest, Ph.K); title('\phi, \Phi');
184  subplot(2,3,5); plot(Stest, fw); title('f');
185  subplot(2,3,6); plot(Stest, m.K); title('M');
186  end
187 
188  end
189 
190  methods (Abstract)
191 
192  kw = water_permeability(this, glob, S, model);
193 
194  dkw = water_permeability_derivative(this, glob, S, model);
195 
196  ko = oil_permeability(this, glob, S, model);
197 
198  dko = oil_permeability_derivative(this, glob, S, model);
199 
200  pc = capillary_pressure(this, glob, S, model);
201 
202  dpc = capillary_pressure_derivative(this, glob, S, model);
203 
204  ddpc = capillary_pressure_second_derivative(this, glob, S, model);
205 
206  c = injection_concentration(this, glob, model);
207 
208  s_under = lower_source(this, elemin, loc, grid);
209 
210  s_above = upper_source(this, elemin, loc, grid);
211 
212  descr = default_descr(this, descr);
213 
214  end
215 
216 
217 end