tria
C TRIA SOURCE GOUNAND 24/10/08 21:15:07 12025 SUBROUTINE TRIA C ****************************************************************** C INTERFACE CASTEM 2000 C C C (1) SURF1 = TRIANGULATION LIG1 (N1) ; C C (2) MAIL2 = TRIANGULATION MAIL1 ('CONV') (FLOT1) ; C C (3) MAIL2 = TRIANGULATION MAIL1 (FLOT1) ; C C OBJET : C _______ C C (1) L'OPERATEUR TRIANGULATION CONSTRUIT UN MAILLAGE D'UN DOMAINE C PLAN DEFINI PAR SA FRONTIERE (OBJET LIG1). LES ELEMENTS SONT DES C TRIANGLES LINEAIRES QUELLES QUE SOIENT LES DIRECTIVES D'OPTION. C LE NOMBRE DE NOEUDS GENERES EST MINIMUM, IL PEUT ETRE ENCORE C LIMITE EN FIXANT LA VALEUR DE N1. C C C (2) L'OPERATEUR TRIANGULATION CONSTRUIT LE MAILLAGE (OBJET MAIL2) C DE LA TRIANGULATION DE DELAUNAY D'UN MAILLAGE DE POINTS (OBJET C MAIL1). C - LE MOT CLEF 'CONV' IMPOSE DE VERIFIER LA CONVEXITE DE MAIL2 C (APPEL A VERCON), LA TAILLE DE LA BOITE EST AUGMENTEE SI BESOIN. C - FLOT1 EST UNE TAILLE DE MAILLE CIBLE A RESPECTER POUR MAIL2: C APRES UNE TRIANGULATION, UN NOEUD EST AJOUTE AU MILIEU DE CHAQUE C LIGNE DONT LA LONGEUR EXCEDE (4/3)*FLOT1, LE NOUVEL ENSEMBLE DE C POINTS EST ALORS RE-TRIANGULE. C C (3) L'OPERATEUR TRIANGULATION CONSTRUIT LE MAILLAGE (OBJET MAIL2) C DE L'INTERIEUR D'UNE SURFACE (D'UN VOLUME) EN DIMENSION 2 (3) C DEFINIE PAR UN CONTOUR (UNE ENVELOPPE) MAIL1 PAR TRIANGULATION. C MAIL1 PEUT EGALEMENT ETRE UNE SURFACE (UN VOLUME), DANS CE CAS LES C NOEUDS SITUES A L'INTERIEURS SERONT PRIS EN COMPTE DANS LA C TRIANGULATION. C - FLOT1 EST UNE TAILLE DE MAILLE CIBLE A RESPECTER POUR MAIL2: C APRES UNE TRIANGULATION, UN NOEUD EST AJOUTE AU MILIEU DE CHAQUE C LIGNE DONT LA LONGEUR EXCEDE (4/3)*FLOT1, LE NOUVEL ENSEMBLE DE C POINTS EST ALORS RE-TRIANGULE. C C DATE : 10.04.96 / 03.05.96 / 04.04.97 / 17.02.12 C ______ C C AUTEURS : T. CHARRAS ET O. STAB C _________ C C ****************************************************************** IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C -INC SMCHPOI -INC PPARAM -INC CCOPTIO -INC SMELEME -INC SMCOORD -INC CCGEOME -INC SMLENTI -INC SMTEXTE SEGMENT ITRAVX INTEGER ITVL (ITOTAI) ENDSEGMENT SEGMENT RTRAV REAL*8 RTVL (ITOTAR) ENDSEGMENT SEGMENT ICPR (nbpts) SEGMENT ICPP (nbpts) INTEGER NITMAX,NRTMAX,NPONEW,ITRACE,IERRDS LOGICAL LQUAD C C --- VARIABLES INTERNES --- INTEGER NBN,NBE,IDIMC,NBNMAX,NBCMAX,IDE,NBPMAX,NBEMAX,ITRNOE INTEGER ITRTRI,NOETRI,ITRAV,IRTRAV,NITMX2,NRTMX2,ICOORD INTEGER NMT,I,NBNARE, IARETE INTEGER IMAT,IFRL,NBFRL,IMATE,NOEMAX,MAT INTEGER ITRIRG,NMTCC,IRGREF,IMATCC INTEGER NCC,NBENEW C C (S. PASCAL) CHARACTER*4 MOT1 CHARACTER*4 MOTOPO(1) DATA MOTOPO/'TOPO'/ C C Lecture du mot-cle particulier TOPO (S. GOUNAND 2021) C if (ierr.ne.0) return if (itopo.EQ.1) then SEGINI MTEXTE LTT=13 MTEXT(1:LTT) ='MAILTOPO TRIA' NCART=13 SEGDES MTEXTE return endif C C --- CONSTANTES DE DIMENSIONNEMENT --- C POUR LE RESPECT DE LA FRONTIERE : C -------------------------------- C NCMAX : LE NOMBRE MAXIMUM DE COTE DU POLYGONE C NPMAX : LE NOMBRE MAXIMUM DE POLYGONES EMPILES C EN ENTIER => ((2*(2*NCMAX+1))* NPMAX) + 3*(NCMAX-2) C EN REELS => 2 * NPMAX C NPMAX = 1000, NCMAX = 20 => 82054 ENTIERS C => 2000 REELS C --- CONSTANTES --- IDIMC = 2 CALL DSINIT C C ======================= C --- 1.LECTURE DES DONNEES --- C ======================= * * LECTURE DES OBJETS COURANTS (ENTREES) * ===================================== IF (IERR.NE.0) THEN C ON A PAS TROUVE LE MAILLAGE GOTO 999 ENDIF NBSZ=IPT1.LISOUS(/1) NTYP=IPT1.ITYPEL LQUAD=KDEGRE(NTYP).EQ.3 IF (LQUAD) THEN IPT3=IPT1 CALL CHANL2(IPT3,IPT1) IF (IERR.NE.0) RETURN NTYP=IPT1.ITYPEL ENDIF C C---- SI PRESENCE D'UN ENTIER, SYNTAXE PREMIERE (O. STAB) -------------- C IF (IRETOU.EQ.1) GOTO 100 C C---- SI MAILLAGE DE POI1 : TRIANGULATION DE POINTS (S. PASCAL) -------- C IF ((IDIM.NE.1).AND.(IDIM.NE.2).AND.(IDIM.NE.3)) THEN INTERR(1)=IDIM C FONCTION INDISPONIBLE EN DIMENSION %I1 GOTO 999 ENDIF IF ((NBSZ.EQ.0).AND.(NTYP.EQ.1)) THEN IF(IPT1.NUM(/2) .LT. IDIM+1) THEN C Cas du MAILLAGE VIDE en sortie si moins de IDIM+1 POI1 a trianguler NBELEM=0 NBREF =0 NBSOUS=0 NBNN =IDIM+1 SEGINI,IPT2 IF (IDIM.EQ.1)THEN IPT2.ITYPEL=2 ELSEIF(IDIM.EQ.2)THEN IPT2.ITYPEL=4 ELSEIF(IDIM.EQ.3)THEN IPT2.ITYPEL=23 ENDIF ELSE C Parametre optionnel : mot-clef CONV pour verifier la convexite IVC=0 IF (IRETOU.NE.0) THEN IF (MOT1(1:4).EQ.'CONV') IVC=1 ENDIF C Parametre optionnel : taille de maille pour re-maillage IF (IRETOU.EQ.0) XDEN=0.D0 XDEN43=XDEN*4.D0/3.D0 C MPOVAL = 0 IF(IRETOU.EQ.1) THEN MSOUPO=IPCHP(1) MPOVAL=IPOVAL ENDIF C C Appel a TRIA1 pour le calcul de la triangulation de Delaunay ENDIF IF (IERR.NE.0) RETURN C GOTO 999 ENDIF C C---- AUTRES DISTINCTIONS ---------------------------------------------- C C Parametre optionnel : taille de maille pour re-maillage IF (IRETOU.EQ.0) XDEN=0. XDEN43=XDEN*4./3. C C---- SI DIMENSION 2 ET PAS DE FLOTTANT : SYNTAXE PREMIERE (O. STAB) --- C IF ((IDIM.EQ.2).AND.(XDEN.EQ.0.)) GOTO 100 C C---- MAILLAGE DE L'INTERIEUR D'UN CONTOUR EN DIMENSION 2 OU BIEN DE --- C L'INTERIEUR D'UN VOLUME EN DIMENSION 3 (S. PASCAL) C IF (NBSZ.NE.0) THEN C Operation interdite sur un objet complexe GOTO 999 ENDIF C IF (((IDIM.EQ.2).AND.(NTYP.NE.2).AND.(NTYP.NE.4)).OR. & ((IDIM.EQ.3).AND.(NTYP.NE.4).AND.(NTYP.NE.23))) THEN C Type d'element incorrect GOTO 999 ENDIF C Appel a TRIA2 pour la construction du maillage par triangulation IF (IERR.NE.0) RETURN GOTO 9999 C C---- DANS LES AUTRES CAS : TRIANGULATION CONTRAINTE D'UN CONTOUR ------ C (O. STAB) C 100 CONTINUE IF(IDIM.NE.2) THEN INTERR(1)=IDIM C FONCTION INDISPONIBLE EN DIMENSION %I1 GOTO 999 ENDIF C NBNARE = IPT1.NUM(/2) NBNTOT = -1 IF(IRETOU.NE.0) THEN IF( IVAL.LT.NBNARE )THEN C Le nombre de noeuds ne peut ètre inférieur à %i1 C (nombre d'arètes) INTERR(1) = NBNARE GOTO 999 ENDIF NBNTOT = IVAL ENDIF C IF((IPT1.LISOUS(/1).NE.0).OR. > (IPT1.ITYPEL.NE.2).OR. > (NBNARE.LT.3))THEN C DONNEES INCOMPATIBLES GOTO 999 ENDIF * * ALLOCATION DE LA MEMOIRE * ===================================== ICMEMO = 1 C NBNREL = (NBNARE**2 ) / 2 C NBNREL = NBNARE * 3 C --- POUR TESTER LES MESSAGE D'ERREUR ET LA REALLOCATION : C NBNREL = NBNARE + 50 * NBNABS = 20000 5 CONTINUE ICOORD = 1 IARETE = 1 * NMT=1 NBN= NBNARE IF(NBNTOT.NE.-1) THEN NBPTMX = NBNTOT*ICMEMO + 50 NPONEW = NBNTOT*ICMEMO -NBN ELSE NBPTMX = NBNREL*ICMEMO + 50 NPONEW = NBNREL*ICMEMO - NBN ENDIF NITMAX = 20 * NBPTMX + 288 + 310 + 82054 NRTMAX = 12 * (NBPTMX + 12) + 2000 * * TRANSFERT DANS LA STRUCTURE DE L'ALGO * ===================================== * * REMPLISSAGE DU TABLEAU DE CONNEXION * =================================== ITOTAI= NITMAX SEGINI ITRAVX segact mcoord*mod NBANC = nbpts SEGINI,ICPR,ICPP ITOTAR = NRTMAX SEGINI RTRAV INO = 0 DO 7764 I=1,NBNARE DO 7765 J=1,2 IA = IPT1.NUM(J,I) IF( ICPR(IA).EQ.0) THEN INO = INO+1 ICPR(IA) = INO ICPP(INO)=IA RTVL((INO-1)*2 +1) = XCOOR( ( IA-1) * 3 +1) RTVL((INO-1)*2 +2) = XCOOR( ( IA-1) * 3 +2) ENDIF ITVL ((I-1)*2 +J) = ICPR(IA) 7765 CONTINUE 7764 CONTINUE NBN=INO C C --- IL FAUT ANTICIPER LE NOMBRE DE NOEUDS GENERES --- C NBPMAX SERT A DIMENSIONNER NOETRI, COORD C NBEMAX SERT A DIMENSIONNER ITRNOE, ITRTRI C NBPMAX = NBN + MAX(NPONEW,50) NBEMAX = 2 * NBN + 2 * MAX(NPONEW,50) - 2 C C ============================== C --- 2. CALCUL DE LA TRIANGULATION --- C ============================== C NBNMAX = 3 NBCMAX = 3 NBE = 0 IDE = 2 C C ---------------- C --- 2.1 ALLOCATION --- C ---------------- C ITVL = |IARETE|IMAT| ITRNOE | ITRTRI | NOETRI | ITRAV C NBEMAX*3 NBEMAX*3 NBPMAX 310 C TNUPOT C C =========== BUG 1 ============ ITRNOE = (NBNARE * 2) + 1 ITRTRI = ITRNOE + (NBEMAX * NBNMAX) NOETRI = ITRTRI + (NBEMAX * NBCMAX) ITRAV = NOETRI + NBPMAX NITMX2 = NITMAX - ITRAV IRTRAV = NBPMAX * IDIMC + 1 NRTMX2 = NRTMAX - IRTRAV C C -------------------------------------------- C --- 2.2 CALCUL DE LA TRIANGULATION DE DELAUNAY --- C -------------------------------------------- C > NBNMAX,ITVL(ITRTRI),NBCMAX,ITVL(NOETRI),NBE, > ITVL(ITRAV),NITMX2,RTVL(IRTRAV),IERRDS) NCC = 1 C IF(IERRDS.NE.0)THEN IF(IERRDS.EQ.-2)THEN IERRDS = 0 ICMEMO = ICMEMO + 1 SEGSUP ITRAVX,ICPR,ICPP,RTRAV C Patience on reprend avec plus de mémoire... GOTO 5 ENDIF C Erreur de triangulation : vérifiez qu'il n'y a pas de points C confondus C ERREUR GENERATION DE MAILLAGE. IL EST NEANMOINS CREE POUR CONTROLE C CALL ERREUR(27) IERRDS = 0 GOTO 40 ENDIF C C C ================================== C --- 3. FORCAGE DES ARETES FRONTIERES C DANS LA TRIANGULATION --- C ================================== C IRTRAV = NBPMAX * IDIMC + 1 NRTMX2 = NRTMAX - IRTRAV DO 10 I=1,NBNARE > ITVL(ITRNOE),NBNMAX, > ITVL(ITRTRI),NBCMAX,ITVL(NOETRI),NBE, > RTVL(ICOORD),ITVL(ITRAV),NITMX2, > RTVL(IRTRAV),NRTMX2, > NBENEW,IERRDS) C IF( IERRDS .NE. 0 )THEN IF(IERRDS.EQ.-2)THEN IERRDS = 0 ICMEMO = ICMEMO + 1 SEGSUP ITRAVX,ICPR,ICPP,RTRAV C Patience on reprend avec plus de mémoire... GOTO 5 ELSE C Erreur de frontière : Vérifiez que le contour n'est pas croisée C ERREUR GENERATION DE MAILLAGE. IL EST NEANMOINS CREE POUR CONTROLE C CALL ERREUR(27) IERRDS = 0 GOTO 40 ENDIF ENDIF C 10 CONTINUE C C ================================== C --- 4. DESTRUCTION DES ELEMENTS C EXTERIEURS : SCULPT --- C ================================== C C ---------------- C --- 4.1 ALLOCATION --- C ---------------- C ITVL = ...ITRTRI|NOETRI| IFRL | ITRAV C NBFRL*2 2*NBE+PILE C SCULPT C IFRL = IARETE NBFRL = NBNARE NITMX2 = NITMAX - ITRAV IF(NBNARE.NE.0) > IDE,ITVL(ITRNOE),NBNMAX, > ITVL(ITRTRI),NBCMAX,ITVL(NOETRI), > NBE,ITVL(ITRAV),NITMX2,NCC,IERRDS) C IF( IERRDS .NE. 0 )THEN IF(IERRDS.EQ.-2)THEN IERRDS = 0 ICMEMO = ICMEMO + 1 SEGSUP ITRAVX,ICPR,ICPP,RTRAV C Patience on reprend avec plus de mémoire... GOTO 5 ELSE C Erreur de frontière : Vérifiez que le contour est fermé C ERREUR GENERATION DE MAILLAGE. IL EST NEANMOINS CREE POUR CONTROLE C CALL ERREUR(27) IERRDS = 0 GOTO 40 ENDIF ENDIF C C ================================== C --- 5. CALCUL DES NOEUDS INTERIEURS --- C ================================== C C ---------------- C --- 5.1 ALLOCATION --- C ---------------- C ITVL = ...ITRTRI|NOETRI| ITRAV C 310 (DELAJOUTPT) C NBPMAX = NBN + NPONEW ITRAV = NOETRI + NBPMAX NITMX2 = NITMAX - ITRAV IRTRAV = NBPMAX * IDIMC + 1 NRTMX2 = NRTMAX - IRTRAV NOEMAX = NBPMAX C > ITVL(NOETRI),NOEMAX, > RTVL(ICOORD),NBN,NBE,NBPMAX,NBEMAX, > ITVL(ITRAV),NITMX2,RTVL(IRTRAV),NRTMX2, > IERRDS) C IF(IERRDS.NE.0)THEN IF(IERRDS.EQ.-2)THEN IF(NBNTOT.EQ.-1)THEN C PAS DE LIMITATION SUR LES NOEUDS, LA MEMOIRE EVALUEE C EST INSUFFISANTE C Patience on reprend avec plus de mémoire... IERRDS = 0 ICMEMO = ICMEMO + 1 SEGSUP ITRAVX,ICPR,ICPP,RTRAV GOTO 5 ENDIF C LIMITATION SUR LES NOEUDS DONNE PAR L'UTILISATEUR IERRDS = 0 GOTO 40 ENDIF C IERRDS = -1 ... C ERREUR GENERATION DE MAILLAGE. IL EST NEANMOINS CREE POUR CONTROLE C CALL ERREUR(27) IERRDS = 0 GOTO 40 ENDIF * * REMPLISSAGE NOUVEL OBJET MAILLAGE ET TABLEAU DES COORDONNEES * ============================================================ 40 CONTINUE NBELEM=NBE NBNN=3 NBREF=0 NBSOUS=0 SEGINI MELEME NBPTS = NBN-INO+NBANC SEGADJ MCOORD DO 7781 I=1,NBN-INO XCOOR((NBANC +I-1)*(IDIM+1) +1) = RTVL((INO+I-1)*2+1) XCOOR((NBANC +I-1)*(IDIM+1) +2) = RTVL((INO+I-1)*2+2) * ---- POUR LA DENSITE : DENSITE COURANTE ---- XCOOR((NBANC +I-1)*(IDIM+1) +3) = DENSIT 7781 CONTINUE * DO 7782 I=1,NBE DO 7783 J=1,3 IA=ITVL( (I-1)*3+J-1+ITRNOE) C C III = ITVL( (I-1)*3+J-1+ITRTRI) C IF( III.LT. 0 )THEN C WRITE(6,*) ' ARETE ',J,' DU TRIANGLE ',I,' NEGATIVE ', III C ENDIF C IF ( IA .LE.INO) THEN IB = ICPP(IA) ELSE IB = IA -INO +NBANC ENDIF NUM(J,I)=IB 7783 CONTINUE ICOLOR(I) = IDCOUL 7782 CONTINUE ITYPEL=4 IPT2=MELEME C C ---- DESALLOCATION ET FIN SUR ERREUR ---- SEGSUP ITRAVX,RTRAV,ICPR,ICPP 9999 CONTINUE * Transformation en quadratiques si necessaire IF (LQUAD) THEN IPT4=IPT2 IF (IERR.NE.0) RETURN SEGSUP IPT1 SEGSUP IPT2 IPT2=IPT4 ENDIF C 999 END
© Cast3M 2003 - Tous droits réservés.
Mentions légales