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