← Daniel Acosta Escareño

Clúster HPC UAF · Guía de uso

Cálculos con FLOSIC

Cómo preparar, enviar y revisar un cálculo de FLOSIC2020 en el clúster de la Unidad Académica de Física, desde el primer archivo hasta leer la energía final.

Qué es FLOSIC

FLOSIC es un programa de estructura electrónica para átomos y moléculas (no maneja sistemas periódicos). Resuelve las ecuaciones de Kohn-Sham con bases gaussianas y aplica la corrección de autointeracción Fermi-Löwdin (FLO-SIC), que elimina el error de autointeracción de los funcionales LDA, GGA y meta-GGA. Está basado en NRLMOL y lo desarrolla el grupo de la Universidad de Texas en El Paso.

Además de las posiciones de los átomos, FLOSIC usa las posiciones de los FODs (Fermi-orbital descriptors): un punto en el espacio por cada electrón, que se puede ver como una “posición clásica” del electrón. El programa calcula fuerzas sobre los FODs y los va moviendo hasta minimizar la energía.

Versión

FLOSIC2020

Módulo

flosic/2020

Partición

opteron (n01, n02)

Por nodo

4 núcleos · 3 GB

No se ejecuta en galileo

galileo es el nodo de acceso: ahí se preparan los archivos y se envían los trabajos, pero los cálculos corren en los nodos de cómputo a través de Slurm. Si intentas module load flosic/2020 en galileo verás un mensaje de error con instrucciones; es lo esperado.

Archivos de ejemplo

El ejemplo es la molécula de LiH de la documentación oficial. Descarga los cuatro archivos y súbelos a un directorio en tu cuenta de galileo, o créalos directamente siguiendo los pasos de abajo.

flosic.sbatch CLUSTER FRMORB NRLMOL_INPUT.DAT

Paso a paso

1. Crea un directorio para el cálculo

FLOSIC escribe unos 50 archivos en el directorio donde corre. Usa un directorio distinto para cada cálculo; si reutilizas uno, los archivos del cálculo anterior pueden mezclarse con el nuevo.

mkdir -p ~/flosic/lih && cd ~/flosic/lih

2. Geometría: CLUSTER

Define el funcional, la simetría, los átomos (coordenadas en bohr, número atómico y ALL para todos los electrones), la carga neta y el espín neto.

CLUSTER
GGA-PBE*GGA-PBE           (DF TYPE EXCHANGE*CORRELATION)
NONE                      (TD, OH, IH, X, Y, XY, ... OR GRP)
2                         (NUMBER OF INEQUIV. ATOMS)
0.0000 0.0000 0.0000 3 ALL
0.0000 0.0000 3.0139 1 ALL
0.0 0.0                   (NET CHARGE AND NET SPIN)

Otros funcionales: LDA-PW91*LDA-PW91, GGA-PBE*GGA-NONE (solo intercambio), etc. La lista completa está en la documentación.

3. Posiciones iniciales de los FODs: FRMORB

La primera línea dice cuántos FODs hay con espín arriba y con espín abajo. Siguen las coordenadas de los de espín arriba y después las de espín abajo. En general hay FODs cerca de cada núcleo (capas internas), en los enlaces y en los pares libres.

FRMORB
 2 2
0.000 0.000 0.000 1 1
0.000 0.000 2.500 1 2
0.000 0.000 0.000 1 1
0.000 0.000 2.500 1 2

Importante: dos columnas extra en cada FOD

Esta versión espera, después de x y z, el peso y la equivalencia de simetría de cada FOD. Sin simetría escribe 1 k, donde k es el número del FOD dentro de su espín (1, 2, 3… y vuelve a empezar en 1 para el espín abajo).

La documentación oficial todavía muestra solo x y z. Con ese formato el SCF termina, pero el programa se detiene al final con Fortran runtime error: Bad integer for item 4 in list input.

4. Opciones del cálculo: NRLMOL_INPUT.DAT

Si no existe, FLOSIC lo crea con valores por defecto, pero el valor por defecto de CALCTYPEV es 'LBFGS', que también mueve los átomos. Para optimizar solo los FODs usa el archivo de ejemplo, que trae:

CALCTYPEV     = 'SCF-ONLY'

Otras opciones útiles: MAXSCFV (máximo de iteraciones SCF), SCFTOLV (tolerancia), SPNPOLV = 'Y' para cálculos con espín polarizado y DFTD3V = 'Y' para la corrección de dispersión de Grimme.

5. El script de Slurm: flosic.sbatch

flosic.sbatch
#!/bin/bash
#SBATCH -J flosic
#SBATCH -p opteron            # nodos n01 y n02 (AMD Opteron, 4 núcleos)
#SBATCH -N 1                  # FLOSIC corre en un solo nodo
#SBATCH -n 4                  # 4 procesos MPI = todos los núcleos del nodo
#SBATCH --mem=3G              # el nodo tiene ~3.8 GB disponibles
#SBATCH -o %x-%j.out          # salida: flosic-<jobid>.out

set -euo pipefail

module load flosic/2020

# Respaldo de los FODs de entrada antes de que el programa los mueva
cp FRMORB "FRMORB.antes-${SLURM_JOB_ID}"

srun --mpi=pmix nrlmol_exe

echo "Última iteración (IT, ..., EDFT+SIC en la 6a columna):"
tail -1 SUMMARY

6. Envía el trabajo y espera

sbatch flosic.sbatch
squeue -u $USER

Cuando ya no aparezca en squeue, revisa cómo terminó:

sacct -X -o JobID,JobName,NodeList,State,Elapsed | tail -5

El ejemplo de LiH tarda unos 4 minutos y debe terminar como COMPLETED.

Revisar resultados

ArchivoQué contiene
SUMMARYUna línea por iteración SCF. La 6a columna es la energía total con corrección, EDFT+SIC, en Hartree.
SIC_ENERGYDesglose de la corrección de autointeracción por orbital.
FRMORBPosiciones nuevas de los FODs, listas para el siguiente paso.
fforce.datFuerzas sobre los FODs.
recordsHistorial de energía, posiciones y fuerzas de cada paso.
flosic-<jobid>.outSalida del trabajo; aquí aparecen los errores si algo falla.
tail -1 SUMMARY
grep -iE 'error termination|fortran runtime' flosic-*.out

Para el LiH de ejemplo, la energía final debe ser ≈ −8.05283 Ha (la documentación da −8.052832) y el segundo comando no debe mostrar nada.

Optimizar los FODs

Cada ejecución hace un SCF completo y un solo paso de optimización de los FODs: al terminar, FRMORB ya tiene las posiciones nuevas. Para seguir optimizando, vuelve a enviar el mismo script en el mismo directorio:

sbatch flosic.sbatch

Repite hasta que la energía de SUMMARY deje de cambiar entre ejecuciones (por ejemplo, menos de 10−6 Ha) y las fuerzas en fforce.dat sean pequeñas. El script guarda una copia de los FODs de entrada (FRMORB.antes-<jobid>) por si necesitas regresar a un paso anterior.

Límites y recomendaciones

Más información