Optimized particlePool handling
This commit is contained in:
@@ -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;
|
||||
|
||||
|
@@ -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));
|
||||
}
|
||||
|
@@ -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
|
@@ -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");
|
||||
}
|
||||
|
Reference in New Issue
Block a user