topv3
C TOPV3 SOURCE GOUNAND 21/04/06 21:15:34 10940
* On préférerait KEXTO à la place de TRAVK mais KEXTO n'est pas autoporteur.
*ijob SUBROUTINE TOPV3(TRAVK,KELEM,IJOB,TRAVL,ICBES
*kelemx SUBROUTINE TOPV3(TRAVK,KELEM,IAJNO,TRAVL,INCMA,ISTMA,
$ JNASCM,ICBES,IPOPL2,iveri,impr)
IMPLICIT REAL*8 (A-H,O-Z)
IMPLICIT INTEGER (I-N)
C***********************************************************************
C NOM : TOPV3
C DESCRIPTION :
*
* Génération des topologies candidates (stockage dans LMCANS indexé
* par LIDXCA) Issue de topv2_nettoie_final.eso
*
C
C
C LANGAGE : ESOPE
C AUTEUR : Stéphane GOUNAND (CEA/DEN/DM2S/SFME/LTMF)
C mél : gounand@semt2.smts.cea.fr
C***********************************************************************
C VERSION : v1, 09/11/2017, version initiale
C HISTORIQUE : v1, 09/11/2017, création
C HISTORIQUE :
C HISTORIQUE :
C***********************************************************************
-INC PPARAM
-INC CCOPTIO
*-INC TMATOP2
-INC CCREEL
-INC SMELEME
* POINTEUR KELEM.MELEME
POINTEUR KEXTO.MELEME
POINTEUR IBTLOC.MELEME
POINTEUR IPBTL2.MELEME
POINTEUR KTBES.MELEME
POINTEUR KTBES2.MELEME
POINTEUR IMCAND.MELEME
-INC TMATOP1
*-INC SMELEMX
POINTEUR LMCANS.MELEMX
POINTEUR IPBTL.MELEMX
POINTEUR KELEMX.MELEMX
-INC SMLENTI
POINTEUR KNNO.MLENTI
POINTEUR LIDXCA.MLENTI
* POINTEUR LOKVOL.MLENTI
* POINTEUR LNQUAL.MLENTI
* POINTEUR LINDI.MLENTI
* POINTEUR LINDJ.MLENTI
-INC SMLREEL
* POINTEUR IQUAL.MLREEL
* POINTEUR LQUALS.MLREEL
-INC SMCOORD
*-INC STRAVJ
POINTEUR TRAVK.TRAVJ
*-INC STRAVL
*
LOGICAL LOK
LOGICAL LTOIBO
LOGICAL LTOIBA
LOGICAL LLIMCA
INTEGER JCAND
LOGICAL LCHANG
LOGICAL LCHTOP
* Liste de topologies de maillages candidates
* SEGMENT ITCAND(0)
* Liste de topologies de maillages candidats de plus petit volume non nul
* SEGMENT ITVOL(JG)
* Liste de topologies de maillages candidats de plus petit volume
* et de meilleure qualité
* SEGMENT ILQUAL(JG)
* SEGMENT ILIND(JG)
* SEGMENT JLIND(JG)
*
* Executable statements
*
* WRITE(IOIMP,*) 'coucou topv3'
* IDIMP1=IDIM+1
KEXTO=TRAVK.TOPO
KPVIRT=TRAVK.PVIRT
*
LMCANS=TRAVL.MCANS
LIDXCA=TRAVL.IDXCA
* LOKVOL=TRAVL.OKVOL
* LQUALS=TRAVL.QUALS
* LNQUAL=TRAVL.NQUAL
* LINDI=TRAVL.INDI
* LINDJ=TRAVL.INDJ
IPBTL=TRAVL.PBTL
* Les noeud S et S' de Gruau p.42
*kelemx IARET=KELEM.NUM(/1)
IARET=KELEMX.NNCOU
*
* IS=KELEM.NUM(1,1)
IS=KELEMX.NUMX(1,1)
ISP=0
IS3=0
IS4=0
*kelemx IF (IARET.EQ.2) ISP=KELEM.NUM(2,1)
*kelemx IF (IARET.EQ.3) IS3=KELEM.NUM(3,1)
*kelemx IF (IARET.EQ.4) IS4=KELEM.NUM(4,1)
IF (IARET.EQ.2) ISP=KELEMX.NUMX(2,1)
IF (IARET.EQ.3) IS3=KELEMX.NUMX(3,1)
IF (IARET.EQ.4) IS4=KELEMX.NUMX(4,1)
*
* Le premier candidat est toujours l'original qui n'est pas forcément un étoilement
*anc SEGINI ITCAND
* ITCAND(**)=KEXTO
*
NCCOUO=TRAVL.NCCOU
NLCOUO=LMCANS.NLCOU
NNC=NCCOUO+1
* NNL=NLCOUO+KEXTO.NUM(/2)
NNL=NLCOUO+TRAVK.NVCOU
if (ierr.ne.0) return
IDX=LIDXCA.LECT(NNC)
* DO IEL=1,KEXTO.NUM(/2)
DO IEL=1,TRAVK.NVCOU
DO INO=1,KEXTO.NUM(/1)
LMCANS.NUMX(INO,IDX)=KEXTO.NUM(INO,IEL)
ENDDO
IDX=IDX+1
ENDDO
LIDXCA.LECT(NNC+1)=IDX
ICBES=1
if (iveri.ge.2) then
if (ierr.ne.0) return
endif
* Extraction du bord (contour ou enveloppe)
* write(ioimp,*) 'Avant extraction bord'
IF (IDIM.EQ.2) THEN
c$$$* call ecmai1(kexto,0)
c$$$ CALL ECRCHA('NOID')
c$$$ CALL ECRCHA('TOUT')
c$$$ CALL ECROBJ('MAILLAGE',KEXTO)
c$$$ CALL PRCONT
c$$$ CALL LIROBJ('MAILLAGE',IBTLOC,1,IRET)
c$$$ IF (IERR.NE.0) RETURN
c$$$ SEGACT KEXTO*MOD
c$$$ SEGACT IBTLOC
c$$$* prcont le passe en SEGACT non *MOD ce qui pose ensuite problème à
c$$$* baryc4.eso
c$$$ SEGACT MCOORD*MOD
*
IELDEB=1
IELFIN=TRAVK.NVCOU
ICPR=0
IDCP=0
NPLOC=TRAVK.NPCOU
* ITYCON=1
ITYCON=3
INOID=1
* CALL CONTOO(KEXTO,IELDEB,IELFIN,ICPR,IDCP,NPLOC,ITYCON,INOID
* $ ,IBTLOC)
$ ,IBTLOC)
IF (IERR.NE.0) RETURN
SEGACT IBTLOC
ELSEIF (IDIM.EQ.3) THEN
*
IELDEB=1
IELFIN=TRAVK.NVCOU
ICLE=0
INOID=1
IF (IERR.NE.0) RETURN
ELSE
* 709 2
*Fonction indisponible en dimension %i1.
INTERR(1)=IDIM
ENDIF
IF (IERR.NE.0) RETURN
* WRITE(IOIMP,*) 'KEXTO'
* CALL ECMAI1(kexto,0)
if (impr.ge.4) then
write(ioimp,*) 'KPVIRT=',KPVIRT
write(ioimp,*) 'Apres extraction bord IBTLOC=',IBTLOC
WRITE(IOIMP,*) 'IBTLOC'
SEGACT IBTLOC
endif
*
* On supprimme la référence au contour car on supprimme le contour
* après...
* Pas utile ici car on est en numérotation locale pour KEXTO...
*
NLBTL=IBTLOC.NUM(/2)
* Il arrive quelquefois que la topologie locale n'ait pas de bord
IF (NLBTL.GT.0) THEN
* Si la topologie locale n'a qu'un seul élément, il n'est pas nécessaire
* de l'étoiler
NLTLOC=TRAVK.NVCOU
*
LTOIBO=(NLTLOC.GT.1)
*ijob LTOIBA=(IJOB.EQ.1.OR.IJOB.EQ.2)
LTOIBA=(IAJNO.EQ.1)
* Si on doit etoiler, on contruit le maillage des points du bord
* = chan IBTLOC 'POI1'
* on applique ici une méthode locale en O(n^2) ce qui suppose que IBTLOC
* n'a pas trop de points...
IF (LTOIBO.OR.LTOIBA) THEN
KNNO=TRAVK.NNO
NBELEM=IBTLOC.NUM(/2)
* WRITE(IOIMP,*) 'NBELEM=',NBELEM
* IF (NBELEM.GT.100) THEN
* WRITE(IOIMP,*) 'KEXTO'
* CALL ECMAI1(KEXTO,0)
* SEGACT KEXTO
* WRITE(IOIMP,*) 'IBTLOC'
* CALL ECMAI1(IBTLOC,0)
* SEGACT IBTLOC
* STOP 16
* ENDIF
NBNN=IBTLOC.NUM(/1)
IK=0
DO IBELEM=1,NBELEM
DO IBNN=1,NBNN
INO=IBTLOC.NUM(IBNN,IBELEM)
if (ino.eq.0) then
write(ioimp,*) 'Noeud nul détecté !!!!'
WRITE(IOIMP,*) 'KEXTO'
WRITE(IOIMP,*) 'IBTLOC'
goto 9999
endif
IF (KNNO.LECT(INO).EQ.0) THEN
IK=IK+1
KNNO.LECT(INO)=IK
ENDIF
ENDDO
ENDDO
if (ierr.ne.0) return
if (iveri.ge.2) then
if (ierr.ne.0) return
endif
* On regarde également si IS ou ISP font partie du bord
IS2=IS
ISP2=ISP
IS32=IS3
IS42=IS4
DO IIPO=1,TRAVK.NPCOU
* DO IIPO=1,IPO(/1)
INLOC=KNNO.LECT(IIPO)
IF (INLOC.NE.0) THEN
IPBTL.NUMX(1,INLOC)=IIPO
IF (IS2.EQ.IIPO) IS2=0
IF (ISP2.EQ.IIPO) ISP2=0
IF (IS32.EQ.IIPO) IS32=0
IF (IS42.EQ.IIPO) IS42=0
* Nettoyage de KNNO
KNNO.LECT(IIPO)=0
ENDIF
ENDDO
* Vérification du nettoyage de KNNO
if (iveri.ge.2) then
$ 'topv3 : Apres creation points du bord')
if (ierr.ne.0) return
endif
IF (IVERI.GE.2.and..false.) THEN
* à corriger pour le nouveau ipbtl en melemx
IPBTL2=IBTLOC
SEGACT IBTLOC
IF (IERR.NE.0) RETURN
SEGACT IPBTL
SEGACT MCOORD*MOD
IF (IPT3.NE.0) THEN
WRITE(IOIMP,*) 'IPT3 pour IPBTL'
IF (IERR.NE.0) RETURN
WRITE(IOIMP,*) 'NEL1=',IPBTL.NLCOU
SEGACT IPBTL2
WRITE(IOIMP,*) 'NEL2=',IPBTL2.NUM(/2)
RETURN
ENDIF
ENDIF
* On étoile à partir des éléments du bord
* SEGACT en trop ? On est méfiant...
* SEGACT IBTLOC
IF (LTOIBO) THEN
* On étoile à partir de S ou S' s'ils ne font pas partie du bord
DO IBIS=1,4
IF (IBIS.EQ.1) THEN
NODE=IS2
MOTERR(1:4)='IS2 '
ELSEIF (IBIS.EQ.2) THEN
NODE=ISP2
MOTERR(1:4)='ISP2'
ELSEIF (IBIS.EQ.3) THEN
NODE=IS32
MOTERR(1:4)='IS32'
ELSEIF (IBIS.EQ.4) THEN
NODE=IS42
MOTERR(1:4)='IS42'
ELSE
write(ioimp,*) 'pb boucle ibis'
goto 9999
ENDIF
IF (NODE.NE.0) THEN
*
IF (IERR.NE.0) RETURN
if (iveri.ge.2) then
$ ,'topv3 : Apres etoil2, IBIS')
if (ierr.ne.0) return
endif
ncc=travl.nccou
if (lidxca.lect(ncc+1).eq.lidxca.lect(ncc)) goto
$ 666
ENDIF
ENDDO
*anc!!! NPBTL=IPBTL.NUM(/2)
NPBTL=IPBTL.NLCOU
* WRITE(IOIMP,*) 'NPBTL=',NPBTL
* NPBTLM=10000000
IF (NPBTL.GT.INCMA) THEN
LLIMCA=.TRUE.
JNASCM=JNASCM+1
IF (ISTMA.EQ.0) THEN
NPBTLR=0
LTOIBA=.FALSE.
ELSEIF (ISTMA.EQ.1) THEN
NPBTLR=1
JNPBTL=(NPBTL+1)/2
ELSEIF (ISTMA.EQ.2) THEN
* Attention overflow potentiel...
NPBTLR=MAX(1,NINT(INCMA*(DBLE(INCMA)/DBLE(NPBTL))))
JNPBTL=(NPBTL+1)/2
ELSE
WRITE(IOIMP,*) 'ISTMA=',ISTMA,' non prevu'
GOTO 9999
ENDIF
if (impr.ge.2) then
write(ioimp,*) 'topv3 : reduction nb cand de '
$ ,NPBTL,' a ',NPBTLR
endif
ELSE
LLIMCA=.FALSE.
NPBTLR=NPBTL
ENDIF
DO INPBTL=1,NPBTLR
IF (.NOT.LLIMCA) THEN
NODE=IPBTL.NUMX(1,INPBTL)
ELSE
IF (ISTMA.EQ.1) THEN
NODE=IPBTL.NUMX(1,JNPBTL)
ELSEIF (ISTMA.EQ.2) THEN
IF (NPBTLR.NE.1) JNPBTL=1+NINT((NPBTLR-1)
$ *(DBLE(INPBTL-1)/DBLE(NPBTLR-1)))
NODE=IPBTL.NUMX(1,JNPBTL)
ELSE
WRITE(IOIMP,*) 'ISTMA=',ISTMA,' non prevu 2'
GOTO 9999
ENDIF
ENDIF
* WRITE(IOIMP,*) 'INPBTL=',INPBTL,' NODE=',NODE
MOTERR(1:4)='NBOR'
*
* write(ioimp,*) 'lmcans avant'
* call ecmelx(lmcans,0)
IF (IERR.NE.0) RETURN
* write(ioimp,*) 'lmcans apres'
* call ecmelx(lmcans,0)
if (iveri.ge.2) then
$ ,'topv3 : Apres etoil2, INPBTL')
if (ierr.ne.0) return
endif
ncc=travl.nccou
if (lidxca.lect(ncc+1).eq.lidxca.lect(ncc)) goto
$ 666
ENDDO
ENDIF
IF (LTOIBA) THEN
* Cas 1 : on étoile avec l'isobarycentre du contour
IF (IARET.EQ.1) THEN
MOTERR(1:4)='BARC'
* Cas 2 : on étoile avec l'isobarycentre de S et S'
ELSEIF (IARET.EQ.2) THEN
*kelemx CALL BARYC4(KELEM,0,TRAVK,NODE)
MOTERR(1:4)='BARS'
* Cas 3 ajout 2017/08/22
ELSEIF (IARET.EQ.3) THEN
*kelemx CALL BARYC4(KELEM,0,TRAVK,NODE)
MOTERR(1:4)='BAR3'
* Cas 4 ajout 2017/08/22
ELSEIF (IARET.EQ.4) THEN
*kelemx CALL BARYC4(KELEM,0,TRAVK,NODE)
MOTERR(1:4)='BAR4'
ELSE
Write(ioimp,*) 'iaret=',iaret
return
ENDIF
IF (IERR.NE.0) RETURN
*
IF (IERR.NE.0) RETURN
if (iveri.ge.2) then
$ ,'topv3 : Apres etoil2, BARYC')
if (ierr.ne.0) return
endif
ipopl2=travl.nccou
ncc=travl.nccou
if (lidxca.lect(ncc+1).eq.lidxca.lect(ncc)) goto
$ 666
ENDIF
* SEGSUP IPBTL
* Ne le faire que si iveri=1 ?
if (iveri.ge.1) then
DO IZER=1,IPBTL.NLCOU
IPBTL.NUMX(1,IZER)=0
ENDDO
endif
if (ierr.ne.0) return
if (iveri.ge.2) then
if (ierr.ne.0) return
endif
ENDIF
ENDIF
SEGSUP IBTLOC
RETURN
*
*
*
9999 CONTINUE
MOTERR(1:8)='TOPV3 '
* 349 2
*Problème non prévu dans le s.p. %m1:8 contactez votre assistance
RETURN
666 CONTINUE
WRITE(IOIMP,*) 'topv3 : Pb candidat ',MOTERR(1:4)
*a upgrader CALL ECMAI1(IMCAND,0)
WRITE(IOIMP,*) 'KEXTO'
WRITE(IOIMP,*) 'IBTLOC'
WRITE(IOIMP,*) 'IPBTL'
WRITE(IOIMP,*) 'NODE=',NODE
RETURN
*
* End of subroutine TOPV3
*
END
					© Cast3M 2003 - Tous droits réservés.
					Mentions légales