SUBROUTINE COONOE(M,XM,NFE,NIE,NFS,NIS,NREFP1,REFP1,NREFP2,REFP2) c c xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx c but : A PARTIR D'UNE SURFACE REFERENCEE (P1)(SD NOPO), ON CREE UNE c ooo SURFACE AVEC DES ELEMENTS COURBES (P2) OU DROITS (P1 OU P2) c QUI EST STOCKEE DANS UNE SDS DE TYPE NOPO. c parametres d'entree : c oooooooooooooooooooo c M,XM : LE SUPER TABLEAU c NFE(NIE) : FICHIER ET NIVEAU DE LA S.D.E. NOPO c NFS(NIS) : FICHIER ET NIVEAU DE LA S.D.S. NOPO c REFP1,REFP2 : tableau des references des surfaces planes et courbes c xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx c Programmeur : S. Balac - IRMAR - juin 1995 c Derniere modification : S. Balac - 4 novembre 1998 c xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx c DIMENSION M(*),XM(*),NZNOPO(19) CHARACTER*4 CHAR4 CHARACTER*80 KINFO,NTITRE COMMON /ALNOPO/ NENOPO,NNOP0,IANOP0,LNOP0,NNOP1,IANOP1,LNOP1, + NNOP2,IANOP2,LNOP2,NNOP3,IANOP3,LNOP3, + NNOP4,IANOP4,LNOP4,NNOP5,IANOP5,LNOP5 EQUIVALENCE(NENOPO,NZNOPO(1)) C INTEGER NREFP1,NREFP2,REFP1(NREFP1),REFP2(NREFP2) C TABLEAU DES COORDONNEES DES NOEUDS D'UN ELT : C 9 OU 15 REELS SVT ELT EST TRIANGLE OU QUADRANGLE A DIVISER EN 2 REAL XNOE(15) INTEGER IPT(3),IPQ(4) DATA IPT/2,3,1/,IPQ/2,3,4,1/ IMPRIM = IINFO('IMPRIMANTE') NTITRE = KINFO('TITRE') WRITE(IMPRIM,*)' PARAMETRE D''IMPRESSION (0-10)' READ(*,*) IMPRE C C ------------------------------------------------------- C --- INITIALISATIONS --- C ------------------------------------------------------- C C NCE (ICE) : NOM (ADRESSE) DU TABLEAU DE SAUVEGARDE DU COMMON DE LA S.D NIE C NCS (ICS) : NOM (ADRESSE) DU TABLEAU DE SAUVEGARDE DU COMMON DE LA S.D NIS CALL SDREST(M,'NOPO',NFE,NIE,NZNOPO,19,NCE,ICE) IF (NIS .EQ. NIE) STOP '*** ERREUR COONOE: NIVEAUX EGAUX POUR LES & S.D. ***' CALL TUERSD(M,'NOPO',NIS,1) c COPIE DES 4 PREMIERS TABLEAUX DE LA S.D NOPO (NOP0 A NOP3) C DE NIVEAU NIE DANS LA S.D NOPO DE NIVEAU NIS CALL COPISD(M,'NOPO',4,NIE,NCE,ICE,NIS,NCS,ICS) CALL INICSD(M,'NOPO',NIS,NZNOPO,19,NCS,ICS) C POINTEURS SUR LES TABLEAUX NOP2, NOP4 ET NOP5 DE LA SDE NOPO IAN2E = M(ICE + 8) IAN4E = M(ICE + 14) IAN5E = M(ICE + 17) c LECTURE DES CARACTERISTIQUES DU MAILLAGE: DIMENSION, NB ELEMENTS, NB POINTS NDIM = M(IAN2E) IF (NDIM.NE.3) STOP'*** ERREUR COONOE: NDIM <> 3 ***' NTRI = M(IAN2E + 7) NQUA = M(IAN2E + 8) NE = M(IAN2E + 4) NP = M(IAN2E + 21) C TEST SI DES POINTS SONT NON-NOEUDS NCOPNP = M(IAN2E + 3) IF ( NCOPNP .NE. 1) STOP'*** ERREUR COONOE: IL Y A DES POINTS & NON-NOEUDS ***' C C ADRESSAGES DYNAMIQUE DE TABLEAUX INTERMEDIAIRES C ... ON MAJORE LE NBRE DE NOEUDS (DONC DE POINTS) D'UN ELT PAR 20 ... C TABLEAU DES COORDONNEES DES POINTS NOE23 = NDIM * 20 NOMCO = ICHAR4('XCOO') IACOO = 0 CALL READRE(2,CHAR4(NOMCO),IACOO,NOE23,M,NRET) C TABLEAU DES NUMEROS DES NOEUDS ET POINTS NOE2 = 2 * 20 NOMXX = ICHAR4('AUX ') IANOE = 0 CALL READRE(1,CHAR4(NOMXX),IANOE,NOE2,M,NRET) IAPOI = IANOE + 20 C TABLEAU DES NUMEROS DE REFERENCE NOMRE = ICHAR4('NREF') LREF = 26 IAREF = 0 CALL READRE(1,CHAR4(NOMRE),IAREF,LREF,M,NRET) C C ------------------------------------------------------- C --- CREATION DES TABLEAU NOP4 ET NOP5 DE LA SDS --- C ------------------------------------------------------- C C ADRESSAGE DYNAMIQUE DU TABLEAU NOP4 DE LA SDS. C ON MAJORE GROSSIEREMENT LA TAILLE DU TABLEAU (NB DE COORDONNEES C STOCKEES). ON AJOUTE AU MAX 3 NOEUDS PAR TRI ET 5 NOEUDS PAR QUA. C NOM EST UN ENTIER ! NOM = M(ICS + 13) LONG = 3*(NP+3*NTRI+5*NQUA) CALL READRE(1,CHAR4(NOM),IAN4S,LONG,M,NRET) M(ICS + 14) = IAN4S M(ICS + 15) = LONG IF (IMPRE.EQ.10) WRITE(IMPRIM,*)'LG RESERVEE POUR NOP4:', LONG C RECOPIE DES POINTS DE LA SDE NP3=3*NP DO 5 IP=1,NP3 IPM1 = IP-1 XM(IAN4S+IPM1) = XM(IAN4E+IPM1) 5 CONTINUE C C ADRESSAGE DYNAMIQUE DU TABLEAU NOP5 DE LA SDS. C ON MAJORE GROSSIEREMENT LA TAILLE DU TABLEAU: NE SDS * (4+NNO) NOM = M(ICS + 16) LONG = (NTRI+2*NQUA)*(4+6) CALL READRE(1,CHAR4(NOM),IAN5S,LONG,M,NRET) M(ICS + 17) = IAN5S M(ICS + 18) = LONG IF (IMPRE.EQ.10) WRITE(IMPRIM,*)'LG RESERVEE POUR NOP5:', LONG C INITIALISATION ADRESSES (IA4S A LA FIN DES POINTS DANS LE TAB. NOP4) IA5S = IAN5S-1 IA4S = IAN4S +3*NP -1 IA5E = IAN5E C NUMNOE : VARIABLE DETERMINANT LES NUMEROS DES NOEUDS C NES : VARIABLE DETERMINANT LE NB D'ELTS DE LA SDS NUMNOE = NP NES = 0 C C ------------------------------------------------------- C --- BOUCLE SUR LES ELEMENTS --- C ------------------------------------------------------- C DO 10 IE=1,NE C LECTURE DU TABLEAU NOP5 ET ACTUALISATION DE IA AU DEBUT DE L'ELEMENT SUIVANT. C NCGE: CODE GEOMETRIQUE DE L'ELEMENT - NDSDE: NUMERO DU DOMAINE AUQUEL C APPRARTIENT L'ELEMENT - NNO,M(IANOE): NB DE NOEUDS ET TABLEAU DES NUM DES C NOEUDS DE L'ELT - NPO,M(IAPOI): NB DE POINTS ET TABLEAU DES NUM DES POINTS C XM(IACOO): TABLEAU DES COORDONNEES DES NPO POINTS DE L'ELT - M(IAREF): C TABLEAU DES REFERENCES SUR L'ELT. CALL CLNOPO(M,M,IAN2E,IAN4E,IA5E,NCGE,NDSDE,NNO,M(IANOE), + NPO,M(IAPOI),XM(IACOO),M(IAREF)) C ON TRAITE LE CAS D'UNE SURFACE DANS R³. IF ((NCGE.NE.3).AND.(NCGE.NE.4)) STOP'*** ERREUR COONOE : SEUL & EST IMPLEMENTE LE CAS D''UNE SURFACE DANS R³ ***' C C TEST LE NUMERO DE SOUS DOMAINE DE L'ELEMENT: C NTYP=1 => DROIT -- NTYP=2 => COURBE -- NTYP=0 => AUTRE CALL TYPEL(NDSDE,NREFP1,REFP1,NREFP2,REFP2,NTYP) IF (NTYP.EQ.0) GOTO 10 C C TRAITEMENT SUIVANT QUE L'ELT EST TRIANGLE OU QUADRANGLE GOTO (100,200) NCGE-2 STOP'*** ERREUR COONOE : SEUL EST IMPLEMENTE LE CAS D''UNE SURFACE & DANS R³ ***' C C CAS D'UN TRIANGLE C ----------------- 100 CONTINUE IF (IMPRE.GT.5) WRITE(IMPRIM,1001)'L''ELT No', IE,' EST UN', & ' TRIANGLE DE TYPE ',NTYP NES=NES+1 IF (NTYP.EQ.1) GOTO 115 C CALCUL DES COORDONNEES DES NOEUDS AJOUTES DO 110 IARET=1,3 C POSITION DANS LE TAB XM(IACOO) DES COORDONNES DES SOMMETS IACOS1 = IACOO+(IARET-1)*3 IACOS2 = IACOO+(IPT(IARET)-1)*3 C POSITION DANS LE TAB XNOE(IANOE) DES COORDONNEES DU NOEUD IANOE = 1 + (IARET-1)*3 C RECHERCHE DE LA REFERENCE DE L'ARETE: LORS DE L'APPEL DE CLNOPO LES C REFERENCES SONT RETOURNES DANS LE TABLEAU M(IAREF) DANS L'ORDRE SVT: C REF. DES SOMMETS PUIS DES ARETES ET ENFIN DES FACES (AVEC DES 0 SI PAS C DE REFERENCE) NREFA = M(IAREF+2+IARET) CALL CALCOO(NTYP,NDSDE,NREFA,XM(IACOS1),XM(IACOS2),XNOE(IANOE)) CC VOIR POUR GESTION DYNAMIQUE DE XNOE 110 CONTINUE IF (IMPRE.GT.5) THEN WRITE(IMPRIM,*)' TRIANGLE - ELT ',NES WRITE(IMPRIM,*)' COOR. DES SOMMETS:',(XM(IACOO+I),I=0,8) WRITE(IMPRIM,*)' COOR. DES NOEUDS :',(XNOE(I),I=1,9) ENDIF C C - REMPLISSAGE DES TABLEAUX NOP4 & NOP5 DE LA SDS C 115 CONTINUE C CODE GEOMETRIQUE: 3 = TRIANGLE IA5S=IA5S+1 M(IA5S) = 3 C NMAE: NB DE MOTS NEC. AU STOCKAGE DES REF. DES ARETES (ON NE LES STOCKE PAS) IA5S=IA5S+1 M(IA5S) = 0 C NUMERO DU SOUS DOMAINE DE L'ELT (1=TRIANGLE DROIT - 2=TRIANGLE ISOPARAM.) IA5S=IA5S+1 M(IA5S) = NTYP C NOMBRE DE NOEUDS DE L'ELT IF (NTYP.EQ.1) NNO=3 IF (NTYP.EQ.2) NNO=6 IA5S=IA5S+1 M(IA5S) = NNO C NUNEROS DES POINTS DO 120 INO=1,3 IA5S=IA5S+1 M(IA5S)=M(IAPOI+INO-1) 120 CONTINUE IF (NTYP.EQ.1) GOTO 10 C CAS ELT P2 : DES NOEUDS SONT AJOUTES C NUNEROS DES NOEUDS DO 130 INO=4,NNO IA5S=IA5S+1 NUMNOE=NUMNOE+1 M(IA5S)=NUMNOE 130 CONTINUE C STOCKE LES COORDONNEES DES NOEUDS DANS NOP4 DO 140 I=1,9 IA4S=IA4S+1 XM(IA4S)=XNOE(I) 140 CONTINUE GOTO 10 C C CAS D'UN QUADRANGLE : C ------------------- C DIVISION DU QUADRANGLE EN 2 TRIANGLES SVT LA DIAGONALE S1--S3 200 CONTINUE IF (IMPRE.GT.5) WRITE(IMPRIM,1001)'L''ELT No', IE,' EST UN', & ' QUADRANGLE DE TYPE',NTYP NES=NES+2 IF (NTYP.EQ.1) GOTO 215 DO 210 IARET=1,4 C POSITION DANS LE TAB XM(IACOO) DES COORDONNES DES SOMMETS IACOS1 = IACOO+(IARET-1)*3 IACOS2 = IACOO+(IPQ(IARET)-1)*3 C POSITION DANS LE TAB XNOE(IANOE) DES COORDONNES DU NOEUD IANOE = 1 + (IARET-1)*3 C RECHERCHE DE LA REFERENCE DE L'ARETE: LORS DE L'APPEL DE CLNOPO LES C REFERENCES SONT RETOURNES DANS LE TABLEAU M(IAREF) DANS L'ORDRE SVT: C REF. DES SOMMETS PUIS DES ARETES ET ENFIN DES FACES (AVEC DES 0 SI PAS C DE REFERENCE) NREFA = M(IAREF+3+IARET) CALL CALCOO(NTYP,NDSDE,NREFA,XM(IACOS1),XM(IACOS2),XNOE(IANOE)) CC VOIR POUR GESTION DYNAMIQUE DE XNOE 210 CONTINUE C CALCUL DES COORDONNEES DU NOEUD S9 NOEUD DE L'ARETE S1--S3 IACOS1 = IACOO IACOS2 = IACOO+6 IANOE = 13 NREFA = 0 CALL CALCOO(NTYP,NDSDE,NREFA,XM(IACOS1),XM(IACOS2),XNOE(IANOE)) C C - REMPLISSAGE DES TABLEAUX NOP4 & NOP5 DE LA SDS C 215 CONTINUE C C --- 1ER TRIANGLE: S1-S2-S3 (+ NOEUDS S5-S6-S9) C ---------------- IF (IMPRE.GT.5) THEN WRITE(IMPRIM,*)' 1ER TRIANGLE - ELT',NES-1 WRITE(IMPRIM,*)' COOR. DES SOMMETS:',(XM(IACOO+I),I=0,8) WRITE(IMPRIM,*)' COOR. DES NOEUDS :',(XNOE(I),I=1,6), & (XNOE(I),I=13,15) ENDIF C CODE GEOMETRIQUE: 3 = TRIANGLE IA5S=IA5S+1 M(IA5S) = 3 C NMAE: NB DE MOTS NEC. AU STOCKAGE DES REF. DES ARETES (ON NE LES STOCKE PAS) IA5S=IA5S+1 M(IA5S) = 0 C NUMERO DU SOUS DOMAINE DE L'ELT (1=TRIANGLE DROIT - 2=TRIANGLE ISOPARAM.) IA5S=IA5S+1 M(IA5S) = NTYP C NOMBRE DE NOEUDS DE L'ELT IF (NTYP.EQ.1) NNO=3 IF (NTYP.EQ.2) NNO=6 IA5S=IA5S+1 M(IA5S) = NNO C NUNEROS DES POINTS: S1-S2-S3 EN NUM. LOCALE --> LES NUMEROS GLOBAUX EXISTENT DEJA DO 220 INO=1,3 IA5S=IA5S+1 M(IA5S)=M(IAPOI+INO-1) 220 CONTINUE IF (NTYP.EQ.1) GOTO 250 C CAS ELT P2 : DES NOEUDS SONT AJOUTES C NUNEROS DES NOEUDS: S5-S6-S9 EN NUM. LOCALE --> ON CREE DES NUMEROS GLOBAUX DO 230 INO=4,NNO IA5S=IA5S+1 NUMNOE=NUMNOE+1 M(IA5S)=NUMNOE 230 CONTINUE NUMS9=NUMNOE C C STOCKE LES COORDONNEES DES NOEUDS S5-S6-S9 DANS NOP4 C DO 240 I=1,6 IA4S=IA4S+1 XM(IA4S)=XNOE(I) 240 CONTINUE DO 241 I=1,3 IA4S=IA4S+1 XM(IA4S)=XNOE(12+I) 241 CONTINUE C C --- 2EME TRIANGLE: S1-S3-S4 (+ NOEUDS S9-S7-S8) C ---------------- 250 IF (IMPRE.GT.5) THEN WRITE(IMPRIM,*)' 2EME TRIANGLE - ELT',NES WRITE(IMPRIM,*)' COORD. DES SOMMETS:',(XM(IACOO+I),I=0,2), & (XM(IACOO+I),I=6,11) WRITE(IMPRIM,*)' COORD. DES NOEUDS :',(XNOE(I),I=13,15), & (XNOE(I),I=7,12) ENDIF C CODE GEOMETRIQUE: 3 = TRIANGLE IA5S=IA5S+1 M(IA5S) = 3 C NMAE: NB DE MOTS NEC. AU STOCKAGE DES REF. DES ARETES (ON NE LES STOCKE PAS) IA5S=IA5S+1 M(IA5S) = 0 C NUMERO DU SOUS DOMAINE DE L'ELT (1=TRIANGLE DROIT - 2=TRIANGLE ISOPARAM.) IA5S=IA5S+1 M(IA5S) = NTYP C NOMBRE DE NOEUDS DE L'ELT IF (NTYP.EQ.1) NNO=3 IF (NTYP.EQ.2) NNO=6 IA5S=IA5S+1 M(IA5S) = NNO C NUNEROS DES POINTS: S1-S3-S4 EN NUM. LOCALE --> LES NUMEROS GLOBAUX EXISTENT DEJA IA5S=IA5S+1 M(IA5S)=M(IAPOI) IA5S=IA5S+1 M(IA5S)=M(IAPOI+2) IA5S=IA5S+1 M(IA5S)=M(IAPOI+3) IF (NTYP.EQ.1) GOTO 10 C CAS ELT P2 : DES NOEUDS SONT AJOUTES C NUNEROS DES NOEUDS: S9-S7-S8 EN NUM. LOCALE --> ON CREE DES NUMEROS GLOBAUX C ATTENTION S9 A DEJA UN NUMERO C NOEUD S9 IA5S=IA5S+1 M(IA5S)=NUMS9 C NOEUDS S7-S DO 260 I=1,2 IA5S=IA5S+1 NUMNOE=NUMNOE+1 M(IA5S)=NUMNOE 260 CONTINUE C C STOCKE LES COORDONNEES DES NOEUDS S7-S8 DANS NOP4 C DO 270 I=7,12 IA4S=IA4S+1 XM(IA4S)=XNOE(I) 270 CONTINUE C ELEMENT SUIVANT 10 CONTINUE C IF (IMPRE.EQ.10) WRITE(IMPRIM,*)'MODIFICATION DU TABLEAU NOP2' C C ------------------------------------------------------- C --- MODIFICATION DU TABLEAU NOP2 DE LA SDS --- C ------------------------------------------------------- IAN2S = M(ICS + 8 ) M(IAN2S+1) = 0 M(IAN2S+2) = NREFP1+NREFP2 M(IAN2S+3) = 1 M(IAN2S+4) = NES M(IAN2S+5) = 0 M(IAN2S+6) = 0 M(IAN2S+7) = NES DO 610 I=8,12 610 M(IAN2S+I) = 0 M(IAN2S+13) = 0 M(IAN2S+14) = NUMNOE M(IAN2S+15) = 1 DO 611 I=16,20 611 M(IAN2S+I) = 0 M(IAN2S+21) = NUMNOE M(IAN2S+22) = 2 C --- CALCUL DE LPGDN --- M(IAN2S+23) = LPGDN(M(IAN5S),NES,1) M(IAN2S+24) = 0 C LG DU TABLEAU NOP5 M(IAN2S+25) = IA5S-IAN5S+1 M(IAN2S+26) = 1 IF (IMPRE.EQ.10) THEN WRITE(IMPRIM,1000)'IMPRESSION DU TABLEAU NOP2' DO 620 I=0,26 620 WRITE(IMPRIM,*) 'NOP2(',I+1,') : ',M(IAN2S+I) c WRITE(IMPRIM,1000)'IMPRESSION DU TABLEAU NOP4' IA=IAN4S-1 DO 621 I=1,NUMNOE WRITE(IMPRIM,*) 'POINT ',I,' : ',(XM(IA+J),J=1,3) 621 IA=IA+3 c WRITE(IMPRIM,1000)'IMPRESSION DU TABLEAU NOP5' IA=IAN5S-1 DO 622 I=1,NES WRITE(IMPRIM,*) 'ELT ',I,'NOP5(1 a 4) : ',(M(IA+J),J=1,4) IA=IA+4 WRITE(IMPRIM,*)'NOEUDS:',(M(IA+J),J=1,6) 622 IA=IA+6 ENDIF CALL TUER('XCOO',M) CALL TUER('AUX ',M) CALL TUER('NREF',M) C C ------------------------------------------------------- C --- SAUVEGARDE DE LA S.D.S. NOPO --- C ------------------------------------------------------- C IF (IMPRE.EQ.10) WRITE(IMPRIM,*)'SAUVEGARDE DE LA S.D.S. NOPO -', & ' TABLEAU NZNOPO =',NZNOPO C C NMENOP: NOMBRE DE MOTS TRANSFERES SUR LE FICHIER NFSDS CALL INICSD(M,'NOPO',NIS,NZNOPO,19,NCS,ICS) CALL SDSAUV(M,'NOPO',NFS,NIS,NZNOPO,19,NCS,ICS, + NMENOP) C C 1000 FORMAT(1X,78('*')/,A /,1X,78('*')) 1001 FORMAT(1X,/ 5('*'),A,I,A,A,I,1X,5('*') /) END