MATLAB code: Explicit finite difference method for phase-field dendritic growth model

Date:

%Main code

time0 = clock();

format long;

Nx = 300;

Ny = 300;

NxNy = Nx * Ny;

dx = 0.03;

dy = 0.03;

nstep = 3500;

nprint = 50;

dtime = 1.0e-4;

tau = 0.0003;

epsilonb = 0.01;

kappa = 1.8;

delta = 0.02;

aniso = 6.0;

alpha = 0.9;

gamma = 10.0;

teq = 1.0;

theta0 = 0.3;

seed = 10.0;

phi = zeros(Nx, Ny);

tempr = zeros(Nx, Ny);

for i = 1:Nx for j = 1:Ny

     if ((i - 150)^2 + (j - 150)^2 < seed )
     
        phi(i, j) = 1.0;
        
    end

end end

X = 0:0.03:9 - 0.03;

Y = 0:0.03:9 - 0.03;

Z = zeros(300, 300);

for istep = 1:nstep

%----
% compute the laplacians and epsilon:
%---

for i = 1:Nx

    for j = 1:Ny
    
        jp = j + 1;
        
        jm = j - 1;

        ip = i + 1;
        
        im = i - 1;

        if (im == 0)
        
            im = Nx;
            
        end

        if (ip == (Nx + 1))
        
            ip = 1;
            
        end

        if (jm == 0)
        
            jm = Ny;
            
        end

        if (jp == (Ny + 1))
        
            jp = 1;
            
        end

        hne = phi(ip, j);
        
        hnw = phi(im, j);
        
        hns = phi(i, jm);
        
        hnn = phi(i, jp);
        
        hnc = phi(i, j);

        lap_phi(i, j) = (hnw + hne + hns + hnn -4.0 * hnc) / (dx * dy);

        hne = tempr(ip, j);
        
        hnw = tempr(im, j);
        
        hns = tempr(i, jm);
        
        hnn = tempr(i, jp);
        
        hnc = tempr(i, j);

        lap_tempr(i, j) = (hnw + hne + hns + hnn -4.0 * hnc) / (dx * dy);

        phidx(i, j) = (phi(ip, j) - phi(im, j)) / (2.0 * dx);
        
        phidy(i, j) = (phi(i, jp) - phi(i, jm)) / (2.0 * dy);
        
        theta = atan2(phidy(i, j), phidx(i, j));

        epsilon(i, j) = epsilonb * (1.0 + delta * cos(aniso * (theta - theta0)));

        epsilon_deriv(i, j) = -epsilonb * aniso * delta * sin(aniso * (theta - theta0));

    end %for j

end %for i

for i = 1:Nx

    for j = 1:Ny

        jp = j + 1;
        
        jm = j - 1;

        ip = i + 1;
        
        im = i - 1;

        if (im == 0)
        
            im = Nx;
            
        end

        if (ip == (Nx + 1))
        
            ip = 1;
            
        end

        if (jm == 0)
        
            jm = Ny;
            
        end

        if (jp == (Ny + 1))
        
            jp = 1;
            
        end

        phiold = phi(i, j);

        %-- first term:

        term1 = (epsilon(i, jp) * epsilon_deriv(i, jp) * phidx(i, jp) - ...
        
            epsilon(i, jm) * epsilon_deriv(i, jm) * phidx(i, jm)) / (2.0 * dy);

        %-- second term:

        term2 = -(epsilon(ip, j) * epsilon_deriv(ip, j) * phidy(ip, j) - ...
        
            epsilon(im, j) * epsilon_deriv(im, j) * phidy(im, j)) / (2.0 * dx);

        %-- factor m:
        
        m = alpha / pi * atan(gamma * (teq - tempr(i, j)));
        
        %-- Time integration:

        phi(i, j) = phi(i, j) +(dtime / tau) * (term1 + term2 + epsilon(i, j)^2 * lap_phi(i, j) + ...
        
            phiold * (1.0 - phiold) * (phiold -0.5 + m));

        if (phi(i, j) < 10^ - 30)
        
            phi(i, j) = 10^ - 30;
            
        end

        if (phi(i, j) > 10^30)
        
            phi(i, j) = 10^30;
            
        end

        Z(i, j) = phi(i, j);
        
        %-- evolve temperature:

        tempr(i, j) = tempr(i, j) +dtime * lap_tempr(i, j) + kappa * (phi(i, j) - phiold);

        if (tempr(i, j) < 10^ - 30)
        
            tempr(i, j) = 10^ - 30;
            
        end

        if (tempr(i, j) > 10^30)
        
            tempr(i, j) = 10^30;
            
        end

    end

end

if (mod(istep, nprint) == 0)
    
figure(1);  

surf(X,Y,Z);

shading interp

colormap jet;

axis image;

view(0,90);

    M(istep) = getframe;
    
end %if

end %istep

compute_time = etime(clock(), time0);

function [phi,tempr] = nucleus(Nx,Ny,seed)

format long;

phi = zeros(Nx,Ny);

tempr = zeros(Nx,Ny);

for i=1:Nx

for j=1:Ny

if ((i-Nx/2)^2+(j-Ny/2)^2 < seed)

phi(i,j) = 1.0;

end

end

end

end %endfunction

function [phi,tempr] = nucleus(Nx,Ny,seed)

format long;

phi = zeros(Nx,Ny);

tempr = zeros(Nx,Ny);

for i=1:Nx

for j=1:Ny

if ((i-Nx/8)^2+(j-Ny/2)^2 < seed)

phi(i,j) = 1.0;

end

if ((i-2*Nx/8)^2+(j-Ny/2)^2 < seed)

phi(i,j) = 1.0;

end

if ((i-3*Nx/8)^2+(j-Ny/2)^2 < seed)

phi(i,j) = 1.0;

end

if ((i-4*Nx/8)^2+(j-Ny/2)^2 < seed)

phi(i,j) = 1.0;

end

if ((i-5*Nx/8)^2+(j-Ny/2)^2 < seed)

phi(i,j) = 1.0;

end

if ((i-6*Nx/8)^2+(j-Ny/2)^2 < seed)

phi(i,j) = 1.0;

end

if ((i-7*Nx/8)^2+(j-Ny/2)^2 < seed)

phi(i,j) = 1.0;

end

if ((i-8*Nx/8)^2+(j-Ny/2)^2 < seed)

phi(i,j) = 1.0;

end

end

end

end %endfunction