milupHPC documentation
  • src
  • integrator
predictor_corrector_euler.cpp
Go to the documentation of this file.
1#include "../../include/integrator/predictor_corrector_euler.h"
2
3PredictorCorrectorEuler::PredictorCorrectorEuler(SimulationParameters simulationParameters) : Miluphpc(simulationParameters) {
4 printf("PredictorCorrectorEuler()\n");
5 integratedParticles = new IntegratedParticleHandler(numParticles, numNodes);
6
7
8 cudaGetDevice(&device);
9 printf("Device: %i\n", device);
10 cudaGetDeviceProperties(&prop, device);
11 //printf("prop.multiProcessorCount: %i\n", prop.multiProcessorCount);
12 cuda::malloc(d_blockCount, 1);
13 cuda::set(d_blockCount, 0, 1);
14
15 cuda::malloc(d_block_forces, prop.multiProcessorCount);
16 cuda::malloc(d_block_courant, prop.multiProcessorCount);
17 cuda::malloc(d_block_artVisc, prop.multiProcessorCount);
18 cuda::malloc(d_block_e, prop.multiProcessorCount);
19 cuda::malloc(d_block_rho, prop.multiProcessorCount);
20 cuda::malloc(d_block_vmax, prop.multiProcessorCount);
21
22 cuda::malloc(d_blockShared, 1);
23
24 PredictorCorrectorEulerNS::BlockSharedNS::Launch::set(d_blockShared, d_block_forces, d_block_courant,
25 d_block_courant);
26 PredictorCorrectorEulerNS::BlockSharedNS::Launch::setE(d_blockShared, d_block_e);
27 PredictorCorrectorEulerNS::BlockSharedNS::Launch::setRho(d_blockShared, d_block_rho);
28 PredictorCorrectorEulerNS::BlockSharedNS::Launch::setVmax(d_blockShared, d_block_vmax);
29
30}
31
32PredictorCorrectorEuler::~PredictorCorrectorEuler() {
33 printf("~PredictorCorrectorEuler()\n");
34
35 delete [] integratedParticles;
36
37 cuda::free(d_block_forces);
38 cuda::free(d_block_courant);
39 cuda::free(d_block_artVisc);
40 cuda::free(d_block_e);
41 cuda::free(d_block_rho);
42 cuda::free(d_block_vmax);
43
44 cuda::free(d_blockShared);
45}
46
47void PredictorCorrectorEuler::integrate(int step) {
48
49 printf("PredictorCorrector::integrate()\n");
50
51 Timer timer;
52 real time = 0.;
53
54 real timeElapsed;
55
56 Timer timerRhs;
57
58 while (*simulationTimeHandler->h_currentTime < *simulationTimeHandler->h_subEndTime) {
59
60 profiler.setStep(subStep);
61 subStep++;
62
63 timer.reset();
64 if (simulationParameters.removeParticles) {
65 time = removeParticles();
66 }
67 timeElapsed = timer.elapsed();
68 profiler.value2file(ProfilerIds::Time::removeParticles, timeElapsed);
69 Logger(TIME) << "removing particles: " << timeElapsed << " ms";
70
71 Logger(INFO) << "rhs::loadBalancing()";
72 if (simulationParameters.loadBalancing && step != 0 && step % simulationParameters.loadBalancingInterval == 0) {
73 dynamicLoadBalancing();
74 }
75
76 timerRhs.reset();
77 // -------------------------------------------------------------------------------------------------------------
78 time += rhs(step, true, true);
79 // -------------------------------------------------------------------------------------------------------------
80 timeElapsed = timerRhs.elapsed();
81 Logger(TIME) << "rhsElapsed: " << timeElapsed;
82 //Logger(TIME) << "rhs: " << time << " ms";
83 profiler.value2file(ProfilerIds::Time::rhs, time);
84 profiler.value2file(ProfilerIds::Time::rhsElapsed, timeElapsed);
85
86 // ------------------------------------------------------------------------------------------------------------
87 //simulationTimeHandler->copy(To::host);
88 //Logger(INFO) << "h_dt = " << *simulationTimeHandler->h_dt;
89 //Logger(INFO) << "h_startTime = " << *simulationTimeHandler->h_startTime;
90 //Logger(INFO) << "h_subEndTime = " << *simulationTimeHandler->h_subEndTime;
91 //Logger(INFO) << "h_endTime = " << *simulationTimeHandler->h_endTime;
92 //Logger(INFO) << "h_currentTime = " << *simulationTimeHandler->h_currentTime;
93 //Logger(INFO) << "h_dt_max = " << *simulationTimeHandler->h_dt_max;
94
95 Logger(INFO) << "setTimeStep: search radius: " << h_searchRadius;
96 PredictorCorrectorEulerNS::Kernel::Launch::setTimeStep(prop.multiProcessorCount,
97 simulationTimeHandler->d_simulationTime,
98 materialHandler->d_materials,
99 particleHandler->d_particles,
100 d_blockShared, d_blockCount, h_searchRadius,
101 numParticlesLocal);
102
103 simulationTimeHandler->globalizeTimeStep(Execution::device);
104 simulationTimeHandler->copy(To::host);
105 Logger(INFO) << "h_dt = " << *simulationTimeHandler->h_dt << " | h_dt_max = "
106 << *simulationTimeHandler->h_dt_max;;
107 Logger(INFO) << "h_startTime = " << *simulationTimeHandler->h_startTime;
108 Logger(INFO) << "h_subEndTime = " << *simulationTimeHandler->h_subEndTime;
109 Logger(INFO) << "h_endTime = " << *simulationTimeHandler->h_endTime;
110 Logger(INFO) << "h_currentTime = " << *simulationTimeHandler->h_currentTime;
111 //Logger(INFO) << "h_dt_max = " << *simulationTimeHandler->h_dt_max;
112 // ------------------------------------------------------------------------------------------------------------
113 Logger(INFO) << "PREDICTOR!";
114 time += PredictorCorrectorEulerNS::Kernel::Launch::predictor(particleHandler->d_particles,
115 integratedParticles[0].d_integratedParticles,
116 *simulationTimeHandler->h_dt, //(real) simulationParameters.timestep,
117 numParticlesLocal);
118
119 Logger(INFO) << "setPointer()...";
120 particleHandler->setPointer(&integratedParticles[0]);
121
122 timerRhs.reset();
123 // -------------------------------------------------------------------------------------------------------------
124 time += rhs(step, false, false);
125 // -------------------------------------------------------------------------------------------------------------
126 timeElapsed = timerRhs.elapsed();
127 Logger(TIME) << "rhsElapsed: " << timeElapsed;
128 //Logger(TIME) << "rhs: " << time << " ms";
129 profiler.value2file(ProfilerIds::Time::rhs, time);
130 profiler.value2file(ProfilerIds::Time::rhsElapsed, timeElapsed);
131
132 Logger(INFO) << "resetPointer()...";
133 particleHandler->resetPointer();
134
135 Logger(INFO) << "CORRECTOR!";
136 time += PredictorCorrectorEulerNS::Kernel::Launch::corrector(particleHandler->d_particles,
137 integratedParticles[0].d_integratedParticles,
138 *simulationTimeHandler->h_dt, //(real) simulationParameters.timestep,
139 numParticlesLocal);
140
141
142 *simulationTimeHandler->h_currentTime += *simulationTimeHandler->h_dt;
143 simulationTimeHandler->copy(To::device);
144
145 Logger(TRACE) << "finished sub step - simulation time: " << *simulationTimeHandler->h_currentTime
146 << " (STEP: " << step << " | subStep: " << subStep
147 << " | time = " << *simulationTimeHandler->h_currentTime << "/"
148 << *simulationTimeHandler->h_subEndTime << "/"
149 << *simulationTimeHandler->h_endTime << ")";
150
151 //H5Profiler &profiler = H5Profiler::getInstance("log/performance.h5");
152
153
154 subDomainKeyTreeHandler->copy(To::host, true, false);
155 profiler.vector2file(ProfilerIds::ranges, subDomainKeyTreeHandler->h_range);
156
157 boost::mpi::communicator comm;
158 sumParticles = numParticlesLocal;
159 all_reduce(comm, boost::mpi::inplace_t<integer*>(&sumParticles), 1, std::plus<integer>());
160
161 profiler.value2file(ProfilerIds::numParticles, sumParticles);
162 profiler.value2file(ProfilerIds::numParticlesLocal, numParticlesLocal);
163
164 }
165
166 timeElapsed = timer.elapsed();
167 Logger(TIME) << "integration step elapsed: " << timeElapsed << " ms";
168
169}
H5Profiler::vector2file
void vector2file(const std::string &path, std::vector< T > data)
Definition: h5profiler.h:246
H5Profiler::setStep
void const setStep(const int &_step)
Set current step of profiler.
Definition: h5profiler.h:144
H5Profiler::value2file
void value2file(const std::string &path, T value)
Write value to single value data set.
Definition: h5profiler.h:202
IntegratedParticleHandler
Definition: particle_handler.h:425
IntegratedParticleHandler::d_integratedParticles
IntegratedParticles * d_integratedParticles
device instance of IntegratedParticles class
Definition: particle_handler.h:474
Logger
Logger class.
Definition: logger.h:80
MaterialHandler::d_materials
Material * d_materials
device instance of material class
Definition: material_handler.h:61
Miluphpc
MilupHPC class.
Definition: miluphpc.h:74
Miluphpc::particleHandler
ParticleHandler * particleHandler
Instance to handle the Particles instance on device and host.
Definition: miluphpc.h:309
Miluphpc::rhs
real rhs(int step, bool selfGravity=true, bool assignParticlesToProcess=true)
Definition: miluphpc.cpp:294
Miluphpc::profiler
H5Profiler & profiler
H5 profiler instance.
Definition: miluphpc.h:274
Miluphpc::numNodes
integer numNodes
number of nodes (to be allocated)
Definition: miluphpc.h:296
Miluphpc::dynamicLoadBalancing
void dynamicLoadBalancing(int bins=5000)
Pre-calculations for updateRangeApproximately.
Definition: miluphpc.cpp:2885
Miluphpc::materialHandler
MaterialHandler * materialHandler
Instance to handle Materials instances on device and host.
Definition: miluphpc.h:319
Miluphpc::subDomainKeyTreeHandler
SubDomainKeyTreeHandler * subDomainKeyTreeHandler
Instance to handle the SubDomainKeyTree instance on device and host.
Definition: miluphpc.h:311
Miluphpc::numParticles
integer numParticles
number of particles (to be allocated)
Definition: miluphpc.h:285
Miluphpc::subStep
int subStep
current sub-step (there are possibly more sub-steps within a step!)
Definition: miluphpc.h:212
Miluphpc::integratedParticles
IntegratedParticleHandler * integratedParticles
Definition: miluphpc.h:305
Miluphpc::removeParticles
real removeParticles()
Remove particles in dependence of some criterion.
Definition: miluphpc.cpp:3040
Miluphpc::simulationParameters
SimulationParameters simulationParameters
buffer (need for revising)
Definition: miluphpc.h:351
Miluphpc::numParticlesLocal
integer numParticlesLocal
Definition: miluphpc.h:294
Miluphpc::h_searchRadius
real h_searchRadius
search radius for SPH (MPI-process overarching) neighbor search
Definition: miluphpc.h:215
Miluphpc::sumParticles
integer sumParticles
(real) number of particles on all processes
Definition: miluphpc.h:287
Miluphpc::simulationTimeHandler
SimulationTimeHandler * simulationTimeHandler
Instance to handle the SimulationTime instances on device and host.
Definition: miluphpc.h:282
ParticleHandler::resetPointer
void resetPointer()
Definition: particle_handler.cpp:728
ParticleHandler::d_particles
Particles * d_particles
device instance of particles class
Definition: particle_handler.h:350
ParticleHandler::setPointer
void setPointer(IntegratedParticleHandler *integratedParticleHandler)
Definition: particle_handler.cpp:661
PredictorCorrectorEuler::d_blockShared
PredictorCorrectorEulerNS::BlockShared * d_blockShared
Definition: predictor_corrector_euler.h:59
PredictorCorrectorEuler::d_block_forces
real * d_block_forces
Definition: predictor_corrector_euler.h:52
PredictorCorrectorEuler::d_block_rho
real * d_block_rho
Definition: predictor_corrector_euler.h:56
PredictorCorrectorEuler::d_block_courant
real * d_block_courant
Definition: predictor_corrector_euler.h:53
PredictorCorrectorEuler::d_block_vmax
real * d_block_vmax
Definition: predictor_corrector_euler.h:57
PredictorCorrectorEuler::~PredictorCorrectorEuler
~PredictorCorrectorEuler()
Destructor.
Definition: predictor_corrector_euler.cpp:32
PredictorCorrectorEuler::d_block_artVisc
real * d_block_artVisc
Definition: predictor_corrector_euler.h:54
PredictorCorrectorEuler::d_block_e
real * d_block_e
Definition: predictor_corrector_euler.h:55
PredictorCorrectorEuler::device
int device
Definition: predictor_corrector_euler.h:48
PredictorCorrectorEuler::d_blockCount
int * d_blockCount
Definition: predictor_corrector_euler.h:50
PredictorCorrectorEuler::PredictorCorrectorEuler
PredictorCorrectorEuler(SimulationParameters simulationParameters)
Constructor.
Definition: predictor_corrector_euler.cpp:3
PredictorCorrectorEuler::integrate
void integrate(int step)
Implementation of the abstract integration method.
Definition: predictor_corrector_euler.cpp:47
PredictorCorrectorEuler::prop
struct cudaDeviceProp prop
Definition: predictor_corrector_euler.h:49
SimulationTimeHandler::h_dt_max
real * h_dt_max
Definition: simulation_time_handler.h:24
SimulationTimeHandler::globalizeTimeStep
void globalizeTimeStep(Execution::Location exLoc)
Definition: simulation_time_handler.cpp:67
SimulationTimeHandler::copy
void copy(To::Target target)
Definition: simulation_time_handler.cpp:56
SimulationTimeHandler::h_subEndTime
real * h_subEndTime
Definition: simulation_time_handler.h:21
SimulationTimeHandler::h_dt
real * h_dt
Definition: simulation_time_handler.h:19
SimulationTimeHandler::h_endTime
real * h_endTime
Definition: simulation_time_handler.h:22
SimulationTimeHandler::h_currentTime
real * h_currentTime
Definition: simulation_time_handler.h:23
SimulationTimeHandler::d_simulationTime
SimulationTime * d_simulationTime
Definition: simulation_time_handler.h:35
SimulationTimeHandler::h_startTime
real * h_startTime
Definition: simulation_time_handler.h:20
SubDomainKeyTreeHandler::h_range
keyType * h_range
host range(s)
Definition: subdomain_handler.h:31
SubDomainKeyTreeHandler::copy
void copy(To::Target target=To::device, bool range=true, bool counter=true)
Copy (parts of the) SubDomainKeyTree instance(s) between host and device.
Definition: subdomain_handler.cpp:43
Timer
Definition: timer.h:15
Timer::elapsed
double elapsed() const
Get elapsed time since instantiation/latest reset.
Definition: timer.cpp:22
Timer::reset
void reset()
Reset timer instance.
Definition: timer.cpp:11
INFO
@ INFO
debug log type
Definition: logger.h:48
TRACE
@ TRACE
info log type
Definition: logger.h:49
TIME
@ TIME
error log type
Definition: logger.h:52
PredictorCorrectorEulerNS::BlockSharedNS::Launch::setE
void setE(BlockShared *blockShared, real *e)
Definition: device_predictor_corrector_euler.cu:111
PredictorCorrectorEulerNS::BlockSharedNS::Launch::setVmax
void setVmax(BlockShared *blockShared, real *vmax)
Definition: device_predictor_corrector_euler.cu:120
PredictorCorrectorEulerNS::BlockSharedNS::Launch::setRho
void setRho(BlockShared *blockShared, real *e)
Definition: device_predictor_corrector_euler.cu:115
PredictorCorrectorEulerNS::BlockSharedNS::Launch::set
void set(BlockShared *blockShared, real *forces, real *courant, real *artVisc)
Definition: device_predictor_corrector_euler.cu:106
PredictorCorrectorEulerNS::Kernel::Launch::setTimeStep
real setTimeStep(int multiProcessorCount, SimulationTime *simulationTime, Material *materials, Particles *particles, BlockShared *blockShared, int *blockCount, real searchRadius, int numParticles)
Wrapper for PredictorCorrectorEulerNS::Kernel::setTimeStep().
Definition: device_predictor_corrector_euler.cu:534
PredictorCorrectorEulerNS::Kernel::Launch::predictor
real predictor(Particles *particles, IntegratedParticles *predictor, real dt, int numParticles)
Wrapper for PredictorCorrectorEulerNS::Kernel::predictor().
Definition: device_predictor_corrector_euler.cu:528
PredictorCorrectorEulerNS::Kernel::Launch::corrector
real corrector(Particles *particles, IntegratedParticles *predictor, real dt, int numParticles)
Wrapper for PredictorCorrectorEulerNS::Kernel::corrector().
Definition: device_predictor_corrector_euler.cu:523
ProfilerIds::Time::removeParticles
const char *const removeParticles
Definition: h5profiler.h:54
ProfilerIds::Time::rhs
const char *const rhs
Definition: h5profiler.h:50
ProfilerIds::Time::rhsElapsed
const char *const rhsElapsed
Definition: h5profiler.h:51
ProfilerIds::numParticlesLocal
const char *const numParticlesLocal
Definition: h5profiler.h:30
ProfilerIds::ranges
const char *const ranges
Definition: h5profiler.h:31
ProfilerIds::numParticles
const char *const numParticles
Definition: h5profiler.h:29
cuda::set
void set(T *d_var, T val, std::size_t count=1)
Set device memory to a specific value.
Definition: cuda_runtime.h:56
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
Execution::device
@ device
Definition: parameter.h:193
SimulationParameters
Definition: parameter.h:122
SimulationParameters::loadBalancing
bool loadBalancing
apply load balancing
Definition: parameter.h:131
SimulationParameters::loadBalancingInterval
int loadBalancingInterval
apply load balancing each x interval/simulation step
Definition: parameter.h:132
SimulationParameters::removeParticles
bool removeParticles
Definition: parameter.h:150
To::device
@ device
Definition: parameter.h:165
To::host
@ host
Definition: parameter.h:165

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