seviprince / dromotherm

Code Python
MIT License
0 stars 1 forks source link

amélioration de la robustesse du calcul du besoin du bâtiment #4

Closed alexandrecuer closed 4 years ago

alexandrecuer commented 4 years ago

le calcul du besoin du bâtiment est à reprendre...l'intégration du besoin en ECS doit être améliorée.....

une première idée pour améliorer est de créer la fonction suivante :

def ECSPower(min, max):
    """
    on modélise l'eau du réseau comme une fonction sinusoidale de période annuelle

    cette fonction est complètement calée sur un fichier météo qui commence au 1er janvier

    min : température minimale d'injection de l'eau du réseau dans le ballon

    max : température maximale d'injection de l'eau du réseau dans le ballon
    """
    T_water=np.zeros(meteo.shape[0])
    ## période
    w=2*math.pi/npy
    for i in range(meteo.shape[0]):
        # numéro de step dans l'année
        siy = i - npy*(i//npy)     
        T_water[i]= (min-max)* math.cos(w*siy) / 2 + (max+min) / 2
    # il faut donc diviser par 24*3600 pour convertir de J à W, Cpf étant exprimée en J/kg/K
    return Volume_ballon*Npers*(Tballon-T_water)*Cpf/(24*3600) 

on génère ainsi le vecteur numpy de l'ECS de manière très simple :

ECS = ECSPower(Tentree_hiver, Tentree_ete)

cette génération doit être réalisée dans les usecases à mon sens.....

alexandrecuer commented 4 years ago

J'ai fait quelques tests pour comparer avec ta façon de calculer l'ECS.... il y a un petit décalage du fait que tu faisais partir tout du 1er mai, ce qui n'est pas le milieu de l'année..... pour moi le calcul ne doit pas dépendre de summerstart, qui n'est que le point à partir duquel on décide de lancer la simulation

ECS

seviprince commented 4 years ago

Je suis parfaitement d'accord avec vous sur le fait de prendre le 1er janvier comme point de départ. Désolé si je ne suis pas trop dans le code aujourd'hui. Je suis un peu plus dans la rédaction du mémoire.

alexandrecuer commented 4 years ago

cf https://github.com/seviprince/dromotherm/blob/vardeb/examples/mod1D/couplage.py

on peut générer 8 usecases désormais, vous pouvez les tester : configuration cas d'usage
usecase=0 avec ECSupply=False recharge du stock été sans consommation aucune
usecase=0 avec ECSupply=True consommation estivale d'ECS
usecase=1 avec ECSSupply=False dromotherme été pour recharge du stock puis utilisation pour chauffage sur début hiver
usecase=1 avec ECSSupply=True dromotherme été pour recharge du stock puis utilisation pour chauffage+ECS sur début hiver
usecase=2 avec ECSSupply=False dromotherme toute l'année et utilisation pour chauffage sur hiver entier
usecase=2 avec ECSSupply=True dromotherme toute l'année et utilisation pour chauffage+ECS sur hiver entier
usecase=3 avec ECSSupply=False dromotherme été + hiver si rayonnement au dessus d'un seuil et utilisation pour chauffage sur hiver entier
usecase=3 avec ECSSupply=True dromotherme été + hiver si rayonnement au dessus d'un seuil et utilisation pour chauffage+ECS sur hiver entier

cf

https://github.com/seviprince/dromotherm/blob/51648d745acde37a81b680c0c4595607fe8ce222/examples/mod1D/couplage.py#L391

https://github.com/seviprince/dromotherm/blob/51648d745acde37a81b680c0c4595607fe8ce222/examples/mod1D/couplage.py#L392

alexandrecuer commented 4 years ago

@seviprince : il faudra que tu reprennes le notebook https://github.com/seviprince/dromotherm/blob/master/01_couplage.ipynb les éléments d'algorithmique ne sont plus bons....

fbernard494 commented 4 years ago

Oui et il faudra écrire précisément tous les algos utilisés pour Dromotherme, la PAC, le stockage, à l'identique de ce qui est codé. On retrouvera nos petits comme ça ! On pourra donner d'ailleurs un nom de version au code, tel que renseigné dans le mémoire, non ?

alexandrecuer commented 4 years ago

Oui, on peut faire des releases Je vais en faire une

seviprince commented 4 years ago

@seviprince : il faudra que tu reprennes le notebook https://github.com/seviprince/dromotherm/blob/master/01_couplage.ipynb les éléments d'algorithmique ne sont plus bons....

Bonjour monsieur, D'accord. Je m'y mets

alexandrecuer commented 4 years ago

Ok prends ton temps et surtout bien se plonger dans la dernière version du code...

seviprince commented 4 years ago

Bonsoir monsieur, Voici une portion du code:

dro=agenda_dro[i]
    pac=agenda_pac[i]
    **y = Tsable[i-1]**
    if pac == 1 :
        **Tinj_pac[i] = y-C*Pgeo[i]/k**
        Tsor_pac[i] = Tinj_pac[i]-Pgeo[i]/(mpac*cpac)
    else:
        Tinj_pac[i] = Tinj_pac[i-1]
        Tsor_pac[i] = Tsor_pac[i-1]

Je ne comprends pas pourquoi vous posez y = Tsable[i-1] (ligne 72) au lieu de y = Tsable[i] Puisque Tinj_pac[i] = y-C*Pgeo[i]/k ( il y a un décalage entre Pgeo et y dans ce cas je pense.)

seviprince commented 4 years ago

Ou soit Pgeo[i-1] au lieu de Pgeo[i]

alexandrecuer commented 4 years ago

Hello

A ce stade, tu ne pourrais poser y=Tsable[i] car il n'est pas calculé...en fait nous avons toutes les valeurs de l'étape i-1 et nous voulons celles de l'étape i....mais bien sur, par construction, nous connaissons Pgeo a toutes les étapes....

d'après le notebook, si y est la température du stock au début de l'étape i et Pgeo[i] la puissance que nous avons prévu de consommer a l'étape i, nous pouvons écrire :

Tinj_pac[i] = y-C*Pgeo[i]/k

c'est ainsi que nous procédions lorsque nous utilisions Runge-Kutta donc j'ai gardé cette façon de faire et tu l'avais toi aussi gardé en fait lorsque tu as abandonné RK....

Ceci dit je te le concède on pourrait faire :

https://github.com/seviprince/dromotherm/blob/0019cd88254592841836b17ec4f6ac5b9aa5c30a/examples/mod1D/couplage.py#L94

Avant

https://github.com/seviprince/dromotherm/blob/0019cd88254592841836b17ec4f6ac5b9aa5c30a/examples/mod1D/couplage.py#L80

et donc dans le if dro==1: blabla else: blabla on pourrait remplacer y par Tsable[i]

Mais à mon avis, cela a peu d'impact....

Alexandre

alexandrecuer commented 4 years ago

Tu as raison...Il y a bien un problème.... voici 2 graphiques, l'un sans aucun prélèvement du bâtiment, l'autre avec un besoin ECS à satisfaire... on dirait que le besoin ECS est satisfait par la PAC mais aucun effet sur le stockage...

RAS

ECS

alexandrecuer commented 4 years ago

Il y a bien une différence toutefois....sans ECS, le stock finit à 20°C à la sortie de l'été...avec ECS, c'est plutôt 17.5°C

cf des zooms

ECSzoom

RASzoom

alexandrecuer commented 4 years ago

j'ai proposé une modification, peut-être les choses seront-elles plus claires ainsi ?

le calcul des valeurs pour l'état i se fait en 3 étapes :

1) On applique StockLoop avec les résultats de l'état précédant, ce qui nous permet de calculer Tsable[i]. On pose y = Tsable[i]

2) On calcule les températures d'injection et de sortie de la PAC :

if pac == 1 :
    Tinj_pac[i] = y-C*Pgeo[i]/k
    Tsor_pac[i] = Tinj_pac[i]-Pgeo[i]/(mpac*cpac)
else:
    Tinj_pac[i] = Tinj_pac[i-1]
    Tsor_pac[i] = Tsor_pac[i-1]

3) On réalise ensuite une itération de dromotherme selon 2 cas distincts. Cette étape va nous permettre de calculer les valeurs de Tsor_dro[i], Tinj_dro[i], T sor_sto[i] et Tinj_sto[i]

- cas 1 : le dromotherme est en marche et le fluide circule avec un débit unitaire qdro_u : on récupère de l'énergie et on alimente le stockage via l'échangeur de séparation de réseaux. 
```
dromo.iterate(i,Tinj_dro[i-1]+kelvin,qdro_u)
Tsor_dro[i]=dromo.T[i,1,-1]-kelvin
Tsor_sto[i] = ( k * y + B * Tsor_dro[i] ) / ( k + B)
Tinj_sto[i] = Tsor_sto[i] + coeff * eff * (Tsor_dro[i] - Tsor_sto[i])
Tinj_dro[i] = Tsor_dro[i] - eff * (Tsor_dro[i] - Tsor_sto[i])
```      
- cas 2 : le dromotherme est à l'arrêt : le débit est nul et l'échangeur de séparation de réseau ne tourne pas. On calcule `Tsor_dro[i]` en utilisant `dromo.iterate(i,Tinj_dro[i-1]+kelvin,0)`

  - pas de prélèvement par l'échangeur de séparation de réseau : `Tinj_dro[i] = Tsor_dro[i]`

  - fonctionnement à perte nulle pour le stockage: `Tsor_sto[i]=Tsor_sto[i-1]` et `Tinj_sto[i]=Tinj_sto[i-1]` 

Nota : dans le notebook, lorsque tu décris l'algorithme, tu peux citer le code comme je viens de le faire, c'est fait pour.....d'ailleurs, tu pourrais presque reprendre cette rédaction en l'illustrant par un logigramme en plus...on peut en faire dans calc de manière assez simple.....qu'en penses-tu ?

alexandrecuer commented 4 years ago

autre précision : j'ai fait évoluer le code pour qu'il ait un fonctionnement ressemblant à celui d'une API..... pour changer de cas d'usage, plus besoin de modifier le code, on peut faire :

python couplage.py True 0

celà te fait tourner le cas d'usage 0 avec ECS

j'ai aussi activé les workflows de github (il faut aller dans l'onglet actions pour voir les résultats des actions....celà permet de tester la syntaxe du code avec un outil qui s'appelle flake8 et aussi de faire tourner le code et de produire des sorties automatiquement (pas encore finalisé)

seviprince commented 4 years ago

Bonjour monsieur, L'idée du logigramme est une bonne idée..elle va bien illustrer le fonctionnement. Je vais intégrer votre nouvelle proposition dans le code et voir ce que ça donne.

seviprince commented 4 years ago

j'ai proposé une modification, peut-être les choses seront-elles plus claires ainsi ?

le calcul des valeurs pour l'état i se fait en 3 étapes :

  1. On applique StockLoop avec les résultats de l'état précédant, ce qui nous permet de calculer Tsable[i]. On pose y = Tsable[i]
  2. On calcule les températures d'injection et de sortie de la PAC :
if pac == 1 :
    Tinj_pac[i] = y-C*Pgeo[i]/k
    Tsor_pac[i] = Tinj_pac[i]-Pgeo[i]/(mpac*cpac)
else:
    Tinj_pac[i] = Tinj_pac[i-1]
    Tsor_pac[i] = Tsor_pac[i-1]
  1. On réalise ensuite une itération de dromotherme selon 2 cas distincts. Cette étape va nous permettre de calculer les valeurs de Tsor_dro[i], Tinj_dro[i], T sor_sto[i] et Tinj_sto[i]

    • cas 1 : le dromotherme est en marche et le fluide circule avec un débit unitaire qdro_u : on récupère de l'énergie et on alimente le stockage via l'échangeur de séparation de réseaux.
    dromo.iterate(i,Tinj_dro[i-1]+kelvin,qdro_u)
    Tsor_dro[i]=dromo.T[i,1,-1]-kelvin
    Tsor_sto[i] = ( k * y + B * Tsor_dro[i] ) / ( k + B)
    Tinj_sto[i] = Tsor_sto[i] + coeff * eff * (Tsor_dro[i] - Tsor_sto[i])
    Tinj_dro[i] = Tsor_dro[i] - eff * (Tsor_dro[i] - Tsor_sto[i])
    • cas 2 : le dromotherme est à l'arrêt : le débit est nul et l'échangeur de séparation de réseau ne tourne pas. On calcule Tsor_dro[i] en utilisant dromo.iterate(i,Tinj_dro[i-1]+kelvin,0)

      • pas de prélèvement par l'échangeur de séparation de réseau : Tinj_dro[i] = Tsor_dro[i]
      • fonctionnement à perte nulle pour le stockage: Tsor_sto[i]=Tsor_sto[i-1] et Tinj_sto[i]=Tinj_sto[i-1]

Nota : dans le notebook, lorsque tu décris l'algorithme, tu peux citer le code comme je viens de le faire, c'est fait pour.....d'ailleurs, tu pourrais presque reprendre cette rédaction en l'illustrant par un logigramme en plus...on peut en faire dans calc de manière assez simple.....qu'en penses-tu ?

La modification que vous aviez apportée est plus compréhensible. Je m'y retrouve cette fois-ci

alexandrecuer commented 4 years ago

désormais on va utiliser les workflows....

c'est très pratique : j'en ai crée un appelé couplage1, chacun d'entre nous peut en créer..... le workflow se lance après chaque modification de quelque chose dans le code... pour ce qui est de couplage1:

image

En page d'accueil on peut afficher le status de ces workflow, via un système de badge....celà permet de suivre la qualité de code : image

pour créer un workflow, il faut aller dans le répertoire ./github/workflows et créer un fichier yml avec la syntaxe qui va bien.....

image

seviprince commented 4 years ago

D'accord.