exelch
C EXELCH SOURCE PV090527 23/02/02 23:09:15 11579 * * EXTRAIRE LE OU LES ELEMENTS SUPPORTS DU MAXI OU DU MINI DES VALEURS * COMPOSANTES D'UN CHAMP/ELEMENT * ************************************************************************ * ENTREES : * * IPCHEL =POINTEUR SUR UN MCHAML * IMM = 1 MAXI , 2 MINI , 3 A 9 LES AUTRES * IAB = 0 VALEURS ALGEBRIQUES ,1 VALEURS ABSOLUES * IAV = 1 LES NOMS DE LA LISTMOTS SONT CONSIDERES, * 2 ILS SONT EXCLUS * ILAST = 1 STRICTEMENT (Tous les PTS de Gauss doivent respecter la condition) * = 2 LARGEMENT (Un seul PT de Gauss doit respecter la condition) * IPLIS = POINTEUR SUR UN LISTMOTS * VALREF = VALEUR POUR FAIRE LES COMPARAISONS * VALRE2 = IDEM POUR OPTION 'COMPRIS' * * SORTIES : * * IPMAIL = POINTEUR SUR OBJET MAILLAGE CONTENANT LE OU LES ELEMENTS * SUPPORTS DU MAXI OU DU MINI OU SATISFAISANT LES TESTS * PAR RAPPORT A VALREF * * P DOWLATYARI OCT 91 ************************************************************************ & IPMAIL) IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC CCREEL -INC SMCHAML -INC SMELEME -INC SMLMOTS SEGMENT QUELCO INTEGER ICO(NSOUS,NCOMX),NNCO(NSOUS),IMEL(NSOUS) ENDSEGMENT SEGMENT MMEL INTEGER NELC,LELC(NBELC) ENDSEGMENT SEGMENT MESH INTEGER LMAIL(NMAIL,3+NSOUS) ENDSEGMENT LOGICAL BOOL1 CHARACTER*(LOCOMP) MOCOMP logical suffi * INITIALISATIONS suffi=.false. IPMAIL = 0 * IMAIL = 0 QUELCO = 0 MESH = 0 * VERIFICATIONS D'USAGE (normalement inutiles) : IF (IMM.LT.1 .OR. IMM.GT.9) THEN write(ioimp,*) 'EXELCH IMM =',IMM RETURN ENDIF IF (IAB.LT.0 .OR. IAB.GT.1) THEN write(ioimp,*) 'EXELCH IAB =',IAB RETURN ENDIF IF (IAV.LT.1 .OR. IAV.GT.2) THEN write(ioimp,*) 'EXELCH IAV =',IAV RETURN ENDIF IF (ILAST.LT.1 .OR. ILAST.GT.2) THEN write(ioimp,*) 'EXELCH ILAST =',ILAST RETURN ENDIF * ON RECUPERE LE CHAMP PAR ELEMENT * MCHELM = IPCHEL SEGACT,MCHELM NSOUS = mchelm.IMACHE(/1) * MCHAML vide -> Maillage vide en sortie IF (NSOUS.EQ.0) GOTO 90 * ON CHERCHE LE NOMBRE MAXIMAL DE COMPOSANTES * NCOMX = 0 DO 10 ISOUS = 1, NSOUS mchaml = mchelm.ICHAML(ISOUS) SEGACT,mchaml NCOMX = MAX(NCOMX,mchaml.NOMCHE(/2)) 10 CONTINUE * MCHAML sans composante -> Maillage vide en sortie IF (NCOMX.EQ.0) GOTO 90 SEGINI,QUELCO * Remplissage de QUELCO qui indique les composantes a prendre en compte * sur chaque sous-zone * Par defaut, on prend toutes les composantes, sauf si la listmots est * fournie, et dans ce cas, on conserve ou on exclut les composantes. * IF (IPLIS.NE.0) THEN mlmots = IPLIS SEGACT,mlmots ENDIF NZERO = NSOUS DO 20 ISOUS = 1, NSOUS MELEME = mchelm.IMACHE(ISOUS) MCHAML = mchelm.ICHAML(ISOUS) NCOMP = mchaml.NOMCHE(/2) IF (IPLIS.EQ.0) THEN DO ICOMP = 1, NCOMP quelco.ICO(ISOUS,ICOMP) = 1 ENDDO NCO = NCOMP ELSE NCO = 0 DO ICOMP = 1, NCOMP MOCOMP = mchaml.NOMCHE(ICOMP) igco = 0 IF (IAV.EQ.1) THEN IF (IX.NE.0) igco = 1 ELSE IF (IX.EQ.0) igco = 1 ENDIF quelco.ICO(ISOUS,ICOMP) = igco NCO = NCO + igco ENDDO ENDIF quelco.NNCO(ISOUS) = NCO IF (NCO.NE.0) THEN c* On verifie si MELEME n'a pas deja ete rencontre dans les sous-zones c* precedentes... mmel = 0 DO ISZ = ISOUS-1, 1, -1 IF (meleme.EQ.mchelm.IMACHE(ISZ)) THEN mmel = -ABS(quelco.IMEL(ISZ)) ENDIF ENDDO IF (mmel.EQ.0) THEN SEGACT,meleme NBELC = meleme.NUM(/2) SEGINI,mmel ENDIF ELSE mmel = 0 NZERO = NZERO - 1 ENDIF quelco.IMEL(ISOUS) = mmel 20 CONTINUE * Cas particulier ou aucune composante n'est a traiter -> Maillage Vide IF (NZERO.EQ.0) GOTO 90 * RECHERCHE DU MAXI OU MINI ( IMM = 1 OU 2 ) * IF (IMM.LE.2) THEN IF (IMM.EQ.1) THEN IF (IAB.EQ.0) THEN XEXT = -XGRAND ELSE XEXT = XZERO ENDIF ELSE XEXT = XGRAND ENDIF DO 30 ISOUS = 1, NSOUS IF (quelco.NNCO(ISOUS).EQ.0) GOTO 30 MCHAML = mchelm.ICHAML(ISOUS) NCOMP = mchaml.NOMCHE(/2) DO 310 ICOMP = 1, NCOMP IF (quelco.ICO(ISOUS,ICOMP).EQ.0) GOTO 310 melval = mchaml.IELVAL(ICOMP) SEGACT,melval NBPTEL = melval.VELCHE(/1) NEL = melval.VELCHE(/2) DO IB = 1, NEL DO IGAU = 1,NBPTEL XX = melval.VELCHE(IGAU,IB) IF (IAB.EQ.1) XX = ABS(XX) IF (IMM.EQ.1) THEN XEXT = MAX(XX,XEXT) ELSE XEXT = MIN(XX,XEXT) ENDIF ENDDO ENDDO 310 CONTINUE 30 CONTINUE ENDIF * BOUCLE SUR LES SOUS-ZONES POUR TROUVER LES POINTS SUPPORTS * DO 40 ISOUS = 1, NSOUS IF (quelco.NNCO(ISOUS).EQ.0) GOTO 40 mmel = ABS(quelco.IMEL(ISOUS)) * segact,mmel NBELC = mmel.LELC(/1) c* Si NELC = NBELC c'est que tous les elements du maillage sont deja c* pris auparavant (meleme commun a plusieurs sous-zones) donc on c* ne poursuit plus le traitement pour cette sous-zone... IF (mmel.NELC.EQ.NBELC) GOTO 40 MCHAML = mchelm.ICHAML(ISOUS) NCOMP = mchaml.NOMCHE(/2) DO 410 ICOMP = 1, NCOMP IF (quelco.ICO(ISOUS,ICOMP).EQ.0) GOTO 410 c* Si NELC = NBELC c'est que tous les elements sont deja pris pour c* les precedentes composantes de cette sous-zone... IF (mmel.NELC.EQ.NBELC) GOTO 40 melval = mchaml.IELVAL(ICOMP) SEGACT,melval NBPTEL = melval.VELCHE(/1) NEL = melval.VELCHE(/2) c* Normalement : NEL = 1 ou NEL = NBELC (a verifier ?) DO 420 IB = 1, NBELC C* Si l'element a deja ete retenu, ce n'est pas la peine de continuer... IF (mmel.LELC(IB).EQ.1) GOTO 420 * si mini/maxi strict un element suffit if (suffi) goto 420 IBMN = MIN(IB,NEL) igco = 0 DO 430 IGAU = 1, NBPTEL XX = melval.VELCHE(IGAU,IBMN) IF (IAB.EQ.1) XX = ABS(XX) * TRI SELON LA VALEUR DE IMM GOTO (21,21,23,24,25,26,27,28,29),IMM c* Erreur ne devant pas arriver normalement (voir test au debut) GOTO 9000 * MAXI OU MINI 21 BOOL1 = (XX.EQ.XEXT) GOTO 425 * SUPE 23 BOOL1 = (XX.GT.VALREF) GOTO 425 * EGSUPE 24 BOOL1 = (XX.GE.VALREF) GOTO 425 * EGAL 25 BOOL1 = (XX.EQ.VALREF) GOTO 425 * EGINFE 26 BOOL1 = (XX.LE.VALREF) GOTO 425 * INFE 27 BOOL1 = (XX.LT.VALREF) GOTO 425 * DIFF 28 BOOL1 = (XX.NE.VALREF) GOTO 425 * COMP 29 BOOL1 = (XX.GE.VALREF) .AND. (XX.LE.VALRE2) GOTO 425 * 425 CONTINUE IF (BOOL1) THEN * si strict et mini ou maxi, on ne rend qu'un seul element if (imm.le.2.and.ilast.eq.1) suffi = .true. igco = igco + 1 C On prend l'element au premier rencontre car LARG IF (ILAST.EQ.2.or.suffi) GOTO 435 ELSE C On change d''element si 'STRI' IF (ILAST.EQ.1.and.imm.gt.2) GOTO 420 ENDIF 430 CONTINUE 435 IF (igco.GT.0) THEN mmel.LELC(IB) = 1 mmel.NELC = mmel.NELC + 1 ENDIF 420 CONTINUE 410 CONTINUE 40 CONTINUE 41 CONTINUE C* Il faut maintenant construire le maillage correspondant : NMAIL = NSOUS SEGINI,MESH IMAIL = 0 DO 500 ISOUS = 1, NSOUS mmel = quelco.IMEL(ISOUS) IF (mmel.LE.0) GOTO 500 * segact,mmel IF (mmel.NELC.EQ.0) GOTO 500 ipt1 = mchelm.IMACHE(ISOUS) * segact,ipt1 ity1 = ipt1.ITYPEL nbn1 = ipt1.NUM(/1) DO im = 1, IMAIL IF (ity1.EQ.mesh.LMAIL(im,1) .AND. & nbn1.EQ.mesh.LMAIL(im,2)) THEN C* Le 2e test sert dans le cas particulier des elements SURE pour C* lesquels itypel=48 mais le nombre de noeuds variables ! IMSH = im GOTO 510 ENDIF ENDDO IMAIL = IMAIL + 1 IMSH = IMAIL mesh.LMAIL(IMSH,1) = ity1 mesh.LMAIL(IMSH,2) = nbn1 mesh.LMAIL(IMSH,3) = 0 510 CONTINUE mesh.LMAIL(IMSH,3+ISOUS) = mesh.LMAIL(IMSH,3) + 1 mesh.LMAIL(IMSH,3) = mesh.LMAIL(IMSH,3) + mmel.NELC 500 CONTINUE * * Cas particulier : le maillage resultat est vide 90 CONTINUE IF (IMAIL.EQ.0) THEN NBNN = 0 NBELEM = 0 NBSOUS = 0 NBREF = 0 SEGINI,meleme meleme.ITYPEL = 0 ELSE IF (IMAIL.GT.1)THEN NBNN = 0 NBELEM = 0 NBSOUS = IMAIL NBREF = 0 SEGINI,meleme ENDIF DO 600 IMSH = 1, IMAIL NBNN = mesh.LMAIL(IMSH,2) NBELEM = mesh.LMAIL(IMSH,3) NBSOUS = 0 NBREF = 0 SEGINI,ipt3 ipt3.ITYPEL = mesh.LMAIL(IMSH,1) js = 0 jm = 0 DO 610 ISOUS = 1, NSOUS im = mesh.LMAIL(IMSH,3+ISOUS) IF (im.EQ.0) GOTO 610 im = im - 1 ipt2 = mchelm.IMACHE(ISOUS) NBEL2 = ipt2.NUM(/2) mmel = quelco.IMEL(ISOUS) c* Quelques tests de verification/debogage au cas ou : if (mmel.LE.0) then write(ioimp,*) 'exelch : err 610 mmel',mmel,isous,imsh endif nbnn2 = ipt2.NUM(/1) if (nbnn2.NE.nbnn) then write(ioimp,*) 'exelch : err 610 nbnn',nbnn2,nbnn,isous,imsh endif nbelc = mmel.LELC(/1) if (NBEL2.NE.nbelc) then write(ioimp,*) 'exelch : err 610 nbel',nbelc,nbel2,isous,imsh endif js = js + 1 DO 620 IB = 1, NBEL2 IF (mmel.LELC(IB).EQ.0) GOTO 620 im = im + 1 jm = jm + 1 DO igau = 1, NBNN ipt3.NUM(igau,im) = ipt2.NUM(igau,IB) ENDDO ipt3.ICOLOR(im) = ipt2.ICOLOR(IB) 620 CONTINUE 610 CONTINUE if (jm.ne.NBELEM) then write(ioimp,*) 'exelch : incoherence jm',jm,nbelem,imsh endif IF (js.GT.1) THEN iordre=0 IF (IPT1.NE.IPT3) SEGSUP,ipt3 c* if (ipt1.eq.0) then c* write(ioimp,*) 'exelch : maillage vide',imsh c* endif ELSE ipt1 = ipt3 ENDIF IF (IMAIL.GT.1) THEN meleme.LISOUS(IMSH) = ipt1 ENDIF 600 CONTINUE IF (IMAIL.EQ.1) meleme = ipt1 ENDIF IPMAIL = meleme IF (mesh.NE.0) SEGSUP,mesh 9000 CONTINUE DO ISOUS = 1, NSOUS meleme = mchelm.IMACHE(ISOUS) mchaml = mchelm.ICHAML(ISOUS) mmel = quelco.IMEL(ISOUS) IF (mmel.GT.0) SEGSUP,mmel ENDDO IF (quelco.NE.0) SEGSUP,quelco END
© Cast3M 2003 - Tous droits réservés.
Mentions légales