pre321
C PRE321 SOURCE OF166741 24/10/03 21:15:33 12022 & ICEN,IFACE,IFACEL,INORM, & IROC, IGRROC, IALROC, & IVITC, IGRVC, IALVC, & IPC ,IGRPC, IALPC, & IYC ,IGRYC, IALYC, & ISCAC ,IGRSC, IALSC, & IGAMC, & DELTAT, & IROF,IVITF,IPF,IYF,ISCAF, & LOGAN,LOGNEG,LOGBOR,MESERR,VALER,VAL1,VAL2) C************************************************************************ C C PROJET : CASTEM 2000 C C NOM : PRE321 C C DESCRIPTION : Voir PRE32 C C LANGAGE : FORTRAN 77 + ESOPE 2000 (avec extensions CISI) C C AUTEUR : A. BECCANTINI, DRN/DMT/SEMT/TTMF C C************************************************************************ C C C APPELES (Outils) : KRIPAD, LICHT C C APPELES (Calcul) : AUCUN C C C************************************************************************ C C ENTREES C C LOGTEM : LOGICAL; si .TRUE. 2em ordre en temps C sinon 1er ordre en temps C LGAMC,LYC,LSCAC : LOGICAL : si .TRUE. IGAMC, IYC, ISCAC sont C pointeurs de CHPOINTS C C 1) Pointeurs de MELEMEs et de CHPOINTs de la table DOMAINE C C ICEN : MELEME de 'POI1' SPG des CENTRES C C IFACE : MELEME de 'POI1' SPG des FACES C C IFACEL : MELEME de 'SEG3' avec C CENTRE d'Elt "gauche" C CENTRE de Face C CENTRE d'Elt "droite" C C N.B. = IFACE.NUM(i,1) = IFACEL.NUM(i,2) C C INORM : CHPOINT des cosinus directeurs de normales aux faces C C 2) Autres pointeurs C C IROC : CHPOINT "CENTRE" contenant la masse volumique RHO C C IGRROC : CHPOINT "CENTRE" contenant le gradient de la C masse volumique RHO (2 composantes) C C IALROC : CHPOINT "CENTRE" contenant le limiteur du gradient C de la masse volumique C C IVITC : CHPOINT "CENTRE" contenant la vitesse UX, UY ; C C IGRVC : CHPOINT "CENTRE" contenant le gradient de la C vitesse (4 composantes) C C IALVC : CHPOINT "CENTRE" contenant le limiteur du gradient C de la vitesse (2 composantes) C C IPC : CHPOINT "CENTRE" contenat la pression P; C C IGRPC : CHPOINT "CENTRE" contenant le gradient de la C pression (2 composantes) C C IALPC : CHPOINT "CENTRE" contenant le limiteur du gradient C de la pression C C IYC : CHPOINT "CENTRE" contenat les fractions massiques ; C C IGRYC : CHPOINT "CENTRE" contenant les gradient des fr.mass ; C C IALPC : CHPOINT "CENTRE" contenant les limiteurs des gradients C des fr.mass. ; C C ISCAC : CHPOINT "CENTRE" contenat les scalaires passifs ; C C IGRSC : CHPOINT "CENTRE" contenant les gradient des scalaires passifs; C C IALPC : CHPOINT "CENTRE" contenant les limiteurs des gradients C des scalaires passifs ; C C C IGAMC : CHPOINT "CENTRE" contenat le "Gamma" du gaz C C 3) C C DELTAT : REAL*8, encrement en temps pour calculer la prediction C C C SORTIES C C C IROF : MCHAML defini sur le MELEME de pointeur IFACEL, C contenant la masse volumique RHO C C IVITF : MCHAML defini sur le MELEME de pointeur IFACEL, C contenant la vitesse UN, UT dans le repaire local C (n,t) et defini sur le MELEME de pointeur IFACE, C contenant les cosinus directeurs du repere local C C IPF : MCHAML defini sur le MELEME de pointeur IFACEL, C contenant la pression P C C IYF : MCHAML defini sur le MELEME de pointeur IFACEL, C contenant les fractions massiques; C C ISCAF : MCHAML defini sur le MELEME de pointeur IFACEL, C contenant les scalaires passifs; C C LOGAN : anomalie detectee C C LOGNEG : (LOGICAL): si .TRUE. une pression ou une densité C negative a été detectée -> en interactif le C programme s'arrete en GIBIANE C (erreur stocké en MESERR et VALER) C C LOGBOR : (LOGICAL): si .TRUE. un y a ete detecte C dehor 1 et 3 (sa valeur stockée en MESERR et VALER; C en VAL1 et en VAL2 on stocke 1.0 et 3.0) C C MESERR C VALER C VAL1, C VAL2 : pour les messages d'erreur C C************************************************************************ C C HISTORIQUE (Anomalies et modifications éventuelles) C C HISTORIQUE : Créée le 21.12.98. C C 17.02.2000: transport des scalaires passifs C C************************************************************************ C C C ATTENTION: Cet programme marche si le MAILLAGE est convex; C si non il faut changer l'algoritme de calcul de C l'orientation des normales aux faces. C C La positivité n'est pas controlle parce que c'est déjà fait C dans l'operateur PRIM C C C************************************************************************ C C**** Les variables C IMPLICIT INTEGER(I-N) INTEGER ICEN, IFACE, IFACEL, INORM,IROC, IGRROC, IALROC & , IVITC, IGRVC, IALVC & , IPC ,IGRPC, IALPC & , IYC, IGRYC, IALYC & , ISCAC, IGRSC, IALSC & , IGAMC & , IROF, IVITF, IPF, IYF, ISCAF & , IGEOM, NFAC, NCEN & , N1PTEL, N1EL, N2PTEL, N2EL, N2, N1, N3, L1, NLCE & , NLCF, NGCF, NGCEG, NLCEG, NGCED, NLCED, NGCF1 & , IDIMP1, INDCEL, I1, NESP, NSCA, NMA REAL*8 VALER, VAL1, VAL2, XG, YG, XC, YC, XD, YD, DELTAT & ,DXG, DYG, DXD, DYD & , CNX, CNY, CTX, CTY, ORIENT & , ROG, PG, GAMG, UXG, UYG, UNG, UTG & , ROD, PD, UXD, UYD, UND, UTD & , VALCEL, DCEL, ALCEL & , DROX, DROY, DUXX, DUXY, DUYX, DUYY, DPX, DPY & , DRO, DUX, DUY, DP & , ALPHA, DYMAS, SUMY CHARACTER*(40) MESERR CHARACTER*(8) TYPE LOGICAL LOGAN,LOGNEG, LOGBOR, LOGTEM, LOGI1, LOGI2 & ,LGAMC,LYC,LSCAC C C**** Les Includes C -INC SMCOORD -INC PPARAM -INC CCOPTIO -INC SMCHPOI POINTEUR MPROC.MPOVAL, MPGRR.MPOVAL, & MPVITC.MPOVAL, MPGRV.MPOVAL, & MPPC.MPOVAL, MPGRP.MPOVAL, & MPYC.MPOVAL, MPGRY.MPOVAL, & MPSCAC.MPOVAL, MPGRS.MPOVAL, & MPGAMC.MPOVAL, MPNORM.MPOVAL, & MPROP.MPOVAL, MPPP.MPOVAL, MPVITP.MPOVAL, & MPYP.MPOVAL, MPSCAP.MPOVAL -INC SMCHAML POINTEUR MCHAMY.MCHAML, MCHAMS.MCHAML POINTEUR MELVNX.MELVAL, MELVNY.MELVAL, & MELT1X.MELVAL, MELT1Y.MELVAL POINTEUR MELVUN.MELVAL, MELVUT.MELVAL POINTEUR MELRO.MELVAL, MELP.MELVAL POINTEUR MELALR.MPOVAL, & MELALV.MPOVAL, & MELALP.MPOVAL, & MELALY.MPOVAL, & MELALS.MPOVAL -INC SMLENTI -INC SMELEME C C**** Segments des fractions massiques gauche et droit C SEGMENT FRAMAS REAL*8 FRAMG(NMA), FRAMD(NMA) ENDSEGMENT POINTEUR SCALPA.FRAMAS C C C**** Initialisation des parametres d'erreur déjà faite, i.e. C C LOGNEG = .FALSE. C LOGBOR = .FALSE. C MESERR = ' ' C MOTERR(1:40) = MESERR(1:40) C VALER = 0.0D0 C VAL1 = 0.0D0 C VAL2 = 0.0D0 C C C**** KRIPAD pour la correspondance global/local de centre C C C**** MLENTI1 a MCORD.XCOORD(/1)/(IDIM+1) elements C C Si i est le numero global d'un noeud de ICEN, C MLENT1.LECT(i) contient sa position, i.e. C C I = numero global du noeud centre C MLENT1.LECT(i) = numero local du noeud centre C C MLENT1 déjà activé, i.e. C C SEGACT MLENT1 C C**** Activation de CHPOINTs C C densité + grad + limiteur C vitesse + grad + limiteur C pression + grad + limiteur C fract.mass + grad + limiteur C gamma C cosinus directeurs des normales aux surface C C C**** Les MPOVALs 'Prediction' C IF(LOGTEM)THEN SEGINI, MPROP = MPROC SEGINI, MPPP = MPPC SEGINI, MPVITP = MPVITC ELSE MPROP = MPROC MPPP = MPPC MPVITP = MPVITC ENDIF C C**** Les Limiteurs C C C C**** Les MPOVAL sont déjà activés i.e.: C C SEGACT MPROC C SEGACT MPGRR C SEGACT MPIALR C SEGACT MPVITC C SEGACT MPGRV C SEGACT MPIALV C SEGACT MPPC C SEGACT MPGRP C SEGACT MPIALP C SEGACT MPGAMC (si LGAMC) C SEGACT MPNORM C C**** Le MELEME FACEL C IPT1 = IFACEL IPT2 = IFACE SEGACT IPT1 SEGACT IPT2 NFAC = IPT1.NUM(/2) C C**** Creation de MCHAMLs contenant les etats gauche et droite, C C i.e.: C C vitesse + cosinus directors du repere local C densité C pression C C**** Cosinus directors du repere local et vitesse C C Les cosinus directeurs C N1 = 2 N3 = 6 L1 = 28 SEGINI MCHEL1 IVITF = MCHEL1 MCHEL1.TITCHE = 'U ' MCHEL1.IMACHE(1) = IFACE MCHEL1.IMACHE(2) = IFACEL MCHEL1.CONCHE(1) = ' (n,t) in (x,y) ' MCHEL1.CONCHE(2) = ' U in (n,t) ' C C**** Valeurs des cosinus definies par respect au repair global, i.e. C MCHEL1.INFCHE(1,1) = 2 MCHEL1.INFCHE(1,3) = NIFOUR MCHEL1.INFCHE(1,4) = 0 MCHEL1.INFCHE(1,5) = 0 MCHEL1.INFCHE(1,6) = 1 MCHEL1.IFOCHE = IFOUR C C**** Valeurs de vitesse definies par respect au repair local, i.e. C MCHEL1.INFCHE(2,1) = 1 MCHEL1.INFCHE(2,3) = NIFOUR MCHEL1.INFCHE(2,4) = 0 MCHEL1.INFCHE(2,5) = 0 MCHEL1.INFCHE(2,6) = 1 C C**** Le cosinus directeurs C N1PTEL = 1 N1EL = NFAC N2PTEL = 0 N2EL = 0 C C**** MCHAML a N2 composantes: C C cosinus directeurs du repere local (n,t1) C C IDIM = 2 -> 4 composantes C N2 = 4 SEGINI MCHAM1 MCHEL1.ICHAML(1) = MCHAM1 MCHAM1.NOMCHE(1) = 'NX ' MCHAM1.NOMCHE(2) = 'NY ' MCHAM1.NOMCHE(3) = 'TX ' MCHAM1.NOMCHE(4) = 'TY ' MCHAM1.TYPCHE(1) = 'REAL*8 ' MCHAM1.TYPCHE(2) = 'REAL*8 ' MCHAM1.TYPCHE(3) = 'REAL*8 ' MCHAM1.TYPCHE(4) = 'REAL*8 ' SEGINI MELVNX SEGINI MELVNY SEGINI MELT1X SEGINI MELT1Y MCHAM1.IELVAL(1) = MELVNX MCHAM1.IELVAL(2) = MELVNY MCHAM1.IELVAL(3) = MELT1X MCHAM1.IELVAL(4) = MELT1Y SEGDES MCHAM1 C C**** Vitesse C N1EL = NFAC N1PTEL = 3 N2EL = 0 N2PTEL = 0 C C**** MCHAML a N2 composantes: C C IDIM = 2 -> 2 composantes C N2 = 2 SEGINI MCHAM1 MCHEL1.ICHAML(2) = MCHAM1 SEGDES MCHEL1 MCHAM1.NOMCHE(1) = 'UN ' MCHAM1.NOMCHE(2) = 'UT ' MCHAM1.TYPCHE(1) = 'REAL*8 ' MCHAM1.TYPCHE(2) = 'REAL*8 ' SEGINI MELVUN SEGINI MELVUT MCHAM1.IELVAL(1) = MELVUN MCHAM1.IELVAL(2) = MELVUT SEGDES MCHAM1 C C**** Densite C N1 = 1 N3 = 6 L1 = 15 SEGINI MCHEL2 IROF = MCHEL2 MCHEL2.IMACHE(1) = IFACEL MCHEL2.TITCHE = 'RO ' MCHEL2.CONCHE(1) = ' ' C C**** Valeurs independente du repére, i.e. C MCHEL2.INFCHE(1,1) = 0 MCHEL2.INFCHE(1,3) = NIFOUR MCHEL2.INFCHE(1,4) = 0 MCHEL2.INFCHE(1,5) = 0 MCHEL2.INFCHE(1,6) = 1 MCHEL2.IFOCHE = IFOUR N2 = 1 SEGINI MCHAM1 MCHEL2.ICHAML(1) = MCHAM1 SEGDES MCHEL2 MCHAM1.NOMCHE(1) = 'SCAL ' MCHAM1.TYPCHE(1) = 'REAL*8 ' SEGINI MELRO MCHAM1.IELVAL(1) = MELRO SEGDES MCHAM1 C C**** Pression C MCHEL1 = IROF SEGINI, MCHEL2 = MCHEL1 IPF = MCHEL2 MCHEL2.TITCHE = 'P ' C C**** MCHAM1 = MCHAML de la densite C SEGINI, MCHAM2 = MCHAM1 MCHEL2.ICHAML(1) = MCHAM2 SEGDES MCHEL2 SEGINI MELP MCHAM2.IELVAL(1) = MELP SEGDES MCHAM2 C C**** Le CHAMELEM des fractions massiques C IF(LYC)THEN MCHPO1 = IYC SEGACT MCHPO1 MSOUP1 = MCHPO1.IPCHP(1) SEGDES MCHPO1 SEGACT MSOUP1 MPYC = MSOUP1.IPOVAL SEGACT MPYC NESP = MPYC.VPOCHA(/2) MCHEL1 = IROF SEGINI, MCHEL2 = MCHEL1 IYF = MCHEL2 MCHEL2.TITCHE = 'Y ' N2 = NESP SEGINI MCHAMY MCHEL2.ICHAML(1) = MCHAMY SEGDES MCHEL2 N1EL = NFAC N1PTEL = 3 N2EL = 0 N2PTEL = 0 DO I1 = 1, NESP SEGINI MELVA1 MCHAMY.IELVAL(I1) = MELVA1 MCHAMY.NOMCHE(I1) = MSOUP1.NOCOMP(I1) MCHAMY.TYPCHE(I1) = 'REAL*8 ' ENDDO SEGDES MSOUP1 C NMA = NESP SEGINI FRAMAS IF(LOGTEM)THEN SEGINI, MPYP = MPYC ELSE MPYP = MPYC ENDIF ELSE NESP = 0 IYF = 0 ENDIF C C**** Le CHAMELEM des scalaires passifs C IF(LSCAC)THEN MCHPO1 = ISCAC SEGACT MCHPO1 MSOUP1 = MCHPO1.IPCHP(1) SEGDES MCHPO1 SEGACT MSOUP1 MPSCAC = MSOUP1.IPOVAL SEGACT MPSCAC NSCA = MPSCAC.VPOCHA(/2) MCHEL1 = IROF SEGINI, MCHEL2 = MCHEL1 ISCAF = MCHEL2 MCHEL2.TITCHE = 'SCALPASS ' N2 = NSCA SEGINI MCHAMS MCHEL2.ICHAML(1) = MCHAMS SEGDES MCHEL2 N1EL = NFAC N1PTEL = 3 N2EL = 0 N2PTEL = 0 DO I1 = 1, NSCA SEGINI MELVA1 MCHAMS.IELVAL(I1) = MELVA1 MCHAMS.NOMCHE(I1) = MSOUP1.NOCOMP(I1) MCHAMS.TYPCHE(I1) = 'REAL*8 ' ENDDO SEGDES MSOUP1 C NMA = NSCA SEGINI SCALPA IF(LOGTEM)THEN SEGINI, MPSCAP = MPSCAC ELSE MPSCAP = MPSCAC ENDIF ELSE NSCA = 0 ISCAF = 0 ENDIF C C**** Donc on a aussi actives le chpoints de fractions massiques C C SEGACT MPYC C SEGACT MPGRY C SEGACT MPIALY C C SEGACT MPSCAC C SEGACT MPGRS C SEGACT MPIALS C C C*********************************************************************** C********* PREDICTION ************************************************** C*********************************************************************** C C**** Prediction avec gradients limités C C IF(LOGTEM)THEN C IPT3 = ICEN SEGACT IPT3 NCEN = IPT3.NUM(/2) DO NLCE = 1, NCEN ROG = MPROP.VPOCHA(NLCE,1) UXG = MPVITP.VPOCHA(NLCE,1) UYG = MPVITP.VPOCHA(NLCE,2) PG = MPPP.VPOCHA(NLCE,1) DROX = MPGRR.VPOCHA(NLCE,1)*MELALR.VPOCHA(NLCE,1) DROY = MPGRR.VPOCHA(NLCE,2)*MELALR.VPOCHA(NLCE,1) DUXX = MPGRV.VPOCHA(NLCE,1)*MELALV.VPOCHA(NLCE,1) DUXY = MPGRV.VPOCHA(NLCE,2)*MELALV.VPOCHA(NLCE,1) DUYX = MPGRV.VPOCHA(NLCE,3)*MELALV.VPOCHA(NLCE,2) DUYY = MPGRV.VPOCHA(NLCE,4)* MELALV.VPOCHA(NLCE,2) DPX = MPGRP.VPOCHA(NLCE,1)* MELALP.VPOCHA(NLCE,1) DPY = MPGRP.VPOCHA(NLCE,2)* MELALP.VPOCHA(NLCE,1) GAMG = MPGAMC.VPOCHA(NLCE,1) DRO = UXG * DROX + ROG * ( DUXX + DUYY ) & + UYG * DROY DUX = UXG * DUXX + DPX / ROG + UYG * DUXY DUY = UXG * DUYX + UYG * DUYY + DPY / ROG & + UXG * DPX + UYG * DPY C MPROP.VPOCHA(NLCE,1) = ROG - DELTAT * DRO MPVITP.VPOCHA(NLCE,1) = UXG - DELTAT * DUX MPVITP.VPOCHA(NLCE,2) = UYG - DELTAT * DUY DO I1 = 1, NESP, 1 INDCEL = 2 * I1 - 1 MPYP.VPOCHA(NLCE,I1) = MPYC.VPOCHA(NLCE,I1) - & DELTAT * DYMAS ENDDO DO I1 = 1, NSCA, 1 INDCEL = 2 * I1 - 1 MPSCAP.VPOCHA(NLCE,I1) = MPSCAC.VPOCHA(NLCE,I1) - & DELTAT * DYMAS ENDDO ENDDO C ENDIF C C C*********************************************************************** C********* CORRECTION ************************************************** C*********************************************************************** C C**** Boucle sur le faces C IDIMP1 = IDIM + 1 DO NLCF = 1, NFAC C C******* NLCF = numero local du centre de face C NGCF = numero global du centre de face C NGCEG = numero global du centre ELT "gauche" C NLCEG = numero local du centre ELT "gauche" C NGCED = numero global du centre ELT "droite" C NLCED = numero local du centre ELT "droite" C NGCEG = IPT1.NUM(1,NLCF) NGCF = IPT1.NUM(2,NLCF) NGCED = IPT1.NUM(3,NLCF) NLCEG = MLENT1.LECT(NGCEG) NLCED = MLENT1.LECT(NGCED) C C******* TEST: IPT2.NUM(1,NLCF) = IPT1.NUM(2,NLCF) C NGCF1 = IPT2.NUM(1,NLCF) IF( NGCF1 .NE. NGCF) THEN LOGAN = .TRUE. MESERR(1:40) = 'PRET, subroutine pre321.eso ' GOTO 9999 ENDIF C C******* Cosinus directeurs des NORMALES aux faces C C On impose que les normales sont direct "Gauche" -> "Centre" C INDCEL = (NGCEG-1)*IDIMP1 XG = XCOOR(INDCEL+1) YG = XCOOR(INDCEL+2) INDCEL = (NGCF-1)*IDIMP1 XC = XCOOR(INDCEL + 1) YC = XCOOR(INDCEL + 2) INDCEL = (NGCED-1)*IDIMP1 XD = XCOOR(INDCEL+1) YD = XCOOR(INDCEL+2) DXG = XC - XG DYG = YC - YG DXD = XC - XD DYD = YC - YD C C******* On calcule le sign du pruduit scalare C (Normales de Castem) * (vecteur "gauche" -> "centre") C CNX = MPNORM.VPOCHA(NLCF,1) CNY = MPNORM.VPOCHA(NLCF,2) LOGAN = .TRUE. MESERR(1:30)= & 'PRET , subroutine pre321.eso. ' GOTO 9999 ENDIF C C********** Cosinus directeurs de tangent 2D C CTX = -1.0D0 * CNY CTY = CNX C C C******* Les autres MELVALs C C C******* N.B.: On suppose qu'on a déjà controlle RO, P > 0 C y_i \in (0,1) C Si non il faut le faire, en utilisant LOGBOR, C LOGNEG, VALER, VAL1, VAL2 C C C C******* NGCEG = NGCED -> Mur C IF( NGCEG .EQ. NGCED)THEN C C********** Sur le mur on fait de reconstruction sur l'etat gauche C C C********** Etat gauche C VALCEL = MPROP.VPOCHA(NLCEG, 1) ALCEL = MELALR.VPOCHA(NLCEG, 1) DCEL = MPGRR.VPOCHA(NLCEG, 1)*DXG + & MPGRR.VPOCHA(NLCEG, 2)*DYG ROG = VALCEL + ALCEL * DCEL C VALCEL = MPPP.VPOCHA(NLCEG, 1) ALCEL = MELALP.VPOCHA(NLCEG, 1) DCEL = MPGRP.VPOCHA(NLCEG, 1)*DXG + & MPGRP.VPOCHA(NLCEG, 2)*DYG PG = VALCEL + ALCEL * DCEL C LOGI2 = .FALSE. SUMY = 0.0D0 DO I1 = 1, NESP, 1 INDCEL = 2 * I1 - 1 VALCEL = MPYP.VPOCHA(NLCEG,I1) ALCEL = MELALY.VPOCHA(NLCEG, I1) DCEL = MPGRY.VPOCHA(NLCEG, INDCEL)*DXG + & MPGRY.VPOCHA(NLCEG,INDCEL + 1 )*DYG ALCEL = VALCEL + ALCEL * DCEL SUMY = SUMY + ALCEL LOGI2 = LOGI2 .OR. (ALCEL .LT. 0.0D0) FRAMAS.FRAMG(I1) = ALCEL ENDDO LOGI2 = LOGI2 .OR. (SUMY .GT. 1.0D0) C DO I1 = 1, NSCA, 1 INDCEL = 2 * I1 - 1 VALCEL = MPSCAP.VPOCHA(NLCEG,I1) ALCEL = MELALS.VPOCHA(NLCEG, I1) DCEL = MPGRS.VPOCHA(NLCEG, INDCEL)*DXG + & MPGRS.VPOCHA(NLCEG,INDCEL + 1 )*DYG ALCEL = VALCEL + ALCEL * DCEL SCALPA.FRAMG(I1) = ALCEL ENDDO C VALCEL = MPVITP.VPOCHA(NLCEG, 1) ALCEL = MELALV.VPOCHA(NLCEG, 1) DCEL = MPGRV.VPOCHA(NLCEG, 1)*DXG + & MPGRV.VPOCHA(NLCEG, 2)*DYG UXG = VALCEL + ALCEL * DCEL C VALCEL = MPVITP.VPOCHA(NLCEG, 2) ALCEL = MELALV.VPOCHA(NLCEG, 2) DCEL = MPGRV.VPOCHA(NLCEG, 3)*DXG + & MPGRV.VPOCHA(NLCEG, 4)*DYG UYG = VALCEL + ALCEL * DCEL C UNG = UXG * CNX + UYG * CNY UTG = UXG * CTX + UYG * CTY C C********** Si l'on fait pas de prediction, ce n'est pas necessaire de C controller la positivite' de la pression et de la densité; elle C est déjà garantie par la proprieté LED de limiteur; mais, vu C que le limiteur n'est pas calculé ici, mais dans un autre C operateur, on le fait C LOGI1 = (PG .LT. 0.0D0) .OR. (ROG .LT. 0.0D0) .OR. LOGI2 C IF(LOGI1)THEN C C************* Premier ordre en espace local C ROG = MPROC.VPOCHA(NLCEG,1) ROD = ROG PG = MPPC.VPOCHA(NLCEG,1) PD = PG UNG = MPVITC.VPOCHA(NLCEG,1)*CNX + & MPVITC.VPOCHA(NLCEG,2)*CNY UTG = MPVITC.VPOCHA(NLCEG,1)*CTX + & MPVITC.VPOCHA(NLCEG,2)*CTY UND = -1.0D0 * UNG UTD = UTG DO I1 = 1, NESP, 1 FRAMAS.FRAMG(I1) = MPYC.VPOCHA(NLCEG,I1) FRAMAS.FRAMD(I1) = FRAMAS.FRAMG(I1) ENDDO DO I1 = 1, NSCA, 1 SCALPA.FRAMG(I1) = MPSCAC.VPOCHA(NLCEG,I1) SCALPA.FRAMD(I1) = SCALPA.FRAMG(I1) ENDDO ELSE C C********** Son etat droite C ROD = ROG PD = PG UND = -1.0D0 * UNG UTD = UTG DO I1 = 1, NESP, 1 FRAMAS.FRAMD(I1) = FRAMAS.FRAMG(I1) ENDDO DO I1 = 1, NSCA, 1 SCALPA.FRAMD(I1) = SCALPA.FRAMG(I1) ENDDO ENDIF C C************* Fin cas mur C ELSE C C************* Etat gauche C VALCEL = MPROP.VPOCHA(NLCEG, 1) ALCEL = MELALR.VPOCHA(NLCEG, 1) DCEL = MPGRR.VPOCHA(NLCEG, 1)*DXG + & MPGRR.VPOCHA(NLCEG, 2)*DYG ROG = VALCEL + ALCEL * DCEL C VALCEL = MPPP.VPOCHA(NLCEG, 1) ALCEL = MELALP.VPOCHA(NLCEG, 1) DCEL = MPGRP.VPOCHA(NLCEG, 1)*DXG + & MPGRP.VPOCHA(NLCEG, 2)*DYG PG = VALCEL + ALCEL * DCEL C LOGI2 = .FALSE. SUMY = 0.0D0 DO I1 = 1, NESP, 1 INDCEL = 2 * I1 - 1 VALCEL = MPYP.VPOCHA(NLCEG,I1) ALCEL = MELALY.VPOCHA(NLCEG, I1) DCEL = MPGRY.VPOCHA(NLCEG, INDCEL)*DXG + & MPGRY.VPOCHA(NLCEG,INDCEL + 1 )*DYG ALCEL = VALCEL + ALCEL * DCEL SUMY = SUMY + ALCEL LOGI2 = LOGI2 .OR. (ALCEL .LT. 0.0D0) FRAMAS.FRAMG(I1) = ALCEL ENDDO LOGI2 = LOGI2 .OR. (SUMY .GT. 1.0D0) C DO I1 = 1, NSCA, 1 INDCEL = 2 * I1 - 1 VALCEL = MPSCAP.VPOCHA(NLCEG,I1) ALCEL = MELALS.VPOCHA(NLCEG, I1) DCEL = MPGRS.VPOCHA(NLCEG, INDCEL)*DXG + & MPGRS.VPOCHA(NLCEG,INDCEL + 1 )*DYG ALCEL = VALCEL + ALCEL * DCEL SCALPA.FRAMG(I1) = ALCEL ENDDO C VALCEL = MPVITP.VPOCHA(NLCEG, 1) ALCEL = MELALV.VPOCHA(NLCEG, 1) DCEL = MPGRV.VPOCHA(NLCEG, 1)*DXG + & MPGRV.VPOCHA(NLCEG, 2)*DYG UXG = VALCEL + ALCEL * DCEL C VALCEL = MPVITP.VPOCHA(NLCEG, 2) ALCEL = MELALV.VPOCHA(NLCEG, 2) DCEL = MPGRV.VPOCHA(NLCEG, 3)*DXG + & MPGRV.VPOCHA(NLCEG, 4)*DYG UYG = VALCEL + ALCEL * DCEL C UNG = UXG * CNX + UYG * CNY UTG = UXG * CTX + UYG * CTY C C********** Positivite C LOGI1 = (PG .LT. 0.0D0) .OR. (ROG .LT. 0.0D0) .OR. LOGI2 C IF(LOGI1)THEN C C************* Premier ordre en espace local C ROG = MPROC.VPOCHA(NLCEG,1) PG = MPPC.VPOCHA(NLCEG,1) UNG = MPVITC.VPOCHA(NLCEG,1)*CNX + & MPVITC.VPOCHA(NLCEG,2)*CNY UTG = MPVITC.VPOCHA(NLCEG,1)*CTX + & MPVITC.VPOCHA(NLCEG,2)*CTY DO I1 = 1, NESP, 1 FRAMAS.FRAMG(I1) = MPYC.VPOCHA(NLCEG,I1) ENDDO DO I1 = 1, NSCA, 1 SCALPA.FRAMG(I1) = MPSCAC.VPOCHA(NLCEG,I1) ENDDO ENDIF C C********** Etat droite C VALCEL = MPROP.VPOCHA(NLCED, 1) ALCEL = MELALR.VPOCHA(NLCED, 1) DCEL = MPGRR.VPOCHA(NLCED, 1)*DXD + & MPGRR.VPOCHA(NLCED, 2)*DYD ROD = VALCEL + ALCEL * DCEL C VALCEL = MPPP.VPOCHA(NLCED, 1) ALCEL = MELALP.VPOCHA(NLCED, 1) DCEL = MPGRP.VPOCHA(NLCED, 1)*DXD + & MPGRP.VPOCHA(NLCED, 2)*DYD PD = VALCEL + ALCEL * DCEL C LOGI2 = .FALSE. SUMY = 0.0D0 DO I1 = 1, NESP, 1 INDCEL = 2 * I1 - 1 VALCEL = MPYP.VPOCHA(NLCED,I1) ALCEL = MELALY.VPOCHA(NLCED, I1) DCEL = MPGRY.VPOCHA(NLCED, INDCEL)*DXD + & MPGRY.VPOCHA(NLCED,INDCEL + 1 )*DYD ALCEL = VALCEL + ALCEL * DCEL SUMY = SUMY + ALCEL LOGI2 = LOGI2 .OR. (ALCEL .LT. 0.0D0) FRAMAS.FRAMD(I1) = ALCEL ENDDO LOGI2 = LOGI2 .OR. (SUMY .GT. 1.0D0) C DO I1 = 1, NSCA, 1 INDCEL = 2 * I1 - 1 VALCEL = MPSCAP.VPOCHA(NLCED,I1) ALCEL = MELALS.VPOCHA(NLCED, I1) DCEL = MPGRS.VPOCHA(NLCED, INDCEL)*DXD + & MPGRS.VPOCHA(NLCED,INDCEL + 1 )*DYD ALCEL = VALCEL + ALCEL * DCEL SCALPA.FRAMD(I1) = ALCEL ENDDO C VALCEL = MPVITP.VPOCHA(NLCED, 1) ALCEL = MELALV.VPOCHA(NLCED, 1) DCEL = MPGRV.VPOCHA(NLCED, 1)*DXD + & MPGRV.VPOCHA(NLCED, 2)*DYD UXD = VALCEL + ALCEL * DCEL C VALCEL = MPVITP.VPOCHA(NLCED, 2) ALCEL = MELALV.VPOCHA(NLCED, 2) DCEL = MPGRV.VPOCHA(NLCED, 3)*DXD + & MPGRV.VPOCHA(NLCED, 4)*DYD UYD = VALCEL + ALCEL * DCEL C UND = UXD * CNX + UYD * CNY UTD = UXD * CTX + UYD * CTY C C********** Positivite C LOGI1 = (PD .LT. 0.0D0) .OR. (ROD .LT. 0.0D0) .OR. LOGI2 C IF(LOGI1)THEN C C************* Premier ordre en espace local C ROD = MPROC.VPOCHA(NLCED,1) PD = MPPC.VPOCHA(NLCED,1) UND = MPVITC.VPOCHA(NLCED,1)*CNX + & MPVITC.VPOCHA(NLCED,2)*CNY UTD = MPVITC.VPOCHA(NLCED,1)*CTX + & MPVITC.VPOCHA(NLCED,2)*CTY DO I1 = 1, NESP, 1 FRAMAS.FRAMD(I1) = MPYC.VPOCHA(NLCED,I1) ENDDO DO I1 = 1, NSCA, 1 SCALPA.FRAMD(I1) = MPSCAC.VPOCHA(NLCED,I1) ENDDO ENDIF ENDIF C C******** Les MELVALs C MELRO.VELCHE(1,NLCF) = ROG MELRO.VELCHE(3,NLCF) = ROD MELP.VELCHE(1,NLCF) = PG MELP.VELCHE(3,NLCF) = PD MELVUN.VELCHE(1,NLCF) = UNG MELVUN.VELCHE(3,NLCF) = UND MELVUT.VELCHE(1,NLCF) = UTG MELVUT.VELCHE(3,NLCF) = UTD MELVNX.VELCHE(1,NLCF) = CNX MELVNY.VELCHE(1,NLCF) = CNY MELT1X.VELCHE(1,NLCF) = CTX MELT1Y.VELCHE(1,NLCF) = CTY DO I1 = 1, NESP, 1 MELVA1 = MCHAMY.IELVAL(I1) MELVA1.VELCHE(1,NLCF) = FRAMAS.FRAMG(I1) MELVA1.VELCHE(3,NLCF) = FRAMAS.FRAMD(I1) ENDDO DO I1 = 1, NSCA, 1 MELVA1 = MCHAMS.IELVAL(I1) MELVA1.VELCHE(1,NLCF) = SCALPA.FRAMG(I1) MELVA1.VELCHE(3,NLCF) = SCALPA.FRAMD(I1) ENDDO ENDDO C C**** Desactivation des SEGMENTs C SEGDES IPT1 SEGDES IPT2 C C**** Le MPOVALs 'Prediction' sont detruits (si existentes) C IF(LOGTEM)THEN SEGSUP MPROP SEGSUP MPVITP SEGSUP MPPP IF(LYC) SEGSUP MPYP IF(LSCAC) SEGSUP MPSCAP SEGDES MPGAMC ENDIF C SEGDES MPROC SEGDES MPGRR SEGDES MELALR SEGDES MPVITC SEGDES MPGRV SEGDES MELALV SEGDES MPPC SEGDES MPGRP SEGDES MELALP IF(LYC)THEN SEGDES MPYC SEGDES MPGRY SEGDES MELALY DO I1 = 1, NESP, 1 MELVA1 = MCHAMY.IELVAL(I1) SEGDES MELVA1 ENDDO SEGDES MCHAMY SEGSUP FRAMAS ENDIF IF(LSCAC)THEN SEGDES MPSCAC SEGDES MPGRS SEGDES MELALS DO I1 = 1, NSCA, 1 MELVA1 = MCHAMS.IELVAL(I1) SEGDES MELVA1 ENDDO SEGDES MCHAMS SEGSUP SCALPA ENDIF SEGDES MPNORM C SEGDES MELRO SEGDES MELP SEGDES MELVUN SEGDES MELVUT SEGDES MELVNX SEGDES MELVNY SEGDES MELT1X SEGDES MELT1Y C C**** Destruction du MELNTI correspondance local/global C SEGSUP MLENT1 C 9999 CONTINUE C RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales