# -*- coding: utf-8 -*-
"""
@author: Vaclav Miklas

Nazev: SEPARACE
===============================================================================
UVOD

Tento skript obsahuje materialovou a energetickou bilanci separace digestatu.
Pokud je cely tento skript naimportovan, obsazene funkce jsou volany zpusobem:
fermentace.MatBilance(argumenty) resp. fermentace.EnerBilance(argumenty).
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
POKYNY K FUNKCI MatBilance

Argumenty:
vysledkyMBF ... 14-clenne pole vysledku funkce fermentace.MatBilance

arg1 ... prvni argument, vyznam dle modu; vzdy obsah susiny v jistem proudu [%]
arg2 ... druhy argument, vyznam dle modu; s vyjimkou prvniho modu vzdy 
         hmotnostni tok jisteho proudu [kg/h]
          
mod ... argument na poslednim miste, ve tvaru mod=hodnota; LZE DOPORUCIT
        VYLUCNE POUZITI MODU C. 1, ZBYVAJICI MODY JSOU POUZE DOPLNKOVE 
         
        hodnota 1 - vypocet na zaklade zadanych susin [%], arg1 = susina v 
                    separatu (dale jen S), arg2 = susina ve fugatu (dale jen F)                 

################################ doplnkove mody ###############################
        hodnota 2 - vypocet z kombinace susina [%] + hmotnostni tok [kg/h],
                    arg1 = susina v S, arg2 = tok F
        hodnota 3 - vypocet z kombinace susina [%] + hmotnostni tok [kg/h],
                    arg1 = susina v F, arg2 = tok S
        hodnota 4 - vypocet z kombinace susina [%] + hmotnostni tok [kg/h],
                    arg1 = susina v S, arg2 = tok S
        hodnota 5 - vypocet z kombinace susina [%] + hmotnostni tok [kg/h],
                    arg1 = susina v F, arg2 = tok F
        hodnota 6 - vypocet na zaklade susiny v separatu a aproximace dle
                    Bauer et al. (2009), arg1 = susina v S, arg2 - ignorovan
################################ doplnkove mody ###############################                 

Priklad volani:
    separace.MatBilance(vysledkyMB, arg1, arg2, mod = X)

Pozn. Vysledky jsou ve forme 4-clenneho pole. Prvni dve polozky jsou hmotnostni 
      toky [kg/h], dalsi dve obsahy susiny [–], a to v poradi S a F.
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
POKYNY K FUNKCI EnerBilance

Argumenty:
vysledkyMBF ... 14-clenne pole vysledku funkce fermentace.MatBilance

Priklad volani:
    separace.EnerBilance(vysledkyMB)

Pozn. Vysledky EnerBilance jsou ve forme dvou clenu - prvni vyjadruje 
      elektrickou spotrebu v kW, druhy tepelnou spotrebu, taktez v kW. Druhy
      clen bude vzdy nulovy - pritomen je pro zachovani konzistence napric
      vsemi funkcemi EnerBilance.
===============================================================================
"""

def MatBilance (vysledkyMB, *args, **kwargs):
    # DEKLARACE PROMENNYCH:  
    mod = kwargs.get('mod')   
    mD = vysledkyMB[5] # hmotnostni tok digestatu z fermentace
    xD = vysledkyMB[-3] # obsah susiny v digestatu
       
    # KALKULACE:
    # Mod cislo 6 v podstate odpovida modu cislo 2 s predbeznym vypoctem na
    # zaklade aproximace dle vyse uvedeneho zdroje:
    if mod == 6:
        args = args + (mD/13.428*(18.046-xD*100),)
        if not 0.6 < args[1]/mD < 0.95:
            print ("Obsah sušiny v digestátu leži mimo rozsah aproximace dle"+
                   "Bauer et al. (2009) - výsledky nemusí být validní.")
        mod = 2
    # Vypocet se lisi dle zadaneho modu, vychazi vsak kdy z reseni dvou 
    # bilancnich rovnic o dvou neznamych:
    # mD = mS + mF
    # mD*xD = mS*xS + mF*xF
    if mod == 2: # 2, Susina S + Tok F
        # V prvni casti jsou vzdy prirazeny argumenty:
        xS = args[0]/100
        mF = args[1]
        # Nasleduje analyticke reseni soustavy:
        mS = mD-mF
        xF = (mD*xD-mS*xS)/mF
    elif mod == 3: # 3, Susina F + Tok S        
        xF = args[0]/100
        mS = args[1]
        mF = mD-mS
        xS = (mD*xD-mF*xF)/mS
    elif mod == 4: # 3, Susina S + Tok S         
        xS = args[0]/100
        mS = args[1]
        mF = mD-mS
        xF = (mD*xD-mS*xS)/mF
    elif mod == 5: # 3, Susina F + Tok F       
        xF = args[0]/100
        mF = args[1]
        mS = mD-mF
        xS = (mD*xD-mF*xF)/mS
    else: # 1, (ci nezadano) Susina S + Tok S
        xS = args[0]/100
        xF = args[1]/100
        # Pro stezejni mod osetreni chybovych stavu, kdy zadany obsah susiny 
        # v separatu ci fugatu nebude korespondovat s obsahem susiny v digestatu:
        if xS <= xD:
            xS = 0.25
            print('Obsah sušiny v separátu musí být vyšší než v digestátu. '+
                  'Hodnota změněna na 25% obsah sušiny.')
        if xF >= xD:
            xF = xD - 0.01
            print('Obsah sušiny ve fugátu musí být nižší než v digestátu. '+
                  'Hodnota změněna na obsah sušiny o 1 % méně než v digestátu.')
        mS = mD*(xD-xF)/(xS-xF)
        mF = mD-mS
    
    # VYSTUP FUNKCE:
    return mS, mF, xS, xF


def EnerBilance (vysledkyMB):
    # DEKLARACE PROMENNYCH:
    # Hustota digestatu (casto se ztotoznuje s nize uvedenou hodnotou):
    rhoD = 1000
    # Hmotnostni tok digestatu:
    mD = vysledkyMB[5]
    # Prikony a maximalni prutoky pro snekove separatory S300, S655 a S855 HD 
    # od spolecnosti BAUER:
    prikony = [2.2, 5.5, 7.5] # kW
    max_prutoky = [16, 25, 35] # m3/h
    
    # PROCEDURA:
    # Objemovy prutok:
    VD = mD/rhoD
    # Na zacatku predpoklad nejmensiho separatoru:
    E = prikony[0]
    # Tepelna spotreba/produkce je na dane rozslisovaci urovni nulova:
    Q = 0
    for i in range(3):       
        # Pokud bude prekonan maximalni prutok daneho separatoru...
        if VD > max_prutoky[i]:
            # ...pak bude prirazen vykon vetsiho z nich.
            if i < 2:
                E = prikony[i+1]
            # V pripade, ze bude prekonan maximalni prutok nejvetsiho ze
            # separatoru, pak bude vypsano upozorneni:
            else:
                E = prikony[-1]
                print('Tok digestátu je nad rozsahem největšího separátoru. '+
                      'Zahrňte příkon dalšího separátor do ostatních zařízení.')
    # VYSTUP FUNKCE:
    return -E, -Q