Added first draft of inner switching functions

This commit is contained in:
Aidan Thompson
2022-03-10 13:58:14 -07:00
parent c6b4c418e7
commit adef6bd10c
2 changed files with 68 additions and 19 deletions

View File

@ -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;
} }

View File

@ -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;