topv2
C TOPV2 SOURCE GOUNAND 21/04/06 21:15:33 10940 *ijob SUBROUTINE TOPV2(TRAVK,KELEM,IJOB,XVTOL,QTOL,IMET,XDENS, *kelemx SUBROUTINE TOPV2(TRAVK,KELEM,IALGO,IAJNO,XVTOL,QTOL,IMET,XDENS, $ ,XDENS,INCMA,ISTMA,KTBES,JCAND,JNASCM,IVERI,impr,TRAVL $ ,lchtop) IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) C*********************************************************************** C NOM : TOPV2 C DESCRIPTION : IJOB=0 C Minimise le volume d'une topologie de maillage C en le maintenant supérieur à 0 C IJOB=1 C Minimise le volume, mais on a le droit d'ajouter des C noeuds internes C IJOB=2 C La topologie de maillage est supposée être un maillage C On essaie de l'améliorer en conservant son volume C mais en augmentant sa qualité grace a l'adjonction C de noeuds internes C * 2017/11/30 : On remplace par ialgo (0 ou 1 : génération ou * optimisation de maillage) et iajno (autorise-t-on * l'algorithme à ajouter des noeuds.) 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, 05/05/2013, version initiale C HISTORIQUE : v1, 05/05/2013, création C HISTORIQUE : C HISTORIQUE : C*********************************************************************** -INC PPARAM -INC CCOPTIO -INC CCREEL -INC SMELEME * POINTEUR KELEM.MELEME POINTEUR KEXTO.MELEME POINTEUR IBTLOC.MELEME POINTEUR IPBTL2.MELEME POINTEUR KTBES.MELEME POINTEUR KTBES2.MELEME * anc POINTEUR IMCAND.MELEME -INC TMATOP1 *-INC SMELEMX POINTEUR LMCANS.MELEMX POINTEUR IPBTL.MELEMX POINTEUR KELEMX.MELEMX -INC SMLENTI *anc 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 POINTEUR KCOORD.MCOORD *-INC SMETRIQ POINTEUR KCMETR.METRIQ *-INC STRAVJ POINTEUR TRAVK.TRAVJ *-INC STRAVL * LOGICAL LOK *anc LOGICAL LTOIBO *anc LOGICAL LTOIBA 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 topv2' * Il vaudrait mieux la lire !! * XVTOL=XZPREC*1.D2 IDIMP1=IDIM+1 KCOORD=TRAVK.COORD KPVIRT=TRAVK.PVIRT KEXTO=TRAVK.TOPO KCMETR=TRAVK.CMETR * LMCANS=TRAVL.MCANS LIDXCA=TRAVL.IDXCA LOKVOL=TRAVL.OKVOL LQUALS=TRAVL.QUALS LNQUAL=TRAVL.NQUAL LINDI=TRAVL.INDI LINDJ=TRAVL.INDJ * IPBTL=TRAVL.PBTL * * Initialisations SEGMENT TRAVL : nb candidats=0 * nbel maillage candidats=0 * IF (IERR.NE.0) RETURN * IPOPL2=0 KTBES=KEXTO JCAND=0 * Tests sur le maillage initial : uniquement des éléments à 3 noeuds en 2D * et des éléments à 4 noeuds en 3D * SEGACT KEXTO *! NLTLOC=KEXTO.NUM(/2) NLTLOC=TRAVK.NVCOU IF (NLTLOC.EQ.0) GOTO 7 NBSOUS=KEXTO.LISOUS(/1) IF (NBSOUS.NE.0) THEN WRITE(IOIMP,*) 'We want only elementary meshes' GOTO 9999 ENDIF NBNN=KEXTO.NUM(/1) IF (NBNN.NE.IDIM+1) THEN WRITE(IOIMP,*) 'Only simplices are allowed' GOTO 9999 ENDIF * * IARET=KELEM.NUM(/1) * NBELEM=KELEM.NUM(/2) IARET=KELEMX.NNCOU NBELEM=KELEMX.NLCOU * Une vérif qu'on aurait dû faire depuis longtemps * IF (IARET.LT.0.OR.NBELEM.LT.0) THEN IF (IARET.LE.0.OR.NBELEM.LE.0) THEN WRITE(IOIMP,*) 'KELEM nul dim=',IARET,NBELEM goto 9999 ENDIF LOK=.TRUE. DO IIAR=1,IARET * INOD=KELEM.NUM(IIAR,1) INOD=KELEMX.NUMX(IIAR,1) IF (INOD.EQ.0) THEN WRITE(IOIMP,*) 'KELEMX noeud nul iiar=',IIAR LOK=.FALSE. ENDIF ENDDO IF (.NOT.LOK) THEN WRITE(IOIMP,*) 'Ce cas nest pas bon du tout.' goto 9999 ENDIF * On remet le noeud KPVIRT au barycentre de KELEM (modifie le MCOORD !!!) IF (KPVIRT.NE.0) THEN * Pas besoin a priori. segact mcoord*mod * fait plus haut KCOORD=TRAVK.COORD * write(ioimp,*) 'kpvirt=',kpvirt,'nntot=',xcoor(/1)/idimp1 DO L=1,IDIM * write(ioimp,*) 'l=',l xig=0.D0 * npoin=KELEM.NUM(/1) npoin=KELEMX.NNCOU DO in=1,npoin * ip=kelem.num(in,1) ip=kelemx.numx(in,1) iref=idimp1*(ip-1) xig=xig+kcoord.xcoor(iref+l) ENDDO iref=idimp1*(kpvirt-1) * xold=xcoor(iref+l) * write(ioimp,*) 'iref=',iref kcoord.xcoor(iref+l)=xig/npoin * dx=xcoor(iref+l)-xold * if (abs(dx).gt.xzprec) write(ioimp,*) 'dx=',dx * write(ioimp,*) 'dx=',dx * write(ioimp,*) 'x=',xcoor(iref+l) ENDDO ENDIF * Calcul du volume de la topologie initiale *!!Erreur pour calculer le volume, il ne faut pas utiliser la métrique ! * CALL VOMSIM(KEXTO,IMET,KPVIRT,XVTLOC) * CALL VOMSIM(KEXTO,0,KPVIRT,XVTLOC,XVTLOV) IELDEB=1 IELFIN=TRAVK.NVCOU IF (IERR.NE.0) RETURN * JCAND=0 * Note : on saute les topologies locales ayant un volume nul * car on n'arrivera pas à les améliorer IF (XVTLOC.LE.XVTOL) GOTO 7 * * Génération des topologies candidates (stockage dans TRAVL: MCANS * indexé par IDXCA) * ICBES est le meilleur candidat par défaut (souvent=1, la topologie initiale) * IPOPL2 est le candidat où on a créé un nouveau noeud (souvent le * dernier, égal à travl.nccou) * *ijob CALL TOPV3(TRAVK,KELEM,IJOB,TRAVL,ICBES,IPOPL2) *kelemx CALL TOPV3(TRAVK,KELEM,IAJNO,TRAVL,INCMA,ISTMA,JNASCM,ICBES,IPOPL2 $ ,IPOPL2,iveri,impr) IF (IERR.NE.0) RETURN * * On a les candidats dans ITCAND * On sélectionne ceux de volume minimum non nul * JCAND=TRAVL.NCCOU if (impr.ge.4) then write(ioimp,*) 'Apres gen candidat n=',jcand endif * Sortie anticipée s'il n'y a qu'un candidat * WRITE(IOIMP,*) 'JCAND=',JCAND IF (JCAND.EQ.1) GOTO 8 * XVMIN=XVTLOC if (impr.ge.4) then write(ioimp,*) 'volume vise XVMIN=',XVMIN,' virtuel=',XVTLOV endif * *ijob CALL TOPV4(TRAVL,IJOB,XVMIN,XVTLOV,XVTOL,KPVIRT) IF (IERR.NE.0) RETURN * if (impr.ge.4) then *anc write(ioimp,*) 'Apres selection vol ncandidat=',ITVOL(/1) *anc Write(ioimp,*) (itvol(iii),iii=1,itvol(/1)) * write(ioimp,*) 'Apres selection vol ncandidat=',nvocou * Write(ioimp,*) (lokvol.lect(iii),iii=1,nvocou) endif * S'il n'en reste qu'un, on peut sauter le calcul des qualités ?????? IF (TRAVL.NVOCOU.EQ.1) THEN ICBES=LOKVOL.LECT(NVOCOU) GOTO 8 ENDIF * * Les candidats ayant le bon volume sont dans ITVOL * On calcule les qualités de chaque élément des candidats et on ordonne. * IF (IERR.NE.0) RETURN if (impr.ge.4) then write(ioimp,*) 'Apres calcul qualité candidats' DO i=1,NVOCOU Write(ioimp,*) 'Candidat i=',i ICAND=LOKVOL.LECT(i) IELDEB=LIDXCA.LECT(ICAND) IELFIN=LIDXCA.LECT(ICAND+1)-1 * $ ,lnqual.lect(icand)) enddo endif * * Calcul des meilleurs candidats par maximum lexical * * if (impr.ge.4) then write(ioimp,*) 'Apres tri qualité candidats, le meilleur est :' $ ,icbes endif 8 CONTINUE * *anc KTBES2=KTBES ICAND=ICBES *dbg write(ioimp,*) 'icand,nccou=',icand,travl.nccou IF (ICAND.NE.1) THEN IELDEB=LIDXCA.LECT(ICAND) IELFIN=LIDXCA.LECT(ICAND+1)-1 NBNN=LMCANS.NNCOU NBELEM=IELFIN-IELDEB+1 NBSOUS=0 NBREF=0 * write(ioimp,*) 'icand,ieldeb,ielfin,nbnn,nbelem=',icand * $ ,ieldeb,ielfin,nbnn,nbelem SEGINI KTBES KTBES.ITYPEL=LMCANS.ITYPEX IDX=1 DO IEL=IELDEB,IELFIN DO INO=1,NBNN KTBES.NUM(INO,IDX)=LMCANS.NUMX(INO,IEL) ENDDO IDX=IDX+1 ENDDO ENDIF * * Si on n'a pas sélectionné le candidat avec le noeud supplémentaire * on peut enlever le noeud *ijob IF (IJOB.EQ.1.OR.IJOB.EQ.2) THEN IF (IAJNO.EQ.1) THEN IF (IPOPL2.NE.0.AND.ICBES.NE.IPOPL2) THEN NPCOUN=TRAVK.NPCOU-1 * Remise à zéro : nécessaire uniquement pour la vérification ?? if (iveri.ge.1) then IREF=(TRAVK.NPCOU-1)*IDIMP1 DO 11 I=1,IDIMP1 KCOORD.XCOOR(IREF+I)=0.D0 11 CONTINUE IF (KCMETR.NE.0) THEN DO 12 ININ=1,KCMETR.XIN(/1) KCMETR.XIN(ININ,TRAVK.NPCOU)=0.D0 12 CONTINUE ENDIF endif TRAVK.NPCOU=NPCOUN * Désactivation temporaire car pas de ménage... *tmp if (iveri.ge.2) then *tmp call vetopi(travk,'topv2 : Apres reduction travk') *tmp if (ierr.ne.0) return *tmp endif ELSE * write(ioimp,*) 'Nouveau noeud cree ','IPOPL2,ICBES,NPCOU=' * $ ,IPOPL2,ICBES,TRAVK.NPCOU * IREF=(TRAVK.NPCOU-1)*IDIMP1 * write(ioimp,*) (kcoord.xcoor(iref+iii),iii=1,idimp1) ENDIF ENDIF 7 CONTINUE IF (KEXTO.EQ.KTBES) JCAND=-JCAND IF (KEXTO.EQ.KTBES) THEN LCHTOP=.FALSE. ELSE LCHTOP=.TRUE. ENDIF RETURN * * * 9999 CONTINUE MOTERR(1:8)='TOPV2 ' * 349 2 *Problème non prévu dans le s.p. %m1:8 contactez votre assistance RETURN * * End of subroutine TOPV2 * END
© Cast3M 2003 - Tous droits réservés.
Mentions légales