lirmed
C LIRMED SOURCE OF166741 24/03/28 21:15:03 11811 C*********************************************************************** C NOM : lirmed.eso C DESCRIPTION : Sortie d'un maillage au format .med C*********************************************************************** C HISTORIQUE : 21/12/2010 : CHAT : creation de la subroutine C HISTORIQUE : 04/11/2013 : CB215821 : PASSAGE AU FORMAT 3.0 DE MED C HISTORIQUE : 05/01/2017 : CB215821 : GESTION DES ERREURS DE LECTURE C HISTORIQUE : 23/10/2017 : RPAREDES : LECTURE CHPOINT,MCHAML,PASAPAS C HISTORIQUE : 09/10/2018 : BERTHINC : SOUCIS SI TASSPO dans PARAVIS C HISTORIQUE : 28/20/2019 : BERTHINC : PASSAGE AU FORMAT 4.0 DE MED C HISTORIQUE : 25/11/2022 : OF : AMELIORATIONS LECTURE DES POINTS C HISTORIQUE : 25/11/2022 : OF : LECTURE D'UN SEUL MAILLAGE MED C HISTORIQUE : 25/11/2022 : OF : MEILLEURE GESTION DES SEGMENTS C HISTORIQUE : 25/11/2022 : OF : AJOUT LECTURE POLYGONES C HISTORIQUE : 10/01/2024 : OF : QUELQUES AMELIORATIONS C HISTORIQUE : 22/01/2024 : OF : QUELQUES AMELIORATIONS (2) C HISTORIQUE : 31/01/2024 : OF : QUELQUES MODIFICATIONS C HISTORIQUE : 12/02/2024 : OF : PASSAGE A LA VERSION MED 64B C*********************************************************************** C Priere de PRENDRE LE TEMPS DE COMPLETER LES COMMENTAIRES C en cas de modification de ce sous-programme afin de faciliter C la maintenance ! C*********************************************************************** C APPELE PAR : operateur LIRE (lirefi.eso) C*********************************************************************** C ENTREES : aucune C SORTIES : aucune C*********************************************************************** C SYNTAXE (GIBIANE) : C C TAB1 = LIRE 'MED' 'fichier.med' ; C C*********************************************************************** SUBROUTINE LIRMED IMPLICIT INTEGER(i-n) IMPLICIT REAL*8(a-h,o-z) -INC PPARAM -INC CCOPTIO -INC CCGEOME -INC CCMED -INC SMCOORD -INC SMELEME -INC SMTABLE -INC SMMED C Definition des reels *8 REAL*8 dt C-----Chaines de Caractere de longueur MED_SNAME_SIZE=16 CHARACTER*(MED_SNAME_SIZE) dtunit C-----Chaines de Caractere de longueur MED_NAME_SIZE=64 CHARACTER*(MED_NAME_SIZE) name CHARACTER*(MED_NAME_SIZE) fam CHARACTER*(MED_NAME_SIZE) fname CHARACTER*(MED_NAME_SIZE) mname CHARACTER*(MED_NAME_SIZE) dname C-----Chaines de Caractere de longueur MED_LNAME_SIZE=80 CHARACTER*(MED_LNAME_SIZE) char80 C-----Chaines de Caractere de longueur MED_COMMENT_SIZE=200 CHARACTER*(MED_COMMENT_SIZE) desc C ***** FIN C ***** Declaration des variables CHARACTER*8 cha8b, charin,charre, typobj,typmot CHARACTER*64 cha64a, cha64b LOGICAL ltelq, login, logre CHARACTER*(LOCHAI) medres,medmai EXTERNAL LONG C ***** Declaration des segments SEGMENT SAWORK CHARACTER*(MED_SNAME_SIZE) ANAME(jdim) CHARACTER*(MED_SNAME_SIZE) AUNIT(jdim) ENDSEGMENT C-----Contiendra les MAILLAGES SIMPLES au sens de Cast3M C ntypel ==> Type d'element au sens de Cast3M C IPOMAI ==> pointeur MAILLAGE SIMPLE C INUMLI ==> pointeur vers le tableau des numeros de famille de chaque element SEGMENT MAITOT INTEGER IPOMAI(ntypel) INTEGER INUMLI(ntypel) ENDSEGMENT C-----Contiendra les numeros des familles des noeuds SEGMENT NUMLI8 INTEGER NUMLIS(nbelem) ENDSEGMENT POINTEUR LFPOLY.NUMLI8 C-----SEGMENT contenant les informations sur les familles C infam ==> Indice de la famille C IFAMNU ==> Numero de la famille C PFAMGR ==> Pointeur vers le SEGMENT SFAMGR : nom des groupes dans la famille C CFANOM ==> Nom de la famille C PFAMAI ==> Pointeur vers MELEME de la famille en question SEGMENT SFAMI INTEGER IFAMNU(infam) INTEGER PFAMGR(infam) CHARACTER*(MED_NAME_SIZE) CFANOM(infam) INTEGER PFAMAI(infam) ENDSEGMENT C-----SEGMENT contenant les noms des groupes SEGMENT SFAMGR CHARACTER*(MED_LNAME_SIZE) CFGRN(ngroup) ENDSEGMENT C-----SEGMENT contenant les groupes de noms differents (Casse comprise) C CGRNOM ==> Nom des groupes differents SEGMENT SGRTOT CHARACTER*(MED_NAME_SIZE) CGRNOM(ngrdif) ENDSEGMENT C-- SEGMENT qui contiendra le nom de tous les maillages du fichier POINTEUR LINOMA.SGRTOT SEGMENT ICOOR REAL*8 XCOO(isdim,nbpta) ENDSEGMENT SEGMENT SINT4 INTEGER INT4(itaill) ENDSEGMENT POINTEUR LMAIL2.SINT4,LPOLY.SINT4,LINDP.SINT4,LCONP.SINT4 C----- SEG SLSCHA C LSNMAI : nom du maillage C ncham : nombre de champs (CHPOINT ou MCHAML) C LSNCHA : liste des noms de champs C LSCHIN : liste de SEG CHAINF (information) C LSPARA : liste de SEG CHAPAR (parametres) SEGMENT SLSCHA CHARACTER*(MED_NAME_SIZE) LSNMAI CHARACTER*(MED_NAME_SIZE) LSNCHA(ncham) INTEGER LSCHIN(ncham), LSPARA(ncham) ENDSEGMENT C----- SEG SLSSOR C nbsor : nombre de champs a sortir C CHATYP : type de champ (CHPOINT, MCHAML ou TABLE) C CHANOM : nom du champ C CHALIS : liste de champs dans un segment SLSFUS(CHPOINT ou MCHAML) C ou SLSSOR(TABLE) SEGMENT SLSSOR CHARACTER*8 CHATYP(nbsor) CHARACTER*(MED_NAME_SIZE) CHANOM(nbsor) INTEGER CHALIS(nbsor) ENDSEGMENT POINTEUR SLSSO1.SLSSOR SEGMENT SLSFUS INTEGER CHAFUS(nbfus) ENDSEGMENT SEGMENT CHAINF C nseq : nombre de sequences de calcul dans le champ C ncomp : nombre de composantes C INUMDT : liste de numeros de pas de tps C INUMIT : liste de numeros d'iteration C ISCHPR : liste de SEG CHAPRO (profil) C XDT : liste de pas de tps C CNAME : liste de noms des composants C CUNIT : liste d'unites des composants INTEGER INUMDT(nseq), INUMIT(nseq), ISCHPR(nseq) REAL*8 XDT(nseq) CHARACTER*(MED_SNAME_SIZE) CNAME(ncomp), CUNIT(ncomp) ENDSEGMENT C----- SEG CHAPAR C ncpars : nombre de parametres par champ C CHAPAR : nom du parametre C CPARVL : valeur du parametre SEGMENT CHAPAR CHARACTER*(MED_SNAME_SIZE) CPARNM(ncpars) INTEGER CPARVL(ncpars) ENDSEGMENT C----- SEG CHAPRO C nprof : nombre de profils C CTYPE : type de champ C CPRONA : nom du profil C CETYPE : entity type C CGTYPE : geometry type SEGMENT CHAPRO CHARACTER*8 CTYPE(nprof) CHARACTER*(MED_NAME_SIZE) CPRONA(nprof) INTEGER CETYPE(nprof), CGTYPE(nprof) ENDSEGMENT C----- SEG LISPRO C ntprof : nombre total de profils C DPNAME : nom du profil C LNAME : localisation du profil SEGMENT LISPRO CHARACTER*(MED_NAME_SIZE) DPNAME(ntprof), LNAME(ntprof) ENDSEGMENT if (iimpi.EQ.1972) then write(ioimp,*) write(ioimp,*) 'Entree dans LIRE "MED"' write(ioimp,*) '----------------------' endif C*********************************************************************** C* 0 - Initialisations (pour retour a etat de depart en cas d'erreur) C*********************************************************************** SEGACT,MCOORD*MOD IDIM_REF = IDIM NBPTS_REF = NBPTS MEDTAB = 0 MTABLE = 0 typmot = 'MOT ' C*********************************************************************** C* 1 - Lecture des arguments et options de 'LIRE' 'MED' C*********************************************************************** C* 1.1 - Nom du fichier MED medres = ' ' ilores = 0 icond = 1 IF (IERR.NE.0) GOTO 9999 C* 1.2 - Nom du maillage a lire, numero du maillage a lire (par defaut tous) C* Cas particulier : obtention du nom de tous les maillages si 0 est lu IMEDMA = -3 medmai = ' ' ilomai = 0 icond = 0 IF (IERR.NE.0) GOTO 9999 IF (iretou.GT.0) THEN IF (ilomai.GT.MED_NAME_SIZE) THEN moterr = 'Nom du maillage trop long pour MED' ELSE IF (ilomai.LT.1) THEN moterr = 'Nom du maillage de taille nulle' ENDIF if (iimpi.eq.1972) then write(ioimp,*) 'MEDMAI=',medmai(1:ilomai),'=' endif IF (IERR.NE.0) GOTO 9999 IMEDMA = -1 ELSE IF (IERR.NE.0) GOTO 9999 IF (iretou.GT.0) THEN IF (ia.LT.0) THEN interr(1) = ia GOTO 9999 END IF IMEDMA = ia ENDIF ENDIF C*********************************************************************** C* 2 - Ouverture du fichier - Debut de la lecture C*********************************************************************** C *** Initialisation du code de retour (=0 si OK, probleme sinon) mcret = 0 C *** Ouverture d'un fichier MED macces = MED_ACC_RDONLY CALL MFIOPE(mfid, medres(1:ilores), macces, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mfiope' interr(1) = mcret GOTO 9999 ENDIF C *** Verification de la compatibilite d'un fichier avec HDF et MED CALL MFICOM(medres(1:ilores), hdfok, medok, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mficom' interr(1) = mcret GOTO 9998 ENDIF C *** Lecture du numero de version de la bibliotheque MED utilisee pour creer le fichier CALL MFINVR(mfid, major, minor, mrele, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mfinvr' interr(1) = mcret GOTO 9998 ENDIF if (iimpi.EQ.1972) then write(moterr,'(A,I2,A,I2,A,I2)') & 'Read MED file version ',major,'.',minor,'.',mrele endif C *** On ne sait pas lire du MED anterieur a 3 IF (major .LT. 3) THEN write(moterr,'(A,I2,A,I2,A,I2)') & 'Bad MED file version ',major,'.',minor,'.',mrele interr(1) = 9999 GOTO 9998 ENDIF C *** Lecture du nombre de maillages dans le fichier MED CALL MMHNMH(mfid, nbmail, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mmhnmh' interr(1) = mcret GOTO 9998 ENDIF if (iimpi.EQ.1972) then write(ioimp,*) 'Nombre de maillages du fichier',nbmail endif C ***** Nombre de champs a lire CALL mfdnfd(mfid, nbcham, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mfdnfd' interr(1) = mcret GOTO 9998 ENDIF if (iimpi.EQ.1972) then write(ioimp,*) 'Nombre de champs du fichier',nbcham endif C ***** Recherche des parametres numeriques CALL mprnpr(mfid, nparam, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mprnpr' interr(1) = mcret GOTO 9998 ENDIF if (iimpi.EQ.1972) then write(ioimp,*) 'Nombre de parametres numeriques',nparam endif C ***** Nombre de profils CALL mpfnpf(mfid, n4, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mpfnpf' interr(1) = mcret GOTO 9998 ENDIF ntprof = n4 ntprof = MAX(ntprof,1) if (iimpi.EQ.1972) then write(ioimp,*) 'Nombre de profils',ntprof,n4 endif C*********************************************************************** C* 3 - Quelques premieres initialisations et verifications C*********************************************************************** C- Pour la table inin = 0 inre = 0 login = .FALSE. logre = .FALSE. floin = 0.D0 flore = 0.D0 charin = ' ' charre = ' ' SAWORK = 0 jdim = 3 SEGINI,SAWORK DO ii = 1, jdim SAWORK.ANAME(ii) = ' ' SAWORK.AUNIT(ii) = ' ' END DO C- Recherche et stockage du nom de tous les maillages du fichier C- On verifie qu'il n'y a pas redondance des noms. LINOMA = 0 ngrdif = nbmail SEGINI,LINOMA isdim = 0 DO imel = 1, nbmail LINOMA.CGRNOM(imel) = ' ' name = ' ' it = imel CALL MMHMII(mfid, it, name, msdim, mmdim, mmtype, desc, dtunit, & mstype, nstep, matype, ANAME, AUNIT, mcret) if (iimpi.EQ.1972) then write(ioimp,*) '1) sdim,mtype,mdim,stype,nstep,atype lus :', & msdim,mmtype,mmdim,mstype,nstep,matype write(ioimp,*) (ANAME(i),AUNIT(i),i=1,jdim) endif IF (mcret .NE. 0) THEN moterr = 'lirmed / mmhmii' interr(1) = mcret GOTO 9997 ENDIF if (msdim.le.0) then moterr = 'lirmed / mmhmii / msdim' interr(1) = msdim goto 9997 endif LINOMA.CGRNOM(imel) = name moterr = ' : Mesh name "'//name(1:ilm)//'"' write(moterr(2:4),'(I3)') imel if (iimpi.EQ.1972) then endif DO ii = 1, imel-1 IF (name .EQ. LINOMA.CGRNOM(ii)) THEN moterr = moterr(1:ilm)//' already defined !' GOTO 9997 END IF END DO ii = msdim isdim = MAX(isdim, ii) ENDDO if (iimpi.EQ.1972) then write(ioimp,*) 'SDIM',isdim moterr = ' ' endif C*********************************************************************** C* 4 - Cas particuliers : - On ne souhaite que la liste des maillages C* - On veut tous les maillages et leur nombre =0 C*********************************************************************** IF (IMEDMA.EQ.0) THEN if (iimpi.eq.1972) then moterr = 'Nombre de maillages dans le fichier' write(moterr(36:39),fmt='(I4)') nbmail endif m = nbmail SEGINI,MTABLE typobj = 'ENTIER ' DO imel = 1, nbmail name = LINOMA.CGRNOM(imel) & login,inin, & typmot,inre,flore,name(1:ilm), & logre,inre) ENDDO if (iimpi.EQ.1972) then write(ioimp,*) c#DBG moterr = ' ' c#DBG CALL ERREUR(-385) endif MEDTAB = MTABLE GOTO 9997 ENDIF IF (IMEDMA.EQ.-3 .AND. nbmail.EQ.0) THEN m = 0 SEGINI,MTABLE MEDTAB = MTABLE GOTO 9997 ENDIF C*********************************************************************** C* 5 - Recherche du maillage si demande (son nom sera dans medmai). C* Par defaut, on lira tous les maillages. C*********************************************************************** C 5.1 - Le nom du maillage est donne, on verifie s'il existe dans le C fichier dont la liste des maillages est maintenant connu, on C a alors l'indice du maillage imel_i = imel_f = indice_de_medmai IF (IMEDMA.EQ.-1) THEN imel_i = 0 DO imel = 1, nbmail name = LINOMA.CGRNOM(imel) if (iimpi.EQ.1972) then write(ioimp,*) 'Traitement du maillage ',imel,' / ',nbmail write(ioimp,*) 'name=',name(1:ilm),'=' endif IF (name(1:ilm).EQ.medmai(1:ilomai)) THEN IF (imel_i.NE.0) THEN write(ioimp,*) 'Maillage deja trouve',imel_i,'<-',imel GOTO 9997 ENDIF imel_i = imel ENDIF ENDDO IF (imel_i.EQ.0) THEN moterr = 'Maillage/Mesh "'//medmai(1:ilomai)// & '" non trouve/not found' GOTO 9997 ENDIF imel_f = imel_i IMEDMA = imel_i C 5.2 - On veut relire tous les maillages du fichier, boucle sur les C indices des maillages seront de imel_i = 1 a imel_f = nbmail ELSE IF (IMEDMA .EQ. -3) THEN imel_i = 1 imel_f = nbmail C 5.3 - L'indice du maillage est donne, on verifie s'il est coherent C avec le nombre de maillages du fichier et on recupere alors C son nom (dans medmai) et imel_i = imel_f = IMEDMA ELSE IF (IMEDMA.LT.1 .OR. IMEDMA.GT. nbmail) THEN moterr = 'Mesh number " " not found' write(moterr(14:16),'(I3)') IMEDMA GOTO 9997 ENDIF imel_i = IMEDMA imel_f = imel_i C-------Recuperation du nom du maillage name = LINOMA.CGRNOM(imel_i) medmai(1:ilomai) = name(1:ilomai) ENDIF C*********************************************************************** C* 6 - Dimension du ou des maillages a lire C*********************************************************************** imdim = 0 DO imel = imel_i, imel_f it = imel C---Lecture du nombre d'axes du repere des coordonnees du maillage CALL MMHNAX(mfid, it, n4, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mmhnax' interr(1) = mcret GOTO 9997 ENDIF ii = n4 imdim = MAX(imdim, ii) ENDDO if (iimpi.EQ.1972) then write(ioimp,*) '6) IMDIM =',imdim endif C---Changement de la dimension de l'espace en cas de necessite C---J'utilise le GIBIANE pour le faire : "OPTI DIME imdim ;" IF (IDIM .LT. imdim) THEN IF (IERR .NE. 0) THEN moterr = 'LIRE MED - ERREUR de changement de DIMEnsion' GOTO 9997 ENDIF moterr = ' ' moterr = 'Passage en DIMEnsion ' write(moterr(22:22),'(I1)') imdim moterr = ' ' SEGACT,MCOORD*MOD ENDIF IDIMP1 = IDIM + 1 C*********************************************************************** C* 7 - Initialisations C*********************************************************************** C* 7.1 - On initialise la table (au minimum N maillages et N maillages de POI1) m = 2 * (imel_f - imel_i + 1) SEGINI,MTABLE ltelq = .TRUE. C* 7.2 - Quelques segments locaux : C- (legerement surdimensionnes pour ne les definir q'une seule fois) C- ntypol = MED_MAXCPO pour les polygones ayant de 1 a MED_MAXCPO cotes C- Ce segment sert a chaque maillage (a remettre a zero avant lecture du maillage) MAITOT = 0 ntypol = MED_MAXCPO ntypel = 1 + MED_GTABLE + ntypol SEGINI,MAITOT LPOLY = 0 itaill = ntypol SEGINI,LPOLY LISPRO = 0 SEGINI,LISPRO C*********************************************************************** C* 8 - Boucle sur le ou les maillages et champs a relire C*********************************************************************** DO imel = imel_i, imel_f IF (IMEDMA.EQ.-3) THEN name = LINOMA.CGRNOM(imel) medmai(1:ilomai) = name(1:ilomai) ENDIF NUMLI8 = 0 SFANOE = 0 SFAMI = 0 SFAMGR = 0 ICOOR = 0 SINT4 = 0 SLSCHA = 0 SLSSOR = 0 SLSFUS = 0 CHAINF = 0 CHAPAR = 0 CHAPRO = 0 LMAIL2 = 0 LINDP = 0 LCODP = 0 LFPOLY = 0 DO ii = 1, ntypel maitot.IPOMAI(ii) = 0 maitot.INUMLI(ii) = 0 ENDDO DO ii = 1, ntypol lpoly.INT4(ii) = 0 ENDDO DO ii = 1, ntprof lispro.DPNAME(ii) = ' ' lispro.LNAME(ii) = ' ' ENDDO C--- Lecture et traitement du maillage imel name = ' ' it = imel CALL MMHMII(mfid, it, name, msdim, mmdim, mmtype, desc, dtunit, & mstype, nstep, matype, ANAME, AUNIT, mcret) if (iimpi.EQ.1972) then write(ioimp,*) '2) sdim,mtype,mdim,stype,nstep,atype lus :', & msdim,mmtype,mmdim,mstype,nstep,matype write(ioimp,*) (ANAME(i),AUNIT(i),i=1,jdim) endif IF (mcret .NE. 0) THEN moterr = 'lirmed / mmhmii' interr(1) = mcret GOTO 199 ENDIF if (msdim.le.0) then moterr = 'lirmed / mmhmii / msdim' interr(1) = msdim goto 199 endif if (iimpi.EQ.1972) then write(ioimp,*) 'name=',name(1:ilm),'=' endif IF (name(1:ilm) .NE. medmai(1:ilomai)) THEN moterr = 'LIRE MED - FATAL ERROR - incorrect MeshName ?' GOTO 199 ENDIF isdim = msdim itypem = mmtype C ***** Lecture du nombre d'entites (Noeuds ici) dans un maillage MED if (iimpi.EQ.1972) then write(ioimp,*) 'Lecture du nombre d entites (Noeuds ici) ' endif numdt = MED_NO_DT numit = MED_NO_IT metype = MED_NODE mgtype = 0 mdtype = MED_COORDINATE mcmode = MED_NODAL mchgt = MED_FALSE mtsf = MED_FALSE CALL MMHNME(mfid, name, numdt, numit, metype, mgtype, mdtype, & mcmode, mchgt, mtsf, n4, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mmhnme' interr(1) = mcret GOTO 199 ENDIF nbpta = n4 if (iimpi.EQ.1972) then write(ioimp,*) 'Lecture des coordonnees des noeuds' write(ioimp,*) 'Nombre de noeuds =',nbpta endif C ***** Lecture des coordonnees des noeuds MED SEGINI,ICOOR numdt = MED_NO_DT numit = MED_NO_IT mswm = MED_FULL_INTERLACE CALL MMHCOR(mfid, name, numdt, numit, mswm, ICOOR.XCOO, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mmhcor' interr(1) = mcret GOTO 199 ENDIF C-----Mise a jour du SEGMENT MCOORD C-----Les coordonnees des noeuds lus sont placees dans le tableau XCOOR NBNOIN = NBPTS ndec = mcoord.XCOOR(/1) NBPTS = NBNOIN + nbpta SEGADJ,MCOORD DO ia = 1, nbpta DO ii = 1, isdim mcoord.XCOOR(ndec+ii) = ICOOR.XCOO(ii,ia) ENDDO ndec = ndec + IDIMP1 ENDDO if (iimpi.EQ.1972) then write(ioimp,*) '- Coordonnees des noeuds :',nbpta,NBNOIN do ia = 1, min(nbpta,200) write(ioimp,*) '[',ia,']',(xcoo(i,ia),i=1,isdim) enddo if (nbpta.gt.200) write(ioimp,*) '[ ... ]' endif C-----Creation du MAILLAGE SIMPLE de POI1 C-----La connectivite lue est decalee si des noeuds existaient avant (NBNOIN) nbnn = 1 nbelem = nbpta nbsous = 0 nbref = 0 SEGINI,IPT1 IPT1.ITYPEL = 1 DO ib = 1, nbelem IPT1.NUM(1,ib) = NBNOIN + ib IPT1.ICOLOR(ib) = idcoul ENDDO if (iimpi.EQ.1972) then write(ioimp,*) 'Creation du MAILLAGE SIMPLE de POI1',IPT1 endif C On preconditionne le maillage POI1 des noeuds avant toute utilisation C ***** Lecture des numeros de famille des noeuds pour generer les POI1 if (iimpi.EQ.1972) then write(ioimp,*) 'Lecture des numeros de famille des noeuds' endif nbelem = nbpta SEGINI,NUMLI8 numdt = MED_NO_DT numit = MED_NO_IT metype = MED_NODE mgtype = 0 CALL MMHFNR(mfid, name, numdt, numit, metype, mgtype, & NUMLI8.NUMLIS, mcret) IF (mcret.GT.0) THEN moterr = 'lirmed / mmhfnr' interr(1) = mcret GOTO 199 ENDIF if (iimpi.EQ.1972) then write(ioimp,*) 'NUMLI8',numli8,nbelem,nbpta c#DBG write(ioimp,'(2000000(1X,I2,1X))') (numli8.numlis(i),i=1,nbelem) endif nbtype = 1 C-----Sauvegarde du pointeur vers le MELEME simple maitot.IPOMAI(nbtype) = IPT1 C-----Sauvegarde du pointeur vers le tableau des numeros de famille de chaque noeud de ce MAILLAGE SIMPLE de POI1 maitot.INUMLI(nbtype) = NUMLI8 C Verifier que l'on se sert de ce maillage de POI1 comme reference pour les CHPOINTS C-----Boucle sur tous les types d'elements autres que POI1 (deja traite) C ***** Lecture du nombre d'entites (Elements ici) en balayant tous les C ***** MAILLAGES SIMPLES d'un maillage MED >= 3.* C ***** TRAITEMENT PARTICULIER des elements MED_POLYGON soit ity=32 'POLY' DO itypem = 1, MED_GTABLE numdt = MED_NO_DT numit = MED_NO_IT metype = MED_CELL mgtype = MEDGTB(itypem) ITY = MDICLA(mgtype) IF (ITY .EQ. 32) GOTO 211 C ***** Cas general ***** if (iimpi.eq.1972) then write(ioimp,*) 'Lecture maillage elementaire - cas general' write(ioimp,*) 'Type',itypem,mgtype,ITY,NOMS(ITY) endif C--- Lecture du nombre d'elements : mdtype = MED_CONNECTIVITY mcmode = MED_NODAL mchgt = MED_FALSE mtsf = MED_FALSE CALL MMHNME(mfid , name, numdt, numit, metype, mgtype, & mdtype, mcmode, mchgt, mtsf , n4 , mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mmhnme' interr(1) = mcret GOTO 199 ENDIF nbelem = n4 IF (nbelem .EQ. 0) GOTO 21 C--- Lecture de la connectivite des elements nbnn = NBNNE(ITY) nbsous = 0 nbref = 0 SEGINI,IPT1 IPT1.ITYPEL = ITY DO ib = 1, nbelem IPT1.ICOLOR(ib) = idcoul ENDDO if (iimpi.eq.1972) then write(ioimp,*) 'Maillage ',nbelem,nbnn,IPT1 endif mcmode = MED_NODAL mswm = MED_FULL_INTERLACE CALL MMHCYR(mfid, name, numdt, numit, metype, mgtype, & mcmode, mswm, IPT1.NUM, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mmhcyr' interr(1) = mcret GOTO 199 ENDIF if (iimpi.eq.1972) then write(ioimp,*) 'Lect. des familles des elements' endif SEGINI,NUMLI8 CALL MMHFNR(mfid, name, numdt, numit, metype, mgtype, & NUMLI8.NUMLIS, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mmhfnr' interr(1) = mcret GOTO 199 ENDIF nmai2 = 1 itaill = 2 * nmai2 SEGINI,LMAIL2 LMAIL2.INT4(1) = IPT1 LMAIL2.INT4(2) = NUMLI8 GOTO 210 C **** Cas particulier des MED_POLYGON & ity=32 **** 211 CONTINUE if (iimpi.eq.1972) then write(ioimp,*) 'Lecture maillage elementaire - cas POLYGON' write(ioimp,*) 'Type',itypem,mgtype,ITY,NOMS(ITY) endif mdtype = MED_INDEX_NODE mcmode = MED_NODAL mchgt = MED_FALSE mtsf = MED_FALSE CALL MMHNME( mfid, name, numdt , numit, & metype, mgtype, mdtype, & mcmode, mchgt, mtsf , n4, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mmhnme' interr(1) = mcret GOTO 199 ENDIF nbpoly = n4 - 1 IF (nbpoly .LE. 0) GOTO 21 C--- Lecture de la connectivite des elements mdtype = MED_CONNECTIVITY mcmode = MED_NODAL mchgt = MED_FALSE mtsf = MED_FALSE CALL MMHNME( mfid, name, numdt, numit, & metype, mgtype, mdtype, & mcmode, mchgt, mtsf , n4, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mmhnme' interr(1) = mcret GOTO 199 ENDIF nbconn = n4 if (iimpi.eq.1972) then write(ioimp,*) 'Maillage ',nbpoly,nbconn endif itaill = nbpoly + 1 SEGINI,LINDP itaill = nbconn SEGINI,LCONP CALL MMHPGR(mfid , name, numdt, numit, metype, mcmode, & LINDP.INT4,LCONP.INT4, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mmhpgr' interr(1) = mcret GOTO 199 ENDIF if (iimpi.eq.1972) then write(ioimp,*) 'Lect. des familles des elements' endif nbelem = nbpoly SEGINI,LFPOLY CALL MMHFNR(mfid, name, numdt, numit, metype, mgtype, & LFPOLY.NUMLIS, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mmhfnr' interr(1) = mcret GOTO 199 ENDIF DO ib = 1, nbpoly ind1 = LINDP.INT4(ib) ind2 = LINDP.INT4(ib+1)-1 nbnn = ind2 - ind1 + 1 lpoly.INT4(nbnn) = lpoly.INT4(nbnn) + 1 END DO i_z = 0 nmai2 = 0 DO ib = 1, ntypol nbelem = lpoly.INT4(ib) i_z = i_z + nbelem IF (nbelem.NE.0) nmai2 = nmai2 + 1 ENDDO IF (i_z.NE.nbpoly) then moterr = 'lirmed / verif nbpoly' interr(1) = 1 GOTO 199 ENDIF itaill = 2 * nmai2 SEGINI,LMAIL2 nbsous = 0 nbref = 0 nmai2 = 0 DO ib = 1, ntypol nbnn = ib nbelem = lpoly.INT4(ib) IF (nbelem.NE.0) THEN SEGINI,IPT1 IPT1.ITYPEL = ITY DO ia = 1, nbelem IPT1.ICOLOR(ia) = idcoul ENDDO IPT1.ICOLOR(1) = 0 SEGINI,NUMLI8 nmai2 = nmai2 + 1 LMAIL2.INT4(2*nmai2-1) = IPT1 LMAIL2.INT4(2*nmai2) = NUMLI8 lpoly.INT4(ib) = nmai2 ENDIF ENDDO DO ib = 1, nbpoly ind1 = LINDP.INT4(ib) ind2 = LINDP.INT4(ib+1)-1 nbnn = ind2 - ind1 + 1 ii = lpoly.INT4(nbnn) IPT1 = LMAIL2.INT4(2*ii-1) NUMLI8 = LMAIL2.INT4(2*ii) ielt = IPT1.ICOLOR(1) + 1 DO ia = 1, nbnn IPT1.NUM(ia,ielt) = LCONP.INT4(ind1-1+ia) ENDDO IPT1.ICOLOR(1) = ielt NUMLI8.NUMLIS(ielt) = LFPOLY.NUMLIS(ib) ENDDO SEGSUP,LINDP,LCONP itaill = nbconn GOTO 210 210 CONTINUE itaill = 50 SEGINI,SINT4 DO ii = 1, nmai2 IPT1 = LMAIL2.INT4(2*ii-1) NUMLI8 = LMAIL2.INT4(2*ii) nbnn = IPT1.NUM(/1) nbelem = IPT1.NUM(/2) IPT1.ICOLOR(1) = idcoul C---------La connectivite lue est decalee si des noeuds existaient avant IF (NBNOIN .NE. 0) THEN DO ib = 1, nbelem DO ia = 1, nbnn IPT1.NUM(ia,ib) = IPT1.NUM(ia,ib) + NBNOIN ENDDO ENDDO ENDIF C---------Passage de la connectivite MED a Cast3M si besoin IF (IPER .GE. 0) THEN nn = nbnn - 1 DO ib = 1, nbelem DO ia = 1, nn SINT4.INT4(ia) = ipt1.num(ia+1,ib) ENDDO DO ia = 1, nn ipt1.num(IPERM(IPER+ia),ib) = SINT4.INT4(ia) ENDDO ENDDO ENDIF nbtype = nbtype + 1 C---------Sauvegarde du pointeur vers le MELEME simple maitot.IPOMAI(nbtype) = IPT1 C---------Sauvegarde du pointeur vers le tableau des numeros de famille de chaque element de ce MAILLAGE SIMPLE maitot.INUMLI(nbtype) = NUMLI8 ENDDO SEGSUP,SINT4 SEGSUP,LMAIL2 21 CONTINUE ENDDO C-- Le SEGMENT MAITOT est de dimension ntypel, mais seuls les nbtype C-- premiers indices sont utilises C ***** Creation du MAILLAGE complet des FAMILLES => Partition C ***** Creation d'un MAILLAGE COMPLEXE contenant tous les MELEME SIMPLES nbsous = nbtype - 1 IF (nbsous.EQ.0) THEN moterr = 'LIRE MED - Only points read !' nbref = 0 nbelem = 0 nbnn = 0 SEGINI,IPT1 IPT1.ITYPEL = 0 SEGDES,IPT1 ELSE IF (nbsous.EQ.1) THEN IPT1 = maitot.IPOMAI(nbsous+1) ELSE nbref = 0 nbelem = 0 nbnn = 0 SEGINI,IPT1 DO ia = 1,nbsous IPT1.lisous(ia) = maitot.IPOMAI(ia+1) ENDDO SEGDES,IPT1 ENDIF C-----Ecriture dans la table du MAILLAGE complet des FAMILLES if (iimpi.eq.1972) then write(ioimp,*) 'Ecriture dans la table du maillage ',IPT1 endif typobj = 'MAILLAGE' & login,inin, & typobj,inre,flore,charre , & logre,IPT1) IPT1 = maitot.IPOMAI(1) & login,inin, & typobj,inre,flore,charre , & logre,IPT1) IF (IERR.NE.0) GOTO 199 C ***** Lecture du nombre de familles du maillage CALL MFANFA(mfid, name, n4, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mfanfa' interr(1) = mcret GOTO 199 ENDIF infam = n4 if (iimpi.eq.1972) then write(ioimp,*) 'Nombre de familles du maillage',infam endif ncompg = 0 ngrdif = 10 SEGINI,SGRTOT SEGINI,SFAMI DO ifam = 1, infam if (iimpi.eq.1972) then write(ioimp,*) 'Famille ' ,ifam, ' / ' , infam endif C ***** Lecture du nombre de groupes dans une famille it1 = ifam CALL MFANFG(mfid, name, it1, n4, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mfanfg' interr(1) = mcret GOTO 199 ENDIF ngroup = n4 if (iimpi.eq.1972) then write(ioimp,*) 'Lecture nombre groupes famille ',name,ngroup endif SEGINI,SFAMGR C ***** Lecture des informations sur une famille it1 = ifam CALL MFAFAI(mfid, name, it1, fam, mfnum, SFAMGR.CFGRN, mcret) if (iimpi.eq.1972) then write(ioimp,*) write(ioimp,*) 'Lecture des informations sur une famille ',ifam write(ioimp,*) 'fam =',fam write(ioimp,*) 'fnum=',mfnum write(ioimp,*) 'sfamgr-',(SFAMGR.CFGRN(ii),'-',ii=1, ngroup) endif IF (mcret .NE. 0) THEN moterr = 'lirmed / mfafai' interr(1) = mcret C CALL ERREUR(873) C GOTO 199 ENDIF SFAMI.IFAMNU(ifam) = mfnum SFAMI.PFAMGR(ifam) = SFAMGR SFAMI.CFANOM(ifam) = fam C-------Construction a la volee de la liste des groupes differents IF (ngroup .GT. 0) THEN C---------Cas ou le nombre de groupe(s) n'est pas nul IF (ncompg .EQ. 0) THEN C-----------Cas ou la liste est vierge ==> Ajout de tous les noms ncompg = ncompg + ngroup C-----------Ajustement intermediaire (eventuel) du SEGMENT SGRTOT IF (ncompg.GT.ngrdif) THEN ngrdif = ncompg * 2 + 10 SEGADJ,SGRTOT ENDIF DO ii = 1, ngroup SGRTOT.CGRNOM(ii) = SFAMGR.CFGRN(ii) ENDDO ELSE C-----------Cas ou des noms de groupes existent deja ==> Comparaison aux noms existants DO igroup = 1, ngroup iverif = 0 DO ii = 1, ncompg IF (SFAMGR.CFGRN(igroup).EQ.SGRTOT.CGRNOM(ii)) THEN iverif = 1 ENDIF ENDDO IF (iverif .EQ. 0) THEN C---------------Ajout du groupe s'il n'existe pas deja ncompg = ncompg + 1 C---------------Ajustement intermediaire (eventuel) du SEGMENT SGRTOT IF (ncompg .GT. ngrdif) THEN ngrdif = ngrdif * 2 SEGADJ SGRTOT ENDIF SGRTOT.CGRNOM(ncompg) = SFAMGR.CFGRN(igroup) ENDIF ENDDO ENDIF ENDIF ENDDO C-----Ajustement final (eventuel) du SEGMENT SGRTOT IF (ncompg .NE. ngrdif) THEN ngrdif = ncompg SEGADJ,SGRTOT ENDIF if (iimpi.eq.1972) then write(ioimp,*) write(ioimp,*) 'SGRTOT',ngrdif do i = 1, ngrdif write(ioimp,*) i, SGRTOT.CGRNOM(i) enddo endif C ***** Reconstitution des dependances des maillages dans Cast3M C-----creation des maillages des familles (POI1 compris) nbref = 0 nbsous = 0 IPT3 = 0 C-----Boucle sur les familles lues DO ifam = 1, infam inufam = SFAMI.IFAMNU(ifam) IPT3 = 0 if (iimpi.eq.1972) then write(ioimp,*) write(ioimp,*) 'ifam=',ifam,inufam endif C-------Boucle sur les types d'elements DO itype = 1, nbtype C---------Chargement du numero de famille de la ifam ieme famille NUMLI8 = maitot.INUMLI(itype) nbelem = 0 ielfam = 0 DO ielem = 1, NUMLI8.NUMLIS(/1) C-----------Calcule le nombre d'elements du type itype appartenant a la famille ifam IF (NUMLI8.NUMLIS(ielem) .EQ. inufam) THEN nbelem = nbelem+1 ielfam = ielem ENDIF ENDDO IF (nbelem .GT. 0) THEN C-----------Cas ou un maillage d'elements de type itype est a creer pour la famille ifam C-----------Chargement du maillage complet du type d'element itype IPT1 = maitot.IPOMAI(itype) nbnn = IPT1.num(/1) C* cas particulier des POINTS NOMMES : Solution temporaire IF (nbnn .EQ.1 .AND. nbelem.EQ.1) THEN IPT3 = -IPT1.num(1,ielfam) GOTO 762 ENDIF C-----------Creation du nouveau maillage compose de la partition des elements de IPT1 appartenant a la famille ifam SEGINI IPT2 iel = 0 IPT2.itypel = IPT1.itypel DO ielem = 1, NUMLI8.NUMLIS(/1) IF (NUMLI8.NUMLIS(ielem) .EQ. inufam) THEN iel = iel+1 DO ia = 1, nbnn IPT2.num(ia,iel) = IPT1.num(ia,ielem) ENDDO IPT2.icolor(iel) = idcoul ENDIF ENDDO C-----------Creation du MELEME COMPLEXE s'il y a lieu IF (IPT3 .EQ. 0) THEN IPT3=IPT2 ELSE C-------------Fusion des maillages IPT3 et IPT2 dans IPT4 IPT3 = IPT4 ENDIF 762 CONTINUE ENDIF ENDDO SFAMI.PFAMAI(ifam) = IPT3 ENDDO C-----creation des maillages des groupes : OBJETS NOMMES DANS CAST3M DO igroup=1,ngrdif char80 = SGRTOT.CGRNOM(igroup) if (iimpi.eq.1972) then endif IPT3 = 0 DO ifam = 1, infam SFAMGR = SFAMI.PFAMGR(ifam) DO inomgr = 1, SFAMGR.CFGRN(/2) IF (char80 .EQ. SFAMGR.CFGRN(inomgr)) THEN IPT2 = SFAMI.PFAMAI(ifam) if (iimpi.eq.1972) then write(ioimp,*) ' igr',igroup,inomgr,IPT2 endif IF (IPT3 .EQ. 0)THEN IPT3 = IPT2 ELSE C---------------Fusion des maillages IPT3 et IPT2 dans IPT4 IF (IPT3.LT.0) THEN IPT3 = -IPT3 ENDIF IF (IPT2.LT.0) THEN IPT2 = -IPT2 ENDIF IPT3 = IPT4 ENDIF GOTO 115 ENDIF ENDDO 115 CONTINUE ENDDO C En cas de MAILLAGE VIDE dans MED :(Ne s'appuyant sur aucune FAMILLE) : C'est possible ! IF (IPT3 .EQ. 0) THEN ITEL = ILCOUR NBELEM = 0 NBSOUS = 0 NBREF = 0 IF (NOMS(ITEL).EQ.'POLY') THEN NBNN = 0 ELSEIF (NOMS(ITEL).EQ.'MULT') THEN NBNN = 0 ELSE NBNN = NBNNE(ITEL) ENDIF SEGINI,IPT3 IPT3.ITYPEL=ITEL ENDIF C-----Ecriture dans la table du MAILLAGE du Groupe IF (char80 .NE. ' ') THEN IF (IPT3.GT.0) THEN typobj = 'MAILLAGE' & typobj,inre,flore,charre,logre,IPT3) ELSE typobj = 'POINT ' & typobj,inre,flore,charre,logre,-IPT3) ENDIF ENDIF ENDDO C*********************************************************************** C Lecture des champs C*********************************************************************** IF (nbcham .EQ. 0) GOTO 100 ncham = nbcham SEGINI,SLSCHA SLSCHA.LSNMAI = name icham = 0 DO ia = 1, nbcham if (iimpi.eq.1972) then write(ioimp,*) 'Champ ',ia,' / ',nbcham endif it = ia C-------Nombre de composantes d'un champ CALL mfdnfc(mfid, it, n4, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mfdnfc' interr(1) = mcret GOTO 199 ENDIF ncomp = n4 nseq = 1 SEGINI,CHAINF C-------Information sur le champ fname = ' ' mname = ' ' CALL mfdfdi(mfid, it, fname, mname, lmesh, mmtype, & CHAINF.CNAME,CHAINF.CUNIT, dtunit, n4, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mfdfdi' interr(1) = mcret GOTO 199 ENDIF if (iimpi.eq.1972) then endif IF (mname.NE.name) THEN if (iimpi.eq.1972) then moterr = 'LIRE MED - mname & name are different ?' endif goto 25 END IF nseq = n4 IF (nseq .EQ. 0) THEN moterr = ' LIRE MED - ERREUR nseq=0' GOTO 199 ENDIF IF (nseq .GT. 1) THEN SEGADJ,CHAINF ENDIF if (iimpi.eq.1972) then write(ioimp,*) 'Composantes du champ ',ncomp write(ioimp,*) '-',(CNAME(ii)//'-',ii=1,ncomp) endif C Certains fichiers MED ont des CHAMPS sans composantes nommees ! DO ii = 1, ncomp IF (CHAINF.CNAME(ii) .EQ. ' ') THEN CHAINF.CNAME(ii) = 'SCAL' ENDIF ENDDO if (iimpi.eq.1972) then write(ioimp,*) 'Nombre de sequences du champ',nseq endif DO ii = 1, nseq C---------Lecture des informations caracterisant une sequence de calcul it1 = ii CALL mfdcsi(mfid, fname, it1, numdt, numit, dt, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mfdcsi' interr(1) = mcret GOTO 199 ENDIF CHAINF.INUMDT(ii) = numdt CHAINF.INUMIT(ii) = numit CHAINF.XDT(ii) = dt ENDDO icham = icham + 1 SLSCHA.LSNCHA(icham) = fname SLSCHA.LSCHIN(icham) = CHAINF SLSCHA.LSPARA(icham) = 0 if (iimpi.eq.1972) then write(ioimp,*) 'Ecriture de ',mname,fname,'-> LSNMAI',icham endif 25 CONTINUE ENDDO IF (icham.NE.ncham) THEN ncham = icham SEGADJ,SLSCHA END IF if (iimpi.eq.1972) then write(ioimp,*) 'Nombre de champs lus pour ce maillage',ncham endif C ***** Recherche des parametres numeriques DO iparam = 1, nparam it1 = iparam CALL mprpri(mfid, it1, dname, mmtype, desc, dtunit, & nstep, mcret) if (iimpi.eq.1972) then write(ioimp,*) 'param',iparam,'-',dname,'-' endif IF (mcret .NE. 0) THEN moterr = 'lirmed / mprpri' interr(1) = mcret GOTO 199 ENDIF C-------On regarde si cela correspond a un champ existant IF (isca .GT. 0 .AND. iscb .GT. 0) THEN IF (iamo .GT. 0) THEN numdt = MED_NO_DT numit = MED_NO_IT CALL mprivr(mfid, dname, numdt, numit, mdval, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mprivr' interr(1) = mcret GOTO 199 ENDIF CHAPAR = SLSCHA.LSPARA(iamo) IF (CHAPAR .EQ. 0) THEN ncpars = 1 SEGINI CHAPAR ELSE ncpars = CHAPAR.CPARVL(/1) + 1 SEGADJ CHAPAR ENDIF CHAPAR.CPARNM(ncpars) = cha64a(1:isca) CHAPAR.CPARVL(ncpars) = mdval SLSCHA.LSPARA(iamo) = CHAPAR ENDIF ENDIF ENDDO C ***** Recherche des profils et mise en place des champs a sortir C-----Initialisation nbsor = 0 nbso = 0 SEGINI,SLSSOR C-----Boucle sur tous les pas de tps de chaque champ. On suppose qu'un C-----champ peut etre defini soit sur un profil soit sur le maillage total DO ia = 1, ncham fname = SLSCHA.LSNCHA(ia) CHAINF = SLSCHA.LSCHIN(ia) ndt = CHAINF.INUMDT(/1) typobj = ' ' DO idt = 1, ndt numdt = CHAINF.INUMDT(idt) numit = CHAINF.INUMIT(idt) ip = 0 nprof = ntprof*MED_GTABLE*MED_ETABLE SEGINI CHAPRO C---------Avec profil C---------CHPOINT metype = MED_NODE mgtype = MED_NONE CALL mfdnpf(mfid, fname, numdt, numit, metype, mgtype, & lispro.DPNAME, lispro.LNAME, n4, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mfdnpf' interr(1) = mcret GOTO 199 ENDIF nprof = n4 IF (nprof .GT. 0) THEN IF (typobj .EQ. ' ') typobj = 'CHPOINT ' IF (typobj .NE. 'CHPOINT ') THEN moterr = ' ERREUR On voulait CHPOINT mais on a '//typobj GOTO 199 ENDIF if (iimpi.eq.1972) then write(ioimp,*) ' On a CHPOINT profil',nprof,idt,ip endif DO ib = 1, nprof ip = ip + 1 CHAPRO.CTYPE(ip) = typobj CHAPRO.CPRONA(ip) = lispro.DPNAME(ib) CHAPRO.CETYPE(ip) = metype CHAPRO.CGTYPE(ip) = mgtype ENDDO nprof = ip SEGADJ,CHAPRO CHAINF.ISCHPR(idt) = CHAPRO GOTO 300 ENDIF C---------MCHAML isea = 0 DO ib = 1, MED_GTABLE mgtype = MEDGTB(ib) DO ic = 1, MED_ETABLE metype = MEDETB(ic) CALL mfdnpf(mfid, fname, numdt, numit, metype, mgtype, & lispro.DPNAME, lispro.LNAME, n4, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mfdnpf' interr(1) = mcret GOTO 199 ENDIF nprof = n4 if (iimpi.eq.1972) then write(ioimp,*) ' MCHAML profil',nprof,idt,ip endif IF (nprof.GT.0) THEN DO ie = 1, nprof ip = ip + 1 CHAPRO.CTYPE(ip) = 'MCHAML ' CHAPRO.CPRONA(ip) = lispro.DPNAME(ie) CHAPRO.CETYPE(ip) = metype CHAPRO.CGTYPE(ip) = mgtype ENDDO isea = 1 ENDIF ENDDO ENDDO IF (isea .EQ. 1) THEN IF (typobj .EQ. ' ') typobj = 'MCHAML ' IF (typobj .NE. 'MCHAML ') THEN moterr = ' ERREUR On voulait MCHAML mais on a '//typobj GOTO 199 ENDIF nprof = ip SEGADJ,CHAPRO CHAINF.ISCHPR(idt) = CHAPRO GOTO 300 ENDIF C---------Sans profil C---------CHPOINT metype = MED_NODE mgtype = MED_NONE CALL mfdnva(mfid, fname, numdt,numit, metype,mgtype, & n4, mcret) IF (mcret .NE. 0) THEN moterr ='lirmed / mfdnva' interr(1) = mcret GOTO 199 ENDIF nprof = n4 IF (nprof.GT.0) THEN IF (typobj .EQ. ' ') typobj = 'CHPOINT ' IF (typobj .NE. 'CHPOINT ') THEN moterr = 'ERREUR On voulait CHPOINT mais on a '//typobj GOTO 199 ENDIF if (iimpi.eq.1972) then write(ioimp,*) ' CHPOINT sans profil',nprof,idt,ip endif CHAPRO.CTYPE(1) = typobj CHAPRO.CPRONA(1) = ' ' CHAPRO.CETYPE(1) = metype CHAPRO.CGTYPE(1) = mgtype nprof = 1 SEGADJ,CHAPRO CHAINF.ISCHPR(idt) = CHAPRO GOTO 300 ENDIF C---------MCHAML isea = 0 DO ib = 1, MED_GTABLE mgtype = MEDGTB(ib) DO ic = 1, MED_ETABLE metype = MEDETB(ic) CALL mfdnva(mfid,fname,numdt,numit,metype,mgtype, & n4,mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mfdnpf' interr(1) = mcret GOTO 199 ENDIF n = n4 IF (n .GT. 0) THEN ip = ip + 1 CHAPRO.CTYPE(ip) = 'MCHAML' CHAPRO.CPRONA(ip) = ' ' CHAPRO.CETYPE(ip) = metype CHAPRO.CGTYPE(ip) = mgtype isea = 1 ENDIF ENDDO ENDDO IF (isea .EQ. 1) THEN IF (typobj .EQ. ' ') typobj = 'MCHAML' IF (typobj .NE. 'MCHAML') THEN moterr = 'LIRE MED - ERREUR : MCHAML demande mais '// & typobj//' lu' GOTO 199 ENDIF nprof = ip SEGADJ,CHAPRO CHAINF.ISCHPR(idt) = CHAPRO GOTO 300 ENDIF C---------Champ non conforme IF (ip .EQ. 0) THEN moterr = 'LIRE MED - ERREUR : Champ non conforme' GOTO 199 ENDIF 300 CONTINUE ENDDO C-------Sortie d'un champ IF (ndt .EQ. 1) THEN isea = 0 C---------On cherche une syntaxe de sortie IF (isca .EQ. 0) THEN cha64a = fname ENDIF C---------On cherche une syntaxe de fusion IF (nbso .EQ. 0) THEN nbso = nbso + 1 IF (nbso .GT. nbsor) THEN nbsor = nbsor + 20 SEGADJ,SLSSOR ENDIF ELSE if (iimpi.eq.1972) then write(ioimp,*) 'Fusion ?',iamo,nbso,cha64a endif IF (iamo .EQ. 0) THEN nbso = nbso + 1 IF (nbso .GT. nbsor) THEN nbsor = nbsor + 20 SEGADJ,SLSSOR ENDIF ELSE cha8b = SLSSOR.CHATYP(iamo) IF (cha8b .NE. typobj) THEN moterr = ' ERREUR cha8b ('//cha8b//') different '// & 'de typobj ('//typobj//')' GOTO 199 ENDIF nbso = iamo isea = 1 ENDIF ENDIF C---------On remplit l'information IF (isea .EQ. 0) THEN nbfus = 1 SEGINI SLSFUS SLSFUS.CHAFUS(nbfus) = ia SLSSOR.CHATYP(nbso) = typobj SLSSOR.CHANOM(nbso) = cha64a SLSSOR.CHALIS(nbso) = SLSFUS ELSE SLSFUS = SLSSOR.CHALIS(nbso) nbfus = SLSFUS.CHAFUS(/1) + 1 SEGADJ SLSFUS SLSFUS.CHAFUS(nbfus) = ia ENDIF C-------Sortie d'une TABLE ELSE isea1 = 0 isea2 = 0 C---------On cherche une syntaxe de sortie IF (isca .EQ. 0) THEN cha64a = fname ENDIF IF (iscb .EQ. 0) THEN cha64b = fname ENDIF C---------On cherche une syntaxe de fusion IF (nbso .EQ. 0) THEN nbso = nbso + 1 IF (nbso .GT. nbsor) THEN nbsor = nbsor + 20 SEGADJ SLSSOR ENDIF ELSE IF (iamo .EQ. 0) THEN nbso = nbso + 1 IF (nbso .GT. nbsor) THEN nbsor = nbsor + 20 SEGADJ SLSSOR ENDIF ELSE cha8b = SLSSOR.CHATYP(iamo) IF (cha8b .NE. 'TABLE') THEN moterr = 'LIRE MED - ERREUR objet TABLE mais on a' & //cha8b GOTO 199 ENDIF nbso = iamo isea1 = 1 ENDIF ENDIF C---------On remplit l'information nbso1 = nbso nbsor1 = nbsor IF (isea1 .EQ. 0) THEN nbsor = 1 SEGINI SLSSO1 nbfus = 1 SEGINI SLSFUS SLSFUS.CHAFUS(nbfus) = ia SLSSO1.CHATYP(nbsor) = typobj SLSSO1.CHANOM(nbsor) = cha64b SLSSO1.CHALIS(nbsor) = SLSFUS SLSSOR.CHATYP(nbso1) = 'TABLE' SLSSOR.CHANOM(nbso1) = cha64a SLSSOR.CHALIS(nbso1) = SLSSO1 ELSE SLSSO1 = SLSSOR.CHALIS(nbso1) nbsor = SLSSO1.CHALIS(/1) IF (iamo .EQ. 0) THEN nbsor = nbsor + 1 SEGADJ SLSSO1 ELSE cha8b = SLSSO1.CHATYP(iamo) IF (cha8b .NE. typobj) THEN moterr = ' ERREUR cha8b ('//cha8b//') different '// & 'de typobj ('//typobj//')' GOTO 199 ENDIF nbsor = iamo isea2 = 1 ENDIF IF (isea2 .EQ. 0) THEN nbfus = 1 SEGINI SLSFUS SLSFUS.CHAFUS(nbfus) = ia SLSSO1.CHATYP(nbsor) = typobj SLSSO1.CHANOM(nbsor) = cha64b SLSSO1.CHALIS(nbsor) = SLSFUS ELSE SLSFUS = SLSSO1.CHALIS(nbsor) nbfus = SLSFUS.CHAFUS(/1) + 1 SEGADJ SLSFUS SLSFUS.CHAFUS(nbfus) = ia ENDIF ENDIF nbso = nbso1 nbsor = nbsor1 ENDIF ENDDO C*********************************************************************** C Lecture des champs & Stockage dans la table C*********************************************************************** DO ia = 1, nbso typobj = SLSSOR.CHATYP(ia) cha64a = SLSSOR.CHANOM(ia) isor = 0 inin = 1 IF (typobj .EQ. 'CHPOINT ') THEN SLSFUS = SLSSOR.CHALIS(ia) ELSE IF (typobj .EQ. 'MCHAML ') THEN SLSFUS = SLSSOR.CHALIS(ia) ELSE IF (typobj .EQ. 'TABLE ') THEN SLSSO1 = SLSSOR.CHALIS(ia) ENDIF IF (IERR.NE.0) GOTO 199 if (iimpi.eq.1972) then write(ioimp,*) ia,' nom ',cha64a,' type ',typobj,isor endif & typobj,inre,flore,charre,logre,isor) ENDDO 100 CONTINUE C*********************************************************************** C Nettoyage C*********************************************************************** 199 CONTINUE IF (MAITOT .GT. 0) THEN DO ii = 1, nbtype NUMLI8 = maitot.INUMLI(ii) IF (NUMLI8.GT.0) SEGSUP,NUMLI8 ENDDO ENDIF IF (SFAMI .GT. 0) THEN infam = SFAMI.PFAMGR(/1) DO ii = 1, infam SFAMGR = SFAMI.PFAMGR(ii) IF (SFAMGR.GT.0) SEGSUP,SFAMGR SFAMI.PFAMGR(ii) = 0 IPT1 = SFAMI.PFAMAI(ii) IF (IPT1.GT.0) SEGDES,IPT1 SFAMI.PFAMAI(ii) = 0 ENDDO SEGSUP,SFAMI ENDIF IF (SLSCHA .GT. 0) SEGSUP,SLSCHA IF (SLSSOR .GT. 0) SEGSUP,SLSSOR IF (ICOOR .GT. 0) SEGSUP,ICOOR IF (IERR.NE.0) GOTO 9996 ENDDO C*********************************************************************** C* 8 - Fin de la Boucle C*********************************************************************** MEDTAB = MTABLE 9996 CONTINUE IF (MAITOT .GT. 0) SEGSUP,MAITOT IF (LPOLY .GT. 0) SEGSUP,LPOLY IF (LISPRO .GT. 0) SEGSUP,LISPRO 9997 CONTINUE IF (LINOMA .GT. 0) SEGSUP,LINOMA IF (SAWORK .GT. 0) SEGSUP,SAWORK C*********************************************************************** C Fermeture du fichier .med C*********************************************************************** 9998 CONTINUE CALL MFICLO(mfid, mcret) IF (mcret .NE. 0) THEN moterr = 'lirmed / mficlo' interr(1) = mcret c* MEDTAB = 0 ENDIF C*********************************************************************** C Ecriture de la TABLE Resultat ou Remise a etat initial (si erreur) C*********************************************************************** IF (MEDTAB .GT. 0) THEN c* MTABLE = MEDTAB (on a deja cela) SEGDES,MTABLE ELSE IF (MTABLE .GT. 0) SEGSUP,MTABLE IF (IDIM_REF.NE.0 .AND. IDIM_REF.NE.IDIM) THEN c* CHANGER de DIMENSION ? IDIM = IDIM_REF ENDIF NBPTS = NBPTS_REF SEGADJ,MCOORD ENDIF 9999 CONTINUE SEGACT,MCOORD*NOMOD if (iimpi.EQ.1972) then write(ioimp,*) write(ioimp,*) 'Sortie de LIRE "MED"' write(ioimp,*) '--------------------' write(ioimp,*) endif c RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales