-
Notifications
You must be signed in to change notification settings - Fork 14
Open
Description
Hello,
I have run a N-body by your code with npar=800^3 and obtained a Segmentation fault. I found the problem with gdb that the bytes you defined to contain pos of particles to write is defiened as unsigned int, which is too small even though I use npar=800^3(800^3*3*sizeof(float) > 2^32-1).
Attach the code in GadgetUtils/GadgetUtils.h:
unsigned int bytes = ntowrite * NDIM * sizeof(float);
buffer = std::vector(bytes);
// If particles have family then sort POS of them by family in the buffer
if constexpr (FML::PARTICLE::has_get_pos<T>()) {
bytes = ntowrite * NDIM * sizeof(float);
buffer.resize(bytes);
float_buffer = reinterpret_cast<float *>(buffer.data());
size_t count = 0;
for (int curfamily = 0; curfamily < 6; curfamily++) {
if (npart_family[curfamily] > 0) {
for (size_t j = 0; j < ntowrite; j++) {
auto * pos = FML::PARTICLE::GetPos(part[j]);
if constexpr (FML::PARTICLE::has_get_family<T>()) {
auto family = FML::PARTICLE::GetFamily(part[j]);
if (family == curfamily) {
for (int idim = 0; idim < NDIM; idim++)
float_buffer[NDIM * count + idim] = float(pos[idim]) * pos_norm;
count++;
}
} else {
for (int idim = 0; idim < NDIM; idim++)
float_buffer[NDIM * count + idim] = float(pos[idim]) * pos_norm;
count++;
}
}
}
}
assert(count == ntowrite);
write_section(fp, buffer, bytes);
}
Metadata
Metadata
Assignees
Labels
No labels