Download sbfit.eso

Back to the list

   1 : C SBFIT     SOURCE    CHAT      05/01/13    03:12:04     5004           
   2 :       SUBROUTINE SB(Xbar, Sigma, RTB1, B2, Gamma, Delta, Xlam, Xi,
   3 :      $ FAULT)
   4 :       IMPLICIT INTEGER(I-N)
   5 :       IMPLICIT REAL*8 (A-H,O-Z)
   6 :       REAL*8 HMU(6), Deriv(4), DD(4), Xbar, Sigma, RTB1, 
   7 :      $ Xlam, Xi, TT, Tol, RB1, B1, E, U, X, Y, W, F, D, G, S, H2, T,
   8 :      $ H2A, H2B, H3, H4, RBET, BET2,B2, Gamma, Delta
   9 :       LOGICAL NEG, FAULT
  10 :       DATA TT, Tol, LIMIT /1.0E-4, 0.01D0, 50/
  11 : C
  12 : C
  13 :       RB1 = DABS(RTB1)
  14 :       B1 = RB1 * RB1
  15 :       NEG = RTB1.LT.0.D0
  16 : C
  17 : C Calcul de D = premiere approximation de Delta
  18 : C
  19 :       E = B1 + 1.D0
  20 :       U = 1.D0 / 3.D0 
  21 :       X = 0.5D0 * B1 + 1.D0
  22 :       Y = RB1 * DSQRT(0.25D0 * B1 + 1.D0)
  23 :       W = (X + Y) ** U + (X - Y) ** U - 1.D0
  24 :       F = W * W * (3.D0 + W * (2.D0 + W)) - 3.D0
  25 :       E = (B2 - E) / (F-E)
  26 :       IF (DABS(RB1).GT.Tol) GOTO 5
  27 :       F = 2.D0
  28 :       GOTO 20
  29 :   5   D = 1.D0 / DSQRT(DLOG(W))
  30 :       IF (D.LT.0.64D0) WRITE (*,*) 'D < 0.64'
  31 :       IF (D.LT.0.64D0) GOTO 10
  32 :       F = 2.D0 - 8.5245D0 / (D * (D * (D - 2.163D0) + 11.346D0))
  33 :       GOTO 20
  34 :   10  F = 1.25D0 * D
  35 :   20  F = E * F + 1.D0
  36 :       IF (F.LT.1.8D0) GOTO 25
  37 :       D = (0.626D0 * F - 0.408D0) * (3.D0 - F) ** (-0.479D0)
  38 :       GOTO 30
  39 :   25  D = 0.8D0 * (F - 1.D0)
  40 : C
  41 : C Calcul de G = premiere approximation de Gamma
  42 : C
  43 :   30  G = 0.D0
  44 :       IF (B1.LT.TT) GOTO 70
  45 :       IF (D.GT.1.D0) GOTO 40
  46 :       G = (0.7466D0 * D ** 1.7973D0 + 0.5955D0)*B1**0.485D0
  47 :       GOTO 70
  48 :   40  IF (D.LE.2.5) GOTO 50
  49 :       U = 0.0124D0
  50 :       Y = 0.5291D0
  51 :       GOTO 60
  52 :   50  U = 0.0623D0
  53 :       Y = 0.4043D0
  54 :   60  G = B1 ** (U * D + Y) * (0.9281D0+D*(1.0614D0*D-0.7077D0))
  55 :   70  M = 0
  56 : C
  57 : C Boucle iterative principale
  58 : C 
  59 :   80  M = M + 1
  60 : C      WRITE (*,*) 'M =',M
  61 :       FAULT = M.GT.LIMIT
  62 :       IF (FAULT) WRITE (*,*) 'Depassement limite dans bcle principale'
  63 :       IF (FAULT) RETURN
  64 : C
  65 : C   Calcul des 6.D0 premiers moments associes a G et D
  66 : C
  66 :       CALL MOM(G, D, HMU, FAULT)
  67 : C      WRITE (*,*) '(MOM) G =',G
  68 : C      WRITE (*,*) '(MOM) D =',D
  69 : C      IF (FAULT) WRITE (*,*) 'ERREUR DANS MOM'
  70 :       IF (FAULT) RETURN
  71 :       S = HMU(1) * HMU(1)
  72 :       H2 = HMU(2) - S
  73 :       FAULT = H2.LE.0.D0
  74 :       IF (FAULT) RETURN
  75 :       T = DSQRT(H2)
  76 :       H2A = T * H2
  77 :       H2B = H2 * H2
  78 :       H3 = HMU(3) - HMU(1) * (3.D0 * HMU(2) - 2.D0 * S)
  79 :       RBET = H3 / H2A
  80 :       H4 = HMU(4) - HMU(1) * (4.D0 * HMU(3) - HMU(1) *
  81 :      $ (6.D0 * HMU(2)  - 3.D0 * S))
  82 :       BET2 = H4 / H2B
  83 :       W = G * D
  84 :       U = D * D
  85 : C
  86 : C Calcul des derivees
  87 : C
  88 :       DO 120 J = 1,2
  89 :         DO 110 K = 1,4
  90 :           T = K
  91 :           IF (J.EQ.1) GOTO 90
  92 :           S = ((W - T) * (HMU(K) - HMU(K+1)) + (T + 1.D0) *
  93 :      $    (HMU(K+1) - HMU(K+2))) / U
  94 :           GOTO 100
  95 :   90      S = HMU(K+1) - HMU(K)
  96 :  100      DD(K) = T * S / D
  97 :  110    CONTINUE
  98 :         T = 2.D0 * HMU(1) * DD(1)
  99 :         S = HMU(1) * DD(2)
 100 :         Y = DD(2) - T
 101 :         DERIV(J) = (DD(3) - 3.D0 * (S + HMU(2) * DD(1) - T * 
 102 :      $  HMU(1)) - 1.5D0 * H3 * Y / H2) / H2A
 103 :         DERIV (J+2) = (DD(4) - 4.D0 * (DD(3) * HMU(1) + DD(1) * 
 104 :      $  HMU(3)) + 6.D0 * (HMU(2) * T + HMU(1) * (S - T * HMU(1)))
 105 :      $  - 2.D0 * H4 * Y / H2) / H2B 
 106 :  120  CONTINUE
 107 :       T = 1.D0 / (DERIV(1) * DERIV(4) - DERIV(2) * DERIV(3))
 108 :       U = (DERIV(4) * (RBET - RB1) - DERIV(2) * (BET2 - B2)) * T
 109 :       Y = (DERIV(1) * (BET2 - B2) - DERIV(3) * (RBET - RB1)) * T
 110 : C
 111 : C Calcul des nouvelles estimations de G et D
 112 : C
 113 :       G = G - U
 114 :       IF (B1.EQ.0.D0.OR.G.LT.0.D0) G = 0.D0
 115 :       D = D - Y
 116 :       IF ( DABS(U).GT.TT.OR.DABS(Y).GT.TT) GOTO 80
 117 : C
 118 : C Fin des iterations
 119 : C
 120 : C      WRITE (*,*) 'Fin des iterations '
 121 :       Delta = D
 122 :       Xlam = Sigma / DSQRT(H2)
 123 :       IF (NEG) GOTO 130
 124 :       Gamma = G
 125 :       GOTO 140
 126 :  130  Gamma = -G
 127 :       HMU(1) = 1.D0 - HMU(1)
 128 :  140  Xi = Xbar - Xlam * HMU(1)
 129 :       RETURN
 130 :       END
 131 :  
 132 :  
 133 :  
 134 :  

© Cast3M 2003 - All rights reserved.
Disclaimer