Wrote down JPs suggestion for later use.
This commit is contained in:
@@ -81,3 +81,88 @@ Make is possible for the particle to accrete momentum in addition to mass, and t
|
|||||||
Create sink particles dynamically and allow the presence of multiple sinks.
|
Create sink particles dynamically and allow the presence of multiple sinks.
|
||||||
|
|
||||||
|
|
||||||
|
Suggestion writen by JP:
|
||||||
|
|
||||||
|
```
|
||||||
|
add to acc/mhd_solver/stencil_defines.h:
|
||||||
|
// Scalar mass
|
||||||
|
#define AC_FOR_USER_REAL_PARAM_TYPES(FUNC) \
|
||||||
|
...
|
||||||
|
...
|
||||||
|
FUNC(AC_sink_particle_mass),
|
||||||
|
|
||||||
|
// Vector position
|
||||||
|
// NOTE: This makes an AcReal3 constant parameter
|
||||||
|
// This is a completely new type that has not yet been
|
||||||
|
// tested. Accessible from the DSL with
|
||||||
|
// DCONST_REAL3(AC_sink_particle_pos)
|
||||||
|
#define AC_FOR_USER_REAL3_PARAM_TYPES(FUNC) \
|
||||||
|
...
|
||||||
|
...
|
||||||
|
FUNC(AC_sink_particle_pos),
|
||||||
|
|
||||||
|
// Vertex buffer for accretion
|
||||||
|
#define AC_FOR_VTXBUF_HANDLES(FUNC) \
|
||||||
|
...
|
||||||
|
FUNC(VTXBUF_ACCRETION),
|
||||||
|
|
||||||
|
|
||||||
|
acc/mhd_solver/stencil_process.sps:
|
||||||
|
|
||||||
|
Scalar
|
||||||
|
your_accretion_function(int3 globalVertexIdx)
|
||||||
|
{
|
||||||
|
Scalar mass = DCONST_REAL(AC_sink_particle_mass);
|
||||||
|
Vector pos0 = DCONST_REAL3(AC_sink_particle_pos);
|
||||||
|
Vector pos1 = (Vector){ (globalVertexIdx.x - nx_min) * dsx), ...};
|
||||||
|
|
||||||
|
return *accretion from the current cell at globalVertexIdx*
|
||||||
|
}
|
||||||
|
|
||||||
|
// This should have a global scope
|
||||||
|
out Scalar out_accretion = VTXBUF_ACCRETION;
|
||||||
|
|
||||||
|
Kernel void
|
||||||
|
solve(Scalar dt) {
|
||||||
|
|
||||||
|
...
|
||||||
|
...
|
||||||
|
|
||||||
|
out_accretion = your_accretion_function(globalVertexIdx);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
src/standalone/model/host_accretion.cc: <- new file
|
||||||
|
#include "astaroth.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
updateAccretion(AcMeshInfo* info)
|
||||||
|
{
|
||||||
|
AcReal previous_mass = info->real_params[AC_sink_particle_mass];
|
||||||
|
AcReal accreted_mass = acReduceScal(RTYPE_SUM, VTXBUF_ACCRETION);
|
||||||
|
// Note: RTYPE_SUM does not yet exist (but is easy to add)
|
||||||
|
|
||||||
|
AcReal mass = previous_mass + accreted_mass;
|
||||||
|
info->real_params[AC_sink_particle_mass] = mass; // Save for the next iteration
|
||||||
|
acLoadDeviceConstant(AC_sink_particle_mass, mass); // Load to the GPUs
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
src/standalone/simulation.cc:
|
||||||
|
|
||||||
|
#include "model/host_accretion.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
run_simulation(void)
|
||||||
|
{
|
||||||
|
...
|
||||||
|
|
||||||
|
while (simulation_running) {
|
||||||
|
...
|
||||||
|
...
|
||||||
|
|
||||||
|
updateAccretion(&mesh_info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user