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 ####################################################################
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, &InputData);
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, &InputData);
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) {
if (InputData.StructDataLoop_flag) {
Check_StructData_Flag =
StructDataLoop_Observer(InputData.StructDataPath, InputData.StructDataLoop_IndexArray, &StructDataProp);
} else {
Check_StructData_Flag = StructData_Observer(InputData.StructDataFilename, &StructDataProp);
}
if (Check_StructData_Flag != true) {
LogSystem::write(" ->-> Error in StructData!");
LogSystem::write("");
LogSystem::write("");
return 0;
}
}
// RotDataExplorer ##########################################################################
RotDataProperties RotDataProp;
bool Check_RotData_Flag;
if (InputData.RotData_activate_flag) {
if (InputData.RotDataLoop_flag) {
Check_RotData_Flag =
RotDataLoop_Observer(InputData.RotDataPath, InputData.RotDataLoop_IndexArray, &RotDataProp);
} else {
Check_RotData_Flag = RotData_Observer(InputData.RotDataFilename, &RotDataProp);
}
if (Check_RotData_Flag != true) {
LogSystem::write(" ->-> Error in RotData!");
LogSystem::write("");
LogSystem::write("");
return 0;
}
}
if (InputData.StructData_activate_flag && InputData.RotData_activate_flag) {
if (StructDataProp.Number_Of_Elements != RotDataProp.Number_Of_Elements) {
LogSystem::write(" ->-> Error: StructData and RotData contain different numbers of entries!");
LogSystem::write("StructData entries: " + std::to_string(StructDataProp.Number_Of_Elements));
LogSystem::write("RotData entries: " + std::to_string(RotDataProp.Number_Of_Elements));
LogSystem::write("");
return 0;
}
}
int EffectiveObjectCount = 0;
if (InputData.MagData_activate_flag) {
EffectiveObjectCount = MagDataProp.Number_Of_SubFolders;
}
if (InputData.NucData_activate_flag) {
if (EffectiveObjectCount == 0) {
EffectiveObjectCount = NucDataProp.Number_Of_SubFolders;
} else if (EffectiveObjectCount != NucDataProp.Number_Of_SubFolders) {
LogSystem::write(" ->-> Error: MagData and NucData contain different effective object counts!");
LogSystem::write("MagData objects: " + std::to_string(MagDataProp.Number_Of_SubFolders));
LogSystem::write("NucData objects: " + std::to_string(NucDataProp.Number_Of_SubFolders));
LogSystem::write("");
return 0;
}
}
if (InputData.StructData_activate_flag && EffectiveObjectCount > 0) {
if (StructDataProp.Number_Of_Elements != EffectiveObjectCount) {
LogSystem::write(" ->-> Error: StructData entries do not match the effective object count!");
LogSystem::write("StructData entries: " + std::to_string(StructDataProp.Number_Of_Elements));
LogSystem::write("Effective object count: " + std::to_string(EffectiveObjectCount));
LogSystem::write("");
return 0;
}
}
if (InputData.RotData_activate_flag && EffectiveObjectCount > 0) {
if (RotDataProp.Number_Of_Elements != EffectiveObjectCount) {
LogSystem::write(" ->-> Error: RotData entries do not match the effective object count!");
LogSystem::write("RotData entries: " + std::to_string(RotDataProp.Number_Of_Elements));
LogSystem::write("Effective object count: " + std::to_string(EffectiveObjectCount));
LogSystem::write("");
return 0;
}
}
// Check Consistency of InputData and MagDataProp ############################################
// Start calculation based on loop modus or user selection ###################################
int Data_File_Index;
if (InputData.Loop_Modus) {
LogSystem::write("loop modus active...");
for (int k = InputData.Loop_From; k <= InputData.Loop_To; k++) {
Data_File_Index = k;
NuMagSANS_Calculator(&InputData, &NucDataProp, &MagDataProp, &StructDataProp, &RotDataProp,
Data_File_Index);
}
} 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];
NuMagSANS_Calculator(&InputData, &NucDataProp, &MagDataProp, &StructDataProp, &RotDataProp,
Data_File_Index);
}
}
LogSystem::close();
return 0;
}