milupHPC documentation
  • src
  • materials
material_handler.cpp
Go to the documentation of this file.
1#include "../../include/materials/material_handler.h"
2
3int LibConfigReader::loadConfigFromFile(const char *configFile)
4{
5 int numberOfElements;
6
7 try {
8
9 config.readFile(configFile);
10 const libconfig::Setting &materials = config.lookup("materials");
11
12 try {
13
14 numberOfElements = materials.getLength();
15 int i, j;
16 int maxId = 0;
17
18 // find max ID of materials
19 for (i = 0; i < numberOfElements; ++i) {
20
21 const libconfig::Setting &material = materials[i];
22 int ID;
23
24 if (!(material.lookupValue("ID", ID))) {
25 Logger(ERROR) << "Error. Found material without ID in config file...";
26 MPI_Finalize();
27 exit(1);
28 }
29
30 Logger(DEBUG) << "Found material ID: " << ID;
31 maxId = std::max(ID, maxId);
32 }
33 if (maxId != numberOfElements - 1) {
34 Logger(ERROR) << "Material-IDs in config file have to be 0, 1, 2,...";
35 MPI_Finalize();
36 exit(1);
37 }
38 }
39 catch(...) {
40
41 }
42 }
43 catch(const libconfig::FileIOException &fileIOException) {
44 std::cerr << "I/O error while reading file." << std::endl;
45 MPI_Finalize();
46 exit(1);
47 }
48 catch(const libconfig::ParseException &parseException) {
49 std::cerr << "Parse error at " << parseException.getFile() << ":" << parseException.getLine()
50 << " - " << parseException.getError() << std::endl;
51 }
52 return numberOfElements;
53}
54
55MaterialHandler::MaterialHandler(integer numMaterials) : numMaterials(numMaterials) {
56
57 h_materials = new Material[numMaterials];
58 cuda::malloc(d_materials, numMaterials);
59
60 h_materials[0].ID = 0;
61 h_materials[0].interactions = 0;
62 h_materials[0].artificialViscosity = ArtificialViscosity();
63
64}
65
66MaterialHandler::MaterialHandler(const char *material_cfg) {
67
68 LibConfigReader libConfigReader;
69 numMaterials = libConfigReader.loadConfigFromFile(material_cfg);
70
71 h_materials = new Material[numMaterials];
72 cuda::malloc(d_materials, numMaterials);
73
74 double temp;
75
76 const libconfig::Setting &materials = libConfigReader.config.lookup("materials");
77
78 for (int i = 0; i < numMaterials; ++i) {
79
80 // general
81 const libconfig::Setting &material = materials[i]; //libConfigReader.materials[i];
82 int id;
83
84 material.lookupValue("ID", id);
85 h_materials[id].ID = id;
86 Logger(DEBUG) << "Reading information about material ID " << id << " out of " << numMaterials << "...";
87 material.lookupValue("interactions", h_materials[id].interactions);
88 material.lookupValue("sml", h_materials[id].sml);
89
90 // artificial viscosity
91 const libconfig::Setting &subset_artVisc = material.lookup("artificial_viscosity");
92 subset_artVisc.lookupValue("alpha", h_materials[id].artificialViscosity.alpha);
93 subset_artVisc.lookupValue("beta", h_materials[id].artificialViscosity.beta);
94
95 // eos
96 const libconfig::Setting &subset_eos = material.lookup("eos");
97 subset_eos.lookupValue("type", h_materials[id].eos.type);
98 subset_eos.lookupValue("polytropic_K", h_materials[id].eos.polytropic_K);
99 subset_eos.lookupValue("polytropic_gamma", h_materials[id].eos.polytropic_gamma);
100 }
101
102
103}
104
105MaterialHandler::MaterialHandler(integer numMaterials, integer ID, integer interactions, real alpha, real beta) :
106 numMaterials(numMaterials) {
107
108 h_materials = new Material[numMaterials];
109 cuda::malloc(d_materials, numMaterials);
110
111 h_materials[0].ID = ID;
112 h_materials[0].interactions = interactions;
113 //h_materials[0].artificialViscosity.alpha = 3.1;
114 h_materials[0].artificialViscosity = ArtificialViscosity(alpha, beta);
115
116}
117
118MaterialHandler::~MaterialHandler() {
119
120 delete [] h_materials;
121 cuda::free(d_materials);
122
123}
124
125void MaterialHandler::copy(To::Target target, integer index) {
126
127 if (index >= 0 && index < numMaterials) {
128 cuda::copy(&h_materials[index], &d_materials[index], 1, target);
129 }
130 else {
131 cuda::copy(h_materials, d_materials, numMaterials, target);
132 }
133
134}
135
136void MaterialHandler::communicate(int from, int to, bool fromDevice, bool toDevice) {
137
138 if (fromDevice) { copy(To::host); }
139
140 boost::mpi::environment env;
141 boost::mpi::communicator comm;
142
143 std::vector<boost::mpi::request> reqParticles;
144 std::vector<boost::mpi::status> statParticles;
145
146
147 if (comm.rank() == from) {
148 reqParticles.push_back(comm.isend(to, 17, &h_materials[0], numMaterials));
149 }
150 else {
151 statParticles.push_back(comm.recv(from, 17, &h_materials[0], numMaterials));
152 }
153
154 boost::mpi::wait_all(reqParticles.begin(), reqParticles.end());
155
156 if (toDevice) { copy(To::device); }
157}
158
159void MaterialHandler::broadcast(int root, bool fromDevice, bool toDevice) {
160
161 if (fromDevice) { copy(To::host); }
162
163 boost::mpi::environment env;
164 boost::mpi::communicator comm;
165
166 boost::mpi::broadcast(comm, h_materials, numMaterials, root);
167
168 if (toDevice) { copy(To::device); }
169}
LibConfigReader
Read material config files.
Definition: material_handler.h:32
LibConfigReader::config
libconfig::Config config
Definition: material_handler.h:35
LibConfigReader::loadConfigFromFile
int loadConfigFromFile(const char *configFile)
Definition: material_handler.cpp:3
Logger
Logger class.
Definition: logger.h:80
MaterialHandler::h_materials
Material * h_materials
host instance of material class
Definition: material_handler.h:59
MaterialHandler::broadcast
void broadcast(int root=0, bool fromDevice=false, bool toDevice=true)
Definition: material_handler.cpp:159
MaterialHandler::copy
void copy(To::Target target, integer index=-1)
Definition: material_handler.cpp:125
MaterialHandler::MaterialHandler
MaterialHandler(integer numMaterials)
Constructor.
Definition: material_handler.cpp:55
MaterialHandler::numMaterials
integer numMaterials
number of materials or rather material instances
Definition: material_handler.h:57
MaterialHandler::communicate
void communicate(int from, int to, bool fromDevice=false, bool toDevice=true)
Definition: material_handler.cpp:136
MaterialHandler::~MaterialHandler
~MaterialHandler()
Destructor.
Definition: material_handler.cpp:118
MaterialHandler::d_materials
Material * d_materials
device instance of material class
Definition: material_handler.h:61
Material
Material parameters.
Definition: material.cuh:88
Material::ID
integer ID
Definition: material.cuh:110
Material::interactions
integer interactions
Definition: material.cuh:111
Material::artificialViscosity
ArtificialViscosity artificialViscosity
Definition: material.cuh:114
DEBUG
@ DEBUG
Definition: logger.h:47
ERROR
@ ERROR
warning log type
Definition: logger.h:51
cuda::math::max
__device__ real max(real a, real b)
Maximum value out of two floating point values.
Definition: cuda_utilities.cu:431
cuda::copy
void copy(T *h_var, T *d_var, std::size_t count=1, To::Target copyTo=To::device)
Copy between host and device and vice-versa.
Definition: cuda_runtime.h:30
cuda::free
void free(T *d_var)
Free device memory.
Definition: cuda_runtime.h:81
cuda::malloc
void malloc(T *&d_var, std::size_t count)
Allocate device memory.
Definition: cuda_runtime.h:70
real
double real
Definition: parameter.h:15
integer
int integer
Definition: parameter.h:17
ArtificialViscosity
Artificial viscosity parameters.
Definition: material.cuh:30
To::Target
Target
Definition: parameter.h:164
To::device
@ device
Definition: parameter.h:165
To::host
@ host
Definition: parameter.h:165

milupHPC - src/materials/material_handler.cpp Source File
Generated on Wed Aug 31 2022 12:16:52 by Doxygen 1.9.3