1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
| SUBROUTINE resolution(tab_est,alpha,q0,Qr0,eps,eta,indice)
IMPLICIT NONE
INTERFACE
DOUBLE PRECISION FUNCTION maxi(tab)
DOUBLE PRECISION, DIMENSION(:), INTENT(IN) :: tab
END FUNCTION maxi
DOUBLE PRECISION FUNCTION mini(tab)
DOUBLE PRECISION, DIMENSION(:), INTENT(IN) :: tab
END FUNCTION mini
DOUBLE PRECISION FUNCTION rms_error(tab_measured,tab_est)
DOUBLE PRECISION, DIMENSION(:),INTENT(IN) :: tab_measured, tab_est
END FUNCTION rms_error
SUBROUTINE rms_expo(n,tab_est,tab_measured,tab_jour,error,rms_exp,nvl_donnees,i,alpha,Qr0)
DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT) :: tab_est,tab_measured,tab_jour,rms_exp, nvl_donnees
LOGICAL, INTENT(INOUT) :: error
INTEGER, INTENT(IN) :: n,i
DOUBLE PRECISION, INTENT(INOUT) :: alpha, Qr0
END SUBROUTINE rms_expo
SUBROUTINE rms_homog(n,tab_est,tab_measured,tab_jour,error,rms_homo,i,eta,eps,q0)
DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT) :: tab_est,tab_measured,tab_jour,rms_homo
LOGICAL, INTENT(INOUT) :: error
INTEGER, INTENT(INOUT) :: n,i
DOUBLE PRECISION, INTENT(INOUT) :: eta,eps, q0
END SUBROUTINE rms_homog
END INTERFACE
DOUBLE PRECISION, DIMENSION(:), INTENT(INOUT) :: tab_est!, tab_measured, tab_jour
!LOGICAL, INTENT(INOUT) :: error
LOGICAL :: error
INTEGER, INTENT(INOUT) :: indice
INTEGER :: i, j, k, alloc,n
INTEGER, PARAMETER :: p=67
DOUBLE PRECISION, DIMENSION(p) :: tab_measured, tab_jour
DOUBLE PRECISION, DIMENSION(:), ALLOCATABLE :: exp_est, homo_est, rms_exp, rms_homo, nvl_donnees,rms_total
DOUBLE PRECISION, INTENT(INOUT) :: alpha,q0,Qr0,eps,eta
DOUBLE PRECISION :: minimum
!tab_est=0
n=p
DO i=1,n
tab_jour(i)=i-1
END DO
tab_measured=(/1.055,1.011,0.937,0.877,0.826,0.792,0.770,0.756,0.739, &
& 0.720,0.701,0.688,0.685,0.683,0.674,0.658,0.644,0.636,0.625,0.608,&
& 0.594,0.588,0.584,0.591,0.585,0.578,0.573,0.567,0.559,0.554,0.554, &
& 0.551,0.547,0.546,0.541,0.532,0.523,0.517,0.512,0.509,0.504,0.499, &
& 0.495,0.493,0.492,0.489,0.486,0.485,0.482,0.478,0.474,0.473,0.471,&
& 0.469,0.468,0.467,0.464,0.463,0.462,0.459,0.453,0.452,0.450,0.449,&
&0.447,0.447,0.446/)
ALLOCATE(exp_est(n),stat=alloc)
IF (alloc.NE.0) THEN
error=.TRUE.
STOP
END IF
ALLOCATE(homo_est(n),stat=alloc)
IF (alloc.NE.0) THEN
error=.TRUE.
STOP
END IF
ALLOCATE(rms_exp(n),stat=alloc)
IF (alloc.NE.0) THEN
error=.TRUE.
STOP
END IF
ALLOCATE(rms_homo(n),stat=alloc)
IF (alloc.NE.0) THEN
error=.TRUE.
STOP
END IF
ALLOCATE(nvl_donnees(n),stat=alloc)
IF (alloc.NE.0) THEN
error=.TRUE.
STOP
END IF
ALLOCATE(rms_total(n-3),stat=alloc)
IF (alloc.NE.0) THEN
error=.TRUE.
STOP
END IF
rms_exp=0
rms_homo=0
exp_est=0
homo_est=0
DO i=2,n-1
!i=42
CALL rms_expo(n,exp_est,tab_measured,tab_jour,error,rms_exp,nvl_donnees,i,alpha,Qr0)
DO j=1,n
nvl_donnees(j)=tab_measured(j)-exp_est(j)
END DO
eta=(1./i)
eps=0.001
q0=nvl_donnees(1)
CALL rms_homog(n,homo_est,nvl_donnees,tab_jour,error,rms_homo,i,eta,eps,q0)
END DO
DO i=2,n-2
rms_total(i-1)=(rms_homo(i)+rms_exp(i))/2
END DO
minimum = mini(rms_total)
DO i=1,n
IF (rms_total(i).EQ.minimum) THEN
indice=i
END IF
END DO
CALL rms_expo(n,exp_est,tab_measured,tab_jour,error,rms_exp,nvl_donnees,indice,alpha,Qr0)
DO j=1,n
nvl_donnees(j)=tab_measured(j)-exp_est(j)
END DO
eta=(1./i)
eps=0.001
q0=nvl_donnees(1)
CALL rms_homog(n,homo_est,nvl_donnees,tab_jour,error,rms_homo,indice,eta,eps,q0)
DO i=1,n
IF(i.LE.indice)THEN
tab_est(i)=exp_est(i)+homo_est(i)
ELSE
tab_est(i)=exp_est(i)
END IF
END DO
DEALLOCATE(exp_est)
DEALLOCATE(homo_est)
DEALLOCATE(rms_exp)
DEALLOCATE(rms_homo)
DEALLOCATE(nvl_donnees)
DEALLOCATE(rms_total)
END SUBROUTINE resolution |
Partager