Crear un script para ejecutar de forma iterativa el programa bigstick.x y recopilar los resultados


#!/bin/bash

# Limpiar archivos de entrada previos
rm -f ../input/p* 

echo "Inicio de la ejecución: $(date)"

for (( idxProton=0; idxProton<=6; idxProton++ ))
do
    for (( idxNeutron=$idxProton; idxNeutron<=6; idxNeutron++ ))
    do
        protonCount=$((idxProton * 2))
        neutronCount=$((idxNeutron * 2))
        echo "Calculando para Np=$protonCount, Nn=$neutronCount"
        
        inputFile="../input/p${protonCount}n${neutronCount}_cin_bigstick.txt"
        rm -f "$inputFile"
        touch "$inputFile"
        
        # Configuración de la entrada para bigstick.x
        echo "e" >> "$inputFile"
        echo "../output/p${protonCount}n${neutronCount}" >> "$inputFile"
        echo "usdbpn" >> "$inputFile"
        echo "$protonCount  $neutronCount" >> "$inputFile"
        echo "0" >> "$inputFile"
        echo "upn" >> "$inputFile"
        echo "usdbpn" >> "$inputFile"
        echo "1 18 $(($protonCount + $neutronCount + 16)) 0.3" >> "$inputFile"
        echo "1 1 1 1 1" >> "$inputFile"
        echo "end" >> "$inputFile"
        echo "ld" >> "$inputFile"
        echo "5 2000" >> "$inputFile"
        
        # Ejecutar bigstick.x y medir el tiempo
        time ./bigstick.x < "$inputFile"
    done
done

Este script produce archivos de salida en la ruta ../output/pXnY.res, donde X e Y representan el número de protones y neutrones, respectivamente. El formato típico del archivo de resultados es el siguiente:


  BIGSTICK Version 7.8.4 Apr  2018
  single-particle file = usdbpn
           4           4
           0 +
         120  iterations

  State      E        Ex         J       T
    1    -87.10445   0.00000    -0.000   0.000
    2    -85.60215   1.50230     2.000   0.000
    3    -82.98830   4.11615     2.000   0.000
    4    -82.73201   4.37243     4.000   0.000
    5    -82.03408   5.07037     3.000   0.000

Para extraer las energías del estado fundamental de todos los núcleos par-par, se implementa una función en C++ que lee los archivos de resultados. Debido a la simetría de isospín en la interacción del modelo de capas, solo se calculan los núcleos con número de neutrones mayor o igual al de protones, y luego se asignan las energías a sus núcleos espejo.


#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

void ObtenerEnergiasFundamentales(double** energiasFondos) {
    const std::string directorio = "../p";
    const std::string extension = ".res";
    double energia;

    for (int protones = 0; protones <= 12; protones += 2) {
        for (int neutrones = protones; neutrones <= 12; neutrones += 2) {
            std::string nombreArchivo = directorio;
            // Construir el nombre del archivo con formato dinámico
            if (protones < 10) nombreArchivo += static_cast<char>(48 + protones);
            else nombreArchivo += std::to_string(protones);
            nombreArchivo += "n";
            if (neutrones < 10) nombreArchivo += static_cast<char>(48 + neutrones);
            else nombreArchivo += std::to_string(neutrones);
            nombreArchivo += extension;

            std::cout << "Procesando: Np=" << protones << ", Nn=" << neutrones << ", Archivo=" << nombreArchivo << std::endl;

            std::ifstream archivo(nombreArchivo);
            std::string linea, palabraClave;
            bool encontrado = false;

            // Buscar la línea que comienza con "State"
            while (std::getline(archivo, linea)) {
                std::stringstream flujo(linea);
                flujo >> palabraClave;
                if (palabraClave == "State") {
                    encontrado = true;
                    break;
                }
            }

            if (encontrado) {
                // Leer la siguiente línea para obtener la energía del primer estado
                std::getline(archivo, linea);
                std::stringstream flujo(linea);
                flujo >> palabraClave >> energia;
                std::cout << "Energía del estado fundamental: " << energia << std::endl;

                // Almacenar en la matriz usando índices basados en la mitad de los números
                int idxP = protones / 2;
                int idxN = neutrones / 2;
                energiasFondos[idxP][idxN] = energia;
                energiasFondos[idxN][idxP] = energia;  // Asignar al núcleo espejo
            }
            archivo.close();
        }
    }
}

Esta función almacena las energías del estado fundamental en una matriz cuadrada energiasFondos, indexada por Np/2 y Nn/2, cubriendo todos los casos par-par dentro de la capa sd. La salida se puede utilizar para análisis posteriores de propiedades nucleares.

Etiquetas: bigstick.x bash-script modelo-de-capas-nuclear cálculo-de-espectro algoritmo-lanczos

Publicado el 6-8 20:31