hbmbif
C HBMBIF SOURCE OF166741 26/05/11 21:15:07 12538 *======================================================================= * Calcul des points de bifurcation par une methode de Newton-Raphson *======================================================================= * TYPC indique le type de calcul a realiser * = 'L' pour un point limite * = 'B' pour un point de branchement * = 'P' pour un doublement de periode * = 'N' pour une bifurcation de Neimark-Sacker *======================================================================= & MTLIAB,MTFEX,MTPAS,LOCLFA,LOCLB1,CHECK,TYPC, & KPARNUM,KSORT) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC SMLREEL POINTEUR fvec.MLREEL, fvec0.MLREEL -INC TMDYNC * segment local (a nettoyer) SEGMENT MWORK INTEGER IPIV33(2*NT+2),INDEIG(2*NT),I4(3*NT+2),I5(2*NT+1) REAL*8 AVVP(NT),AVVP2(NT+1),V1(NT) REAL*8 EIGRE(NT),EIGIM(NT),QIN(NT),OMEGIN,KAPPA,KAPPA2 REAL*8 EIGRE2(NT+1),EIGIM2(NT+1) REAL*8 VR2(NT+1,NT+1),VL2(NT+1,NT+1),WORK2(8*(NT+1)) REAL*8 JAC1(NT,NT),JAC2(NT,NT) REAL*8 RxwPhi(NT),RXXPHI(NT,NT),RwwPhi REAL*8 vA1(NT), vA2(NT),vA3(NT),vB1(NT),vB2(NT),vB3(NT) REAL*8 RX2(NT,NT),SS,EI(NT) REAL*8 JBP(2*NT+2,2*NT+2),solBP(2*NT+2) REAL*8 dWB, dXB(NT),dPHIR(NT),dPHII(NT),WORK2w(16*NT) REAL*8 res2(NT),Rco(NT,NT),PHIR(NT),PHII(NT),DPsiPsi(NT,NT) REAL*8 MREG(NT+1,NT+1),DEL1(NT,NT),DEL2(NT),Mi,Ci,JH(2*NT,2*NT) REAL*8 EXRE2w(2*NT),EXIM2w(2*NT),VL2w(2*NT,2*NT),VR2w(2*NT,4*NT) REAL*8 dRxDdk1(NT),dRxDdk2(NT) REAL*8 Rxmk2D(NT,NT),D10(NT,NT),D1w(NT,NT),D2(NT,NT),VQ(NT) REAL*8 RxxPHIR(NT,NT),RxxPHII(NT,NT),RxwPhiR(NT),RxwPhiI(NT) REAL*8 JNS(3*NT+2,3*NT+2),solNS(3*NT+2),resV1(NT),resV2(NT) REAL*8 JPD(3*NT+1,3*NT+1),solPD(3*NT+1),D1wP(NT,NT) ENDSEGMENT CHARACTER*1 TYPC LOGICAL CHECK,CANAL INTEGER MAXITS,MAXVCP,INFO C Tableaux locaux : REAL*8 AA(3,3),sol(3),arrRes(3),arrRes2(4),arrRes3(5) C Fonctions BLAS/LAPACK *----------------------------------------------------------------------- PARAMETER(MAXITS=40) * TOLF=1.e-4 * TOLMIN=1.e-6 * STPMX=100. * MTQ = KTQ MTKAM = KTKAM MTEMP = KTEMP PSORT = KSORT PARNUM = KPARNUM CANAL = JANAL SEGINI,MWORK JG = NT SEGINI,fvec,fvec0 nmc = NT SEGINI,MdZw c* DO J = 1, nmd c* DO I = 1, nmd c* MdZW.MATRC(I,J)=0.D0 c* ENDDO c* ENDDO * sauvegarde du point de la courbe de reponse OMEGIN = OMEG DO I = 1,NT QIN(I) = Q1(I) ENDDO * & MTLIAB,MTPAS,MTFEX,LOCLFA,LOCLB1,CANAL,fvec0,fref0, & .false.) c ---------------------------------------------------------------- c !!! Localisation NeimarkSacker et PeriodDoubling a debugger !!! c if(TYPC.eq.'N'.or.TYPC.eq.'P') then c WRITE(IOIMP,*) 'Localisation bifurcation ',TYPC,'non prevue !' c CHECK = .true. c return c endif c ---------------------------------------------------------------- c message IF (IIMPI.GE.2) WRITE(IOIMP,*) 'Localisation bifurcation ',TYPC *======================================================================= * Initialisation *======================================================================= * La Jacobienne augmentee a la structure de base suivante: * JJ = [ Rx O Rw ] * [ (RxPhi)x Rx RxwPhi] * [ 0' 2Phi' 0 ] * qui est a adapter selon la bifurcation traitee. * * Il faut initialiser le vecteur propre Phi. * Calcul de la Jacobienne Rx = Z(OMEGA) - dFNLdX DO J=1,NT DO I=1,NT RX(I,J) = ZZ(I,J)-JAC(I,J) ENDDO ENDDO *----------------------------------------------------------------------- * Bifurcation statique: le vecteur propre annule la Jacobienne *----------------------------------------------------------------------- IF (TYPC.EQ.'L') THEN * On prend le vecteur associe a la partie reelle la plus petite. MINVP=1 XMINVP=ABS(EIGRE(1)) DO I = 1,NT AVVP(I) = ABS(EIGRE(I)) IF(AVVP(I).LT.XMINVP) THEN MINVP=I XMINVP=AVVP(I) ENDIF ENDDO c MINVP = MINLOC(AVVP,NT) * Les vecteurs propres sont purement reels dans ce cas. DO I = 1,NT PHIR(I) = VR(I,MINVP) ENDDO * Pas de nouvelle frequence pour les cycles bifurques KAPPA = ZERO MAXVCP=1 XMAXVCP=ABS(PHIR(1)) DO I = 1,NT AVVP(I) = ABS(PHIR(I)) IF(AVVP(I).GT.XMAXVCP) THEN MAXVCP=I XMAXVCP=AVVP(I) ENDIF ENDDO c MAXVCP = MAXLOC(AVVP,NT) * Elements pour la resolution par blocs SS = ZERO DO I=1,NT SS = SS + abs(RX(I,I)) ENDDO SS = SS/NT * Penalisation de la Jacobienne (evite mauvais conditionnement) DO I=1,NT ENDDO RX2(MAXVCP,MAXVCP) = RX2(MAXVCP,MAXVCP) + SS EI(MAXVCP) = ONE ENDIF *----------------------------------------------------------------------- * Branch point ? *----------------------------------------------------------------------- IF (TYPC.EQ.'B') THEN IF (BAL.EQ.1) THEN DO I=1,NT Rw(I) = Rw(I) - TWO*OMEG*FEXA(I) ENDDO END IF * Regularisation de la Jacobienne DO I = 1,NT MREG(I,NT+1) = Rw(I) MREG(NT+1,I) = Rw(I) ENDDO DO I = 1,NT V1(I) = V1(I)*znormV1 ENDDO DO J = 1,NT DO I = 1,NT RX2(I,J) = RX(I,J) + V1(I)*V1(J) MREG(I,J) = RX2(I,J) ENDDO ENDDO & WORK2,8*(NT+1),INFO) * On prend le vecteur associe a partie reelle la plus petite. MINVP=1 XMINVP=ABS(EIGRE2(1)) DO I = 1,NT+1 AVVP2(I) = ABS(EIGRE2(I)) IF(AVVP2(I).LT.XMINVP) THEN MINVP=I XMINVP=AVVP2(I) ENDIF ENDDO c MINVP = MINLOC(AVVP2,NT+1) * Les vecteurs propres sont purement reels dans ce cas. DO I = 1,NT PHIR(I) = VR2(I,MINVP) ENDDO * Pas de nouvelle frequence pour les cycles bifurques KAPPA = ZERO ENDIF *----------------------------------------------------------------------- * Bifurcations dynamiques (Period doubling ou Neimark Sacker) *----------------------------------------------------------------------- * Construction de la matrice de Hill, JJ IF ((TYPC.EQ.'P').OR.(TYPC.EQ.'N')) THEN DO I = 1,NT DO J = 1,NT ENDDO ENDDO DO I=1,2*NHBM+1 DO J=1,NDDL DEL2(NDDL*(I-1)+J) = ONE/XM(J,1) D2(NDDL*(I-1)+J,NDDL*(I-1)+J) = XM(J,1) ENDDO ENDDO DO I=1,NDDL D10(I,I) = XASM(I,1) ENDDO DO J = 2,2*NHBM,2 DO I=1,NDDL D10(NDDL*(1+(J-2))+I,NDDL*(1+(J-2))+I) = XASM(I,1) D1w(NDDL*(1+(J-2))+I,NDDL*(1+(J-1))+I) = J*XM(I,1) D1w(NDDL*(1+(J-1))+I,NDDL*(1+(J-2))+I) = -J*XM(I,1) D10(NDDL*(1+(J-1))+I,NDDL*(1+(J-1))+I) = XASM(I,1) ENDDO ENDDO * DEL1 = DEL10 + OMEG*DEL1w * JJ = [DEL2\DEL1 DEL2\Rx] * [ -I 0 ] * DO I=1,NT DO J=1,NT * JJ_11 = DEL2\DEL1 JH(I,J) = -DEL1(I,J)*DEL2(J) * JJ_12 = DEL2\Rx JH(I,NT+J) = -RX(I,J)*DEL2(J) * JJ_21 = [I] IF (I.EQ.J) THEN JH(NT+I,J) = ONE ELSE ENDIF * JJ_22 = [0] ENDDO ENDDO & WORK2,16*NT,INFO) * WRITE(*,*) ' REAL ', ' IMAG ', ' INDX ' * DO I = 1,2*NT * WRITE(*,*) EXRE2w(INDEIG(I)),EXIM2w(I),INDEIG(I) * ENDDO * WRITE(*,*) 'INDXS:',(INDEIG(IOU),IOU=1,2*NDDL) * * On choisit le vecteur associe a la valeur propre avec partie * imaginaire positive du mode instable MINVP=1 DO I=1,2*NDDL MINVP=INDEIG(I) INDK =I * WRITE(*,*) 'Mode instable:',MINVP ENDIF ENDDO DO I=1,NT PHIR(I) = VR2w(I,MINVP) PHII(I) = VR2w(I,MINVP+1) ENDDO * WRITE(*,*) 'PHI_R ', ' PHI_I' * DO IOU = 1,NT * WRITE(*,*) PHIR(IOU),PHII(IOU) * ENDDO * STOP MAXVCP=1 XMAXVCP=ABS(PHII(1)) DO I = 1,NT AVVP(I) = ABS(PHII(I)) IF (AVVP(I).GT.XMAXVCP) THEN MAXVCP=I XMAXVCP=AVVP(I) ENDIF ENDDO c MAXVCP = MAXLOC(AVVP,NT) DO I = 1,NT ENDDO VQ(MAXVCP) = ONE * --------------------- IF (TYPC.EQ.'P') THEN * Nouvelle frequence fixee a OMEGA/2 KAPPA = OMEG/TWO ENDIF * --------------------- IF (TYPC.EQ.'N') THEN * Nouvelle frequence incommensurable KAPPA KAPPA = ABS(EXIM2w(INDK)) * write(*,*) 'KAPPA^0=',KAPPA ENDIF * STOP ENDIF *======================================================================= * Iterations *======================================================================= DO its=1,MAXITS *----------------------------------------------------------------------- * CAS L: POINT LIMITE *----------------------------------------------------------------------- IF (TYPC.EQ.'L') THEN *** Calcul des derivees * RxxPhi * Perturbation de la Jacobienne: +EPS DO JJ = 1,NT Q1(JJ) = Q1(JJ) + EPS1*PHIR(JJ) ENDDO & MTLIAB,MTPAS,MTFEX,LOCLFA,LOCLB1,CANAL,fvec,fref, & .false.) * Perturbation de la Jacobienne: -EPS DO JJ = 1,NT Q1(JJ) = Q1(JJ) - TWO*EPS1*PHIR(JJ) ENDDO & MTLIAB,MTPAS,MTFEX,LOCLFA,LOCLB1,CANAL,fvec,fref, & .false.) * retour a la valeur initiale DO JJ = 1,NT Q1(JJ) = Q1(JJ) + EPS1*PHIR(JJ) ENDDO * Differences centrees r_z = ONE / (TWO*EPS1) DO I = 1,NT DO J = 1,NT RxxPHI(I,J) = (JAC2(I,J)-JAC1(I,J))*r_z ENDDO ENDDO * RxwPhi DO I=1,NT r_z = ZERO DO J = 1,NT r_z = r_z + MdZw.MATRC(I,J)*PHIR(J) ENDDO RxwPhi(I) = r_z ENDDO * Rw IF (BAL.EQ.1) THEN r_z = TWO*OMEG DO I=1,NT Rw(I) = Rw(I) - r_z * FEXA(I) ENDDO END IF * Resolution par blocs * A1 DO I = 1,NT ENDDO * A2 DO I = 1,NT vA2(I) = -Rw(I) ENDDO * A3 DO I = 1,NT vA3(I) = EI(I) ENDDO * B1 DO I = 1,NT r_z = ZERO DO J = 1,NT r_z = r_z + RxxPHI(I,J)*vA1(J) + RX(I,J)*PHIR(J) ENDDO vB1(I) = -r_z ENDDO * B2 DO I = 1,NT r_z = ZERO DO J = 1,NT r_z = r_z + RxxPHI(I,J)*vA2(J) ENDDO vB2(I) = -(r_z + RxwPhi(I)) ENDDO * B3 DO I = 1,NT r_z = ZERO DO J = 1,NT r_z = r_z + RxxPHI(I,J)*vA3(J) ENDDO vB3(I) = -r_z ENDDO * * Construction de la matrice du probleme AA(1,1) = vA2(MAXVCP) AA(1,2) = SS*vA3(MAXVCP)-ONE AA(2,1) = vB2(MAXVCP) AA(2,2) = SS*vB3(MAXVCP) AA(2,3) = SS*vA3(MAXVCP)-ONE * Construction du cote droit sol(1) = -vA1(MAXVCP) sol(2) = -vB1(MAXVCP) * Resolution * Corrections dWB = sol(1) beta1 = sol(2) beta2 = sol(3) DO I = 1,NT dXB(I) = vA1(I) + dWB*vA2(I) +SS*beta1*vA3(I) dPHIR(I)= vB1(I)+ dWB*vB2(I) +SS*beta1*vB3(I) +SS*beta2*vA3(I) Q1(I) = Q1(I) + dXB(I) PHIR(I) = PHIR(I) + dPHIR(I) ENDDO OMEG = OMEG + dWB ENDIF *----------------------------------------------------------------------- * CAS B: POINT DE BRANCHEMENT *----------------------------------------------------------------------- IF (TYPC.EQ.'B') THEN *** Calcul des derivees * RxxPhi * Perturbation de la Jacobienne: +EPS DO JJ = 1,NT Q1(JJ) = Q1(JJ) + EPS1*PHIR(JJ) ENDDO & MTLIAB,MTPAS,MTFEX,LOCLFA,LOCLB1,CANAL,fvec,fref, & .false.) * Perturbation de la Jacobienne: -EPS DO JJ = 1,NT Q1(JJ) = Q1(JJ) - TWO*EPS1*PHIR(JJ) ENDDO & MTLIAB,MTPAS,MTFEX,LOCLFA,LOCLB1,CANAL,fvec,fref, & .false.) DO JJ = 1,NT Q1(JJ) = Q1(JJ) + EPS1*PHIR(JJ) ENDDO c DPsiPsi * Differences centrees DO I = 1,NT DO J = 1,NT RxxPHI(I,J)=((JAC2(I,J)-JAC1(I,J))/(TWO*EPS1)) + DPsiPsi(I,J) ENDDO ENDDO * RxwPhi DO I=1,NT r_z = ZERO DO J = 1,NT r_z = r_z + MdZw.MATRC(I,J)*PHIR(J) ENDDO RxwPhi(I) = r_z ENDDO * Rw IF (BAL.EQ.1) THEN DO I=1,NT Rw(I) = Rw(I) - TWO*OMEG*FEXA(I) ENDDO END IF * Rww*Phi IF (BAL.EQ.1) THEN DO I=1,NT Rw(I) = Rw(I) - TWO*OMEG*FEXA(I) RwwPhi = RwwPhi - TWO*FEXA(I)*PHIR(I) ENDDO END IF * Construction de la matrice du probleme et du cote droit DO I = 1,NT DO J = 1,NT JBP(I,J) = RX(I,J) JBP(NT+I,J) = RxxPHI(I,J) JBP(NT+I,NT+J) = RX2(I,J) solBP(NT+I) = solBP(NT+I) + RX2(I,J)*PHIR(J) ENDDO JBP(2*NT+1,NT+I) = RxwPhi(I) JBP(2*NT+1,I) = Rw(I) JBP(2*NT+2,NT+I) = TWO*PHIR(I) JBP(I,2*NT+1) = Rw(I) JBP(NT+I,2*NT+1) = RxwPhi(I) JBP(I,2*NT+2) = PHIR(I) solBP(NT+I) = -solBP(NT+I) ENDDO JBP(2*NT+1,2*NT+1) = RwwPhi * * Resolution * Corrections dWB = solBP(2*NT+1) DO I = 1,NT dXB(I) = solBP(I) dPHIR(I)= solBP(NT+I) Q1(I) = Q1(I) + dXB(I) PHIR(I) = PHIR(I) + dPHIR(I) ENDDO OMEG = OMEG + dWB ENDIF *----------------------------------------------------------------------- * CAS P: DOUBLEMENT DE PERIODE *----------------------------------------------------------------------- IF (TYPC.EQ.'P') THEN *** Calcul des derivees * RxxPhiR * Perturbation de la Jacobienne: +EPS1 DO JJ = 1,NT Q1(JJ) = Q1(JJ) + EPS1*PHIR(JJ) ENDDO & MTLIAB,MTPAS,MTFEX,LOCLFA,LOCLB1,CANAL,fvec,fref, & .false.) * Perturbation de la Jacobienne: -EPS1 DO JJ = 1,NT Q1(JJ) = Q1(JJ) - TWO*EPS1*PHIR(JJ) ENDDO & MTLIAB,MTPAS,MTFEX,LOCLFA,LOCLB1,CANAL,fvec,fref, & .false.) DO JJ = 1,NT Q1(JJ) = Q1(JJ) + EPS1*PHIR(JJ) ENDDO * Differences centrees DO I = 1,NT DO J = 1,NT RxxPHIR(I,J) = (JAC2(I,J)-JAC1(I,J))/(TWO*EPS1) ENDDO ENDDO * RxxPhiI * Perturbation de la Jacobienne: +EPS2 DO JJ = 1,NT Q1(JJ) = Q1(JJ) + EPS2*PHII(JJ) ENDDO & MTLIAB,MTPAS,MTFEX,LOCLFA,LOCLB1,CANAL,fvec,fref, & .false.) * Perturbation de la Jacobienne: -EPS2 DO JJ = 1,NT Q1(JJ) = Q1(JJ) - TWO*EPS2*PHII(JJ) ENDDO & MTLIAB,MTPAS,MTFEX,LOCLFA,LOCLB1,CANAL,fvec,fref, & .false.) DO JJ = 1,NT Q1(JJ) = Q1(JJ) + EPS2*PHII(JJ) ENDDO * Differences centrees DO I = 1,NT DO J = 1,NT RxxPHII(I,J) = (JAC2(I,J)-JAC1(I,J))/(TWO*EPS2) ENDDO ENDDO * Rw IF (BAL.EQ.1) THEN DO I=1,NT Rw(I) = Rw(I) - TWO*OMEG*FEXA(I) ENDDO END IF * Calcul de: (Rxw-(OMEG/2)*D2)*PhiR-(0.5*D10+OMEG*D1w)*PhiI et * (Rxw-(OMEG/2)*D2)*PhiI+(0.5*D10+OMEG*D1w)*PhiR DO I=1,NT DO J = 1,NT RxwPhiR(I)=RxwPhiR(I)+(MdZw.MATRC(I,J)-KAPPA*D2(I,J))*PHIR(J) & - D1wP(I,J)*PHII(J) RxwPhiI(I)=RxwPhiI(I)+(MdZw.MATRC(I,J)-KAPPA*D2(I,J))*PHII(J) & + D1wP(I,J)*PHIR(J) ENDDO ENDDO * Rxmk2D = Rx-(KAPPA**2)*D2 * Construction de la matrice du probleme et du cote droit DO I = 1,NT DO J = 1,NT JPD(I,J) = RX(I,J) JPD(NT+I,J) = RxxPHIR(I,J) JPD(2*NT+I,J) = RxxPHII(I,J) JPD(NT+I,NT+J) = Rxmk2D(I,J) JPD(NT+I,2*NT+J) = -KAPPA*DEL1(I,J) JPD(2*NT+I,NT+J) = KAPPA*DEL1(I,J) JPD(2*NT+I,2*NT+J) = Rxmk2D(I,J) solPD(NT+I)=solPD(NT+I)+Rxmk2D(I,J)*PHIR(J) & -KAPPA*DEL1(I,J)*PHII(J) solPD(2*NT+I)=solPD(2*NT+I)+Rxmk2D(I,J)*PHII(J) & +KAPPA*DEL1(I,J)*PHIR(J) ENDDO JPD( I,3*NT+1) = Rw(I) JPD( NT+I,3*NT+1) = RxwPhiR(I) JPD(2*NT+I,3*NT+1) = RxwPhiI(I) JPD(3*NT+1,2*NT+1) = VQ(I) solPD(NT+I) = -solNS(NT+I) solPD(2*NT+I) = -solNS(2*NT+I) ENDDO * Resolution * Corrections dWB = solPD(3*NT+1) DO I = 1,NT dXB(I) = solPD(I) dPHIR(I)= solPD(NT+I) dPHII(I)= solPD(2*NT+I) Q1(I) = Q1(I) + dXB(I) PHIR(I) = PHIR(I) + dPHIR(I) PHII(I) = PHII(I) + dPHII(I) ENDDO OMEG = OMEG + dWB KAPPA= OMEG/TWO END IF *----------------------------------------------------------------------- * CAS N: BIFURCATION DE NEIMARK-SACKER *----------------------------------------------------------------------- IF (TYPC.EQ.'N') THEN *** Calcul des derivees * RxxPhiR * Perturbation de la Jacobienne: +EPS1 DO JJ = 1,NT Q1(JJ) = Q1(JJ) + EPS1*PHIR(JJ) ENDDO & MTLIAB,MTPAS,MTFEX,LOCLFA,LOCLB1,CANAL,fvec,fref, & .false.) * Perturbation de la Jacobienne: -EPS1 DO JJ = 1,NT Q1(JJ) = Q1(JJ) - TWO*EPS1*PHIR(JJ) ENDDO & MTLIAB,MTPAS,MTFEX,LOCLFA,LOCLB1,CANAL,fvec,fref, & .false.) DO JJ = 1,NT Q1(JJ) = Q1(JJ) + EPS1*PHIR(JJ) ENDDO * Differences centrees DO I = 1,NT DO J = 1,NT RxxPHIR(I,J) = (JAC2(I,J)-JAC1(I,J))/(TWO*EPS1) ENDDO ENDDO * RxxPhiI * Perturbation de la Jacobienne: +EPS2 DO JJ = 1,NT Q1(JJ) = Q1(JJ) + EPS2*PHII(JJ) ENDDO & MTLIAB,MTPAS,MTFEX,LOCLFA,LOCLB1,CANAL,fvec,fref, & .false.) * Perturbation de la Jacobienne: -EPS2 DO JJ = 1,NT Q1(JJ) = Q1(JJ) - TWO*EPS2*PHII(JJ) ENDDO & MTLIAB,MTPAS,MTFEX,LOCLFA,LOCLB1,CANAL,fvec,fref, & .false.) DO JJ = 1,NT Q1(JJ) = Q1(JJ) + EPS2*PHII(JJ) ENDDO * Differences centrees DO I = 1,NT DO J = 1,NT RxxPHII(I,J) = (JAC2(I,J)-JAC1(I,J))/(TWO*EPS2) ENDDO ENDDO * RxwPhiR-KAPPA*D1w*PhiI, RxwPhiI+KAPPA*D1w*PhiR DO I=1,NT DO J = 1,NT RxwPhiR(I)=RxwPhiR(I)+MdZw.MATRC(I,J)*PHIR(J) & -KAPPA*D1w(I,J)*PHII(J) RxwPhiI(I)=RxwPhiI(I)+MdZw.MATRC(I,J)*PHII(J) & +KAPPA*D1w(I,J)*PHIR(J) dRxDdk1(I)=dRxDdk1(I)-TWO*KAPPA*D2(I,J)*PHIR(J) & -DEL1(I,J)*PHII(J) dRxDdk2(I)=dRxDdk2(I)-TWO*KAPPA*D2(I,J)*PHII(J) & +DEL1(I,J)*PHIR(J) ENDDO ENDDO * Rxmk2D = Rx-(KAPPA**2)*D2 * Rw IF (BAL.EQ.1) THEN DO I=1,NT Rw(I) = Rw(I) - TWO*OMEG*FEXA(I) ENDDO END IF * Construction de la matrice du probleme et du cote droit DO I = 1,NT DO J = 1,NT JNS(I,J) = RX(I,J) JNS(NT+I,J) = RxxPHIR(I,J) JNS(2*NT+I,J) = RxxPHII(I,J) JNS(NT+I,NT+J) = Rxmk2D(I,J) JNS(NT+I,2*NT+J) = -KAPPA*DEL1(I,J) JNS(2*NT+I,NT+J) = KAPPA*DEL1(I,J) JNS(2*NT+I,2*NT+J) = Rxmk2D(I,J) solNS(NT+I)=solNS(NT+I)+Rxmk2D(I,J)*PHIR(J) & -KAPPA*DEL1(I,J)*PHII(J) solNS(2*NT+I)=solNS(2*NT+I)+Rxmk2D(I,J)*PHII(J) & +KAPPA*DEL1(I,J)*PHIR(J) ENDDO JNS( NT+I,3*NT+1) = dRxDdk1(I) JNS(2*NT+I,3*NT+1) = dRxDdk2(I) JNS( I,3*NT+2) = Rw(I) JNS( NT+I,3*NT+2) = RxwPhiR(I) JNS(2*NT+I,3*NT+2) = RxwPhiI(I) JNS(3*NT+1,NT+I) = VQ(I) JNS(3*NT+2,2*NT+I) = VQ(I) solNS(NT+I) = -solNS(NT+I) solNS(2*NT+I) = -solNS(2*NT+I) ENDDO * Resolution DO IOU=1,3*NT+2 ENDDO * Corrections dWB = solNS(3*NT+2) dK = solNS(3*NT+1) DO I = 1,NT dXB(I) = solNS(I) dPHIR(I)= solNS(NT+I) dPHII(I)= solNS(2*NT+I) Q1(I) = Q1(I) + dXB(I) PHIR(I) = PHIR(I) + dPHIR(I) PHII(I) = PHII(I) + dPHII(I) ENDDO OMEG = OMEG + dWB KAPPA= KAPPA+ dK * write(*,*) 'w +',dWB,'=',OMEG * write(*,*) 'kappa +',dK,'=',KAPPA END IF *======================================================================= * Evaluation du residu *======================================================================= * a) R & MTLIAB,MTPAS,MTFEX,LOCLFA,LOCLB1,CANAL,fvec0,fref, & .false.) *----------------------------------------------------------------------- IF (TYPC.EQ.'L') THEN *----------------------------------------------------------------------- * b) Rxs*Phi DO I=1,NT DO J=1,NT RX(I,J) = ZZ(I,J) - JAC(I,J) res2(I) = res2(I) + RX(I,J)*PHIR(J) ENDDO ENDDO * c) norm(Phi)= 1. * Y = ( R ; RQ * \phi ; \phi*\phi-1 ) arrRes(3) = abs(res3) res = MAXVAL(arrRes,1) IF (IIMPI.GE.3) & WRITE(IOIMP,991) its,(arrRes(iou),iou=1,3),res & E10.3,';','} -> res=',E10.3) ENDIF *----------------------------------------------------------------------- IF (TYPC.EQ.'B') THEN *----------------------------------------------------------------------- * b) Rxs*Phi DO I = 1,NT V1(I) = V1(I)*znormV1 ENDDO DO I = 1,NT r_z = ZERO DO J = 1,NT RX(I,J) = ZZ(I,J) - JAC(I,J) RX2(I,J) = RX(I,J) + V1(I)*V1(J) r_z = r_z + RX2(I,J)*PHIR(J) ENDDO res2(I) = r_z ENDDO * c) Rw'*Phi IF (BAL.EQ.1) THEN DO I=1,NT Rw(I) = Rw(I) - TWO*OMEG*FEXA(I) ENDDO END IF * d) norm(Phi) = 1 * Y = ( R ; RQ * \phi ; Rw\phi ; \phi*\phi-1 ) arrRes2(3) = abs(res3) arrRes2(4) = abs(res4) res = MAXVAL(arrRes2,1) IF (IIMPI.GE.3) & WRITE(IOIMP,992) its,(arrRes2(iou),iou=1,4),res & E10.3,';',E10.3,'} -> res=',E10.3) ENDIF *----------------------------------------------------------------------- IF (TYPC.EQ.'P') THEN *----------------------------------------------------------------------- DO I = 1,NT DO J = 1,NT RX(I,J) = ZZ(I,J) - JAC(I,J) ENDDO ENDDO * b) (Rx-((OMEG/2)**2)*D2)*PhiR - KAPPA*D1*PhiI * c) (Rx-((OMEG/2)**2)*D2)*PhiI + KAPPA*D1*PhiR DO I = 1,NT r_z1 = ZERO r_z2 = ZERO DO J = 1,NT r_z1 = r_z1 + Rxmk2D(I,J)*PHIR(J) & - KAPPA*DEL1(I,J)*PHII(J) r_z2 = r_z2 + Rxmk2D(I,J)*PHII(J) & + KAPPA*DEL1(I,J)*PHIR(J) ENDDO resV1(I) = r_z1 resV2(I) = r_z2 ENDDO * d) (VQ'*PHIR) - 1 * Y = ( R ; [D0-k^2*D2]*\phi_R - k*D1*\phi_I ; * [D0-k^2*D2]*\phi_I + k*D1*\phi_R ; Q*\phi_I-1 ) arrRes2(4) = abs(res4) res = MAXVAL(arrRes2,1) IF (IIMPI.GE.3) & WRITE(IOIMP,993) its,(arrRes2(iou),iou=1,4),res & E10.3,';',E10.3,'} -> res=',E10.3) ENDIF *----------------------------------------------------------------------- IF (TYPC.EQ.'N') THEN *----------------------------------------------------------------------- DO J = 1,NT DO I = 1,NT RX(I,J) = ZZ(I,J) - JAC(I,J) ENDDO ENDDO * b) (Rx-(KAPPA**2)*D2)*PhiR - KAPPA*D1*PhiI * c) (Rx-(KAPPA**2)*D2)*PhiI + KAPPA*D1*PhiR DO I = 1,NT r_z1 = ZERO r_z2 = ZERO DO J = 1,NT r_z1 = r_z1 + Rxmk2D(I,J)*PHIR(J) & - KAPPA*DEL1(I,J)*PHII(J) r_z2 = r_z2 + Rxmk2D(I,J)*PHII(J) & + KAPPA*DEL1(I,J)*PHIR(J) ENDDO resV1(I) = r_z1 resV2(I) = r_z2 ENDDO * d) (VQ'*PHIR) - 1 * e) VQ'*PHII * Y = ( R ; [D0-k^2*D2]*\phi_R - k*D1*\phi_I ; * [D0-k^2*D2]*\phi_I + k*D1*\phi_R ; * vQ*\phi_R-1 ; vQ*\phi_I) arrRes3(4) = abs(res4) arrRes3(5) = abs(res5) res = MAXVAL(arrRes3,1) IF (IIMPI.GE.3) & WRITE(IOIMP,994) its,(arrRes3(iou),iou=1,5),res c & WRITE(IOIMP,994) its,KAPPA,(arrRes3(iou),iou=1,4),res & E10.3,';',E10.3,';',E10.3,'} -> res=',E10.3) ENDIF *----------------------------------------------------------------------- c IF (IIMPI.GE.3) WRITE(IOIMP,*) 'Iter ',its,' -> res =',res IF (res.LE.TOLMIN) THEN CHECK=.false. CBIF = CBIF + 1 TYPBIF(CBIF) = TYPC DO I=1,NT QBIFU(I,CBIF) = Q1(I) QPSIR(I,CBIF) = PHIR(I) QPSII(I,CBIF) = PHII(I) Q1(NT) = QIN(I) ENDDO WBIFU(CBIF) = OMEG WBIF2(CBIF) = KAPPA OMEG = OMEGIN c RETURN GOTO 666 ELSE CHECK = .true. ENDIF ENDDO DO I = 1,NT Q1(I) = QIN(I) ENDDO OMEG = OMEGIN c message IF (CHECK) THEN c Pas de convergence apres %i1 iterations. L'execution continue INTERR(1)=MAXITS c RETURN GOTO 666 ELSEIF (IIMPI.GE.2) THEN WRITE(IOIMP,*) '--> convergence apres ',its,'iterations' ENDIF * MENAGE 666 CONTINUE SEGSUP,MWORK SEGSUP,fvec,fvec0 RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales