rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
fv_two_phase_imp.m
1 function [INC, J] = fv_two_phase_imp(model, model_data, S, CU, NU_ind)
2 %function INC = fv_two_phase_imp(model, model_data, S, CU, NU_ind)
3 
4  grid = model_data.grid;
5 
6  if nargin <= 4 || isempty(NU_ind)
7  NU_ind = cell(1,3);
8  NU_ind{1} = (1:grid.nelements)';
9  NU_ind{2} = (1:model_data.gn_edges)';
10  NU_ind{3} = (1:grid.nelements)';
11  end
12 
13  Slength = grid.nelements;
14  Ulength = model_data.gn_edges;
15  U = CU(1:Ulength);
16  P = CU(Ulength+1:end);
17 
18  % model.diffusivity_ptr = @(glob, U, model) struct('K', 1, 'epsilon', 0);%model.two_phase.phi(glob, U, model);
19  % model.diffusivity_derivative_ptr = @(glob, U, model) struct('K', 0, 'epsilon', 0);%model.two_phase.phi_derivative(glob, U, model);
20  % model.laplacian_ptr = @(glob, U, model) -getfield(model.two_phase.Phi(glob, U, model), 'K')';
21  % model.laplacian_derivative_ptr = @(glob, U, model) -getfield(model.two_phase.phi(glob, U, model), 'K');
22 
23  num_diff_flux_u = fv_num_diff_flux_pressure_gradient(model, model_data, P, S, NU_ind{3}, NU_ind{1});
24 
25  tmppar.local_mass_matrix = @fv_local_mass_matrix_rect;
26  tmppar.element_quadrature = @cubequadrature;
27  tmppar.evaluate_basis = @fv_evaluate_basis;
28  tmppar.pdeg = 0;
29  S_upper = grid.A(NU_ind{1}).*l2project(@(elemin, loc, grid) model.two_phase.upper_source(elemin, loc, grid), 2, model_data.grid, tmppar);
30  S_lower = grid.A(NU_ind{1}).*l2project(@(elemin, loc, grid) model.two_phase.lower_source(elemin, loc, grid), 2, model_data.grid, tmppar);
31 
32 % S_upper = grid.A(NU_ind{1}) .* model.two_phase.upper_source([grid.CX(NU_ind{1}), grid.CY(NU_ind{1})], model);
33 % S_lower = grid.A(NU_ind{1}) .* model.two_phase.lower_source([grid.CX(NU_ind{1}), grid.CY(NU_ind{1})], model);
34 
35  INC = zeros(Slength+Ulength+1, 1);
36 
37  UKL = -num_diff_flux_u.G(NU_ind{2});
38 
39  INC(1:Ulength) = UKL - U;
40 
41  % eventuell + S_upper - S_lower
42  INC(Ulength+1:end-1) = sum(U(model_data.gEI).*(grid.NX+grid.NY), 2) ...
43  - S_upper + S_lower;
44 
45  INC(end) = P(1);
46 % INC(end) = sum(grid.A(NU_ind{3}, :) .* P);
47 
48  if nargout > 1
49 
50  u_diff_p_s = fv_frechet_operators_diff_flux_pressure_gradient(model, model_data, P, S, NU_ind{3}, NU_ind{1});
51 
52  n = Slength+Ulength+1;
53  m = Slength+Ulength;
54 
55  sp2 = -sparse(u_diff_p_s.pi, u_diff_p_s.pj+Ulength, u_diff_p_s.pvals, n, m);
56 
57  sp3i = repmat(1:Slength, 1, 4)+Ulength;
58  sp3j = model_data.gEI(:);
59  sp3vals = grid.NX+grid.NY;
60  sp3 = sparse(sp3i,sp3j,sp3vals, n, m);
61 
62  sp4 = sparse(Slength+Ulength+1, Ulength+1, 1, n, m);
63 % sp4 = sparse(Slength+Ulength+1*ones(1,Slength), Ulength+1:Slength+Ulength, grid.A(:), n, m);
64 
65  sp5 = sparse((1:Ulength), (1:Ulength), -1, n,m);
66 
67  J = sp2 + sp3 + sp4 + sp5;
68  J(isnan(J)) = 0;
69  end
70 
71 end
function spm = fv_frechet_operators_diff_flux_pressure_gradient(model, model_data, P, S, NU_ind)
computes a jacobian of implicit non-linear convective contributions to time evolution matrices at a p...
function res = cubequadrature(poldeg, func, varargin)
integration of function func over reference cube == unit cube. by Gaussian quadrature exactly integra...
function num_flux_mat = fv_num_diff_flux_pressure_gradient(model, model_data, P, S)
computes a numerical diffusive flux for a diffusion problem