Advertisement
Thomas_Lillieskold

control_y_checkeo_distinto_orden

Mar 29th, 2023 (edited)
648
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. MODULE control_y_checkeo_distinto_orden
  2. USE, intrinsic :: iso_fortran_env, only: real64
  3. use data, only: Inc_minimo, Inc_maximo, Error_maximo, numero_de_ecuaciones, t_minimo
  4. IMPLICIT NONE
  5. PRIVATE
  6.  
  7. PUBLIC :: control_y_checkeo_del_error_do
  8.  
  9. CONTAINS
  10.  
  11.     SUBROUTINE control_y_checkeo_del_error_do(aproximacion_1, aproximacion_2, aproximacion_1_old, aproximacion_2_old, t, inc_check)
  12.    
  13.         REAL(kind=real64),DIMENSION(numero_de_ecuaciones),INTENT(INOUT) :: aproximacion_1
  14.         REAL(kind=real64),DIMENSION(numero_de_ecuaciones),INTENT(INOUT) :: aproximacion_2
  15.         REAL(kind=real64),DIMENSION(numero_de_ecuaciones),INTENT(INOUT) :: aproximacion_1_old
  16.         REAL(kind=real64),DIMENSION(numero_de_ecuaciones),INTENT(INOUT) :: aproximacion_2_old
  17.         REAL(kind=real64),INTENT(INOUT) :: t
  18.         REAL(kind=real64),INTENT(INOUT) :: Inc_check
  19.         REAL(kind=real64) kn
  20.         REAL(kind=real64),DIMENSION(numero_de_ecuaciones) :: error_check
  21.         REAL(kind=real64) :: s
  22.         REAL(kind=real64) :: p=4.0_real64
  23.         REAL(kind=real64) :: Beta
  24.         CHARACTER(len=8) :: est_check
  25.        
  26.         OPEN(unit=10, file="write_outs.dat")
  27.        
  28.         Beta = 0.38**(1.0_real64/p)
  29.        
  30.         Error_check = abs((aproximacion_1-aproximacion_2)/((aproximacion_1+aproximacion_2)/2.0_real64))
  31.            
  32.         s =  Beta * (Error_maximo / maxval(Error_check))**(1.0_real64/p) !Factor de Correccion
  33.        
  34.         kn = Inc_check * s
  35.        
  36.         PRINT*, "El error:",maxval(Error_check), "s:",s
  37.        
  38.    
  39.         IF (s .ge. 1.0_real64) then !SE ACEPTA LA APROX
  40.        
  41.         est_check="aumentar"
  42.        
  43.         ELSEIF (s .lt. 1.0_real64 .and. kn .le. inc_minimo) THEN
  44.        
  45.         est_check="acepto_2"
  46.        
  47.         ELSE
  48.        
  49.         est_check="reducir"
  50.        
  51.         END IF  
  52.        
  53.         SELECT CASE(est_check)
  54.        
  55.             CASE("aumentar")
  56.            
  57.                 WRITE(10,*) t,aproximacion_1
  58.                
  59.                 aproximacion_1_old = aproximacion_1 !Los nuevos valores de la iteracion son guardados para un futuro uso en caso que sea necesario
  60.                
  61.                 aproximacion_2_old = aproximacion_2 !Los nuevos valores de la iteracion son guardados para un futuro uso en caso que sea necesario
  62.                                
  63.                 IF ( kn .gt. inc_maximo) THEN
  64.                
  65.                 kn = Inc_maximo
  66.                
  67.                 END IF
  68.                
  69.                 t = t + kn
  70.                
  71.                 !aproximacion_1 y aproximacion_2 salen de la subrutina con los valores nuevos para calcular la nueva aprox con el nuevo incremento
  72.  
  73.             CASE("acepto_2")
  74.            
  75.                 WRITE(10,*) t,aproximacion_1
  76.                    
  77.                     aproximacion_1_old = aproximacion_1 !Los nuevos valores de la iteracion son guardados para un futuro uso en caso que sea necesario
  78.                
  79.                     aproximacion_2_old = aproximacion_2 !Los nuevos valores de la iteracion son guardados para un futuro uso en caso que sea necesario
  80.                    
  81.                     kn = Inc_minimo
  82.                    
  83.                     t = t + kn
  84.                    
  85.                 !aproximacion_1 y aproximacion_2 salen de la subrutina con los valores nuevos para calcular la nueva aproximacion con incremento minimo
  86.        
  87.        
  88.             CASE("reducir") !No se acepta la aprox
  89.                
  90.                 aproximacion_1 = aproximacion_1_old !Las aproximaciones nuevas se reestablecen por las anteriores a la iteracion
  91.                
  92.                 aproximacion_2 = aproximacion_2_old !Las aproximaciones nuevas se reestablecen por las anteriores a la iteracion
  93.                
  94.                 !aproximacion_1 y aproximacion_2 salen de la subrutina con los valores anteriores para volver a ser calculados con el nuevo incremento
  95.                 !Para este caso no avanzo en el tiempo
  96.                
  97.             END SELECT
  98.        
  99.                 Inc_check = kn !Correccion del incremento para todos los casos
  100.  
  101.     END SUBROUTINE control_y_checkeo_del_error_do
  102.  
  103. END MODULE control_y_checkeo_distinto_orden
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement