Tutorial

O inewave provê uma interface semelhante para todos os arquivos do modelo NEWAVE e para os programas auxiliares NWLISTCF e NWLISTOP. Para os arquivos de entrada, são implementadas as capacidades de leitura e escrita, permitindo uma geração automática de arquivos. Para os arquivos de saída, é implementada somente a capacidade de leitura, de modo a permitir análise facilitada de resultados.

A leitura dos arquivos é sempre implementada a partir do método read da respectiva classe, enquanto que a escrita dos arquivos é implementada pelo método write da instância em questão, quando for suportada.

Um exemplo é o processamento do arquivo de vazões históricas vazoes.dat. Sendo um arquivo de entrada, é permitido realizar a leitura e a escrita deste arquivo, modificando alguma informação de entrada caso seja desejado pelo usuário. Por exemplo, pode-se fazer uma sensibilidade de elevar em 10% todos os valores de vazões históricas, afetando o ajuste do modelo PAR(p):

from inewave.newave import Vazoes
arq_vazoes = Vazoes.read("./vazoes.dat")
arq_vazoes.vazoes

      1    2    3    4    5     6     7     8    ...  313   314  315  316  317  318  319  320
0     178  178    0    0    0  1476  1690  1737  ...  311   890  176  176    0   62   58   28
1     371  371    0    0    0  2964  3318  3385  ...  464  2025  195  190   10   82   76   35
2     326  326    0    0    0  2167  2471  2532  ...  538  1529  183  183    3   89   80   50
3     479  479    0    0    0  1585  1827  1879  ...  383   910  185  185    4   43   39   20
4     332  332    0    0    0  1254  1428  1463  ...  291   517  173  173    0   33   30   17
...   ...  ...  ...  ...  ...   ...   ...   ...  ...  ...   ...  ...  ...  ...  ...  ...  ...
1075    0    0    0    0    0     0     0     0  ...    0     0    0    0    0    0    0    0
1076    0    0    0    0    0     0     0     0  ...    0     0    0    0    0    0    0    0
1077    0    0    0    0    0     0     0     0  ...    0     0    0    0    0    0    0    0
1078    0    0    0    0    0     0     0     0  ...    0     0    0    0    0    0    0    0
1079    0    0    0    0    0     0     0     0  ...    0     0    0    0    0    0    0    0

[1080 rows x 320 columns]

arq_vazoes.vazoes *= 1.1
arq_vazoes.vazoes

        1      2    3    4    5       6       7    ...     314    315    316   317   318   319   320
0     195.8  195.8  0.0  0.0  0.0  1623.6  1859.0  ...   979.0  193.6  193.6   0.0  68.2  63.8  30.8
1     408.1  408.1  0.0  0.0  0.0  3260.4  3649.8  ...  2227.5  214.5  209.0  11.0  90.2  83.6  38.5
2     358.6  358.6  0.0  0.0  0.0  2383.7  2718.1  ...  1681.9  201.3  201.3   3.3  97.9  88.0  55.0
3     526.9  526.9  0.0  0.0  0.0  1743.5  2009.7  ...  1001.0  203.5  203.5   4.4  47.3  42.9  22.0
4     365.2  365.2  0.0  0.0  0.0  1379.4  1570.8  ...   568.7  190.3  190.3   0.0  36.3  33.0  18.7
...     ...    ...  ...  ...  ...     ...     ...  ...     ...    ...    ...   ...   ...   ...   ...
1075    0.0    0.0  0.0  0.0  0.0     0.0     0.0  ...     0.0    0.0    0.0   0.0   0.0   0.0   0.0
1076    0.0    0.0  0.0  0.0  0.0     0.0     0.0  ...     0.0    0.0    0.0   0.0   0.0   0.0   0.0
1077    0.0    0.0  0.0  0.0  0.0     0.0     0.0  ...     0.0    0.0    0.0   0.0   0.0   0.0   0.0
1078    0.0    0.0  0.0  0.0  0.0     0.0     0.0  ...     0.0    0.0    0.0   0.0   0.0   0.0   0.0
1079    0.0    0.0  0.0  0.0  0.0     0.0     0.0  ...     0.0    0.0    0.0   0.0   0.0   0.0   0.0

[1080 rows x 320 columns]

arq_vazoes.write("./vazoes.dat")

Se tratando dos arquivos de saída, não existe implementação para o método write, mas é possível realizar a leitura normalmente, e acessar todas as propriedades encontradas. Para o pmo.dat, por exemplo:

from inewave.newave import Pmo
arq_pmo = Pmo.read("./pmo.dat")
arq_pmo.convergencia

     iteracao  limite_inferior_zinf       zinf  ...  delta_zinf  zsup_iteracap           tempo
0           1             138791.52  233699.67  ...         NaN            NaN 0 days 00:01:26
1           1             136547.08  233699.67  ...         NaN            NaN             NaT
2           1             124349.93  233699.67  ...         NaN      129974.34             NaT
3           2             124900.33  237047.52  ...         NaN            NaN 0 days 00:01:37
4           2             123012.91  237047.52  ...         NaN            NaN             NaT
..        ...                   ...        ...  ...         ...            ...             ...
145        49             117421.66  268020.83  ...         NaN            NaN             NaT
146        49             106305.07  268020.83  ...       0.136      115517.88             NaT
147        50             118497.14  268378.30  ...         NaN            NaN 0 days 00:02:59
148        50             117421.66  268378.30  ...         NaN            NaN             NaT
149        50             106305.07  268378.30  ...       0.133      117230.85             NaT

[150 rows x 8 columns]

Via de regra, a maioria dos arquivos modelados pelo inewave não necessita que nenhum argumento além do caminho para o caso seja fornecido à função read. Todavia, ao se realizar o processamento de alguns dos arquivos binários, como o forward.dat e o cortes.dat, é necessário fornecer argumentos adicionais, visto que é necessária informação existente em outros arquivos para que a leitura seja feita corretamente. Por exemplo, para o energiaf.dat:

from inewave.newave import Energiaf
arq_energiaf = Energiaf.read(
        "./energiaf.dat",
        numero_forwards=2,
        numero_rees=1,
        numero_estagios=16,
        numero_estagios_th=12,
    )
arq_energiaf.energias

    estagio  ree  serie         valor
0       -11    1      1   7274.313246
1       -11    1      2  11945.751618
2       -10    1      1   7437.112877
3       -10    1      2   7687.093101
4        -9    1      1   7788.548023
5        -9    1      2  11399.842496
6        -8    1      1   5196.246300
7        -8    1      2   7111.996327
8        -7    1      1   5308.294925
9        -7    1      2   4970.571844
10       -6    1      1   5141.033372
11       -6    1      2   4015.610566
12       -5    1      1   3797.894460
13       -5    1      2   3682.614472
14       -4    1      1   3134.981601
15       -4    1      2   3233.576467
16       -3    1      1   3335.920508
17       -3    1      2   3762.190756

[56 rows x 4 columns]

Alguns arquivos do modelo NEWAVE podem sofrer alterações de sintaxe conforme são feitas atualizações no modelo. Desta forma, poderia ser necessário criar mais de uma classe para dar suporte ao mesmo arquivo. Todavia, o framework cfinterface possui uma modelagem para dar suporte a mais de uma versão do mesmo arquivo fazendo uso do método set_version de cada uma das classes. Entretanto, até o momento o uso deste método não foi necessário para nenhum arquivo do modelo NEWAVE, visto que as implementações feitas pelo desenvolvedor tendem a ser retrocompatíveis.