Example #1
0
 def readStatefromJSON(self, state):
     """Load instance parameter from saved file"""
     self.L = unidades.Length(state["L"])
     self.rho = unidades.Density(state["rho"])
     self.mu = unidades.Viscosity(state["mu"])
     self.material = state["material"]
     self.Dn = state["Dn"]
     self.rugosidad = unidades.Length(state["rugosidad"])
     self.De = unidades.Length(state["De"])
     self.w = unidades.Length(state["w"])
     self.Di = unidades.Length(state["Di"])
     self.eD = unidades.Dimensionless(state["eD"])
     self.seccion = unidades.Area(state["seccion"])
     self.A = unidades.Area(state["A"])
     self.V = unidades.Speed(state["V"])
     self.Re = unidades.Dimensionless(state["Re"])
     self.K = unidades.Dimensionless(state["K"])
     self.DeltaP_h = unidades.DeltaP(state["DeltaP_h"])
     self.DeltaP_ac = unidades.DeltaP(state["DeltaP_ac"])
     self.f = unidades.Dimensionless(state["f"])
     self.DeltaP_f = unidades.DeltaP(state["DeltaP_f"])
     self.DeltaP_v = unidades.DeltaP(state["DeltaP_v"])
     self.DeltaP = unidades.DeltaP(state["DeltaP"])
     self.DeltaP_100ft = unidades.Dimensionless(state["DeltaP_100ft"])
     self.Tout = unidades.Temperature(state["Tout"])
     self.Heat = unidades.Power(state["Heat"])
     self.Pin = unidades.Pressure(state["Pin"])
     self.Pout = unidades.Pressure(state["Pout"])
     self.statusCoste = state["statusCoste"]
     if self.statusCoste:
         self.C_adq = unidades.Currency(state["C_adq"])
         self.C_inst = unidades.Currency(state["C_inst"])
     self.salida = [None]
Example #2
0
    def coste(self, *args, **kwargs):
        """
        tipo:
            0   -   Cone crusher
            1   -   Gyratory crusher
            2   -   Jaw crusher
            3   -   Hammer mill
            4   -   Ball mill
            5   -   Pulverizer
        """
        self._indicesCoste(*args)
        self.tipo = kwargs.get("tipo", 0)
        W = self.entrada.caudal.Tonh

        if self.tipo == 0:
            C = 1.55 * W**1.05 * 1000
        elif self.tipo == 1:
            C = 8. * W**0.6 * 1000
        elif self.tipo == 2:
            C = 6.3 * W**0.57 * 1000
        elif self.tipo == 3:
            C = 2.44 * W**0.78 * 1000
        elif self.tipo == 4:
            C = 50 * W**0.69 * 1000
        else:
            C = 22.6 * W**0.39 * 1000

        self.C_adq = unidades.Currency(C*self.Current_index/self.Base_index)
        self.C_inst = unidades.Currency(self.C_adq*self.f_install)
Example #3
0
    def readStatefromJSON(self, state):
        """Load instance parameter from saved file"""
        self.Tout = unidades.Temperature(state["Tout"])
        self.Pout = unidades.Pressure(state["Pout"])
        self.VaporMolarFlow = unidades.MassFlow(state["VaporMolarFlow"])
        self.VaporVolFlow = unidades.VolFlow(state["VaporVolFlow"])
        self.VaporMolarComposition = [
            unidades.MolarFlow(p) for p in state["VaporMolarComposition"]
        ]
        self.VaporMassComposition = [
            unidades.MassFlow(p) for p in state["VaporMassComposition"]
        ]
        self.LiquidMolarFlow = unidades.MolarFlow(state["LiquidMolarFlow"])
        self.LiquidVolFlow = unidades.VolFlow(state["LiquidVolFlow"])
        self.LiquidMolarComposition = [
            unidades.MolarFlow(p) for p in state["LiquidMolarComposition"]
        ]
        self.LiquidMassComposition = [
            unidades.MassFlow(p) for p in state["LiquidMassComposition"]
        ]

        self.statusCoste = state["statusCoste"]
        if self.statusCoste:
            self.C_adq = unidades.Currency(state["C_adq"])
            self.C_inst = unidades.Currency(state["C_inst"])
        self.salida = [None]
Example #4
0
    def coste(self):
        """
        Coste solo disponible para las tuberías de acero
        Ref Darby pag 217

        kwargs:
            schedule: Clase de acero
        """
        CI = self.kwargs["Current_index"]
        BI = self.kwargs["Base_index"]
        codigo = str(self.kwargs["material"][1])
        if codigo in ('Sch.  40', 'Sch.  5S'):
            a = 30.
            p = 1.31
        elif codigo in ('Sch.  80', 'Sch.  10S'):
            a = 38.1
            p = 1.35
        elif codigo in ('Sch.  160', 'Sch.  40S'):
            a = 55.3
            p = 1.39
        else:
            a = 0
            p = 1

        self.C_adq = unidades.Currency(a*self.Di.ft**p*self.L*CI/BI)
        self.C_inst = unidades.Currency(self.C_adq*self.kwargs["f_install"])
Example #5
0
    def coste(self, *args):
        self._indicesCoste(*args)

        C = 3.1 * self.area.ft2**0.59 * 1000
        self.C_adq = unidades.Currency(C * self.Current_index /
                                       self.Base_index)
        self.C_inst = unidades.Currency(self.C_adq * self.f_install)
Example #6
0
    def isCalculable(self):
        if self.kwargs["f_install"] and self.kwargs[
                "Base_index"] and self.kwargs["Current_index"] and self.kwargs[
                    "material"] and self.kwargs["material"][0] in [
                        'Stainless Steel (ANSI)', 'Steel Galvanised (ANSI)',
                        'Steel (ANSI)'
                    ]:
            self.statusCoste = True
        else:
            self.statusCoste = False
            self.C_adq = unidades.Currency(None)
            self.C_inst = unidades.Currency(None)

        if not self.kwargs["entrada"]:
            self.msg = QApplication.translate("pychemqt", "undefined input")
            self.status = 0
            return
        if not self.kwargs["l"]:
            self.msg = QApplication.translate("pychemqt",
                                              "undefined pipe length")
            self.status = 0
            return
        if not self.kwargs["material"]:
            self.msg = QApplication.translate("pychemqt", "undefined material")
            self.status = 0
            return

        if self.kwargs["thermal"] == 1 and not self.kwargs["Q"]:
            self.msg = QApplication.translate("pychemqt",
                                              "undefined heat flux")
            self.status = 0
            return
        elif self.kwargs["thermal"] == 2 and (not self.kwargs["T_ext"]
                                              or not self.kwargs["U"]):
            self.msg = QApplication.translate(
                "pychemqt", "undefined heat transfer conditions")
            self.status = 0
            return

        if self.kwargs["metodo"] == 1 and not self.kwargs["C"]:
            self.msg = QApplication.translate("pychemqt",
                                              "undefined C William Factor")
            self.status = 0
            return

        self.msg = ""
        self.status = 1
        return True
Example #7
0
    def coste(self):
        CI = self.kwargs["Current_index"]
        BI = self.kwargs["Base_index"]

        if self.kwargs["densidad"]:
            self.densidad = unidades.Density(self.kwargs["densidad"])
        else:
            # Use density of Stainless Steel 304
            self.densidad = unidades.Density(501, "lbft3")
        self.Di = unidades.Length(self.kwargs["diametro"])
        self.L = unidades.Length(self.kwargs["longitud"])
        self.espesor = unidades.Length(self.kwargs["espesor"])
        if self.kwargs["espesor_cabeza"]:
            self.espesor_cabeza = unidades.Length(
                self.kwargs["espesor_cabeza"])
        else:
            self.espesor_cabeza = self.espesor
        self.reborde = unidades.Length(self.kwargs["reborde"])
        self.De = unidades.Length(self.Di + 2 * self.espesor)

        self.volumen()
        self.peso()

        ind_material = self.kwargs["material"]
        Fm = [1., 1.7, 2.1, 3.2, 5.4, 3.6, 3.9, 3.7, 7.7][ind_material]

        if self.kwargs["tipo"] == 0:
            Cb = exp(8.571 - 0.233 * log(self.W.lb) +
                     0.04333 * log(self.W.lb)**2)
            Ca = 1370 * self.Di.ft**0.2029
        else:
            Cb = exp(9.1 - 0.2889 * log(self.W.lb) +
                     0.04576 * log(self.W.lb)**2)
            Ca = 246 * self.Di.ft**0.7396 * self.L.ft**0.7068

        C = Fm * Cb + Ca

        self.C_adq = unidades.Currency(C * CI / BI)
        self.C_inst = unidades.Currency(self.C_adq * self.kwargs["f_install"])
Example #8
0
    def __init__(self, entrada=None, parent=None):
        """entrada: Parametro opcional de clase corriente que indica la corriente de entrada en kla tubería"""
        super(UI_equipment, self).__init__(Tower, parent=parent)
        self.entrada = entrada

        #        #Pestaña entrada
        #        self.Entrada= UI_corriente.Ui_corriente(entrada)
        #        self.Entrada.Changed.connect(self.cambiar_entrada)
        #        self.tabWidget.addTab(self.Entrada, QtGui.QApplication.translate("equipment", "Entrada", None, QtGui.QApplication.UnicodeUTF8))

        #Pestaña calculo
        gridLayout_Calculo = QtWidgets.QGridLayout(self.tabCalculo)

        #Pestaña costos
        gridLayout_Costos = QtWidgets.QGridLayout(self.tabCostos)
        gridLayout_Costos.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment", "Proceso:",
                                                 None)), 1, 1, 1, 1)
        self.proceso = QtWidgets.QComboBox()
        self.proceso.addItem(
            QtWidgets.QApplication.translate("equipment", "Destilación", None))
        self.proceso.addItem(
            QtWidgets.QApplication.translate("equipment", "Absorción", None))
        self.proceso.currentIndexChanged.connect(self.calcularCostos)
        gridLayout_Costos.addWidget(self.proceso, 1, 2, 1, 1)
        gridLayout_Costos.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment",
                                                 "Tipo de columna:", None)), 2,
            1, 1, 1)
        self.tipo = QtWidgets.QComboBox()
        self.tipo.addItem(
            QtWidgets.QApplication.translate("equipment", "De pisos", None))
        self.tipo.addItem(
            QtWidgets.QApplication.translate("equipment", "De relleno", None))
        self.tipo.currentIndexChanged.connect(self.mostrarSubclasificacion)
        self.tipo.currentIndexChanged.connect(self.calcularCostos)
        gridLayout_Costos.addWidget(self.tipo, 2, 2, 1, 1)
        gridLayout_Costos.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment", "Material:",
                                                 None)), 3, 1, 1, 1)
        self.material = QtWidgets.QComboBox()
        self.material.addItem(
            QtWidgets.QApplication.translate("equipment", "Acero al carbon",
                                             None))
        self.material.addItem(
            QtWidgets.QApplication.translate("equipment",
                                             "Acero inoxidable 304", None))
        self.material.addItem(
            QtWidgets.QApplication.translate("equipment",
                                             "Acero inoxidable 316", None))
        self.material.addItem(
            QtWidgets.QApplication.translate("equipment", "Carpenter 20CB-3",
                                             None))
        self.material.addItem(
            QtWidgets.QApplication.translate("equipment", "Niquel 200", None))
        self.material.addItem(
            QtWidgets.QApplication.translate("equipment", "Monel 400", None))
        self.material.addItem(
            QtWidgets.QApplication.translate("equipment", "Inconel 600", None))
        self.material.addItem(
            QtWidgets.QApplication.translate("equipment", "Incoloy 825", None))
        self.material.addItem(
            QtWidgets.QApplication.translate("equipment", "Titanio", None))
        self.material.currentIndexChanged.connect(self.calcularCostos)
        gridLayout_Costos.addWidget(self.material, 3, 2, 1, 1)

        gridLayout_Costos.addItem(
            QtWidgets.QSpacerItem(30, 30, QtWidgets.QSizePolicy.Fixed,
                                  QtWidgets.QSizePolicy.Fixed), 1, 3, 5, 1)

        self.groupBox_Pisos = QtWidgets.QGroupBox(
            QtWidgets.QApplication.translate("equipment", "Torre de pisos",
                                             None))
        gridLayout_Costos.addWidget(self.groupBox_Pisos, 1, 4, 4, 2)
        gridLayout_1 = QtWidgets.QGridLayout(self.groupBox_Pisos)
        gridLayout_1.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment", "Tipo:", None)),
            1, 1, 1, 1)
        self.tipoPisos = QtWidgets.QComboBox()
        self.tipoPisos.addItem(
            QtWidgets.QApplication.translate("equipment", "De válvula", None))
        self.tipoPisos.addItem(
            QtWidgets.QApplication.translate("equipment", "De rejilla", None))
        self.tipoPisos.addItem(
            QtWidgets.QApplication.translate("equipment", "De borboteo", None))
        self.tipoPisos.addItem(
            QtWidgets.QApplication.translate("equipment", "De tamiz", None))
        self.tipoPisos.currentIndexChanged.connect(self.calcularCostos)
        gridLayout_1.addWidget(self.tipoPisos, 1, 2, 1, 1)
        gridLayout_1.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment", "Material:",
                                                 None)), 2, 1, 1, 1)
        self.materialPisos = QtWidgets.QComboBox()
        self.materialPisos.addItem(
            QtWidgets.QApplication.translate("equipment", "Acero al carbon",
                                             None))
        self.materialPisos.addItem(
            QtWidgets.QApplication.translate("equipment",
                                             "Acero inoxidable 304", None))
        self.materialPisos.addItem(
            QtWidgets.QApplication.translate("equipment",
                                             "Acero inoxidable 316", None))
        self.materialPisos.addItem(
            QtWidgets.QApplication.translate("equipment", "Carpenter 20CB-3",
                                             None))
        self.materialPisos.addItem(
            QtWidgets.QApplication.translate("equipment", "Niquel 200", None))
        self.materialPisos.addItem(
            QtWidgets.QApplication.translate("equipment", "Monel 400", None))
        self.materialPisos.addItem(
            QtWidgets.QApplication.translate("equipment", "Inconel 600", None))
        self.materialPisos.addItem(
            QtWidgets.QApplication.translate("equipment", "Incoloy 825", None))
        self.materialPisos.addItem(
            QtWidgets.QApplication.translate("equipment", "Titanio", None))
        self.materialPisos.currentIndexChanged.connect(self.calcularCostos)
        gridLayout_1.addWidget(self.materialPisos, 2, 2, 1, 1)
        gridLayout_1.addItem(
            QtWidgets.QSpacerItem(10, 10, QtWidgets.QSizePolicy.Fixed,
                                  QtWidgets.QSizePolicy.Fixed), 3, 1, 1, 2)
        gridLayout_1.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment", "Diametro:",
                                                 None)), 4, 1, 1, 1)
        self.diametroPisos = Entrada_con_unidades(unidades.Length)
        gridLayout_1.addWidget(self.diametroPisos, 4, 2, 1, 1)
        gridLayout_1.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment", "Número:",
                                                 None)), 5, 1, 1, 1)
        self.NumeroPisos = Entrada_con_unidades(int,
                                                spinbox=True,
                                                min=1,
                                                step=1,
                                                width=50)
        gridLayout_1.addWidget(self.NumeroPisos, 5, 2, 1, 1)
        gridLayout_1.addItem(
            QtWidgets.QSpacerItem(10, 10, QtWidgets.QSizePolicy.Fixed,
                                  QtWidgets.QSizePolicy.Fixed), 6, 1, 1, 2)

        self.groupBox_relleno = QtWidgets.QGroupBox(
            QtWidgets.QApplication.translate("equipment", "Torre de relleno",
                                             None))
        gridLayout_Costos.addWidget(self.groupBox_relleno, 1, 4, 4, 2)
        gridLayout_2 = QtWidgets.QGridLayout(self.groupBox_relleno)
        gridLayout_2.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment", "Volumen:",
                                                 None)), 1, 1, 1, 1)
        self.VolumenRelleno = Entrada_con_unidades(unidades.Volume, "VolLiq")
        gridLayout_2.addWidget(self.VolumenRelleno, 1, 2, 1, 1)
        gridLayout_2.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment",
                                                 "Coste unitario:", None)), 2,
            1, 1, 1)
        self.C_unit_relleno = Entrada_con_unidades(
            unidades.Currency,
            retornar=False,
            textounidad="%s / %s" % (unidades.Currency(None).text(),
                                     unidades.Volume(None).text("VolLiq")))
        gridLayout_2.addWidget(self.C_unit_relleno, 2, 2, 1, 1)
        gridLayout_2.addItem(
            QtWidgets.QSpacerItem(10, 10, QtWidgets.QSizePolicy.Fixed,
                                  QtWidgets.QSizePolicy.Fixed), 3, 1, 1, 2)

        gridLayout_Costos.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment", "Diametro:",
                                                 None)), 5, 1, 1, 1)
        self.Dc = Entrada_con_unidades(unidades.Length)
        gridLayout_Costos.addWidget(self.Dc, 5, 2, 1, 2)
        gridLayout_Costos.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment", "Altura:",
                                                 None)), 6, 1, 1, 1)
        self.Hc = Entrada_con_unidades(unidades.Length)
        gridLayout_Costos.addWidget(self.Hc, 6, 2, 1, 2)
        gridLayout_Costos.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment",
                                                 "Espesor (Tapa):", None)), 7,
            1, 1, 1)
        self.EspesorSuperior = Entrada_con_unidades(unidades.Length,
                                                    "Thickness")
        gridLayout_Costos.addWidget(self.EspesorSuperior, 7, 2, 1, 2)
        gridLayout_Costos.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment",
                                                 "Espesor (Fondo):", None)), 8,
            1, 1, 1)
        self.EspesorInferior = Entrada_con_unidades(unidades.Length,
                                                    "Thickness")
        gridLayout_Costos.addWidget(self.EspesorInferior, 8, 2, 1, 2)
        gridLayout_Costos.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment", "Densidad:",
                                                 None)), 9, 1, 1, 1)
        self.EspesorInferior = Entrada_con_unidades(unidades.Density, "DenLiq")
        gridLayout_Costos.addWidget(self.EspesorInferior, 9, 2, 1, 2)

        self.Costos = costIndex.CostData(3, 3)
        self.Costos.valueChanged.connect(self.calcularCostos)
        gridLayout_Costos.addWidget(self.Costos, 10, 1, 2, 4)

        gridLayout_Costos.addItem(
            QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Expanding,
                                  QtWidgets.QSizePolicy.Expanding), 12, 1, 1,
            6)

        self.groupBox_Costos = QtWidgets.QGroupBox(
            QtWidgets.QApplication.translate("equipment", "Costos calculados",
                                             None))
        gridLayout_Costos.addWidget(self.groupBox_Costos, 13, 1, 1, 5)
        gridLayout_5 = QtWidgets.QGridLayout(self.groupBox_Costos)
        gridLayout_5.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment", "Coste Pisos:",
                                                 None)), 0, 1, 1, 1)
        self.C_pisos = Entrada_con_unidades(unidades.Currency,
                                            retornar=False,
                                            readOnly=True)
        gridLayout_5.addWidget(self.C_pisos, 0, 2, 1, 1)
        gridLayout_5.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment", "Coste Carcasa:",
                                                 None)), 1, 1, 1, 1)
        self.C_carcasa = Entrada_con_unidades(unidades.Currency,
                                              retornar=False,
                                              readOnly=True)
        gridLayout_5.addWidget(self.C_carcasa, 1, 2, 1, 1)
        gridLayout_5.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment",
                                                 "Coste Accesorios:", None)),
            2, 1, 1, 1)
        self.C_accesorios = Entrada_con_unidades(unidades.Currency,
                                                 retornar=False,
                                                 readOnly=True)
        gridLayout_5.addWidget(self.C_accesorios, 2, 2, 1, 1)
        gridLayout_5.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment", "Coste Columna:",
                                                 None)), 0, 4, 1, 1)
        self.C_columna = Entrada_con_unidades(unidades.Currency,
                                              retornar=False,
                                              readOnly=True)
        gridLayout_5.addWidget(self.C_columna, 0, 5, 1, 1)
        gridLayout_5.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment",
                                                 "Coste Adquisición:", None)),
            1, 4, 1, 1)
        self.C_adq = Entrada_con_unidades(unidades.Currency,
                                          retornar=False,
                                          readOnly=True)
        gridLayout_5.addWidget(self.C_adq, 1, 5, 1, 1)
        gridLayout_5.addWidget(
            QtWidgets.QLabel(
                QtWidgets.QApplication.translate("equipment",
                                                 "Coste Instalación:", None)),
            2, 4, 1, 1)
        self.C_inst = Entrada_con_unidades(unidades.Currency,
                                           retornar=False,
                                           readOnly=True)
        gridLayout_5.addWidget(self.C_inst, 2, 5, 1, 1)

        #        #Pestaña salida
        #        self.pSalida = QtGui.QTabWidget()
        #        self.tabWidget.addTab(self.pSalida,QtGui.QApplication.translate("equipment", "Salida", None, QtGui.QApplication.UnicodeUTF8))

        self.mostrarSubclasificacion(0)
Example #9
0
class Pipe(equipment):
    """Clase que modela un una tubería

    Parámetros:
        entrada: Instancia de clase corriente que define la corriente que fluye por la tubería
        metodo: Método de cálculo
            0   -   Flujo unifásico
            1   -   Flujo de agua (Eq. de Hazen-Williams)
            2   -   Flujo de vapor (Eq de Fritzsche)
            3   -   Flujo de gas isotérmico
            4   -   Flujo bifásico (Método Baker)
            5   -   Flujo bifásico (Método de Beggs and Brill)
        thermal: Método de funcionamiento adiabático:
            0   -   Adiabático
            1   -   Flujo de calor fíjo
            2   -   Calcular el intercambio de calor conocidas U y Tª externa
        Material: Array con los datos del material
            0   -   Nombre
            1   -   Clase
            2   -   Rugosidad, mm
            3   -   Catalogo
            4   -   Di, mm
            5   -   Espesor, mm
            6   -   De, mm
            7   -   Peso, kg/m
            8   -   Volumen, m³/100m
            9   -   Superficie, m²/100m
            10 -    Indice de la lista de materiales
            11 -    Indice de la lista de de dimensiones
        Accesorios: Array en el que cada entrada representa un equipo con perdida de carga:
            Indice tipo equipo
            Indice diametro
            K
            Numero de equipos
            Tipo
            Diametro en mm
            Diametro en pulgadas
            Texto explicativo

        l: Longitud en metros de la tubería
        h: diferencia de altura entre la entrada y la salida de la tubería, m
        K: Coeficiente del los accesorios
        C:Coeficiente para el método de Hazen-Williams
        T_ext: Temperatura en el exterior de la tubería
        U: Coeficiente global de transimisión de calor entre la tubería y el exterior
        Q: Calor transmitido a través de las paredes de la tubería

    Coste:
        solo disponible para las tuberías de acero, Ref Darby pag 217

    >>> agua=agua=Corriente(T=300, P=101325, caudalMasico=1, fraccionMolar=[1.])
    >>> tuberia=Pipe(entrada=agua, metodo=0, l=5, material=["Cast Iron", "Class A", 0.12192, '6"', 152.4, 11.43, 175.26, 42.07, 1.824, 55.06])
    >>> print tuberia.Di, tuberia.V,  tuberia.Re, tuberia.DeltaP
    0.1524 0.0626814744044 9427.99142792 1.8362005711
    """
    title = QApplication.translate("pychemqt", "Pipe")
    help = ""
    kwargs = {
        "entrada": None,
        "metodo": 0,
        "thermal": 0,
        "material": [],
        "accesorios": [],
        "l": 0.0,
        "h": 0.0,
        "K": 0.0,
        "C": 100.,
        "T_ext": 0.0,
        "U": 0.0,
        "Q": 0.0,
        "f_install": 2.8,
        "Base_index": 0.0,
        "Current_index": 0.0
    }
    kwargsInput = ("entrada", )
    kwargsValue = ("l", "h", "C")
    kwargsList = ("metodo", "thermal")
    calculateValue = ("DeltaP", "DeltaP_f", "DeltaP_ac", "DeltaP_h",
                      "DeltaP_v", "DeltaP_100ft", "V", "f", "Re", "Tout")
    calculateCostos = ("C_adq", "C_inst")
    indiceCostos = 5

    TEXT_METODO = [
        QApplication.translate("pychemqt", "Single Phase flow"),
        QApplication.translate("pychemqt", "Water (Hazen-Williams)"),
        QApplication.translate("pychemqt", "Steam (Fritzsche)"),
        QApplication.translate("pychemqt", "Isotermic gas flow"),
        QApplication.translate("pychemqt", "Two Phase flow (Baker method)"),
        QApplication.translate("pychemqt",
                               "Two Phase flow (Beggs and Brill method)")
    ]
    TEXT_THERMAL = [
        QApplication.translate("pychemqt", "Adiabatic"),
        QApplication.translate("pychemqt", "Heat flux"),
        QApplication.translate("pychemqt", "Heat transfer")
    ]

    C_adq = unidades.Currency(None)
    C_inst = unidades.Currency(None)

    @property
    def isCalculable(self):
        if self.kwargs["f_install"] and self.kwargs[
                "Base_index"] and self.kwargs["Current_index"] and self.kwargs[
                    "material"] and self.kwargs["material"][0] in [
                        'Stainless Steel (ANSI)', 'Steel Galvanised (ANSI)',
                        'Steel (ANSI)'
                    ]:
            self.statusCoste = True
        else:
            self.statusCoste = False
            self.C_adq = unidades.Currency(None)
            self.C_inst = unidades.Currency(None)

        if not self.kwargs["entrada"]:
            self.msg = QApplication.translate("pychemqt", "undefined input")
            self.status = 0
            return
        if not self.kwargs["l"]:
            self.msg = QApplication.translate("pychemqt",
                                              "undefined pipe length")
            self.status = 0
            return
        if not self.kwargs["material"]:
            self.msg = QApplication.translate("pychemqt", "undefined material")
            self.status = 0
            return

        if self.kwargs["thermal"] == 1 and not self.kwargs["Q"]:
            self.msg = QApplication.translate("pychemqt",
                                              "undefined heat flux")
            self.status = 0
            return
        elif self.kwargs["thermal"] == 2 and (not self.kwargs["T_ext"]
                                              or not self.kwargs["U"]):
            self.msg = QApplication.translate(
                "pychemqt", "undefined heat transfer conditions")
            self.status = 0
            return

        if self.kwargs["metodo"] == 1 and not self.kwargs["C"]:
            self.msg = QApplication.translate("pychemqt",
                                              "undefined C William Factor")
            self.status = 0
            return

        self.msg = ""
        self.status = 1
        return True

    def calculo(self):
        self.entrada = self.kwargs["entrada"]
        self.L = unidades.Length(self.kwargs["l"])

        if self.entrada.x == 0:
            self.rho = self.entrada.Liquido.rho
            self.mu = self.entrada.Liquido.mu
        else:
            self.rho = self.entrada.Gas.rho
            self.mu = self.entrada.Gas.mu

        self.material = self.kwargs["material"][0] + " " + self.kwargs[
            "material"][1]
        self.Dn = self.kwargs["material"][3]
        self.rugosidad = unidades.Length(self.kwargs["material"][2], "mm")
        self.De = unidades.Length(self.kwargs["material"][6], "mm")
        self.w = unidades.Length(self.kwargs["material"][5], "mm")
        self.Di = unidades.Length((self.De - 2 * self.w))
        self.eD = unidades.Dimensionless(self.rugosidad / self.Di)
        self.seccion = unidades.Area(pi / 4 * self.Di**2)
        self.A = unidades.Area(pi * self.De * self.L)
        self.V = unidades.Speed(self.entrada.Q / self.seccion)
        self.Re = Re(self.Di, self.V, self.rho, self.mu)
        K = 0
        for accesorio in self.kwargs["accesorios"]:
            K += accesorio[2] * accesorio[3]
        self.K = unidades.Dimensionless(K)
        self.DeltaP_h = unidades.Pressure(g * self.kwargs["h"] * self.rho)
        self.DeltaP_ac = unidades.Pressure(self.K * self.V**2 / 2 * self.rho)

        self.f = f_friccion(self.Re, self.eD)
        self.DeltaP_f = self.__DeltaP_friccion()
        #TODO:
        self.DeltaP_v = unidades.Pressure(0)

        self.DeltaP = unidades.Pressure(self.DeltaP_f + self.DeltaP_ac +
                                        self.DeltaP_h)
        self.DeltaP_100ft = self.DeltaP * 100 / self.L.ft
        self.Pout = unidades.Pressure(self.entrada.P - self.DeltaP)

        if self.kwargs["thermal"] == 0:
            self.Tout = self.entrada.T
            self.Heat = unidades.Power(0)
        else:
            cambiador = Heat_Exchanger()
            cambiador.calculo(entrada=self.entrada,
                              modo=self.kwargs["thermal"],
                              Heat=self.kwargs["Q"],
                              deltaP=self.DeltaP,
                              A=self.A,
                              U=self.kwargs["U"],
                              Text=self.kwargs["Text"])
            self.Tout = cambiador.salida[0].T
            self.Heat = cambiador.Heat

        self.salida = [self.entrada.clone(T=self.Tout, P=self.Pout)]
        self.Pin = self.entrada.P
        self.Pout = self.salida[0].P

    def __DeltaP_friccion(self):
        """Método para el calculo de la perdida de presión"""
        if self.kwargs["metodo"] == 0:
            delta = unidades.Pressure(self.L * self.V**2 / self.Di * self.f *
                                      self.rho / 2)
        elif self.kwargs["metodo"] == 1:
            delta = unidades.Pressure(
                (self.entrada.Q.galUSmin * self.L.ft**0.54 / 0.442 /
                 self.Di.inch**2.63 / self.kwargs["C"])**(1. / 0.54), "psi")
        elif self.kwargs["metodo"] == 2:
            delta = unidades.Pressure(
                2.1082 * self.L.ft * self.entrada.caudalmasico.lbh**1.85 /
                self.rho.lbft3 / 1e7 / self.Di.inch**4.97, "psi")
        elif self.kwargs["metodo"] == 3:
            pass

        elif self.kwargs["metodo"] == 4:
            pass

        elif self.kwargs["metodo"] == 5:
            pass

        return delta

    def coste(self):
        """
        Coste solo disponible para las tuberías de acero
        Ref Darby pag 217

        kwargs:
            schedule: Clase de acero
        """
        codigo = str(self.kwargs["material"][1])
        if codigo in ('Sch. 40', 'Sch. 5S'):
            a = 30.
            p = 1.31
        elif codigo in ('Sch. 80', 'Sch. 10S'):
            a = 38.1
            p = 1.35
        elif codigo in ('Sch. 160', 'Sch.  40S'):
            a = 55.3
            p = 1.39
        else:
            a = 0
            p = 1

        self.C_adq = unidades.Currency(a * self.Di.ft**p * self.L *
                                       self.kwargs["Current_index"] /
                                       self.kwargs["Base_index"])
        self.C_inst = unidades.Currency(self.C_adq * self.kwargs["f_install"])

    def writeListtoStream(self, stream, key, value):
        """Personalizar en el caso de equipos con listas complejas"""
        if key == "material":
            stream.writeString(value[0])
            stream.writeString(value[1])
            stream.writeFloat(value[2])
            stream.writeString(value[3])
            for val in value[4:-2]:
                stream.writeFloat(val)
            for val in value[-2:]:
                stream.writeInt32(val)
        elif key == "accesorios":
            stream.writeInt32(len(value))
            for accesorio in value:
                stream.writeInt32(accesorio[0])
                stream.writeInt32(accesorio[1])
                stream.writeFloat(accesorio[2])
                stream.writeInt32(accesorio[3])
                for cadena in accesorio[4:]:
                    stream.writeString(cadena)

    def readListFromStream(self, stream, key):
        """Personalizar en el caso de equipos con listas complejas"""
        valor = []
        if key == "material":
            valor.append(stream.readString())
            valor.append(stream.readString())
            valor.append(float(representacion(stream.readFloat())))
            valor.append(stream.readString())
            for i in range(6):
                valor.append(float(representacion(stream.readFloat())))
            valor.append(stream.readInt32())
            valor.append(stream.readInt32())
        elif key == "accesorios":
            for i in range(stream.readInt32()):
                accesorio = []
                accesorio.append(stream.readInt32())
                accesorio.append(stream.readInt32())
                accesorio.append(float(representacion(stream.readFloat())))
                accesorio.append(stream.readInt32())
                for j in range(4):
                    accesorio.append(stream.readString())
                valor.append(accesorio)
        return valor

    def propTxt(self):
        txt = "#---------------" + QApplication.translate(
            "pychemqt", "Catalog") + "-----------------#" + os.linesep
        txt += "%-25s\t %s %s" % (QApplication.translate(
            "pychemqt", "Material"), self.kwargs["material"][0],
                                  self.kwargs["material"][1]) + os.linesep
        txt += "%-25s\t %s" % (QApplication.translate(
            "pychemqt",
            "Nominal Diameter"), self.kwargs["material"][3]) + os.linesep
        txt += "%-25s\t%s" % (QApplication.translate(
            "pychemqt", "Length"), self.L.str) + os.linesep
        txt += "%-25s\t%s" % (QApplication.translate(
            "pychemqt", "Roughness"), self.rugosidad.str) + os.linesep
        txt += "%-25s\t%s" % (QApplication.translate(
            "pychemqt", "Internal Diamter"), self.Di.str) + os.linesep
        txt += "%-25s\t%s" % (QApplication.translate(
            "pychemqt", "External Diamter"), self.De.str) + os.linesep
        txt += "%-25s\t%s" % (QApplication.translate(
            "pychemqt", "Thickness"), self.w.str) + os.linesep
        txt += "%-25s\t%s" % (QApplication.translate(
            "pychemqt", "Transversal section"), self.seccion.str) + os.linesep
        txt += "%-25s\t%s" % (QApplication.translate(
            "pychemqt", "External Area"), self.A.str) + os.linesep

        if self.kwargs["accesorios"]:
            txt += os.linesep + "#---------------" + QApplication.translate(
                "pychemqt", "Fittings") + "-----------------#" + os.linesep
            txt += "%-25s\t %s" % ("K " + QApplication.translate(
                "pychemqt", "Total"), self.K) + os.linesep
            for accesorio in self.kwargs["accesorios"]:
                txt += "%5i %-22s\t %s" % (accesorio[3], accesorio[7],
                                           accesorio[2]) + os.linesep

        txt += os.linesep + "#---------------" + QApplication.translate(
            "pychemqt",
            "Calculate properties") + "-----------------#" + os.linesep
        txt += "%-25s\t %s" % (QApplication.translate(
            "pychemqt",
            "Method"), self.TEXT_METODO[self.kwargs["metodo"]]) + os.linesep
        txt += "%-25s\t%s" % (QApplication.translate(
            "pychemqt", "Input Pressure"), self.entrada.P.str) + os.linesep
        txt += "%-25s\t%s" % (QApplication.translate(
            "pychemqt", "Output Pressure"), self.salida[0].P.str) + os.linesep
        txt += "%-25s\t%s" % (QApplication.translate(
            "pychemqt", "ΔP Total", None,
            QApplication.UnicodeUTF8), self.DeltaP.str) + os.linesep
        txt += "%-25s\t%s" % (QApplication.translate(
            "pychemqt", "ΔP friction", None,
            QApplication.UnicodeUTF8), self.DeltaP_f.str) + os.linesep
        txt += "%-25s\t%s" % (QApplication.translate(
            "pychemqt", "ΔP fittings", None,
            QApplication.UnicodeUTF8), self.DeltaP_ac.str) + os.linesep
        txt += "%-25s\t%s" % (QApplication.translate(
            "pychemqt", "ΔP elevation", None,
            QApplication.UnicodeUTF8), self.DeltaP_h.str) + os.linesep
        txt += "%-25s\t%s" % (QApplication.translate(
            "pychemqt", "ΔP acceleration", None,
            QApplication.UnicodeUTF8), self.DeltaP_v.str) + os.linesep
        txt += "%-25s\t %s" % (
            QApplication.translate("pychemqt", "Thermal Condition"),
            self.TEXT_THERMAL[self.kwargs["thermal"]]) + os.linesep
        txt += "%-25s\t%s" % (QApplication.translate(
            "pychemqt", "Fluid Speed"), self.V.str) + os.linesep
        txt += "%-25s\t %s" % ("Reynolds", self.Re) + os.linesep
        txt += "%-25s\t %s" % (u"ε/D", self.eD) + os.linesep
        txt += "%-25s\t %s" % (QApplication.translate(
            "pychemqt", "Factor Friction"), self.f) + os.linesep

        if self.kwargs["thermal"]:
            txt += "%-25s\t%s" % (QApplication.translate(
                "pychemqt", "Output Temperature"), self.Tout.str) + os.linesep
            txt += "%-25s\t%s" % (QApplication.translate(
                "pychemqt", "Heat Transfer"), self.Heat.str) + os.linesep

        if self.statusCoste:
            txt += os.linesep
            txt += "#---------------" + QApplication.translate(
                "pychemqt", "Preliminary Cost Estimation"
            ) + "-----------------#" + os.linesep
            txt += "%-25s\t %0.2f" % (QApplication.translate(
                "pychemqt",
                "Base index"), self.kwargs["Base_index"]) + os.linesep
            txt += "%-25s\t %0.2f" % (QApplication.translate(
                "pychemqt",
                "Current index"), self.kwargs["Current_index"]) + os.linesep
            txt += "%-25s\t %0.2f" % (QApplication.translate(
                "pychemqt",
                "Install factor"), self.kwargs["f_install"]) + os.linesep
            txt += "%-25s\t%s" % (QApplication.translate(
                "pychemqt", "Purchase Cost"), self.C_adq.str) + os.linesep
            txt += "%-25s\t%s" % (QApplication.translate(
                "pychemqt", "Installed Cost"), self.C_inst.str) + os.linesep

        return txt

    @classmethod
    def propertiesEquipment(cls):
        list = [
            (QApplication.translate("pychemqt", "Material"), "material", str),
            (QApplication.translate("pychemqt",
                                    "Nominal Diameter"), "Dn", str),
            (QApplication.translate("pychemqt",
                                    "Length"), "L", unidades.Length),
            (QApplication.translate("pychemqt", "Roughness"), "rugosidad",
             unidades.Length),
            (QApplication.translate("pychemqt", "Internal Diamter"), "Di",
             unidades.Length),
            (QApplication.translate("pychemqt", "External Diamter"), "De",
             unidades.Length),
            (QApplication.translate("pychemqt",
                                    "Thickness"), "w", unidades.Length),
            (QApplication.translate("pychemqt", "Transversal section"),
             "seccion", unidades.Area),
            (QApplication.translate("pychemqt",
                                    "External Area"), "A", unidades.Area),
            (QApplication.translate("pychemqt",
                                    "K total"), "K", unidades.Dimensionless),
            (QApplication.translate("pychemqt",
                                    "Fittings"), "accesorios", None),
            (QApplication.translate("pychemqt",
                                    "Method"), ("TEXT_METODO", "metodo"), str),
            (QApplication.translate("pychemqt", "Input Pressure"), "Pin",
             unidades.Pressure),
            (QApplication.translate("pychemqt", "Output Pressure"), "Pout",
             unidades.Pressure),
            (QApplication.translate("pychemqt", "ΔP Total", None,
                                    QApplication.UnicodeUTF8), "DeltaP",
             unidades.DeltaP),
            (QApplication.translate("pychemqt", "ΔP friction", None,
                                    QApplication.UnicodeUTF8), "DeltaP_f",
             unidades.DeltaP),
            (QApplication.translate("pychemqt", "ΔP fittings", None,
                                    QApplication.UnicodeUTF8), "DeltaP_ac",
             unidades.DeltaP),
            (QApplication.translate("pychemqt", "ΔP elevation", None,
                                    QApplication.UnicodeUTF8), "DeltaP_h",
             unidades.DeltaP),
            (QApplication.translate("pychemqt", "ΔP acceleration", None,
                                    QApplication.UnicodeUTF8), "DeltaP_v",
             unidades.DeltaP),
            (QApplication.translate("pychemqt", "Thermal Condition"),
             ("TEXT_THERMAL", "thermal"), str),
            (QApplication.translate("pychemqt",
                                    "Fluid Speed"), "V", unidades.Speed),
            (QApplication.translate("pychemqt", "Reynolds number"), "Re",
             unidades.Dimensionless),
            (QApplication.translate("pychemqt", "Relative roughness"), "eD",
             unidades.Dimensionless),
            (QApplication.translate("pychemqt", "Factor Friction"), "f",
             unidades.Dimensionless),
            (QApplication.translate("pychemqt", "Output Temperaturet"), "Tout",
             unidades.Temperature),
            (QApplication.translate("pychemqt",
                                    "Heat Transfer"), "Heat", unidades.Power),
            (QApplication.translate("pychemqt", "Purchase Cost"), "C_adq",
             unidades.Currency),
            (QApplication.translate("pychemqt", "Installed Cost"), "C_inst",
             unidades.Currency)
        ]
        return list

    def propertiesListTitle(self, index):
        lista = []
        for accesorio in self.kwargs["accesorios"]:
            lista.append("%3i %s" % (accesorio[3], accesorio[7]))
        return lista