raff2d
C RAFF2D SOURCE CB215821 24/04/12 21:17:01 11897 .KARAF,IPT4,IDCP,IPT5,KARET2,XDEN) c entrees de raff2D: c - IPT2: maillage élémentaire à raffiner c - ICPR: tableau de passage noeuds local/global c - KARPOS: tableau du nb d'arretes par noeuds c - KARETE: tableau des d'arretes KARETE(i,j)=k c - KMILIE: tableau des hanging nodes associés au arêtes c si ancienne relation c KMILIE(i,j)=n : le noeud global n est situe c au milieu de l'arete [i,k] c si nouvelle relation c KMILIE(i,j)=-1 : il faut construire un noeud c au milieu de l'arete [i,k] c - MELVA2: champ par elem valait 1 pour les élem à raffiner c et 0 pour les autres c - NACREE: nombre de noeuds à créer dans ipt2 c - KARAF: nombre d'élément à raffiner dans ipt2 c - IDCP : ??? variable non utilisé ??? c - XDEN : densité aux noeuds en notation globale c - KARET2: tableau du nombre d'éléments touchant les arretes c sorties: c - KMILIE: tableau des hanging nodes associés au arêtes c (en sortie: à partir des relations donnée en c entrée et de celles crées c si anciene relation à garder c KMILIE(i,j)=n : le noeud global n est situe c au milieu de l'arete [i,k] c si anciene relation à supprimer c KMILIE(i,j)=0 : c si nouvelle relation c KMILIE(i,j)=n : le noeud n à été construit au c milieu de l'arete [i,k] c - MELEME: Maillage élémentaire raffiné à partir de ipt2 c sans relations c - IPT8 : Maillage de relation incomplet c si J nouvel élément 48: c IPT8.NUM(1,j) = nouveau hanging node c IPT8.NUM(2:4,j) = autres noeuds de la relation c IPT8.NUM(5,j) = 1 si arête a 2 noeuds c 2 si arête a 3 noeuds c si J ancien élément 48: c IPT8.NUM(1,j) = nouveau hanging node c IPT8.NUM(2:5,j) = 0 c - XDEN : densité aux noeuds en notation globale c interpolé aux nouveaux noeuds. IMPLICIT REAL*8(A-H,O-Z) IMPLICIT INTEGER(I-N) -INC PPARAM -INC CCOPTIO -INC SMCOORD -INC CCGEOME -INC SMELEME -INC SMCHPOI -INC SMMODEL -INC SMCHAML C C======================================================================= C Initialisations - Declarations C======================================================================= SEGMENT ICPR(nbpts,2) SEGMENT XDEN(nbpts) SEGMENT KARETE(NBNDS,NCOL) SEGMENT KARET2(NBNDS,NCOL) SEGMENT KMILIE(NBNDS,NCOL) SEGMENT KARPOS(NBNDS) SEGACT IPT2,ICPR,KARPOS,KARETE,KMILIE*MOD,MELVA2,KARET2 NBNN=NBNNE(LNELM(2,(IPT2.ITYPEL-1)*2+1)) INELM=LNELM(1,(IPT2.ITYPEL-1)*2+1) C C======================================================================= C Phase de raffinement 2D C======================================================================= C C 1/ Creation du squelette du maillage resultat NBELEM=IPT2.NUM(/2)-KARAF+INELM*KARAF NBSOUS=0 NBREF=0 SEGINI IPT4 IPT4.ITYPEL=LNELM(2,(IPT2.ITYPEL-1)*2+1) LPO2=LPOS2(IPT2.ITYPEL) segact mcoord*mod NBPT1=nbpts NBPTS=NBPT1+NACREE+KARAF*NBINTE(IPT2.ITYPEL) SEGADJ MCOORD SEGADJ XDEN INUMNO=NBRAF(IPT2.ITYPEL) SEGINI NUMNOE LCOMP=1 C C 2/ Recherche des elements a raffiner DO 6 IARAF=1,MELVA2.VELCHE(/2) IF (MELVA2.VELCHE(1,IARAF).NE.1) THEN DO 1 IJKL=1,IPT2.NUM(/1) IPT4.NUM(IJKL,NBELEM)=IPT2.NUM(IJKL,IARAF) 1 CONTINUE NBELEM=NBELEM-1 GOTO 6 ENDIF C C 3/ Raffinement de l'element JCOMPT=0 JPOS5=LPOS5(IPT2.ITYPEL) DO 4 I=1,NBRAF(IPT2.ITYPEL) JPOS1=LPOS1(1,I+LPOS2(IPT2.ITYPEL)-1) JLONG=LPOS1(2,I+LPOS2(IPT2.ITYPEL)-1) JLISN=LPOS3(IPT2.ITYPEL)+JCOMPT LTYPNO=JTYPNO(JPOS5-1+I) IF (LTYPNO.EQ.0) THEN NPTA=IPT2.NUM(LISNOE(JLISN),IARAF) NPTB=IPT2.NUM(LISNOE(JLISN+1),IARAF) NMIN=MIN(ICPR(NPTA,1),ICPR(NPTB,1)) NMAX=MAX(ICPR(NPTA,1),ICPR(NPTB,1)) DO 2 K=1,MAX(1,KARPOS(NMIN)) IF (KARETE(NMIN,K).EQ.NMAX) NEXIST=K 2 CONTINUE IF (KMILIE(NMIN,NEXIST).GT.0) THEN KMILIE(NMIN,NEXIST)=0 JCOMPT=JCOMPT+JLONG GOTO 4 ELSE NBPT1=NBPT1+1 KMILIE(NMIN,NEXIST)=NBPT1 ENDIF ELSEIF (LTYPNO.EQ.7) THEN NBPT1=NBPT1+1 ELSE WRITE(*,*) 'ERREUR, on ne devrait jamais passer ici !' ENDIF C C 4/ Creation des nouveaux points XPT=0. YPT=0. XDEN1=0.D0 XDENMIN = 1000. DO 3 J=1,JLONG NGLOB=IPT2.NUM(LISNOE(JLISN-1+J),IARAF) XINI=XCOOR((NGLOB-1)*(IDIM+1)+1) YINI=XCOOR((NGLOB-1)*(IDIM+1)+2) XPT=XPT+XINI*XCOEFF(JPOS1-1+J) YPT=YPT+YINI*XCOEFF(JPOS1-1+J) XDEN1=XDEN1+XDEN(NGLOB)*XCOEFF(JPOS1-1+J) IF (XDEN(NGLOB).LT.XDENMIN) XDENMIN = XDEN(NGLOB) c if (iaraf .eq. 10) then c write (*,*) 'nglob', nglob ,'nbpt1', nbpt1 c write (*,*) 'xpt ', xpt c write (*,*) 'ypt ', ypt c write (*,*) 'xden1 ', xden1 c write (*,*) 'XDEN(NGLOB)', XDEN(NGLOB) c write (*,*) 'xcoeff1 ', XCOEFF(JPOS1-1+J) c endif 3 CONTINUE c seuil de densité a xdenmin IF (XDEN1.LT.XDENMIN) XDEN1 = XDENMIN XCOOR((NBPT1-1)*(IDIM+1)+1)=XPT XCOOR((NBPT1-1)*(IDIM+1)+2)=YPT XCOOR((NBPT1-1)*(IDIM+1)+3)=XDEN1 XDEN(NBPT1)=XDEN1 JCOMPT=JCOMPT+JLONG 4 CONTINUE JPOS4=LPOS4(IPT2.ITYPEL) C C 5/ Creation des nouveaux elements C On remplit la portion de IPT4 relative aux elements crees a partir C de la division de l'element IARAF (indice de boucle 1). C Cette portion de IPT4 contient les colonnes dont la valeur s'etend C de INELM*(LCOMP-1)+1 a INELM*LCOMP. DO 5 J=1,INELM DO 5 I=1,IPT4.NUM(/1) NTEMP=LIELM(JPOS4-1+NBNN*(J-1)+I) IF (NTEMP.GT.NBNN) THEN ELSE IPT4.NUM(I,INELM*(LCOMP-1)+J)=IPT2.NUM(NTEMP,IARAF) ENDIF 5 CONTINUE LCOMP=LCOMP+1 6 CONTINUE C C======================================================================= C Preparation du maillage de relations C======================================================================= C On cree un maillage IPT5 contenant tous les noeuds soumis a des C relations C C 1/ Comptage du nombre de noeuds soumis a des relations NBELEM=0 DO 7 J=1,KMILIE(/2) DO 7 I=1,KMILIE(/1) IF (KARET2(I,J).NE.2) GOTO 7 IF (KMILIE(I,J).GT.0) NBELEM=NBELEM+1 7 CONTINUE C C 2/ Creation de IPT5 IPT5=0 IF (NBELEM.EQ.0) GOTO 999 NBNN=5 NBREF=0 NBSOUS=0 SEGINI IPT5 IPT5.ITYPEL=48 C C 3/ Renseignement des noeuds support des relations DO 8 J=1,KMILIE(/2) DO 8 I=1,KMILIE(/1) IF (KARET2(I,J).NE.2) GOTO 8 IF (KMILIE(I,J).GT.0) THEN NBREF=NBREF+1 IPT5.NUM(1,NBREF)=KMILIE(I,J) ENDIF 8 CONTINUE C C 4/ Recherche des noeuds formant les relations DO 14 IARAF=1,MELVA2.VELCHE(/2) IF (MELVA2.VELCHE(1,IARAF).NE.1) GOTO 14 JCOMPT=0 JPOS5=LPOS5(IPT2.ITYPEL) DO 13 I=1,NBRAF(IPT2.ITYPEL) JPOS1=LPOS1(1,I+LPOS2(IPT2.ITYPEL)-1) JLONG=LPOS1(2,I+LPOS2(IPT2.ITYPEL)-1) JLISN=LPOS3(IPT2.ITYPEL)+JCOMPT LTYPNO=JTYPNO(JPOS5-1+I) IF (LTYPNO.NE.0) GOTO 12 NPTA=IPT2.NUM(LISNOE(JLISN),IARAF) NPTB=IPT2.NUM(LISNOE(JLISN+1),IARAF) NMIN=MIN(ICPR(NPTA,1),ICPR(NPTB,1)) NMAX=MAX(ICPR(NPTA,1),ICPR(NPTB,1)) DO 9 K=1,MAX(1,KARPOS(NMIN)) IF (KARETE(NMIN,K).EQ.NMAX) NEXIST=K 9 CONTINUE IF (KARET2(NMIN,NEXIST).NE.2) GOTO 12 IF (KMILIE(NMIN,NEXIST).EQ.0) GOTO 12 NEXIS5=0 DO 10 MM=1,IPT5.NUM(/2) INOEGL=KMILIE(NMIN,NEXIST) INRELA=IPT5.NUM(1,MM) IF (INOEGL.EQ.INRELA) NEXIS5=MM 10 CONTINUE C C 5/ Renseignement des noeuds formant les relations DO 11 IHH=1,JLONG IPT5.NUM(1+IHH,NEXIS5)=IPT2.NUM(LISNOE(JLISN-1+IHH),IARAF) 11 CONTINUE IF (JLONG.EQ.2) IPT5.NUM(5,NEXIS5)=1 IF (JLONG.EQ.3) IPT5.NUM(5,NEXIS5)=2 12 CONTINUE JCOMPT=JCOMPT+JLONG 13 CONTINUE 14 CONTINUE C C======================================================================= C Fin du programme C======================================================================= 999 CONTINUE RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales