C DRVDP     SOURCE    CB215821  20/11/25    13:26:00     10792          
      SUBROUTINE DRVDP
C
C--------------------------------------------------------------------
C Densité de la vapeur d'eau en fonction de P et de T:
C dérivée partielle par rapport à la pression partielle de vapeur
C
C Dans le cas ou seule la pression est fournie, on considère que la
C pression P transmise est Psat et on calcule Tsat afin d'évaluer
C la dérivée partielle de la densité.
C--------------------------------------------------------------------
C Les données d'entrée sont des CHPOINT, des FLOTTANT ou des LISTREEL
C Le résultat est du meme type que les input.
C--------------------------------------------------------------------
C
C---------------------------
C Phrase d'appel (GIBIANE) :
C---------------------------
C
C OBJ3 = VARI 'DRVDP' OBJ1 (OBJ2) ;
C
C------------------------
C Opérandes et résultat :
C------------------------
C
C  OBJ1 : Pression partielle de vapeur (en Pa)
C  OBJ2 : Température (en K)
C  OBJ3 : Dérivée partielle de la densité de la vapeur d'eau
C         par rapport à la pression partielle de vapeur (en kg/m3/Pa)
C----------------------
C Variables principales
C----------------------
C
C ISAT  : Flag valant 0 si 2 arguments, 1 sinon (T=Tsat(P))
C
C-----------------------------------------------------------------------
      IMPLICIT INTEGER(I-N)
      IMPLICIT REAL*8 (A-H,O-Z)
      CHARACTER*8 TYPE
      CHARACTER*4 NOMTOT(1)
C
-INC SMCHPOI
-INC SMLREEL
C
      IFLAG = 0
      ISAT  = 0
C
C- Lecture et controles des données d'entrée,
C- Création de la structure chapeau pour la donnée de sortie
C
C- Gestion des ERREURS
C  21 -> Données incompatibles
C  19 -> Option indisponible
C
C CHPOINT
C
      TYPE  = 'CHPOINT '
      CALL LIROBJ(TYPE,MCHPO1,0,IRETOU)
      IF (IRETOU.EQ.0) GOTO 10
      CALL LIROBJ(TYPE,MCHPO2,0,IRETOU)
      IF (IRETOU.EQ.0) ISAT=1
C
      IF (ISAT.EQ.0) THEN
         SEGACT MCHPO1,MCHPO2
         NSOUP1 = MCHPO1.IPCHP(/1)
         NSOUP2 = MCHPO2.IPCHP(/1)
         MSOUP1 = MCHPO1.IPCHP(1)
         MSOUP2 = MCHPO2.IPCHP(1)
         SEGACT MSOUP1,MSOUP2
         NC1    = MSOUP1.NOHARM(/1)
         NC2    = MSOUP2.NOHARM(/1)
         IGEO1  = MSOUP1.IGEOC
         INDIC  =  1
         NBCOMP = -1
         CALL QUEPOI(MCHPO2,IGEO1,INDIC,NBCOMP,NOMTOT)
         SEGACT MCHPO2,MSOUP2
         MPOVA1 = MSOUP1.IPOVAL
         MPOVA2 = MSOUP2.IPOVAL
         SEGACT MPOVA1,MPOVA2
         IF (NSOUP1.NE.NSOUP2) IFLAG=1
         IF (NC1.NE.NC2) IFLAG=3
         IF (NC1.NE.1)   IFLAG=4
         IF (INDIC.LT.0) IFLAG=5
         IF (IFLAG.NE.0) THEN
            CALL ERREUR(21)
            RETURN
         ENDIF
         SEGINI, MCHPO3=MCHPO1
         SEGINI, MSOUP3=MSOUP1
         SEGINI, MPOVA3=MPOVA1
         MCHPO3.IPCHP(1) = MSOUP3
         MSOUP3.IPOVAL = MPOVA3
         SEGDES MCHPO1,MCHPO2,MCHPO3,MSOUP1,MSOUP2,MSOUP3
         CALL DRVDP1(MPOVA1,MPOVA2,MPOVA3,ISAT)
         SEGDES MPOVA1,MPOVA2,MPOVA3
      ELSE
         SEGACT MCHPO1
         NSOUP1 = MCHPO1.IPCHP(/1)
         MSOUP1 = MCHPO1.IPCHP(1)
         SEGACT MSOUP1
         NC1    = MSOUP1.NOHARM(/1)
         MPOVA1 = MSOUP1.IPOVAL
         SEGACT MPOVA1
         IF (NSOUP1.NE.1) IFLAG=2
         IF (NC1.NE.1) IFLAG=4
         IF (IFLAG.NE.0) THEN
            CALL ERREUR(21)
            RETURN
         ENDIF
         SEGINI, MCHPO3=MCHPO1
         SEGINI, MSOUP3=MSOUP1
         SEGINI, MPOVA3=MPOVA1
         MCHPO3.IPCHP(1) = MSOUP3
         MSOUP3.IPOVAL = MPOVA3
         SEGDES MCHPO1,MCHPO3,MSOUP1,MSOUP3
         MPOVA2 = -1
         CALL DRVDP1(MPOVA1,MPOVA2,MPOVA3,ISAT)
         SEGDES MPOVA1,MPOVA3
      ENDIF
      CALL ECROBJ(TYPE,MCHPO3)
      RETURN
C
C FLOTTANT
C
 10   CONTINUE
      CALL LIRREE(X1,0,IRETOU)
      IF (IRETOU.EQ.0) GOTO 20
      CALL LIRREE(X2,0,IRETOU)
      IF (IRETOU.EQ.0) X2=TSATP0(X1)
      X3 = DRVDP0(X1,X2)
      CALL ECRREE(X3)
      RETURN
C
C LISTREEL
C
 20   CONTINUE
      TYPE  = 'LISTREEL'
      CALL LIROBJ(TYPE,MLREE1,0,IRETOU)
      IF (IRETOU.EQ.0) GOTO 30
      CALL LIROBJ(TYPE,MLREE2,0,IRETOU)
      IF (IRETOU.EQ.0) ISAT=1
      IF (ISAT.EQ.0) THEN
         SEGACT MLREE1,MLREE2
         JG1 = MLREE1.PROG(/1)
         JG2 = MLREE2.PROG(/1)
         IF (JG1.NE.JG2) IFLAG=1
         IF (IFLAG.NE.0) THEN
            CALL ERREUR(21)
            RETURN
         ENDIF
         SEGINI, MLREE3=MLREE1
         CALL DRVDP3(MLREE1,MLREE2,MLREE3,ISAT)
         SEGDES MLREE1,MLREE2,MLREE3
      ELSE
         SEGACT MLREE1
         SEGINI, MLREE3=MLREE1
         MLREE2 = -1
         CALL DRVDP3(MLREE1,MLREE2,MLREE3,ISAT)
         SEGDES MLREE1,MLREE3
      ENDIF
      CALL ECROBJ(TYPE,MLREE3)
      RETURN
C
C Autres
C
 30   CONTINUE
      CALL ERREUR(19)
      RETURN
      END



 
