Do arquivo de coordenadas
ao espectro comparativo
O workflow encadeia três domínios — mecânica quântica (Gaussian), mecânica estatística (DICE) e análise espectral (Python). A automação conecta essas camadas sem eliminar as decisões científicas.
.gjf inicial é submetido para otimização de baixo custo (PM3 ou HF/STO-3G). A geometria convergida é exportada como coords_optimized.xyz — porta de saída para todos os estágios seguintes.coords_optimized.xyz e templates Jinja2, o gerador cria os .gjf para cada combinação método × base × configuração (in vacuo, PCM, SP). Scripts SLURM/PBS gerados junto. Trocar método é editar o config.yaml.afterok. Após cada opt+freq, o freq_checker verifica frequências imaginárias e dispara rerun com calcfc se necessário. SP e solvente explícito são excluídos da verificação..log e convertidas para parâmetros Lennard-Jones (.dfr + .pot). Caixa de solvatação com condições periódicas e dice.inp montados automaticamente.shell_N.xyz..gjf de SP para cada método, gerados pelos mesmos templates. Frequências imaginárias aqui são esperadas e não disparam reruns..log via cclib: frequências, Raman/IR, SCF, ZPVE, entropia, dipolo, HOMO/LUMO, gap óptico (TD-DFT). Scaling por método aplicado automaticamente. Tabelas .xlsx e .csv para os três ambientes.Estrutura de pastas
espelha o workflow
Cada pasta corresponde a um estágio. A numeração força a ordem de execução. O código reutilizável fica separado dos dados — ao aplicar o pipeline para uma nova molécula, copia-se a estrutura de dados, não o código.
coords_optimized.xyz (01→02), chelpg/ (02→03), shell_N.xyz (03→04). Nenhum estágio lê diretamente de dentro de outro — a automação entre estágios é trivial e o debugging é localizado.
Flexível em métodos,
bases e escala
Toda parametrização do pipeline reside em config.yaml. Trocar de método, adicionar uma função de base, ajustar o fator de escala ou mudar o modelo de solvatação é editar esse arquivo — nenhum código precisa ser tocado.
methods aceita qualquer funcional reconhecido pelo Gaussian. Adicionar wB97X-D ou MP2 é incluir uma entrada na lista.
| Método | Uso típico |
|---|---|
HF | Referência histórica, scaling 0.909 |
B3LYP | Vibracional geral |
CAM-B3LYP | UV-Vis / transferência de carga |
M06-2X | Interações não-covalentes |
.gjf.
| Método | Base padrão |
|---|---|
HF | 6-311++G(d,p) |
B3LYP | 6-311++G(d,p) |
CAM-B3LYP | aug-cc-pVDZ |
M06-2X | 6-311++G(d,p) |
| Método | Fator | Fonte |
|---|---|---|
HF | 0.909 | Merrick 2007 |
B3LYP | 0.967 | Merrick 2007 |
CAM-B3LYP | 0.983 | NIST |
M06-2X | 0.983 | NIST |
| Parâmetro | Padrão |
|---|---|
solvent | water |
pcm_model | PCM | SMD | CPCM |
mddf_cutoff | 2.5 Å |
n_molecules | 1330 |
molecule: h2o charge: 0 | multiplicity: 1 solvent: water | pcm_model: PCM # PCM | SMD | CPCM methods: # adicionar/remover aqui — sem tocar no código - name: HF | basis: 6-311++G(d,p) | scaling: 0.909 - name: B3LYP | basis: 6-311++G(d,p) | scaling: 0.967 - name: CAM-B3LYP | basis: aug-cc-pVDZ | scaling: 0.983 - name: M06-2X | basis: 6-311++G(d,p) | scaling: 0.983 freq_check: max_cycles: 3 skip_stages: [sp, sp_explicit, explicit] dice: n_steps_thermalization: 80000 | n_steps_sampling: 80000 n_molecules_solvent: 1330 | mddf_cutoff: 2.5 scheduler: slurm # slurm | pbs | local memory: "8GB" | nproc: 8 | walltime: "12:00:00" slurm_partition: short scratch: base_dir: /scratch/$USER/ cleanup_on_fail: true keep_chk: false # .chk são grandes — remover após extração notify_email: "" # opcional: alerta em caso de falha
A lógica por trás
de cada escolha
O pipeline não é uma sequência de scripts colados — cada decisão de implementação tem uma razão técnica ou científica.
opt.gjf.j2, freq.gjf.j2, sp.gjf.j2..xyz puro, não como .chk. O .chk é binário e depende da versão exata do Gaussian. O .xyz é portável, versionável no git e abre em qualquer visualizador.subprocess, processa. Não há ganho em reescrever o núcleo.cclib lê Gaussian, ORCA, NWChem e outros com a mesma API. Adicionar suporte a ORCA no futuro não exige reescrever os parsers. Frequências, Raman, IR, ZPVE, HOMO/LUMO e TD-DFT cobertos nativamente.max_cycles.pipeline/, os dados em 01_ a 05_. Para uma nova molécula, copia-se a estrutura de dados e ajusta o config.yaml — o código não é duplicado nem modificado.Cluster sempre trabalhando,
nunca sobrecarregado
A estratégia garante que o computador institucional esteja sempre ocupado com o próximo job disponível, mas que nunca mais de um estágio pesado rode simultaneamente — o gargalo é controlado por dependências de jobs, não por supervisão manual.
afterok — continua somente em sucessoafternotok — aciona tratamento de falhaafterany — aciona limpeza de scratch sempre
afterok garante que o estágio 03 (DICE, pesado em memória e I/O) só seja submetido depois que todos os jobs do estágio 02 terminaram com sucesso. O pesquisador não precisa supervisionar — o scheduler controla a ordem.
Limpeza de scratch em caso de falha
O /scratch do cluster é rápido mas finito e compartilhado. Jobs interrompidos deixam arquivos temporários grandes (.chk, Gau-*, arquivos de restart do DICE) que ocupam espaço e podem corromper reruns. O scratch_cleaner.py cuida disso automaticamente.
$SCRATCH_DIR do ambiente ou do config.yaml. Identifica o subdiretório pelo $SLURM_JOB_ID passado como argumento..log parcial e o último .chk (se configurado) para o diretório de output do projeto. Podem conter geometria útil para resubmissão manual.Gau-*, *.rwf, *.d2e, *.int, *.skr, restarts do DICE (*.rst, cfgs/ parciais). Mantém .log e .gjf originais.pipeline_events.log: timestamp, job ID, estágio, motivo da falha (FAILED / TIMEOUT / CANCELLED) e arquivos removidos.notify_email estiver no config.yaml, envia um resumo com nome do job, estágio e link para o log de eventos via mail./scratch pode ser limpo pela administração sem aviso. Todos os .log, .xyz e saídas de análise devem ser escritos diretamente no diretório do projeto ou copiados pelo próprio job antes de terminar.
Verificador de frequências
imaginárias — freq_checker
Uma frequência negativa num cálculo de frequências (não SP) indica que a geometria não convergiu para um mínimo real — o sistema está num ponto de sela. O freq_checker.py automatiza a detecção e a correção.
Normal termination no .log — se ausente, status error imediatogeometry_cycleN.xyz. Salvo para inspeção antes de qualquer resubmissão.opt=(calcfc,maxcycles=100). O calcfc força cálculo analítico das constantes de força — estratégia padrão para pontos de sela.afterok do rerun.max_cycles. Relatório JSON gerado, log de erro visível. Ação manual necessária.calcfc constrói uma hessiana correta antes de qualquer passo, aumentando muito a probabilidade de convergir para o mínimo real.
sp, sp_explicit e explicit — frequências imaginárias nesses estágios são consequência esperada da construção do sistema, não um erro de otimização.