C RACC SOURCE CHAT 05/01/13 02:44:01 5004 SUBROUTINE RACC(EPSI,NITER,G1,G2,A1,A2,A3,X,LOGNC,LOGAN,MESERR) C************************************************************************ C C PROJET : CASTEM 2000 C C NOM : RACC C C DESCRIPTION : Voir flurie.eso C C Calcul des intersection invariants de Riemann - C Condition de Rankine - Hugoniot. C C Parametrisation de Smoller (voir riecom.eso) C C Méthode de Newton-Raphson + Secante C C LANGAGE : FORTRAN 77 C C AUTEUR : A. BECCANTINI DRN/DMT/SEMT/TTMF C C************************************************************************ C C APPELES C C RACC ---- WNVXC ---- VLH1 C C C************************************************************************ C C Entrées : C C EPSI, NITER : paramretres pour la convergence des méhodes iteratives C C G1, G2 : les "gamma" du gaz C C A1, A2, A3 : variables definies en riecom.eso C C Sorties : C C X : solution du problème C C LOGNC : si .TRUE. -> no convergence C C LOGAN : si .TRUE. -> une anomalie a été detectée C C MESERR : message d'erreur C C************************************************************************ C C HISTORIQUE (Anomalies et modifications éventuelles) C C HISTORIQUE : créé le 7.1.98 C C************************************************************************ C C N.B. Toutes les variables sont DECLAREES C C IMPLICIT INTEGER(I-N) INTEGER NITER,NITER1,NITER2,I1,ITER REAL*8 EPSI,G1,G2,A1,A2,A3,X1,X2,WX,WXP,WX1,WX2,AUX,X LOGICAL LOGCAL,LOGCA1,LOGNC,LOGAN CHARACTER*(40) MESERR C C**** Initialisation de LOGNC, LOGAN,MESERR ne doit pas etre faite ici. C C LOGNC = .FALSE. C LOGAN = .FALSE. C MESERR(1:40) = ' ' C C**** Newton-Rapson (NITER1 iterations) C X1 = 0.0D0 CALL WNVXC(X1,A1,A2,A3,G1,G2,WX1,WXP) X = X1 WX = WX1 LOGCAL = ABS(WX) .GT. EPSI NITER1 = NITER/2 + 1 ITER=0 DO WHILE(LOGCAL) ITER=ITER+1 X=X-WX/WXP CALL WNVXC(X,A1,A2,A3,G1,G2,WX,WXP) LOGCAL = (ABS(WX) .GT. EPSI) .AND. (ITER .LT. NITER1) ENDDO LOGCAL = (ABS(WX) .GT. EPSI) IF(LOGCAL)THEN C C**** Plus de NITER1 iterations -> on utilise la methode de la secante C C N.B. La mèthode de la secante converge si F(X1)*F(X2) < 0 C C Definition de X2, WX2 C X2 = X WX2 = WX AUX = WX1*WX2 LOGCA1 = AUX .GT. 0.0D0 I1 = 0 NITER2 = 100 DO WHILE(LOGCA1) C C******* Il faut chercher X2 pour avoir WX1*WX2 < 0 C Maximum NITER2 iterations C I1 = I1 + 1 X2 = -2.0D0 * ( X2 + SIGN(1.0D0,X2) ) C C********** SIGN(1.0D0,X2) necessaire si X2 = 0.0D0 C CALL WNVXC(X2,A1,A2,A3,G1,G2,WX2,WXP) AUX = WX1*WX2 LOGCA1 = (AUX .GT. 0.0D0) .AND. (I1 .LT. NITER2) ENDDO IF(AUX .GT. 0.0D0)THEN MESERR = 'RIEMAN, subroutine racc.eso ' LOGAN = .TRUE. GOTO 9999 ENDIF LOGCA1 = LOGCAL DO WHILE(LOGCA1) IF((WX*WX1) .GT. 0)THEN X1 = X WX1 = WX ELSE X2 = X WX2 = WX ENDIF ITER = ITER + 1 X = X2 - WX2*(X2 - X1)/(WX2-WX1) CALL WNVXC(X,A1,A2,A3,G1,G2,WX,WXP) LOGCA1 = (ABS(WX) .GT. EPSI) .AND. (ITER .LT. NITER) ENDDO LOGCA1 = (ABS(WX) .GT. EPSI) IF(LOGCA1)THEN LOGNC = .TRUE. MESERR = 'RIEMAN, subroutine racc.eso ' ENDIF ENDIF C 9999 CONTINUE C RETURN END