sher_duam_class_2.py 4.87 KB
'''
Created on 28 авг. 2019 г.

@author: GadGet Life
'''

import math as m
import numpy as np
from matplotlib import mlab
import pylab
import csv
#import urllib.request
import requests
import json
import matplotlib.ticker as ticker
from fuzzylab import *
from datetime import datetime

# http://map.emercit.com/mgraph.php?mode=ultrasound&id=377&a=2020-01-10&b=2020-01-14&nocache=1578985253

class DuamelGidr:

    def __init__(self, time,amp,Tper):
        self.tbeg = time
        self.amp=amp
        self.T=Tper
        #print("U",time,amp)

    def calculation(self,tcur):

        t=tcur-self.tbeg
        return self.amp*(1-m.exp(-t/self.T))

def getLevel(q):
    Q=np.array([
        [0,    0],
        [0.345148257,    0.1],
        [1.097028578,    0.2],
        [2.158903614,    0.3],
        [3.491620674,    0.4],
        [5.071512601,    0.5],
        [6.882239402,    0.6],
        [8.911682045,    0.7],
        [11.15043894,    0.8],
        [13.59098985,    0.9],
        [16.22718582,    1],
        [19.05391666,    1.1],
        [22.06688277,    1.2],
        [25.26243236,    1.3],
        [28.63744147,    1.4],
        [32.18922318,    1.5],
        [35.91545733,    1.6],
        [39.81413517,    1.7],
        [43.88351498,    1.8],
        [48.12208599,    1.9],
        [52.52853871,    2],
        [57.10174025,    2.1],
        [61.84071361,    2.2],
        [66.74462006,    2.3],
        [71.81274423,    2.4],
        [77.04448112,    2.5],
        [82.43932505,    2.6],
        [87.99685986,    2.7],
        [93.71675045,    2.8],
        [99.59873533,    2.9],
        [105.64262,    3],
        [111.8482711,    3.1],
        [118.2156111,    3.2],
        [124.7446139,    3.3],
        [131.4353005,    3.4],
        [138.2877352,    3.5],
        [145.3020222,    3.6],
        [152.4783028,    3.7],
        [159.8167523,    3.8],
        [167.3175775,    3.9],
        [174.981015,    4]]
    )
    n=len(Q)
    for i in range(n):
        if q <= Q[i][0]:
            break
    return Q[i-1][1]+0.1*(q-Q[i-1][0])/(Q[i][0]-Q[i-1][0])


class GetLevelSher():
    def __init__(self):
        self.Q=np.array([
        [0,    0],
        [0.345148257,    0.1],
        [1.097028578,    0.2],
        [2.158903614,    0.3],
        [3.491620674,    0.4],
        [5.071512601,    0.5],
        [6.882239402,    0.6],
        [8.911682045,    0.7],
        [11.15043894,    0.8],
        [13.59098985,    0.9],
        [16.22718582,    1],
        [19.05391666,    1.1],
        [22.06688277,    1.2],
        [25.26243236,    1.3],
        [28.63744147,    1.4],
        [32.18922318,    1.5],
        [35.91545733,    1.6],
        [39.81413517,    1.7],
        [43.88351498,    1.8],
        [48.12208599,    1.9],
        [52.52853871,    2],
        [57.10174025,    2.1],
        [61.84071361,    2.2],
        [66.74462006,    2.3],
        [71.81274423,    2.4],
        [77.04448112,    2.5],
        [82.43932505,    2.6],
        [87.99685986,    2.7],
        [93.71675045,    2.8],
        [99.59873533,    2.9],
        [105.64262,    3],
        [111.8482711,    3.1],
        [118.2156111,    3.2],
        [124.7446139,    3.3],
        [131.4353005,    3.4],
        [138.2877352,    3.5],
        [145.3020222,    3.6],
        [152.4783028,    3.7],
        [159.8167523,    3.8],
        [167.3175775,    3.9],
        [174.981015,    4]]
        )

    def bs_water_level(self, _q):
        q = _q
        n=len(self.Q)
        for i in range(n):
            if q <= self.Q[i][0]:
                break
        return self.Q[i-1][1]+0.1*(q-self.Q[i-1][0])/(self.Q[i][0]-self.Q[i-1][0])


class TestSherDuamel:

    def __init__(self, _k_up=2.8, _k_down=17.0, _k_multy=160.0, _k_addit=60.0):
        self.k_up = _k_up
        self.k_down = _k_down
        self.k_multy = _k_multy
        self.k_addit = _k_addit

        self.prec_old = 0.0
        self.prec_sum_old = 0.0

        self.UpperStore = []
        self.DownStore = []

    def model_step(self, _counter, _prec):
        prec_delta = _prec - self.prec_old

        self.prec_old = _prec
        if np.abs(prec_delta) > 0.001:
            self.UpperStore.append(DuamelGidr(_counter, prec_delta, self.k_up))

        prec_sum = 0.0

        for UpStep in self.UpperStore:
            prec_sum = prec_sum + UpStep.calculation(_counter)

        prec_sum_delta = prec_sum - self.prec_sum_old
        self.prec_sum_old = prec_sum

        if np.abs(prec_sum_delta) > 0.001:
            self.DownStore.append(DuamelGidr(_counter, prec_sum_delta, self.k_down))

        result_flow = 0.0

        for DownStep in self.DownStore:
            result_flow=result_flow + DownStep.calculation(_counter)

        result_flow = result_flow * self.k_multy + self.k_addit

        return result_flow