Fixing memory seg fault w/ multi occasional nlist

This commit is contained in:
jtclemm
2024-11-04 13:16:07 -07:00
parent d2f761f8ed
commit bf888045d6

View File

@ -223,15 +223,15 @@ void NStencil::create_setup()
// smax = max possible size of entire 3d stencil // smax = max possible size of entire 3d stencil
// stencil will be empty if cutneighmax = 0.0 // stencil will be empty if cutneighmax = 0.0
sx = static_cast<int>(cutneighmax*bininvx); sx = static_cast<int>(cutneighmax * bininvx);
if (sx*binsizex < cutneighmax) sx++; if (sx * binsizex < cutneighmax) sx++;
sy = static_cast<int>(cutneighmax*bininvy); sy = static_cast<int>(cutneighmax * bininvy);
if (sy*binsizey < cutneighmax) sy++; if (sy * binsizey < cutneighmax) sy++;
sz = static_cast<int>(cutneighmax*bininvz); sz = static_cast<int>(cutneighmax * bininvz);
if (sz*binsizez < cutneighmax) sz++; if (sz * binsizez < cutneighmax) sz++;
if (dimension == 2) sz = 0; if (dimension == 2) sz = 0;
int smax = (2*sx+1) * (2*sy+1) * (2*sz+1); int smax = (2 * sx + 1) * (2 * sy + 1) * (2 * sz + 1);
// reallocate stencil structs if necessary // reallocate stencil structs if necessary
// for BIN and MULTI_OLD styles // for BIN and MULTI_OLD styles
@ -240,10 +240,10 @@ void NStencil::create_setup()
if (smax > maxstencil) { if (smax > maxstencil) {
maxstencil = smax; maxstencil = smax;
memory->destroy(stencil); memory->destroy(stencil);
memory->create(stencil,maxstencil,"neighstencil:stencil"); memory->create(stencil, maxstencil, "neighstencil:stencil");
if (xyzflag) { if (xyzflag) {
memory->destroy(stencilxyz); memory->destroy(stencilxyz);
memory->create(stencilxyz,maxstencil,3,"neighstencil:stencilxyz"); memory->create(stencilxyz, maxstencil, 3, "neighstencil:stencilxyz");
} }
} }
@ -251,9 +251,9 @@ void NStencil::create_setup()
int i; int i;
int n = atom->ntypes; int n = atom->ntypes;
if (maxstencil_multi_old == 0) { if (maxstencil_multi_old == 0) {
nstencil_multi_old = new int[n+1]; nstencil_multi_old = new int[n + 1];
stencil_multi_old = new int*[n+1]; stencil_multi_old = new int*[n + 1];
distsq_multi_old = new double*[n+1]; distsq_multi_old = new double*[n + 1];
for (i = 1; i <= n; i++) { for (i = 1; i <= n; i++) {
nstencil_multi_old[i] = 0; nstencil_multi_old[i] = 0;
stencil_multi_old[i] = nullptr; stencil_multi_old[i] = nullptr;
@ -265,9 +265,9 @@ void NStencil::create_setup()
for (i = 1; i <= n; i++) { for (i = 1; i <= n; i++) {
memory->destroy(stencil_multi_old[i]); memory->destroy(stencil_multi_old[i]);
memory->destroy(distsq_multi_old[i]); memory->destroy(distsq_multi_old[i]);
memory->create(stencil_multi_old[i],maxstencil_multi_old, memory->create(stencil_multi_old[i], maxstencil_multi_old,
"neighstencil:stencil_multi_old"); "neighstencil:stencil_multi_old");
memory->create(distsq_multi_old[i],maxstencil_multi_old, memory->create(distsq_multi_old[i], maxstencil_multi_old,
"neighstencil:distsq_multi_old"); "neighstencil:distsq_multi_old");
} }
} }
@ -280,7 +280,7 @@ void NStencil::create_setup()
if (nb) copy_bin_info_multi(); if (nb) copy_bin_info_multi();
// Deallocate arrays if previously allocated // Deallocate arrays if previously allocated
if((n > maxcollections) && stencil_multi){ if ((n > maxcollections) && stencil_multi){
memory->destroy(nstencil_multi); memory->destroy(nstencil_multi);
for (i = 0; i < maxcollections; i++) { for (i = 0; i < maxcollections; i++) {
for (j = 0; j < maxcollections; j++) for (j = 0; j < maxcollections; j++)
@ -339,10 +339,10 @@ void NStencil::create_setup()
memory->create(maxstencil_multi, n, n, "neighstencil::maxstencil_multi"); memory->create(maxstencil_multi, n, n, "neighstencil::maxstencil_multi");
memory->create(nstencil_multi, n, n, "neighstencil::nstencil_multi"); memory->create(nstencil_multi, n, n, "neighstencil::nstencil_multi");
stencil_multi = new int**[n](); stencil_multi = new int**[n]();
for (i = 0; i < n; ++i) { for (i = 0; i < n; i++) {
stencil_multi[i] = new int*[n](); stencil_multi[i] = new int*[n]();
for (j = 0; j < n; ++j) { for (j = 0; j < n; j++) {
maxstencil_multi[i][j] = 0; maxstencil_multi[i][j] = 0;
nstencil_multi[i][j] = 0; nstencil_multi[i][j] = 0;
stencil_multi[i][j] = nullptr; stencil_multi[i][j] = nullptr;
} }
@ -378,23 +378,23 @@ void NStencil::create_setup()
stencil_range = sqrt(cutcollectionsq[i][j]); stencil_range = sqrt(cutcollectionsq[i][j]);
sx = static_cast<int> (stencil_range*bininvx_multi[bin_collection]); sx = static_cast<int> (stencil_range * bininvx_multi[bin_collection]);
if (sx*binsizex_multi[bin_collection] < stencil_range) sx++; if (sx * binsizex_multi[bin_collection] < stencil_range) sx++;
sy = static_cast<int> (stencil_range*bininvy_multi[bin_collection]); sy = static_cast<int> (stencil_range * bininvy_multi[bin_collection]);
if (sy*binsizey_multi[bin_collection] < stencil_range) sy++; if (sy * binsizey_multi[bin_collection] < stencil_range) sy++;
sz = static_cast<int> (stencil_range*bininvz_multi[bin_collection]); sz = static_cast<int> (stencil_range * bininvz_multi[bin_collection]);
if (sz*binsizez_multi[bin_collection] < stencil_range) sz++; if (sz * binsizez_multi[bin_collection] < stencil_range) sz++;
if (dimension == 2) sz = 0; if (dimension == 2) sz = 0;
stencil_sx_multi[i][j] = sx; stencil_sx_multi[i][j] = sx;
stencil_sy_multi[i][j] = sy; stencil_sy_multi[i][j] = sy;
stencil_sz_multi[i][j] = sz; stencil_sz_multi[i][j] = sz;
smax = ((2*sx+1) * (2*sy+1) * (2*sz+1)); smax = ((2 * sx + 1) * (2 * sy + 1) * (2 * sz + 1));
if (smax > maxstencil_multi[i][j]) { if (smax > maxstencil_multi[i][j]) {
maxstencil_multi[i][j] = smax; maxstencil_multi[i][j] = smax;
if(stencil_multi[i][j]) if (stencil_multi[i][j])
memory->destroy(stencil_multi[i][j]); memory->destroy(stencil_multi[i][j]);
memory->create(stencil_multi[i][j], smax, memory->create(stencil_multi[i][j], smax,
"neighstencil::stencil_multi"); "neighstencil::stencil_multi");
@ -457,16 +457,18 @@ double NStencil::memory_usage()
{ {
double bytes = 0; double bytes = 0;
if (neighstyle == Neighbor::BIN) { if (neighstyle == Neighbor::BIN) {
bytes += memory->usage(stencil,maxstencil); bytes += memory->usage(stencil, maxstencil);
bytes += memory->usage(stencilxyz,maxstencil,3); bytes += memory->usage(stencilxyz, maxstencil, 3);
} else if (neighstyle == Neighbor::MULTI_OLD) { } else if (neighstyle == Neighbor::MULTI_OLD) {
bytes += (double)atom->ntypes*maxstencil_multi_old * sizeof(int); bytes += (double)atom->ntypes * maxstencil_multi_old * sizeof(int);
bytes += (double)atom->ntypes*maxstencil_multi_old * sizeof(double); bytes += (double)atom->ntypes * maxstencil_multi_old * sizeof(double);
} else if (neighstyle == Neighbor::MULTI) { } else if (neighstyle == Neighbor::MULTI) {
int n = ncollections; int n = ncollections;
for (int i = 0; i < n; i++) { if (maxstencil_multi) {
for (int j = 0; j < n; j++) { for (int i = 0; i < n; i++) {
bytes += (double)maxstencil_multi[i][j] * sizeof(int); for (int j = 0; j < n; j++) {
bytes += (double)maxstencil_multi[i][j] * sizeof(int);
}
} }
} }
} }