add triclinic support to ewald/omp
This commit is contained in:
@ -36,7 +36,7 @@ using namespace MathConst;
|
||||
|
||||
EwaldOMP::EwaldOMP(LAMMPS *lmp) : Ewald(lmp), ThrOMP(lmp, THR_KSPACE)
|
||||
{
|
||||
triclinic_support = 0;
|
||||
triclinic_support = 1;
|
||||
suffix_flag |= Suffix::OMP;
|
||||
}
|
||||
|
||||
@ -79,7 +79,11 @@ void EwaldOMP::compute(int eflag, int vflag)
|
||||
// partial structure factors on each processor
|
||||
// total structure factor by summing over procs
|
||||
|
||||
eik_dot_r();
|
||||
if (triclinic == 0)
|
||||
eik_dot_r();
|
||||
else
|
||||
eik_dot_r_triclinic();
|
||||
|
||||
MPI_Allreduce(sfacrl,sfacrl_all,kcount,MPI_DOUBLE,MPI_SUM,world);
|
||||
MPI_Allreduce(sfacim,sfacim_all,kcount,MPI_DOUBLE,MPI_SUM,world);
|
||||
|
||||
@ -421,3 +425,95 @@ void EwaldOMP::eik_dot_r()
|
||||
|
||||
} // end of parallel region
|
||||
}
|
||||
/* ---------------------------------------------------------------------- */
|
||||
|
||||
void EwaldOMP::eik_dot_r_triclinic()
|
||||
{
|
||||
const double * const * const x = atom->x;
|
||||
const double * const q = atom->q;
|
||||
const int nlocal = atom->nlocal;
|
||||
const int nthreads = comm->nthreads;
|
||||
|
||||
#if defined(_OPENMP)
|
||||
#pragma omp parallel LMP_DEFAULT_NONE
|
||||
#endif
|
||||
{
|
||||
|
||||
int i,ifrom,ito,k,l,m,n,ic,tid;
|
||||
double cstr1,sstr1;
|
||||
double sqk,clpm,slpm;
|
||||
double unitk_lamda[3];
|
||||
|
||||
loop_setup_thr(ifrom,ito,tid,nlocal,nthreads);
|
||||
|
||||
double max_kvecs[3];
|
||||
max_kvecs[0] = kxmax;
|
||||
max_kvecs[1] = kymax;
|
||||
max_kvecs[2] = kzmax;
|
||||
|
||||
// (k,0,0), (0,l,0), (0,0,m)
|
||||
|
||||
for (ic = 0; ic < 3; ic++) {
|
||||
unitk_lamda[0] = 0.0;
|
||||
unitk_lamda[1] = 0.0;
|
||||
unitk_lamda[2] = 0.0;
|
||||
unitk_lamda[ic] = 2.0*MY_PI;
|
||||
x2lamdaT(&unitk_lamda[0],&unitk_lamda[0]);
|
||||
sqk = unitk_lamda[ic]*unitk_lamda[ic];
|
||||
if (sqk <= gsqmx) {
|
||||
for (i = ifrom; i < ito; i++) {
|
||||
cs[0][ic][i] = 1.0;
|
||||
sn[0][ic][i] = 0.0;
|
||||
cs[1][ic][i] = cos(unitk_lamda[0]*x[i][0] + unitk_lamda[1]*x[i][1] + unitk_lamda[2]*x[i][2]);
|
||||
sn[1][ic][i] = sin(unitk_lamda[0]*x[i][0] + unitk_lamda[1]*x[i][1] + unitk_lamda[2]*x[i][2]);
|
||||
cs[-1][ic][i] = cs[1][ic][i];
|
||||
sn[-1][ic][i] = -sn[1][ic][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (ic = 0; ic < 3; ic++) {
|
||||
for (m = 2; m <= max_kvecs[ic]; m++) {
|
||||
unitk_lamda[0] = 0.0;
|
||||
unitk_lamda[1] = 0.0;
|
||||
unitk_lamda[2] = 0.0;
|
||||
unitk_lamda[ic] = 2.0*MY_PI*m;
|
||||
x2lamdaT(&unitk_lamda[0],&unitk_lamda[0]);
|
||||
sqk = unitk_lamda[ic]*unitk_lamda[ic];
|
||||
for (i = ifrom; i < ito; i++) {
|
||||
cs[m][ic][i] = cs[m-1][ic][i]*cs[1][ic][i] -
|
||||
sn[m-1][ic][i]*sn[1][ic][i];
|
||||
sn[m][ic][i] = sn[m-1][ic][i]*cs[1][ic][i] +
|
||||
cs[m-1][ic][i]*sn[1][ic][i];
|
||||
cs[-m][ic][i] = cs[m][ic][i];
|
||||
sn[-m][ic][i] = -sn[m][ic][i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
double * const sfacrl_thr = sfacrl + tid*kmax3d;
|
||||
double * const sfacim_thr = sfacim + tid*kmax3d;
|
||||
|
||||
for (n = 0; n < kcount; n++) {
|
||||
k = kxvecs[n];
|
||||
l = kyvecs[n];
|
||||
m = kzvecs[n];
|
||||
cstr1 = 0.0;
|
||||
sstr1 = 0.0;
|
||||
for (i = ifrom; i < ito; i++) {
|
||||
clpm = cs[l][1][i]*cs[m][2][i] - sn[l][1][i]*sn[m][2][i];
|
||||
slpm = sn[l][1][i]*cs[m][2][i] + cs[l][1][i]*sn[m][2][i];
|
||||
cstr1 += q[i]*(cs[k][0][i]*clpm - sn[k][0][i]*slpm);
|
||||
sstr1 += q[i]*(sn[k][0][i]*clpm + cs[k][0][i]*slpm);
|
||||
}
|
||||
sfacrl_thr[n] = cstr1;
|
||||
sfacim_thr[n] = sstr1;
|
||||
}
|
||||
sync_threads();
|
||||
data_reduce_thr(sfacrl,kmax3d,nthreads,1,tid);
|
||||
data_reduce_thr(sfacim,kmax3d,nthreads,1,tid);
|
||||
|
||||
} // end of parallel region
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -34,6 +34,7 @@ namespace LAMMPS_NS {
|
||||
|
||||
protected:
|
||||
virtual void eik_dot_r();
|
||||
virtual void eik_dot_r_triclinic();
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
91
unittest/force-styles/tests/kspace-ewald_tri.yaml
Normal file
91
unittest/force-styles/tests/kspace-ewald_tri.yaml
Normal file
@ -0,0 +1,91 @@
|
||||
---
|
||||
lammps_version: 30 Jun 2020
|
||||
date_generated: Sun Jul 12 19:14:28 202
|
||||
epsilon: 7.5e-14
|
||||
prerequisites: ! |
|
||||
atom full
|
||||
pair coul/long
|
||||
kspace ewald
|
||||
pre_commands: ! ""
|
||||
post_commands: ! |
|
||||
pair_modify mix arithmetic
|
||||
pair_modify table 0
|
||||
pair_modify compute no
|
||||
change_box all triclinic
|
||||
kspace_style ewald 1.0e-6
|
||||
kspace_modify gewald 0.3
|
||||
input_file: in.fourmol
|
||||
pair_style: coul/long 8.0
|
||||
pair_coeff: ! |
|
||||
* *
|
||||
extract: ! ""
|
||||
natoms: 29
|
||||
init_vdwl: 0
|
||||
init_coul: 0
|
||||
init_stress: ! |2-
|
||||
0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
|
||||
init_forces: ! |2
|
||||
1 -5.2206771887658943e-01 8.2092716641334329e-02 2.1545324956261508e-01
|
||||
2 2.1693903829318817e-01 -2.7927861552229305e-01 -1.3475460244562354e-01
|
||||
3 -3.4431684378643801e-02 -9.3072637218381445e-03 1.9955288801521635e-02
|
||||
4 1.6297859881038013e-01 2.8852601805448030e-02 -7.8017660002613662e-02
|
||||
5 1.6019985134449477e-01 7.5436361467604754e-02 -3.7764143515459606e-02
|
||||
6 5.6481531228200665e-01 4.1679985765871463e-01 -6.7651881147911153e-01
|
||||
7 -3.4209721978750263e-01 -3.9984396831970670e-01 3.9336252837675573e-01
|
||||
8 -1.4129044569095472e-01 -6.1689555678793007e-01 3.3944432308292943e-01
|
||||
9 1.8222478940751916e-01 3.2011243047943372e-01 5.0862878355165030e-02
|
||||
10 -5.1661247919076315e-02 1.1067475077169277e-01 -1.4424117291445063e-02
|
||||
11 -8.4669875945943968e-02 1.5095743463211175e-01 -3.9244483347652757e-02
|
||||
12 4.5741440577763515e-01 -4.2654712552449048e-01 3.4699693870060742e-02
|
||||
13 -1.5597032418106432e-01 1.1611461366044702e-01 2.6848241030334750e-02
|
||||
14 -1.7228226924755827e-01 1.3656996830861831e-01 1.0360775552908682e-02
|
||||
15 -1.3781820350751567e-01 8.5592039476758322e-02 -1.4389247636706383e-02
|
||||
16 -3.4310225376566400e-01 4.3356489402218990e-01 5.3260202948641322e-01
|
||||
17 1.3398758000490049e-01 -4.1297852445140776e-01 -7.8816943288763353e-01
|
||||
18 7.3018610540764362e-01 1.5461055670151038e+00 -1.3881536264098457e+00
|
||||
19 -2.5925238656641114e-01 -7.7445922519024368e-01 7.7104511596189840e-01
|
||||
20 -3.9378990654178680e-01 -7.0329956300491681e-01 7.3166048501802450e-01
|
||||
21 5.1865366949828340e-01 5.4317145701042313e-01 -1.1631741076591826e+00
|
||||
22 -2.9464392578389154e-01 -1.2315564069397771e-01 5.8314694239034537e-01
|
||||
23 -2.8787383348123141e-01 -2.9290360518755271e-01 5.5633005396803725e-01
|
||||
24 6.2598634622894167e-02 1.7443480404415288e+00 -2.7842233968885233e-01
|
||||
25 1.2975379714426077e-01 -7.0440473186448149e-01 2.2596057943898584e-01
|
||||
26 -2.2233830537492869e-01 -9.7471462858413116e-01 7.4488656828669883e-02
|
||||
27 -8.5924682160715782e-01 1.6508884428561106e+00 -9.3704327419507161e-01
|
||||
28 5.7108983323284834e-01 -9.1775706639800869e-01 5.4074973616906874e-01
|
||||
29 4.1169480682986315e-01 -8.0573566099654348e-01 4.4310526866546374e-01
|
||||
run_vdwl: 0
|
||||
run_coul: 0
|
||||
run_stress: ! |2-
|
||||
0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00 0.0000000000000000e+00
|
||||
run_forces: ! |2
|
||||
1 -5.0867482734735914e-01 8.3574364736602638e-02 2.3859366585165909e-01
|
||||
2 2.0274903616148196e-01 -2.8569598893839182e-01 -1.4769032550284392e-01
|
||||
3 -3.4147604853950062e-02 -9.1090627204342915e-03 2.1035912070905265e-02
|
||||
4 1.6406845115729854e-01 2.7543539883769418e-02 -8.1678227354518865e-02
|
||||
5 1.5795249062185149e-01 7.5138560194176501e-02 -4.3111401163038729e-02
|
||||
6 5.5863364748987443e-01 4.1079611179920561e-01 -7.0858771647783991e-01
|
||||
7 -3.4237649725585267e-01 -4.0311543472850014e-01 4.1426662722349883e-01
|
||||
8 -1.2874171503181930e-01 -6.1355649693097880e-01 3.7351123939364295e-01
|
||||
9 1.7188247077160543e-01 3.1558133464946975e-01 2.9164486652103225e-02
|
||||
10 -5.3387959585852449e-02 1.1160921489579331e-01 -1.9059202702325560e-02
|
||||
11 -8.6636270972111143e-02 1.5449691819383507e-01 -4.3272636382879377e-02
|
||||
12 4.6275716349434198e-01 -4.2637350337910229e-01 5.4575004324550480e-02
|
||||
13 -1.5766852192008335e-01 1.1681031599219645e-01 2.0747636179675545e-02
|
||||
14 -1.7360810164936916e-01 1.3766811932401099e-01 5.6897379083826688e-03
|
||||
15 -1.3806462022003005e-01 8.4210856059166131e-02 -2.2212680975988292e-02
|
||||
16 -3.5506080148101132e-01 4.4005918792192078e-01 5.1104392973553725e-01
|
||||
17 1.4397140841118727e-01 -4.0692481244891143e-01 -7.6547412744407850e-01
|
||||
18 7.7397436657562158e-01 1.6015897231975136e+00 -1.3411009805732605e+00
|
||||
19 -2.7088413374068859e-01 -7.9215425933650285e-01 7.5604613371755158e-01
|
||||
20 -4.2037849752144973e-01 -7.3410538126156533e-01 7.0882595972074158e-01
|
||||
21 5.2076835975486691e-01 4.5601795499973558e-01 -1.1110809178173753e+00
|
||||
22 -2.9120050706059641e-01 -8.0665791336783074e-02 5.6040742991458292e-01
|
||||
23 -2.8866170450889661e-01 -2.5716209793518796e-01 5.3128223623838711e-01
|
||||
24 7.6971773481289488e-02 1.6938942477865231e+00 -2.6190446160899106e-01
|
||||
25 1.1759949732622851e-01 -6.8186152759768226e-01 2.1305657333424061e-01
|
||||
26 -2.2405386988235390e-01 -9.4807680646299108e-01 6.5202747884286760e-02
|
||||
27 -8.6788944488631092e-01 1.6456010755499724e+00 -8.8866425392486648e-01
|
||||
28 5.7544277372884678e-01 -9.1125861496507965e-01 5.1442393569132128e-01
|
||||
29 4.1466363894324065e-01 -8.0453174714178211e-01 4.1596367608693868e-01
|
||||
...
|
||||
Reference in New Issue
Block a user