#ifndef CTYPE2_H #define CTYPE2_H /** @author Antoine Rozenknop */ #include "indices.h" #include "lecture.h" #include #include #include using std::vector ; using std::string ; class CConstraint ; /** * CProfile : profil de décroissance de la production */ class CProfile { public: CProfile(){} void lire(bool current, kWh bo) ; struct CPoint { CPoint(kWh ff, coeff_t cc) : f(ff), c(cc) {} kWh f ; /// fuel level coeff_t c ; /// production ratio of PMAX }; campaign_t k ; points_t Np ; /// Np[i,k] : number of profile points vector m_points ; } ; struct CIntervallesBO { kWh f0; kWh f1; kWh f2; CIntervallesBO() {f0=(kWh)(-1);f1=(kWh)0;f2=(kWh)(-1);} CIntervallesBO(kWh x, kWh y, kWh z) {f0=x;f1=y;f2=z;} bool contient(kWh x) {return (x>=(kWh)0 and x<=f0) or (x>=f1 and x<=f2);} }; /** * Centrales de type 2 */ class CConstraint13 ; class CType2{ public: CType2() {} void lire( timestep_t T); void corrigeTO( vector & liste ); string m_name ; /// nom de la centrale powerplants2_t i ; /// indice kWh XI ; /// stock initial campaign_t K ; /// nombre de campagnes private: vector m_DA ; /// DA[i,k] durée de l'outage des campagnes public: kWh m_CMMAX ; /// MMAX : current campaign (-1) max modulus private: vector m_MMAX ; /// MMAX[i,k] : max modulus vector m_RMAX ; /// RMAX[i,k] : max refuel vector m_RMIN ; /// RMIN[i,k] : min refuel vector m_Q ; /// Q[i,k] : refuel ratio public: kWh m_CBO ; /// BO : current campaign (-1) stock threshold private: vector m_BO ; /// BO[i,k] : stock threshold vector m_PMAX ; /// PMAX[i,t] vector m_EMAX ; /// PMAX[i,t] * 24h vector m_AMAX ; /// AMAX[i,k] : max stock before refueling vector m_SMAX ; /// SMAX[i,k] : max stock after refueling vector m_C ; /// C[i,k] : refueling cost /// coûts de recours dates vector m_C_pre ; /// cout_anticipation[k] vector m_C_post ; /// cout_report[k] /// coûts de recours recharges vector m_R_moins ; /// coût recharge en moins que prévu vector m_R_plus ; /// coût recharge plus que prévu public: euros_par_kWh CiTp1 ; /// C[i,T+1] : price of remaining fuel at end CProfile m_CPB ; /// decrease profile points of current campaign (-1) private: vector m_PB ; /// PB[i,k] : decrease profile of campaign k public: /** méthodes d'accès avec vérification du type d'indice */ inline wlen_t & DA (campaign_t k) { return m_DA[k]; } inline kWh & MMAX(campaign_t k) { return k>=0 ? m_MMAX[k] : m_CMMAX; } inline kWh & RMAX(campaign_t k) { return m_RMAX[k]; } inline kWh & RMIN(campaign_t k) { return m_RMIN[k]; } inline coeff_t & Q (campaign_t k) { return m_Q[k]; } inline kWh & BO (campaign_t k) { return k>=0 ? m_BO[k] : m_CBO; } inline kWh & EMAX(timestep_t t) { return m_EMAX[t]; } inline kW & PMAX(timestep_t t) { return m_PMAX[t]; } inline kWh & AMAX(campaign_t k) { return m_AMAX[k]; } inline kWh & SMAX(campaign_t k) { return m_SMAX[k]; } inline euros_par_kWh & C (campaign_t k) { return m_C[k]; } inline CProfile & PB (campaign_t k) { return k>=0 ? m_PB[k] : m_CPB; } inline euros_par_semaine Cpre (campaign_t k) { return m_C_pre [k]; } inline euros_par_semaine Cpost(campaign_t k) { return m_C_post[k]; } inline euros_par_kWh Cmoins(campaign_t k) { return m_R_moins[k]; } inline euros_par_kWh Cplus (campaign_t k) { return m_R_plus[k]; } public: /** pointeurs vers les contraintes de type 13 à 21 concernant la centrale */ std::vector m_constraints ; /** * pour les contraintes de type 13, on stocke dans la centrale les bornes * de chaque outage */ private: std::vector< week_t > m_TO ; // dim : K std::vector< week_t > m_TA ; // dim : K public: inline week_t & TO(campaign_t k) {return m_TO[k];} inline week_t & TA(campaign_t k) {return m_TA[k];} /// production sur BO au temps t kWh PB ( campaign_t k, timestep_t t, kWh fuel); CIntervallesBO PBlimits ( campaign_t k, timestep_t t, CIntervallesBO limits); CIntervallesBO PBlimits ( campaign_t k, timestep_t t, kWh cut, kWh in_f1, kWh in_f2 ); private: kWh PBmin ( campaign_t k, timestep_t t, kWh fuel); kWh PBmax ( campaign_t k, timestep_t t, kWh fuel); kWh PBinverse0 ( campaign_t k, timestep_t t ); public: /// production sur BO sur une durée fixée, partant d'une semaine fixée kWh PB ( campaign_t k, kWh fuel, week_t h1, wlen_t duree ) ; CIntervallesBO PBlimits ( campaign_t k, week_t h1, wlen_t duree, CIntervallesBO limits); /// durée minimale en semaines pour vider la centrale sur BO à partir d'une semaine fixée wlen_t longueur_BO ( campaign_t k, kWh fuel, week_t h1 ) ; /// niveau de fuel permettant d'atteindre le niveau y après le temps t, sur BO kWh back_level( campaign_t k, timestep_t t, kWh y, CIntervallesBO PBlimits ); private: // structure pour accélérer le calcul des productions sur BO struct PBentree { double hash; PBentree( campaign_t k, kWh fuel, week_t h1, wlen_t duree ); bool operator<(const PBentree & o) const { return ( hash m_pbentree_map ; }; #endif