qsijs
C QSIJS SOURCE OF166741 25/07/28 21:15:10 12336 C======================================================================C C C C INPUT: C C XEL(3,*) : LES COORDONNEES DE L'ELEMENT DANS LE REPERE LOCAL C C MELE : NUMERO DE L ELEMENT C C NBMA1 : NOMBRE DE NOEUDS DE L ELEMENT C C IDI : DIMENSION DE L'ELEMENT (1,2 OU 3) C C XPG(3) : COORDONNEES DU POINT DANS LE SYSTEME GLOBAL C C QSI(3) : COORDONNEES INITIALES DE DEBUT DE RECHERCHE C C C C OUTPUT: C C QSI(3) : COORDONNEES DU POINT DANS L ELEMENT DE REFERENCE C C SHP : FONCTIONS DE FORMES ET DERIVEES C C IROUT 0 SI SUCCES DE L OPERATION 1 SI ECHEC C C Sortie convergence a 1.E-7 sur element de reference C C======================================================================C IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC CCGEOME DIMENSION XEL(3,*),SHP(6,*),QSI(*),XPG(*) PARAMETER ( NITMAX = 100 ) DIMENSION D(3,3),DINV(3,3) C Pour l'acceleration de convergence (Delta2 Aitken) : PARAMETER ( ITAC1 = 5 , ITACN = 2 ) C DIMENSION XSU(1+ITACN),YSU(1+ITACN),ZSU(1+ITACN) DIMENSION XSU(3),YSU(3),ZSU(3) EXTERNAL SHAPE C- Quelques initialisations IROUT = 0 ITER = 0 C- Le point de depart (initialisation) est donne avant l'appel. ITACC = ITAC1 IACC = 1 IAC1 = 3 IAC2 = 2 IF (IDI.EQ.3) GOTO 600 IF (IDI.EQ.2) GOTO 700 IF (IDI.EQ.1) GOTO 800 write(ioimp,*) 'ERREUR INACCEPTABLE DANS QSIJS !' irout = 9995 goto 900 C========== Cas IDI = 3 ============================================== 600 CONTINUE C C ELEMENTS VOLUMIQUES C C-------------------- DEBUT DES ITERATIONS ------------------------ 610 CONTINUE ITER = ITER + 1 IF (ITER.GT.NITMAX) THEN IROUT = ITER GOTO 900 ENDIF CALL SHAPE(QSI(1),QSI(2),QSI(3),MELE,SHP,iret) if (iret.eq.0) then moterr(1:4) = noms(mele) irout = 9999 goto 900 endif F_1 = XZER F_2 = XZER F_3 = XZER DO ik = 1, NBMA1 F_1 = F_1 + SHP(1,ik) * XEL(1,ik) F_2 = F_2 + SHP(1,ik) * XEL(2,ik) F_3 = F_3 + SHP(1,ik) * XEL(3,ik) ENDDO F_1 = F_1 - XPG(1) F_2 = F_2 - XPG(2) F_3 = F_3 - XPG(3) c* F_DIST = (F_1 * F_1) + (F_2 * F_2) + (F_3 * F_3) c* IF (F_DIST .LT. EPSIp2) GOTO 900 DO ik = 1, NBMA1 SHP2=SHP(2,ik) SHP3=SHP(3,ik) SHP4=SHP(4,ik) XELi=XEL(1,ik) D(1,1)=D(1,1)+SHP2*XELi D(2,1)=D(2,1)+SHP3*XELi D(3,1)=D(3,1)+SHP4*XELi XELi=XEL(2,ik) D(1,2)=D(1,2)+SHP2*XELi D(2,2)=D(2,2)+SHP3*XELi D(3,2)=D(3,2)+SHP4*XELi XELi=XEL(3,ik) D(1,3)=D(1,3)+SHP2*XELi D(2,3)=D(2,3)+SHP3*XELi D(3,3)=D(3,3)+SHP4*XELi ENDDO C INVERSION DE LA MATRICE D(3,3) DINV(1,1)= D(2,2)*D(3,3)-D(2,3)*D(3,2) DINV(2,2)= D(1,1)*D(3,3)-D(1,3)*D(3,1) DINV(3,3)= D(1,1)*D(2,2)-D(1,2)*D(2,1) DINV(1,2)=-D(1,2)*D(3,3)+D(3,2)*D(1,3) DINV(2,1)=-D(2,1)*D(3,3)+D(2,3)*D(3,1) DINV(1,3)= D(1,2)*D(2,3)-D(2,2)*D(1,3) DINV(3,1)= D(2,1)*D(3,2)-D(2,2)*D(3,1) DINV(2,3)=-D(1,1)*D(2,3)+D(2,1)*D(1,3) DINV(3,2)=-D(1,1)*D(3,2)+D(1,2)*D(3,1) DJAC=D(1,1)*DINV(1,1)+D(2,1)*DINV(1,2)+D(3,1)*DINV(1,3) XX = DJAC IF (DJAC.NE.XZER) XX = XUN / DJAC dqs1 = XX * (DINV(1,1)*F_1 + DINV(2,1)*F_2 + DINV(3,1)*F_3) dqs2 = XX * (DINV(1,2)*F_1 + DINV(2,2)*F_2 + DINV(3,2)*F_3) dqs3 = XX * (DINV(1,3)*F_1 + DINV(2,3)*F_2 + DINV(3,3)*F_3) QSI(1) = QSI(1) - dqs1 QSI(2) = QSI(2) - dqs2 QSI(3) = QSI(3) - dqs3 dDQ = (dqs1 * dqs1) + (dqs2 * dqs2) + (dqs3 * dqs3) IF (dDQ .LT. EPSIp2) GOTO 900 C Acceleration de convergence : IF (ITER.EQ.ITACC) THEN dqs1 = 2.D0*XSU(IAC1)-QSI(1)-XSU(IAC2) if (abs(dqs1).GT.1.D-10) then BX = (QSI(1) - XSU(IAC1))*2.D0/dqs1 QSI(1) =(1.D0+BX)*XSU(IAC1) - BX*XSU(IAC2) end if dqs2 = 2.D0*YSU(IAC1)-QSI(2)-YSU(IAC2) if (abs(dqs2).GT.1.D-10) then BY = (QSI(2) - YSU(IAC1))*2.D0/dqs2 QSI(2) =(1.D0+BY)*YSU(IAC1) - BY*YSU(IAC2) endif dqs3 = 2.D0*ZSU(IAC1)-QSI(3)-ZSU(IAC2) if (abs(dqs3).GT.1.D-10) then BZ = (QSI(3) - ZSU(IAC1))*2.D0/dqs3 QSI(3) =(1.D0+BZ)*ZSU(IAC1) - BZ*ZSU(IAC2) endif ITACC = ITACC + ITACN ENDIF i_z = IAC2 IAC2 = IAC1 IAC1 = IACC IACC = i_z XSU(IACC) = QSI(1) YSU(IACC) = QSI(2) ZSU(IACC) = QSI(3) C-FIN---- ITERATIONS ---------------------- GOTO 610 C========== Cas IDI = 2 ============================================== 700 CONTINUE C C CAS 2 ELEMENTS SURFACIQUES C KELT = MELE * Cas particulier des POLYGONES : meleme.itypel = 32 et kelt = 108 + nbnoe IF (MELE.EQ.32) THEN KELT = 108 + NBMA1 ENDIF C-------------------- DEBUT DES ITERATIONS ------------------------ 710 CONTINUE ITER = ITER + 1 IF (ITER.GT.100) THEN IROUT = ITER GOTO 900 ENDIF * Cas particulier des POLYGONEs IF (MELE.EQ.32) THEN ELSE CALL SHAPE(QSI(1),QSI(2),QSI(3),MELE,SHP,iret) ENDIF if (iret.eq.0) then MOTERR(1:4)=NOMS(MELE) IROUT = 9999 GOTO 900 endif F_1 = XZER F_2 = XZER DO ik = 1, NBMA1 F_1 = F_1 + SHP(1,ik) * XEL(1,ik) F_2 = F_2 + SHP(1,ik) * XEL(2,ik) ENDDO F_1 = F_1 - XPG(1) F_2 = F_2 - XPG(2) c* F_DIST = (F_1 * F_1) + (F_2 * F_2) c* IF (F_DIST .LT. EPSIp2) GOTO 900 DXDQSI = XZER DXDETA = XZER DYDQSI = XZER DYDETA = XZER DO ik = 1, NBMA1 DXDQSI = DXDQSI + SHP(2,ik) * XEL(1,ik) DXDETA = DXDETA + SHP(3,ik) * XEL(1,ik) DYDQSI = DYDQSI + SHP(2,ik) * XEL(2,ik) DYDETA = DYDETA + SHP(3,ik) * XEL(2,ik) ENDDO DJAC=DXDQSI*DYDETA-DXDETA*DYDQSI XX = DJAC IF (DJAC.NE.XZER) XX = XUN/DJAC DINV(1,1) = DYDETA*XX DINV(2,1) = -DXDETA*XX DINV(1,2) = -DYDQSI*XX DINV(2,2) = DXDQSI*XX dqs1 = DINV(1,1)*F_1 + DINV(2,1)*F_2 dqs2 = DINV(1,2)*F_1 + DINV(2,2)*F_2 QSI(1) = QSI(1) - dqs1 QSI(2) = QSI(2) - dqs2 dDQ = (dqs1 * dqs1) + (dqs2 * dqs2) IF (dDQ.LT.EPSIp2) GOTO 900 C Acceleration de convergence : IF (ITER.EQ.ITACC) THEN dqs1 = 2.D0*XSU(IAC1)-QSI(1)-XSU(IAC2) if (abs(dqs1).GT.1.D-10) then BX = (QSI(1) - XSU(IAC1))*2.D0/dqs1 QSI(1) =(1.D0+BX)*XSU(IAC1) - BX*XSU(IAC2) end if dqs2 = 2.D0*YSU(IAC1)-QSI(2)-YSU(IAC2) if (abs(dqs2).GT.1.D-10) then BY = (QSI(2) - YSU(IAC1))*2.D0/dqs2 QSI(2) =(1.D0+BY)*YSU(IAC1) - BY*YSU(IAC2) endif ITACC = ITACC + ITACN ENDIF i_z = IAC2 IAC2 = IAC1 IAC1 = IACC IACC = i_z XSU(IACC) = QSI(1) YSU(IACC) = QSI(2) C-FIN---- ITERATIONS ---------------------- GOTO 710 C========== Cas IDI = 1 ============================================== 800 CONTINUE C Methode de Newton-Raphson pour resoudre X(QSI)-XPG(1)=0 810 CONTINUE ITER = ITER+1 IF (ITER.GT.100) THEN IROUT = ITER GOTO 900 ENDIF CALL SHAPE(QSI(1),QSI(2),QSI(3),MELE,SHP,iret) if (iret.eq.0) then MOTERR(1:4)=NOMS(MELE) IROUT = 9999 GOTO 900 endif F_1 =XZER dXdQSI=XZER DO ik = 1, NBMA1 F_1 = F_1 + SHP(1,ik) * XEL(1,ik) dXdQSI = dXdQSI + SHP(2,ik) * XEL(1,ik) ENDDO F_1 = F_1 - XPG(1) c* F_DIST = ABS(F_1) c* IF (F_DIST .LT. EPSIp2) GOTO 900 IF (dXdQSI.NE.XZER) THEN dQS1 = F_1 / dXdQSI QSI(1)=QSI(1)-dQS1 ELSE dQS1=XZER ENDIF C Test de convergence C Acceleration de convergence : IF (ITER.EQ.ITACC) THEN dqs1 = 2.D0*XSU(IAC1)-QSI(1)-XSU(IAC2) if (abs(dqs1).GT.1.D-10) then BX = (QSI(1) - XSU(IAC1))*2.D0/dqs1 QSI(1) =(1.D0+BX)*XSU(IAC1) - BX*XSU(IAC2) end if ITACC = ITACC + ITACN ENDIF i_z = IAC2 IAC2 = IAC1 IAC1 = IACC IACC = i_z XSU(IACC) = QSI(1) C-FIN---- ITERATIONS ---------------------- GOTO 810 C======== Sortie ============= 900 CONTINUE c* write(6,*) 'QSIJS',IROUT,ITER,QSI(1),QSI(2),QSI(3),F_DIST c return END
© Cast3M 2003 - Tous droits réservés.
Mentions légales