Advertisement
Thomas_Lillieskold

Relaxed_Band_Gauss_Seidel

Apr 28th, 2023 (edited)
620
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Fortran 1.78 KB | Science | 0 0
  1. SUBROUTINE Band_Relaxation_Method(Mat_Coeficientes, Mat_Independiente, Resultados, Extension)
  2.    
  3.     REAL(kind=real64),PARAMETER:: Relax_Coef=1.95_real64    !Este valor va a ser problema dependiente, por lo que hay que cambiarlo por el valor adecuado en cada caso  
  4.    
  5.     INTEGER, INTENT(IN):: Extension
  6.     REAL(kind=real64), DIMENSION(Extension,2*Banda+1), INTENT(IN)::Mat_Coeficientes
  7.     REAL(kind=real64), DIMENSION(Extension), INTENT(IN):: Mat_Independiente
  8.     REAL(kind=real64), DIMENSION(Extension), INTENT(INOUT):: Resultados
  9.     REAL(kind=real64), DIMENSION(Extension):: Resultados_Old
  10.     LOGICAL:: Error
  11.     INTEGER:: Ini,Fin
  12.    
  13.     INTEGER:: I,J !Variables de control
  14.     REAL(kind=real64):: Suma
  15.    
  16.     ERROR = .TRUE.
  17.    
  18.     Resultados_Old = Resultados
  19.    
  20.     DO WHILE(Error)
  21.    
  22.         DO I=1,Extension
  23.        
  24.             Suma=0.0_real64
  25.        
  26.                     DO J = -Banda, -1, 1
  27.                    
  28.                         Ini=max(i+j,1)                                  !Variable de control para out_of_bounds extremo superior izquierdo de la matriz
  29.                    
  30.                         Suma=Suma+Mat_Coeficientes(i,(Banda+1)+j)*Resultados(Ini) !Sumatoria desde el valor mas a la izquierda de la banda hasta uno antes de la diagonal principal
  31.                     END DO
  32.                
  33.                     DO J = 1, Banda, 1
  34.                    
  35.                         Fin=min(Extension,i+j)                          !Variable de control para out_of_bounds extremo inferior derecho de la matriz
  36.                
  37.                         Suma=Suma+Mat_Coeficientes(i,(Banda+1)+j)*Resultados(Fin) !Sumatoria desde el valor siguiente a la diagonal principal hasta el final de la banda
  38.                    
  39.                     END DO
  40.            
  41.                     Resultados(i) =(1.0_real64-Relax_Coef)*Resultados_Old(i) + Relax_Coef*(Mat_Independiente(i)-Suma)/Mat_Coeficientes(i,Banda+1)
  42.                
  43.            
  44.         END DO
  45.        
  46.         CALL Check_Error(Resultados,Resultados_Old,Error,Extension)                                                    
  47.            
  48.         Resultados_Old=Resultados
  49.            
  50.     END DO
  51.            
  52. END SUBROUTINE Band_Relaxation_Method
Tags: Fortran
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement