diff --git a/src/USER-OMP/ewald_omp.cpp b/src/USER-OMP/ewald_omp.cpp index f4473a6633..e023daf2db 100644 --- a/src/USER-OMP/ewald_omp.cpp +++ b/src/USER-OMP/ewald_omp.cpp @@ -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 +} + + diff --git a/src/USER-OMP/ewald_omp.h b/src/USER-OMP/ewald_omp.h index d06b634c43..e3c779d786 100644 --- a/src/USER-OMP/ewald_omp.h +++ b/src/USER-OMP/ewald_omp.h @@ -34,6 +34,7 @@ namespace LAMMPS_NS { protected: virtual void eik_dot_r(); + virtual void eik_dot_r_triclinic(); }; } diff --git a/unittest/force-styles/tests/kspace-ewald_tri.yaml b/unittest/force-styles/tests/kspace-ewald_tri.yaml new file mode 100644 index 0000000000..386d50625b --- /dev/null +++ b/unittest/force-styles/tests/kspace-ewald_tri.yaml @@ -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 +...