Documentos de Académico
Documentos de Profesional
Documentos de Cultura
%% Condiciones de frontera
%%%%%%%%%%%%%%%%%%%%%%%%%
%% Flujo a traves de las fronteras este, oeste y abajo.
% q_d es negtivo a causa de que el calor fluye hacia espesores
% decrecientes.
q_d_0 = -0.50; % W m^-2
q_e_0 = 0.0; % W m^-2
%% q_w_0 = -0.50; % W m^-2
q_w_0 = 0.0; % W m^-2
%
% This code sets of simple steady B.C.s
% put "interesting" transient B.C.s into these matrices
q_d = repmat( q_d_0, nt, nx );
q_w = repmat( q_w_0, nz, nt );
q_e = repmat( q_e_0, nz, nt );
%
%
%% Temperatura phi_u en la frontera superior
% -------------------------------------
phi_u_0 = -20; % deg C
%
% Temperatura superficial cosntante y uniforme
%% phi_u = repmat( phi_u_0, nt, nx );
%
% No estacionario pero uniforme espacialmente
phi_range = 5;
time_vec = dt_yr * (0:(nt-1));
phi_seasonal = phi_u_0 + phi_range * sin( 2*pi * time_vec );
phi_u = repmat( phi_seasonal', 1, nx );
%
%
%% Parametros del material
%%%%%%%%%%%%%%%%%%%%%%%
% Establecer la matriz de propiedades trmicas. (Ejemplo: conductividad
uniforme)
K_0 = 2.0; % W m^-1 deg^-1
K_P = repmat( K_0, size(X_P) );
%
%
% Establecer la matriz de densidad. (Ejemplo: Uniforme en el dominio)
rho_0 = 900; % kg m^-3 (e.g. ice)
rho_P = repmat( rho_0, size(X_P) );
%
%
% Establecer el calor especfico. (Ejemplo: Uniforme en el dominio)
c_0 = 2000; % J kg^-1 deg^-1
c_P = repmat( c_0, size(X_P) );
%
%
% Establecer una matriz Gamma genrica. -Para flujo de calor Gamma=K/c.
%% Gamma_P = K_P./c_P;
rho_c_P = rho_P.* c_P;
%
%% Trmino de fuente
%%%%%%%%%%%%%%%%%%%%%
% S = S_C + S_P * phi_P
% Condiciones iniciales
% -----------------
%% phi_0 = zeros( size(X_P) );
%% phi_0 = repmat( phi_u, nz,1 )...
%% - [ Z_P(1,:)' cumsum(diff(Z_P))']'.* repmat(q_d, nz,1)./ K_P;
%
% Por ejemplo, establecer el valor inicial constante, igual a la
condicion de frontera en la frontera superior.
phi_0 = repmat( phi_u(1,:), nz, 1 );
%
% Resolver para phi(x,z,t) en volmenes finitos
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
phi = fvm_discretizacion( X_edges, Z_edges, X_P, Z_P, ...
nt, dt, rho_c_P, K_P, S_C, S_P,
...
phi_0, phi_u, q_d, q_e, q_w );
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%
%
dt %#ok<NOPRT>
rho_c_dz_2_over_2K = rho_c_P(1,1)*(Z_P(2,1)-Z_P(1,1)).^2/(2 * K_P(1,1))
%#ok<NOPRT,NASGU>
%% Graficacion de resultados
%
% Graficar conductividad (K_z)
% -----------------------
figure(1)
hold on; grid on; box on
surf(X_P, Z_P, K_P )
colorbar
zlabel('Conductividad (W m^{-1} deg^{-1})')
xlabel('Profundidad (m)')
title('Conductividad K_P')
% theta = 1 implicito
% theta =0.5 Crank-Nicolson
% theta = 0 explicito
% ------------------------------------------
theta = 1;
%% Inicializacin
% Geometra
% --------
%
% Obtener dX, dZ - espaciado entre los bordes del volumen finito
% -------------------------------------------------
dX = diff(X_edges')';
dZ = diff(Z_edges);
%
%
% Obtener dX_E, dx_W, dZ_U, dZ_D -
% - Distancias a los centros de volumenes adyacentes
% -----------------------------------------------
dX_e = diff(X_P')';
% Agregar la fila fictica en el borde este para mantener el tamao
[nx, nz]
dX_e = [ dX_e dX_e(:,end) ];
%
dX_w = diff(X_P')';
% Agregar la fila ficticia en el borde oeste para mantener el tamao
[nz, nx]
dX_w = [ dX_w(:,1) dX_w ];
%
dZ_u = diff(Z_P);
% Agregar la fila ficticia en el borde superior para mantener el tamao
[nz, nx]
dZ_u = [ dZ_u(1,:)' dZ_u' ]';
%
dZ_d = diff(Z_P);
% Agregar la fila ficticia en el borde inferior para mantener el tamao
[nz, nx]
dZ_d = [ dZ_d' dZ_d(end,:)' ]';
%
%
% Obtener f_e, f_w, f_u, f_d
% - distancias fraccionadas entre la interfaz del volumen y los
centros de volumenes adyacentes.
%
% ---------------------------------------------------
f_e = ones(size(X_P)) - (X_edges(:,2:end) - X_P)./ dX_e;
%
f_w = ones(size(X_P)) - (X_P - X_edges(:,1:(end-1)) )./ dX_w;
%
f_u = ones(size(Z_P)) - (Z_P - Z_edges(1:(end-1),: ))./ dZ_u;
%
f_d = ones(size(Z_P)) - (Z_edges(2:end,: ) - Z_P)./ dZ_d;
%
% Conductividades
%%%%%%%%%%%%%%%%%%%
% Si K = K(t), entonces las conductividades necesitan ser calculadas
dentro de los bucles de pasos temporales
%
% Establecer las matrices para conductividades en volumenes adyacentes.
% ------------------------------------------------------
K_E = [ K_P(:,2:end) K_P(:, end) ];
K_W = [ K_P(:,1) K_P(:,1:end-1) ];
K_U = [ K_P(1,:)' K_P(1:end-1,:)' ]';
K_D = [ K_P(2:end,:)' K_P(end,:)' ]';
%
%
% Establecer las matrices de conductividad en la interfaz
% ---------------------------------------
K_e = 1./ ( (1 - f_e)./K_P + f_e./K_E );
K_w = 1./ ( (1 - f_w)./K_P + f_w./K_W );
K_u = 1./ ( (1 - f_u)./K_P + f_u./K_U );
K_d = 1./ ( (1 - f_d)./K_P + f_d./K_D );
%
%
% Establecer los coeficientes en los puntos adyacentes.
% ---------------------------------------
% Si rho_c = rho_c(t), entonces a_P_0 necesita ser calculada dentro de
los bucles de pasos temporales
%
%
% Graficar la solucin actual
figure(5)
surf( X_P, Z_P, phi_0 )
colorbar
set(gca,'zlim', [ min(min(phi_u)), 0 ] )
xlabel('Distancia (m)')
ylabel('Profundidad (m)')
zlabel('Temperatura (^oC)')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% EL bucle de pasos temporal empieza aqui
% (Las condiciones de frontera pueden depender del tiempo)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
for i_time=1:nt
%
% Frontera superior - specified phi = phi_u(t)
% =========================================
a_P(1,:) = 1;
b(1,:) = phi_u(i_time,:);
a_U(1,:) = 0;
a_E(1,:) = 0;
a_W(1,:) = 0;
a_D(1,:) = 0;
%
% Llamar al resolverdor implicito
end
end
function phi = resolver( a_E, a_W, a_U, a_D, a_P, b )
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Matriz de solucion para phi_P en los puntos P_ij
%% a_P = coeficiente de phi_P en el punto P_ij
%% a_E = coeficiente de phi_E en el punto este de P_ij, i.e. (i,j+1)
%% a_W = coeficiente de phi_W en el punto oeste de P_ij, i.e. (i,j-
1)
%% a_U = coeficiente de phi_U en el punto encima de P_ij, i.e. (i-
1,j)
%% a_D = coeficiente de phi_D en el punto debajo de P_ij, i.e. (i+1,j)
%%
%% Sistema de ecuaciones para resolver phi
%%
%% big_A * phi = rhs
%%
%% big_A = matriz con diagonales -a_P, a_E etc,
%% phi = solucion desconocida en los puntos P de la grilla
%% rhs = vector columna de terminos constantes derivados de b
% (incluye BC, el termino de fuente constante, el paso
previo, etc)
%%
%% Entradas:
%% a_E, a_W, a_U, a_D, a_P y rhs_stuff son matrices con las mismas
dimensiones
%% que la matriz solucin.
%% Ellas ya han sido modificadas para incluir las condiciones de
frontera
%% Cada entrada X_ij en una de esas matrices "X" contiene terminos
asociados con
%% el punto central P_ij del volumen de control.
%%
%% a_P phi_P = a_E phi_E + a_W phi_W + a_U phi_U + a_D phi_D + b
%%
%% o:
%%
%% - a_P phi_P + a_E phi_E + a_W phi_W + a_U phi_U + a_D phi_D = - b
%%
%%
%% Cada matriz a_E, a_W, a_U, a_D, a_P es redimensionada en un vector
columna
%% la cual se convierte en una diagonal de la matriz big_A
%% a_P -> diagonal principal
%% a_U y a_D -> diagonales adyacentes
%% a_E y a_W -> diagonales nz+1 por encima y por debajo de la diagonal
principal
%%
%% matriz b que contiene:
%% - Trmino de fuente S_C independiente de phi.
%% - contribucion de las condiciones de frontera
%% - valores de la solucion del paso previo
%% b es redimensionado en un vector columna rhs
%% rhs = vector del lado derecho
%%
%%-----------------------------------------------------------------
% encuentra nz, nx (numero de filas y columnas)
[nz, nx] = size( b );
n_volumes = nx*nz;
%
% Transforma a_X matrices en diagonales de big_A matrix
% La columna 3 es el centro de la diagonal de big_A
Diags = zeros( n_volumes, 5 );
%% cols = [ -(nz+1) -1 0 1 (nz+1) ];
cols = [ -nz -1 0 1 nz ];
%
Diags(:, 5) = reshape(a_W, n_volumes, 1 );
Diags(:, 4) = reshape(a_U, n_volumes, 1 );
Diags(:, 3) = reshape(-a_P, n_volumes, 1 );
Diags(:, 2) = reshape(a_D, n_volumes, 1 );
Diags(:, 1) = reshape(a_E, n_volumes, 1 );