Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- MODULE check_k
- USE DATOS,ONLY:Inc_min,Inc_max,e_max,e_min,t_min,t_max,neq
- PRIVATE
- PUBLIC :: check,control
- CONTAINS
- SUBROUTINE check(aprox_1,aprox_2,est)
- REAL(8),DIMENSION(neq),INTENT(IN)::aprox_1
- REAL(8),DIMENSION(neq),INTENT(IN)::aprox_2
- CHARACTER(8)::est
- REAL(8)::ERROR
- ERROR= Maxval( abs((aprox_1-aprox_2)/(aprox_1+aprox_2)/2.d0) )
- print*, "El Error es",Error
- IF (Error .ge. E_min .and. Error .le. E_max) then !SE ACEPTA LA APROX
- est = 'mantener'
- !EN ESTE CASO SE MANTIENE LA APROXIMACION A LA VEZ DEL PASO, Y SE PROCEDE A AVANZAR EN EL TIEMPO
- ELSE IF (Error .ge. E_max .and. Inc .gt. Inc_min) then !NO SE ACEPTA LA APROX
- est = 'reducir'
- !EN ESTE CASO SE VA A REDUCIR EL INCREMENTO DEL TIEMPO Y SE REPETIRA LA ITERACION
- ELSE IF (Error .ge. E_max .and. Inc .le. Inc_min) then !SE ACEPTA LA APROX Y SE AVISA
- est = 'minimo'
- Print*, "ATENCION:: Incremento minimo"
- !EN ESTE CASO SE DEBE TENER EN CUENTA QUE K VA A TENER QUE SER IGUAL A K_MIN PARA LA PROX ITER
- !La dif entre t_i y t_(i+1) debe ser de k_min
- ELSE IF (Error .le. E_min) then !SE ACEPTA LA APROX
- est = 'aumentar'
- END IF
- END SUBROUTINE check
- SUBROUTINE control(est,t,inc,i,q)
- CHARACTER(8),INTENT(IN)::est
- REAL(8),INTENT(INOUT)::t
- REAL(8),INTENT(INOUT)::inc
- INTEGER,INTENT(INOUT)::i
- INTEGER,INTENT(INOUT)::q
- IF (est == 'mantener') THEN
- t = t
- i = i
- q = q
- inc = inc
- ELSEIF (est == 'reducir') THEN
- t = t - Inc
- i = i - 1
- q = q - 2
- Inc = Inc * (2.d0/3.d0)
- ELSEIF (est == 'minimo') THEN
- Inc = Inc_min
- t = t
- i = i
- q = q
- ELSEIF (est == 'aumentar') THEN
- print*, "Linea 97"
- t = t - Inc
- Inc = Inc * (3.d0/2.d0)
- IF(Inc .gt. Inc_max) THEN
- Inc = Inc_max
- END IF
- t = t + Inc
- print*, "Linea 111"
- END IF
- END SUBROUTINE control
- END MODULE check_k
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement