Optimized particlePool handling

This commit is contained in:
2023-08-21 10:40:48 +02:00
parent e00e375b6a
commit ada0381f79
47 changed files with 22761 additions and 47 deletions

View File

@@ -116,7 +116,7 @@ int main(int argc, char** argv)
solver_generic[variant - 1](&s);
adaptUV(&s);
trace(&particletracer, &s, s.u, s.v, s.w, t);
trace(&particletracer, s.u, s.v, s.w, t);
t += s.dt;

View File

@@ -177,7 +177,7 @@ void freeParticles(ParticleTracer* particletracer)
free(particletracer->linSpaceLine);
}
void writeParticles(ParticleTracer* particletracer, Solver* solver)
void writeParticles(ParticleTracer* particletracer)
{
VtkOptions opts = { .particletracer = particletracer };
@@ -256,7 +256,7 @@ void printParticleTracerParameters(ParticleTracer* particletracer)
printf("\tdt : %.2f, dx : %.2f, dy : %.2f, dz : %.2f\n", particletracer->dt, particletracer->dx, particletracer->dy, particletracer->dz);
}
void trace(ParticleTracer* particletracer, Solver* solver, double* u, double* v, double* w, double time)
void trace(ParticleTracer* particletracer, double* u, double* v, double* w, double time)
{
if (time >= particletracer->startTime)
{
@@ -268,25 +268,34 @@ void trace(ParticleTracer* particletracer, Solver* solver, double* u, double* v,
}
if( (time - particletracer->lastWriteTime) >= particletracer->writeTimePeriod)
{
activeParticleChecker(particletracer);
writeParticles(particletracer, solver);
writeParticles(particletracer);
particletracer->lastWriteTime = time;
}
advanceParticles(particletracer, u, v, w, time);
compress(particletracer);
particletracer->lastUpdateTime = time;
}
}
void activeParticleChecker(ParticleTracer* particletracer)
void compress(ParticleTracer* particletracer)
{
particletracer->activeParticles = 0;
Particle* particlePool = particletracer->particlePool;
for (int i = 0; i < particletracer->totalParticles; ++i)
Particle* memPool = particletracer->particlePool;
Particle tempPool[particletracer->totalParticles];
int totalParticles = 0;
for(int i=0; i < particletracer->totalParticles; ++i)
{
if(particlePool[i].flag == true)
if(memPool[i].flag == 1)
{
++(particletracer->activeParticles);
tempPool[totalParticles].x = memPool[i].x;
tempPool[totalParticles].y = memPool[i].y;
tempPool[totalParticles].z = memPool[i].z;
tempPool[totalParticles].flag = memPool[i].flag;
++totalParticles;
}
}
}
particletracer->totalParticles = totalParticles;
memcpy(particletracer->particlePool, tempPool, totalParticles*sizeof(Particle));
}

View File

@@ -40,9 +40,9 @@ void initParticleTracer(ParticleTracer*, Parameter*);
void injectParticles(ParticleTracer*);
void advanceParticles(ParticleTracer*, double* , double*, double*, double);
void freeParticles(ParticleTracer*);
void writeParticles(ParticleTracer*, Solver*);
void writeParticles(ParticleTracer*);
void printParticleTracerParameters(ParticleTracer*);
void printParticles(ParticleTracer*);
void activeParticleChecker(ParticleTracer*);
void trace(ParticleTracer*, Solver*, double* , double* , double* , double);
void compress(ParticleTracer*);
void trace(ParticleTracer*, double* , double* , double* , double);
#endif

View File

@@ -172,32 +172,29 @@ void vtkParticle(VtkOptions* o, char* name)
exit(EXIT_FAILURE);
}
fprintf(o->fh, "POINTS %d float\n", o->particletracer->activeParticles);
fprintf(o->fh, "POINTS %d float\n", o->particletracer->totalParticles);
for (int i = 0; i < o->particletracer->totalParticles; ++i)
{
if(particlePool[i].flag == true)
{
double x = particlePool[i].x;
double y = particlePool[i].y;
double z = particlePool[i].z;
fprintf(o->fh, "%.2f %.2f %.2f\n", x, y, z);
}
}
fprintf(o->fh, "CELLS %d %d\n", o->particletracer->activeParticles, 2 * o->particletracer->activeParticles);
fprintf(o->fh, "CELLS %d %d\n", o->particletracer->totalParticles, 2 * o->particletracer->totalParticles);
for (int i = 0; i < o->particletracer->activeParticles; ++i)
for (int i = 0; i < o->particletracer->totalParticles; ++i)
{
fprintf(o->fh, "1 %d\n", i);
}
fprintf(o->fh, "CELL_TYPES %d\n", o->particletracer->activeParticles);
fprintf(o->fh, "CELL_TYPES %d\n", o->particletracer->totalParticles);
for (int i = 0; i < o->particletracer->activeParticles; ++i)
for (int i = 0; i < o->particletracer->totalParticles; ++i)
{
fprintf(o->fh, "1\n");
}