From 49f0a7a89a0e67cf67e44eb034b1a086912ac3e0 Mon Sep 17 00:00:00 2001 From: julient31 Date: Tue, 28 Nov 2017 13:52:08 -0700 Subject: [PATCH] New MPI algorithm (still to be checked) --- examples/SPIN/in.co_magnetomech | 16 ++-- src/SPIN/fix_integration_spin.cpp | 124 ++++++++++++++++++++++++++---- src/SPIN/pair_spin_exchange.cpp | 6 +- 3 files changed, 120 insertions(+), 26 deletions(-) diff --git a/examples/SPIN/in.co_magnetomech b/examples/SPIN/in.co_magnetomech index ee83b31e6f..78f1e5d128 100644 --- a/examples/SPIN/in.co_magnetomech +++ b/examples/SPIN/in.co_magnetomech @@ -8,6 +8,8 @@ dimension 3 boundary p p p #boundary f f f +#newton off + #setting atom_style to spin: atom_style spin @@ -21,7 +23,7 @@ atom_modify map array ########################### lattice fcc 3.54 -region box block 0.0 8.0 0.0 8.0 0.0 8.0 +region box block 0.0 5.0 0.0 5.0 0.0 5.0 create_box 1 box create_atoms 1 box @@ -36,21 +38,19 @@ group single_spin id 10 mass 1 58.93 #Setting spins orientation and moment -#set group all spin/random 31 1.72 -set group all spin 1.72 0.0 0.0 1.0 -set group single_spin spin/random 11 1.72 +set group all spin/random 31 1.72 +#set group all spin 1.72 0.0 0.0 1.0 +#set group single_spin spin/random 11 1.72 velocity all create 200 4928459 rot yes dist gaussian #Magneto-mechanic interactions for bulk fcc Cobalt #pair_style pair/spin/exchange 4.0 #pair_style eam/alloy -#pair_style hybrid/overlay eam/alloy pair/spin/soc 4.0 #pair_style hybrid/overlay eam/alloy pair/spin/exchange 4.0 pair/spin/soc/neel 4.0 -#pair_style hybrid/overlay eam/alloy pair/spin/exchange 6.5 pair_style hybrid/overlay eam/alloy pair/spin/exchange 4.0 -pair_coeff * * eam/alloy ../Co_PurjaPun_2012.eam.alloy Co +pair_coeff * * eam/alloy ../examples/SPIN/Co_PurjaPun_2012.eam.alloy Co #pair_coeff * * ../Co_PurjaPun_2012.eam.alloy Co #pair_style pair/spin 4.0 @@ -114,6 +114,6 @@ thermo_modify format float %20.15g dump 1 all custom 500 dump_VSRSV.lammpstrj type x y z spx spy spz #Running the simulations for N timesteps +#run 100 run 10000 -#run 2 diff --git a/src/SPIN/fix_integration_spin.cpp b/src/SPIN/fix_integration_spin.cpp index 9066f75aea..a790aa7ea6 100644 --- a/src/SPIN/fix_integration_spin.cpp +++ b/src/SPIN/fix_integration_spin.cpp @@ -109,6 +109,7 @@ FixIntegrationSpin::~FixIntegrationSpin() memory->destroy(spj); memory->destroy(fmi); memory->destroy(fmj); + } /* ---------------------------------------------------------------------- */ @@ -190,6 +191,7 @@ void FixIntegrationSpin::init() if (locklangevinspin->temp_flag == 1) temp_flag = 1; } + // perform the sectoring if mpi integration if (mpi_flag) sectoring(); @@ -200,7 +202,6 @@ void FixIntegrationSpin::init() void FixIntegrationSpin::initial_integrate(int vflag) { double dtfm,msq,scale,fm2,fmsq,sp2,spsq,energy; - double cp[3],g[3]; double **x = atom->x; double **v = atom->v; @@ -226,8 +227,72 @@ void FixIntegrationSpin::initial_integrate(int vflag) } } -#define MPI_TEST +//#define SEC +#define LIST +#if defined LIST + //printf("sectors = %d \n",nsectors); + int adv_list[nsectors][nlocal]; + int k[nsectors]; + for (int j = 0; j < nsectors; j++) { + k[j] = 0; + for (int i = 0; i < nlocal; i++) { + adv_list[j][i] = 0; + } + } + int s, p; + + // update half s for all particles + if (extra == SPIN) { + if (mpi_flag == 1) { // mpi seq. update + int nseci; + for (int j = 0; j < nsectors; j++) { // advance quarter s for nlocal + comm->forward_comm(); + k[j] = 0; + for (int i = 0; i < nlocal; i++) { + xi[0] = x[i][0]; + xi[1] = x[i][1]; + xi[2] = x[i][2]; + nseci = coords2sector(xi); + if (j != nseci) continue; + ComputeInteractionsSpin(i); + AdvanceSingleSpin(i,dts,sp,fm); + adv_list[j][k[j]] = i; + k[j]++; + } + } + int ntest = 0; + for (int j = 0; j < nsectors; j++) { + ntest += k[j]; + } + if (ntest != nlocal) error->all(FLERR,"error, S(k[j]) != nlocal"); + + for (int j = nsectors-1; j >= 0; j--) { + comm->forward_comm(); + for (int i = k[j]-1; i >= 0; i--) { + p = adv_list[j][i]; + ComputeInteractionsSpin(p); + AdvanceSingleSpin(p,dts,sp,fm); + } + } + } else if (mpi_flag == 0) { // serial seq. update + comm->forward_comm(); // comm. positions of ghost atoms + for (int i = 0; i < nlocal-1; i++){ // advance quarter s for nlocal + ComputeInteractionsSpin(i); + AdvanceSingleSpin(i,dts,sp,fm); + } + ComputeInteractionsSpin(nlocal-1); + AdvanceSingleSpin(nlocal-1,2.0*dts,sp,fm); // advance half s for 1 + for (int i = nlocal-2; i >= 0; i--){ // advance quarter s for nlocal + ComputeInteractionsSpin(i); + AdvanceSingleSpin(i,dts,sp,fm); + } + } else error->all(FLERR,"Illegal fix integration/spin command"); + } +#endif + + +#if defined SEC // update half s for all particles if (extra == SPIN) { if (mpi_flag == 1) { // mpi seq. update @@ -243,9 +308,6 @@ void FixIntegrationSpin::initial_integrate(int vflag) ComputeInteractionsSpin(i); AdvanceSingleSpin(i,dts,sp,fm); } - #if defined MPI_TEST - MPI_Barrier(world); - #endif } for (int j = nsectors-1; j >= 0; j--) { // advance quarter s for nlocal comm->forward_comm(); @@ -258,9 +320,6 @@ void FixIntegrationSpin::initial_integrate(int vflag) ComputeInteractionsSpin(i); AdvanceSingleSpin(i,dts,sp,fm); } - #if defined MPI_TEST - MPI_Barrier(world); - #endif } } else if (mpi_flag == 0) { // serial seq. update comm->forward_comm(); // comm. positions of ghost atoms @@ -276,6 +335,8 @@ void FixIntegrationSpin::initial_integrate(int vflag) } } else error->all(FLERR,"Illegal fix integration/spin command"); } +#endif + // update x for all particles for (int i = 0; i < nlocal; i++) { @@ -286,6 +347,45 @@ void FixIntegrationSpin::initial_integrate(int vflag) } } + +#if defined LIST + // update half s for all particles + if (extra == SPIN) { + if (mpi_flag == 1) { // mpi seq. update + int nseci; + for (int j = 0; j < nsectors; j++) { // advance quarter s for nlocal + comm->forward_comm(); + for (int i = 0; i < k[j]; i++) { + p = adv_list[j][i]; + ComputeInteractionsSpin(p); + AdvanceSingleSpin(p,dts,sp,fm); + } + } + for (int j = nsectors-1; j >= 0; j--) { // advance quarter s for nlocal + comm->forward_comm(); + for (int i = k[j]-1; i >= 0; i--) { + p = adv_list[j][i]; + ComputeInteractionsSpin(p); + AdvanceSingleSpin(p,dts,sp,fm); + } + } + } else if (mpi_flag == 0) { // serial seq. update + comm->forward_comm(); // comm. positions of ghost atoms + for (int i = 0; i < nlocal-1; i++){ // advance quarter s for nlocal + ComputeInteractionsSpin(i); + AdvanceSingleSpin(i,dts,sp,fm); + } + ComputeInteractionsSpin(nlocal-1); + AdvanceSingleSpin(nlocal-1,2.0*dts,sp,fm); // advance half s for 1 + for (int i = nlocal-2; i >= 0; i--){ // advance quarter s for nlocal + ComputeInteractionsSpin(i); + AdvanceSingleSpin(i,dts,sp,fm); + } + } else error->all(FLERR,"Illegal fix integration/spin command"); + } +#endif + +#if defined SEC // update half s for all particles if (extra == SPIN) { if (mpi_flag == 1) { // mpi seq. update @@ -301,9 +401,6 @@ void FixIntegrationSpin::initial_integrate(int vflag) ComputeInteractionsSpin(i); AdvanceSingleSpin(i,dts,sp,fm); } - #if defined MPI_TEST - MPI_Barrier(world); - #endif } for (int j = nsectors-1; j >= 0; j--) { // advance quarter s for nlocal comm->forward_comm(); @@ -316,9 +413,6 @@ void FixIntegrationSpin::initial_integrate(int vflag) ComputeInteractionsSpin(i); AdvanceSingleSpin(i,dts,sp,fm); } - #if defined MPI_TEST - MPI_Barrier(world); - #endif } } else if (mpi_flag == 0) { // serial seq. update comm->forward_comm(); // comm. positions of ghost atoms @@ -334,7 +428,7 @@ void FixIntegrationSpin::initial_integrate(int vflag) } } else error->all(FLERR,"Illegal fix integration/spin command"); } - +#endif } diff --git a/src/SPIN/pair_spin_exchange.cpp b/src/SPIN/pair_spin_exchange.cpp index fcef08b600..208a82ea30 100755 --- a/src/SPIN/pair_spin_exchange.cpp +++ b/src/SPIN/pair_spin_exchange.cpp @@ -175,9 +175,9 @@ void PairSpinExchange::compute(int eflag, int vflag) f[j][0] += fj[0]; f[j][1] += fj[1]; f[j][2] += fj[2]; - fm[j][0] += fmj[0]; - fm[j][1] += fmj[1]; - fm[j][2] += fmj[2]; + //fm[j][0] += fmj[0]; + //fm[j][1] += fmj[1]; + //fm[j][2] += fmj[2]; } if (eflag) {