Program Listing for File NuMagSANSlib_StructureData.h#
↰ Return to documentation for file (src/NuMagSANSlib_StructureData.h)
// File : NuMagSANSlib_MagData.h
// Author : Michael Philipp ADAMS, M.Sc.
// Company : University of Luxembourg
// Department : Department of Physics and Materials Sciences
// Group : NanoMagnetism Group
// Group Leader : Prof. Andreas Michels
// Version : 23 November 2024
// OS : Linux Ubuntu
// Language : CUDA C++
#include <iostream>
#include <fstream>
#include <sstream>
#include <sys/stat.h>
#include <sys/types.h>
#include <math.h>
#include <string>
#include <vector>
#include <stdlib.h>
#include <time.h>
#include <cuda_runtime.h>
#include <cublas_v2.h>
#include <stdexcept>
#include <math.h>
#include <chrono>
#include <dirent.h>
#include <unistd.h>
using namespace std;
struct StructureData{
float *RotMat; // rotation matrix R = [R0, R3, R6; R1, R4, R7; R2, R5, R8]
float*x; // position data x
float*y; // position data y
float*z; // position data z
unsigned long int* K; // number of objects
};
void allocate_StructureDataRAM(StructureData* StructData, \
StructDataProperties* StructDataProp, \
InputFileData* InputData){
unsigned long int K = StructDataProp->Number_Of_Elements;
StructData->x = (float*) malloc(K*sizeof(float));
StructData->y = (float*) malloc(K*sizeof(float));
StructData->z = (float*) malloc(K*sizeof(float));
StructData->K = (unsigned long int*) malloc(sizeof(unsigned long int));
StructData->RotMat = (float*) malloc(9*sizeof(float));
if (!StructData->x || !StructData->y || !StructData->z ||
!StructData->K || !StructData->RotMat) {
perror("Memory allocation failed");
exit(EXIT_FAILURE);
}
*StructData->K = K;
for(unsigned long int i = 0; i < K; i++){
StructData->x[i] = 0.0;
StructData->y[i] = 0.0;
StructData->z[i] = 0.0;
}
}
void allocate_StructureDataGPU(StructureData* StructData, \
StructureData* StructData_gpu){
unsigned long int K = *StructData->K;
cudaMalloc(&StructData_gpu->x, K*sizeof(float));
cudaMalloc(&StructData_gpu->y, K*sizeof(float));
cudaMalloc(&StructData_gpu->z, K*sizeof(float));
cudaMalloc(&StructData_gpu->K, sizeof(unsigned long int));
cudaMalloc(&StructData_gpu->RotMat, 9*sizeof(float));
cudaMemcpy(StructData_gpu->K, StructData->K, sizeof(unsigned long int), cudaMemcpyHostToDevice);
cudaMemcpy(StructData_gpu->RotMat, StructData->RotMat, 9*sizeof(float), cudaMemcpyHostToDevice);
LogSystem::write("");
// copy data from Host to Device
LogSystem::write("copy data from RAM to GPU...");
cudaMemcpy(StructData_gpu->x, StructData->x, K*sizeof(float), cudaMemcpyHostToDevice);
LogSystem::write(" x done...");
cudaMemcpy(StructData_gpu->y, StructData->y, K*sizeof(float), cudaMemcpyHostToDevice);
LogSystem::write(" y done...");
cudaMemcpy(StructData_gpu->z, StructData->z, K*sizeof(float), cudaMemcpyHostToDevice);
LogSystem::write(" z done...");
LogSystem::write("");
LogSystem::write("data transfer finished...");
LogSystem::write("");
cudaMalloc(&StructData_gpu, sizeof(StructureData));
cudaMemcpy(StructData_gpu, StructData, sizeof(StructureData), cudaMemcpyHostToDevice);
}
void read_StructureData(StructureData* StructData, \
StructDataProperties* StructDataProp, \
InputFileData* InputData){
LogSystem::write("");
LogSystem::write("read StructData...");
//unsigned long int K = *StructData->K;
for(int i = 0; i < 9; i++){
StructData->RotMat[i] = InputData->RotMat[i];
}
string filename;
unsigned long int n = 0;
float x_buf, y_buf, z_buf;
ifstream fin;
filename = StructDataProp->GlobalFilePath;
LogSystem::write(filename);
fin.open(filename);
n = 0;
// read in the data
while(fin >> x_buf >> y_buf >> z_buf){
StructData->x[n] = x_buf * InputData->XYZ_Unit_Factor;
StructData->y[n] = y_buf * InputData->XYZ_Unit_Factor;
StructData->z[n] = z_buf * InputData->XYZ_Unit_Factor;
n += 1;
}
fin.close();
LogSystem::write("read (x,y,z) StructData finished...");
}
void init_StructureData(StructureData* StructData, \
StructureData* StructData_gpu, \
StructDataProperties* StructDataProp, \
InputFileData* InputData){
allocate_StructureDataRAM(StructData, StructDataProp, InputData);
read_StructureData(StructData, StructDataProp, InputData);
allocate_StructureDataGPU(StructData, StructData_gpu);
}
void free_StructureData(StructureData *StructData, \
StructureData *StructData_gpu){
LogSystem::write("free StructData...");
free(StructData->x);
free(StructData->y);
free(StructData->z);
free(StructData->K);
free(StructData->RotMat);
cudaDeviceSynchronize();
cudaFree(StructData_gpu->x);
cudaDeviceSynchronize();
cudaFree(StructData_gpu->y);
cudaDeviceSynchronize();
cudaFree(StructData_gpu->z);
cudaDeviceSynchronize();
cudaFree(StructData_gpu->K);
cudaDeviceSynchronize();
cudaFree(StructData_gpu->RotMat);
cudaDeviceSynchronize();
LogSystem::write("free StructData finished.");
}
void disp_StructureData(StructureData *StructData){
for(int k=0; k < *StructData->K; k++){
cout << StructData->x[k] << " "\
<< StructData->y[k] << " "\
<< StructData->z[k] << "\n";
}
}