Advertisement
Thomas_Lillieskold

Subroutine Check_k

Mar 25th, 2023
1,116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. MODULE check_k
  2. USE DATOS,ONLY:Inc_min,Inc_max,e_max,e_min,t_min,t_max,neq
  3. PRIVATE
  4.  
  5. PUBLIC :: check,control
  6.  
  7. CONTAINS
  8.  
  9. SUBROUTINE check(aprox_1,aprox_2,est)
  10.  
  11. REAL(8),DIMENSION(neq),INTENT(IN)::aprox_1
  12. REAL(8),DIMENSION(neq),INTENT(IN)::aprox_2
  13.  
  14. CHARACTER(8)::est
  15.  
  16. REAL(8)::ERROR
  17.  
  18.  
  19. ERROR= Maxval( abs((aprox_1-aprox_2)/(aprox_1+aprox_2)/2.d0) )
  20.  
  21. print*, "El Error es",Error
  22.  
  23.     IF (Error .ge. E_min .and. Error .le. E_max) then !SE ACEPTA LA APROX
  24.  
  25.                 est = 'mantener'
  26.                
  27.                 !EN ESTE CASO SE MANTIENE LA APROXIMACION A LA VEZ DEL PASO, Y SE PROCEDE A AVANZAR EN EL TIEMPO
  28.    
  29.         ELSE IF (Error .ge. E_max .and. Inc .gt. Inc_min) then !NO SE ACEPTA LA APROX
  30.  
  31.                 est = 'reducir'
  32.                
  33.                 !EN ESTE CASO SE VA A REDUCIR EL INCREMENTO DEL TIEMPO Y SE REPETIRA LA ITERACION
  34.    
  35.         ELSE IF (Error .ge. E_max .and. Inc .le. Inc_min) then !SE ACEPTA LA APROX Y SE AVISA
  36.  
  37.                 est = 'minimo'
  38.        
  39.                 Print*, "ATENCION:: Incremento minimo"
  40.                
  41.                 !EN ESTE CASO SE DEBE TENER EN CUENTA QUE K VA A TENER QUE SER IGUAL A K_MIN PARA LA PROX ITER
  42.                 !La dif entre t_i y t_(i+1) debe ser de k_min
  43.                
  44.         ELSE IF (Error .le. E_min) then !SE ACEPTA LA APROX
  45.  
  46.                 est = 'aumentar'
  47.                    
  48.     END IF
  49. END SUBROUTINE check
  50.  
  51.  
  52. SUBROUTINE control(est,t,inc,i,q)
  53.  
  54.     CHARACTER(8),INTENT(IN)::est
  55.  
  56.     REAL(8),INTENT(INOUT)::t
  57.  
  58.     REAL(8),INTENT(INOUT)::inc
  59.  
  60.     INTEGER,INTENT(INOUT)::i
  61.  
  62.     INTEGER,INTENT(INOUT)::q
  63.    
  64.    
  65.     IF (est == 'mantener') THEN
  66.    
  67.         t = t
  68.        
  69.         i = i
  70.        
  71.         q = q
  72.        
  73.         inc = inc
  74.    
  75.     ELSEIF (est == 'reducir') THEN
  76.    
  77.         t = t - Inc
  78.    
  79.         i = i - 1
  80.    
  81.         q = q - 2
  82.    
  83.         Inc = Inc * (2.d0/3.d0)
  84.            
  85.     ELSEIF (est == 'minimo') THEN
  86.    
  87.         Inc = Inc_min
  88.    
  89.         t = t
  90.    
  91.         i = i
  92.    
  93.         q = q
  94.    
  95.     ELSEIF (est == 'aumentar') THEN
  96.    
  97.         print*, "Linea 97"
  98.    
  99.         t = t - Inc
  100.    
  101.         Inc = Inc * (3.d0/2.d0)
  102.        
  103.                     IF(Inc .gt. Inc_max) THEN
  104.                    
  105.                     Inc = Inc_max
  106.                    
  107.                     END IF
  108.        
  109.         t = t + Inc
  110.        
  111.         print*, "Linea 111"
  112.     END IF
  113.        
  114. END SUBROUTINE control
  115.  
  116. END MODULE  check_k
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement