kcha2
C KCHA2 SOURCE CB215821 20/11/25 13:30:54 10792 C C----------------------------------------------------------------------- C Transforme un MCHAML constant par élément en un CHPO de support CENTRE C----------------------------------------------------------------------- C C-------------------- C Paramètres Entrée : C-------------------- C C IPCHE : pointeur sur le champ par élément C Le champ n'a qu'une composante reelle C C IPGEOM : pointeur sur le maillage quaf ou de base (issu de la table domaine). C IPCENT : pointeur sur le maillage des points centres C (issu de la table domaine). C C------------------- C Paramètre Sortie : C------------------- C C IRET : pointeur sur le CHPO de support centre C C----------------------------------------------------------------------- C C Subroutine appelée par KCHA. C C----------------------------------------------------------------------- IMPLICIT INTEGER(I-N) IMPLICIT REAL*8 (A-H,O-Z) C C -INC PPARAM -INC CCOPTIO -INC SMCHAML -INC SMCHPOI -INC SMELEME SEGMENT ITRA * LTAB(IE,IP) : indice dans le chpocentre du point IE de la partition IP INTEGER LTAB(NBELM,NPAR) ENDSEGMENT SEGMENT JTRA * JTAB(IZ) : indice dans le chpocentre de départ des points pour le sous-maillage IZ * ZTAB(IP) : nb de noeuds de la partition IP * ITAB(IP) : pointeur sur sous-zone identifiée à la partition IP * KTAB(IP) : nb d'éléments de cette sous-zone * OTAB(IP) : numéro d'ordre de cette sous-zone dans IPGEOM INTEGER JTAB(NBS),ZTAB(NPAR) INTEGER ITAB(NPAR),KTAB(NPAR),OTAB(NPAR) ENDSEGMENT SEGMENT KTRA * MTAB(IC) : nom de la composante IC du chamelem * NTAB(IC,IP) : numéro, dans chaque partition IP, de la * sous-partition ayant pour composante la composante * IC de la première partition CHARACTER*(LOCOMP) MTAB(MCOM) INTEGER NTAB(NC,NPAR) ENDSEGMENT SEGMENT KSIPP INTEGER ISPT(NBEL3) ENDSEGMENT * * NBS : nombre de sous-zones du maillage * IPT1 = IPGEOM SEGACT IPT1 NBO = IPT1.LISOUS(/1) IF(NBO.EQ.0) THEN NBS = 1 ELSE NBS = NBO ENDIF * * NPAR : nombre de partitions du chamelem * MCHELM = IPCHE SEGACT MCHELM NPAR = IMACHE(/1) * * NBELM : nombre maximal d'éléments parmi toutes les partitions * NBELM = 0 DO IP =1,NPAR IPT2 = IMACHE(IP) SEGACT IPT2 NP = IPT2.NUM(/1) * IF(NBEL.GT.NBELM) THEN * NBELM = NBEL * ENDIF SEGACT IPT2 ENDDO * * Initialisation des segments de travail * SEGINI ITRA SEGINI JTRA IF(NBO.EQ.0) THEN JTAB(1)=0 ENDIF DO IO=2,NBS IPT3 = IPT1.LISOUS(IO-1) SEGACT IPT3 NB = IPT3.NUM(/2) JTAB(IO)= JTAB(IO-1) + NB SEGACT IPT3 ENDDO * * Correspondance des maillages des partitions du chamelem * avec les sous-maillages du maillage * * Test des nombres de noeuds par éléments DO IP=1,NPAR * pour chaque partition IP IPT2 = IMACHE(IP) SEGACT IPT2 NP = IPT2.NUM(/1) ZTAB(IP)= IPT2.NUM(/2) DO IZ=1,NBS * pour chaque sous-maillage IZ IF(NBO.EQ.0)THEN IPT3 = IPT1 ELSE IPT3 = IPT1.LISOUS(IZ) SEGACT IPT3 ENDIF NP3 = IPT3.NUM(/1) IF(NP.EQ.NP3) THEN C On a trouve 2 sous-maillages ayant le meme nbre de noeuds C pour qu'ils puissent correspondre, ils doivent avoir 1 C element commun NBEL3=IPT3.NUM(/2) ITEST=0 DO 30 I0=1,NP I1=IPT2.NUM(I0,1) DO 15 I3=1,NP3 ITEST=ITEST+1 GO TO 25 ENDIF 15 CONTINUE 20 CONTINUE 25 CONTINUE 30 CONTINUE IF(ITEST.EQ.NP)THEN ITAB(IP)=IPT3 KTAB(IP)=IPT3.NUM(/2) OTAB(IP)=IZ IF(NBO.GT.0)THEN SEGACT IPT3 ENDIF GO TO 3 ENDIF ENDIF ENDDO C On n'a pas trouvé, dans un CHAMELEM, de zone géométrique ou de C constituant correspondant à l'objet MODELE RETURN 3 CONTINUE SEGACT IPT2 ENDDO * Test des numéros de noeud C les tests qui suivent sont extremement long pour un gros maillage C on va affecter a chaque element un poids egal a la somme des numeros C de ses noeuds et on ne comparera les numeros de noeuds que pour les C elements qui auront le meme poids. DO IP =1,NPAR IPT2 = IMACHE(IP) SEGACT IPT2 IPT4 = ITAB(IP) SEGACT IPT4 NBEL2 = ZTAB(IP) NBEL3 = KTAB(IP) NP = IPT2.NUM(/1) C SEGINI KSIPP DO JE=1,NBEL3 ISP2=0 DO JP=1,NP ISP2=ISP2+IPT4.NUM(JP,JE) ENDDO ISPT(JE)=ISP2 ENDDO C DO IE = 1,NBEL2 IP1 = IPT2.NUM(1,IE) ISP1=0 DO II=1,NP ISP1= ISP1+IPT2.NUM(II,IE) ENDDO DO JE = 1,NBEL3 IF(ISPT(JE).EQ.ISP1) THEN DO JP=1,NP IP2=IPT4.NUM(JP,JE) IF(IP2.EQ.IP1) THEN ITEST = 1 JEP = JEE / NP JEE = JEE - JEP * NP IF(JEE.EQ.0)THEN JEE = NP ENDIF KJ = IPT4.NUM(JEE,JE) IF(KJ.EQ.KI) THEN ITEST=ITEST+1 ELSE GO TO 4 ENDIF ENDDO IF(ITEST.EQ.NP) THEN LTAB(IE,IP)=JE+JTAB(OTAB(IP)) GO TO 5 ENDIF 4 CONTINUE ENDIF ENDDO ENDIF ENDDO C On n'a pas trouvé, dans un CHAMELEM, de zone géométrique ou de C constituant correspondant à l'objet MODELE RETURN 5 CONTINUE ENDDO SEGACT IPT2, IPT4 SEGSUP KSIPP ENDDO * * NOMBRE DE COMPOSANTES MAXI PAR PARTITION * NC = 0 DO IP =1,NPAR MCHAML = ICHAML(IP) SEGACT MCHAML DO IT = 1,TYPCHE(/2) IF(TYPCHE(IT)(1:8).EQ.'POINTEUR') THEN c Problème non prévu dans le s.p. %m1:8 contactez votre assistance MOTERR(1:8) = 'KCHA2 ' RETURN ENDIF ENDDO IC = MCHAML.IELVAL(/1) NC = MAX(IC,NC) * IF(IC.GT.NC) THEN * NC = IC * ENDIF SEGACT MCHAML ENDDO MCOM = NC * Préparation du champ-point à plusieurs composantes SEGINI KTRA MCHAML = ICHAML(1) SEGACT MCHAML MC = MCHAML.IELVAL(/1) DO IC =1,MC MTAB(IC)=NOMCHE(IC) NTAB(IC,1)=IC ENDDO SEGACT MCHAML K=MC DO IP=2,NPAR MCHAML = ICHAML(IP) SEGACT MCHAML MC = MCHAML.IELVAL(/1) DO IC=1,MC DO JC=1,K IF(NOMCHE(IC).EQ.MTAB(JC))THEN NTAB(IC,IP)=JC GO TO 10 ENDIF ENDDO K = K+1 IF(MCOM.LT.K) THEN MCOM = K SEGADJ KTRA ENDIF MTAB(K)=NOMCHE(IC) NTAB(IC,IP)=K 10 CONTINUE ENDDO SEGACT MCHAML ENDDO * * Construction du champ-point * NSOUPO = 1 NAT = 2 SEGINI MCHPOI MTYPOI = ' ' MOCHDE = 'KCHA FECIT' JATTRI(1) = 2 NC = MCOM SEGINI MSOUPO IPCHP(1) = MSOUPO IPT5 = IPCENT SEGACT IPT5 N = IPT5.NUM(/2) SEGACT IPT5 SEGINI MPOVAL IPOVAL = MPOVAL IGEOC = IPCENT IFOPOI = IFOCHE DO IC=1,MCOM NOCOMP(IC)=MTAB(IC) *** NOHARN(IC)=INTAB(IC) *** REVOIR NHARM ENDDO DO IP=1,NPAR MCHAML= ICHAML(IP) SEGACT MCHAML N2 = MCHAML.IELVAL(/1) IPT4 = ITAB(IP) SEGACT IPT4 MEL = ZTAB(IP) DO II=1,N2 IC = NTAB(II,IP) MELVAL = MCHAML.IELVAL(II) SEGACT MELVAL NPT = VELCHE(/1) NEL = VELCHE(/2) IF(NPT.EQ.1 .AND. NEL.EQ.1) THEN * constance sur la sous-zone DO IE = 1,MEL JP = LTAB(IE,IP) VPOCHA(JP,IC) = VELCHE(1,1) ENDDO ENDIF IF(NPT.EQ.1 .AND. NEL.NE.1) THEN * cas classique DO IE = 1,MEL JP = LTAB(IE,IP) VPOCHA(JP,IC) = VELCHE(1,IE) ENDDO ENDIF IF(NPT.NE.1 .AND. NEL.NE.1) THEN * on n'a pas un chamelem aux centres * on fait la moyenne sur les valeurs aux différents points DO IE = 1,MEL JP = LTAB(IE,IP) VAL = 0.D0 ENDDO VAL = VAL / NPT VPOCHA(JP,IC) = VAL ENDDO ENDIF SEGACT MELVAL ENDDO SEGACT MCHAML, IPT4 ENDDO * * Fermeture des segments * SEGACT MPOVAL SEGACT MSOUPO SEGACT MCHPOI SEGACT IPT1 SEGACT MCHELM SEGSUP ITRA,JTRA,KTRA IRET = MCHPOI RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales