milupHPC documentation
  • src
  • integrator
device_predictor_corrector_euler.cu
Go to the documentation of this file.
1#include "../../include/integrator/device_predictor_corrector_euler.cuh"
2#include "../../include/cuda_utils/cuda_launcher.cuh"
3
4namespace PredictorCorrectorEulerNS {
5
6
7 CUDA_CALLABLE_MEMBER Shared::Shared() {
8
9 }
10 CUDA_CALLABLE_MEMBER Shared::Shared(real *forces, real *courant, real *artVisc) {
11 this->forces = forces;
12 this->courant = courant;
13 this->artVisc = artVisc;
14 }
15 CUDA_CALLABLE_MEMBER Shared::~Shared() {
16
17 }
18 CUDA_CALLABLE_MEMBER void Shared::set(real *forces, real *courant, real *artVisc) {
19 this->forces = forces;
20 this->courant = courant;
21 this->artVisc= artVisc;
22 }
23 CUDA_CALLABLE_MEMBER void Shared::setE(real *e) {
24 this->e = e;
25 }
26 CUDA_CALLABLE_MEMBER void Shared::setRho(real *rho) {
27 this->rho = rho;
28 }
29 CUDA_CALLABLE_MEMBER void Shared::setVmax(real *vmax) {
30 this->vmax = vmax;
31 }
32 namespace SharedNS {
33 __global__ void set(Shared *shared, real *forces, real *courant, real *artVisc) {
34 shared->set(forces, courant, artVisc);
35 }
36 __global__ void setE(Shared *shared, real *e) {
37 shared->setE(e);
38 }
39 __global__ void setRho(Shared *shared, real *rho) {
40 shared->setRho(rho);
41 }
42 __global__ void setVmax(Shared *shared, real *vmax) {
43 shared->setVmax(vmax);
44 }
45 namespace Launch {
46 void set(Shared *shared, real *forces, real *courant, real *artVisc) {
47 ExecutionPolicy executionPolicy(1, 1);
48 cuda::launch(false, executionPolicy, ::PredictorCorrectorEulerNS::SharedNS::set, shared,
49 forces, courant, artVisc);
50 }
51 void setE(Shared *shared, real *e) {
52 ExecutionPolicy executionPolicy(1, 1);
53 cuda::launch(false, executionPolicy, ::PredictorCorrectorEulerNS::SharedNS::setE, shared, e);
54 }
55 void setRho(Shared *shared, real *rho) {
56 ExecutionPolicy executionPolicy(1, 1);
57 cuda::launch(false, executionPolicy, ::PredictorCorrectorEulerNS::SharedNS::setRho, shared, rho);
58 }
59 void setVmax(Shared *shared, real *vmax) {
60 ExecutionPolicy executionPolicy(1, 1);
61 cuda::launch(false, executionPolicy, ::PredictorCorrectorEulerNS::SharedNS::setVmax, shared, vmax);
62 }
63 }
64 }
65
66 CUDA_CALLABLE_MEMBER BlockShared::BlockShared() {
67
68 }
69 CUDA_CALLABLE_MEMBER BlockShared::BlockShared(real *forces, real *courant, real *artVisc) {
70 this->forces = forces;
71 this->courant = courant;
72 this->artVisc = artVisc;
73 }
74 CUDA_CALLABLE_MEMBER BlockShared::~BlockShared() {
75
76 }
77 CUDA_CALLABLE_MEMBER void BlockShared::set(real *forces, real *courant, real *artVisc) {
78 this->forces = forces;
79 this->courant = courant;
80 this->artVisc= artVisc;
81 }
82 CUDA_CALLABLE_MEMBER void BlockShared::setE(real *e) {
83 this->e = e;
84 }
85 CUDA_CALLABLE_MEMBER void BlockShared::setRho(real *rho) {
86 this->rho = rho;
87 }
88 CUDA_CALLABLE_MEMBER void BlockShared::setVmax(real *vmax) {
89 this->vmax = vmax;
90 }
91 namespace BlockSharedNS {
92 __global__ void set(BlockShared *blockShared, real *forces, real *courant, real *artVisc) {
93 blockShared->set(forces, courant, artVisc);
94 }
95 __global__ void setE(BlockShared *blockShared, real *e) {
96 blockShared->setE(e);
97 }
98 __global__ void setRho(BlockShared *blockShared, real *rho) {
99 blockShared->setRho(rho);
100 }
101 __global__ void setVmax(BlockShared *blockShared, real *vmax) {
102 blockShared->setVmax(vmax);
103 }
104
105 namespace Launch {
106 void set(BlockShared *blockShared, real *forces, real *courant, real *artVisc) {
107 ExecutionPolicy executionPolicy(1, 1);
108 cuda::launch(false, executionPolicy, ::PredictorCorrectorEulerNS::BlockSharedNS::set, blockShared,
109 forces, courant, artVisc);
110 }
111 void setE(BlockShared *blockShared, real *e) {
112 ExecutionPolicy executionPolicy(1, 1);
113 cuda::launch(false, executionPolicy, ::PredictorCorrectorEulerNS::BlockSharedNS::setE, blockShared, e);
114 }
115 void setRho(BlockShared *blockShared, real *rho) {
116 ExecutionPolicy executionPolicy(1, 1);
117 cuda::launch(false, executionPolicy, ::PredictorCorrectorEulerNS::BlockSharedNS::setRho,
118 blockShared, rho);
119 }
120 void setVmax(BlockShared *blockShared, real *vmax) {
121 ExecutionPolicy executionPolicy(1, 1);
122 cuda::launch(false, executionPolicy, ::PredictorCorrectorEulerNS::BlockSharedNS::setVmax,
123 blockShared, vmax);
124 }
125 }
126 }
127
128 namespace Kernel {
129
130 __global__ void corrector(Particles *particles, IntegratedParticles *predictor, real dt, int numParticles) {
131
132 int i;
133 // particle loop
134 for (i = threadIdx.x + blockIdx.x * blockDim.x; i < numParticles; i+= blockDim.x * gridDim.x) {
135
136// just for debugging purposes!!!
137/*
138 particles->vx[i] += dt * (particles->ax[i] + particles->g_ax[i]);
139#if DIM > 1
140 particles->vy[i] += dt * (particles->ay[i] + particles->g_ay[i]);
141#if DIM == 3
142 particles->vz[i] += dt * (particles->az[i] + particles->g_az[i]);
143#endif
144#endif
145
146 // calculating/updating the positions
147 particles->x[i] += dt * particles->vx[i];
148#if DIM > 1
149 particles->y[i] += dt * particles->vy[i];
150#if DIM == 3
151 particles->z[i] += dt * particles->vz[i];
152#endif
153#endif
154*/
155// end: just for debugging purposes!!!
156
157 particles->x[i] = particles->x[i] + dt/2 * (predictor->vx[i] + particles->vx[i]);
158 //if (i == 12) { //(i % 1000 == 0) {
159 // printf("corrector: x[%i] = %e + %e/2 * (%e + %e)\n", i, particles->x[i], dt, predictor->vx[i],
160 // particles->vx[i]);
161 //}
162 particles->vx[i] = particles->vx[i] + dt/2 * (predictor->ax[i] + particles->ax[i] + 2 * particles->g_ax[i]);
163 //if (i == 12) { //(i % 1000 == 0) {
164 // printf("corrector: vx[%i] = %e + %e/2 * (%e + %e + 2 * %e)\n", i, particles->vx[i], dt, predictor->ax[i],
165 // particles->ax[i], particles->g_ax);
166 //}
167 particles->ax[i] = 0.5 * (predictor->ax[i] + particles->ax[i]) + particles->g_ax[i];
168 //if (i == 12) { //(i % 1000 == 0) {
169 // printf("corrector: ax[%i] = 1/2 * (%e + %e) + %e)\n", i, predictor->ax[i], particles->ax[i], particles->g_ax);
170 //}
171#if DIM > 1
172 particles->y[i] = particles->y[i] + dt/2 * (predictor->vy[i] + particles->vy[i]);
173 particles->vy[i] = particles->vy[i] + dt/2 * (predictor->ay[i] + particles->ay[i] + 2 * particles->g_ay[i]);
174 particles->ay[i] = 0.5 * (predictor->ay[i] + particles->ay[i]) + particles->g_ay[i];
175#if DIM == 3
176 particles->z[i] = particles->z[i] + dt/2 * (predictor->vz[i] + particles->vz[i]);
177 particles->vz[i] = particles->vz[i] + dt/2 * (predictor->az[i] + particles->az[i] + 2 * particles->g_az[i]);
178 particles->az[i] = 0.5 * (predictor->az[i] + particles->az[i]) + particles->g_az[i];
179#endif
180#endif
181
182// TODO: some SPH flag?
183#if INTEGRATE_DENSITY
184 particles->rho[i] = particles->rho[i] + dt/2 * (predictor->drhodt[i] + particles->drhodt[i]);
185 particles->drhodt[i] = 0.5 * (predictor->drhodt[i] + particles->drhodt[i]);
186 //if (i == 12) { //(i % 1000 == 0) {
187 // printf("corrector: rho[%i] = %e + %e/2 * (%e + %e)\n", i, particles->rho[i], dt, predictor->drhodt[i],
188 // particles->drhodt[i]);
189 //}
190#else
191 //p.rho[i] = p.rho[i];
192#endif
193#if INTEGRATE_ENERGY
194 particles->e[i] = particles->e[i] + dt/2 * (predictor->dedt[i] + particles->dedt[i]);
195 if (particles->e[i] < 1e-6) {
196 particles->e[i] = 1e-6;
197 }
198 particles->dedt[i] = 0.5 * (predictor->dedt[i] + particles->dedt[i]);
199 //if (i == 12) { //(i % 1000 == 0) {
200 // printf("corrector: e[%i] = %e + %e/2 * (%e + %e)\n", i, particles->e[i], dt, predictor->dedt[i],
201 // particles->dedt[i]);
202 //}
203#endif
204#if INTEGRATE_SML
205#if DECOUPLE_SML
206 particles->sml[i] = particles->sml[i] + dt * particles->dsmldt[i];
207 //particles->dsmldt[i] = particles->dsmldt[i];
208#else
209 particles->sml[i] = particles->sml[i] + dt/2 * (predictor->dsmldt[i] + particles->dsmldt[i]);
210 particles->dsmldt[i] = 0.5 * (predictor->dsmldt[i] + particles->dsmldt[i]);
211#endif
212#else
213 particles->sml[i] = predictor->sml[i];
214#endif
215 //if (i % 1000 == 0) {
216 // printf("i: %i, particles->cs = %e, predictor->cs = %e\n", i, particles->cs[i], predictor->cs[i]);
217 //}
218 // TODO: needed?
219 //predictor->reset(i); //TODO: move somewhere else?
220 }
221 }
222
223 __global__ void predictor(Particles *particles, IntegratedParticles *predictor, real dt, int numParticles) {
224
225 int i;
226
227 for (i = threadIdx.x + blockIdx.x * blockDim.x; i < numParticles; i+= blockDim.x * gridDim.x) {
228
229 predictor->x[i] = particles->x[i] + dt * particles->vx[i];
230 predictor->vx[i] = particles->vx[i] + dt * (particles->ax[i] + particles->g_ax[i]);
231#if DIM > 1
232 predictor->y[i] = particles->y[i] + dt * particles->vy[i];
233 predictor->vy[i] = particles->vy[i] + dt * (particles->ay[i] + particles->g_ay[i]);
234#if DIM == 3
235 predictor->z[i] = particles->z[i] + dt * particles->vz[i];
236 predictor->vz[i] = particles->vz[i] + dt * (particles->az[i] + particles->g_az[i]);
237#endif
238#endif
239
240// TODO: some SPH flag?
241#if INTEGRATE_DENSITY
242 predictor->rho[i] = particles->rho[i] + dt * particles->drhodt[i];
243 //predictor->drhodt[i] = particles->drhodt[i];
244#else
245 //predictor->rho[i] = particles->rho[i];
246#endif
247#if INTEGRATE_ENERGY
248 predictor->e[i] = particles->e[i] + dt * particles->dedt[i];
249 // TODO: in principle there should not be a energy floor (but needed for sedov)
250 if (predictor->e[i] < 1e-6) {
251 predictor->e[i] = 1e-6;
252 }
253#endif
254#if INTEGRATE_SML
255#if DECOUPLE_SML
256 predictor->sml[i] = particles->sml[i] + dt * particles->dsmldt[i];
257#else
258 predictor->sml[i] = particles->sml[i];
259#endif
260#else
261 predictor->sml[i] = particles->sml[i];
262#endif
263 predictor->cs[i] = particles->cs[i];
264 // TODO: why is this needed?
265 predictor->p[i] = particles->p[i];
266 //predictor->ax[i] = particles->ax[i];
267 //predictor->ay[i] = particles->ay[i];
268 //predictor->az[i] = particles->az[i];
269 }
270
271 }
272
287 __global__ void setTimeStep(SimulationTime *simulationTime, Material *materials, Particles *particles,
288 BlockShared *blockShared, int *blockCount, real searchRadius, int numParticles) {
289
290#define SAFETY_FIRST 0.1
291
292 __shared__ real sharedForces[NUM_THREADS_LIMIT_TIME_STEP];
293 __shared__ real sharedCourant[NUM_THREADS_LIMIT_TIME_STEP];
294 __shared__ real sharedArtVisc[NUM_THREADS_LIMIT_TIME_STEP];
295 __shared__ real sharede[NUM_THREADS_LIMIT_TIME_STEP];
296 __shared__ real sharedrho[NUM_THREADS_LIMIT_TIME_STEP];
297 __shared__ real sharedVmax[NUM_THREADS_LIMIT_TIME_STEP];
298
299 int i, j, k, m;
300 int d, dd;
301 int index;
302#if INTEGRATE_ENERGY
303 bool hasEnergy;
304#endif
305 real forces = DBL_MAX;
306 real courant = DBL_MAX;
307 real dtx = DBL_MAX;
308 real dtrho = DBL_MAX;
309 real dte = DBL_MAX;
310 real vmax = 0.; //TODO: initial value
311 real temp;
312 real sml;
313 int matId;
314
315 real ax;
316#if DIM > 1
317 real ay;
318#if DIM == 3
319 real az;
320#endif
321#endif
322 real dtartvisc = DBL_MAX;
323
324 for (i = threadIdx.x + blockIdx.x * blockDim.x; i < numParticles; i+= blockDim.x * gridDim.x) {
325
326 matId = particles->materialId[i];
327
328#if INTEGRATE_ENERGY
329 hasEnergy = false;
330
331// switch (matEOS[matId]) {
332// case (EOS_TYPE_TILLOTSON):
333// hasEnergy = true;
334// break;
335// case (EOS_TYPE_JUTZI):
336// hasEnergy = true;
337// break;
338// case (EOS_TYPE_JUTZI_ANEOS):
339// hasEnergy = true;
340// break;
341// case (EOS_TYPE_SIRONO):
342// hasEnergy = true;
343// break;
344// case (EOS_TYPE_EPSILON):
345// hasEnergy = true;
346// break;
347// case (EOS_TYPE_ANEOS):
348// hasEnergy = true;
349// break;
350// default:
351// hasEnergy = false;
352// break;
353// }
354#endif
355 ax = 0.;
356#if DIM > 1
357 ay = 0.;
358#if DIM == 3
359 az = 0.;
360#endif
361#endif
362#if GRAVITY_SIM
363 ax += particles->g_ax[i];
364#if DIM > 1
365 ay += particles->g_ay[i];
366#if DIM == 3
367 az += particles->g_az[i];
368#endif
369#endif
370#endif
371#if SPH_SIM
372 ax += particles->ax[i];
373#if DIM > 1
374 ay += particles->ay[i];
375#if DIM == 3
376 az += particles->az[i];
377#endif
378#endif
379#endif
380 temp = ax * ax;
381#if DIM > 1
382 temp += ay * ay;
383#if DIM == 3
384 temp += az * az;
385#endif
386#endif
387
388 //if (i % 10000 == 0) {
389 // printf("i: %i ax = %e, ay = %e, az = %e\n", i, ax, ay, az);
390 //}
391 sml = particles->sml[i];
392 temp = cuda::math::sqrt(sml / cuda::math::sqrt(temp));
393 forces = cuda::math::min(forces, temp);
394 //if (forces == 0.) {
395 // printf("forces: %e, sml: %e, temp: %e ax = %e, g_ax = %e (noi: %i)\n", forces, sml, temp, particles->ax[i],
396 // particles->g_ax[i], particles->noi[i]);
397 //}
398 temp = sml / particles->cs[i];
399 courant = cuda::math::min(courant, temp);
400
401 temp = COURANT_FACT * sml / (particles->cs[i] + 1.2 * materials[matId].artificialViscosity.alpha * particles->cs[i] +
402 materials[matId].artificialViscosity.beta * particles->muijmax[i]);
403 dtartvisc = min(dtartvisc, temp);
404
405#if DIM == 1
406 temp = cuda::math::sqrt(particles->vx[i] * particles->vx[i]);
407#elif DIM == 2
408 temp = cuda::math::sqrt(particles->vx[i] * particles->vx[i] +
409 particles->vy[i] * particles->vy[i]);
410#else
411 temp = cuda::math::sqrt(particles->vx[i] * particles->vx[i] +
412 particles->vy[i] * particles->vy[i] +
413 particles->vz[i] * particles->vz[i]);
414#endif
415 //if (i % 10000 == 0) {
416 // printf("i: %i vx = %e, vy = %e, vz = %e\n", i, particles->vx[i], particles->vy[i], particles->vz[i]);
417 //}
418
419 vmax = cuda::math::max(temp, vmax);
420
421#if INTEGRATE_DENSITY
422 if (particles->drhodt[i] != 0) {
423 //TODO: define rhomin_d
424 double rhomin_d = 0.01;
425 temp = SAFETY_FIRST * (cuda::math::abs(particles->rho[i])+rhomin_d)/cuda::math::abs(particles->drhodt[i]);
426 dtrho = cuda::math::min(temp, dtrho);
427 }
428#endif
429#if INTEGRATE_ENERGY
430 //if (particles->dedt[i] != 0 && hasEnergy) {
431 //TODO: define emin_d
432 //temp = SAFETY_FIRST * (cuda::math::abs(particles->e[i])+emin_d)/cuda::math::abs(particles->dedt[i]);
433 //dte = cuda::math::min(temp, dte);
434 //}
435#endif
436
437 }
438
439 __threadfence();
440
441 i = threadIdx.x;
442 sharedForces[i] = forces;
443 sharedCourant[i] = courant;
444 sharede[i] = dte;
445 sharedrho[i] = dtrho;
446 sharedArtVisc[i] = dtartvisc;
447 sharedVmax[i] = vmax;
448
449 for (j = NUM_THREADS_LIMIT_TIME_STEP / 2; j > 0; j /= 2) {
450 __syncthreads();
451 if (i < j) {
452 k = i + j;
453 sharedForces[i] = forces = cuda::math::min(forces, sharedForces[k]);
454 sharedCourant[i] = courant = cuda::math::min(courant, sharedCourant[k]);
455 sharede[i] = dte = cuda::math::min(dte, sharede[k]);
456 sharedrho[i] = dtrho = cuda::math::min(dtrho, sharedrho[k]);
457 sharedArtVisc[i] = dtartvisc = cuda::math::min(dtartvisc, sharedArtVisc[k]);
458 sharedVmax[i] = vmax = cuda::math::max(vmax, sharedVmax[k]);
459 }
460 }
461 // write block result to global memory
462 if (i == 0) {
463 k = blockIdx.x;
464 blockShared->forces[k] = forces;
465 blockShared->courant[k] = courant;
466 blockShared->e[k] = dte;
467 blockShared->rho[k] = dtrho;
468 blockShared->artVisc[k] = dtartvisc;
469 blockShared->vmax[k] = vmax;
470
471
472 m = gridDim.x - 1;
473 if (m == atomicInc((unsigned int *)blockCount, m)) {
474 // last block, so combine all block results
475 for (j = 0; j <= m; j++) {
476 forces = cuda::math::min(forces, blockShared->forces[j]);
477 courant = cuda::math::min(courant, blockShared->courant[j]);
478 dte = cuda::math::min(dte, blockShared->e[j]);
479 dtrho = cuda::math::min(dtrho, blockShared->rho[j]);
480 dtartvisc = cuda::math::min(dtartvisc, blockShared->artVisc[j]);
481 vmax = cuda::math::min(vmax, blockShared->vmax[j]);
482 }
483 // set new timestep
484 *simulationTime->dt = dtx = cuda::math::min(COURANT_FACT*courant, FORCES_FACT*forces);
485 //printf("courant: dt = %e (courant = %e)\n", COURANT_FACT*courant, courant);
486 //printf("force : dt = %e (forces = %e)\n", FORCES_FACT*forces, forces);
487
488 if (vmax > 0. && searchRadius > 0.) { // TODO: searchRadius = 0 for 1 process
489 *simulationTime->dt = cuda::math::min(*simulationTime->dt, searchRadius / (2 * vmax));
490 //printf("search : dt = %e (vmax = %e)\n", searchRadius / (2 * vmax), vmax);
491 }
492#if INTEGRATE_ENERGY
493 *simulationTime->dt = cuda::math::min(*simulationTime->dt, dte);
494 //printf("dte: %e\n", dte);
495#endif
496#if INTEGRATE_DENSITY
497 *simulationTime->dt = cuda::math::min(*simulationTime->dt, dtrho);
498 //printf("dtrho: %e\n", dtrho);
499#endif
500
501 *simulationTime->dt = cuda::math::min(*simulationTime->dt, dtartvisc);
502 //printf("viscos : dt = %e\n", dtartvisc);
503
504 *simulationTime->dt = cuda::math::min(*simulationTime->dt, *simulationTime->subEndTime - *simulationTime->currentTime);
505 if (*simulationTime->dt > *simulationTime->dt_max) {
506 *simulationTime->dt = *simulationTime->dt_max;
507 }
508 //if (*simulationTime->dt < 1.e8) {
509 // *simulationTime->dt = 1.e8;
510 //}
511 //printf("max : dt = %e\n", *simulationTime->dt_max);
512 //printf("dt: %e\n", *simulationTime->dt);
513
514 //printf("Time Step Information: dt(v and x): %.17e dtS: %.17e dte: %.17e dtrho: %.17e dtdamage: %.17e dtalpha: %.17e dtalpha_epspor: %.17e dtepsilon_v: %.17e\n", dtx, dtS, dte, dtrho, dtdamage, dtalpha, dtalpha_epspor, dtepsilon_v);
515 //printf("time: %.17e timestep set to %.17e, integrating until %.17e \n", currentTimeD, dt, endTimeD);
516
517 // reset block count
518 *blockCount = 0;
519 }
520 }
521 }
522
523 real Launch::corrector(Particles *particles, IntegratedParticles *predictor, real dt, int numParticles) {
524 ExecutionPolicy executionPolicy;
525 return cuda::launch(true, executionPolicy, ::PredictorCorrectorEulerNS::Kernel::corrector, particles,
526 predictor, dt, numParticles);
527 }
528 real Launch::predictor(Particles *particles, IntegratedParticles *predictor, real dt, int numParticles) {
529 ExecutionPolicy executionPolicy;
530 return cuda::launch(true, executionPolicy, ::PredictorCorrectorEulerNS::Kernel::predictor, particles,
531 predictor, dt, numParticles);
532 }
533
534 real Launch::setTimeStep(int multiProcessorCount, SimulationTime *simulationTime, Material *materials, Particles *particles,
535 BlockShared *blockShared, int *blockCount, real searchRadius, int numParticles) {
536 ExecutionPolicy executionPolicy(multiProcessorCount, 256);
537 return cuda::launch(true, executionPolicy, ::PredictorCorrectorEulerNS::Kernel::setTimeStep, simulationTime,
538 materials, particles, blockShared, blockCount, searchRadius, numParticles);
539 }
540
541 real Launch::pressureChangeCheck() {
542
543 }
544
545 }
546}
ExecutionPolicy
Execution policy/instruction for CUDA kernel execution.
Definition: cuda_launcher.cuh:33
IntegratedParticles
Definition: particles.cuh:979
Material
Material parameters.
Definition: material.cuh:88
Material::artificialViscosity
ArtificialViscosity artificialViscosity
Definition: material.cuh:114
Particles
Particle(s) class based on SoA (Structur of Arrays).
Definition: particles.cuh:50
Particles::e
real * e
(pointer to) internal energy (array)
Definition: particles.cuh:121
Particles::materialId
integer * materialId
(pointer to) material identifier (array)
Definition: particles.cuh:111
Particles::x
real * x
(pointer to) x position (array)
Definition: particles.cuh:62
Particles::rho
real * rho
(pointer to) density (array)
Definition: particles.cuh:133
Particles::drhodt
real * drhodt
(pointer to) time derivative of density (array)
Definition: particles.cuh:148
Particles::g_ay
real * g_ay
(pointer to) y gravitational acceleration (array)
Definition: particles.cuh:92
Particles::ay
real * ay
(pointer to) y acceleration (array)
Definition: particles.cuh:74
Particles::az
real * az
(pointer to) z acceleration (array)
Definition: particles.cuh:82
Particles::p
real * p
(pointer to) pressure (array)
Definition: particles.cuh:135
Particles::cs
real * cs
(pointer to) sound of speed (array)
Definition: particles.cuh:129
Particles::y
real * y
(pointer to) y position (array)
Definition: particles.cuh:70
Particles::ax
real * ax
(pointer to) x acceleration (array)
Definition: particles.cuh:66
Particles::g_ax
real * g_ax
(pointer to) x gravitational acceleration (array)
Definition: particles.cuh:88
Particles::sml
real * sml
(pointer to) smoothing length (array)
Definition: particles.cuh:113
Particles::dedt
real * dedt
(pointer to) time derivative of internal energy (array)
Definition: particles.cuh:123
Particles::z
real * z
(pointer to) z position (array)
Definition: particles.cuh:78
Particles::vz
real * vz
(pointer to) z velocity (array)
Definition: particles.cuh:80
Particles::muijmax
real * muijmax
(pointer) to max(mu_ij) (array) needed for artificial viscosity and determining timestp
Definition: particles.cuh:138
Particles::g_az
real * g_az
(pointer to) z gravitational acceleration (array)
Definition: particles.cuh:96
Particles::vx
real * vx
(pointer to) x velocity (array)
Definition: particles.cuh:64
Particles::vy
real * vy
(pointer to) y velocity (array)
Definition: particles.cuh:72
SimulationTime
Definition: simulation_time.cuh:14
SimulationTime::dt
real * dt
Definition: simulation_time.cuh:17
SimulationTime::currentTime
real * currentTime
Definition: simulation_time.cuh:21
SimulationTime::dt_max
real * dt_max
Definition: simulation_time.cuh:22
SimulationTime::subEndTime
real * subEndTime
Definition: simulation_time.cuh:19
CUDA_CALLABLE_MEMBER
#define CUDA_CALLABLE_MEMBER
Definition: cuda_utilities.cuh:30
SAFETY_FIRST
#define SAFETY_FIRST
Kernel
Definition: device_rhs.cuh:7
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::BlockSharedNS::setVmax
__global__ void setVmax(BlockShared *blockShared, real *vmax)
Definition: device_predictor_corrector_euler.cu:101
PredictorCorrectorEulerNS::BlockSharedNS::set
__global__ void set(BlockShared *blockShared, real *forces, real *courant, real *artVisc)
Definition: device_predictor_corrector_euler.cu:92
PredictorCorrectorEulerNS::BlockSharedNS::setRho
__global__ void setRho(BlockShared *blockShared, real *e)
Definition: device_predictor_corrector_euler.cu:98
PredictorCorrectorEulerNS::BlockSharedNS::setE
__global__ void setE(BlockShared *blockShared, real *e)
Definition: device_predictor_corrector_euler.cu:95
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::pressureChangeCheck
real pressureChangeCheck()
Definition: device_predictor_corrector_euler.cu:541
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
PredictorCorrectorEulerNS::Kernel::corrector
__global__ void corrector(Particles *particles, IntegratedParticles *predictor, real dt, int numParticles)
Corrector step.
Definition: device_predictor_corrector_euler.cu:130
PredictorCorrectorEulerNS::Kernel::setTimeStep
__global__ void setTimeStep(SimulationTime *simulationTime, Material *materials, Particles *particles, BlockShared *blockShared, int *blockCount, real searchRadius, int numParticles)
Definition: device_predictor_corrector_euler.cu:287
PredictorCorrectorEulerNS::Kernel::setTimeStep
__global__ void setTimeStep(SimulationTime *simulationTime, Material *materials, Particles *particles, BlockShared *blockShared, int *blockCount, int numParticles)
Setting correct time step.
PredictorCorrectorEulerNS::Kernel::predictor
__global__ void predictor(Particles *particles, IntegratedParticles *predictor, real dt, int numParticles)
Predictor step.
Definition: device_predictor_corrector_euler.cu:223
PredictorCorrectorEulerNS::SharedNS::Launch::set
void set(Shared *shared, real *forces, real *courant, real *artVisc)
Definition: device_predictor_corrector_euler.cu:46
PredictorCorrectorEulerNS::SharedNS::Launch::setRho
void setRho(Shared *shared, real *rho)
Definition: device_predictor_corrector_euler.cu:55
PredictorCorrectorEulerNS::SharedNS::Launch::setE
void setE(Shared *shared, real *e)
Definition: device_predictor_corrector_euler.cu:51
PredictorCorrectorEulerNS::SharedNS::Launch::setVmax
void setVmax(Shared *shared, real *vmax)
Definition: device_predictor_corrector_euler.cu:59
PredictorCorrectorEulerNS::SharedNS::setRho
__global__ void setRho(Shared *shared, real *rho)
Definition: device_predictor_corrector_euler.cu:39
PredictorCorrectorEulerNS::SharedNS::setVmax
__global__ void setVmax(Shared *shared, real *vmax)
Definition: device_predictor_corrector_euler.cu:42
PredictorCorrectorEulerNS::SharedNS::setE
__global__ void setE(Shared *shared, real *e)
Definition: device_predictor_corrector_euler.cu:36
PredictorCorrectorEulerNS::SharedNS::set
__global__ void set(Shared *shared, real *forces, real *courant, real *artVisc)
Definition: device_predictor_corrector_euler.cu:33
PredictorCorrectorEulerNS
predictor corrector euler (Heun) integrator
Definition: device_predictor_corrector_euler.cuh:16
ProfilerIds::numParticles
const char *const numParticles
Definition: h5profiler.h:29
cuda::math::min
__device__ real min(real a, real b)
Minimum value out of two floating point values.
Definition: cuda_utilities.cu:414
cuda::math::sqrt
__device__ real sqrt(real a)
Square root of a floating point value.
Definition: cuda_utilities.cu:456
cuda::math::abs
__device__ real abs(real a)
Absolute value of a floating point value.
Definition: cuda_utilities.cu:448
cuda::math::max
__device__ real max(real a, real b)
Maximum value out of two floating point values.
Definition: cuda_utilities.cu:431
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::launch
real launch(bool timeKernel, const ExecutionPolicy &policy, void(*f)(Arguments...), Arguments... args)
CUDA execution wrapper function.
Definition: cuda_launcher.cuh:114
real
double real
Definition: parameter.h:15
NUM_THREADS_LIMIT_TIME_STEP
#define NUM_THREADS_LIMIT_TIME_STEP
Definition: parameter.h:107
INTEGRATE_DENSITY
#define INTEGRATE_DENSITY
integrate density equation
Definition: parameter.h:58
COURANT_FACT
#define COURANT_FACT
Definition: parameter.h:111
DIM
#define DIM
Dimension of the problem.
Definition: parameter.h:38
FORCES_FACT
#define FORCES_FACT
Definition: parameter.h:113
DBL_MAX
#define DBL_MAX
Definition: parameter.h:116
ArtificialViscosity::alpha
real alpha
Artificial viscosity .
Definition: material.cuh:48
ArtificialViscosity::beta
real beta
Artificial viscosity .
Definition: material.cuh:50
PredictorCorrectorEulerNS::BlockShared
Definition: device_predictor_corrector_euler.cuh:50
PredictorCorrectorEulerNS::BlockShared::courant
real * courant
Definition: device_predictor_corrector_euler.cuh:52
PredictorCorrectorEulerNS::BlockShared::vmax
real * vmax
Definition: device_predictor_corrector_euler.cuh:56
PredictorCorrectorEulerNS::BlockShared::setRho
CUDA_CALLABLE_MEMBER void setRho(real *rho)
Definition: device_predictor_corrector_euler.cu:85
PredictorCorrectorEulerNS::BlockShared::~BlockShared
CUDA_CALLABLE_MEMBER ~BlockShared()
Definition: device_predictor_corrector_euler.cu:74
PredictorCorrectorEulerNS::BlockShared::set
CUDA_CALLABLE_MEMBER void set(real *forces, real *courant, real *artVisc)
Definition: device_predictor_corrector_euler.cu:77
PredictorCorrectorEulerNS::BlockShared::setE
CUDA_CALLABLE_MEMBER void setE(real *e)
Definition: device_predictor_corrector_euler.cu:82
PredictorCorrectorEulerNS::BlockShared::artVisc
real * artVisc
Definition: device_predictor_corrector_euler.cuh:53
PredictorCorrectorEulerNS::BlockShared::rho
real * rho
Definition: device_predictor_corrector_euler.cuh:55
PredictorCorrectorEulerNS::BlockShared::forces
real * forces
Definition: device_predictor_corrector_euler.cuh:51
PredictorCorrectorEulerNS::BlockShared::e
real * e
Definition: device_predictor_corrector_euler.cuh:54
PredictorCorrectorEulerNS::BlockShared::setVmax
CUDA_CALLABLE_MEMBER void setVmax(real *vmax)
Definition: device_predictor_corrector_euler.cu:88
PredictorCorrectorEulerNS::BlockShared::BlockShared
CUDA_CALLABLE_MEMBER BlockShared()
Definition: device_predictor_corrector_euler.cu:66
PredictorCorrectorEulerNS::Shared
Definition: device_predictor_corrector_euler.cuh:18
PredictorCorrectorEulerNS::Shared::courant
real * courant
Definition: device_predictor_corrector_euler.cuh:20
PredictorCorrectorEulerNS::Shared::rho
real * rho
Definition: device_predictor_corrector_euler.cuh:23
PredictorCorrectorEulerNS::Shared::Shared
CUDA_CALLABLE_MEMBER Shared()
Definition: device_predictor_corrector_euler.cu:7
PredictorCorrectorEulerNS::Shared::forces
real * forces
Definition: device_predictor_corrector_euler.cuh:19
PredictorCorrectorEulerNS::Shared::artVisc
real * artVisc
Definition: device_predictor_corrector_euler.cuh:21
PredictorCorrectorEulerNS::Shared::setVmax
CUDA_CALLABLE_MEMBER void setVmax(real *vmax)
Definition: device_predictor_corrector_euler.cu:29
PredictorCorrectorEulerNS::Shared::setE
CUDA_CALLABLE_MEMBER void setE(real *e)
Definition: device_predictor_corrector_euler.cu:23
PredictorCorrectorEulerNS::Shared::vmax
real * vmax
Definition: device_predictor_corrector_euler.cuh:24
PredictorCorrectorEulerNS::Shared::~Shared
CUDA_CALLABLE_MEMBER ~Shared()
Definition: device_predictor_corrector_euler.cu:15
PredictorCorrectorEulerNS::Shared::setRho
CUDA_CALLABLE_MEMBER void setRho(real *rho)
Definition: device_predictor_corrector_euler.cu:26
PredictorCorrectorEulerNS::Shared::set
CUDA_CALLABLE_MEMBER void set(real *forces, real *courant, real *artVisc)
Definition: device_predictor_corrector_euler.cu:18
PredictorCorrectorEulerNS::Shared::e
real * e
Definition: device_predictor_corrector_euler.cuh:22

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