Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- MODULE control_y_checkeo_distinto_orden
- USE, intrinsic :: iso_fortran_env, only: real64
- use data, only: Inc_minimo, Inc_maximo, Error_maximo, numero_de_ecuaciones, t_minimo
- IMPLICIT NONE
- PRIVATE
- PUBLIC :: control_y_checkeo_del_error_do
- CONTAINS
- SUBROUTINE control_y_checkeo_del_error_do(aproximacion_1, aproximacion_2, aproximacion_1_old, aproximacion_2_old, t, inc_check)
- REAL(kind=real64),DIMENSION(numero_de_ecuaciones),INTENT(INOUT) :: aproximacion_1
- REAL(kind=real64),DIMENSION(numero_de_ecuaciones),INTENT(INOUT) :: aproximacion_2
- REAL(kind=real64),DIMENSION(numero_de_ecuaciones),INTENT(INOUT) :: aproximacion_1_old
- REAL(kind=real64),DIMENSION(numero_de_ecuaciones),INTENT(INOUT) :: aproximacion_2_old
- REAL(kind=real64),INTENT(INOUT) :: t
- REAL(kind=real64),INTENT(INOUT) :: Inc_check
- REAL(kind=real64) kn
- REAL(kind=real64),DIMENSION(numero_de_ecuaciones) :: error_check
- REAL(kind=real64) :: s
- REAL(kind=real64) :: p=4.0_real64
- REAL(kind=real64) :: Beta
- CHARACTER(len=8) :: est_check
- OPEN(unit=10, file="write_outs.dat")
- Beta = 0.38**(1.0_real64/p)
- Error_check = abs((aproximacion_1-aproximacion_2)/((aproximacion_1+aproximacion_2)/2.0_real64))
- s = Beta * (Error_maximo / maxval(Error_check))**(1.0_real64/p) !Factor de Correccion
- kn = Inc_check * s
- PRINT*, "El error:",maxval(Error_check), "s:",s
- IF (s .ge. 1.0_real64) then !SE ACEPTA LA APROX
- est_check="aumentar"
- ELSEIF (s .lt. 1.0_real64 .and. kn .le. inc_minimo) THEN
- est_check="acepto_2"
- ELSE
- est_check="reducir"
- END IF
- SELECT CASE(est_check)
- CASE("aumentar")
- WRITE(10,*) t,aproximacion_1
- aproximacion_1_old = aproximacion_1 !Los nuevos valores de la iteracion son guardados para un futuro uso en caso que sea necesario
- aproximacion_2_old = aproximacion_2 !Los nuevos valores de la iteracion son guardados para un futuro uso en caso que sea necesario
- IF ( kn .gt. inc_maximo) THEN
- kn = Inc_maximo
- END IF
- t = t + kn
- !aproximacion_1 y aproximacion_2 salen de la subrutina con los valores nuevos para calcular la nueva aprox con el nuevo incremento
- CASE("acepto_2")
- WRITE(10,*) t,aproximacion_1
- aproximacion_1_old = aproximacion_1 !Los nuevos valores de la iteracion son guardados para un futuro uso en caso que sea necesario
- aproximacion_2_old = aproximacion_2 !Los nuevos valores de la iteracion son guardados para un futuro uso en caso que sea necesario
- kn = Inc_minimo
- t = t + kn
- !aproximacion_1 y aproximacion_2 salen de la subrutina con los valores nuevos para calcular la nueva aproximacion con incremento minimo
- CASE("reducir") !No se acepta la aprox
- aproximacion_1 = aproximacion_1_old !Las aproximaciones nuevas se reestablecen por las anteriores a la iteracion
- aproximacion_2 = aproximacion_2_old !Las aproximaciones nuevas se reestablecen por las anteriores a la iteracion
- !aproximacion_1 y aproximacion_2 salen de la subrutina con los valores anteriores para volver a ser calculados con el nuevo incremento
- !Para este caso no avanzo en el tiempo
- END SELECT
- Inc_check = kn !Correccion del incremento para todos los casos
- END SUBROUTINE control_y_checkeo_del_error_do
- END MODULE control_y_checkeo_distinto_orden
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement