Program Listing for File NuMagSANS.cu#

Return to documentation for file (src/NuMagSANS.cu)

// File         : NuMagSANS.cu
// Author       : Dr. Michael Philipp ADAMS
// Company      : University of Luxembourg
// Department   : Department of Physics and Materials Sciences
// Group        : NanoMagnetism Group
// Group Leader : Prof. Andreas Michels
// Version      : 16 October 2025
// OS           : Linux Ubuntu
// Language     : CUDA C++

#include "NuMagSANSlib.h"

using namespace std;

int main(int argc, char* argv[]){

    // Input File Name
    string InputFileName = argv[1];

    // Initialize LogFileSystem
    InitializeLogSystem(InputFileName);

    // Input File Interpreter ####################################################################
    //string InputFileName = argv[1];
    InputFileData InputData;
    bool Check_InputFile_Flag = ReadCSV__Input_File_Interpreter(InputFileName, &InputData);
    if(Check_InputFile_Flag != true){
        LogSystem::write(" ->-> Error in input file!");
        LogSystem::write("");
        return 0;
    }

    // MagDataExplorer ###########################################################################
    MagDataProperties MagDataProp;
    bool Check_MagData_Flag;
    if(InputData.MagData_activate_flag){
        Check_MagData_Flag = MagData_Observer(InputData.MagDataPath, &MagDataProp);
        if(Check_MagData_Flag != true){
            LogSystem::write(" ->-> Error in MagData!");
            LogSystem::write("");
            LogSystem::write("");
            return 0;
        }
    }

    // NucDataExpolorer ###########################################################################
    NucDataProperties NucDataProp;
    bool Check_NucData_Flag;
    if(InputData.NucData_activate_flag){
        Check_NucData_Flag = NucData_Observer(InputData.NucDataPath, &NucDataProp);
        if(Check_NucData_Flag != true){
            LogSystem::write(" ->->Error in NucData!");
            LogSystem::write("");
            LogSystem::write("");
            return 0;
        }
    }

    // StructDataExplorer ########################################################################
    StructDataProperties StructDataProp;
    bool Check_StructData_Flag;
    if(InputData.StructData_activate_flag){
        Check_StructData_Flag = StructData_Observer(InputData.StructDataFilename, &StructDataProp);
        if(Check_StructData_Flag != true){
            LogSystem::write(" ->-> Error in StructData!");
            LogSystem::write("");
            LogSystem::write("");
        }
    }

    // Check Consistency of InputData and MagDataProp ############################################





    // Create Output Folder #####################################################################
    //mkdir((InputData.SANSDataFoldername + "/").c_str(), 0777);
    //LogSystem::initLog(InputData.SANSDataFoldername + "/NuMagSANSlog.txt");
    //LogSystem::write("Hello World!");


    // Start calculation based on loop modus or user selection ###################################
    //mkdir((InputData.SANSDataFoldername + "/").c_str(), 0777);

    int Data_File_Index;
    size_t free_bytes, total_bytes;
    double used_mb1, used_mb2;
    double cummulated_mb = 0.0;
    if(InputData.Loop_Modus){
        LogSystem::write("loop modus active...");
        for(int k = InputData.Loop_From; k <= InputData.Loop_To; k++){
            Data_File_Index = k;

            cudaMemGetInfo(&free_bytes, &total_bytes);
            used_mb1 = (total_bytes - free_bytes) / 1024.0 / 1024.0;

            NuMagSANS_Calculator(&InputData, &NucDataProp, &MagDataProp, &StructDataProp, Data_File_Index);

            cudaMemGetInfo(&free_bytes, &total_bytes);
            used_mb2 = (total_bytes - free_bytes) / 1024.0 / 1024.0;
            cummulated_mb += used_mb2 - used_mb1;

            LogSystem::write("GPU Memory Check: cummulated bytes: " + std::to_string(cummulated_mb) + " MB, free bytes: " + std::to_string(free_bytes / 1024.0 /1024.0) + " MB");

        }
    }else{
        LogSystem::write("user selecting active...");
        for(int k = 0; k < InputData.User_Selection_IndexArray.size(); k++){
            Data_File_Index = InputData.User_Selection_IndexArray[k];

            cudaMemGetInfo(&free_bytes, &total_bytes);
            used_mb1 = (total_bytes - free_bytes) / 1024.0 / 1024.0;

            NuMagSANS_Calculator(&InputData, &NucDataProp, &MagDataProp, &StructDataProp, Data_File_Index);

            cudaMemGetInfo(&free_bytes, &total_bytes);
            used_mb2 = (total_bytes - free_bytes) / 1024.0 / 1024.0;
            cummulated_mb += used_mb2 - used_mb1;

            LogSystem::write("GPU Memory Check: cummulated bytes: " + std::to_string(cummulated_mb) + " MB, free bytes: " + std::to_string(free_bytes / 1024.0 /1024.0) + " MB");

        }
    }


    LogSystem::close();

    return 0;

}