May 19, 2011

simpleFoam: Estudando o controlDict

Há um grande interesse em simulações de escoamentos monofásicos, incompressíveis, sem transferência de calor ou massa, estacionária e turbulenta. E para essas simulações, há o simpleFoam. Vou escrever alguns textos sobre esse aplicativo que eu estou estudando, e vou começar do começo e ir até o código. Esclareço que não explicarei como instalar o OpenFOAM ou mesmo como é a estrutura básica de arquivos. Se interessar ou se for necessário, pode observar os slides nesse outro tópico do blog, especialmente o que está marcado como "dia 1".

Para mim não há melhor começo do que o tutorial e para isso eu seleciono o pitzDaily.

Para começar o estudo, eu sugiro copiar o tutorial em questão para seu diretório de rodada (se já não o tiver feito, claro).
cp -r $FOAM_TUTORIALS/incompressible/simpleFoam/pitzDaily  $FOAM_RUN
cd $FOAM_RUN/pitzDaily 
Não quero entrar em detalhes sobre a geração de malha. Isso porque o tutorial utiliza o blockMesh e eu não o considero uma alternativa produtiva quando comparada as soluções de trabalho que existem, portanto, pulo essa etapa pedindo que digite no diretório do caso:
blockMesh
Como isso é um tutorial, o próximo passo para ter a simulação pronta é digitar no terminal o comando:
simpleFoam
o que significa rodar o aplicativo para o caso estabelecido. Feito isso, o caso está pronto para ser visualizado no ParaView (paraFoam) ou em qualquer outro visualizador de sua preferência compatível. Mas isso apenas muito adiante.

Nessa série de estudos me interessa descrever toda a configuração do caso para compreender aquilo que pode (ou deve) ser modificado caso a caso.

Alerto que eu vou omitir o cabeçalho do arquivo apresentado.

O primeiro arquivo que vou analisar o é controlDict (e por isso o título do tópico). Todas as informações relevantes podem ser encontradas na documentação oficial.
FoamFile
{
    version     2.0;
    format      ascii;
    class       dictionary;
    object      controlDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

application     simpleFoam;
startFrom       startTime;
startTime       0;
stopAt          endTime;
endTime         1000;
deltaT          1;
writeControl    timeStep;
writeInterval   50;
purgeWrite      0;
writeFormat     ascii;
writePrecision  6;
writeCompression uncompressed;
timeFormat      general;
timePrecision   6;
runTimeModifiable yes;

// ************************************************************************* //

A primeira parte do arquivo compõe um dicionário chamado FoamFile, que configura algumas informações características para os arquivos de entrada e saída. A tabela 4.1 da documentação do usuário explica alguns argumentos desse item. Reproduzo-o abaixo.


Bom, o controlDict é nome do arquivo (objeto) que é um arquivo de dicionário (class), a versão foi definida por alguém (e não me pergunte quem ou porque é 2.0), o formato desse arquivo é ascii (porque não é binário ! Afinal, você o está lendo). A localização (location) é uma configuração opcional e eu realmente não conheço motivo para querer utilizar essa opção.

Seguindo ao "dicionário" FoamFile existe uma série de palavras-chaves com seus respectivos argumentos. Adianto que no exemplo estudado aqui nem tudo que é possível utilizar foi utilizado. O formato dessas informações segue o estilo:
<keyword>  <dataentry1> … <dataentryn>;
ou
<keyword>  <dataentry>;

Quero descrever apenas aquilo que está no controDict aqui apresentado, para outras opções aguarde outros tópicos ou busque o manual do OpenFOAM.
  • application : contém o nome do aplicativo que resolve o problema. No nosso caso, simpleFoam. O OpenFOAM tenta manter a coerência dos nomes de aplicativos, objetos e referências sempre que possível, mesmo quando seria obrigatório, o OpenFOAM faz ser obrigatório para facilitar o entendimento.
  • startFrom : controla o instante de tempo que inicia a simulação. Há três opções possíveis, firstTime, que inicializa o caso a partir do diretório que representa o menor tempo, startTime, onde usuário define qual é o valor do ponto inicial, se zero, como no exemplo, produz o mesmo efeito que firstTime, e, por fim, o latestTime, que inicia a simulação a partir do último diretório de tempo criado e é muito útil para reiniciar rodadas.
  • startTime : quando startFrom é igual a startTime, o valor desse tempo deve ser especificado nessa variável. O tempo aqui e em todos os demais locais estão em segundos.
  • stopAt : controla o instante de tempo que encerra a simulação. Pode-se utilizar, endTime, writeNow, noWriteNow e nextWrite. A oção endTime define o ponto de conclusão como provavelmente o usuário escreveu na folha de papel. As demais opções são para interrupção antes de endTime. Sendo writeNow  e noWriteNow imposição de interrupção imediata, porém no primeiro caso escrevendo o resultado final e no segundo sem escrever o resultado final. Normalmente, o intervalo de escrita dos resultados é bem maior do que o passo de tempo. Sendo assim, a opção nextWrite é quando o usuário quer esperar mais alguns passos de tempo antes de interromper a rodada, mas precisamente, esperar até a próxima escrita programada de dados para interromper.
  • endTime : variável que define o ponto de interrupção da rodada quando stopAt está especificado. É usual que isso seja necessário. 
  • deltaT : intervalo de tempo da simulação.
  • writeControl : forma de controlar a escrita de dados. Vou me reter a explicar o que eu considero útil. A opção timeStep e a opção clockTime. A opção timeStep indica que será utilizado writeInterval  intervalos de tempo para escrever os arquivos. É usual que essa opção seja utilizada em um caso transiente. A opção clockTime, pela natureza do funcionamento do OpenFOAM, me parece bem útil em simulações estacionárias com malha realmente grande, quando escrever o resultado uma ou duas vez por dia (intervalo de tempo marcado no relógio e sem vínculo com a simulação) é uma boa idéia por conta de backups.
  • writeInterval : este valor é o período em que os resultados da simulação serão salvos. No caso estudado deseja-se salvar a simulação a cada 50 passos de tempo. Uma dica para definir esse valor é primeiro escolher o intervalo de tempo que se deseja salvar os resultados da simulação, como a cada 1 segundo por exemplo, e o seu passo de tempo (deltaT),  por exemplo igual a 0.5 segundos, então o valor que deve ser especificado no writeInterval é o resultado da divisão do tempo desejado para arquivo dos dados (1s) pelo deltaT (0.5s) e, portanto, igual a 2. Observe apenas que esse número deve ser um número inteiro, pois o resultado será salvo a cada writeInterval números de passo de tempo.  
  • purgeWrite : serve para especificar quando o usuário quer que apenas os últimos purgeWrite valores de resultados escritos sejam guardados. Tem sua utilidade em casos transientes, mas sua verdadeira utilidade está nos casos estacionários (como o nosso). Utilizar purgeWrite igual a 1 fará com que apenas o último instante de tempo seja salvo, ou seja, exatamente o que interessa na simulação estacionária. Note que no nosso exemplo foi utilizado zero. Assim foi feito porque assim estava no meu tutorial, mas isso apenas significa espaço consumido no HD. O que é insignificante no caso do tutorial, mas faça isso com uma malha de 14 milhões de nós e vai entender o que quero dizer.
  • writeFormat : indica o formato do arquivo. Existem duas opções, ascii e binary. Normalmente eu uso ascii, mas...
  • writePrecision : indica o número de algarismos significativos dos resultados quando usar-se ascii na opção de writeFormat. O valor seis pode lhe parecer pequeno, mas se o número for muito grande há aumento do tamanho consumido pelos resultados. Não significa que um valor de 0.000000001 não seja representado. Pelo contrário, os zeros a esquerda são desconsiderados na hora de escrever esse número. O problema maior é quando o número é muito grande (maior que 999999). Nesse caso acontece um arredondamento sinistro (eu não tenho outra palavra!). Compare o valor do campo de velocidade do resultado simulado com a configuração padrão e modificando o valor dessa variável para 2 para ver o que eu estou falando. Use o instante de tempo de 100 segundos para melhor ver o arredondamento grosseiro na escrita.
  • writeCompression : informa se os dados escritos serão comprimidos (compressed) ou não possuíram qualquer compressão (uncompressed). Os dados comprimidos ocupam muito menos espaço, mas há o trabalho extra de comprimi-los. Nunca avaliei os custos envolvidos. Normalmente uso o padrão, que o uncompressed.
  • timeFormat : há opções, mas francamente, deixe em general. Essa opção configura o nome dos diretórios onde escreve-se os resultados.
  • timePrecision : novamente, falando francamente, deixe em 6 se usar o general no timeFormat. Essa valor configura o número de dígitos que será utilizado escrever os diretórios. Um problema é quando o tempo é muito pequeno, nesse caso, 6 seria um  número ruim, porém, se seguiu meu conselho em timeFormat não precisará se preocupar com isso.
  • runTimeModifiable : configura se é (yes) ou não é (no) possível realizar modificações durante a rodada. Em termos práticos, a opção no (que não permite modificar as condições) somente faz sentido para simulações conhecidas. A vantagem é que o OpenFOAM não perde tempo verificando se o arquivo controlDict foi modificado a cada passo de tempo.
Existem algumas coisas a mais que podem ser feitas, como adicionar funções e bibliotecas, mas cada caso é algo muito particular e eu não conseguiria explicar tudo em um texto genérico. Um exemplo MUITO útil é a adição de pontos de monitoramento que já foi explicado nesse blog.

Acrescento, por fim, uma informação que eu não testei e que não está sendo utilizada nesse arquivo de exemplo mais é listada no manual, o graphFormat. Essa opção permite configurar o formato do arquivo facilitando a interpretação do mesmo em diferentes programas de produção de gráficos, como o gnuplot e o grace.

Como esse é o primeiro texto de uma série, cabe esclarecer que ela vai ser escrita porque eu estou fazendo do Notas em CFD o meu caderno de anotações e eu preciso aprender o que estou escrevendo. Sim, meus caros, eu estou estudando e compartilhando minhas anotações com outras pessoas. Estou utilizando o OpenFOAM-1.6-ext.

[update 29/05/2011]
Agradecimento especial a Livia pelas sugestões acrescentadas e modificadas na data dessa atualização no item writeInterval.
[/update 29/05/2011]

No comments:

Post a Comment