Advertisement
FelipeNeto2

Matlab backup 4

Apr 3rd, 2024 (edited)
1,443
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 5.53 KB | None | 0 0
  1. clear;
  2. clc;
  3.  
  4. % Parâmetros globais
  5. eps = 10^-10;
  6. Sro = 0+eps;      % Saturação residual do óleo
  7. Srw = 0+eps;      % Saturação residual da água
  8. phi = 1;        % Porosidade
  9. V = 1;          % Velocidade
  10. L = 3;          % Comprimento do domínio
  11. T = 1;          % Tempo p
  12.  
  13. pasta = 'simulacoes/Linear';
  14. mkdir(pasta);
  15.  
  16. % Função fw
  17. fw = @(Sw) Sw;
  18.  
  19. % Derivadas das funções
  20. dfw = @(Sw) 1;
  21.  
  22. % Parâmetros para a solução numérica
  23. nx = 100;        % Número de pontos da malha espacial
  24. nt = 100;        % Número de pontos da malha temporal
  25. max_iter = 100;  % Máximo de iterações
  26. tol = 1e-6;      % Tolerância
  27.  
  28. dx = L / (nx - 1);
  29. x = linspace(dx/2, L-dx/2, nx-1);  % Malha espacial centralizada
  30.  
  31. dt = T/nt;
  32. t = 0:dt:T;  % Malha temporal
  33.  
  34. % Inicialização da solução anterior com as condições iniciais
  35. S_ant = Srw * ones(nx-1, 1);
  36.  
  37. % Adimensionalização
  38. x_adim = x/L;
  39. t_adim = (t*V) / (phi*L);
  40.  
  41. % Tempos que serão plotados
  42. t_ref = (phi*L) / V;            % Tempo característico
  43. T_estrela = T / t_ref;          % Tempo final adimensional
  44.  
  45. % Saturações
  46. fileSaturacao = fopen([pasta '/saturacao.dat'], 'w');
  47. fprintf(fileSaturacao,'%%');
  48. fprintf(fileSaturacao,' Passo de tempo: %5d,  Tempo: %15.10f \n',0,0);
  49. fprintf(fileSaturacao,'%25.20f %25.20f \n', [S_ant, S_ant]);
  50. % Número de iterações
  51. fileIteracoes = fopen([pasta '/Iteracoes.dat'], 'w');
  52. fprintf(fileIteracoes,'%%');
  53. fprintf(fileIteracoes,' Passo de tempo: %5d,  Tempo: %15.10f \n',0, 0);
  54. fprintf(fileIteracoes,'%25.20f \n', 0);
  55. % Número de saturação das iterações
  56. fileSaturacaoIteracoes = fopen([pasta '/saturacaoIteracoes.dat'], 'w');
  57. % Tempo
  58. fileTempo = fopen([pasta '/tempo.dat'], 'w');
  59. fprintf(fileTempo, '%25.20f \n', t(1));
  60. % Espaço
  61. fileEspaco = fopen([pasta '/espaco.dat'], 'w');
  62. fprintf(fileEspaco, '%25.20f \n', x);
  63. % Função de fluxo
  64. fileFuncao = fopen([pasta '/funcao.dat'], 'w');
  65. fprintf(fileFuncao, '%%');
  66. fprintf(fileFuncao,' Passo de tempo: %5d,  Tempo: %15.10f \n',0,0);
  67. fprintf(fileFuncao,'%25.20f %25.20f \n', [fw(S_ant), fw(S_ant)]);
  68. % Derivada da função de fluxo
  69. fileDerivada =  fopen([pasta '/derivada.dat'], 'w');
  70. fprintf(fileDerivada, '%%');
  71. fprintf(fileDerivada,' Passo de tempo: %5d,  Tempo: %15.10f \n',0,0);
  72. fprintf(fileDerivada,'%25.20f %25.20f \n', [dfw(S_ant), dfw(S_ant)]);
  73. % Linearização da função de fluxo
  74. fileLinearizacao = fopen([pasta '/Linearizacao.dat'], 'w');
  75.  
  76. % Tempos que serão plotados
  77. tempos = T_estrela * [0.5, 1];
  78.  
  79. % Método de Newton para a solução numérica
  80. S_k1 = zeros(nx-1,1);
  81. for j = 1:nt
  82.     S_k = S_ant;
  83.    
  84.     fprintf(fileSaturacaoIteracoes,'%%');
  85.     fprintf(fileSaturacaoIteracoes,' Passo de tempo: %5d,  Tempo: %15.10f \n',j,t(j+1));
  86.        
  87.     fprintf(fileLinearizacao,'%%');
  88.     fprintf(fileLinearizacao,' Passo de tempo: %5d,  Tempo: %15.10f \n',j,t(j+1));
  89.    
  90.     for iter = 1:max_iter
  91.         A = zeros(nx-1, nx-1);
  92.         B = zeros(nx-1, 1);
  93.  
  94.         % Loop no espaço
  95.         for i = 1:nx-1
  96.             if i == 1
  97.                 % Preenche A(1,1)
  98.                 A(1, 1) = 1 + ((V * dt) / (phi * dx)) * (fw(S_k(i) + dfw(S_k(i)) * (S_k1(i) - S_k(i))) / S_k(i));
  99.                 % Preenche B(1)
  100.                 B(1) = S_ant(i) + ((V * dt) / (phi * dx)) * (fw(1 - Sro));
  101.             else
  102.                 % Preenche o resto da matriz A
  103.                 fw_i_1 = fw(S_k(i - 1));
  104.                 fwi = fw(S_k(i));
  105.                 dw_i_1 = dfw(S_k(i - 1));
  106.                 dwi = dfw(S_k(i));
  107.  
  108.                 % Coeficientes da matriz A
  109.                 A(i, i - 1) = -((V * dt) / (phi * dx)) * ((fw_i_1 + dw_i_1 * (S_k(i-1) - S_ant(i-1))) / S_k(i - 1));
  110.                 A(i, i) = 1 + ((V * dt) / (phi * dx)) * ((fwi + dwi * (S_k(i) - S_ant(i))) / S_k(i));
  111.  
  112.                 % Preencher o resto do vetor B
  113.                 B(i) = S_ant(i);
  114.             end        
  115.         end
  116.  
  117.         % Resolução do sistema linear
  118.         S_k1 = A \ B;
  119.  
  120.         % Verificação do critério de convergência
  121.         q = norm((S_k1 - S_k) / S_k1);
  122.         if q < tol
  123.             break;
  124.         end
  125.        
  126.         h1 = fw(S_k(1)) + dfw(S_k(1)) * (S_k(1) - S_ant(1));
  127.         h2 = fw(S_k(nx/2)) + dfw(S_k(nx/2)) * (S_k(nx/2) - S_ant(nx/2));
  128.         h3 = fw(S_k(end)) + dfw(S_k(1)) * (S_k(end) - S_ant(end));
  129.        
  130.         fprintf(fileLinearizacao,'%25.20f %25.20f %25.20f \n', [h1, h2, h3]);
  131.  
  132.         fprintf(fileSaturacao,'%%');
  133.         fprintf(fileSaturacao,' Passo de tempo: %5d,  Tempo: %15.10f \n',j, t(j+1));
  134.         fprintf(fileSaturacao,'%25.20f %25.20f \n', [S_k, S_k1]);
  135.  
  136.          fprintf(fileFuncao,'%%');
  137.          fprintf(fileFuncao,' Passo de tempo: %5d,  Tempo: %15.10f \n',j, t(j+1));
  138.          fprintf(fileFuncao,'%25.20f %25.20f \n', [fw(S_k), fw(S_k1)]);
  139.  
  140.          fprintf(fileDerivada,'%%');
  141.          fprintf(fileDerivada,' Passo de tempo: %5d,  Tempo: %15.10f \n',j, t(j+1));
  142.          fprintf(fileDerivada,'%25.20f %25.20f \n', [dfw(S_k), dfw(S_k1)]);
  143.        
  144.         S_k = S_k1;
  145.        
  146.         fprintf(fileSaturacaoIteracoes,'%25.20f %25.20f %25.20f \n', [S_k1(1), S_k1(nx/2), S_k1(end)]);
  147.     end
  148.  
  149.     fprintf(fileSaturacaoIteracoes,'%25.20f %25.20f %25.20f \n', [S_k1(1), S_k1(nx/2), S_k1(end)]);
  150.    
  151.     fprintf(fileLinearizacao,'%25.20f %25.20f %25.20f \n', [S_k1(1), S_k1(nx/2), S_k1(end)]);
  152.            
  153.     fprintf(fileIteracoes,'%%');
  154.     fprintf(fileIteracoes,' Passo de tempo: %5d,  Tempo: %15.10f \n',j, t(j+1));
  155.     fprintf(fileIteracoes,'%25.20f \n', iter);    
  156.  
  157.     S_ant = S_k;
  158.    
  159.     fprintf(fileTempo, '%25.20f \n', t(j+1));
  160. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement