Added first draft of inner switching functions
This commit is contained in:
@ -119,6 +119,7 @@ SNA::SNA(LAMMPS* lmp, double rfac0_in, int twojmax_in,
|
|||||||
rfac0 = rfac0_in;
|
rfac0 = rfac0_in;
|
||||||
rmin0 = rmin0_in;
|
rmin0 = rmin0_in;
|
||||||
switch_flag = switch_flag_in;
|
switch_flag = switch_flag_in;
|
||||||
|
switch_inner_flag = 0;
|
||||||
bzero_flag = bzero_flag_in;
|
bzero_flag = bzero_flag_in;
|
||||||
chem_flag = chem_flag_in;
|
chem_flag = chem_flag_in;
|
||||||
bnorm_flag = bnorm_flag_in;
|
bnorm_flag = bnorm_flag_in;
|
||||||
@ -1001,11 +1002,15 @@ void SNA::zero_uarraytot(int ielem)
|
|||||||
void SNA::add_uarraytot(double r, double wj, double rcut, int jj, int jelem)
|
void SNA::add_uarraytot(double r, double wj, double rcut, int jj, int jelem)
|
||||||
{
|
{
|
||||||
double sfac;
|
double sfac;
|
||||||
|
double rinner = 0.0;
|
||||||
|
double drinner = 1.0;
|
||||||
|
|
||||||
sfac = compute_sfac(r, rcut);
|
sfac = compute_sfac(r, rcut);
|
||||||
|
|
||||||
sfac *= wj;
|
sfac *= wj;
|
||||||
|
|
||||||
|
if (switch_inner_flag)
|
||||||
|
sfac *= compute_sfac_inner(r, rinner, drinner);
|
||||||
|
|
||||||
double* ulist_r = ulist_r_ij[jj];
|
double* ulist_r = ulist_r_ij[jj];
|
||||||
double* ulist_i = ulist_i_ij[jj];
|
double* ulist_i = ulist_i_ij[jj];
|
||||||
|
|
||||||
@ -1248,6 +1253,14 @@ void SNA::compute_duarray(double x, double y, double z,
|
|||||||
double sfac = compute_sfac(r, rcut);
|
double sfac = compute_sfac(r, rcut);
|
||||||
double dsfac = compute_dsfac(r, rcut);
|
double dsfac = compute_dsfac(r, rcut);
|
||||||
|
|
||||||
|
if (switch_inner_flag) {
|
||||||
|
double rinner = 0.0;
|
||||||
|
double drinner = 1.0;
|
||||||
|
|
||||||
|
sfac *= compute_sfac_inner(r, rinner, drinner);
|
||||||
|
dsfac *= compute_dsfac_inner(r, rinner, drinner);
|
||||||
|
}
|
||||||
|
|
||||||
sfac *= wj;
|
sfac *= wj;
|
||||||
dsfac *= wj;
|
dsfac *= wj;
|
||||||
for (int j = 0; j <= twojmax; j++) {
|
for (int j = 0; j <= twojmax; j++) {
|
||||||
@ -1515,31 +1528,59 @@ void SNA::compute_ncoeff()
|
|||||||
|
|
||||||
double SNA::compute_sfac(double r, double rcut)
|
double SNA::compute_sfac(double r, double rcut)
|
||||||
{
|
{
|
||||||
if (switch_flag == 0) return 1.0;
|
double sfac;
|
||||||
if (switch_flag == 1) {
|
if (switch_flag == 0) sfac = 1.0;
|
||||||
if (r <= rmin0) return 1.0;
|
else if (r <= rmin0) sfac = 1.0;
|
||||||
else if (r > rcut) return 0.0;
|
else if (r > rcut) sfac = 0.0;
|
||||||
else {
|
else {
|
||||||
double rcutfac = MY_PI / (rcut - rmin0);
|
double rcutfac = MY_PI / (rcut - rmin0);
|
||||||
return 0.5 * (cos((r - rmin0) * rcutfac) + 1.0);
|
sfac = 0.5 * (cos((r - rmin0) * rcutfac) + 1.0);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0.0;
|
return sfac;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
double SNA::compute_dsfac(double r, double rcut)
|
double SNA::compute_dsfac(double r, double rcut)
|
||||||
{
|
{
|
||||||
if (switch_flag == 0) return 0.0;
|
double dsfac;
|
||||||
if (switch_flag == 1) {
|
if (switch_flag == 0) dsfac = 0.0;
|
||||||
if (r <= rmin0) return 0.0;
|
else if (r <= rmin0) dsfac = 0.0;
|
||||||
else if (r > rcut) return 0.0;
|
else if (r > rcut) dsfac = 0.0;
|
||||||
else {
|
else {
|
||||||
double rcutfac = MY_PI / (rcut - rmin0);
|
double rcutfac = MY_PI / (rcut - rmin0);
|
||||||
return -0.5 * sin((r - rmin0) * rcutfac) * rcutfac;
|
dsfac = -0.5 * sin((r - rmin0) * rcutfac) * rcutfac;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return 0.0;
|
return dsfac;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double SNA::compute_sfac_inner(double r, double rinner, double drinner)
|
||||||
|
{
|
||||||
|
double sfac;
|
||||||
|
if (switch_inner_flag == 0) sfac = 1.0;
|
||||||
|
else if (r >= rinner + drinner) sfac = 1.0;
|
||||||
|
else if (r <= rinner) sfac = 0.0;
|
||||||
|
else {
|
||||||
|
double rcutfac = MY_PI / drinner;
|
||||||
|
sfac = 0.5 * (1.0 - cos((r - rinner) * rcutfac));
|
||||||
|
}
|
||||||
|
return sfac;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
double SNA::compute_dsfac_inner(double r, double rinner, double drinner)
|
||||||
|
{
|
||||||
|
double dsfac;
|
||||||
|
if (switch_inner_flag == 0) dsfac = 0.0;
|
||||||
|
else if (r >= rinner + drinner) dsfac = 0.0;
|
||||||
|
else if (r <= rinner) dsfac = 0.0;
|
||||||
|
else {
|
||||||
|
double rcutfac = MY_PI / drinner;
|
||||||
|
dsfac = 0.5 * sin((r - rinner) * rcutfac) * rcutfac;
|
||||||
|
}
|
||||||
|
return dsfac;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -59,6 +59,9 @@ class SNA : protected Pointers {
|
|||||||
double compute_sfac(double, double);
|
double compute_sfac(double, double);
|
||||||
double compute_dsfac(double, double);
|
double compute_dsfac(double, double);
|
||||||
|
|
||||||
|
double compute_sfac_inner(double, double, double);
|
||||||
|
double compute_dsfac_inner(double, double, double);
|
||||||
|
|
||||||
double *blist;
|
double *blist;
|
||||||
double **dblist;
|
double **dblist;
|
||||||
double **rij;
|
double **rij;
|
||||||
@ -115,6 +118,11 @@ class SNA : protected Pointers {
|
|||||||
// 1 = cosine
|
// 1 = cosine
|
||||||
int switch_flag;
|
int switch_flag;
|
||||||
|
|
||||||
|
// Sets the style for the inner switching function
|
||||||
|
// 0 = none
|
||||||
|
// 1 = cosine
|
||||||
|
int switch_inner_flag;
|
||||||
|
|
||||||
// Self-weight
|
// Self-weight
|
||||||
double wself;
|
double wself;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user