racc
C RACC SOURCE CHAT 05/01/13 02:44:01 5004 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 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 X = X1 WX = WX1 NITER1 = NITER/2 + 1 ITER=0 DO WHILE(LOGCAL) ITER=ITER+1 X=X-WX/WXP ENDDO 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 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) ENDDO IF(LOGCA1)THEN LOGNC = .TRUE. MESERR = 'RIEMAN, subroutine racc.eso ' ENDIF ENDIF C 9999 CONTINUE C RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales