raft
C RAFT SOURCE GOUNAND 24/10/08 21:15:06 12025 SUBROUTINE RAFT C ********************************************************************** C INTERFACE CASTEM 2000 C C SURF2 = RAFT (CHPO1) SURF1 ; C C C OBJET : C _______ C C L'OPERATEUR RAFT RAFINE UN MAILLAGE TRIANGULAIRE (OBJET SURF1) C POUR RESPECTER UNE CARTE DE TAILLEW DONNEE (OBJET CHPO1). LES ELEM- C ENTS SONT DES TRIANGLES LINEAIRES QUELLES QUE SOIENT LES DIRECTIVES C D'OPTION. C C C DATE : 03.05.96 / 03.04.97 C ______ C C AUTEURS : O. STAB C _________ C C C ********************************************************************** IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C -INC PPARAM -INC CCOPTIO -INC SMELEME -INC SMCOORD -INC CCGEOME -INC SMCHPOI SEGMENT ITRAVX INTEGER ITVL (ITOTAI) ENDSEGMENT SEGMENT RTRAV REAL*8 RTVL ( ITOTAR) ENDSEGMENT SEGMENT ICPR (nbpts) SEGMENT ICPP (nbpts) SEGMENT IRADEC REAL*8 RADEC (MRIADEC) ENDSEGMENT DIMENSION IADEC(1) LOGICAL LQUAD C elimination de l'external TC C INTEGER D2CHPO C EXTERNAL D2CHPO INTEGER NRIADC,NITMAX,NRTMAX,NPONEW,IERRDS C --- VARIABLES INTERNES --- INTEGER NBN,NBE,IDIMC,NBNMAX,NBCMAX,IDE,NPOMAX,NBEMAX,ITRNOE INTEGER ITRTRI,NOETRI,ITRAV,IRTRAV,NITMX2,NRTMX2,ICOORD INTEGER I,NCC,NOEMAX C CALL DSINIT IERRDS = 0 C ======================= C --- 1.LECTURE DES DONNEES --- C ======================= C * LECTURE DES OBJETS COURANTS (ENTREES) * ===================================== IF(IDIM.NE.2) THEN INTERR(1)=IDIM C FONCTION INDISPONIBLE EN DIMENSION %I1 GOTO 999 ENDIF C IF(IERR.NE.0) THEN C ON A PAS TROUVE LE MAILLAGE GOTO 999 ENDIF C C SEGACT IPT1 IF (IPT1.LISOUS(/1).NE.0) THEN GOTO 999 ENDIF NBE = IPT1.NUM(/2) NBEINI = NBE NBNTOT = -1 IF(IRETOU.NE.0) THEN IF( IVAL.LT.NBE )THEN C Le nombre de noeuds ne peut ètre inférieur à %i1 C (nombre d'éléments) INTERR(1) = NBE SEGDES IPT1 GOTO 999 ENDIF NBNTOT = IVAL ENDIF 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 IF(NTYP.NE.4) THEN C DONNEES INCOMPATIBLES GOTO 999 ENDIF * * LECTURE DU CHAMPS DE DENSITE * ============================ * IF(IRETOU.EQ.0)THEN C ON A PAS TROUVE LE CHAMPS DE POINTS PCHPOI = 0 ELSE PCHPOI = 1 ENDIF C C ---- VERIFICATION DU CHPOINT ---- IF( PCHPOI.EQ.1)THEN SEGACT MCHPO1 MSOUP1 = MCHPO1.IPCHP(1) SEGACT MSOUP1 IF( MCHPO1.IPCHP(/1).GT.1)THEN C IL Y A PLUS D'UN CHAMP PAR POINT LEQUEL CHOISIR ? SEGDES IPT1,MCHPO1,MSOUP1 GOTO 999 ENDIF C MPOVA1 = MSOUP1.IPOVAL SEGACT MPOVA1 IF( MPOVA1.VPOCHA(/2).NE.1 )THEN C Il y a plus d'une valeur par point ?! SEGDES IPT1,MCHPO1,MSOUP1,MPOVA1 GOTO 999 ENDIF SEGDES MCHPO1,MSOUP1,MPOVA1 ENDIF C ---- FIN VERIFICATION DU CHPOINT ---- * * * ALLOCATION DE LA MEMOIRE * ===================================== * * * * ===================================== IDIMC = IDIM NBNMAX = 3 NBCMAX = NBNMAX NBADET = 50 C ICMEMO = 1 NBNINI = 0 C C --- POUR TESTER LES MESSAGE D'ERREUR ET LA REALLOCATION : NBNREL = (10 * NBEINI ) / 2 NBNABS = 40000 5 CONTINUE NBNREL = 7 * (NBEINI / 2) IF( NBNINI.NE.0 )NBNREL = 7 * NBNINI IF(NBNTOT.NE.-1) THEN NPOMAX = NBNTOT*ICMEMO + NBADET ELSE NPOMAX = MAX(NBNREL,NBNABS)*ICMEMO + NBADET ENDIF NBEMAX = MAX((14*NBEINI),(2*NBNABS)) * ICMEMO C 6 CONTINUE C C NITMAX = 20 * NPOMAX + 288 + 310 C NRTMAX = 12 * (NPOMAX + 12) C NITMAX = (NBNMAX+NBCMAX)*NBEMAX + > NPOMAX + > MAX(7*NPOMAX , 6*NBADET+10) + 288 C C ITRNOE,ITRTRI, NOETRI,ITRAV (MAX SMAOCR,R2RAF) C C NRTMAX = (IDIMC*NPOMAX) + > NBEMAX + > 2*NBEMAX + > (IDIMC*NBEMAX) + > (IDIMC*NPOMAX) + 224 C C ICOORD, RADEC, ? , ITRAV (SPHERES+COORD) C C * * TRANSFERT DANS LA STRUCTURE DE L'ALGO * ===================================== * ICOORD = 1 ITRNOE = 1 IDE = 2 NCC = 1 C --- INITIALISATION EN CAS DE REALLOCATION --- NBE = NBEINI * * REMPLISSAGE DU TABLEAU DE CONNEXION * =================================== SEGACT IPT1 ITOTAI= NITMAX SEGINI ITRAVX segact mcoord*mod NBANC = nbpts SEGINI,ICPR,ICPP ITOTAR = NRTMAX SEGINI RTRAV MRIADEC = NPOMAX SEGINI IRADEC INO = 0 DO 7765 I=1,NBE DO 7764 J=1,NBNMAX IA = IPT1.NUM(J,I) IF( ICPR(IA).EQ.0 ) THEN INO = INO+1 ICPR(IA) = INO ICPP(INO)= IA DO 7763 K=1,IDIMC RTVL((INO-1)*IDIMC+K+ICOORD-1)= > XCOOR((IA-1)*(IDIM+1)+K) 7763 CONTINUE C --- PAR DEFAUT : LA DENSITE PONCTUELLE --- RADEC(INO) = XCOOR(IA*(IDIM+1)) ENDIF ITVL((I-1)*NBNMAX +J+ITRNOE-1) = ICPR(IA) 7764 CONTINUE 7765 CONTINUE NBN = INO NBNINI = INO SEGDES IPT1 C C ON A LE NOMBRE EXACT DE NOEUDS DANS LE MAILLAGE C NPONEW=NPOMAX-NBN IF( NPONEW.LE.0 )THEN IF( NBNTOT.NE.-1)THEN C Le nombre de noeuds ne peut ètre inférieur à %i1 C (nombre de noeuds existants) INTERR(1) = NBN SEGSUP ITRAVX,RTRAV,IRADEC,ICPR,ICPP GOTO 999 ENDIF NPOMAX = 5 * NBN SEGSUP ITRAVX,RTRAV,IRADEC,ICPR,ICPP C Patience on reprend avec plus de mémoire... GOTO 6 ENDIF * IF(PCHPOI.EQ.1)THEN * * TRANSFERT DE LA DENSITE * ----------------------- SEGACT MCHPO1,MSOUP1,MPOVA1 * LECTURE DU MAILLAGE ASSOCIE AU CHPOINT IPT2 = MSOUP1.IGEOC SEGACT IPT2 C SEGINI IRADEC NRIADC = MPOVA1.VPOCHA(/1) * JNO=0 DO 8000 I=1,NRIADC * ------- LECTURE DE L'ANCIEN NUMERO --------- IA = IPT2.NUM(1,I) * ------- NOUVEAU NUMERO -------- INO = ICPR(IA) IF((INO.LT.1).OR.(INO.GT.NRIADC))THEN * SEGDES MCHPO1,MSOUP1,MPOVA1,IPT2 * SEGSUP ITRAVX,RTRAV,IRADEC,ICPR,ICPP *C La densité (CHPOINT) doit ètre définie sur LE maillage donné. * CALL ERREUR(843) * GOTO 999 ELSE JNO=JNO+1 RADEC(INO) = MPOVA1.VPOCHA(I,1) ENDIF 8000 CONTINUE IF( JNO.NE.NBN )THEN SEGDES MCHPO1,MSOUP1,MPOVA1 SEGSUP ITRAVX,RTRAV,IRADEC,ICPR,ICPP C La densité (CHPOINT) doit ètre définie sur LE maillage donné. GOTO 999 ENDIF SEGDES MCHPO1,MSOUP1,MPOVA1,IPT2 ELSE * -------------------------------------------------- * PAS DE CHPOINT => ON VERIFIE QUE LA DENSITE DONNEE C PAR RADEC(INO) = XCOORD(IA,3) EST ACCEPTABLE * -------------------------------------------------- NRIADC = NBNINI DO 8001 INO=1,NBNINI IF( RADEC(INO).LE.0 )GOTO 8002 8001 CONTINUE GOTO 8004 8002 NRIADC = 0 8004 CONTINUE ENDIF * C ======================= C --- 1.1. ALLOCATION --- C ======================= C C ITRTRI = ITRNOE + (NBEMAX * NBNMAX) NOETRI = ITRTRI + (NBEMAX * NBCMAX) ITRAV = NOETRI + NPOMAX NITMX2 = NITMAX - ITRAV IRTRAV = NPOMAX * IDIMC + 1 NRTMX2 = NRTMAX - IRTRAV NOEMAX = NPOMAX C C ========================================= C --- 2. CREATION DE LA STRUCTURE DE DONNEES --- C ========================================= C * > NBN,IDIMC, > ITVL(ITRNOE),NBNMAX,ITVL(ITRTRI), > NBCMAX,ITVL(NOETRI),NOEMAX, > ITVL(ITRAV),NITMX2,NCC,IERRDS) C IF( IERRDS.NE.0 )THEN IF( IERRDS.EQ.-2 )THEN SEGSUP ITRAVX,RTRAV,IRADEC,ICPR,ICPP ICMEMO = ICMEMO + 1 IERRDS = 0 GOTO 5 ENDIF C Maillage incorrect ?!!! SEGSUP ITRAVX,RTRAV,IRADEC,ICPR,ICPP GOTO 999 ENDIF C C ================================== C --- 3. GENERATION DES NOEUDS ET C INSERTION DANS LA TRIANGULATION --- C ================================== C NITMX2 = NITMAX - ITRAV IRTRAV = NPOMAX * IDIMC + 1 NRTMX2 = NRTMAX - IRTRAV NOEMAX = NPOMAX C IF( NRIADC.EQ. 0 )THEN C ======================== C --- RAFFINEMENT PAR DEFAUT --- C ======================== * > ITVL(NOETRI),NOEMAX, > RTVL(ICOORD),NBN,NBE,NPOMAX,NBEMAX, > ITVL(ITRAV),NITMX2,RTVL(IRTRAV),NRTMX2, > IERRDS) ELSE C ======================== C --- RAFFINEMENT ITERATIF --- C ======================== C C CALL R2CPO(D2CHPO,IADEC,RADEC, modif TC > ITVL(ITRNOE),NBNMAX, > ITVL(ITRTRI),NBCMAX, > ITVL(NOETRI),NOEMAX, > RTVL(ICOORD),IDIMC,NBN,NBE,NPOMAX,NBEMAX, > ITVL(ITRAV),NITMX2,RTVL(IRTRAV),NRTMX2, > NBENEW,IERRDS) ENDIF C 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 SEGSUP ITRAVX,RTRAV,IRADEC,ICPR,ICPP ICMEMO = ICMEMO + 1 C Patience on reprend avec plus de mémoire... IERRDS = 0 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 C * * REMPLISSAGE NOUVEL OBJET MAILLAGE ET TABLEAU DES COORDONNEES * ============================================================ 40 CONTINUE NBELEM=NBE NBNN=3 NBREF=0 NBSOUS=0 SEGINI MELEME NBPTS = NBN-NBNINI+NBANC SEGADJ MCOORD DO 7781 I=1,NBN-NBNINI XCOOR((NBANC +I-1)*(IDIM+1) +1) = RTVL((NBNINI+I-1)*IDIMC+1) XCOOR((NBANC +I-1)*(IDIM+1) +2) = RTVL((NBNINI+I-1)*IDIMC+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)*NBNMAX +J-1+ITRNOE) C IF ( IA .LE.NBNINI) THEN IB = ICPP(IA) ELSE IB = IA -NBNINI +NBANC ENDIF NUM(J,I)=IB 7783 CONTINUE ICOLOR(I) = IDCOUL 7782 CONTINUE ITYPEL=4 SEGDES MELEME SEGSUP ITRAVX,RTRAV,IRADEC,ICPR,ICPP IPT2=MELEME * 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