zpsi
C ZPSI SOURCE CHAT 05/01/13 04:24:52 5004 SUBROUTINE ZPSI C C VERSION VECTORISEE C C Les éléments sont groupés en paquets de LRV éléments, LRV étant C la longueur des registres vectoriels de la machine cible, i.e C 64 sur Cray, 128 ou 256 sur IBM 3090VF. On promène une fenêtre C de longueur LRV sur la boucle générale de longueur NEL. C & (HR,RPG,DRR,LE,NEL,K0,NPTD,IES,NP,IAXI, & IPADL,IKOMP,IKAS, & ALFE,IND1,UN,INDU,NPTU,IPADU, & TN,QE,IKS, & HRN,G,ALT,SGT, & VOLU,COTE,NELZ,ZTE, & DTM1,DT,DTT1,DTT2,NUEL,DIAEL) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C******************************************************************** C C CE SP DISCRETISE UNE EQUATION GENERALE DE TRANSPORT-DIFFUSION AVEC C SOURCE. C EN 2D SUR LES ELEMENTS QUA4 ET TRI3 PLAN OU AXI C EN 3D SUR LES ELEMENTS CUB8 ET PRI6 C LES OPERATEURS SONT "SOUS-INTEGRES" C C C APPELE PAR YTSCAL C C C******************************************************************** -INC CCVQUA4 -INC CCREEL -INC SMCOORD -INC PPARAM -INC CCOPTIO C C Longueur des registres vectoriels de la machine cible C On prend 64 pour ne pas augmenter la taille des tableaux C nécessaires à la vectorisation. C PARAMETER(LRV=64) DIMENSION UN(NPTU,IES),HRN(NPTD),TN(NPTD) DIMENSION COTE(NELZ,IES),VOLU(NELZ),QE(*) DIMENSION ALFE(*),ALT(*) DIMENSION IPADL(1),LE(NP,1),IPADU(*) DIMENSION HR(NEL,NP,IES),RPG(1),DRR(NP,NEL) DIMENSION BF(9,9) DIMENSION QGGT(8,8),Q1(8,8),Q2(8,8),Q3(8,8) DIMENSION COEF(LRV),AIRE(LRV) DIMENSION AL2(LRV),AH2(LRV),AP2(LRV) DIMENSION AL(LRV),AH(LRV),AP(LRV) DIMENSION ALFT(LRV),QT(LRV) DIMENSION XMB(LRV),XMH(LRV) DIMENSION CFM(LRV) DIMENSION CF1(LRV),CF2(LRV),CF3(LRV) DIMENSION DR(LRV,9) DIMENSION UM(LRV),UP(LRV) DIMENSION UIX(LRV,9),UIY(LRV,9),UIZ(LRV,9) DIMENSION TETAC(LRV,9),TETAD(LRV,9) DIMENSION UMI(LRV,3) DIMENSION SBF(LRV,9) DIMENSION GRADT(LRV,3) C? DIMENSION ZTE(LRVH) DIMENSION ZTE(NPTU) INTEGER U(3),D(3),SGN REAL*8 G(1),ZVGG(4),x(4),y(4),KMAX REAL*8 KKK(4),PhiSource(LRV),n(3,4) REAL*8 PhiN3,PhiN4,Phi3NNQ,Phi4NNQ REAL*8 MINI2,MINI4,MAXI2,MAXI4 SAVE IPAS,QGGT,Q1,Q2,Q3 DATA CD/1.D0/ DATA IPAS/0/ C********************************************************************* C C INITIALISATIONS DIVERSES C NK=K0 C ******** C * 2D * C ******** IF (IES.EQ.3) GOTO 10 IAX1=0 IAX2=0 IF (IAXI.EQ.1) IAX2=1 IF (IAXI.EQ.2) IAX1=1 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C DIFFERENCES TRIANGLE / QUADRANGLE QUA4=0.D0 IF (NP.EQ.4) QUA4=1.D0 C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C C Calcul du nombre de paquets de LRV éléments C NNN=MOD(NEL,LRV) IF(NNN.EQ.0) NPACK=NEL/LRV IF(NNN.NE.0) NPACK=1+(NEL-NNN)/LRV KPACKD=1 KPACKF=NPACK ******* BOUCLE SUR LES PAQUETS DE LRV ELEMENTS ********** DO 7001 KPACK=KPACKD,KPACKF C ======= A L'INTERIEUR DE CHAQUE PAQUET DE LRV ELEMENTS ======= C 1. Calcul des limites du paquet courant. KDEB=1+(KPACK-1)*LRV KFIN=MIN(NEL,KDEB+LRV-1) DO 7002 K=KDEB,KFIN NK=K+K0 NK1=(1-IND1)*(NK-1)+1 7002 CONTINUE IF((IKOMP.EQ.0.AND.IKAS.EQ.5).OR. &(IKOMP.EQ.1.AND.IKAS.EQ.6))THEN DO 7003 K=KDEB,KFIN NK=K+K0 7003 CONTINUE ENDIF CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C Initialisation des UMI avant accumulation DO 7005 K=KDEB,KFIN 7005 CONTINUE DO 7006 I=1,NP DO 7006 K=KDEB,KFIN NF=IPADL(LE(I,K)) NFU=IPADU(LE(I,K)) NFU=(1-INDU)*(NFU-1)+1 7006 CONTINUE * Calcul du FLUX PhiSource du terme source. IF (IKOMP.EQ.0) THEN DO 70021 K=KDEB,KFIN NK=K+K0 NKS=(1-IKS)*(NK-1)+1 70021 CONTINUE DO 70062 K=KDEB,KFIN 70062 CONTINUE ELSEIF (IKOMP.EQ.1) THEN DO 70023 K=KDEB,KFIN NK=K+K0 NKS=(1-IKS)*(NK-1)+1 70023 CONTINUE DO 70064 K=KDEB,KFIN 70064 CONTINUE ENDIF DO 7007 K=KDEB,KFIN 7007 CONTINUE ************************************************** IF (IKOMP.EQ.0) THEN DO 7008 K=KDEB,KFIN DO 23 I=1,NP 23 ZVGG(I) =0.D0 ************************************************** * NP=3 correspond à PSI sur triangles * NP=4 correspond à PSI sur quadrangles ,cad NNQ * Calcul des Ki:********************************** IF (NP.EQ.3) THEN DO 1 I=1,NP ELSEIF (NP.EQ.4) THEN * Calcul des normales: DO 36 I=1,NP x(I)=XCOOR((LE(I,K)-1)*(IES+1)+1) 36 y(I)=XCOOR((LE(I,K)-1)*(IES+1)+2) DO 39 I=1,NP IF (I.EQ.4) THEN J1=1 ELSE J1=I+1 ENDIF n(1,I)= (y(I)-y(J1)) n(2,I)= (x(J1)-x(I)) 39 CONTINUE * Calcul des Ki : DO 17 I=1,NP ENDIF **************************************************** * Calcul du DT: **************************************************** KMAX=KKK(1) DO 29 I=2,NP IF (KKK(I).GT.KMAX) KMAX=KKK(I) 29 CONTINUE DO 27 J=1,NP IP=IPADU(LE(J,K)) 27 CONTINUE **************************************************** IF (NP.EQ.4) THEN ************************************************** * Schéma NNQ (Pour des Quadrangles) . ************************************************** * Tests: ******** Nd=0 rrt =KKK(2)+KKK(3) IF (rrt.GT.0.D0) THEN Nd=Nd+1 D(Nd)=1 ENDIF rrt =KKK(3)+KKK(4) IF (rrt.GT.0.D0) THEN Nd=Nd+1 D(Nd)=2 ENDIF rrt =KKK(1)+KKK(4) IF (rrt.GT.0.D0) THEN Nd=Nd+1 D(Nd)=3 ENDIF rrt =KKK(1)+KKK(2) IF (rrt.GT.0.D0) THEN Nd=Nd+1 D(Nd)=4 ENDIF IF (Nd.EQ.2) THEN IF ((D(1)+1).NE.D(2)) THEN jj = D(1) D(1) = D(2) D(2) = jj ENDIF ENDIF Nu=0 DO 66 I=1,NP IF (Nd.EQ.2) THEN IF ((I.NE.D(1)).AND.(I.NE.D(2))) THEN Nu=Nu+1 U(Nu)=I ENDIF ELSEIF (Nd.EQ.1) THEN IF (I.NE.D(1)) THEN Nu=Nu+1 U(Nu)=I ENDIF ENDIF 66 CONTINUE IF (Nu+Nd.NE.4) THEN Print *,'Nd=,Nu=',Nd,Nu ENDIF IF (Nu.EQ.2) THEN IF ((U(1)+1).NE.U(2)) THEN jj=U(1) U(1)=U(2) U(2)=jj ENDIF ENDIF N1 =U(1) N2 =U(2) N3 =D(1) N4 =D(2) IF (Nd.EQ.2) THEN MINI2=0.D0 IF (0.D0.GE.KKK(N2)) MINI2=KKK(N2) MINI4=0.D0 IF (0.D0.GE.KKK(N4)) MINI4=KKK(N4) MAXI2=0.D0 IF (0.D0.LE.KKK(N2)) MAXI2=KKK(N2) MAXI4=0.D0 IF (0.D0.LE.KKK(N4)) MAXI4=KKK(N4) PhiN3 =( KKK(N1) + MINI2 + MINI4 ) PhiN4 =( KKK(N1) + MINI2 + MINI4 ) ZVGG(N3)=PhiN3 ZVGG(N4)=PhiN4 r= -ZVGG(N3) / (ZVGG(N4)+XPETIT) IF (r.GT.0.D0) THEN IF (r.GT.1.D0) THEN ZVGG(N3)=ZVGG(N3)+ZVGG(N4) ZVGG(N4)=0.D0 ELSE ZVGG(N4)=ZVGG(N3)+ZVGG(N4) ZVGG(N3)=0.D0 ENDIF ENDIF ELSEIF (ND.EQ.1) THEN ZVGG(N3) = PhiQ ENDIF ELSEIF (NP.EQ.3) THEN ************************************************** * Schéma PSI (Min-Mod) Pour des Triangles : ************************************************** * U Noeuds amonts * D Noeuds avals . ********************** Nd=0 Nu=0 DO 13 I=1,NP IF (KKK(I).GT.0.D0) THEN Nd=Nd+1 D(Nd)=I ELSE Nu=Nu+1 U(Nu)=I ENDIF 13 CONTINUE IF (Nd.EQ.1) THEN *************************** * 1 Target : *************************** N1 = D(1) N2 = U(1) N3 = U(2) ZVGG(N2) = 0.D0 ZVGG(N3) = 0.D0 ELSEIF (Nd.EQ.2) THEN *************************** * 2 Targets : *************************** N1 = D(1) N2 = D(2) N3 = U(1) * KKK(N1)/(KKK(N3)+XPETIT) * KKK(N2)/(KKK(N3)+XPETIT) ZVGG(N3) = 0.D0 r= -ZVGG(N1) / (ZVGG(N2)+XPETIT) IF (r.GT.0.D0) THEN IF (r.GT.1.D0) THEN ZVGG(N1)=ZVGG(N1)+ZVGG(N2) ZVGG(N2)=0.D0 ELSE ZVGG(N2)=ZVGG(N1)+ZVGG(N2) ZVGG(N1)=0.D0 ENDIF ENDIF ENDIF ENDIF DO 7 I=1,NP 7 CONTINUE 7008 CONTINUE ************************************************** ELSEIF (IKOMP.EQ.1) THEN * Prog à compléter RETURN ENDIF * Pas de temps DT : DT=100. DO 32 K1=KDEB,KFIN DO 32 J=1,NP IP=IPADU(LE(J,K1)) DT1=1.D0 /( ZTE(IP)+XPETIT) c IF (Abs(DT1).GE.1000) THEN c Print *,'DT1 trop grand =',DT1 c ENDIF IF (DT1.LE.DT) DT=DT1 32 CONTINUE DTT1=DT DTT2=DT DTT3=0.D0 DIAEL=0.D0 NUEL=0 * PRINT *, 'PAS DE TEMPS = ', DT **************************************************** * Contribution du terme diffusif: DO 8 I=1,NP DO 8 J=1,NP DO 8 K=KDEB,KFIN & *VGGT(J,I)*QUA4 ) 8 CONTINUE **************************************************** C Fin de l'accumulation dans SBF. C On ajoute ces incréments G. DO 7017 I=1,NP DO 7017 K=KDEB,KFIN NF=IPADL(LE(I,K)) 7017 CONTINUE 7001 CONTINUE IPAS=1 RETURN C ******** C * 3D * C ******** 10 CONTINUE CUB8 = 0.D0 IF (NP.EQ.8) CUB8=1.D0 C C Calcul du nombre de paquets de LRV éléments C NNN=MOD(NEL,LRV) IF(NNN.EQ.0) NPACK=NEL/LRV IF(NNN.NE.0) NPACK=1+(NEL-NNN)/LRV KPACKD=1 KPACKF=NPACK C C ******* BOUCLE SUR LES PAQUETS DE LRV ELEMENTS ********** C DO 8001 KPACK=KPACKD,KPACKF C C ======= A L'INTERIEUR DE CHAQUE PAQUET DE LRV ELEMENTS ======= C C 1. Calcul des limites du paquet courant. KDEB=1+(KPACK-1)*LRV KFIN=MIN(NEL,KDEB+LRV-1) C DO 8002 K=KDEB,KFIN NK=K+K0 NK1=(1-IND1)*(NK-1)+1 C CF1(KP)=AL(KP)*AH(KP)/AP(KP) C CF2(KP)=AL(KP)*AP(KP)/AH(KP) C CF3(KP)=AP(KP)*AH(KP)/AL(KP) 8002 CONTINUE IF((IKOMP.EQ.0.AND.IKAS.EQ.5).OR. &(IKOMP.EQ.1.AND.IKAS.EQ.6))THEN DO 8003 K=KDEB,KFIN NK=K+K0 8003 CONTINUE ENDIF CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC C Initialisation des UMI avant accumulation DO 8005 K=KDEB,KFIN 8005 CONTINUE DO 8006 I=1,NP DO 8006 K=KDEB,KFIN NF=IPADL(LE(I,K)) NFU=IPADU(LE(I,K)) NFU=(1-INDU)*(NFU-1)+1 8006 CONTINUE C C Initialisation de la variable d'accumulation SBF au terme source C C write(6,*)' IKomp,ikas=',IKomp,ikas C write(6,*)' IKS,IND1,INDU=',IKS,IND1,INDU IF(IKOMP.EQ.0)THEN DO 80021 K=KDEB,KFIN NK=K+K0 NKS=(1-IKS)*(NK-1)+1 80021 CONTINUE DO 80062 I=1,NP DO 80062 K=KDEB,KFIN 80062 CONTINUE ELSEIF(IKOMP.EQ.1)THEN DO 80023 K=KDEB,KFIN NK=K+K0 NKS=(1-IKS)*(NK-1)+1 80023 CONTINUE DO 80064 I=1,NP DO 80064 K=KDEB,KFIN 80064 CONTINUE ENDIF DO 8007 K=KDEB,KFIN 8007 CONTINUE ******************************************************** * Debut de PSI: ******************************************************** C Le coeur du calcul ... * IF(IKOMP.EQ.0)THEN C DO 8014 I=1,NP C DO 8014 K=KDEB,KFIN C KP=K-KDEB+1 * ELSEIF(IKOMP.EQ.1)THEN * RETURN * ENDIF C C Fin de l'accumulation dans SBF. C On ajoute ces incréments G. C DO 8017 I=1,NP DO 8017 K=KDEB,KFIN NF=IPADL(LE(I,K)) 8017 CONTINUE 8001 CONTINUE IPAS=1 RETURN 1002 FORMAT(10(1X,1PE11.4)) END
© Cast3M 2003 - Tous droits réservés.
Mentions légales