Unverified Commit 15e969ca authored by Axel Kohlmeyer's avatar Axel Kohlmeyer
Browse files

add triclinic support to ewald/omp

parent 094f52c3
Loading
Loading
Loading
Loading
+98 −2
Original line number Diff line number Diff line
@@ -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

  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
}

+1 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ namespace LAMMPS_NS {

 protected:
  virtual void eik_dot_r();
  virtual void eik_dot_r_triclinic();
};

}
+91 −0
Original line number Diff line number Diff line
---
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
...