eqex
C EQEX SOURCE CB215821 24/04/12 21:15:48 11897 SUBROUTINE EQEX C*********************************************************************** C VERSION : ???? C HISTORIQUE : 22/03/00: gounand C Rajout des préconditionneurs ILUT (ILU with dual truncation) et d'une C variante (ILUT2) qui remplit mieux la mémoire et des paramètres C associés : ILUTLFIL (ILUT level of fill) et ILUTDTOL (ILUT drop C tolerance) C HISTORIQUE : 20/12/99: gounand C Ajout des indices 'TYRENU' (type de renumérotation) et 'PCMLAG' C (placement des multiplicateurs de Lagrange à la table d'indice C 'METHINV'. C HISTORIQUE : 08/04/04 : ajout ILUTP C HISTORIQUE : 27/10/10: JCARDO: correction bug lié à IARG, qui pouvait C parfois valoir zéro à tort (label 110) C HISTORIQUE : C*********************************************************************** IMPLICIT REAL*8 (A-H,O-Z) IMPLICIT INTEGER (I-N) PARAMETER (NBM=21,NBL=4,NOPT=75) PARAMETER (NTB=2,NBH=7) -INC PPARAM -INC CCOPTIO -INC CCNOYAU -INC SMLREEL -INC SMLENTI POINTEUR MLENT4.MLENTI -INC SMLMOTS POINTEUR MINCO.MLMOTS -INC SMELEME POINTEUR IGEOM.MELEME -INC SMMODEL -INC SMCHPOI POINTEUR MCHINI.MCHPOI LOGICAL XEQUA,TTRAN,TPROJ,LOG1 INTEGER RESTRT INTEGER IPST CHARACTER*(LOCOMP) LMOTS(NBM),NOM,CHAI,MTYP,NOMI,NOML,NMACO CHARACTER*(LONOM) NOMZ CHARACTER*8 LSCHE(NBH) CHARACTER*20 NOMO,MEQUA,MNEFMD CHARACTER*8 TYPE,TYPC,TYPS CHARACTER*8 LOPTI(NOPT) CHARACTER*8 MOIMP(NBL) DIMENSION KINCD(100) CHARACTER*8 TINCD(100) CHARACTER*8 LTAB(NTB) DIMENSION KTAB(NTB) DATA LMOTS /'ZONE ','OPER ','INCO ','CLIM ', & 'ITMA ','ALFA ','DTI ','IIMP ', & 'DUMP ','OPTI ','NOMVI ','DOMINC ', & 'TPSI ','TFINAL ','FIDT ','NISTO ', & 'NITER ','OMEGA ','EPS ','IMPR ', & 'EQUA '/ DATA MOIMP /'UIMP ','VIMP ','WIMP ','TIMP '/ DATA LOPTI / C indice KFORM 0 à 3 & 'EFM1 ','EF ','VF ','EFMC ','????????', & 'LINE ','MACRO ','QUAF ','LINB ','ISOQ ', C indice IDCEN & 'CENTREE ','SUPGDC ','SUPG ','TVISQUEU','CNG ', & 'PSI ','JOHNSON ','UPWIND ','GODUNOV ','VANLEER ', & 'VLH ','HUSVL ','HUSVLH ','AUSM ','CG ', & 'VSM ','VSMCC ','SUPGDCH ','SUPGH ','????????', C indice KPOIN & 'SOMMET ','FACE ','CENTRE ','CENTREP0','CENTREP1', & 'MSOMMET ','????????','????????','????????','????????', C indice KIMPL ---------------------->|indice ISCHT & 'IMPL ','EXPL ','SEMI ','BDF2 ','BDF4 ', & 'DIV2 ','CMD ','RIGIDITE','LIMITE ','NODIV ', C indice IKOMP-------------->| RNG KMACO ALE & 'CONS ','NOCONS ','CONS2 ','RNG ','ALE ', C indice MTRMASS---------------------->| & 'MMPLEINE','MMDIAGO ','MMPG ','MATCONS ','????????', C indice IDEUL ------------------------->| & 'EULER ','EULERMS ','EULERMST','????????','????????', C indice KPOIND->| & 'INCOD ','INCOP ','STABP ','MUCONS ','FTAU ', C & 'MUVARI ','????????','????????','????????','????????'/ DATA LSCHE /'EUL_EXPL','EUL_IMPL','TVISQ ','SEMI ', & 'CN ','CNG ','BDF2 '/ DATA LTAB/'DOMAINE ','EQEX '/ C*** C WRITE(IOIMP,*) ' DEBUT EQEX ' IPST=0 NBIK=0 IDP=0 MTABD=0 C Définition des options par défaut c CALL ECMM(KOPT,'INEFMD','xxxxxxxx') MATABL=0 MMODEL=0 IF(TYPE.EQ.'MMODEL')THEN IF(MTBLE.EQ.0)RETURN KTAB(1)=MTBLE KTAB(2)=0 ELSEIF(TYPE.EQ.'MOT')THEN C Nouvelle directive EQUA c write(6,*)' Nouvelle directive EQUA' KTAB(1)=-1 KTAB(2)=0 IF(CHAI(1:4).NE.'EQUA')THEN GO TO 6 ENDIF XEQUA=.TRUE. C Lecture du nom de l'equation/inconnue NBIC=0 JGN=4 JGM=0 NINCT=0 SEGINI MLMOT2 SEGDES MLMOT2 3 CONTINUE IF(MTYP.EQ.'MMODEL ')THEN GO TO 4 ELSEIF(MTYP.EQ.'MOT ')THEN IF(CHAI.EQ.'RIGIDITE')THEN GO TO 3 ENDIF NBIC=NBIC+1 SEGACT MLMOT2 JGM=NBIC SEGADJ MLMOT2 SEGDES MLMOT2 GO TO 3 ELSE C On ne trouve pas d'objet de type %m1:8 MOTERR( 1: 8) = ' ' RETURN ENDIF 4 CONTINUE IF(NBIC.EQ.0)THEN C On ne trouve pas d'objet de type %m1:8 MOTERR( 1: 8) = 'MOT ' RETURN ENDIF SEGACT MMODEL * Détermination de MACRO et INEFMD IMODEL = KMODEL(1) SEGACT IMODEL IF(NEFMOD.GE.129.AND.NEFMOD.LE.135)THEN INEFMD=1 ELSEIF(NEFMOD.GE.136.AND.NEFMOD.LE.141)THEN INEFMD=2 ELSEIF(NEFMOD.GE.143.AND.NEFMOD.LE.149)THEN INEFMD=3 ELSEIF(NEFMOD.GE.158.AND.NEFMOD.LE.164)THEN INEFMD=4 ELSE C% Le type d'élément fini %m1:8 ne convient pas. WRITE(NOM,FMT='(I8)')NEFMOD MOTERR( 1: 8) = NOM RETURN ENDIF SEGDES MMODEL,IMODEL JGN=8 JGM=NBIC NINCT=0 SEGINI MLMOT3 DO 5 I=1,NBIC IF(LCHAR.EQ.0)THEN C On ne trouve pas d'objet de type %m1:8 MOTERR( 1: 8) = 'MOT ' RETURN ENDIF IF(CHAI.EQ.'PRESSION')THEN IF(IPRE.EQ.0)THEN C% On a lu : %m1:8 : , alors qu'on attend un des mots clés suivant : C% %m9:16 %m17:24 %m25:32 %m33:40 MOTERR( 1: 8) = NOM MOTERR( 9:16) = LOPTI(33) MOTERR(17:24) = LOPTI(35) MOTERR(25:32) = LOPTI(36) RETURN ENDIF ENDIF IF(CHAI.NE.'TEMPERAT'.AND.CHAI.NE.'VITESSE'.AND. & CHAI.NE.'PRESSION')THEN C Option %m1:8 incompatible avec les données MOTERR( 1: 8) =CHAI RETURN ENDIF 5 CONTINUE SEGDES MLMOT3 C Lecture du Schema en temps IF(LCHAR.EQ.0)THEN C On ne trouve pas d'objet de type %m1:8 MOTERR( 1: 8) = 'MOT ' RETURN ENDIF IF(CHAI.NE.'PERM'.AND.CHAI.NE.'TRAN'.AND.CHAI.NE.'PROJ')THEN C% On a lu : %m1:8 : , alors qu'on attend un des mots clés suivant : C% %m9:16 %m17:24 %m25:32 %m33:40 MOTERR( 1: 8) = CHAI MOTERR( 9:16) = 'PERM' MOTERR(17:24) = 'TRAN' MOTERR(25:32) = 'PROJ' RETURN ENDIF TPROJ=.FALSE. IF(CHAI.EQ.'PERM')TTRAN=.FALSE. IF(CHAI.EQ.'TRAN')TTRAN=.TRUE. IF(CHAI.EQ.'PROJ')THEN TTRAN=.TRUE. TPROJ=.TRUE. ENDIF IP=0 IF(TTRAN)THEN C Lecture des parametres du transitoire IF(IRET.EQ.0)THEN C On ne trouve pas d'objet de type %m1:8 MOTERR( 1: 8) = 'MOT ou R' RETURN ENDIF IF(MTYP.EQ.'MOT')THEN ELSEIF(MTYP.EQ.'FLOTTANT')THEN ELSE C On ne trouve pas d'objet de type %m1:8 MOTERR( 1: 8) = 'MOT ou R' RETURN ENDIF IF(IRET.EQ.0)THEN C On ne trouve pas d'objet de type %m1:8 MOTERR( 1: 8) = 'MOT ' RETURN ENDIF IF(IPST.EQ.0)THEN WRITE(IOIMP,*)'Directive : ',NOM WRITE(IOIMP,*)'non trouvée dans la liste ->',LSCHE RETURN ENDIF IF(IPST.EQ.4)THEN IF(IRET.EQ.0)THEN C On ne trouve pas d'objet de type %m1:8 MOTERR( 1: 8) = 'FLOTTANT' RETURN ENDIF ENDIF ENDIF DO 51 I=1,NBIC IF(IRET.EQ.0)THEN C On ne trouve pas d'objet de type %m1:8 MOTERR( 1: 8) = 'MOT ' RETURN ENDIF IF(IP.NE.0)THEN write(6,*)' OPTI et ZONE sont des mots cles ' write(6,*)' Choix mal venu pour un nom de variable' C On ne trouve pas d'objet de type %m1:8 MOTERR( 1: 8) = 'MOT ' RETURN ENDIF WRITE(NOM,FMT='(A3,I1)')'INC',I 51 CONTINUE IF(IPST.EQ.7.AND.TTRAN)THEN DO 52 I=1,NBIC IF(IRET.EQ.0)THEN C On ne trouve pas d'objet de type %m1:8 MOTERR( 1: 8) = 'MOT ' RETURN ENDIF WRITE(NOM,FMT='(A3,I1)')'IMC',I c write(6,*)' NOM,CHAI=',NOM,CHAI 52 CONTINUE ENDIF ELSEIF(TYPE.EQ.'TABLE')THEN TYPC=' ' IF(TYPC.EQ.'MOT ')THEN IF(TYPS.EQ.'DOMAINE')THEN KTAB(1)=MTBLE KTAB(2)=0 XEQUA=.FALSE. ELSEIF(TYPS.EQ.'EQEX')THEN KTAB(1)=0 KTAB(2)=MTBLE ELSE WRITE(IOIMP,*)' On attend une table soustype DOMAINE ou EQEX' RETURN ENDIF ENDIF ELSE KTAB(1)=-1 KTAB(2)=0 ENDIF 6 CONTINUE IF(KTAB(2).NE.0)THEN MTABLE=KTAB(2) TYPE='LISTMOTS' SEGACT MLMOT1 ELSEIF(KTAB(1).NE.0)THEN MTABD=KTAB(1) IF(MATABL.EQ.0)THEN XEQUA=.FALSE. ELSE MTABLE=MATABL ENDIF NEQUA=0 IF(KTAB(1).GT.0)THEN ELSE ENDIF C? IF(MMODEL.NE.0)THEN C CALL ECMO(MTABLE,'DOMAINE','MMODEL ',MMODEL) C CALL ECMO(MTABLE,'TDOMAINE','TABLE ',MTABD) C? CALL ECMO(MTABLE,'DOMAINE','TABLE ',MTABD) C? ENDIF JGN=8 JGM=0 SEGINI MLMOT1 NAT=2 NSOUPO=0 SEGINI MCHPOI JATTRI(1)=2 IPAT=1 DT=1.D30 TPS=0.D0 C Définition de la méthode d'inversion et des paramètres C éventuels associés C Méthode d'inversion du système C 1 : résolution directe (Choleski) C 2 : Gradient Conjugué C 3 : Bi-Gradient Conjugué Stabilisé (BiCGSTAB) C 4 : BiCGSTAB(2) KTYPI=1 C Niveau d'impression pour la partie résolution itérative IMPINV=0 C Options spécifiques aux méthodes itératives : C C - Pour l'assemblage : type de renumérotation C * 'RIEN' : pas de renumérotation C * 'SLOA' : algorithme de chez Sloan C * 'GIPR' : Gibbs-King (profile reduction) C * 'GIBA' : Gibbs-Poole-Stockmeyer (bandwidth reduction) * CALL ECMM(MTINV,'TYRENU','RIEN') C - Pour l'assemblage : prise en compte des mult.lag C * 'RIEN' C * 'APR2' C - Pour l'assemblage : SCALING (type ENTIER) : C Scaling de la matrice : C - 0 : pas de scaling C - 1 : scaling par les normes L2 des lignes et des colonnes C Par défaut : 0 ISCAL=0 C - Pour l'assemblage : OUBMAT (type ENTIER) : C Oublie les matrices élémentaires : C - 0 : non C - 1 : oui C Par défaut : 0 IOUBL=0 C - Champoint d'initialisation de la méthode C (i.e. estimation de l'inconnue) ***** MCHINI=0 NAT=0 NSOUPO=0 SEGINI MCHINI SEGDES MCHINI C - Nombre maxi d'itérations à effectuer ITER=2000 C - Norme maxi (L2 normé par le second membre) du résidu RESID=1.D-10 C - Type de préconditionnement : C 0 : pas de préconditionnement C 1 : préconditionnement par la diagonale C 2 : préconditionnement D-ILU C 3 : préconditionnement ILU(0) (Choleski) C 4 : préconditionnement MILU(0) (Choleski modifié) C 5 : préconditionnement ILUT (dual truncation) C 6 : préconditionnement ILUT2 (une variante du C précédent qui remplit mieux la mémoire et C fonctionne mieux quelquefois) C 7 : préconditionnement ILUTP (avec pivoting) C 8 : préconditionnement ILUTPG (avec pivoting) C ILUTP version gounand C On traite de manière spéciale les termes C qui sont dans ILU(0) C 9 : préconditionnement ILUTPG2 (avec pivoting) C ILUTP version gounand 2 C On garde tous les termes qui sont dans ILU(0) KPREC=3 C - Pour une méthode ILUT, on a les deux indices suivant : C * ILUTLFIL : encombrement maximal (approximatif) du C préconditionneur, par rapport à la matrice. C * ILUTDTOL : "drop tolerance" pour le préconditionneur. C i.e. en-dessous de cette valeur relative, les C termes de la factorisation incomplète seront C oubliés. XLFIL=2.D0 * -1. sinon, oubli possible des 0.D0 dans le préconditionneur XDTOL=-1.D0 C - Pour une méthode ILUTP, on a les deux indices suivant : C * ILUTPPIV (type REEL) (compris entre 0.D0 et 1.D0) : C 0.D0 : on ne pivote pas C 1.D0 : on pivote tout le temps C (recommandation : entre 0.1D0 et 0.01D0) C Par défaut : 0.1D0 XSPIV=0.1D0 C - Fréquence de recalcul du préconditionneur en fonction C des deux indices de boucle suivant : C * indice de boucle sur les pas de temps C * indice de boucle sur la boucle d'itérations utilisée C pour résoudre les non-linéarités C Par défaut, on recalcule tout le temps le préconditionneur IFCPRT=1 IFCPRI=1 C - 'Breakdown tolerance' pour les méthodes de type C BiCGSTAB. Si un certain produit scalaire de vecteurs C "direction" est inférieur à cette tolérance, la C méthode s'arrete. BRTOL=1.D-40 C - Paramètre de relaxation pour le préconditionnement C MILU(0) compris entre 0. et 1. C S'il est égal à 0, on se ramène à ILU(0) C S'il est égal à 1, MILU(0) est dit non relaxé RXMILU=1.D0 C - Paramètre de redémarrage pour GMRES(m) RESTRT=50 ENDIF 1 CONTINUE IF(IRET.EQ.0)GO TO 90 2 CONTINUE IF(IDP.NE.0)WRITE(IOIMP,*) ' Directive en cours :',NOM C WRITE(IOIMP,*) ' Directive en cours :',NOM C WRITE(IOIMP,*)' EQEX, IP=',ip,' NOM=',nom IF(IP.EQ.0)THEN WRITE(IOIMP,*)'Directive : ',NOM WRITE(IOIMP,*)'non trouvée dans la liste ->',LMOTS RETURN ENDIF GO TO (10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, & 25,26,27,28,29),IP C ZONE 10 CONTINUE MMODEL=0 IF(KTAB(1).EQ.0)THEN IF(IRET2.EQ.0)THEN WRITE(IOIMP,*)' On attend un objet TABLE DOMAINE ou MODELE' RETURN ENDIF IF(MTBLE.EQ.0)RETURN KTAB(1)=MTBLE ENDIF GO TO 1 C OPER 11 CONTINUE IF(LNOMO.EQ.0)THEN WRITE(IOIMP,*)' ON ATTEND LE NOM DE L OPERATEUR' RETURN ENDIF * ECRITURE DU NOM DE L'OPERATEUR NEQUA=NEQUA+1 IF(NEQUA.LT.10)THEN LNOMOT=LNOMO+1 WRITE(MEQUA,FMT='(I1,19A1)')NEQUA,(NOMO(I:I),I=1,LNOMO) C WRITE(IOIMP,*)' MEQUA=',MEQUA ELSEIF(NEQUA.LT.100.AND.NEQUA.GE.10)THEN LNOMOT=LNOMO+2 WRITE(MEQUA,FMT='(I2,18A1)')NEQUA,(NOMO(I:I),I=1,LNOMO) ELSEIF(NEQUA.LT.1000.AND.NEQUA.GE.100)THEN LNOMOT=LNOMO+3 WRITE(MEQUA,FMT='(I3,17A1)')NEQUA,(NOMO(I:I),I=1,LNOMO) C WRITE(IOIMP,*)' MEQUA=',MEQUA ELSE WRITE(IOIMP,*)'PLUS DE 999 OPERATEURS : CAS NON PREVU' RETURN ENDIF JGN=8 SEGADJ MLMOT1 C CALL LENCHA(MEQUA,LC1) C CALL ECMO(MTABLE,MEQUA(1:8),'TABLE',MTABX) & 'TABLE',0,0.D0,CHAI,.TRUE.,MTABX) * ECRITURE DE LA TABLE DE REFERENCE * ECRITURE DU NOM DE LA ZONE * ECRITURE DE MELEMZ IF(MMODEL.NE.0)THEN ENDIF * ECRITURE DE LA LISTE DES ARGUMENTS * 1) on initialise la variable IARG à 0 * 2) chaque fois que l'on trouve un argument pour l'opérateur courant, * on incrémente cette variable et on boucle (=> GOTO 110) * 3) on met à jour 'IARG' dans MTABX dès qu'il n'y a plus d'argument: * - soit il n'y a plus d'objet passé à EQEX (=> GOTO 90) * - soit on est tombé sur un autre mot-clé (=> GOTO 2 ) IARG=0 110 CONTINUE C WRITE(IOIMP,*)' MTYP=',mtyp,' iret=',iret IF(IRET.EQ.0)THEN * PLUS AUCUN MOT DANS EQEX => ON MET À JOUR 'IARG' GO TO 90 ENDIF IF(MTYP.EQ.'MOT ')THEN IF(IP.EQ.0)THEN IARG=IARG+1 CHAI=NOM WRITE(NOM,FMT='(A3,I1)')'ARG',IARG GO TO 110 ELSE * MOT-CLÉ TROUVÉ => PLUS D'ARGUMENTS => ON MET À JOUR 'IARG' C WRITE(IOIMP,*)' 1er gt2 nom=',nom GO TO 2 ENDIF ELSEIF(MTYP.EQ.'FLOTTANT')THEN IARG=IARG+1 WRITE(NOM,FMT='(A3,I1)')'ARG',IARG GO TO 110 ELSEIF(MTYP.EQ.'ENTIER')THEN IARG=IARG+1 WRITE(NOM,FMT='(A3,I1)')'ARG',IARG CC XVAL=DBLE(IENT) CC CALL ECMF(MTABX,NOM(1:4),XVAL) GO TO 110 ELSEIF(MTYP.EQ.'POINT')THEN IARG=IARG+1 WRITE(NOM,FMT='(A3,I1)')'ARG',IARG GO TO 110 ELSEIF(MTYP.EQ.'LOGIQUE ')THEN IARG=IARG+1 WRITE(NOM,FMT='(A3,I1)')'ARG',IARG GO TO 110 ELSE IARG=IARG+1 IF(IARG.GT.9)RETURN WRITE(NOM,FMT='(A3,I1)')'ARG',IARG GO TO 110 ENDIF C INCO 12 CONTINUE C On crée si ce n'est pas déja fait la liste totale des inconnues C et on la complète TYPE=' ' IF(TYPE.NE.'LISTMOTS')THEN JGN=4 JGM=0 NINCT=0 SEGINI MLMOT2 SEGDES MLMOT2 ENDIF SEGACT MLMOT2 NINCT0=0 SEGDES MLMOT2 C on crée la liste des inconnues associées à l'opérateur JGN=4 JGM=0 JG =0 SEGINI MLMOTS,MLENT4 * ECRITURE DE LA LISTE DES INCONNUES SEGDES MLMOTS,MLENT4 C on crée la liste des types d'inconnues associés à l'opérateur JGN=8 JGM=0 SEGINI MLMOT4 * ECRITURE DE LA LISTE DES TYPES D'INCONNUES SEGDES MLMOT4 120 CONTINUE SEGDES MLMOTS,MLMOT2 IF(IRET.EQ.0)THEN GO TO 90 ENDIF IF(IP.EQ.2.OR.IP.EQ.3)THEN WRITE(IOIMP,*)' Il faut recommencer a la directive ZONE ' RETURN ENDIF C WRITE(IOIMP,*)' EQEX : ',NOM,IP IF(IP.EQ.0)THEN NINCT0=NINCT0+1 IF(NINCT0.GT.5)THEN WRITE(IOIMP,*)' Opérateur EQEX :' WRITE(IOIMP,*)' Le nombre d''inconnues semble important ', & NINCT0,' ? ',NOM ENDIF JGN=4 SEGACT MLMOTS SEGADJ MLMOTS C WRITE(IOIMP,*)' EQEX : ',NOM,' NINCT=',ninct C Cas directive EQUA IF(XEQUA)THEN TYPE=' ' IF(TYPE.NE.'LISTMOTS')THEN write(6,*)' Petit probleme Non prevu ' RETURN ENDIF SEGACT MLMOT2,MLMOT3,MLMOT4,MLENT4 DO 122 I=1,NBIC JGN=8 JG=JGM SEGADJ MLMOT4,MLENT4 MLENT4.LECT(JGM)=I GO TO 123 ENDIF 122 CONTINUE C% L'inconnue : %m1:8 : n'apparait pas dans la liste des inconnues. MOTERR( 1: 8) = NOM RETURN 123 CONTINUE SEGDES MLMOT2,MLMOT3,MLMOT4,MLENT4 ENDIF C On ecrit aussi directement dans MTABX NBINCO,INC1 INC2 C etc comme pour les arguments C? NBINCO=JGM C? WRITE(CHAI,FMT='(A3,I1)')'INC',NBINCO C? CALL ECMM(MTABX,CHAI(1:4),NOM) C? CALL ECME(MTABX,'NBINCO',NBINCO) SEGACT MLMOT2 DO 121 I=1,NINCT C WRITE(IOIMP,*)' On cherche : ',MLMOT2.MOTS(I),NOM 121 CONTINUE JGM=NINCT+1 NINCT=NINCT+1 JGN=4 SEGADJ MLMOT2 GO TO 120 ELSE SEGDES MLMOTS,MLMOT2 C WRITE(IOIMP,*)' 2eme gt2 nom=',nom GO TO 2 ENDIF C CLIM 13 CONTINUE TYPE=' ' IF(TYPE.NE.'CHPOINT')MCHPO1=0 C WRITE(IOIMP,*)' MCHPO1=',mchpo1,' NOMI=',nomi IF(IRET.EQ.0)THEN GO TO 90 ENDIF IF(IP.NE.0)THEN NOM=NOMI C WRITE(IOIMP,*)' 3eme gt2 nom=',nom GO TO 2 ENDIF IF(IP.EQ.0)THEN WRITE(IOIMP,*)' Directive CLIM : ' WRITE(IOIMP,*)' On attend un mot cle de la liste suivante :' $ ,MOIMP RETURN ENDIF WRITE(NOML,FMT='(I1,A4)')IP,NOMI IF(IP.EQ.4)NOML=NOMI IF(IRET.EQ.0)THEN GO TO 90 ENDIF CALL PRCHAN SEGACT MELEME N=NUM(/2) NAT=2 NSOUPO=1 NC=1 SEGINI MCHPOI,MSOUPO,MPOVAL IFOPOI=IFOUR MOCHDE=TITREE MTYPOI='CLIM' JATTRI(1)=2 IPCHP(1)=MSOUPO C WRITE(IOIMP,*)' EQEX 1 : IPCHP,mchpoi=',IPCHP(1),mchpoi NOCOMP(1)=NOML(1:4) IGEOC=MELEME IPOVAL=MPOVAL if(mtyp.eq.'TABLE')THEN ikkt=0 1234 continue ikkt=ikkt+1 WRITE(IOIMP,*)' ikkt=',ikkt if(ikkt.gt.100)return WRITE(IOIMP,*)' Petit incident ' if(ip.ne.ktab(2))then WRITE(IOIMP,*)' Gros incident ',ip,ktab endif if(mtyp.eq.'TABLE')go to 1234 endif C WRITE(IOIMP,*)' MTYP a=',mtyp,iret,' N=',N IF(MTYP.EQ.'FLOTTANT')THEN SEGDES MPOVAL ELSEIF(MTYP.EQ.'ENTIER')THEN XVAL=DBLE(IENT) SEGDES MPOVAL ELSEIF(MTYP.EQ.'CHPOINT')THEN SEGACT MCHPO2 NSP=MCHPO2.IPCHP(/1) SEGACT MELEME DO 3569 L=1,NSP MSOUP2=MCHPO2.IPCHP(L) SEGACT MSOUP2 IGEOM=MSOUP2.IGEOC MPOVA2=MSOUP2.IPOVAL SEGACT IGEOM,MPOVA2 I1=IGEOM.NUM(1,I) II1=LECT(I1) IF(II1.EQ.0)GO TO 3568 VPOCHA(II1,1)=MPOVA2.VPOCHA(I,1) 3568 CONTINUE SEGDES MSOUP2,IGEOM,MPOVA2 3569 CONTINUE SEGSUP MLENTI SEGDES MCHPO2 ELSE WRITE(IOIMP,*)' TYPE NON ENCORE TRAITE' RETURN ENDIF SEGDES MCHPOI,MSOUPO,MPOVAL IF(MCHPO1.NE.0)THEN CALL PRFUSE ENDIF GO TO 13 C ITMA 14 CONTINUE IF(IRET.EQ.0)THEN WRITE(IOIMP,*)' MOT CLE ITMA (Nb maximum de pas de temps) :' WRITE(IOIMP,*)' On attend un entier ' RETURN ENDIF GO TO 1 C ALFA 15 CONTINUE IF(IRET.EQ.0)THEN WRITE(IOIMP,*)' MOT CLE ALFA (Tolerance sur le pas de temps) :' WRITE(IOIMP,*)' doit etre compris entre 0 et 1 (1 par defaut)' WRITE(IOIMP,*)' On attend un flottant ' RETURN ENDIF GO TO 1 C DTI 16 CONTINUE IF(IRET.EQ.0)THEN WRITE(IOIMP,*)' MOT CLE DTI (Pas de temps iinitial) :' WRITE(IOIMP,*)' On attend un flottant ' RETURN ENDIF DT=XVAL GO TO 1 C IIMP 17 CONTINUE TYPE=' ' IF(TYPE.NE.'CHPOINT')MCHPO1=0 IF(IRET.EQ.0)THEN GO TO 90 ENDIF IF(IP.NE.0)THEN NOM=NOMI C WRITE(IOIMP,*)' 4eme gt2 nom=',nom GO TO 2 ENDIF IF(IP.EQ.0)THEN WRITE(IOIMP,*)' Directive IIMP : ' WRITE(IOIMP,*)' On attend un mot cle de la liste suivante :' $ ,MOIMP RETURN ENDIF C WRITE(IOIMP,*)' MOIMP=',moimp(ip) WRITE(NOML,FMT='(I1,A4)')IP,NOMI IF(IP.EQ.4)NOML=NOMI IF(IRET.EQ.0)THEN GO TO 90 ENDIF CALL PRCHAN SEGACT MELEME N=NUM(/2) NAT=2 NSOUPO=1 NC=1 SEGINI MCHPOI,MSOUPO,MPOVAL IFOPOI=IFOUR MOCHDE=TITREE MTYPOI='IIMP' JATTRI(1)=2 IPCHP(1)=MSOUPO C WRITE(IOIMP,*)' EQEX 2 : IPCHP,mchpoi=',IPCHP(1),mchpoi NOCOMP(1)=NOML(1:4) IGEOC=MELEME IPOVAL=MPOVAL C WRITE(IOIMP,*)' MTYP=',mtyp IF(MTYP.EQ.'FLOTTANT')THEN SEGDES MPOVAL ELSEIF(MTYP.EQ.'ENTIER')THEN XVAL=DBLE(IENT) SEGDES MPOVAL ELSE WRITE(IOIMP,*)' TYPE NON ENCORE TRAITE' RETURN ENDIF SEGDES MCHPOI,MSOUPO,MPOVAL IF(MCHPO1.NE.0)THEN CALL PRFUSE ENDIF GO TO 17 C DUMP 18 CONTINUE IDP=1 GO TO 1 C OPTI 19 CONTINUE C Définition des options par défaut IF(KIMPL.EQ.1)AIMPL=1.D0 IF(KIMPL.EQ.0)AIMPL=0.D0 C? CALL ECME(KOPT1,'KPOIND',99) KOPT=KOPT1 191 CONTINUE IF(IRET.EQ.0)THEN GO TO 90 ENDIF IF(IP.EQ.0)THEN GO TO 1 ENDIF C write(6,*)' NOM=',NOM,IP GO TO (1901,1902,1903,1904,1905,1906,1907,1908,1909,1910, & 1911,1912,1913,1914,1915,1916,1917,1918,1919,1920, & 1921,1922,1923,1924,1925,1926,1927,1928,1929,1930, & 1931,1932,1933,1934,1935,1936,1937,1938,1939,1940, & 1941,1942,1943,1944,1945,1946,1947,1948,1949,1950, & 1951,1952,1953,1954,1955,1956,1957,1958,1959,1960, & 1961,1962,1963,1964,1965,1966,1967,1968,1969,1970, & 1971,1972,1973,1974,1975 ),IP C Formulation EFM1 GO TO 191 C Formulation EF GO TO 191 C Formulation VF GO TO 191 C Formulation EFMC GO TO 191 C Emplacements libres pour une nouvelle formulation 1905 CONTINUE GO TO 191 C Formulation EF LINE GO TO 191 C Formulation EF MACRO GO TO 191 C Formulation EF QUAF GO TO 191 C Formulation EF LINB GO TO 191 C Formulation EF LINB GO TO 191 C CENTREE GO TO 191 C SUPGDC GO TO 191 C SUPG GO TO 191 C Tenseur visqueux GO TO 191 C Crank Nicholson généralisé GO TO 191 C PSI GO TO 191 C JOHNSON GO TO 191 C UPWIND GO TO 191 C GODUNOV GO TO 191 C VANLEER GO TO 191 C VLH (VAN LEER - HANEL) GO TO 191 C HUSVL (VAN LEER + OSHER) GOTO 191 C HUSVLH (VAN LEER - HANEL + OSHER) GOTO 191 C AUSM (AUSM+) GOTO 191 C CG Colella-Glaz GOTO 191 C VSM Viscosité de sous-maille GOTO 191 C VSMCC Viscosité de sous-maille Capture de choc GOTO 191 C SUPGDCH GOTO 191 C SUPGH GOTO 191 C emplacements libres pour nouveaux schema 1930 CONTINUE GO TO 191 C sommet GO TO 191 C face GO TO 191 C centre GO TO 191 C centrep0 GO TO 191 C centrep1 GO TO 191 C msommet GO TO 191 C Emplacements libres pour de nouveaux points 1937 CONTINUE 1938 CONTINUE 1939 CONTINUE 1940 CONTINUE GO TO 191 C Implicite GO TO 191 C Explicite GO TO 191 C Semi implicite C? WRITE(IOIMP,*)' EQEX KIMPL mis a 2 ' IF(MTYP.EQ.'FLOTTANT')THEN ELSE ENDIF GO TO 191 C Schema en temps implicite 2eme ordre BDF2 GO TO 191 C Schema en temps implicite 4eme ordre BDF4 GO TO 191 C Rajout du terme 1/2 T Div U pour stabiliser (par defaut 0) GO TO 191 C Coefficient multiplicateur du decentrement (par defaut 1.) 1947 CONTINUE IF(MTYP.EQ.'FLOTTANT')THEN IF(IRET.EQ.0)THEN GO TO 90 ENDIF ELSE RETURN ENDIF GO TO 191 C Format des matrices RIGIDITE IRIG = 1 MATRIK IRIG = 0 defaut 1948 CONTINUE GO TO 191 C LIMITE Limiteur divers active (Kepsilon ou autre) 1949 CONTINUE GO TO 191 C NODIV 1950 CONTINUE GO TO 191 C Emplacements libres pour de nouveaux Schéma C Formulation conservative C Formulation non conservative GO TO 191 GO TO 191 GO TO 191 GO TO 191 GO TO 191 C Matrice masse pleine GO TO 191 C Matrice masse diagonale GO TO 191 C Matrice masse consistante (Petrov Galerkin) pour le terme source GO TO 191 C Matrice CONSTANTE IF(LCHAR.EQ.0)THEN C On ne trouve pas d'objet de type %m1:8 MOTERR( 1: 8) = 'MOT' RETURN ENDIF NMACO=CHAI(1:LCHAR) GO TO 191 C Emplacement libre pour de nouvelles idées (il faudra etre concis) 1960 CONTINUE GO TO 191 C Indices IDEUL C EULER GO TO 191 C EULERMS GO TO 191 C EULERMST GO TO 191 C Emplacements libres pour de nouveaux Schéma 1964 CONTINUE 1965 CONTINUE GO TO 191 C Indices KPOIND 1966 CONTINUE IF(IRET.EQ.0)THEN GO TO 90 ENDIF IF(IP.EQ.0)THEN GO TO 90 ELSE ENDIF GO TO 191 C Emplacements libres 1967 CONTINUE GO TO 191 1968 CONTINUE C Indice STABP IF(IRET.EQ.0)THEN GO TO 90 ENDIF GO TO 191 C MUCONS mu constant par élément GO TO 191 C FTAU mu variable par élément (formulation en grad mu) GO TO 191 C MUVARI Formulation en Tau GO TO 191 C Emplacements libres 1972 CONTINUE 1973 CONTINUE 1974 CONTINUE 1975 CONTINUE GO TO 191 C OPTI 20 CONTINUE IF(IRET.EQ.0)GO TO 90 GO TO 1 C ' ' 21 CONTINUE C WRITE(IOIMP,*)' nbik=',nbik NBIK=NBIK+1 C WRITE(IOIMP,*)' NOM=',nom,iret IF(IRET.EQ.0)GO TO 90 TINCD(NBIK)=NOM C WRITE(IOIMP,*)' iret=',iret IF(IRET.EQ.0)THEN WRITE(IOIMP,*)' On attend un objet TABLE DOMAINE' RETURN ENDIF KINCD(NBIK)=KTAB(1) GO TO 1 C TPSI 22 CONTINUE IF(IRET.EQ.0)THEN WRITE(IOIMP,*)' MOT CLE TPSI (Instant initial) :' WRITE(IOIMP,*)' On attend un flottant ' RETURN ENDIF GO TO 1 C TFINAL 23 CONTINUE IF(IRET.EQ.0)THEN WRITE(IOIMP,*)' MOT CLE TFINAL (Temps final) :' WRITE(IOIMP,*)' On attend un flottant ' RETURN ENDIF GO TO 1 C FIDT 24 CONTINUE IF(IRET.EQ.0)THEN WRITE(IOIMP,*)' MOT CLE FIDT (Frequence impression temps) :' WRITE(IOIMP,*)' On attend un entier ' RETURN ENDIF GO TO 1 C NISTO 25 CONTINUE IF(IRET.EQ.0)THEN WRITE(IOIMP,*)' MOT CLE NISTO (Frequence saisie historique) :' WRITE(IOIMP,*)' On attend un entier ' RETURN ENDIF GO TO 1 C NITER 26 CONTINUE IF(IRET.EQ.0)THEN WRITE(IOIMP,*)' MOT CLE NITER (Nombre iterations internes) :' WRITE(IOIMP,*)' On attend un entier ' RETURN ENDIF GO TO 1 C OMEGA 27 CONTINUE IF(IRET.EQ.0)THEN WRITE(IOIMP,*)' MOT CLE OMEGA (Facteur de relaxation) :' WRITE(IOIMP,*)' On attend un flottant ' RETURN ENDIF GO TO 1 C EPS 28 CONTINUE IF(IRET.EQ.0)THEN WRITE(IOIMP,*)' MOT CLE EPS (Tolerance sur le residu) :' WRITE(IOIMP,*)' On attend un flottant ' RETURN ENDIF GO TO 1 C IMPR 29 CONTINUE IF(IRET.EQ.0)THEN WRITE(IOIMP,*)' MOT CLE IMPR (Niveau d impression) :' WRITE(IOIMP,*)' On attend un entier ' RETURN ENDIF GO TO 1 90 CONTINUE TYPE=' ' IF(TYPE.NE.'TABLE')GO TO 900 TYPE=' ' IF(MLMOT2.NE.0)THEN SEGACT MLMOT2 TYPE=' ' IF(TYPE.EQ.'TABLE')THEN DO 93 I=1,NINCT TYPE=' ' 93 CONTINUE DO 94 I=1,NBIK NOMI=TINCD(NBIK) 94 CONTINUE ELSE DO 91 I=1,NINCT 91 CONTINUE DO 92 I=1,NBIK NOMI=TINCD(NBIK) 92 CONTINUE ENDIF SEGDES MLMOT2 ENDIF 900 CONTINUE C write(6,*)' RETOUR EQEX ' RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales