eurocode_region.py 3.03 KiB
from extreme_data.eurocode_data.utils import LAST_YEAR_FOR_EUROCODE
from root_utils import classproperty


class AbstractEurocodeRegion(object):

    def __init__(self, sk0, sad) -> None:
        # Valeurs caracteristique de la charge de neige sur le sol à une altitude inférieure à 200m
        self.sk0 = sk0
        # Valeur de calcul de la charge exceptionelle
        self.sad = sad

    def eurocode_max_loading(self, altitude):
        valeur_caracteritique = self.valeur_caracteristique(altitude)
        if self.sad is None:
            return valeur_caracteritique
        else:
            return max(self.sad, valeur_caracteritique)

    def valeur_caracteristique(self, altitude):
        return self.sk0 + self._lois_de_variation_de_la_valeur_caracteristique(altitude)

    def _lois_de_variation_de_la_valeur_caracteristique(self, altitude):
        if 200 <= altitude <= 2000:
            if 200 <= altitude <= 500:
                a, b = self.lois_de_variation_200_and_500
            elif 500 <= altitude <= 1000:
                a, b = self.lois_de_variation_500_and_1000
            else:
                a, b = self.lois_de_variation_1000_and_2000
            return a * altitude / 1000 + b
        else:
            raise ValueError('altitude {}m is out of range'.format(altitude))

    @property
    def lois_de_variation_200_and_500(self):
        return 1.0, -0.20

    @property
    def lois_de_variation_500_and_1000(self):
        return 1.5, -0.45

    @property
    def lois_de_variation_1000_and_2000(self):
        return 3.5, -2.45

    def plot_eurocode_snow_load_on_ground_characteristic_value_variable_action(self, ax, altitudes,
                                                                               label='French standards',
                                                                               linestyle=None):
        # The breaking point must be exactly at 500 and 1000
        for threshold in [500, 1000]:
            if min(altitudes) < threshold < max(altitudes):
                assert threshold in altitudes
        # Plot the curve
        ax.plot(altitudes, [self.valeur_caracteristique(altitude) for altitude in altitudes],
                label=label, color=self.eurocode_color, linewidth=5, linestyle=linestyle)

    @classproperty
    def eurocode_color(self):
        raise NotImplementedError


class C(AbstractEurocodeRegion):

    def __init__(self, sad=None) -> None:
        super().__init__(0.65, sad)

    @classproperty
    def eurocode_color(self):
        return 'gold'


class C1(C):
    pass


class C2(C):

    def __init__(self) -> None:
        super().__init__(sad=1.35)


class E(AbstractEurocodeRegion):

    def __init__(self) -> None:
        super().__init__(1.40, None)

    @property
    def lois_de_variation_200_and_500(self):
        return 1.5, -0.30

    @property
    def lois_de_variation_500_and_1000(self):
        return 3.5, -1.30

    @property
    def lois_de_variation_1000_and_2000(self):
        return 7, -4.80

    @classproperty
    def eurocode_color(self):
        return 'orange'