extrai
C EXTRAI SOURCE SP204843 24/11/07 21:15:03 12074 SUBROUTINE EXTRAI ************************************************************************ * NOM : EXTRAI * DESCRIPTION : OPERATION D'EXTRACTION POUR DIFFERENTS TYPES D'OBJETS ************************************************************************ * HISTORIQUE : 5/12/1985 : PASCAL MANIGOT : creation de la subroutine * HISTORIQUE : MODIFIE EN SEPTEMBRE 1994 * HISTORIQUE : MODIFIE EN AVRIL 2015 PAR CB215821 * ==> Extraire le MAILLAGE d'un MMODEL vide renvoie * un MAILLAGE vide au lieu d'une GEMAT ERROR * ==> Extraire un constituant d'un MMODEL vide * renvoie une erreur au lieu d'une GEMAT ERROR * HISTORIQUE : MODIFIE EN JANVIER 2016 PAR JCARDO * ==> ajout de la syntaxe EXTR LCHPO1 "VALE" ... * ==> extention du IF/ELSEIF/ENDIF principal a * tous les objets * ==> amelioration de la lisibilite de la subroutine ************************************************************************ IMPLICIT INTEGER(I-N) IMPLICIT REAL*8(A-H,O-Z) -INC PPARAM -INC CCOPTIO -INC CCGEOME -INC CCHAMP -INC SMSUPER -INC SMRIGID -INC SMELEME -INC SMCHPOI -INC SMBASEM -INC SMTABLE -INC SMDEFOR -INC SMMODEL -INC SMEVOLL -INC SMLREEL -INC SMLENTI -INC SMLMOTS -INC SMLCHPO -INC SMNUAGE -INC SMLOBJE -INC SMCHAML SEGMENT LIMODE(0) PARAMETER (NBFORM=100 , NBCHGT=10) PARAMETER (NLOMAX=5, NBCMOC=25) CHARACTER*4 MNLOCA(NLOMAX) CHARACTER*4 CAMPL(1), MOOPT(7), NOMU(3), LMOSU(5), MOTBAS(5), CHARACTER*16 MOFORM(NBFORM) CHARACTER*4 MOT_4 CHARACTER*(LOCOMP) CMOT,MOT1,MOT2,MOCOMP CHARACTER*8 MOT_8,CTYP,CTYP1 CHARACTER*(LOCHAI) CTEXTL,CTEXT CHARACTER*(LCONMO) MOT_CM LOGICAL LTELQ, LAG,BORINF,MINI,IMFRO,ZHARM C DATA LMOSU /'RIGI','ELEM','RIGT','MASS','BLOQ'/ DATA NOMU /'NOMU','MULT','UNIL'/ DATA MOOPT /'MAIL','RIGI','SYME','ANTI','CONT','COMP','DIAG'/ DATA MOTBAS/'RIGI','MASS','MODE','STAT','PSMO'/ DATA CAMPL /'AMPL'/ DATA CMOC /'MAIL','ZONE','FORM','CONS','ELEM','GEOM','CONT', $ 'DEFO','DEPL','FORC','GRAD','GRAF','MATE','CONP', $ 'TEMP','VARI','PARA','DEIN','COMP','OBJE','NON_', $ 'NLOC','PHAS','CENT','HHO_'/ DATA CFROT /'FROT'/ DATA MCHGT /'CHAR','CHAM','TRAJ','EVOL','VITE','COMP', & 'LIE ','LIBR','LOBJ','LREE'/ XVAL1=0.D0 MOT_4=' ' MINI =.FALSE. ILO =0 IOBIN=0 IVALRE=0 C IF (IRETOU.EQ.0) THEN RETURN ENDIF * +-------------------------------------------------------------------+ * | | * | M O T | * | | * +-------------------------------------------------------------------+ IF (CTYP.EQ.'MOT ') THEN IF (IERR.NE.0) RETURN * ============================ * EXTRACTION D'UNE SOUS-CHAINE * ============================ IF (IRETOU.NE.0) THEN IF (CTYP1.EQ.'ENTIER'.OR.CTYP1.EQ.'LISTENTI') THEN RETURN ENDIF ENDIF * ======================================================== * CREATION D'UNE TABLE CONTENANT LES OBJETS DE TYPE CTEXTL * ======================================================== MOT_8=CTEXTL(1:8) M=IA SEGINI MTABLE MLOTAB=0 DO 7765 I=1,IA IF(MOT_8.EQ.'FLOTTANT' ) THEN ELSEIF(MOT_8.EQ.'LOGIQUE ') THEN ELSEIF (MOT_8.EQ.'ENTIER ') THEN ELSEIF(MOT_8.EQ.'MOT ') THEN ELSE ENDIF $ MOT_8,IVAL,XVAL,CTEXT(1:IRETOU),LAG,IVAL) 7765 CONTINUE SEGDES MTABLE RETURN * +-------------------------------------------------------------------+ * | | * | D E F O R M E E | * | | * +-------------------------------------------------------------------+ ELSEIF (CTYP.EQ.'DEFORME ') THEN IF(IERR.NE.0) RETURN IF(IERR.NE.0) RETURN SEGACT MDEFOR IF (AMPL(/1).NE.1) THEN ELSE AMP=AMPL(1) ENDIF RETURN * +-------------------------------------------------------------------+ * | | * | B A S E M O D A | * | | * +-------------------------------------------------------------------+ ELSEIF (CTYP.EQ.'BASEMODA') THEN IF(IERR.NE.0) RETURN IF(IERR.NE.0) RETURN MOT_4=MOTBAS(IRET) IF(IERR.NE.0) RETURN IF (IRET.LE.2) THEN ELSE ENDIF RETURN * +-------------------------------------------------------------------+ * | | * | E V O L U T I O N | * | | * +-------------------------------------------------------------------+ ELSEIF (CTYP.EQ.'EVOLUTIO') THEN IF(IERR.NE.0) RETURN RETURN * +-------------------------------------------------------------------+ * | | * | S U P E R E L E | * | | * +-------------------------------------------------------------------+ ELSEIF (CTYP.EQ.'SUPERELE') THEN IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN SEGACT MSUPER * ============== * MOT-CLE "RIGI" * ============== IF (IRET.EQ.1) THEN IPTR=MSURAI * ============== * MOT-CLE "ELEM" * ============== ELSEIF (IRET.EQ.2) THEN IPTR=MSUPEL * ============== * MOT-CLE "RIGT" * ============== ELSEIF (IRET.EQ.3) THEN IPTR=MRIGTO * ============== * MOT-CLE "MASS" * ============== ELSEIF (IRET.EQ.4) THEN IPTR=MSUMAS * ============== * MOT-CLE "BLOQ" * ============== ELSEIF (IRET.EQ.5) THEN NRIGEL=MBLOQU RI1=MRIGTO SEGACT,RI1 SEGINI,MRIGID MTYMAT=RI1.MTYMAT DO 1 IE1=1,NRIGEL COERIG(IE1)=RI1.COERIG(IE1) DO 11 IE2=1,8 IRIGEL(IE2,IE1)=RI1.IRIGEL(IE2,IE1) 11 CONTINUE 1 CONTINUE SEGACT,MRIGID ENDIF RETURN * +-------------------------------------------------------------------+ * | | * | M A T R I K | * | | * +-------------------------------------------------------------------+ ELSEIF (CTYP.EQ.'MATRIK') THEN IF (IERR.NE.0) RETURN * ==================================================== * EXTRACTION D'UNE SOUS-MATRICE DE COMPOSANTES DONNEES * ==================================================== IF (IRET.EQ.0) THEN IF (IRETLM.EQ.1) THEN IF (IERR.NE.0) RETURN ELSE IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN JGN=4 JGM=1 SEGINI MLMOT1,MLMOT2 ENDIF IF (IRETLM.NE.1) SEGSUP MLMOT1,MLMOT2 IF (IERR.NE.0) RETURN RETURN * ============================================ * MOT-CLE "DIAG" => EXTRACTION DE LA DIAGONALE * ============================================ ELSEIF (IRET.EQ.7) THEN RETURN * ======================================================= * MOT-CLE "COMP => EXTRACTION DE LA LISTE DES COMPOSANTES * ======================================================= ELSEIF(IRET.EQ.6) THEN IF (ICDUAL.NE.0) THEN IF (CMOT.NE.'DUAL') THEN MOTERR=CMOT RETURN ENDIF ENDIF RETURN ELSE MOTERR=MOOPT(IRET) RETURN ENDIF * +-------------------------------------------------------------------+ * | | * | R I G I D I T E | * | | * +-------------------------------------------------------------------+ ELSEIF (CTYP.EQ.'RIGIDITE') THEN IF (IERR.NE.0) RETURN * ==================================================== * EXTRACTION D'UNE SOUS-MATRICE DE COMPOSANTES DONNEES * ==================================================== IF (IRET.EQ.0) THEN IF (IRETLM.EQ.1) THEN IF (IERR.NE.0) RETURN ELSE IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN JGN=4 JGM=1 SEGINI MLMOT1,MLMOT2 ENDIF IF (IRETLM.NE.1) SEGSUP MLMOT1,MLMOT2 IF (IERR.NE.0) RETURN RETURN * ============================================ * MOT-CLE "DIAG" => EXTRACTION DE LA DIAGONALE * ============================================ ELSEIF (IRET.EQ.7) THEN IF (IERR.NE.0) RETURN RETURN * ======================================================== * MOT-CLE "COMP" => EXTRACTION DE LA LISTE DES COMPOSANTES * ======================================================== ELSEIF(IRET.EQ.6) THEN IF (ICDUAL.NE.0) THEN IF (CMOT.NE.'DUAL') THEN MOTERR=CMOT RETURN ENDIF ENDIF RETURN * ==================================== * MOT-CLE "CONT" => APPUIS UNILATERAUX * ==================================== ELSEIF(IRET.EQ.5) THEN MRIGID=IBOGID SEGACT MRIGID ISOPE= ISUPEQ MTABLE=ISOPE SEGDES MTABLE RETURN * ============================================================== * MOTS-CLES "SYME" OU "ANTI" => SOUS-MATRICES (ANTI-)SYMETRIQUES * ============================================================== ELSEIF (IRET.EQ.3 .OR. IRET.EQ.4) THEN RETURN ENDIF * ============================================================= * MOTS-CLES "MAIL" OU "RIGI" => SOUS-MAILLAGES OU SOUS-MATRICES * ============================================================= ICO=0 IMO=3 IF(IRET.EQ.2) THEN ICO=1 IMO=2 ENDIF IF(IERR.NE.0) RETURN * ************************************************ * MATRICE AVEC SEULEMENT LES MULT. DE LAGRANGE OU * AVEC TOUT SAUF LES MULT. DE LAGRANGE * ************************************************ IF (IRET.EQ.2) THEN RETURN ENDIF * ******************************************************** * MAILLAGE PARTIEL * "NOMU" => TOUT SAUF LES MULT. DE LAGRANGE * "MULT" => TOUS LES MULT. DE LAGRANGE * "UNIL" => SEULEMENT LES MULT. ASSOCIES AUX COND. UNIL. * ******************************************************** IF (IMUL.NE.0) THEN RETURN ENDIF * **************** * MAILLAGE COMPLET * **************** IF (IERR.NE.0) RETURN MRIGID=IBOGID SEGACT MRIGID NBSOUS=IRIGEL(/2) IF (NBSOUS.EQ.0) THEN NBNN=0 NBELEM=0 NBREF=0 SEGINI MELEME SEGACT,MELEME RETURN ENDIF IPP1 = IRIGEL(1,1) IF(NBSOUS.GT.1) THEN NBREF=0 NBNN=0 NBELEM=0 SEGINI IPT4 KT4 = 1 IPT4.LISOUS(KT4) = IPP1 DO 1130 I=1,NBSOUS DO 1129 JJ = 1,KT4 IF (IRIGEL(1,I).EQ.IPT4.LISOUS(JJ)) GOTO 1130 1129 CONTINUE KT4 = KT4 + 1 IPT4.LISOUS(KT4)=IRIGEL(1,I) 1130 CONTINUE NBSOUS = KT4 SEGADJ IPT4 ENDIF RETURN * +-------------------------------------------------------------------+ * | | * | C H P O I N T | * | | * +-------------------------------------------------------------------+ ELSEIF (CTYP.EQ.'CHPOINT') THEN IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN MOT_4=CMOT * ===================================== * MOT-CLE "TITR" => EXTRACTION DU TITRE * ===================================== IF (MOT_4.EQ.'TITR') THEN MCHPOI = IBOPOI CTEXT = MOCHDE ILON = LEN(CTEXT) DO 100 I = ILON,1,-1 IF (CTEXT(I:I).NE.' ') THEN NLON = I GOTO 102 ENDIF 100 CONTINUE NLON = 1 102 CONTINUE RETURN * ========================================= * MOT-CLE "NATU" => EXTRACTION DE LA NATURE * ========================================= ELSEIF (MOT_4.EQ.'NATU') THEN MCHPOI = IBOPOI INAT = JATTRI(1) IF (INAT.EQ.0) CTEXT(1:11) = 'INDETERMINE' IF (INAT.EQ.1) CTEXT(1:11) = 'DIFFUS ' IF (INAT.EQ.2) CTEXT(1:11) = 'DISCRET ' RETURN * =================================================== * MOT-CLE "MAIL" => EXTRACTION DU SUPPORT GEOMETRIQUE * =================================================== ELSEIF (MOT_4 .EQ.'MAIL') THEN IMUL=0 IF (IERR.NE.0) RETURN CALL EXTR21(IBOPOI,IMUL,IPP1) IF (IERR.NE.0) RETURN RETURN * ======================================================== * MOT-CLE "COMP" => EXTRACTION DE LA LISTE DES COMPOSANTES * ======================================================== ELSEIF (MOT_4 .EQ.'COMP') THEN RETURN * ==================================== * MOT-CLE "TYPE" => EXTRACTION DU TYPE * ==================================== ELSEIF (MOT_4.EQ.'TYPE') THEN MCHPOI = IBOPOI MOT_8 = MTYPOI RETURN * ============================================================ * MOT-CLE "VALE" => EXTRACTION DES VALEURS EN PLUSIEURS POINTS * ET POUR PLUSIEURS COMPOSANTES * ============================================================ ELSEIF (MOT_4.EQ.'VALE') THEN * * LISTE DES COMPOSANTES (OBJET MOT OU LISTMOTS) IF (IRETOU.EQ.1) THEN SEGACT,MLMOTS ELSE IF (IRETOU.GT.0) THEN JGN=LOCOMP JGM=1 SEGINI,MLMOTS SEGACT,MLMOTS ENDIF ENDIF * * LISTE DES NOEUDS (OBJET POINT OU MAILLAGE DE POI1) IF (IRETOU.EQ.1) THEN ELSE IF (IRETOU.NE.0) THEN MELEME=IPOINT ENDIF ENDIF * * MOT-CLE 'NOID' IVID=0 IF (IRETOU.NE.0) THEN IF (MOT_4.EQ.'NOID') THEN IVID=1 ELSE MOTERR(1:4)=MOT_4 MOTERR(5:40)='NOID' RETURN ENDIF ENDIF * * APPEL A EXTR23 IF (IERR.NE.0) RETURN SEGACT,MLREEL RETURN * =========================================================== * PAS DE MOT CLE : CMOT = NOM DE COMPOSANTE * EXTRACTION DE LA VALEUR EN UN POINT D'UNE COMPOSANTE DONNEE * =========================================================== ELSE IF (IRETOU.EQ.0) THEN MOTERR(1:8)='POINT' RETURN ENDIF c lecture facultative de l'harmonique de Fourier ZHARM=IRET.EQ.1 RETURN ENDIF * +-------------------------------------------------------------------+ * | | * | M C H A M L | * | | * +-------------------------------------------------------------------+ ELSEIF (CTYP.EQ.'MCHAML') THEN IF (IERR.NE.0) RETURN C IF (IERR.NE.0) RETURN MOT_4=CMOT * ================================================ * MOTS-CLES "DEVA" OU "COVA" => NOMS DES VARIABLES * ================================================ IF (MOT_4.EQ.'DEVA' .OR. MOT_4.EQ.'COVA') THEN IF (ILISR.NE.0) THEN ENDIF RETURN * ================================= * MOT-CLE "NBZO" => NOMBRE DE ZONES * ================================= ELSEIF (MOT_4.EQ.'NBZO') THEN if (ierr.ne.0) return RETURN * ===================================================== * MOT-CLE "COMP" => EXTRACTION DES NOMS DES COMPOSANTES * ===================================================== ELSEIF (MOT_4.EQ.'COMP' ) THEN C C RECHERCHE DES NOMS DES COMPOSANTES APPARTENANT C A LA ZONE DU MODELE IF (IRETM.NE.0) THEN RETURN C C RECHERCHE DES NOMS DE TOUTES LES COMPOSANTES ELSE RETURN ENDIF * ====================================================== * MOT-CLE "CONS" => EXTRACTION DES NOMS DES CONSTITUANTS * ====================================================== ELSEIF(MOT_4.EQ.'CONS' ) THEN C C RECHERCHE DES NOMS DES CONSTITUANTS APPARTENANT C A LA ZONE DU MODELE IF (IRETM.NE.0) THEN RETURN C C RECHERCHE DES NOMS DE TOUs LES constituants ELSE RETURN ENDIF * ========================================================= * EXTRACTION DE LA VALEUR, DU TITRE, DU TYPE OU DU MAILLAGE * ========================================================= ELSE IF (MOT_4.NE.'TITR'.AND.MOT_4.NE.'TYPE'.AND. & MOT_4.NE.'MAIL') THEN IENT1 = 0 IENT2 = 0 IENT3 = 0 IPMAIL = 0 IF (IRET0.NE.0) THEN IF (IERR.NE.0) RETURN MELEME = IPMAIL NBEL1 = NUM(/2) IF (NBEL1.NE.1) THEN RETURN ENDIF IENT3 = 1 IF (IRET3.NE.0.AND.IENT3.LE.0) THEN INTERR(1) = IENT3 RETURN ENDIF ELSE IPMAIL = 0 IF(IRET1.EQ.0) RETURN IF (IENT1.LE.0) THEN INTERR(1) = IENT1 RETURN ENDIF IF(IRET2.EQ.0) RETURN IF (IENT2.LE.0) THEN INTERR(1) = IENT2 RETURN ENDIF IF(IRET3.EQ.0) RETURN IF (IENT3.LE.0) THEN INTERR(1) = IENT3 RETURN ENDIF ENDIF ENDIF RETURN ENDIF * +-------------------------------------------------------------------+ * | | * | M M O D E L | * | | * +-------------------------------------------------------------------+ ELSEIF (CTYP.EQ.'MMODEL') THEN IF (IERR.NE.0) RETURN IF(IERR.NE.0) RETURN CMOT =CMOC(IRET) MOT_4 =CMOT C Extension du MMODEL en cas de modele de MELANGE NSOUS=MMODEL.KMODEL(/1) C=DEB==== FORMULATION HHO ==== Cas particulier ========================= IF (MOT_4.EQ.'HHO_') THEN CALL REFUS IF (IERR.NE.0) RETURN CALL HHOEXT(IPMODL,CTEXT, IPP1,CTYP,iret) IF (iret.NE.0) THEN RETURN END IF IF (IPP1.LE.0) THEN RETURN END IF RETURN END IF C=FIN==== FORMULATION HHO ============================================== IF (MOT_4.EQ.'MAIL') THEN IMFRO=.FALSE. IF (IRET.EQ.1) THEN IMFRO=.TRUE. ENDIF IPP1=0 ltelq=.false. DO 1116 I=1,NSOUS IMODEL= KMODEL(I) IF (IMFRO) THEN NMATT=MATMOD(/2) if(iplac.eq.0) goto 1116 ENDIF IPP2 = IMAMOD IF (ipp1.eq.0) then ipp1=ipp2 ELSE IPP1=IRET ENDIF 1116 CONTINUE IF(IPP1.EQ.0) THEN C Cas du resultat vide ==> MAILLAGE VIDE NBELEM = 0 NBNN = NBNNE(ILCOUR) NBREF = 0 NBSOUS = 0 SEGINI,MELEME ITYPEL = ILCOUR IPP1 = MELEME ENDIF RETURN ELSEIF (MOT_4.eq.'COMP') THEN if(ierr.ne.0) return N1=0 SEGINI,MMODE1 DO 5497 I=1,NSOUS IMODEL=KMODEL(I) DO IB=1,MATMOD(/2) IF( MATMOD(IB) .EQ. MOFORM(1) ) GOTO 5498 ENDDO GOTO 5497 5498 CONTINUE N1=N1+1 MMODE1.KMODEL(**)=KMODEL(I) 5497 CONTINUE IF(N1.GE.0.AND.N1.LT.NSOUS) THEN SEGADJ,MMODE1 ELSEIF(N1.EQ.NSOUS)THEN C Pas la peine de creer un autre MMODEL SEGSUP,MMODE1 MMODE1=MMODEL ELSE ENDIF RETURN ELSEIF(MOT_4.EQ.'OBJE') THEN if(NSOUS.ne.1) then WRITE(IOIMP,*) ' Dans extrai.eso : ' WRITE(IOIMP,*) ' ce n est pas un modele elementaire' WRITE(IOIMP,*) ' it is not an elementary model' return endif imodel=kmodel(1) iob=ivamod(/1) do io=iob,1,-1 ctyp=tymode(io) if( ctyp.eq.'ENTIER') then else ipoin1=ivamod(io) endif enddo return ELSEIF (MOT_4.EQ.'ZONE') THEN C- Option 'ZONE' 'CONS' => IZOCO=1 IZOCO = 0 IF (IERR.NE.0) RETURN INCTS = 2 IF (IZOCO.EQ.1) INCTS = 3 M = INCTS * NSOUS N1 = 1 SEGINI MTABLE DO IOK=1,NSOUS IMODEL=KMODEL(IOK) NFOR=FORMOD(/2) C CAS DARCY OU NAVIER ON OUBLIE LA TABLE DE PRECONDITIONNEMENT IF((IDARC.NE.0).OR.(INAVI.NE.0).OR.(IEULE.NE.0))THEN SEGINI,IMODE1=IMODEL IMODE1.INFMOD(2)=0 IMODEL=IMODE1 ENDIF SEGINI MMODE1 MMODE1.KMODEL(1) = IMODEL IVALI1 = (IOK-1)*INCTS + 1 IPP1 = MMODE1 $ IOBIN,'MMODEL ',IVALRE,XFLOT,MOT_8,LAG,IPP1) IVALI1 = IVALI1 + 1 IPP1 = IMAMOD $ IOBIN,'MAILLAGE',IVALRE,XFLOT,MOT_8,LAG,IPP1) IF (IZOCO.EQ.1) THEN IVALI1 = IVALI1 + 1 MOT_CM = CONMOD $ IOBIN,'MOT ',IVALRE,XFLOT,MOT_CM,LAG,IPP1) ENDIF C SEGDES IMODEL ENDDO RETURN ELSEIF (MOT_4.EQ.'FORM'.OR.MOT_4.EQ.'CONS'.OR.MOT_4.EQ.'ELEM' & .OR. MOT_4.EQ.'MATE'.OR.MOT_4.EQ.'NON_' & .OR.MOT_4.EQ.'PHAS') THEN INFOR=1 IF (MOT_4.EQ.'MATE'.OR.MOT_4.EQ.'PHAS') THEN IPASS=0 ICOND=0 IF (IERR.NE.0) RETURN IPASS=IPASS+1 IF (IRETO.EQ.0.AND.IPASS.EQ.1) THEN RETURN ENDIF IF (IRETO.NE.0) THEN INFOR=INFOR+1 IF (INFOR.GT.NBFORM) THEN RETURN ENDIF GOTO 1191 ENDIF ELSE ICOND=1 IF (IERR.NE.0) RETURN ICOND=0 IF (IRETO.NE.0) THEN INFOR=INFOR+1 IF (INFOR.GT.NBFORM) THEN RETURN ENDIF GOTO 1192 ENDIF ENDIF INFOR=INFOR-1 C JGN=4 JGM=0 SEGINI MLMOTS MLNONL=MLMOTS C MMODE1=MMODEL IF (NSOUS .EQ. 0) THEN C TRAITEMENT DES SOUS-MODELES VIDES dont on veut extraire une sous C partie RETURN ELSE N1=NSOUS SEGINI,MMODEL IPP1=MMODEL NZON=0 IMECAF=0 DO 1119 I=1,NSOUS IMODEL=MMODE1.KMODEL(I) IF(MOT_4.EQ.'FORM') THEN NFOR=FORMOD(/2) IF(NFOR.NE.INFOR) GOTO 1119 IF(NFOR.EQ.1) THEN IF(MOFORM(1).NE.FORMOD(1)) GOTO 1119 ELSEIF(NFOR.EQ.2) THEN IF(((MOFORM(1).NE.FORMOD(1)).AND.(MOFORM(2).NE. $ FORMOD(2))).AND.((MOFORM(1).NE.FORMOD(2)).AND. $ (MOFORM(2).NE.FORMOD(1))))GOTO 1119 ELSE GOTO 1118 ENDIF ELSEIF (MOT_4.EQ.'CONS') THEN DO 425 IJ=1,INFOR C on enleve les espaces au debut et a la fin idim0=LEN(MOFORM(IJ)) idim1=CONMOD(/1) ideb0=0 ifin0=0 ideb1=0 ifin1=0 DO ii=1,idim0 IF(ideb0.EQ.0.AND.MOFORM(IJ)(ii:ii).NE.' ') $ ideb0=ii IF(ifin0.EQ.0.AND. & MOFORM(IJ)(idim0-ii+1:idim0-ii+1).NE.' ') & ifin0=idim0-ii+1 ENDDO DO ii=1,idim1 IF(ideb1.EQ.0.AND.CONMOD(ii:ii).NE.' ') ideb1=ii IF(ifin1.EQ.0.AND. & CONMOD(idim1-ii+1:idim1-ii+1).NE.' ') & ifin1=idim1-ii+1 ENDDO C print *,'Limites : ',ideb0,ifin0,' / ',ideb1,ifin1 IF(MOFORM(IJ)(ideb0:ifin0).EQ.CONMOD(ideb1:ifin1)) & GOTO 429 425 CONTINUE GOTO 1119 ELSEIF (MOT_4.EQ.'ELEM') THEN DO 426 IJ=1,INFOR IF(MOFORM(IJ)(1:4).EQ.NOMTP(NEFMOD)) GOTO 429 426 CONTINUE GOTO 1119 ELSEIF(MOT_4.EQ.'MATE') THEN NMAT=MATMOD(/2) DO 427 IJ=1,INFOR DO 4275 JJ=1,NMAT IF(MATMOD(JJ).EQ.MOFORM(IJ)) GOTO 429 4275 CONTINUE 427 CONTINUE GOTO 1119 ELSEIF(MOT_4.EQ.'NON_') THEN MN3=INFMOD(/1) IF(MN3.LE.12) GOTO 1119 INLOC=-1*INFMOD(13) IF(INLOC.EQ.0) GOTO 1119 DO 428 IJ=1,INFOR IF(MNLOCA(INLOC).EQ.MOFORM(IJ)(1:4)) GOTO 429 428 CONTINUE GOTO 1119 ELSEIF(MOT_4.EQ.'PHAS' & .AND.CONMOD.NE.' ') THEN DO 430 IJ=1,INFOR IF(CONMOD(17:24).EQ.MOFORM(IJ)(1:8)) GOTO 429 430 CONTINUE GOTO 1119 ENDIF C on vient ici pour prendre les sous modeles 429 CONTINUE NZON=NZON+1 NFOR=FORMOD(/2) C CAS DARCY OU NAVIER ON OUBLIE LA TABLE DE PRECONDITIONNEMENT IF((IDARC.NE.0).OR.(INAVI.NE.0).OR.(IEULE.NE.0))THEN IMECAF=1 SEGINI,IMODE1=IMODEL IMODE1.INFMOD(2)=0 IMODEL=IMODE1 ENDIF KMODEL(NZON)=IMODEL 1119 CONTINUE ENDIF C IF(NZON.EQ.0) GOTO 1118 IF(NZON.EQ.NSOUS .AND. IMECAF.EQ.0) THEN C Le SOUS-MODELE demande est le MODELE d'origine ELSE IF(NZON.NE.NSOUS)THEN N1=NZON SEGADJ,MMODEL ENDIF ENDIF RETURN 1118 CONTINUE RETURN ELSEIF (IRET.GE.6.AND.IRET.LE.18.AND.IRET.NE.13) THEN RETURN ELSEIF (IRET.EQ.22) THEN JGN=4 JGM=0 SEGINI MLMOTS MLNONL=MLMOTS C MMODE1=MMODEL NSOUS=MMODE1.KMODEL(/1) C C TRAITEMENT DES SOUS-MODELES VIDES dont on veut extraire une sous C partie IF (NSOUS .EQ. 0) THEN SEGACT,MLMOTS RETURN ELSE DO 1122 I=1,NSOUS IMODEL=MMODE1.KMODEL(I) NFOR=FORMOD(/2) IF(NFOR.GE.1) THEN IF (FORMOD(1).NE.'MECANIQUE'.AND. & FORMOD(1).NE.'POREUX') GOTO 1123 MN3=INFMOD(/1) IF(MN3.LE.12) GOTO 1123 INONL=INFMOD(14) IF(INONL.EQ.0) GOTO 1123 MLMOT1=INONL SEGACT MLMOT1 IF(NMONL.EQ.0)GOTO 1123 IF(JGM.EQ.0) THEN JGM=NMONL SEGADJ,MLMOTS DO IJ=1,NMONL ENDDO ELSE DO IJ=1,NMONL IF(IPLA.EQ.0) THEN JGM=JGM+1 SEGADJ,MLMOTS ENDIF ENDDO ENDIF 1123 CONTINUE ENDIF 1122 CONTINUE SEGACT,MLMOTS RETURN ENDIF * ELSE IF (MOT_4.eq.'CENT') THEN * pour NAVIER-STOKE NLIN, extrai les POINTS CENTRES ipma = 0 c L1 = 8 n1 = 1 segini mmode1 n3 = 6 segini mchel1 n2 = 1 segini mcham1 mchel1.ichaml(1) = mcham1 ipmons = mmode1 ipchns = mchel1 do is = 1,nsous imodel = kmodel(is) if (formod(1).eq.'NAVIER_STOKES'.and.matmod(1).eq.'NLIN') & then mmode1.kmodel(1) = imodel call go2nli(ipmons,ipchns,ipres,5) if (ierr.ne.0 ) return endif if (ipma.eq.0) then ipma = ipres else if (ierr.ne.0) return ipma = ip3 endif enddo segsup mchel1, mcham1, mmode1 if (IPMA.GT.0) then return else return endif ELSE MOTERR=MOT_4 RETURN ENDIF * +-------------------------------------------------------------------+ * | | * | C H A R G E M E N T | * | | * +-------------------------------------------------------------------+ ELSEIF (CTYP.EQ.'CHARGEME') THEN IF (IERR.NE.0) RETURN C CMOT = ' ' ICHGT = 0 LCHGT = 0 IEC = 1 IF (IERR.NE.0) RETURN IF (IRET.EQ.0) THEN IF (IERR.NE.0) RETURN IF ((ICHGT.GE.1 .AND. ICHGT.LE.5) .OR. ICHGT.GE.9) THEN IF (IERR.NE.0) RETURN IF (IRETOU.EQ.0) IEC = 1 ELSEIF (ICHGT.EQ.0) THEN IF (IRETOU.NE.0) THEN IF (MOT_4.EQ.'TABL') THEN ICHGT=-1 ELSE CALL REFUS ENDIF ENDIF ENDIF ENDIF C C RETURN * +-------------------------------------------------------------------+ * | | * | L I S T C H P O | * | | * +-------------------------------------------------------------------+ ELSEIF (CTYP.EQ.'LISTCHPO') THEN IF (IERR.NE.0) RETURN IF (IRETOU.EQ.0) THEN RETURN ENDIF MLCHP1 = ILCHP1 SEGACT , MLCHP1 LONCHP = MLCHP1.ICHPOI(/1) * =============================== * EXTRACTION DE PLUSIEURS INDICES * =============================== IF (CTYP1.EQ.'LISTENTI') THEN IF (IERR.NE.0) RETURN MLENTI = ILENT SEGACT,MLENTI JG = LECT(/1) N1=JG SEGINI,MLCHP2 ILCHP2= MLCHP2 DO 1211 I=1 , JG IF (( LECT(I) .GT. LONCHP ) .OR. ( LECT(I) .LT. 1 )) THEN INTERR(1) = LECT(I) ENDIF MLCHP2.ICHPOI(I) = MLCHP1.ICHPOI(LECT(I)) 1211 CONTINUE RETURN * =========================== * EXTRACTION D'UN SEUL INDICE * =========================== ELSEIF (CTYP1.EQ.'ENTIER') THEN IF (IERR.NE.0) RETURN IF (ILENT.GT.LONCHP .OR. ILENT.LT.1 ) THEN INTERR(1)=ILENT ENDIF ILCHPO = MLCHP1.ICHPOI(ILENT) RETURN * ==================================================== * MOT-CLE "VALE" => EXTRACTION DES VALEURS EN UN POINT * ==================================================== ELSEIF (CTYP1.EQ.'MOT') THEN IF (IERR.NE.0) RETURN IF (CMOT.NE.'VALE') THEN MOTERR = 'VALE' RETURN ENDIF IF (IRETOU.EQ.0) THEN IF (IRETOU.GT.0) THEN JGN=LOCOMP JGM=1 SEGINI,MLMOTS ENDIF ENDIF IF (IERR.NE.0) RETURN IF (IERR.NE.0) RETURN SEGACT,MLREEL RETURN * SYNTAXE INCORRECTE ELSE MOTERR(1:40) = 'ENTIER LISTENTI"VALE"' RETURN ENDIF * +-------------------------------------------------------------------+ * | | * | N U A G E | * | | * +-------------------------------------------------------------------+ ELSEIF (CTYP.EQ.'NUAGE') THEN IF (IERR.NE.0) RETURN MNUAGE=IPOINT IF (INU1.EQ.0) THEN IF (IERR.NE.0) THEN RETURN ENDIF IF (INU1.EQ.0) THEN IF (CTYP1.EQ.'COMP ') THEN IPROG = 1 ELSE IPOSI = 0 DO 1250 I=1,NUANOM(/2) IF (NUANOM(I).EQ.CTYP1) IPOSI=I 1250 CONTINUE IF (IPOSI.EQ.0) THEN MOTERR(1:8) = CTYP1 C TYP1 n'est pas un nom de variable du NUAGE RETURN ENDIF IPROG = 2 ENDIF ELSE IPOSI = 0 DO 1251 I=1,NUANOM(/2) IF (NUANOM(I).EQ.CTYP1) IPOSI=I 1251 CONTINUE IF (IPOSI.EQ.0) THEN MOTERR(1:8) = CTYP1 C TYP1 n'est pas un nom de variable du NUAGE RETURN ENDIF IPROG = 3 ENDIF ELSE IF (IERR.NE.0) RETURN IPOSI = 0 DO 1252 I=1,NUANOM(/2) IF (NUANOM(I).EQ.CTYP1) IPOSI=I 1252 CONTINUE IF (IPOSI.EQ.0) THEN MOTERR= CTYP1 C TYP1 n'est pas un nom de variable du NUAGE RETURN ELSE IPROG = 3 ENDIF ENDIF C-------------- Lecture eventuelle des FLOTTANTS ------------- IF ((IPROG.EQ.3).AND.(INU1.NE.3).AND.(INU1.NE.4)) THEN IF ((INU1.EQ.1).OR.(INU1.EQ.2)) THEN IF (IRETOU.EQ.0) THEN C Il manque la valeur de la composante reelle RETURN ENDIF ELSE IF ((IRETO1.EQ.0).OR.(IRETO2.EQ.0)) THEN C Il faut specifier deux valeurs reelles RETURN ENDIF ENDIF ENDIF C--------- Cas de l'extraction des noms des composantes du NUAGE ------- IF (IPROG.EQ.1) THEN IF (IPLSTM.NE.0) THEN ENDIF C----Cas de l'extraction de l'objet correspondant a une composante --- C----------------- donnee d'un NUAGE "colonne" ----------------------- ELSEIF (IPROG.EQ.2) THEN C---------------------------- Autres cas ------------------------------ ELSEIF (IPROG.EQ.3) THEN IF (INU1.EQ.1) THEN BORINF=.TRUE. ELSEIF (INU1.EQ.2) THEN BORINF=.FALSE. ELSEIF (INU1.EQ.3) THEN MINI =.TRUE. ELSEIF (INU1.EQ.4) THEN MINI =.FALSE. ELSEIF (INU1.EQ.5) THEN ELSE RETURN ENDIF C---------------------------- Cas non prevus --------------------------- ELSE RETURN ENDIF RETURN * +-------------------------------------------------------------------+ * | | * | L I S T O B J E | * | | * +-------------------------------------------------------------------+ ELSEIF (CTYP.EQ.'LISTOBJE') THEN IF (IERR.NE.0) RETURN C EXTRACTION DU TYPE DES OBJETS DE LA LISTE IF (IRET.NE.0) THEN IF (CTEXT(1:4).EQ.'TYPE') THEN MLOBJE = ILOBJ SEGACT,MLOBJE CTYP = TYPOBJ RETURN ENDIF ENDIF C EXTRACTION D'UN OBJET DE LA LISTE IF (IERR.NE.0) RETURN IF (I1.LE.0) THEN RETURN ENDIF MLOBJE = ILOBJ SEGACT,MLOBJE NOBJ = LISOBJ(/1) IF (I1.GT.NOBJ) THEN INTERR(1) = I1 RETURN ENDIF IP1 = LISOBJ(I1) CTYP = TYPOBJ RETURN C FIN IF(CTYP... ENDIF *********************************************************************** * ON TRAITE LES LISTENTI, LISTREEL ET LISTMOTS SEPAREMENT POUR * * POUVOIR TOLERER L'INVERSION DES DEUX ARGUMENTS (LA LISTE PRINCIPALE * * ET L'INDICE/LA LISTE D'INDICES) * *********************************************************************** * +-------------------------------------------------------------------+ * | | * | L I S T M O T S | * | | * +-------------------------------------------------------------------+ 10 CONTINUE IF (IRET.EQ.0) GOTO 20 MLMOT1 = ILMOT1 SEGACT , MLMOT1 * =============================== * EXTRACTION DE PLUSIEURS INDICES * =============================== IF ( IRET .EQ. 1 ) THEN MLENTI = ILENT SEGACT , MLENTI JGM = LECT(/1) SEGINI , MLMOT2 ILMOT2= MLMOT2 DO 1221 I=1 , JGM I_EXTR =LECT(I) IF (( I_EXTR .GT. LONMOT ) .OR. ( I_EXTR .LT. 1 )) THEN INTERR(1) = I_EXTR ENDIF 1221 CONTINUE SEGACT , MLMOT2 RETURN * =========================== * EXTRACTION D'UN SEUL INDICE * =========================== ELSE IF (IERR .NE. 0) RETURN IF (ILENT.GT.LONMOT .OR. ILENT.LT.1 ) THEN INTERR(1)=ILENT ELSE ENDIF RETURN ENDIF * +-------------------------------------------------------------------+ * | | * | L I S T R E E L | * | | * +-------------------------------------------------------------------+ 20 CONTINUE IF (IRET.EQ.0) GOTO 30 MLREE1 = ILREE1 SEGACT , MLREE1 * =============================== * EXTRACTION DE PLUSIEURS INDICES * =============================== IF ( IRET .EQ. 1 ) THEN MLENTI = ILENT SEGACT , MLENTI JG = LECT(/1) SEGINI , MLREE2 ILREE2= MLREE2 DO 1231 I=1 , JG I_EXTR =LECT(I) IF (( I_EXTR .GT. LONREE ) .OR. ( I_EXTR .LT. 1 )) THEN INTERR(1) = I_EXTR RETURN ENDIF 1231 CONTINUE SEGACT , MLREE2 RETURN * =========================== * EXTRACTION D'UN SEUL INDICE * =========================== ELSE IF (IERR .NE. 0) RETURN IF (ILENT.GT.LONREE .OR. ILENT.LT.1 ) THEN INTERR(1)=ILENT ELSE ENDIF RETURN ENDIF 124 CONTINUE * +-------------------------------------------------------------------+ * | | * | L I S T E N T I | * | | * +-------------------------------------------------------------------+ 30 CONTINUE IF (IRET.EQ.0) GOTO 999 MLENT1 = ILENT1 SEGACT , MLENT1 LONENT = MLENT1.LECT(/1) * =============================== * EXTRACTION DE PLUSIEURS INDICES * =============================== IF ( IRET .EQ. 1 ) THEN MLENT2 = ILENT2 SEGACT , MLENT2 JG = MLENT2.LECT(/1) SEGINI , MLENT3 ILENT3= MLENT3 DO I=1 , JG I_EXTR =MLENT2.LECT(I) IF (I_EXTR.GT.LONENT .OR. I_EXTR.LT.1) THEN INTERR(1) = I_EXTR ENDIF MLENT3.LECT(I) = MLENT1.LECT(I_EXTR) ENDDO SEGACT , MLENT3 RETURN * =========================== * EXTRACTION D'UN SEUL INDICE * =========================== ELSE IF (IERR .NE. 0) RETURN IF (ILENT.GT.LONENT .OR. ILENT.LT.1 ) THEN INTERR(1)=ILENT ELSE INTEGR = MLENT1.LECT(ILENT) ENDIF RETURN ENDIF * +-------------------------------------------------------------------+ * | E R R E U R : P A S D ' O B J E T C O M P A T I B L E | * +-------------------------------------------------------------------+ 999 CONTINUE END
© Cast3M 2003 - Tous droits réservés.
Mentions légales