pridem
C PRIDEM SOURCE CB215821 20/11/25 13:36:45 10792
C************************************************************************
C
C PROJET : CASTEM 2000
C
C NOM : PRIDEM
C
C DESCRIPTION : Voir PRIMIT
C
C RDEM approach for combustion.
C Computation of the primitive variables.
C
C LANGAGE : FORTRAN 77 + ESOPE 2000 (avec extensions CISI)
C
C AUTEUR : A. BECCANTINI, DEN/DM2S/SFME/LTMF
C
C************************************************************************
C
C
C APPELES (Calcul) : PRIDE1
C
C
C************************************************************************
C
C
C CALL (GIBIANE) :
C
C RCHV1 RCHV2 RCHP1 RCHP2 RCHT1 RCHT2 = 'PRIM' 'DEM' TABPGAS
C CHPAL1 CHPAL2 CHPARN1 CHPARN2 CHPAGN1 CHPAGN2
C CHPARET1 CHPARET2 CHPTGUE1 CHPTGUE2 EPS ;
C
C
C ENTREES :
C
C
C TABPGAS : TABLE which contains
C * 'SPECIES'
C * 'CHEM_COEF'
C * 'MASSFRA' initial and final mass fraction of
C the first appearing in 'SPECIES',
C final mass fractions of the species with
C positive coefficients in 'CHEM_COEF',
C initial mass fractions for the species with
C negative coefficients in 'CHEM_COEF'
C * 'RUNIV' = universal gas constant,
C * ESPi = table containing the properties of
C the species ESPi
C * 'TMAX' maximum temperature for cv expansion;
C for T>'TMAX', cv(T)=cv('TMAX')
C * ESPI . 'A'
C CV_i = \sum_{j=0,k} A_{i,j} T^j
C * ESPI . 'W' (Kg/mole)
C * ESPI . 'H0K'
C e_{0,i} = h_{0,i} = h_{T_0,i} - {R_i * T_0 +
C {\sum_{j=0,k} A_{i,j} / (j+1) T_0^(j+1)}};
C
C CHPAL1 : CHPOINT which contains the volume fraction alpha_1
C of 1 (one component, 'SCAL').
C
C CHPAL2 : CHPOINT which contains the volume fraction alpha_2
C of 2 (one component, 'SCAL').
C
C CHPARN1 : CHPOINT which contains the alpha_1 * density of 1
C (one component, 'SCAL').
C
C CHPARN2 : CHPOINT which contains the alpha_2 * density of 2
C (one component, 'SCAL').
C
C CHPAGN1 : CHPOINT which contains the alpha_1 * momentom of 1
C (one component, 'SCAL').
C
C CHPAGN2 : CHPOINT which contains the alpha_2 * momentom of 2
C (one component, 'SCAL').
C
C CHPARET1: CHPOINT which contains the alpha_1 * total energy
C of 1 (one component, 'SCAL').
C
C CHPARET2: CHPOINT which contains the alpha_2 * total energy
C of 2 (one component, 'SCAL').
C
C CHPTGUE1: CHPOINT which contains the guess value
C for the temperature of 1 (one component, 'SCAL').
C
C CHPTGUE2: CHPOINT which contains the guess value
C for the temperature of 2 (one component, 'SCAL').
C
C K0 : FLOTTANT which contains the fundamental flame
C speed
C
C EPS : FLOTTANT such that if ALPHA_i < EPS, we can say
C that species i does not exists
C
C
C SORTIES :
C
C RCHV1 : CHPOINT which contains the speed of 1
C
C RCHV2 : CHPOINT which contains the speed of 2
C
C RCHP1 : CHPOINT which contains the pressure of 1
C
C RCHP2 : CHPOINT which contains the pressure of 2
C
C RCHT1 : CHPOINT which contains the temperature of 1
C
C RCHT2 : CHPOINT which contains the temperature of 2
C
C
C************************************************************************
C
C HISTORIQUE : Crée le 06.09.09.
C
C************************************************************************
C
C
C**** Les variables
C
IMPLICIT INTEGER(I-N)
& , NESP, NESP1, ICEN, IALP1, IALP2
& , IARN1, IARN2
& , IAGN1, IAGN2, IARET1, IARET2, ITG1, ITG2
& , IPGAS, IESP
& , IVN1, IVN2, IPN1, IPN2, IRN1, IRN2, ITN1, ITN2
& , I1, I2, JGM, JGN, NORD, NORDP1, NORD1
REAL*8 VALER(2),VAL1,VAL2, TMAX, RUNIV, EPS
CHARACTER*(40) MESERR(2),MESCEL
CHARACTER*(8) TYPE
CHARACTER*(4) MOT1(1)
LOGICAL LOGNEG, LOGBOR, LOGAN, LOGNC, LOGIPG
C
C**** Variables en ACCTAB
C
INTEGER IVALI, IRETI,IVALR, IRETR
REAL*8 XVALI, XVALR
LOGICAL LOGII, LOGIR
CHARACTER*(8) CHARR,MTYPI
C
C**** Segment des proprietes du gaz
C
SEGMENT PROPHY
REAL*8 ACV(NORD+1,NESP), W(NESP), H0K(NESP)
ENDSEGMENT
C
C**** Les Includes
C
-INC PPARAM
-INC CCOPTIO
-INC SMCHPOI
-INC SMLMOTS
-INC SMLREEL
POINTEUR MLMOSC.MLMOTS, MLMESP.MLMOTS
POINTEUR MLRMFR.MLREEL, MLRCHE.MLREEL
C
C**** Initialisation des parametres d'erreur
C
LOGAN = .FALSE.
LOGNEG = .FALSE.
LOGBOR = .FALSE.
LOGNC = .FALSE.
LOGIPG = .FALSE.
MESCEL = ' '
MESERR(1) = MESCEL
MESERR(2) = MESCEL
MOTERR(1:40) = MESCEL(1:40)
VALER(1) = 0.0D0
VALER(2) = 0.0D0
VAL1 = 0.0D0
VAL2 = 0.0D0
C
C**** Initialisation des variables en ACCTAB
C
IVALI = 0
IVALR = 0
XVALI = 0.0D0
XVALR = 0.0D0
LOGII = .FALSE.
LOGIR = .FALSE.
IRETI = 0
IRETR = 0
CHARR = ' '
C
C**** Initialisation des MOT1(1) (noms des composantes)
C
MOT1(1) = ' '
C
C**** N.B. On veut lire les objets sequentiellement.
C Donc on utilise QUETYP pour controler que
C le type de l'objet soit le bon.
C
C**** Lecture de la table des proprietes du gaz
C
ICOND = 1
IF(IERR .NE. 0)GOTO 9999
IF(TYPE .NE. 'TABLE ')THEN
C
C******* Message d'erreur standard
C 37 2
C On ne trouve pas d'objet de type %m1:8
C
MOTERR(1:8) = 'TABLE '
GOTO 9999
ELSE
ICOND = 1
IF(IERR .NE. 0)GOTO 9999
ENDIF
C
C**** Ordre des polynoms pour les cv_i
C
MTYPI = 'MOT '
TYPE = ' '
& TYPE,NORD,XVALR,CHARR,LOGIR,IESP)
IF(TYPE .NE. 'ENTIER ')THEN
C
C******* Message d'erreur standard
C -301 0 %m1:40
C
MOTERR(1:40) = 'TAB1 . NORD = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
C
C******* Message d'erreur standard
C 21 2
C Données incompatibles
C
GOTO 9999
ENDIF
NORDP1 = NORD + 1
C
C**** 'TMAX'
C
MTYPI = 'MOT '
TYPE = ' '
& TYPE,IVALR,XVALR,CHARR,LOGIR,IESP)
IF(TYPE .NE. 'FLOTTANT')THEN
C
C******* Message d'erreur standard
C -301 0 %m1:40
C
MOTERR(1:40) = 'TAB1 . TMAX = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
C
C******* Message d'erreur standard
C 21 2
C Données incompatibles
C
GOTO 9999
ENDIF
TMAX = XVALR
C
C**** 'RUNIV'
C
MTYPI = 'MOT '
TYPE = ' '
& TYPE,IVALR,XVALR,CHARR,LOGIR,IESP)
IF(TYPE .NE. 'FLOTTANT')THEN
C
C******* Message d'erreur standard
C -301 0 %m1:40
C
MOTERR(1:40) = 'TAB1 . RUNIV = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
C
C******* Message d'erreur standard
C 21 2
C Données incompatibles
C
GOTO 9999
ENDIF
RUNIV = XVALR
C
C**** Les especes
C
TYPE = ' '
IF(TYPE .NE. 'LISTMOTS')THEN
C
C******* Message d'erreur standard
C -301 0 %m1:40
C
MOTERR(1:40) = 'TAB1 . SPECIES = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
C
C******* Message d'erreur standard
C 21 2
C Données incompatibles
C
GOTO 9999
ELSE
SEGACT MLMESP
SEGDES MLMESP
ENDIF
C
C**** 'MASSFRA'
C
TYPE = ' '
IF(TYPE .NE. 'LISTREEL')THEN
C
C******* Message d'erreur standard
C -301 0 %m1:40
C
MOTERR(1:40) = 'TAB1 . MASSFRA = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
C
C******* Message d'erreur standard
C 21 2
C Données incompatibles
C
GOTO 9999
ELSE
SEGACT MLRMFR
IF (NESP1 .NE. NESP) THEN
MOTERR(1:40) = 'TAB1 . MASSFRA = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
MOTERR(1:40) = 'TAB1 . SPECIES = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
C
C******* Message d'erreur standard
C 21 2
C Données incompatibles
C
GOTO 9999
ENDIF
SEGDES MLRMFR
ENDIF
C
C**** 'CHEMCOEF'
C
TYPE = ' '
IF(TYPE .NE. 'LISTREEL')THEN
C
C******* Message d'erreur standard
C -301 0 %m1:40
C
write(*,*) TYPE
MOTERR(1:40) = 'TAB1 . CHEMCOEF = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
C
C******* Message d'erreur standard
C 21 2
C Données incompatibles
C
GOTO 9999
ELSE
SEGACT MLRCHE
IF (NESP1 .NE. NESP) THEN
MOTERR(1:40) = 'TAB1 . CHEMCOEF = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
MOTERR(1:40) = 'TAB1 . SPECIES = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
C
C******* Message d'erreur standard
C 21 2
C Données incompatibles
C
GOTO 9999
ENDIF
SEGDES MLRCHE
ENDIF
C
C**** On rempli les segment PROPHY
C Ordre: IPGAS . 'SPECIES'
C
SEGINI PROPHY
SEGACT MLMESP
C
C**** N.B. MOT1 est un CHARACTER*(4)
C
DO I1 = 1, NESP
C
C******* CALL ACMF(...) ne marche pas parce que on a
C des blanches dans nos composantes
C
MTYPI = 'MOT '
TYPE = ' '
& TYPE,IVALR,XVALR,CHARR,LOGIR,IESP)
C
C******* En IESP a la table IPGAS.MOT1(1)
C
IF((IERR .NE. 0) .OR. (TYPE .NE. 'TABLE ')) THEN
C
C********** Message d'erreur standard
C -301 0 %m1:40
C
MOTERR = ' '
MOTERR(1:7) = 'TAB1 . '
MOTERR(8:11) = MOT1(1)
MOTERR(13:17) = '= ???'
WRITE(IOIMP,*) MOTERR(1:40)
C
C********** Message d'erreur standard
C 21 2
C Données incompatibles
C
GOTO 9999
ENDIF
C
C******* W
C
MTYPI = 'MOT '
TYPE = ' '
& TYPE,IVALR, XVALR ,CHARR,LOGIR,IRETR)
IF((IERR .NE. 0) .OR. (TYPE .NE. 'FLOTTANT')) THEN
C
C********** Message d'erreur standard
C -301 0 %m1:40
C
MOTERR = ' '
MOTERR(1:7) = 'TAB1 . '
MOTERR(8:11) = MOT1(1)
MOTERR(13:23) = ' . W = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
C
C********** Message d'erreur standard
C 21 2
C Données incompatibles
C
GOTO 9999
ENDIF
PROPHY.W(I1)=XVALR
C
C******* H0K
C
MTYPI = 'MOT '
TYPE = ' '
& TYPE,IVALR, XVALR ,CHARR,LOGIR,IRETR)
IF((IERR .NE. 0) .OR. (TYPE .NE. 'FLOTTANT')) THEN
C
C********** Message d'erreur standard
C -301 0 %m1:40
C
MOTERR = ' '
MOTERR(1:7) = 'TAB1 . '
MOTERR(8:11) = MOT1(1)
MOTERR(13:25) = ' . H0K = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
C
C********** Message d'erreur standard
C 21 2
C Données incompatibles
C
GOTO 9999
ENDIF
PROPHY.H0K(I1)=XVALR
C
C******* A
C
MTYPI = 'MOT '
TYPE = ' '
& TYPE,IVALR, XVALR ,CHARR,LOGIR,IRETR)
IF((IERR .NE. 0) .OR. (TYPE .NE. 'LISTREEL')) THEN
C
C********** Message d'erreur standard
C -301 0 %m1:40
C
MOTERR = ' '
MOTERR(1:7) = 'TAB1 . '
MOTERR(8:11) = MOT1(1)
MOTERR(13:23) = ' . A = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
C
C********** Message d'erreur standard
C 21 2
C Données incompatibles
C
GOTO 9999
ENDIF
MLREEL = IRETR
SEGACT MLREEL
IF(NORD1 .NE. NORDP1)THEN
C
C********** Message d'erreur standard
C -301 0 %m1:40
C
MOTERR = ' '
MOTERR(1:10) = 'DIME(TAB1.'
MOTERR(11:14) = MOT1(1)
MOTERR(15:37) = '.A) != (TAB1.NORD) + 1'
WRITE(IOIMP,*) MOTERR(1:40)
C
C********** Message d'erreur standard
C 21 2
C Données incompatibles
C
GOTO 9999
ENDIF
C
C******* Dans le calcul, c'est plus utile ACV dans la forme
C ACV(exponente,espece)
C
ENDDO
SEGDES MLREEL
ENDDO
SEGDES MLMESP
C
C**** La table IPGAS donc a ete controllee et PROPHY est rempli
C
C
C**** Lecture du CHPOINT ALPHA1
C
TYPE='CHPOINT '
ICOND = 1
IF(IERR .NE. 0)GOTO 9999
C
C**** On cherche le pointeur de son maillage et on l'impose sur les
C autres CHPOINTs
C
MCHPOI = IALP1
SEGACT MCHPOI
MSOUPO = MCHPOI.IPCHP(1)
SEGACT MSOUPO
ICEN = MSOUPO.IGEOC
SEGDES MSOUPO
SEGDES MCHPOI
C
C**** Control du CHPOINT: QUEPOI
C
C INDIC = 1 -> on impose le pointeur du support geometrique (ICEN)
C N.B. Le CHPOINT peut changer de structure pour
C avoir SPG = ICEN!!!!
C INDIC = 0 -> on ne fait que verifier le support geometrique
C (ICEN). Si le SPG sont differents INDIC = -4 en sortie
C
C NBCOMP > 0 -> numero des composantes
C
C MOT1(1) = ' ' obligatoire s'on connais pas les noms des composantes
C
MOT1(1) = 'SCAL'
IF(IERR .NE. 0)THEN
C
C******** Message d'erreur standard
C -301 0 %m1:40
C
MOTERR = 'IALP1 = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
GOTO 9999
ENDIF
C
C**** Lecture du CHPOINT ALPHA2
C
TYPE='CHPOINT '
ICOND = 1
C
C**** Control du CHPOINT: QUEPOI
C
MOT1(1) = 'SCAL'
IF(IERR .NE. 0)THEN
C
C******** Message d'erreur standard
C -301 0 %m1:40
C
MOTERR = 'IALP2 = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
GOTO 9999
ENDIF
C
C**** Lecture du CHPOINT IARN1
C
ICOND = 1
TYPE='CHPOINT '
C
C**** Control du CHPOINT: QUEPOI
C
MOT1(1) = 'SCAL'
IF(IERR .NE. 0)THEN
C
C******** Message d'erreur standard
C -301 0 %m1:40
C
MOTERR = 'IARN1 = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
GOTO 9999
ENDIF
C
C**** Lecture du CHPOINT IARN2
C
ICOND = 1
TYPE='CHPOINT '
IF(IERR .NE. 0)GOTO 9999
C
C**** Control du CHPOINT: QUEPOI
C
MOT1(1) = 'SCAL'
IF(IERR .NE. 0)THEN
C
C******** Message d'erreur standard
C -301 0 %m1:40
C
MOTERR = 'IARN2 = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
GOTO 9999
ENDIF
C
C**** Lecture du CHPOINT IAGN1 ( debits)
C
TYPE='CHPOINT '
ICOND = 1
IF(IERR .NE. 0)GOTO 9999
C
C**** Control du CHPOINT
C
JGN = 4
JGM = IDIM
SEGINI MLMOTS
C
C**** On controlle l'ordre de composantes de IAGN1
C
IF(IERR .NE. 0)THEN
C
C******** Message d'erreur standard
C -301 0 %m1:40
C
MOTERR = 'IAGN1 = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
GOTO 9999
ENDIF
C
C**** Lecture du CHPOINT IAGN2 ( debits)
C
ICOND = 1
TYPE='CHPOINT '
IF(IERR .NE. 0)GOTO 9999
C
C**** Control du CHPOINT
C
JGN = 4
JGM = IDIM
SEGINI MLMOTS
C
C**** On controlle l'ordre de composantes de IAGN2
C
IF(IERR .NE. 0)THEN
C
C******** Message d'erreur standard
C -301 0 %m1:40
C
MOTERR = 'IAGN2 = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
GOTO 9999
ENDIF
C
C**** Lecture du CHPOINT IARET1
C
ICOND = 1
TYPE='CHPOINT '
IF(IERR .NE. 0)GOTO 9999
C
C**** Control du CHPOINT: QUEPOI
C
MOT1(1) = 'SCAL'
IF(IERR .NE. 0)THEN
C
C******** Message d'erreur standard
C -301 0 %m1:40
C
MOTERR = 'IARET1 = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
GOTO 9999
ENDIF
C
C**** Lecture du CHPOINT IARET2
C
ICOND = 1
TYPE='CHPOINT '
IF(IERR .NE. 0)GOTO 9999
C
C**** Control du CHPOINT: QUEPOI
C
MOT1(1) = 'SCAL'
IF(IERR .NE. 0)THEN
C
C******** Message d'erreur standard
C -301 0 %m1:40
C
MOTERR = 'IARET2 = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
GOTO 9999
ENDIF
C
C**** Lecture du CHPOINT Tguess ITG1
C
ICOND = 1
TYPE = 'CHPOINT '
IF(IERR .NE. 0)GOTO 9999
C
C****** Control du CHPOINT
C
MOT1(1) = 'SCAL'
IF(IERR .NE. 0)THEN
C
C******* Message d'erreur standard
C -301 0 %m1:40
C
MOTERR = 'ITG1 = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
GOTO 9999
ENDIF
C
C**** Lecture du CHPOINT Tguess ITG2
C
ICOND = 1
TYPE='CHPOINT '
IF(IERR .NE. 0)GOTO 9999
C
C**** Control du CHPOINT: QUEPOI
C
MOT1(1) = 'SCAL'
IF(IERR .NE. 0)THEN
C
C******** Message d'erreur standard
C -301 0 %m1:40
C
MOTERR = 'ITG2 = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
GOTO 9999
ENDIF
C
ICOND = 1
IF(IERR .NE. 0)GOTO 9999
C
C**** Creation of the CHAMPOIN for the results
C
TYPE = 'CHPOINT '
SEGSUP MLMOTS
JGN = 4
JGM = 1
SEGINI MLMOTS
SEGSUP MLMOTS
C
C**** Computation of the primitive variables
C
& MLRCHE,MLRMFR,
& ICEN,IALP1,IALP2,IARN1,IARN2,IAGN1,IAGN2,IARET1,IARET2,
& ITG1,ITG2,IRN1,IRN2,
& IVN1,IVN2,IPN1,IPN2,ITN1,ITN2,
& EPS,
& LOGAN,LOGIPG,LOGNEG,LOGBOR,LOGNC,
& VALER,VAL1,VAL2)
C
IF(IERR .NE. 0)THEN
WRITE(IOIMP,*) 'subroutine pride1'
GOTO 9999
ENDIF
CCCC
CCCC**** Calcul des sorties.
CCCC
CCCC Jusque a la NESP = nombre d'especes qui apparessent
CCCC dans les equations d'Euler
CCCC
CCCC Maintenant NESP = nombre total d'espece
CCCC
CCC NESP = NESP + 1
CCC CALL PRIMI2(NESP,NORDP1,NSCA,PROPHY,
CCC & ICEN,IRO,IROVIT,IROET,IROY,IROSCA,LOGTEM,IT,
CCC & IVIT,IPRES,ITEMP,IY,ISCA,IGAM,
CCC & LOGAN,LOGNEG,LOGBOR,LOGIPG,LOGNC,MESERR,
CCC & VALER,VAL1,VAL2)
CCCC
IF(LOGAN)THEN
C
C******* Message d'erreur standard
C 5 3
C Erreur anormale.contactez votre support
C
GOTO 9999
ELSE
IF(LOGIPG)THEN
C
C********** CV(T) < 0
C
C
C********** Message d'erreur standard
C -301 0 %m1:40
C
MOTERR(1:40) = 'cv(T) < 0 ? R < 0 ? '
WRITE(IOIMP,*) MOTERR(1:40)
MOTERR(1:40) = 'TAB1 = ??? '
WRITE(IOIMP,*) MOTERR(1:40)
C
C********** Message d'erreur standard
C 21 2
C Données incompatibles
C
C IF(LOGTRI)THEN
C IERR = 0
C ELSE
GOTO 9999
C ENDIF
ENDIF
IF(LOGNC)THEN
C
C********** Newton - Raphson ne converge pas !!!
C
C
C********** Message d'erreur standard
C -301 0 %m1:40
C
MOTERR(1:40) = 'Newton - Raphson '
WRITE(IOIMP,*) MOTERR(1:40)
C
C********** Message d'erreur standard
C 460 2
C Pas de convergence dans les itérations internes
C
GOTO 9999
ENDIF
IF(LOGNEG)THEN
C
C******* Pression (energie thermique) ou densité negative
C
C
C******* Message d'erreur standard
C 41 2
C %m1:8 = %r1 inférieur à %r2
C
MESCEL = MESERR(1)
MOTERR(1:8) = MESCEL(1:8)
REAERR(1) = REAL(VALER(1))
REAERR(2) = 0.0
GOTO 9999
ENDIF
IF(LOGBOR)THEN
C
C ou Y !\in YMIN,YMAX
C
C******* Message d'erreur standard
C 42 2
C %m1:8 = %r1 non compris entre %r2 et %r3
C
MESCEL = MESERR(2)
MOTERR(1:8) = MESCEL(1:8)
REAERR(1) = REAL(VALER(2))
REAERR(2) = REAL(VAL1)
REAERR(3) = REAL(VAL2)
C We artificially change the value of IERR in order to
C continue the computation
IERR = 0
GOTO 9999
ENDIF
ENDIF
C
C*****Ecriture du CHPOINT contenant les "gamma".
C
9999 CONTINUE
C
RETURN
END
					© Cast3M 2003 - Tous droits réservés.
					Mentions légales