C ***************************************************************** C Delos est un mailleur automatique "surfacique" qui genere une C triangulation pour la simulation et/ou la visualisation. C C Copyright : (1994-2023) MINES PARIS / ARMINES C Authors : Olivier Stab C Website : https://people.minesparis.psl.eu/olivier.stab/delos C License : BSD-3-clause C C ***************************************************************** C ********************************************************************** C FICHIER : DSG_MAIN.F C OBJET : MAILLAGE TRIANGULAIRE D'UNE GEOMETRIE C FONCT. : C OBJET DSTEST : TESTE LA VALIDITE DES PARAMETRES D'ENTREE C C AUTEUR : O. STAB C DATE : 20.07.99 C TESTS : C MODIFICATIONS : C AUTEUR, DATE, OBJET : C C ********************************************************************** C SUBROUTINE DSTEST(NOMD,NOMD2,NOMR,NOMR2,NBPNEW,PRESEN, > ITVL,NITMAX,RTVL,NRTMAX, > ITRACE,IERR) C ********************************************************************** C OBJET DSTEST : TESTE LA VALIDITE DES PARAMETRES D'ENTREE C ********************************************************************** CHARACTER*(*) NOMD,NOMD2,NOMR,NOMR2 INTEGER NBPNEW,PRESEN(*) INTEGER ITVL(*),NITMAX,NRTMAX REAL RTVL(*) INTEGER ITRACE,IERR C CHARACTER*256 MESSAG IF(PRESEN(2).LE.0)NOMD2 = ' ' IF(PRESEN(3).LE.0)NOMR = ' ' IF(PRESEN(4).LE.0)NOMR2 = ' ' IF(PRESEN(5).LE.0)NBPNEW = -1 C --- ANALYSE SEMANTIQUE : C IF((PRESEN(4).LE.0).AND.(PRESEN(3).LE.0))THEN IERR = -1 CALL PGMESS(IERR,23,1,'PAS DE FICHIER RESULTAT',MESSAG) CALL ESECHA(IO,MESSAG,' ') GOTO 9999 ENDIF C IF((PRESEN(3).LE.0).AND.(NBPNEW.GT.0))THEN IF((PRESEN(3).LE.0).AND.(NBPNEW.NE.0))THEN IERR = -1 CALL PGMESS(IERR,24,1,'GRANDEURS NON LOCALISEES !',MESSAG) CALL ESECHA(IO,MESSAG,' ') GOTO 9999 ENDIF IF((PRESEN(3).LE.0).AND.(NBPNEW.EQ.0))THEN CALL PGMESS(101,30,1,'CALCUL DES GRANDEURS SEULEMENT',MESSAG) CALL ESECHA(IO,MESSAG,' ') ENDIF 1000 CONTINUE 9999 END C C PROGRAM DSGPRG C ********************************************************************** C OBJET DSGPRG : Programme principal "delos" C EN ENTREE : 5 parametres C - NOM du fichier de geometrie C - NOM du fichier de densite (facultatif) C - NOM du fichier du maillage resultant C - NOM du fichier de densite resultat (facultatif) C - NOMBRE maximum de noeud (facultatif) C ********************************************************************** C C NBARMX : NOMBRE MAX DE POINT SUR UNE ARETE C NDNMAX : NOMBRE MAX DE DENSITES C INTEGER NBPTMX, NBARMX, NDNMAX C --- ALLOCATION DE LA MEMOIRE --- C INTEGER NBADET INTEGER NITMAX,NRTMAX C --- REPRIS DE DS4_MAIN.F C PARAMETER (NBPTMX = 100000+50, NBADET = 50, NDNMAX = 500) C --- pour les gros cas : sur SGI necessite : limit stacksize 200M PARAMETER (NBPTMX = 1000000+50, NBADET = 50, NDNMAX = 500) PARAMETER (NITMAX = 13*NBPTMX+288 + 310 + 2*NDNMAX) PARAMETER (NRTMAX = 12 * (NBPTMX + 12) + NBPTMX) C PARAMETER (NRTMAX = 20 * (NBPTMX + 12) + NBPTMX) INTEGER ITVL(NITMAX) REAL RTVL(NRTMAX) C C LES DONNEES DU PROGRAMME C CHARACTER*(5) NOMPRG REAL RELEAS CHARACTER*(12) COPYRI INTEGER DATE CHARACTER*(33) CONTAC C --- FICHE DU PROGRAMME --- DATA NOMPRG/'delos'/ C DATA RELEAS/2.05/ DATA RELEAS/2.07/ DATA COPYRI/'ENSMP-GPL'/ C DATA DATE/20060913/ C DATA DATE/20100628/ DATA DATE/20131115/ DATA CONTAC/' olivier.stab@mines-paristech.fr'/ C --- LA LECTURE DES ARGUMENTS --- INTEGER NARGMX PARAMETER (NARGMX = 5) INTEGER ITYPEL(NARGMX),IOPTIO(NARGMX) C CHARACTER*45 MESSAG(NARGMX) CHARACTER*63 MESSAG(NARGMX+3) CHARACTER*512 HELPON C C ITYPEL(I) : TYPE LOGIQUE DE L'ENTREE I C 1 = LE NOM D'UN FICHIER DE DONNEES C 2 = LE NOM D'UN FICHIER DE RESULTAT C 3 = UNE VALEUR ENTIERE C 4 = UNE VALEUR REELLE C 5 = UN MOT CLES C 6 = LE NOM D'UN FICHIER DE RESULTAT (ECRASABLE) C 7 = LE NOM D'UN FICHIER DE RESULTAT (CONCATENATION) DATA ITYPEL/1,1,6,6,3/ C IOPTIO(I) : L'ENTREE I EST OPTIONNELLE (0) OU NECESSAIRE (1) DATA IOPTIO/1,0,0,0,0/ C C MESSAG(I) : MESSAGE DECRIVANT L'ENTREE I C SERT A L'INVITATION ET AU MESSAGE D'ERREUR C 12345678901234567890123456789012345678901234567890 C DATA MESSAG/'LE NOM DU FICHIER DES DONNEES (GEOMETRIE) ', C > 'LE NOM DU FICHIER DES DONNEES (DENSITE) ', C > 'LE NOM DU FICHIER DES RESULTATS (MAILLAGE) ', C > 'LE NOM DU FICHIER DES RESULTATS (DENSITE) ', C > 'LE NOMBRE MAXIMUM DE NOEUDS '/ C --- LES MOTS CLE --- INTEGER NBMOTS,LMOTS PARAMETER (NBMOTS = 1,LMOTS = 1) CHARACTER*(LMOTS) MOTS(NBMOTS) DATA MOTS /'-'/ INTEGER ICODES(NBMOTS) DATA ICODES/-1/ C C --- VARIABLES LOCALES --- INTEGER IARGUM(NARGMX) INTEGER PRESEN(NARGMX) CHARACTER*80 CHARTB(NARGMX) INTEGER INTETB(NARGMX) REAL REALTB(NARGMX) INTEGER NBCHAR,NBINTE,NBREAL,I INTEGER ITRACE,IHELP,IERR C ------------------------------------------------------------- C * pour tester la memoire : ITVL(NITMAX-1) = 0 * CALL ESPMOD(ITRACE,IHELP) IF( ITRACE.EQ.1 )CALL ESEPRG(1,NOMPRG,RELEAS,COPYRI,DATE,CONTAC) C --- construction des messages pour les entrees CALL PGMESS(101,2,1, >'LE NOM DU FICHIER DES DONNEES (GEOMETRIE) ',MESSAG(1)) CALL PGMESS(101,3,1, >'LE NOM DU FICHIER DES DONNEES (DENSITE) ',MESSAG(2)) CALL PGMESS(101,4,1, >'LE NOM DU FICHIER DES RESULTATS (MAILLAGE) ',MESSAG(3)) CALL PGMESS(101,5,1, >'LE NOM DU FICHIER DES RESULTATS (DENSITE) ',MESSAG(4)) CALL PGMESS(101,6,1, >'LE NOMBRE MAXIMUM DE NOEUDS ',MESSAG(5)) C IF( IHELP.EQ.1 )GOTO 8888 CALL ESPROG(ITYPEL,IOPTIO,MESSAG, > MOTS,LMOTS,NBMOTS,ICODES, > CHARTB,NBCHAR,INTETB,NBINTE,REALTB,NBREAL, > IARGUM,NARGMX,PRESEN,ITRACE,IERR) IF(IERR.EQ.-1)GOTO 8887 IF(IERR.NE.0)GOTO 9999 C C --- TEST DES ENTREES --- C ====================================== CALL DSTEST(CHARTB(IARGUM(1)),CHARTB(IARGUM(2)), > CHARTB(IARGUM(3)),CHARTB(IARGUM(4)), > INTETB(IARGUM(5)),PRESEN, > ITVL,NITMAX,RTVL,NRTMAX, > ITRACE,IERR) IF(IERR.NE.0)GOTO 8887 C C --- APPEL A LA FONCTION DE TRAITEMENT --- C ====================================== CALL DSINIT2(ITRACE) C CALL DSGMEM(CHARTB(IARGUM(1)),CHARTB(IARGUM(2)), > CHARTB(IARGUM(3)),CHARTB(IARGUM(4)), > INTETB(IARGUM(5)), > ITVL,NITMAX,RTVL,NRTMAX, > ITRACE,IERR) IF(IERR.EQ.-1)GOTO 8887 GOTO 9999 8887 CONTINUE CALL PGMESS(101,8,1, >'pour l aide en ligne tapez : delos h',MESSAG(6)) C CALL ESECHA(1,'pour l aide en ligne tapez :','delos h') CALL ESECHA(1,MESSAG(6),'') GOTO 9999 C --- LE HELP EN LIGNE --- 8888 CONTINUE C CALL PGMESS(1,7,1, > 'AIDE EN LIGNE : ',HELPON) CALL ESECHA(1,HELPON,'') GOTO 9999 9999 END C ********************************************************************** C FICHIER : DSG_NOEUD.F C OBJET : C C FONCT. : C OBJET DSGMEM : GENERATION D'UN MAILLAGE A PARTIR D'UN FICHIER C C AUTEUR : O. STAB C DATE : 20.07.99 C TESTS : C MODIFICATIONS : C AUTEUR, DATE, OBJET : STAB, 05.11.04, messages "normalises" C AUTEUR, DATE, OBJET : STAB, 02.02.04, DSGMEM maj NBPNEW avant appel 2D C C ********************************************************************** C SUBROUTINE DSGMEM(NOMD,NOMDD,NOMR,NOMRR,NBPTOT, > ITVL,NITMAX,RTVL,NRTMAX,ITRACE,IERR) C ********************************************************************** C OBJET DSGMEM : GENERATION D'UN MAILLAGE A PARTIR D'UN FICHIER C lecture fichiers, maillage 1D, maillage 2D par region, ecriture resultat C EN ENTREE : C NOMD : NOM DU FICHIER CONTENANT LES DONNEES C NOMR : NOM DU FICHIER CONTENANT LES RESULTATS (MAILLAGE) C NOMDD : NOM DU FICHIER CONTENANT LES DENSITES (TAILLES SOUHAITEES) C NOMRR : NOM DU FICHIER CONTENANT LES RESULTATS (TAILLES SOUHAITEES) C C ---- TABLEAUX DE TRAVAIL -------------------- C ITVL : TABLEAU D'ENTIERS POUR LES CALCULS C NITMAX : TAILLE DE ITVL C RTVL : TABLEAU DE REELS POUR LES CALCULS C NRTMAX : TAILLE DE RTVL (12 (NBP+12)) C ITRACE : SI > 0 ALORS ECHO DES ETAPES ET DES RESULTATS C C EN SORTIE : C IERR : CODE D'ERREUR C ********************************************************************** CHARACTER*(*) NOMD,NOMR,NOMDD,NOMRR INTEGER NBPTOT INTEGER ITVL(*),NITMAX,NRTMAX REAL RTVL(*) INTEGER ITRACE,IERR C INTEGER LENCHR EXTERNAL LENCHR C --- VARIABLES INTERNES --- CHARACTER*126 MESSAG INTEGER I INTEGER IDE,ITRNOE,NBNMAX,ITRTRI,NBCMAX,NOETRI,NOEMAX INTEGER NBN,NBE,NCC,NBPMAX,NBEMAX INTEGER ITRIRG,NRGMAX,IMTREF,NMT INTEGER ICOORD,IDIMC,IGRDNO,NGRDMX INTEGER MODDEF,MODGEN,IADEC,NIADEC,IRADEC,NRIDEC,NFADEC INTEGER ITRAV,IRTRAV,NITMX2,NRTMX2 REAL ZERO INTEGER NDECMX INTEGER IDIMG,PITRRG,PSTRUC INTEGER NBPNEW,TSN,ICOEF C INTEGER IDE1,IARETE,NBNMX1,NBARET,NBN1,IAR2RG INTEGER INTMAT,IREGIO,NBEREG,NMTCC,IUN INTEGER NBRMAX C --- pour tester la memoire : ITVL(NITMAX) = 0 RTVL(NRTMAX) = 0.0 C IERR = 0 ZERO = 0.0 ITRAV = 1 IRTRAV = 1 C ======================== C --- 2.LECTURE DU MAILLAGE --- C ======================== IMTREF = ITRAV NRGMAX = NITMAX - IMTREF CALL LITFRT(0,NOMD,0,0,NRGMAX,0,IDIMC,NBN,ZERO,IDE, > NBNMAX,NBE,0,NMT,ITVL(IMTREF),NBRMAX,0,IERR) NBRMAX = MAX(NBRMAX,2) ITRAV = IMTREF + NMT NBCMAX = NBNMAX c --- test des donnees et messages d'erreur IF( IERR.NE.0 )THEN CALL PGMESS(IERR,2,1,'A LA LECTURE DU FICHIER :', MESSAG) CALL ESECHA(1,MESSAG,NOMD) GOTO 9999 ENDIF C IF((IDIMC.LT.2).OR.(IDIMC.GT.3))THEN IERR = -1 CALL PGMESS(IERR,4,5,'COORDONNEES DES POINTS', MESSAG) CALL ESECHA(1,MESSAG,' ') CALL PGMESS(IERR,3,1,'ERREUR DANS LE FICHIER : ',MESSAG) CALL ESECHA(1,MESSAG,NOMD) GOTO 9999 ENDIF c IF((IDIMC.LT.2).AND.(NBRMAX.GT.2))THEN IERR = -1 CALL PGMESS(IERR,4,6,'COORDONNEES DES POINTS', MESSAG) CALL ESECHA(1,MESSAG,' ') CALL PGMESS(IERR,3,1,'ERREUR DANS LE FICHIER : ',MESSAG) CALL ESECHA(1,MESSAG,NOMD) GOTO 9999 ENDIF c IF((IDE.EQ.0).AND.(NBE.EQ.0))THEN IF( NBN.EQ.0 )THEN IERR = -1 CALL PGMESS(IERR,7,1,'NI POINT NI ELEMENT DANS LE FICHIER : ', > MESSAG) CALL ESECHA(1,MESSAG,NOMD) GOTO 9999 ENDIF IERR = 0 CALL PGMESS(IERR,8,1,'PAS ELEMENT DANS LE FICHIER : ',MESSAG) CALL ESECHA(1,MESSAG,NOMD) ENDIF c IF(IDE.GT.1)THEN IERR = -1 CALL PGMESS(IERR,9,1,'LES ELEMENTS NE SONT PAS DES ARETES', > MESSAG) CALL ESECHA(1,MESSAG,' ') CALL PGMESS(IERR,3,1,'ERREUR DANS LE FICHIER : ',MESSAG) CALL ESECHA(1,MESSAG,NOMD) GOTO 9999 ENDIF C ======================== C --- 1.LECTURE DE LA DENSITE --- C ======================== NDECMX = 0 CALL LITRAF(0,NOMDD,MODDEF,MODGEN,0,NIADEC, > ZERO,NRIDEC, > NFADEC,NDECMX, > ITVL,NITMAX,RTVL,NRTMAX, > 0,IERR) C --- EN 1D ON PREFERE LE DIRECT --- IF(MODDEF.EQ.3)MODGEN = 1 c --- test des donnees et messages d'erreur IF( IERR .NE. 0 )THEN CALL PGMESS(IERR,2,1,'DANS LE FICHIER',MESSAG) CALL ESECHA(1,MESSAG,NOMDD) GOTO 9999 ENDIF c IF((MODDEF.EQ.2).AND.(IDIMC.EQ.3))THEN IERR=-1 CALL PGMESS(IERR,11,1,'CONCENTRATION PAS DISPONIBLE EN 3D', > MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9999 ENDIF C --- DIRECT ET NOMBRE FIXE => WARNING --- IF(((MODGEN.EQ.1).AND.(NBPTOT.GT.0)).AND.(ITRACE.GT.0))THEN CALL PGMESS(0,12,13,'PARAMETRE DECONSEILLE',MESSAG) CALL ESECHA(1,MESSAG,' ') ENDIF C --- ALEATOIRE ET NOMBRE PAS FIXE => WARNING --- IF(((MODDEF.EQ.4).AND.(NBPTOT.LT.0)).AND.(ITRACE.GT.0))THEN CALL PGMESS(0,12,19,'PARAMETRE DECONSEILLE',MESSAG) CALL ESECHA(1,MESSAG,' ') ENDIF C --- LA TAILLE SOUHAITE N'EST PAS DEFINIE EN TOUS LES NOEUDS !!! --- IF((MODDEF.EQ.3).AND.(NBN.NE.NRIDEC))THEN IERR = -1 CALL PGMESS(IERR,12,1,'TAILLE PAS DEFINIE EN TOUS LES NOEUDS', > MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9999 ENDIF C ---- NOMBRE TOTAL DE NOEUDS ATTEINT ---- IF(( NBPTOT.GT.0 ).AND.( NBPTOT.LT.NBN ))THEN IERR = -2 CALL DSERRE(1,IERR,'DSGMEM',' NBRE NOEUDS DEJA ATTEINT ') CALL PGMESS(IERR,19,1,'MAXIMUM NOEUDS DEJA ATTEINT',MESSAG) CALL ESEINT(1,MESSAG,NBN,1) GOTO 9999 ENDIF C ================================================= C --- 1.CALCUL DU NOMBRE MAXIMUM DE NOEUD, D'ELEMENTS --- C ================================================= C NITMX2 = NITMAX - NIADEC*NFADEC NRTMX2 = NRTMAX - NRIDEC*NFADEC C PSTRUC = 0 C IF((MODDEF.EQ.1 ).OR.(MODGEN.EQ.3))PSTRUC = 1 IF(MODGEN.EQ.3)PSTRUC = 1 IDIMG = 0 IF( NOMRR.NE.' ' )IDIMG = 1 TSN = 0 IF( MODDEF.EQ.3 )TSN = 1 PITRRG = 0 C IF( NMT.GT. 1 )PITRRG = 1 C A FAIRE (A OPTIMISER) = IF( NMT.GT. 1 )PITRRG = NBRMAX C POUR L'INSTANT : PITRRG = NBRMAX ICOEF = 0 IF(MODGEN.EQ.3)ICOEF = 1 C CONSIDERER NBRMAX DANS DSGMAX : C'EST FAIT MAINTENANT CALL DSGMAX(IDIMC,NMT,NBN,NBE,NBPTOT, > PSTRUC,PITRRG,TSN,ICOEF,IDIMG, > NITMX2,NRTMX2, > NBPMAX,NBEMAX,IERR) IF( IERR.NE. 0 )THEN CALL DSERRE(1,IERR,'DSGMEM','APPEL DSGMAX') GOTO 9999 ENDIF IF( NBEMAX.LT.0 )THEN IF( NBE.EQ.0 )THEN NBEMAX = 0 ELSE IERR = -1 CALL DSERRE(1,IERR,'DSGMEM','NBEMAX INDETERMINE') GOTO 9999 ENDIF ENDIF C c IF((ITRACE.GT.1 ).AND.(NBPTOT.EQ.-1))THEN c CALL ESEINT(1,'NOMBRE MAXIMUM DE NOEUDS : ',NBPMAX,1) c CALL ESEINT(1,'NOMBRE MAXIMUM D ELEMENTS : ',NBEMAX,1) c ENDIF C C ---- ALLOCATION --- NBPNEW = NBPMAX - NBN C NBCMAX = NBNMAX * PSTRUC NOEMAX = NBPMAX * PSTRUC C IADEC = ITRAV ITRNOE = IADEC + (NIADEC*NFADEC) ITRIRG = ITRNOE + (NBEMAX * NBNMAX) NRGMAX = NBEMAX * PITRRG + 1 ITRTRI = ITRIRG + NRGMAX NOETRI = ITRTRI + (NBEMAX * NBCMAX) NOEMAX = NBPMAX * PSTRUC ITRAV = NOETRI + NOEMAX NITMX2 = NITMAX - ITRAV C NGRDMX = NBPMAX * IDIMG C IRADEC = IRTRAV ICOORD = IRADEC + (NRIDEC*NFADEC) IF(MODDEF.EQ.3)ICOORD = IRADEC + NBPMAX IGRDNO = ICOORD + NBPMAX * IDIMC IRTRAV = IGRDNO + NGRDMX * IDIMG NRTMX2 = NRTMAX - IRTRAV c IF(NITMX2.LT.0)THEN IERR = -2 CALL DSERRE(1,IERR,'DSGMEM','TABLEAUX D ENTIERS TROP PETIT') CALL PGMESS(IERR,15,1,'PLUS DE MEMOIRE POUR LES ENTIERS', > MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9999 ENDIF c IF(NRTMX2.LT.0)THEN IERR = -2 CALL DSERRE(1,IERR,'DSGMEM','TABLEAUX DE REELS TROP PETIT') CALL PGMESS(IERR,16,1,'PLUS DE MEMOIRE POUR LES REELS', > MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9999 ENDIF C ===================================================== C --- LECTURE DU MAILLAGE ET CHARGEMENT DANS LA STRUCTURE --- C ===================================================== CALL DSGESF(NOMD,NOMR,NOMDD,NOMRR, > IDE,ITVL(ITRNOE),NBNMAX,ITVL(ITRTRI),NBCMAX, > ITVL(NOETRI),NOEMAX, > NBN,NBE,NCC,NBPMAX,NBEMAX, > ITVL(ITRIRG),NBRMAX,NRGMAX,ITVL(IMTREF),NMT, > RTVL(ICOORD),IDIMC, > MODDEF,MODGEN,NBPNEW, > ITVL(IADEC),NIADEC,RTVL(IRADEC),NRIDEC,NFADEC, > ITVL(ITRAV),NITMX2,RTVL(IRTRAV),NRTMX2,ITRACE,IERR) IF( IERR.NE.0 )THEN CALL DSERRE(1,IERR,'DSGMEM',' APPEL DSGESF') GOTO 9999 ENDIF C ===================================================== C --- ON RAFFINE LE MAILLAGE LINEIQUE --- C ===================================================== CALL DS1FCT(IDE,ITVL(ITRNOE),NBNMAX,ITVL(ITRTRI),NBCMAX, > ITVL(NOETRI),NOEMAX, > NBN,NBE,NCC,NBPMAX,NBEMAX, C > ITVL(ITRIRG),NRGMAX,ITVL(IMTREF),NMT, > ITVL(ITRIRG),NBRMAX,NRGMAX,ITVL(IMTREF),NMT, > RTVL(ICOORD),IDIMC, > RTVL(IGRDNO),NGRDMX, > MODDEF,MODGEN,NBPNEW, > ITVL(IADEC),NIADEC,RTVL(IRADEC),NRIDEC,NFADEC, > ITVL(ITRAV),NITMX2,RTVL(IRTRAV),NRTMX2,ITRACE,IERR) IF( IERR.LT.0 )THEN CALL DSERRE(1,IERR,'DSGMEM',' APPEL DS1FCT') GOTO 9999 ENDIF C ---- LIMITATION DONNE PAR L'UTILISATEUR --- IF(ITRACE.NE.0)THEN IF( NBPTOT.EQ.NBN )THEN CALL PGMESS(0,25,1,'NB MAXIMUM DE NOEUD ATTEINT ',MESSAG) CALL ESEINT(1,MESSAG,NBPTOT,1) CALL PGMESS(101,15,1,'NOMBRE D ARETES :',MESSAG) CALL ESEINT(1,MESSAG,NBE,1) ENDIF ENDIF C --- ON LIBERE LA PLACE INUTILISEE ITRAV = ITRTRI C ========================= C --- ON PASSE AU MAILLAGE 2D --- C ========================= C ajout 01.02.2005 NBPNEW = NBPMAX - NBN C IDE1 = IDE NBNMX1 = NBNMAX NBN1 = NBN NBARET = NBE IARETE = ITRNOE IAR2RG = ITRIRG C IDE = 2 NBE = 0 NBNMAX = 3 C ------ SEUL LE MODE ITERATIF EST IMPLEMENTE EN 2D -------- MODGEN = 2 NBNMAX = 3 C C --- ALLOCATION DU MAILLAGE --- C INTMAT = ITRAV ITRNOE = INTMAT+NMT ITRAV = ITRNOE + (NBEMAX * NBNMAX) C NRTMX2 = NRTMAX - IRTRAV NITMX2 = NITMAX - ITRAV c IF(NITMX2.LT.0)THEN IERR = -2 CALL DSERRE(1,IERR,'DSGMEM','TABLEAUX D ENTIERS TROP PETIT') CALL PGMESS(IERR,15,1,'PLUS DE MEMOIRE POUR LES ENTIERS', > MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9999 ENDIF IF(NRTMX2.LT.0)THEN IERR = -2 CALL PGMESS(IERR,16,1,'PLUS DE MEMOIRE POUR LES REELS', > MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9999 ENDIF C pour tester la memoire : ITVL(ITRAV+NITMX2-1) = 0 DO 200 I=1,NMT C ===================================== C ---- ON TRAITE CHAQUE REGION A PART --- C ===================================== IREGIO = ITVL(IMTREF+I-1) NBEREG = NBE IF(ITRACE.NE.0)THEN CALL PGMESS(101,23,1,'--> TRAITEMENT DE LA REGION : ', > MESSAG) IF(NMT.GT.1)CALL ESEINT(1,MESSAG,I,1) ENDIF C --- ON TRIANGULE ET ON RAFFINE : IREGIO --- CALL RGRAFT(IDE1,ITVL(IARETE),NBNMX1,NBN1,NBARET, > ITVL(IAR2RG),NBRMAX,IREGIO, > IDE,ITVL(ITRNOE),NBNMAX, > NBN,NBE,NCC,NBPMAX,NBEMAX, > RTVL(ICOORD),IDIMC, > RTVL(IGRDNO),NGRDMX, > MODDEF,MODGEN,NBPNEW, > ITVL(IADEC),NIADEC,RTVL(IRADEC),NRIDEC,NFADEC, > ITVL(ITRAV),NITMX2,RTVL(IRTRAV),NRTMX2,ITRACE,IERR) IF(IERR.LT..0)THEN CALL DSERRE(1,IERR,'DS4MEM',' APPEL RGRAFT') GOTO 9999 ENDIF C ---- LIMITATION DONNE PAR L'UTILISATEUR --- IF(ITRACE.NE.0)THEN IF(IERR.EQ.2) > CALL DSERRE(1,IERR,'NOMBRE MAXIMUM D ELEMENTS ATTEINT',' ') IF(IERR.EQ.1)THEN CALL PGMESS(0,25,1,'NOMBRE MAXIMUM DE NOEUD ATTEINT ', > MESSAG) CALL ESEINT(1,MESSAG,NBPMAX,1) ENDIF IERR = 0 CALL PGMESS(101,17,1,'NOMBRE DE TRIANGLES :',MESSAG) IF(NMT.GT.1)CALL ESEINT(1,MESSAG,(NBE-NBEREG),1) ENDIF C ---- MATERIAU DES ELEMENTS CREES ---- ITVL(I-1+INTMAT) = NBE 200 CONTINUE C =================================================== C --- 5. ECRITURE FICHIER MAILLAGE --- C =================================================== 300 CONTINUE IF( NOMR.EQ.' ' )GOTO 400 IF(ITRACE.GT.0)THEN CALL PGMESS(101,20,1,'FICHIER RESULTAT MAILLAGE',MESSAG) CALL ESECHA(1,MESSAG,NOMR) ENDIF C NMTCC = NMT CALL ECRVIP(2,NOMR,IDIMC,NBN,RTVL(ICOORD),IDE, > NBNMAX,NBE,ITVL(ITRNOE),NMTCC, > ITVL(IMTREF),ITVL(INTMAT),IERR) IF( IERR.NE.0 )THEN CALL PGMESS(IERR,20,1,' EN ECRIVANT LE FICHIER : ',MESSAG) CALL ESECHA(1,MESSAG,NOMR) GOTO 400 ENDIF IF( ITRACE.GT.0 )THEN c CALL PGMESS(101,20,1,'FICHIER RESULTAT : ',MESSAG) c CALL ESECHA(1,MESSAG,NOMR) CALL PGMESS(101,14,1,'NOMBRE DE NOEUDS : ',MESSAG) CALL ESEINT(1,MESSAG,NBN,1) CALL PGMESS(101,17,1,'NOMBRE DE TRAINGLES: ',MESSAG) CALL ESEINT(1,MESSAG,NBE,1) CALL PGMESS(101,18,1,'NOMBRE DE ZONES : ',MESSAG) CALL ESEINT(1,MESSAG,NMTCC,1) ENDIF C ================================================ C --- 6. ECRITURE DES TAILLES SOUHAITEES AU NOEUDS --- C ================================================ 400 CONTINUE IF( NFADEC.EQ.0 )GOTO 9999 IF( NOMRR.EQ.' ' )GOTO 9999 C IF(ITRACE.GT.0)THEN CALL PGMESS(101,21,1,'FICHIER RESULTAT : ',MESSAG) CALL ESECHA(1,MESSAG,NOMRR) ENDIF IUN = 1 C ---- DENSITE ASSOCIE AU MAILLAGE NOMR --- CALL ECRGRD(NOMRR,NOMR,RTVL(IGRDNO),IUN,NBN,IERR) IF( IERR.NE.0 )THEN CALL PGMESS(IERR,20,1,' EN ECRIVANT LE FICHIER : ',MESSAG) CALL ESECHA(1,MESSAG,NOMRR) GOTO 9999 ENDIF IF( ITRACE.GT.0 )THEN CALL PGMESS(101,19,1,'NOMBRE DE VALEURS ',MESSAG) CALL ESEINT(1,MESSAG,NBN,1) ENDIF C 9999 END C C C ********************************************************************** C FICHIER : DSG_LECTURE.F C OBJET : IDEM DS1_LECTURE (LE REMPLACERA A TERME) C C FONCT. : C OBJET DSGESF : LECTURE D'UN MAILLAGE LINEIQUE ET RAFFINEMENT C ET INITIALISATION DE TOUTES LES "STRUCTURES" DE DONNEES C C AUTEUR : O. STAB C DATE : 20.07.99 C TESTS : C MODIFICATIONS : C AUTEUR, DATE, OBJET : STAB, 28.07.99, EXTRAIT ET MODIFIE DE DS1_NOEUD.F C AUTEUR, DATE, OBJET : STAB, 05.11.04, messages "normalises" C AUTEUR, DATE, OBJET : STAB, 21.12.05, DSGESF lit ANCIEN et nouveau format ! C AUTEUR, DATE, OBJET : O.Stab, 02.07.2006 correction BUG (multimat et ancien format) C C ********************************************************************** C SUBROUTINE DSGESF(NOMD,NOMR,NOMDD,NOMRR, > IDE,ITRNOE,NBNMAX,ITRTRI,NBCMAX,NOETRI,NOEMAX, > NBN,NBE,NCC,NBPMAX,NBEMAX, > ITRIRG,NBRMAX,NRGMAX,IMTREF,NMT, > COORD,IDIMC, > MODDEF,MODGEN,NBPNEW, > IADEC,NIADEC,RADEC,NRIDEC,NFADEC, > ITVL,NITMAX,RTVL,NRTMAX,ITRACE,IERR) C ********************************************************************** C OBJET DSGESF : LECTURE D'UN MAILLAGE LINEIQUE ET RAFFINEMENT C ET INITIALISATION DE TOUTES LES "STRUCTURES" DE DONNEES C C EN ENTREE : C NOMD,NOMR,NOMDD,NOMRR : LES NOM DES FICHIERS C --- LA TAILLE DES TABLEAUX... --- C NBPMAX : NOMBRE MAXIMUM DE POINTS (COORD) C NBEMAX : NOMBRE MAXIMUM D'ELEMENTS (ITRNOE...) C NBRMAX : NOMBRE MAXIMUM DE REGIONS (ITRIRG...) C NRGMAX : ? C NITMAX : TABLEAU DE TRAVAIL D'ENTIERS C NRTMAX : TABLEAU DE TRAVAIL DE REELS C C EN SORTIE : C --- POUR LE MAILLAGE --- C IDE,ITRNOE,NBNMAX,ITRTRI,NBCMAX,NOETRI,NOEMAX,NBN,NBE : LE MAILLAGE C COORD : LES POINTS C --- POUR LE RAFFINEMENT --- C MODDEF,MODGEN,NBPNEW C IADEC,NIADEC,RADEC,NRIDEC,NFADEC : POUR LE RAFFINEMENT C C ********************************************************************** CHARACTER*(*) NOMD,NOMR,NOMDD,NOMRR INTEGER IDE,ITRNOE(*),NBNMAX,ITRTRI(*),NBCMAX,NOETRI(*),NOEMAX INTEGER NBN,NBE,NCC,NBPMAX,NBEMAX INTEGER ITRIRG(*),NBRMAX,NRGMAX,IMTREF(*),NMT REAL COORD(*) INTEGER IDIMC INTEGER ITVL(*) REAL RTVL(*),RADEC(*) INTEGER MODDEF,MODGEN,NBPNEW,IADEC(*),NFADEC,NIADEC,NRIDEC INTEGER NITMAX,NRTMAX,ITRACE,IERR C CHARACTER*256 MESSAG INTEGER NOEMX2,NBCMX2,NRGREF,IUN,NMT2,NBRMX2 INTEGER NDECMX INTEGER NBERG(1000),I,J,J0 C ======================== C --- 1.LECTURE DE LA DENSITE --- C ======================== NDECMX = NFADEC IF((ITRACE.GT.0).AND.(NOMDD.NE.' '))THEN CALL PGMESS(101,26,1,'LECTURE DU FICHIER DENSITE', MESSAG) CALL ESECHA(1,MESSAG,NOMDD) ENDIF CALL LITRAF(1,NOMDD,MODDEF,MODGEN,IADEC,NIADEC, > RADEC,NRIDEC, > NFADEC,NDECMX, > ITVL,NITMAX,RTVL,NRTMAX, > 0,IERR) IF( IERR .NE. 0 )THEN CALL PGMESS(IERR,2,1,'A LA LECTURE DU FICHIER :', MESSAG) CALL ESECHA(1,MESSAG,NOMDD) GOTO 9999 ENDIF IF(ITRACE.GT.0)THEN CALL PGMESS(101,27,1,'NOMBRE DE CONCENTRATIONS : ', MESSAG) CALL ESEINT(1,MESSAG,NFADEC,1) ENDIF C --- EN 1D ON PREFERE LE DIRECT --- IF(MODDEF.EQ.3)MODGEN = 1 C =================================== C --- 1.LECTURE EFFECTIVE DU MAILLAGE --- C =================================== IF(ITRACE.GT.0)THEN CALL PGMESS(101,24,1,'LECTURE DU FICHIER GEOMETRIE', MESSAG) CALL ESECHA(1,MESSAG,NOMD) ENDIF CALL LITFRT(1,NOMD,(NBPMAX*IDIMC),(NBEMAX*NBNMAX), > NMT,(NBRMAX*NBEMAX),IDIMC,NBN,COORD,IDE, > NBNMAX,NBE,ITRNOE,NMT2,IMTREF,NBRMAX,ITRIRG,IERR) IF( IERR.NE.0 )THEN IERR = 0 CALL LITVIP(1,NOMD,(NBPMAX*IDIMC),(NBEMAX*NBNMAX), > NRGMAX,(NBRMAX*NBEMAX),IDIMC,NBN,COORD,IDE, > NBNMAX,NBE,ITRNOE,NMT,IMTREF,NBERG,IERR) C > NBNMAX,NBE,ITRNOE,NMT,IMTREF,ITRIRG,IERR) C il faut construire ITRIRG : O.Stab, 02.07.2006 correction BUG J0=1 DO 10 I=1,NMT DO 5 J=J0,NBERG(I) ITRIRG(J)=IMTREF(I) 5 CONTINUE J0=NBERG(I)+1 10 CONTINUE ENDIF C IF( IERR.NE.0 )THEN CALL PGMESS(IERR,2,1,'LECTURE DU FICHIER : ', MESSAG) CALL ESECHA(1,MESSAG,NOMD) GOTO 9999 ENDIF IF( ITRACE.GT.0 )THEN CALL PGMESS(101,28,1,'NOMBRE DE POINTS : ',MESSAG) CALL ESEINT(1,MESSAG,NBN,1) CALL PGMESS(101,15,1,'NOMBRE D ARETES : ',MESSAG) CALL ESEINT(1,MESSAG,NBE,1) CALL PGMESS(101,18,1,'NOMBRE DE ZONES : ',MESSAG) CALL ESEINT(1,MESSAG,NMT,1) ENDIF C IF(MODGEN.EQ.3)THEN C ------------------------------------------ C ON CREE LA STRUCTURE SEULEMENT POUR LE LISSAGE C ------------------------------------------ CALL SMAOCR(IDE,ITRNOE,NBE,COORD,NBN,IDIMC, > ITRNOE,NBNMAX,ITRTRI, > NBCMAX,NOETRI,NOEMAX, > ITVL,NITMAX,NCC,IERR) IF( IERR.NE.0 )THEN CALL DSERRE(1,IERR,'DSGESF',' APPEL SMAOCR') CALL PGMESS(IERR,21,1,'GEOMETRIE NON VALIDE',MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9999 ENDIF IF( ITRACE.NE.0 )THEN CALL PGMESS(101,29,1,'NOMBRE DE COMPOSANTES CONNEXES: ',MESSAG) CALL ESEINT(1,MESSAG,NCC,1) ENDIF C IF((NCC.GT.1).AND.(NITMAX.LT.NBPMAX))THEN IERR = -2 CALL PGMESS(IERR,22,1,'TROP DE COMPOSANTES CONNEXES',MESSAG) CALL ESECHA(1,MESSAG,' ') GOTO 9999 ENDIF ELSE C --- CA DOIT DEJA ETRE FAIT --- C --- ON NE CREE PAS LA STRUCTURE --- NBCMAX = 0 NOEMAX = 0 NCC = 0 ENDIF C 9999 END C C C REMARQUES : C 1. attention il faut faudra la difference entre 1 message C et un bout de texte ! C 2. Chaque module "independant" qui affiche ses propres messages C a une copie de XXMESS avec ses traductions ! C SUBROUTINE PGMESS(ITYPE,NUM1,NUM2,IMESS,IMESSL) C ***************************************************************** C OBJET MSERRO : construit le message IMESSL de code INUM dans la C langue definie (traduit le message IMESS) C ITYPE : type de message C -X : -1, -2, -3 messages d'erreur C 0 : warning C +X : message informatif C < 100 message informatif reserve (identitie) C 1 help on line C 2 C > 100 message quelconque C ***************************************************************** CHARACTER*(*) IMESS,IMESSL INTEGER ITYPE,NUM1,NUM2 C C character*63 helponline(5) character*512 helponline data helponline / >'Usage : delos [v/s/h] Df1 [Df2] [Rf1] [Rf2] [nbn]\n >OPTION : v for verbose, s for silent and h for help\n > where Df1 is the data geometry file Df2 the data mesh size file >Rf1 the resulting mesh file and Rf2 the resulting mesh size.\n > [] means the parameter is optional.'/ character*63 errmess(26) data errmess / >' ', >'while reading the file : ', >'error in the file : ', >'in the points coordinate definition.', >'illegal space dimension', >'dimension must be 3 with an edge with more than 2 zones.', >'no point and no edge in the file : ', >'no edge in the file : ', >'elements are NOT edges.', C 10 >'mesh definition file is not correct.', >'density function CAN T be used in 3D.', >'carreful with that combination... ', >'maximum number of nodes set.', >'mesh size MUST be given at each node of the geometry.', >'no more memory (for integers).', >'no more memory (for reals).', >'while writting file : ', >'random generation of points selected and no maximum set.', >'Maximum number of nodes already reach : ', C 20 >'while writing the file : ', >'geometry is not valid', >'too many polygons ', C DSTEST >'the name of the resulting mesh file is missing', >'no mesh file given, the nodal values won t be located', >'Maximum number of nodes reached : ', >'123456789012345678901234567890123456789012345678901234567890123'/ character*63 messtype(5) data messtype / >'WARNING ', >'DATA ERROR ', >'COMPUTER ERROR ', >'NOT YET POSSIBLE ', >'123456789012345678901234567890123456789012345678901234567890123'/ character*63 messages(31) data messages/ >' ', >'Geometry file ?', >'Mesh size definition file ?', >'Name of the resulting mesh ?', >'Name of the resulting mesh size (optional) ?', >'Maximum number of nodes (optional) ?', >'Online help ', >'For online help type : delos h', >'must be given.', C 10 >'can be given.', >'The maximum number of node is : ', >'The maximum number of triangles is : ', >'Maximum number of nodes reached !', >'Number of nodes : ', >'Number of edges : ', >'Number of borders : ', >'Number of triangles : ', >'Number of zones : ', >'Number of values : ', C 20 >'-->WRITTING MESH FILE : ', >'-->WRITTING DENSITY MESH FILE : ', >'Resulting file : ', >'-->MESHING THE ZONE : ', >'-->READING GEOMETRY FILE : ', >'-->READING MESH FILE : ', >'-->READING SIZE FILE : ', >'Number of concentrations : ', >'Number of points : ', >'Number of non-connex polygons :', C 30 >'nodal value computation only', >'123456789012345678901234567890123456789012345678901234567890123'/ INTEGER LENCHR EXTERNAL LENCHR IF( ITYPE.LE.0 )THEN C --- entete IMESSL=messtype(1-ITYPE)(1:LENCHR(messtype(1-ITYPE))+1)//' ' >//errmess(NUM1)(1:LENCHR(errmess(NUM1)))//' ' >//errmess(NUM2)(1:LENCHR(errmess(NUM2)))//' ' C --- pour le debug : c write(*,*)ITYPE,NUM1,NUM2,IMESSL GOTO 9999 ENDIF c IF( ITYPE.LT.100 )THEN GOTO (10,20) ITYPE GOTO 1100 C ---- help on line ----- 10 CONTINUE IMESSL=helponline GOTO 1100 C --------- 20 CONTINUE GOTO 1100 1100 CONTINUE GOTO 9999 ENDIF IMESSL=messages(NUM1)(1:LENCHR(messages(NUM1)))// >' '//messages(NUM2)(1:LENCHR(messages(NUM2)))//' ' C --- pour le debug : c write(*,*)ITYPE,NUM1,NUM2,IMESSL 9999 END C