Copying more variables to classes and moving/clarifying definitions
This commit is contained in:
93
src/nbin.cpp
93
src/nbin.cpp
@ -123,3 +123,96 @@ void NBin::copy_neighbor_info()
|
|||||||
|
|
||||||
if (cutoff_custom > 0.0) cutneighmax = cutoff_custom;
|
if (cutoff_custom > 0.0) cutneighmax = cutoff_custom;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
convert atom coords into local bin #
|
||||||
|
for orthogonal, only ghost atoms will have coord >= bboxhi or coord < bboxlo
|
||||||
|
take special care to insure ghosts are in correct bins even w/ roundoff
|
||||||
|
hi ghost atoms = nbin,nbin+1,etc
|
||||||
|
owned atoms = 0 to nbin-1
|
||||||
|
lo ghost atoms = -1,-2,etc
|
||||||
|
this is necessary so that both procs on either side of PBC
|
||||||
|
treat a pair of atoms straddling the PBC in a consistent way
|
||||||
|
for triclinic, doesn't matter since stencil & neigh list built differently
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int NBin::coord2bin(double *x)
|
||||||
|
{
|
||||||
|
int ix,iy,iz;
|
||||||
|
|
||||||
|
if (!std::isfinite(x[0]) || !std::isfinite(x[1]) || !std::isfinite(x[2]))
|
||||||
|
error->one(FLERR,"Non-numeric positions - simulation unstable");
|
||||||
|
|
||||||
|
if (x[0] >= bboxhi[0])
|
||||||
|
ix = static_cast<int> ((x[0]-bboxhi[0])*bininvx) + nbinx;
|
||||||
|
else if (x[0] >= bboxlo[0]) {
|
||||||
|
ix = static_cast<int> ((x[0]-bboxlo[0])*bininvx);
|
||||||
|
ix = MIN(ix,nbinx-1);
|
||||||
|
} else
|
||||||
|
ix = static_cast<int> ((x[0]-bboxlo[0])*bininvx) - 1;
|
||||||
|
|
||||||
|
if (x[1] >= bboxhi[1])
|
||||||
|
iy = static_cast<int> ((x[1]-bboxhi[1])*bininvy) + nbiny;
|
||||||
|
else if (x[1] >= bboxlo[1]) {
|
||||||
|
iy = static_cast<int> ((x[1]-bboxlo[1])*bininvy);
|
||||||
|
iy = MIN(iy,nbiny-1);
|
||||||
|
} else
|
||||||
|
iy = static_cast<int> ((x[1]-bboxlo[1])*bininvy) - 1;
|
||||||
|
|
||||||
|
if (x[2] >= bboxhi[2])
|
||||||
|
iz = static_cast<int> ((x[2]-bboxhi[2])*bininvz) + nbinz;
|
||||||
|
else if (x[2] >= bboxlo[2]) {
|
||||||
|
iz = static_cast<int> ((x[2]-bboxlo[2])*bininvz);
|
||||||
|
iz = MIN(iz,nbinz-1);
|
||||||
|
} else
|
||||||
|
iz = static_cast<int> ((x[2]-bboxlo[2])*bininvz) - 1;
|
||||||
|
|
||||||
|
return (iz-mbinzlo)*mbiny*mbinx + (iy-mbinylo)*mbinx + (ix-mbinxlo);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
convert atom coords into local bin # for a particular type
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
int NBin::coord2bin_multi2(double *x, int it)
|
||||||
|
{
|
||||||
|
int ix,iy,iz;
|
||||||
|
int ibin;
|
||||||
|
|
||||||
|
if (!std::isfinite(x[0]) || !std::isfinite(x[1]) || !std::isfinite(x[2]))
|
||||||
|
error->one(FLERR,"Non-numeric positions - simulation unstable");
|
||||||
|
|
||||||
|
if (x[0] >= bboxhi[0])
|
||||||
|
ix = static_cast<int> ((x[0]-bboxhi[0])*bininvx_multi2[it]) + nbinx_multi2[it];
|
||||||
|
else if (x[0] >= bboxlo[0]) {
|
||||||
|
ix = static_cast<int> ((x[0]-bboxlo[0])*bininvx_multi2[it]);
|
||||||
|
ix = MIN(ix,nbinx_multi2[it]-1);
|
||||||
|
} else
|
||||||
|
ix = static_cast<int> ((x[0]-bboxlo[0])*bininvx_multi2[it]) - 1;
|
||||||
|
|
||||||
|
if (x[1] >= bboxhi[1])
|
||||||
|
iy = static_cast<int> ((x[1]-bboxhi[1])*bininvy_multi2[it]) + nbiny_multi2[it];
|
||||||
|
else if (x[1] >= bboxlo[1]) {
|
||||||
|
iy = static_cast<int> ((x[1]-bboxlo[1])*bininvy_multi2[it]);
|
||||||
|
iy = MIN(iy,nbiny_multi2[it]-1);
|
||||||
|
} else
|
||||||
|
iy = static_cast<int> ((x[1]-bboxlo[1])*bininvy_multi2[it]) - 1;
|
||||||
|
|
||||||
|
if (x[2] >= bboxhi[2])
|
||||||
|
iz = static_cast<int> ((x[2]-bboxhi[2])*bininvz_multi2[it]) + nbinz_multi2[it];
|
||||||
|
else if (x[2] >= bboxlo[2]) {
|
||||||
|
iz = static_cast<int> ((x[2]-bboxlo[2])*bininvz_multi2[it]);
|
||||||
|
iz = MIN(iz,nbinz_multi2[it]-1);
|
||||||
|
} else
|
||||||
|
iz = static_cast<int> ((x[2]-bboxlo[2])*bininvz_multi2[it]) - 1;
|
||||||
|
|
||||||
|
|
||||||
|
ibin = (iz-mbinzlo_multi2[it])*mbiny_multi2[it]*mbinx_multi2[it]
|
||||||
|
+ (iy-mbinylo_multi2[it])*mbinx_multi2[it]
|
||||||
|
+ (ix-mbinxlo_multi2[it]);
|
||||||
|
return ibin;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -97,7 +97,7 @@ class NBin : protected Pointers {
|
|||||||
// methods
|
// methods
|
||||||
|
|
||||||
int coord2bin(double *);
|
int coord2bin(double *);
|
||||||
int coord2bin(double *, int);
|
int coord2bin_multi2(double *, int);
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -324,7 +324,7 @@ void NBinMulti2::bin_atoms()
|
|||||||
for (i = nall-1; i >= nlocal; i--) {
|
for (i = nall-1; i >= nlocal; i--) {
|
||||||
if (mask[i] & bitmask) {
|
if (mask[i] & bitmask) {
|
||||||
n = type[i];
|
n = type[i];
|
||||||
ibin = coord2bin(x[i], n);
|
ibin = coord2bin_multi2(x[i], n);
|
||||||
atom2bin_multi2[n][i] = ibin;
|
atom2bin_multi2[n][i] = ibin;
|
||||||
bins_multi2[n][i] = binhead_multi2[n][ibin];
|
bins_multi2[n][i] = binhead_multi2[n][ibin];
|
||||||
binhead_multi2[n][ibin] = i;
|
binhead_multi2[n][ibin] = i;
|
||||||
@ -332,7 +332,7 @@ void NBinMulti2::bin_atoms()
|
|||||||
}
|
}
|
||||||
for (i = atom->nfirst-1; i >= 0; i--) {
|
for (i = atom->nfirst-1; i >= 0; i--) {
|
||||||
n = type[i];
|
n = type[i];
|
||||||
ibin = coord2bin(x[i], n);
|
ibin = coord2bin_multi2(x[i], n);
|
||||||
atom2bin_multi2[n][i] = ibin;
|
atom2bin_multi2[n][i] = ibin;
|
||||||
bins_multi2[n][i] = binhead_multi2[n][ibin];
|
bins_multi2[n][i] = binhead_multi2[n][ibin];
|
||||||
binhead_multi2[n][ibin] = i;
|
binhead_multi2[n][ibin] = i;
|
||||||
@ -340,7 +340,7 @@ void NBinMulti2::bin_atoms()
|
|||||||
} else {
|
} else {
|
||||||
for (i = nall-1; i >= 0; i--) {
|
for (i = nall-1; i >= 0; i--) {
|
||||||
n = type[i];
|
n = type[i];
|
||||||
ibin = coord2bin(x[i], n);
|
ibin = coord2bin_multi2(x[i], n);
|
||||||
atom2bin_multi2[n][i] = ibin;
|
atom2bin_multi2[n][i] = ibin;
|
||||||
bins_multi2[n][i] = binhead_multi2[n][ibin];
|
bins_multi2[n][i] = binhead_multi2[n][ibin];
|
||||||
binhead_multi2[n][ibin] = i;
|
binhead_multi2[n][ibin] = i;
|
||||||
@ -348,58 +348,6 @@ void NBinMulti2::bin_atoms()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
|
||||||
convert atom coords into local bin # for a particular type
|
|
||||||
for orthogonal, only ghost atoms will have coord >= bboxhi or coord < bboxlo
|
|
||||||
take special care to insure ghosts are in correct bins even w/ roundoff
|
|
||||||
hi ghost atoms = nbin,nbin+1,etc
|
|
||||||
owned atoms = 0 to nbin-1
|
|
||||||
lo ghost atoms = -1,-2,etc
|
|
||||||
this is necessary so that both procs on either side of PBC
|
|
||||||
treat a pair of atoms straddling the PBC in a consistent way
|
|
||||||
for triclinic, doesn't matter since stencil & neigh list built differently
|
|
||||||
------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
int NBinMulti2::coord2bin(double *x, int it)
|
|
||||||
{
|
|
||||||
int ix,iy,iz;
|
|
||||||
int ibin;
|
|
||||||
|
|
||||||
if (!std::isfinite(x[0]) || !std::isfinite(x[1]) || !std::isfinite(x[2]))
|
|
||||||
error->one(FLERR,"Non-numeric positions - simulation unstable");
|
|
||||||
|
|
||||||
if (x[0] >= bboxhi[0])
|
|
||||||
ix = static_cast<int> ((x[0]-bboxhi[0])*bininvx_multi2[it]) + nbinx_multi2[it];
|
|
||||||
else if (x[0] >= bboxlo[0]) {
|
|
||||||
ix = static_cast<int> ((x[0]-bboxlo[0])*bininvx_multi2[it]);
|
|
||||||
ix = MIN(ix,nbinx_multi2[it]-1);
|
|
||||||
} else
|
|
||||||
ix = static_cast<int> ((x[0]-bboxlo[0])*bininvx_multi2[it]) - 1;
|
|
||||||
|
|
||||||
if (x[1] >= bboxhi[1])
|
|
||||||
iy = static_cast<int> ((x[1]-bboxhi[1])*bininvy_multi2[it]) + nbiny_multi2[it];
|
|
||||||
else if (x[1] >= bboxlo[1]) {
|
|
||||||
iy = static_cast<int> ((x[1]-bboxlo[1])*bininvy_multi2[it]);
|
|
||||||
iy = MIN(iy,nbiny_multi2[it]-1);
|
|
||||||
} else
|
|
||||||
iy = static_cast<int> ((x[1]-bboxlo[1])*bininvy_multi2[it]) - 1;
|
|
||||||
|
|
||||||
if (x[2] >= bboxhi[2])
|
|
||||||
iz = static_cast<int> ((x[2]-bboxhi[2])*bininvz_multi2[it]) + nbinz_multi2[it];
|
|
||||||
else if (x[2] >= bboxlo[2]) {
|
|
||||||
iz = static_cast<int> ((x[2]-bboxlo[2])*bininvz_multi2[it]);
|
|
||||||
iz = MIN(iz,nbinz_multi2[it]-1);
|
|
||||||
} else
|
|
||||||
iz = static_cast<int> ((x[2]-bboxlo[2])*bininvz_multi2[it]) - 1;
|
|
||||||
|
|
||||||
|
|
||||||
ibin = (iz-mbinzlo_multi2[it])*mbiny_multi2[it]*mbinx_multi2[it]
|
|
||||||
+ (iy-mbinylo_multi2[it])*mbinx_multi2[it]
|
|
||||||
+ (ix-mbinxlo_multi2[it]);
|
|
||||||
return ibin;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
double NBinMulti2::memory_usage()
|
double NBinMulti2::memory_usage()
|
||||||
|
|||||||
@ -38,7 +38,6 @@ class NBinMulti2 : public NBin {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
int coord2bin(double *, int);
|
|
||||||
int itype_min();
|
int itype_min();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -259,54 +259,6 @@ void NBinStandard::bin_atoms()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
|
||||||
convert atom coords into local bin #
|
|
||||||
for orthogonal, only ghost atoms will have coord >= bboxhi or coord < bboxlo
|
|
||||||
take special care to insure ghosts are in correct bins even w/ roundoff
|
|
||||||
hi ghost atoms = nbin,nbin+1,etc
|
|
||||||
owned atoms = 0 to nbin-1
|
|
||||||
lo ghost atoms = -1,-2,etc
|
|
||||||
this is necessary so that both procs on either side of PBC
|
|
||||||
treat a pair of atoms straddling the PBC in a consistent way
|
|
||||||
for triclinic, doesn't matter since stencil & neigh list built differently
|
|
||||||
------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
int NBinStandard::coord2bin(double *x)
|
|
||||||
{
|
|
||||||
int ix,iy,iz;
|
|
||||||
|
|
||||||
if (!std::isfinite(x[0]) || !std::isfinite(x[1]) || !std::isfinite(x[2]))
|
|
||||||
error->one(FLERR,"Non-numeric positions - simulation unstable");
|
|
||||||
|
|
||||||
if (x[0] >= bboxhi[0])
|
|
||||||
ix = static_cast<int> ((x[0]-bboxhi[0])*bininvx) + nbinx;
|
|
||||||
else if (x[0] >= bboxlo[0]) {
|
|
||||||
ix = static_cast<int> ((x[0]-bboxlo[0])*bininvx);
|
|
||||||
ix = MIN(ix,nbinx-1);
|
|
||||||
} else
|
|
||||||
ix = static_cast<int> ((x[0]-bboxlo[0])*bininvx) - 1;
|
|
||||||
|
|
||||||
if (x[1] >= bboxhi[1])
|
|
||||||
iy = static_cast<int> ((x[1]-bboxhi[1])*bininvy) + nbiny;
|
|
||||||
else if (x[1] >= bboxlo[1]) {
|
|
||||||
iy = static_cast<int> ((x[1]-bboxlo[1])*bininvy);
|
|
||||||
iy = MIN(iy,nbiny-1);
|
|
||||||
} else
|
|
||||||
iy = static_cast<int> ((x[1]-bboxlo[1])*bininvy) - 1;
|
|
||||||
|
|
||||||
if (x[2] >= bboxhi[2])
|
|
||||||
iz = static_cast<int> ((x[2]-bboxhi[2])*bininvz) + nbinz;
|
|
||||||
else if (x[2] >= bboxlo[2]) {
|
|
||||||
iz = static_cast<int> ((x[2]-bboxlo[2])*bininvz);
|
|
||||||
iz = MIN(iz,nbinz-1);
|
|
||||||
} else
|
|
||||||
iz = static_cast<int> ((x[2]-bboxlo[2])*bininvz) - 1;
|
|
||||||
|
|
||||||
return (iz-mbinzlo)*mbiny*mbinx + (iy-mbinylo)*mbinx + (ix-mbinxlo);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
double NBinStandard::memory_usage()
|
double NBinStandard::memory_usage()
|
||||||
|
|||||||
@ -34,10 +34,6 @@ class NBinStandard : public NBin {
|
|||||||
void setup_bins(int);
|
void setup_bins(int);
|
||||||
void bin_atoms();
|
void bin_atoms();
|
||||||
double memory_usage();
|
double memory_usage();
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
int coord2bin(double *);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
119
src/nstencil.cpp
119
src/nstencil.cpp
@ -124,13 +124,17 @@ NStencil::~NStencil()
|
|||||||
memory->destroy(stencil_bin_type);
|
memory->destroy(stencil_bin_type);
|
||||||
memory->destroy(stencil_cut);
|
memory->destroy(stencil_cut);
|
||||||
|
|
||||||
memory->destroy(sx_multi2);
|
memory->destroy(stencil_sx_multi2);
|
||||||
memory->destroy(sy_multi2);
|
memory->destroy(stencil_sy_multi2);
|
||||||
memory->destroy(sz_multi2);
|
memory->destroy(stencil_sz_multi2);
|
||||||
|
|
||||||
|
memory->destroy(stencil_mbinx_multi2);
|
||||||
|
memory->destroy(stencil_mbiny_multi2);
|
||||||
|
memory->destroy(stencil_mbinz_multi2);
|
||||||
|
|
||||||
memory->destroy(binsizex_multi2);
|
memory->destroy(stencil_binsizex_multi2);
|
||||||
memory->destroy(binsizey_multi2);
|
memory->destroy(stencil_binsizey_multi2);
|
||||||
memory->destroy(binsizez_multi2);
|
memory->destroy(stencil_binsizez_multi2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,20 +185,20 @@ void NStencil::copy_bin_info()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
copy needed info for a given type from NBin class to this stencil class
|
copy needed info for multi2 from NBin class to this stencil class
|
||||||
------------------------------------------------------------------------- */
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
void NStencil::copy_bin_info_multi2(int type)
|
void NStencil::copy_bin_info_multi2()
|
||||||
{
|
{
|
||||||
mbinx = nb->mbinx_multi2[type];
|
mbinx_multi2 = nb->mbinx_multi2;
|
||||||
mbiny = nb->mbiny_multi2[type];
|
mbiny_multi2 = nb->mbiny_multi2;
|
||||||
mbinz = nb->mbinz_multi2[type];
|
mbinz_multi2 = nb->mbinz_multi2;
|
||||||
binsizex = nb->binsizex_multi2[type];
|
binsizex_multi2 = nb->binsizex_multi2;
|
||||||
binsizey = nb->binsizey_multi2[type];
|
binsizey_multi2 = nb->binsizey_multi2;
|
||||||
binsizez = nb->binsizez_multi2[type];
|
binsizez_multi2 = nb->binsizez_multi2;
|
||||||
bininvx = nb->bininvx_multi2[type];
|
bininvx_multi2 = nb->bininvx_multi2;
|
||||||
bininvy = nb->bininvy_multi2[type];
|
bininvy_multi2 = nb->bininvy_multi2;
|
||||||
bininvz = nb->bininvz_multi2[type];
|
bininvz_multi2 = nb->bininvz_multi2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------
|
/* ----------------------------------------------------------------------
|
||||||
@ -266,6 +270,8 @@ void NStencil::create_setup()
|
|||||||
int i, j, bin_type, smax;
|
int i, j, bin_type, smax;
|
||||||
double stencil_range;
|
double stencil_range;
|
||||||
int n = atom->ntypes;
|
int n = atom->ntypes;
|
||||||
|
|
||||||
|
if(nb) copy_bin_info_multi2();
|
||||||
|
|
||||||
// Allocate arrays to store stencil information
|
// Allocate arrays to store stencil information
|
||||||
memory->create(stencil_half, n+1, n+1,
|
memory->create(stencil_half, n+1, n+1,
|
||||||
@ -277,20 +283,26 @@ void NStencil::create_setup()
|
|||||||
memory->create(stencil_cut, n+1, n+1,
|
memory->create(stencil_cut, n+1, n+1,
|
||||||
"neighstencil:stencil_cut");
|
"neighstencil:stencil_cut");
|
||||||
|
|
||||||
memory->create(sx_multi2, n+1, n+1, "neighstencil:sx_multi2");
|
memory->create(stencil_sx_multi2, n+1, n+1,
|
||||||
memory->create(sy_multi2, n+1, n+1, "neighstencil:sy_multi2");
|
"neighstencil:stencil_sx_multi2");
|
||||||
memory->create(sz_multi2, n+1, n+1, "neighstencil:sz_multi2");
|
memory->create(stencil_sy_multi2, n+1, n+1,
|
||||||
|
"neighstencil:stencil_sy_multi2");
|
||||||
|
memory->create(stencil_sz_multi2, n+1, n+1,
|
||||||
|
"neighstencil:stencil_sz_multi2");
|
||||||
|
|
||||||
memory->create(binsizex_multi2, n+1, n+1,
|
memory->create(stencil_binsizex_multi2, n+1, n+1,
|
||||||
"neighstencil:binsizex_multi2");
|
"neighstencil:stencil_binsizex_multi2");
|
||||||
memory->create(binsizey_multi2, n+1, n+1,
|
memory->create(stencil_binsizey_multi2, n+1, n+1,
|
||||||
"neighstencil:binsizey_multi2");
|
"neighstencil:stencil_binsizey_multi2");
|
||||||
memory->create(binsizez_multi2, n+1, n+1,
|
memory->create(stencil_binsizez_multi2, n+1, n+1,
|
||||||
"neighstencil:binsizez_multi2");
|
"neighstencil:stencil_binsizez_multi2");
|
||||||
|
|
||||||
memory->create(mbinx_multi2, n+1, n+1, "neighstencil:mbinx_multi2");
|
memory->create(stencil_mbinx_multi2, n+1, n+1,
|
||||||
memory->create(mbiny_multi2, n+1, n+1, "neighstencil:mbiny_multi2");
|
"neighstencil:stencil_mbinx_multi2");
|
||||||
memory->create(mbinz_multi2, n+1, n+1, "neighstencil:mbinz_multi2");
|
memory->create(stencil_mbiny_multi2, n+1, n+1,
|
||||||
|
"neighstencil:stencil_mbiny_multi2");
|
||||||
|
memory->create(stencil_mbinz_multi2, n+1, n+1,
|
||||||
|
"neighstencil:stencil_mbinz_multi2");
|
||||||
|
|
||||||
// Skip all stencils by default, initialize smax
|
// Skip all stencils by default, initialize smax
|
||||||
for (i = 1; i <= n; i++) {
|
for (i = 1; i <= n; i++) {
|
||||||
@ -324,28 +336,27 @@ void NStencil::create_setup()
|
|||||||
|
|
||||||
// Copy bin info for this particular pair of types
|
// Copy bin info for this particular pair of types
|
||||||
bin_type = stencil_bin_type[i][j];
|
bin_type = stencil_bin_type[i][j];
|
||||||
copy_bin_info_multi2(bin_type);
|
|
||||||
|
|
||||||
binsizex_multi2[i][j] = binsizex;
|
stencil_binsizex_multi2[i][j] = binsizex_multi2[bin_type];
|
||||||
binsizey_multi2[i][j] = binsizey;
|
stencil_binsizey_multi2[i][j] = binsizey_multi2[bin_type];
|
||||||
binsizez_multi2[i][j] = binsizez;
|
stencil_binsizez_multi2[i][j] = binsizez_multi2[bin_type];
|
||||||
|
|
||||||
mbinx_multi2[i][j] = mbinx;
|
stencil_mbinx_multi2[i][j] = mbinx_multi2[bin_type];
|
||||||
mbiny_multi2[i][j] = mbiny;
|
stencil_mbiny_multi2[i][j] = mbiny_multi2[bin_type];
|
||||||
mbinz_multi2[i][j] = mbinz;
|
stencil_mbinz_multi2[i][j] = mbinz_multi2[bin_type];
|
||||||
|
|
||||||
stencil_range = stencil_cut[i][j];
|
stencil_range = stencil_cut[i][j];
|
||||||
|
|
||||||
sx = static_cast<int> (stencil_range*bininvx);
|
sx = static_cast<int> (stencil_range*bininvx_multi2[bin_type]);
|
||||||
if (sx*binsizex < stencil_range) sx++;
|
if (sx*binsizex < stencil_range) sx++;
|
||||||
sy = static_cast<int> (stencil_range*bininvy);
|
sy = static_cast<int> (stencil_range*bininvy_multi2[bin_type]);
|
||||||
if (sy*binsizey < stencil_range) sy++;
|
if (sy*binsizey < stencil_range) sy++;
|
||||||
sz = static_cast<int> (stencil_range*bininvz);
|
sz = static_cast<int> (stencil_range*bininvz_multi2[bin_type]);
|
||||||
if (sz*binsizez < stencil_range) sz++;
|
if (sz*binsizez < stencil_range) sz++;
|
||||||
|
|
||||||
sx_multi2[i][j] = sx;
|
stencil_sx_multi2[i][j] = sx;
|
||||||
sy_multi2[i][j] = sy;
|
stencil_sy_multi2[i][j] = sy;
|
||||||
sz_multi2[i][j] = sz;
|
stencil_sz_multi2[i][j] = sz;
|
||||||
|
|
||||||
smax = ((2*sx+1) * (2*sy+1) * (2*sz+1));
|
smax = ((2*sx+1) * (2*sy+1) * (2*sz+1));
|
||||||
|
|
||||||
@ -383,6 +394,30 @@ double NStencil::bin_distance(int i, int j, int k)
|
|||||||
return (delx*delx + dely*dely + delz*delz);
|
return (delx*delx + dely*dely + delz*delz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ----------------------------------------------------------------------
|
||||||
|
compute closest distance for a given atom type
|
||||||
|
------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double NStencil::bin_distance_multi2(int i, int j, int k, int type)
|
||||||
|
{
|
||||||
|
double delx,dely,delz;
|
||||||
|
|
||||||
|
if (i > 0) delx = (i-1)*binsizex_multi2[type];
|
||||||
|
else if (i == 0) delx = 0.0;
|
||||||
|
else delx = (i+1)*binsizex_multi2[type];
|
||||||
|
|
||||||
|
if (j > 0) dely = (j-1)*binsizey_multi2[type];
|
||||||
|
else if (j == 0) dely = 0.0;
|
||||||
|
else dely = (j+1)*binsizey_multi2[type];
|
||||||
|
|
||||||
|
if (k > 0) delz = (k-1)*binsizez_multi2[type];
|
||||||
|
else if (k == 0) delz = 0.0;
|
||||||
|
else delz = (k+1)*binsizez_multi2[type];
|
||||||
|
|
||||||
|
return (delx*delx + dely*dely + delz*delz);
|
||||||
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
double NStencil::memory_usage()
|
double NStencil::memory_usage()
|
||||||
|
|||||||
@ -39,13 +39,13 @@ class NStencil : protected Pointers {
|
|||||||
// Probably not needed for multi2 since bins are more efficiently chosen
|
// Probably not needed for multi2 since bins are more efficiently chosen
|
||||||
|
|
||||||
int sx,sy,sz; // extent of stencil in each dim
|
int sx,sy,sz; // extent of stencil in each dim
|
||||||
int **sx_multi2; // analogs for multi tiered
|
int **stencil_sx_multi2; // analogs for each multi2 stencil
|
||||||
int **sy_multi2;
|
int **stencil_sy_multi2;
|
||||||
int **sz_multi2;
|
int **stencil_sz_multi2;
|
||||||
|
|
||||||
double cutoff_custom; // cutoff set by requestor
|
double cutoff_custom; // cutoff set by requestor
|
||||||
|
|
||||||
// Arrays to store options for multi/tiered itype-jtype stencils
|
// Arrays to store options for multi2 itype-jtype stencils
|
||||||
bool **stencil_half; // flag creation of a half stencil for itype-jtype
|
bool **stencil_half; // flag creation of a half stencil for itype-jtype
|
||||||
bool **stencil_skip; // skip creation of itype-jtype stencils (for newton on)
|
bool **stencil_skip; // skip creation of itype-jtype stencils (for newton on)
|
||||||
int **stencil_bin_type; // what type to use for bin information
|
int **stencil_bin_type; // what type to use for bin information
|
||||||
@ -78,15 +78,27 @@ class NStencil : protected Pointers {
|
|||||||
double binsizex,binsizey,binsizez;
|
double binsizex,binsizey,binsizez;
|
||||||
double bininvx,bininvy,bininvz;
|
double bininvx,bininvy,bininvz;
|
||||||
|
|
||||||
// analogs for multi-tiered
|
// data from NBin class for multi2
|
||||||
|
|
||||||
|
int *mbinx_multi2;
|
||||||
|
int *mbiny_multi2;
|
||||||
|
int *mbinz_multi2;
|
||||||
|
double *binsizex_multi2;
|
||||||
|
double *binsizey_multi2;
|
||||||
|
double *binsizez_multi2;
|
||||||
|
double *bininvx_multi2;
|
||||||
|
double *bininvy_multi2;
|
||||||
|
double *bininvz_multi2;
|
||||||
|
|
||||||
|
// Stored bin information for each stencil
|
||||||
|
|
||||||
|
int **stencil_mbinx_multi2;
|
||||||
|
int **stencil_mbiny_multi2;
|
||||||
|
int **stencil_mbinz_multi2;
|
||||||
|
double **stencil_binsizex_multi2;
|
||||||
|
double **stencil_binsizey_multi2;
|
||||||
|
double **stencil_binsizez_multi2;
|
||||||
|
|
||||||
int **mbinx_multi2;
|
|
||||||
int **mbiny_multi2;
|
|
||||||
int **mbinz_multi2;
|
|
||||||
double **binsizex_multi2;
|
|
||||||
double **binsizey_multi2;
|
|
||||||
double **binsizez_multi2;
|
|
||||||
|
|
||||||
// data common to all NStencil variants
|
// data common to all NStencil variants
|
||||||
|
|
||||||
int xyzflag; // 1 if stencilxyz is allocated
|
int xyzflag; // 1 if stencilxyz is allocated
|
||||||
@ -95,15 +107,16 @@ class NStencil : protected Pointers {
|
|||||||
|
|
||||||
int dimension;
|
int dimension;
|
||||||
|
|
||||||
// methods for all NStencil variants
|
// methods for standard NStencil variants
|
||||||
|
|
||||||
void copy_bin_info(); // copy info from NBin class
|
void copy_bin_info(); // copy info from NBin class
|
||||||
double bin_distance(int, int, int); // distance between bin corners
|
double bin_distance(int, int, int); // distance between bin corners
|
||||||
|
|
||||||
// methods for multi/tiered NStencil
|
// methods for multi2 NStencil
|
||||||
|
|
||||||
void copy_bin_info_multi2(int); // copy mult/tiered info from NBin class
|
double bin_distance_multi2(int, int, int, int); // distance between bin corners for different types
|
||||||
virtual void set_stencil_properties(){} // determine which stencils to build and how
|
void copy_bin_info_multi2(); // copy mult2 info from NBin class
|
||||||
|
virtual void set_stencil_properties(){} // determine which stencils to build and how
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -68,7 +68,7 @@ void NStencilFullMulti22d::set_stencil_properties()
|
|||||||
|
|
||||||
void NStencilFullMulti22d::create()
|
void NStencilFullMulti22d::create()
|
||||||
{
|
{
|
||||||
int itype, jtype, i, j, k, ns;
|
int itype, jtype, bin_type, i, j, k, ns;
|
||||||
int n = atom->ntypes;
|
int n = atom->ntypes;
|
||||||
double cutsq;
|
double cutsq;
|
||||||
|
|
||||||
@ -79,22 +79,19 @@ void NStencilFullMulti22d::create()
|
|||||||
|
|
||||||
ns = 0;
|
ns = 0;
|
||||||
|
|
||||||
sx = sx_multi2[itype][jtype];
|
sx = stencil_sx_multi2[itype][jtype];
|
||||||
sy = sy_multi2[itype][jtype];
|
sy = stencil_sy_multi2[itype][jtype];
|
||||||
|
|
||||||
mbinx = mbinx_multi2[itype][jtype];
|
mbinx = stencil_mbinx_multi2[itype][jtype];
|
||||||
mbiny = mbiny_multi2[itype][jtype];
|
mbiny = stencil_mbiny_multi2[itype][jtype];
|
||||||
|
|
||||||
// Redefine for use in bin_distance()
|
bin_type = stencil_bin_type[i][j];
|
||||||
binsizex = binsizex_multi2[itype][jtype];
|
|
||||||
binsizey = binsizey_multi2[itype][jtype];
|
|
||||||
binsizez = binsizez_multi2[itype][jtype];
|
|
||||||
|
|
||||||
cutsq = stencil_cut[itype][jtype];
|
cutsq = stencil_cut[itype][jtype];
|
||||||
|
|
||||||
for (j = -sy; j <= sy; j++)
|
for (j = -sy; j <= sy; j++)
|
||||||
for (i = -sx; i <= sx; i++)
|
for (i = -sx; i <= sx; i++)
|
||||||
if (bin_distance(i,j,0) < cutsq)
|
if (bin_distance_multi2(i,j,0,bin_type) < cutsq)
|
||||||
stencil_multi2[itype][jtype][ns++] = j*mbinx + i;
|
stencil_multi2[itype][jtype][ns++] = j*mbinx + i;
|
||||||
|
|
||||||
nstencil_multi2[itype][jtype] = ns;
|
nstencil_multi2[itype][jtype] = ns;
|
||||||
|
|||||||
@ -68,7 +68,7 @@ void NStencilFullMulti23d::set_stencil_properties()
|
|||||||
|
|
||||||
void NStencilFullMulti23d::create()
|
void NStencilFullMulti23d::create()
|
||||||
{
|
{
|
||||||
int itype, jtype, i, j, k, ns;
|
int itype, jtype, bin_type, i, j, k, ns;
|
||||||
int n = atom->ntypes;
|
int n = atom->ntypes;
|
||||||
double cutsq;
|
double cutsq;
|
||||||
|
|
||||||
@ -79,25 +79,22 @@ void NStencilFullMulti23d::create()
|
|||||||
|
|
||||||
ns = 0;
|
ns = 0;
|
||||||
|
|
||||||
sx = sx_multi2[itype][jtype];
|
sx = stencil_sx_multi2[itype][jtype];
|
||||||
sy = sy_multi2[itype][jtype];
|
sy = stencil_sy_multi2[itype][jtype];
|
||||||
sz = sz_multi2[itype][jtype];
|
sz = stencil_sz_multi2[itype][jtype];
|
||||||
|
|
||||||
mbinx = mbinx_multi2[itype][jtype];
|
mbinx = stencil_mbinx_multi2[itype][jtype];
|
||||||
mbiny = mbiny_multi2[itype][jtype];
|
mbiny = stencil_mbiny_multi2[itype][jtype];
|
||||||
mbinz = mbinz_multi2[itype][jtype];
|
mbinz = stencil_mbinz_multi2[itype][jtype];
|
||||||
|
|
||||||
// Redefine for use in bin_distance()
|
bin_type = stencil_bin_type[i][j];
|
||||||
binsizex = binsizex_multi2[itype][jtype];
|
|
||||||
binsizey = binsizey_multi2[itype][jtype];
|
|
||||||
binsizez = binsizez_multi2[itype][jtype];
|
|
||||||
|
|
||||||
cutsq = stencil_cut[itype][jtype];
|
cutsq = stencil_cut[itype][jtype];
|
||||||
|
|
||||||
for (k = -sz; k <= sz; k++)
|
for (k = -sz; k <= sz; k++)
|
||||||
for (j = -sy; j <= sy; j++)
|
for (j = -sy; j <= sy; j++)
|
||||||
for (i = -sx; i <= sx; i++)
|
for (i = -sx; i <= sx; i++)
|
||||||
if (bin_distance(i,j,k) < cutsq)
|
if (bin_distance_multi2(i,j,k,bin_type) < cutsq)
|
||||||
stencil_multi2[itype][jtype][ns++] =
|
stencil_multi2[itype][jtype][ns++] =
|
||||||
k*mbiny*mbinx + j*mbinx + i;
|
k*mbiny*mbinx + j*mbinx + i;
|
||||||
|
|
||||||
|
|||||||
@ -82,16 +82,11 @@ void NStencilHalfMulti22d::create()
|
|||||||
|
|
||||||
ns = 0;
|
ns = 0;
|
||||||
|
|
||||||
sx = sx_multi2[itype][jtype];
|
sx = stencil_sx_multi2[itype][jtype];
|
||||||
sy = sy_multi2[itype][jtype];
|
sy = stencil_sy_multi2[itype][jtype];
|
||||||
|
|
||||||
mbinx = mbinx_multi2[itype][jtype];
|
mbinx = stencil_mbinx_multi2[itype][jtype];
|
||||||
mbiny = mbiny_multi2[itype][jtype];
|
mbiny = stencil_mbiny_multi2[itype][jtype];
|
||||||
|
|
||||||
// Redefine for use in bin_distance()
|
|
||||||
binsizex = binsizex_multi2[itype][jtype];
|
|
||||||
binsizey = binsizey_multi2[itype][jtype];
|
|
||||||
binsizez = binsizez_multi2[itype][jtype];
|
|
||||||
|
|
||||||
cutsq = stencil_cut[itype][jtype];
|
cutsq = stencil_cut[itype][jtype];
|
||||||
|
|
||||||
|
|||||||
@ -71,7 +71,7 @@ void NStencilHalfMulti22dTri::set_stencil_properties()
|
|||||||
|
|
||||||
void NStencilHalfMulti22dTri::create()
|
void NStencilHalfMulti22dTri::create()
|
||||||
{
|
{
|
||||||
int itype, jtype, i, j, ns;
|
int itype, jtype, bin_type, i, j, ns;
|
||||||
int n = atom->ntypes;
|
int n = atom->ntypes;
|
||||||
double cutsq;
|
double cutsq;
|
||||||
|
|
||||||
@ -82,28 +82,25 @@ void NStencilHalfMulti22dTri::create()
|
|||||||
|
|
||||||
ns = 0;
|
ns = 0;
|
||||||
|
|
||||||
sx = sx_multi2[itype][jtype];
|
sx = stencil_sx_multi2[itype][jtype];
|
||||||
sy = sy_multi2[itype][jtype];
|
sy = stencil_sy_multi2[itype][jtype];
|
||||||
|
|
||||||
mbinx = mbinx_multi2[itype][jtype];
|
mbinx = stencil_mbinx_multi2[itype][jtype];
|
||||||
mbiny = mbiny_multi2[itype][jtype];
|
mbiny = stencil_mbiny_multi2[itype][jtype];
|
||||||
|
|
||||||
// Redefine for use in bin_distance()
|
bin_type = stencil_bin_type[i][j];
|
||||||
binsizex = binsizex_multi2[itype][jtype];
|
|
||||||
binsizey = binsizey_multi2[itype][jtype];
|
|
||||||
binsizez = binsizez_multi2[itype][jtype];
|
|
||||||
|
|
||||||
cutsq = stencil_cut[itype][jtype];
|
cutsq = stencil_cut[itype][jtype];
|
||||||
|
|
||||||
if (stencil_half[itype][jtype]) {
|
if (stencil_half[itype][jtype]) {
|
||||||
for (j = 0; j <= sy; j++)
|
for (j = 0; j <= sy; j++)
|
||||||
for (i = -sx; i <= sx; i++)
|
for (i = -sx; i <= sx; i++)
|
||||||
if (bin_distance(i,j,0) < cutsq)
|
if (bin_distance_multi2(i,j,0,bin_type) < cutsq)
|
||||||
stencil_multi2[itype][jtype][ns++] = j*mbinx + i;
|
stencil_multi2[itype][jtype][ns++] = j*mbinx + i;
|
||||||
} else {
|
} else {
|
||||||
for (j = -sy; j <= sy; j++)
|
for (j = -sy; j <= sy; j++)
|
||||||
for (i = -sx; i <= sx; i++)
|
for (i = -sx; i <= sx; i++)
|
||||||
if (bin_distance(i,j,0) < cutsq)
|
if (bin_distance_multi2(i,j,0,bin_type) < cutsq)
|
||||||
stencil_multi2[itype][jtype][ns++] = j*mbinx + i;
|
stencil_multi2[itype][jtype][ns++] = j*mbinx + i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -71,7 +71,7 @@ void NStencilHalfMulti23d::set_stencil_properties()
|
|||||||
|
|
||||||
void NStencilHalfMulti23d::create()
|
void NStencilHalfMulti23d::create()
|
||||||
{
|
{
|
||||||
int itype, jtype, i, j, k, ns;
|
int itype, jtype, bin_type, i, j, k, ns;
|
||||||
int n = atom->ntypes;
|
int n = atom->ntypes;
|
||||||
double cutsq;
|
double cutsq;
|
||||||
|
|
||||||
@ -82,18 +82,15 @@ void NStencilHalfMulti23d::create()
|
|||||||
|
|
||||||
ns = 0;
|
ns = 0;
|
||||||
|
|
||||||
sx = sx_multi2[itype][jtype];
|
sx = stencil_sx_multi2[itype][jtype];
|
||||||
sy = sy_multi2[itype][jtype];
|
sy = stencil_sy_multi2[itype][jtype];
|
||||||
sz = sz_multi2[itype][jtype];
|
sz = stencil_sz_multi2[itype][jtype];
|
||||||
|
|
||||||
mbinx = mbinx_multi2[itype][jtype];
|
mbinx = stencil_mbinx_multi2[itype][jtype];
|
||||||
mbiny = mbiny_multi2[itype][jtype];
|
mbiny = stencil_mbiny_multi2[itype][jtype];
|
||||||
mbinz = mbinz_multi2[itype][jtype];
|
mbinz = stencil_mbinz_multi2[itype][jtype];
|
||||||
|
|
||||||
// Redefine for use in bin_distance()
|
bin_type = stencil_bin_type[i][j];
|
||||||
binsizex = binsizex_multi2[itype][jtype];
|
|
||||||
binsizey = binsizey_multi2[itype][jtype];
|
|
||||||
binsizez = binsizez_multi2[itype][jtype];
|
|
||||||
|
|
||||||
cutsq = stencil_cut[itype][jtype];
|
cutsq = stencil_cut[itype][jtype];
|
||||||
|
|
||||||
@ -102,7 +99,7 @@ void NStencilHalfMulti23d::create()
|
|||||||
for (j = -sy; j <= sy; j++)
|
for (j = -sy; j <= sy; j++)
|
||||||
for (i = -sx; i <= sx; i++)
|
for (i = -sx; i <= sx; i++)
|
||||||
if (k > 0 || j > 0 || (j == 0 && i > 0)) {
|
if (k > 0 || j > 0 || (j == 0 && i > 0)) {
|
||||||
if (bin_distance(i,j,k) < cutsq)
|
if (bin_distance_multi2(i,j,k,bin_type) < cutsq)
|
||||||
stencil_multi2[itype][jtype][ns++] =
|
stencil_multi2[itype][jtype][ns++] =
|
||||||
k*mbiny*mbinx + j*mbinx + i;
|
k*mbiny*mbinx + j*mbinx + i;
|
||||||
}
|
}
|
||||||
@ -110,7 +107,7 @@ void NStencilHalfMulti23d::create()
|
|||||||
for (k = -sz; k <= sz; k++)
|
for (k = -sz; k <= sz; k++)
|
||||||
for (j = -sy; j <= sy; j++)
|
for (j = -sy; j <= sy; j++)
|
||||||
for (i = -sx; i <= sx; i++)
|
for (i = -sx; i <= sx; i++)
|
||||||
if (bin_distance(i,j,k) < cutsq)
|
if (bin_distance_multi2(i,j,k,bin_type) < cutsq)
|
||||||
stencil_multi2[itype][jtype][ns++] =
|
stencil_multi2[itype][jtype][ns++] =
|
||||||
k*mbiny*mbinx + j*mbinx + i;
|
k*mbiny*mbinx + j*mbinx + i;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -71,7 +71,7 @@ void NStencilHalfMulti23dTri::set_stencil_properties()
|
|||||||
|
|
||||||
void NStencilHalfMulti23dTri::create()
|
void NStencilHalfMulti23dTri::create()
|
||||||
{
|
{
|
||||||
int itype, jtype, i, j, k, ns;
|
int itype, jtype, bin_type, i, j, k, ns;
|
||||||
int n = atom->ntypes;
|
int n = atom->ntypes;
|
||||||
double cutsq;
|
double cutsq;
|
||||||
|
|
||||||
@ -82,18 +82,15 @@ void NStencilHalfMulti23dTri::create()
|
|||||||
|
|
||||||
ns = 0;
|
ns = 0;
|
||||||
|
|
||||||
sx = sx_multi2[itype][jtype];
|
sx = stencil_sx_multi2[itype][jtype];
|
||||||
sy = sy_multi2[itype][jtype];
|
sy = stencil_sy_multi2[itype][jtype];
|
||||||
sz = sz_multi2[itype][jtype];
|
sz = stencil_sz_multi2[itype][jtype];
|
||||||
|
|
||||||
mbinx = mbinx_multi2[itype][jtype];
|
mbinx = stencil_mbinx_multi2[itype][jtype];
|
||||||
mbiny = mbiny_multi2[itype][jtype];
|
mbiny = stencil_mbiny_multi2[itype][jtype];
|
||||||
mbinz = mbinz_multi2[itype][jtype];
|
mbinz = stencil_mbinz_multi2[itype][jtype];
|
||||||
|
|
||||||
// Redefine for use in bin_distance()
|
bin_type = stencil_bin_type[i][j];
|
||||||
binsizex = binsizex_multi2[itype][jtype];
|
|
||||||
binsizey = binsizey_multi2[itype][jtype];
|
|
||||||
binsizez = binsizez_multi2[itype][jtype];
|
|
||||||
|
|
||||||
cutsq = stencil_cut[itype][jtype];
|
cutsq = stencil_cut[itype][jtype];
|
||||||
|
|
||||||
@ -101,14 +98,14 @@ void NStencilHalfMulti23dTri::create()
|
|||||||
for (k = 0; k <= sz; k++)
|
for (k = 0; k <= sz; k++)
|
||||||
for (j = -sy; j <= sy; j++)
|
for (j = -sy; j <= sy; j++)
|
||||||
for (i = -sx; i <= sx; i++)
|
for (i = -sx; i <= sx; i++)
|
||||||
if (bin_distance(i,j,k) < cutsq)
|
if (bin_distance_multi2(i,j,k,bin_type) < cutsq)
|
||||||
stencil_multi2[itype][jtype][ns++] =
|
stencil_multi2[itype][jtype][ns++] =
|
||||||
k*mbiny*mbinx + j*mbinx + i;
|
k*mbiny*mbinx + j*mbinx + i;
|
||||||
} else {
|
} else {
|
||||||
for (k = -sz; k <= sz; k++)
|
for (k = -sz; k <= sz; k++)
|
||||||
for (j = -sy; j <= sy; j++)
|
for (j = -sy; j <= sy; j++)
|
||||||
for (i = -sx; i <= sx; i++)
|
for (i = -sx; i <= sx; i++)
|
||||||
if (bin_distance(i,j,k) < cutsq)
|
if (bin_distance_multi2(i,j,k,bin_type) < cutsq)
|
||||||
stencil_multi2[itype][jtype][ns++] =
|
stencil_multi2[itype][jtype][ns++] =
|
||||||
k*mbiny*mbinx + j*mbinx + i;
|
k*mbiny*mbinx + j*mbinx + i;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user