testma
C TESTMA SOURCE PV 20/03/30 21:25:08 10567 *______________________________________________________________________ * * test sur les maillages * * entrees : * --------- * ipche chamelem dont il faut vérifier le maillage (type mchaml) * imel maillage du modèle: sert de référence (type meleme) * Maillage actif en Entree (?) et en Sortie (oui) * cond vrai si il faut tenir compte de const * const nom de constituant * * * sortie : * -------- * iret chamelem réordonné si nécessaire * = 0 si pb * imodi =1 il a fallu decouper le maillage imel * *______________________________________________________________________ * * declarations * IMPLICIT REAL*8(A-H,O-Z) IMPLICIT INTEGER(I-N) * -INC PPARAM -INC CCOPTIO * -INC SMCHAML -INC SMELEME -INC SMCOORD -INC SMINTE * SEGMENT ICPR(NPT) SEGMENT ICPEL(ICPELD) SEGMENT ITRAV(NNNT) SEGMENT NIMEL(NNNT) SEGMENT IPERM(NNNT) SEGMENT NZONE(NSOUS) * SEGMENT ITRA INTEGER ICC (IA),IRE(IA,IMA) ENDSEGMENT * SEGMENT WTRAV REAL*8 QSIREF(NBPGAU),QSICHAM(NBPGAU),ETAREF(NBPGAU) REAL*8 ETACHAM(NBPGAU),DZEREF(NBPGAU),DZECHAM(NBPGAU) REAL*8 XECHAM(3,NP1),XEREF(3,NP1) INTEGER TABOK(NBPGAU),TAB(NBPGAU) ENDSEGMENT LOGICAL INIT,COND CHARACTER*(*) CONST * * executable * NPT = nbpts ICPR = 0 ICPEL = 0 * IRET = 0 IMODI = 0 * IPT1 = IMEL SEGACT IPT1 NBSOU1=IPT1.LISOUS(/1) * La routine ne travaille qu'avec un maillage elementaire IF ( NBSOU1 .GT. 1) THEN C SEGDES,IPT1 RETURN ENDIF MELEME = IPT1 * * champ servant à stocker provisoirement le resultat * MCHELM = IPCHE SEGACT MCHELM SEGINI,MCHEL1=MCHELM * * segment servant a stocker l'ordre de stockage dans mchel1 NS01=0 NSOUS=ICHAML(/1) SEGINI NZONE * * creation de wtrav : on l'ajustera ensuite si necessaire * mais on sort la creation destruction de la boucle * la definition doit etre coherente avec celle dans tabgau nbpgau=0 np1=0 wtrav=0 segini wtrav * * boucle conditionnelle sur les sous zones du maillage imel * IBOU1 = 0 * SEGINI ICPR 1 CONTINUE IBOU1 = IBOU1 + 1 * * Initialisations de ICPR, ICPEL la premiere fois puis * remises a zero pour les fois suivantes faite apres 2 * IF (NBSOU1.NE.0) THEN MELEME = IPT1.LISOUS(IBOU1) ENDIF SEGACT MELEME * * nnnt :nb d'elements de imel pour la sous zone consideree * NNNT=NUM(/2) * IA=0 IMA=0 * * fabrication de icpel qui dira combien de fois un point apparait * de icpr qui donne une numerotation locale * DO J=1,NNNT DO 3 K=1,NUM(/1) ID=NUM(K,J) IF(ICPR(ID).NE.0) GO TO 3 * numerotation locale IA=IA+1 ICPR(ID)=IA 3 CONTINUE enddo ICPELD=IA IF(ICPEL.EQ.0) THEN SEGINI ICPEL ELSE IF(ICPELD.GT.ICPEL(/1)) SEGADJ ICPEL call ooozmr(icpel(1),icpeld) ENDIF DO J=1,NNNT DO K=1,NUM(/1) ID=NUM(K,J) ICPEL(ICPR(ID))=ICPEL(ICPR(ID))+1 * on retient le max des occurences des points IMA=MAX(ICPEL(ICPR(ID)),IMA) enddo enddo * * fabrication de itra : * icc donne le nombre d'elements a partir du numero local * ire donne les numeros d'elements de imel * a partir du numero local et de l'occurence * SEGINI ITRA DO J=1,NNNT DO K=1,NUM(/1) ID=ICPR(NUM(K,J)) ICC(ID)=ICC(ID)+1 IA=ICC(ID) IRE(ID,IA)=J enddo enddo * * il faut maintenant regarder si dans un imache il existe * les elements de la sous zone du meleme imel * boucle sur les sous zone du chamelem * IFLAG=0 * initialisons ipt2 IPT2=-1 DO 10 I=1,ICHAML(/1) IF (COND) THEN IF (CONCHE(I) .NE. CONST) GOTO 10 ENDIF MCHAML=ICHAML(I) IPT2 =IMACHE(I) IF (IPT2 .EQ. MELEME) THEN IFLAG=1 NS01=NS01+1 IF(NS01 .GT. ICHAML(/1))THEN N1=NS01 N3=INFCHE(/2) L1=TITCHE(/1) SEGADJ,MCHEL1 DO N33=1,N3 MCHEL1.INFCHE(NS01,N33)=MCHEL1.INFCHE(I,N33) ENDDO ENDIF NSOUS=NSOUS+1 SEGADJ,NZONE NZONE(NS01)=I MCHEL1.ICHAML(NS01)=MCHEL1.ICHAML(I) MCHEL1.IMACHE(NS01)=MELEME MCHEL1.CONCHE(NS01)=MCHEL1.CONCHE(I) GOTO 10 ENDIF SEGACT,MELEME,IPT2 IF(ITYPEL.NE.IPT2.ITYPEL) GO TO 11 * SEGINI ICOM * INIT=.FALSE. * ICO=0 NP1=IPT2.NUM(/1) DO 12 K=1,IPT2.NUM(/2) DO 13 L=1,NP1 ID=IPT2.NUM(L,K) IDD = ICPR(ID) IF(IDD.EQ.0) GO TO 12 13 CONTINUE * * ok l'element k possede ses noeuds dans imel * IF(ITYPEL.EQ.1) THEN ID=IPT2.NUM(1,K) IDD=ICPR(ID) IRE1=IRE(IDD,1) GOTO 20 ENDIF * * ces noeuds correspondent-t-ils a un meme element ire1 * ID = IPT2.NUM(1,K) IDD=ICPR(ID) IDE=ICC(IDD) c boucle sur les occurences de idd dans les elements DO 14 L=1,IDE IRE1=IRE(IDD,L) DO 15 M=2,NP1 IDD2=ICPR(IPT2.NUM(M,K)) IF(IDD2.EQ.0) GO TO 12 IDE2=ICC(IDD2) DO 16 N=1,IDE2 IF(IRE(IDD2,N).EQ.IRE1) GO TO 15 16 CONTINUE GO TO 14 15 CONTINUE GOTO 20 14 CONTINUE * * l'element n'appartient pas a meleme GOTO 12 * * itrav donne le numero de l'element dans le chamelem * nimel donne le numero de l'element dans la sous zone * de imel cbp IPERM = 0 si pas de permutation des noeuds * 20 CONTINUE c IF(.NOT.INIT) THEN INIT=.TRUE. SEGINI ITRAV SEGINI NIMEL SEGINI IPERM ENDIF ICO=ICO+1 IF (ICO .GT. NNNT) THEN RETURN ENDIF ITRAV(ICO)=K NIMEL(ICO)=IRE1 ICOM(IRE1)=1 IPERM(ICO)=0 do iii=1,NP1 if(IPT2.NUM(iii,K).ne.NUM(iii,IRE1)) then IPERM(ICO)=iii goto 12 endif enddo 12 CONTINUE * IF(INIT) THEN * * le nb d'elements est-il egal pour la sous zone imel et * la sous zone mchaml * IF (ICO.EQ.NNNT) THEN IFLAG=1 NS01=NS01+1 IF(NS01 .GT. ICHAML(/1))THEN N1=NS01 N3=INFCHE(/2) L1=TITCHE(/1) SEGADJ,MCHEL1 DO N33=1,N3 MCHEL1.INFCHE(NS01,N33)=MCHEL1.INFCHE(I,N33) ENDDO ENDIF NSOUS=NSOUS+1 SEGADJ,NZONE NZONE(NS01)=I MINTE=INFCHE(I,4) IPMINT=MINTE IF (IPMINT.NE.0) SEGACT,MINTE MCHAML=ICHAML(I) SEGINI,MCHAM1=MCHAML MCHEL1.ICHAML(NS01)=MCHAM1 MCHEL1.IMACHE(NS01)=MELEME MCHEL1.CONCHE(NS01)=MCHEL1.CONCHE(I) * DO 24 ICOMP=1,MCHAM1.IELVAL(/1) MELVAL=MCHAM1.IELVAL(ICOMP) SEGACT MELVAL IMEM=0 IF (MCHAM1.TYPCHE(ICOMP).EQ.'REAL*8') THEN N1PTEL=VELCHE(/1) N1EL=ICO IF (VELCHE(/2).EQ.1) THEN N1EL=1 IMEM=1 ENDIF NEL=N1EL N2PTEL=0 N2EL =0 ELSE N2PTEL=IELCHE(/1) N2EL=ICO IF (IELCHE(/2).EQ.1) THEN N2EL=1 IMEM=1 ENDIF NEL=N2EL N1PTEL=0 N1EL =0 ENDIF * SEGINI MELVA1 * DO 21 J=1,NEL K =ITRAV(J) IRE1=NIMEL(J) KTEST=K ITEST=IRE1 IF (NEL.EQ.1) THEN IRE1=1 IF (IMEM.EQ.1) THEN K=1 ENDIF ENDIF * * dans le cas des champs qui ne sont pas définis aux noeuds * vérification de la bonne orientation des maillages * sinon création d'un tableau de correspondance * NBPGAU=MAX(N1PTEL,N2PTEL) cbp -cas ou l'on doit identifier la position des pts d'integration cbp (ne marche pas avec des coques epaisses MFR=5, cbp ni avec DKT dont nombre de points >1 dans l'épaisseur) IF((IPMINT.NE.0).and.(IPERM(J).ne.0)) THEN if (qsiref(/1).ne.nbpgau .or. & xeref(/2).ne.np1) then segadj,wtrav endif + IPT2,NBPGAU,IRET1,wtrav) IF (IRET1.EQ.0) THEN SEGSUP MCHEL1,ITRA C if (imel.ne.ipt2) SEGDES IPT2 C if (imel.ne.meleme) segdes meleme GOTO 900 ENDIF IF (N1PTEL.EQ.0) THEN DO 22 IGAU=1,N2PTEL IGAU1=TAB(IGAU) MELVA1.IELCHE(IGAU,IRE1)=IELCHE(IGAU1,K) 22 CONTINUE ELSE DO 23 IGAU=1,N1PTEL IGAU1=TAB(IGAU) MELVA1.VELCHE(IGAU,IRE1)=VELCHE(IGAU1,K) 23 CONTINUE ENDIF cbp -cas ou on recopie directement sans chercher la permutation ELSE IF (N1PTEL.EQ.0) THEN DO 25 IGAU=1,N2PTEL MELVA1.IELCHE(IGAU,IRE1)=IELCHE(IGAU,K) 25 CONTINUE ELSE DO 26 IGAU=1,N1PTEL MELVA1.VELCHE(IGAU,IRE1)=VELCHE(IGAU,K) 26 CONTINUE ENDIF ENDIF * 21 CONTINUE MCHAM1.IELVAL(ICOMP)=MELVA1 C SEGDES MELVA1,MELVAL 24 CONTINUE C SEGDES MCHAM1,MCHAML SEGSUP ITRAV,NIMEL,IPERM ELSE * * le maillage est a cheval sur plusieurs sous zones * du mchaml * il va falloir scinder le maillage en deux * et recommencer le processus * IMODI = 1 * creation des deux maillages dont l'union est le maillage meleme NBNN = NUM(/1) NBELEM = ICO NBREF = 0 NBSOUS = 0 SEGINI IPT3 NBELEM = NUM(/2) - ICO IF (NBELEM.LE.0) THEN GOTO 900 ENDIF SEGINI IPT4 IPT3.ITYPEL = ITYPEL IPT4.ITYPEL = ITYPEL I3 = 0 I4 = 0 DO 45 II=1,NUM(/2) IF (ICOM(II) .EQ. 1) THEN * l'element est commun aux deux maillages I3=I3+1 IPT3.ICOLOR(I3)=ICOLOR(II) DO 43 JJ=1,NUM(/1) IPT3.NUM(JJ,I3)=NUM(JJ,II) 43 CONTINUE ELSE * l'element appartient seulement a meleme I4=I4+1 IPT4.ICOLOR(I4)=ICOLOR(II) DO 44 JJ=1,NUM(/1) IPT4.NUM(JJ,I4)=NUM(JJ,II) 44 CONTINUE ENDIF 45 CONTINUE * * modification de ipt1 * IF (IPT1.LISOUS(/1) .LE. 1) THEN NBSOUS=2 NBREF =0 NBELEM=0 NBNN =0 SEGINI IPT5 IPT5.LISOUS(1)=IPT3 IPT5.LISOUS(2)=IPT4 C if (imel.ne.ipt1) SEGDES IPT1 IPT1=IPT5 ELSE NBSOUS=IPT1.LISOUS(/1)+1 NBREF =0 NBELEM=0 NBNN =0 SEGADJ,IPT1 IPT1.LISOUS(IBOU1) =IPT3 IPT1.LISOUS(NBSOUS)=IPT4 C if (imel.ne.meleme) SEGDES MELEME ENDIF IBOU1 =IBOU1-1 NBSOU1=NBSOUS SEGSUP ITRAV,NIMEL,IPERM GOTO 2 ENDIF ENDIF SEGSUP ICOM 11 CONTINUE C if (imel.ne.ipt2) SEGDES IPT2 10 CONTINUE * * on n'a pas trouve de sous zone dans le mchaml qui * correspondent a une sous zone de imel * IF (IFLAG.EQ.0) THEN C if (imel.ne.meleme) segdes meleme SEGSUP MCHEL1 IF(IPT2.LE.0) THEN SEGSUP,ITRA ELSE C if (imel.ne.ipt2) SEGDES IPT2 MOTERR(1:8)='MAILLAGE' MOTERR(9:16)='MCHAML' ENDIF GOTO 900 ELSE SEGSUP,ITRA C if (imel.ne.meleme) segdes meleme C if (imel.ne.ipt2) SEGDES IPT2 ENDIF 2 continue if (ibou1.lt.nbsou1) then * remise a zero de icpr DO J=1,NNNT DO K=1,NUM(/1) ID=NUM(K,J) ICPR(ID)=0 enddo enddo goto 1 endif * * fin de la boucle sur les sous zones du maillage * IF(NS01.NE.NSOUS) THEN N1=NS01 N3=MCHEL1.INFCHE(/2) L1=MCHEL1.TITCHE(/1) SEGINI MCHEL2 MCHEL2.TITCHE=TITCHE MCHEL2.IFOCHE=IFOCHE DO 31 ISOUS=1,NS01 MCHEL2.ICHAML(ISOUS) = MCHEL1.ICHAML(ISOUS) MCHEL2.IMACHE(ISOUS) = MCHEL1.IMACHE(ISOUS) MCHEL2.CONCHE(ISOUS) = MCHEL1.CONCHE(ISOUS) NSS=NZONE(ISOUS) DO 33 N33=1,N3 MCHEL2.INFCHE(ISOUS,N33) = MCHEL1.INFCHE(NSS,N33) 33 CONTINUE 31 CONTINUE SEGSUP MCHEL1 MCHEL1=MCHEL2 ENDIF C SEGDES,MCHEL1 IRET=MCHEL1 900 CONTINUE C SEGDES MCHELM SEGSUP,ICPR,ICPEL,NZONE,WTRAV END
© Cast3M 2003 - Tous droits réservés.
Mentions légales