Code covered by the BSD License  

Highlights from
Double porosity model

image thumbnail
from Double porosity model by Jan Valdman
Finite element solution of the double porosity model and its a posteriori error estimate

start.m
clear all
%format long

%fluid parameters
k1=1; k2=4; kappa=10;

%exact solution used for generation of right-hand sides h1 and h2 later
l1=2; %reference solution is: p1=sin(l1*pi*x)*sin(l1*pi*y)
l2=3; %reference solution is: p2=sin(l2*pi*x)*sin(l2*pi*y)

%maximal uniform refinement level
levels=5; %9; %maximum level for 2Gb memory

%Fridrichs' constant for H1_0 space on the unit square
%C_omega_exact=sqrt(1/(2*pi*pi)); %exact value for convergence comparison

%coarse mesh of the unit square
coordinates=[0 0; 1 0; 0 1; 1 1];
elements=[1 2 4; 1 4 3];  
dirichlet=[1 2; 2 4; 4 3; 3 1];
neumann=[];

%computation of double porosity problem on nested meshes
for level=1:levels
    fprintf('level=%d',level); 
    %uniform refinement   
    [element2edges, edge2nodes]=getEdges(elements);    
    nodes2edge=sparse(edge2nodes(:,1),edge2nodes(:,2),1:size(edge2nodes,1),size(coordinates,1),size(coordinates,1));
    nodes2edge=symetrizeMatrix(nodes2edge);
    %edge2elements=entryInWhichRows(element2edges); 
    [coordinates,elements,dirichlet,neumann]=refinement_uniform(coordinates,elements,dirichlet,neumann,nodes2edge);         
    number_elements=size(elements,1); 
    number_coordinates=size(coordinates,1);
    
    %stifness and mass matrices generation
    Xscalar=kron(ones(1,3),elements); Yscalar=kron(elements,ones(1,3)); Zscalar=zeros(size(Xscalar));
    areas=zeros(number_elements,1);   
    for j = 1:number_elements
        I=elements(j,:); 
        verticesTrans=coordinates(I,:)'; 
        area=det([1 1 1; verticesTrans])/2; areas(j)=area;
        PhiGrad = [1 1 1; verticesTrans]\[0 0; 1 0; 0 1];        
        Alocal = area * PhiGrad * PhiGrad'; 
        Zscalar(j,:)=reshape(Alocal,1,9); 
    end
    Zmassmatrix=kron(areas,reshape((ones(3)+eye(3))/12,1,9));
    STIF=sparse(Xscalar,Yscalar,Zscalar); 
    MASS=sparse(Xscalar,Yscalar,Zmassmatrix);
    
    all_nodes=(1:number_coordinates)';
    dirichlet_nodes=unique(dirichlet);
    free_nodes=setdiff(all_nodes,dirichlet_nodes); %internal + pure Neumann nodes 
    free_nodes2D=[free_nodes;free_nodes+number_coordinates];
    
    %system matrix 
    A=[k1*STIF+kappa*MASS -kappa*MASS; -kappa*MASS k2*STIF+kappa*MASS]; 
    
    %right hand side 
    p1_exact=sin(coordinates(:,1)*pi*l1).*sin(coordinates(:,2)*pi*l1);
    p2_exact=sin(coordinates(:,1)*pi*l2).*sin(coordinates(:,2)*pi*l2);
    h1=2*k1*pi^2*l1^2*p1_exact+kappa*(p1_exact-p2_exact);
    h2=2*k2*pi^2*l2^2*p2_exact+kappa*(p2_exact-p1_exact);
    b=[MASS*h1; MASS*h2];
    
    %solution of homegeneous Dirichlet problem
    p=b*0;
    p(free_nodes2D)=A(free_nodes2D,free_nodes2D)\b(free_nodes2D);
    p1=p(1:number_coordinates); 
    p2=p(number_coordinates+1:end);
    
    %approximation error in a problem related norm
    error=sqrt(k1*(p1-p1_exact)'*STIF*(p1-p1_exact)+k2*(p2-p2_exact)'*STIF*(p2-p2_exact)...
          +kappa*(p1-p1_exact)'*MASS*(p1-p1_exact)+kappa*(p2-p2_exact)'*MASS*(p2-p2_exact)...
          -2*kappa*(p1-p1_exact)'*MASS*(p2-p2_exact));
    fprintf(', approx. error=%f',error);  
    
    %functional majorant (not finished!)
    dual_F=kappa*(p1'*MASS*p1+p2'*MASS*p2-2*p1'*MASS*p2)/2 -h1'*MASS*p1-h2'*MASS*p2; %not complete 
    dual_G=k1*p1'*STIF*p1+k2*p2'*STIF*p2; %not complete 
    majorant=dual_F+dual_G;
    fprintf(', majorant (only part)=%f',majorant);  
    
    fprintf(', dof=%d \n',2*size(coordinates,1));  
    
    %visualization
    figure(1);
    subplot(2,1,1);
    show_piecewise_linear(p1(elements),elements,coordinates);title('pressure p_1');
    subplot(2,1,2);
    show_piecewise_linear(p2(elements),elements,coordinates);title('pressure p_2');
    
    %subplot(2,2,3);
    %show_piecewise_linear(h1(elements),elements,coordinates);title('right-hand side p1');
    %subplot(2,2,4);
    %show_piecewise_linear(h2(elements),elements,coordinates);title('right-hand side p2');
    
end







Contact us at files@mathworks.com