diff --git a/doc/src/Eqs/force_spin_aniso.pdf b/doc/src/Eqs/force_spin_aniso.pdf
new file mode 100644
index 0000000000..29a2b49ca6
Binary files /dev/null and b/doc/src/Eqs/force_spin_aniso.pdf differ
diff --git a/doc/src/Eqs/force_spin_aniso.tex b/doc/src/Eqs/force_spin_aniso.tex
new file mode 100644
index 0000000000..d6abfd580d
--- /dev/null
+++ b/doc/src/Eqs/force_spin_aniso.tex
@@ -0,0 +1,11 @@
+\documentclass[preview]{standalone}
+\usepackage{varwidth}
+\usepackage[utf8x]{inputenc}
+\usepackage{amsmath,amssymb,amsthm,bm}
+\begin{document}
+\begin{varwidth}{50in}
+ \begin{equation}
+ \bm{H}_{aniso} = -\sum_{{ i}=1}^{N} K_{an}(\bm{r}_{i})\, \left( \vec{s}_{i} \cdot \vec{n}_{i} \right)^2, \nonumber
+ \end{equation}
+\end{varwidth}
+\end{document}
diff --git a/doc/src/Eqs/force_spin_zeeman.pdf b/doc/src/Eqs/force_spin_zeeman.pdf
new file mode 100644
index 0000000000..2f53946ae4
Binary files /dev/null and b/doc/src/Eqs/force_spin_zeeman.pdf differ
diff --git a/doc/src/Eqs/force_spin_zeeman.tex b/doc/src/Eqs/force_spin_zeeman.tex
new file mode 100644
index 0000000000..d623ef85ae
--- /dev/null
+++ b/doc/src/Eqs/force_spin_zeeman.tex
@@ -0,0 +1,11 @@
+\documentclass[preview]{standalone}
+\usepackage{varwidth}
+\usepackage[utf8x]{inputenc}
+\usepackage{amsmath,amssymb,amsthm,bm}
+\begin{document}
+\begin{varwidth}{50in}
+ \begin{equation}
+ \bm{H}_{zeeman} = -\mu_{B}\mu_0\sum_{i=0}^{N}g_{i} \vec{s}_{i} \cdot \vec{H}_{ext} \nonumber
+ \end{equation}
+\end{varwidth}
+\end{document}
diff --git a/doc/src/fix_force_spin.txt b/doc/src/fix_force_spin.txt
index 5f4c34ec26..60a70dbf40 100644
--- a/doc/src/fix_force_spin.txt
+++ b/doc/src/fix_force_spin.txt
@@ -20,14 +20,13 @@ style = {zeeman} or {aniso} :l
x y z = vector direction of the field
{aniso} args = K x y z
K = intensity of the magnetic anisotropy (in eV)
- x y z = vector direction of the anisotropy
+ x y z = vector direction of the anisotropy :pre
:ule
[Examples:]
fix 1 all force/spin zeeman 0.1 0.0 0.0 1.0
-fix 1 all force/spin aniso 0.001 0.0 0.0 1.0
-
+fix 1 all force/spin aniso 0.001 0.0 0.0 1.0 :pre
[Description:]
@@ -35,48 +34,40 @@ Impose a force torque to each magnetic spin in the group.
Style {zeeman} is used for the simulation of the interaction
between the magnetic spins in the defined group and an external
-magnetic field.
+magnetic field:
+
+:c,image(Eqs/force_spin_zeeman.pdf)
+
+with mu0 the vacuum permeability, muB the Bohr magneton (muB = 5.788 eV/T
+in metal units),
Style {aniso} is used to simulate an easy axis or an easy plane
-for the magnetic spins in the defined group.
-If K>0, an easy axis is defined, and if K<0, an easy plane is
-defined.
+for the magnetic spins in the defined group:
-In both cases, x y z impose is the vector direction for the force.
+:c,image(Eqs/force_spin_aniso.pdf)
+
+with n defining the direction of the anisotropy, and K (in eV) its intensity.
+If K>0, an easy axis is defined, and if K<0, an easy plane is defined.
+
+In both cases, the choice of (x y z) imposes the vector direction for the force.
Only the direction of the vector is important; it's length is ignored.
:line
-
[Restart, fix_modify, output, run start/stop, minimize info:]
No information about this fix is written to "binary restart
files"_restart.html.
-The "fix_modify"_fix_modify.html {energy} option is supported by this
-fix to add the gravitational potential energy of the system to the
-system's potential energy as part of "thermodynamic
-output"_thermo_style.html.
+[Restrictions:]
-The "fix_modify"_fix_modify.html {respa} option is supported by this
-fix. This allows to set at which level of the "r-RESPA"_run_style.html
-integrator the fix is adding its forces. Default is the outermost level.
-
-This fix computes a global scalar which can be accessed by various
-"output commands"_Section_howto.html#howto_15. This scalar is the
-gravitational potential energy of the particles in the defined field,
-namely mass * (g dot x) for each particles, where x and mass are the
-particles position and mass, and g is the gravitational field. The
-scalar value calculated by this fix is "extensive".
-
-No parameter of this fix can be used with the {start/stop} keywords of
-the "run"_run.html command. This fix is not invoked during "energy
-minimization"_minimize.html.
-
-[Restrictions:] none
+The {force/spin} style is part of the SPIN package.
+This style is only enabled if LAMMPS was built with this package, and
+if the atom_style "spin" was declared.
+See the "Making LAMMPS"_Section_start.html#start_3 section for more info.
[Related commands:]
-"atom_style sphere"_atom_style.html, "fix addforce"_fix_addforce.html
+"atom_style spin"_atom_style.html
[Default:] none
diff --git a/doc/src/pair_spin_exchange.txt b/doc/src/pair_spin_exchange.txt
index cd94984230..7331798088 100644
--- a/doc/src/pair_spin_exchange.txt
+++ b/doc/src/pair_spin_exchange.txt
@@ -1,11 +1,3 @@
-
-
-
-
"LAMMPS WWW Site"_lws - "LAMMPS Documentation"_ld - "LAMMPS Commands"_lc :c
:link(lws,http://lammps.sandia.gov)
@@ -33,7 +25,7 @@ pair_coeff 1 2 exchange 6.0 -0.01575 0.0 1.965 :pre
[Description:]
Style {pair/spin/exchange} computes the exchange interaction between
-pairs of magnetic spins.
+pairs of magnetic spins:
:c,image(Eqs/pair_spin_exchange_interaction.pdf)
@@ -46,18 +38,15 @@ This function is defined as:
:c,image(Eqs/pair_spin_exchange_function.pdf)
-where a, b and d are the three constants defined in the associated "pair_coeff"
-command.
+where a, b and d are the three constant coefficients defined in the associated
+"pair_coeff" command.
-More explanations the {pair/spin/exchange} and its parametrization are reported
+The coefficients a, b, and c need to be fitted so that the function above matches with
+the value of the exchange interaction for the N neighbor shells taken into account.
+
+Examles and more explanations about this function and its parametrization are reported
in "(Tranchida)"_#Tranchida1.
-
-
-The {lj/cut} and {lj/cut/coul/long} pair styles support the use of the
-{inner}, {middle}, and {outer} keywords of the "run_style
-respa"_run_style.html command, meaning the pairwise forces can be
-
:line
[Restrictions:]
@@ -69,9 +58,8 @@ See the "Making LAMMPS"_Section_start.html#start_3 section for more info.
[Related commands:]
-"eam"
-
-"pair_coeff"_pair_coeff.html
+"atom_style spin"_atom_style.html, "pair_coeff"_pair_coeff.html,
+"pair_eam"_pair_eam.html,
[Default:] none
diff --git a/examples/SPIN/in.spin.cobalt b/examples/SPIN/in.spin.cobalt
index dc93920585..4b0d7c3e64 100644
--- a/examples/SPIN/in.spin.cobalt
+++ b/examples/SPIN/in.spin.cobalt
@@ -87,8 +87,8 @@ neigh_modify every 10 check yes delay 20
#fix 2 all langevin/spin 0.0 0.0 0.0 21
#Magnetic integration fix
-#fix 3 all integration/spin mpi
-fix 3 all integration/spin serial lattice yes
+fix 3 all integration/spin lattice yes
+#fix 3 all integration/spin lattice no
#compute real time, total magnetization, magnetic energy, and spin temperature
#Iteration | Time | Mx | My | Mz | |M| | Em | Tm
@@ -120,5 +120,6 @@ thermo_modify format float %20.15g
dump 1 all custom 50 dump_cobalt.lammpstrj type x y z spx spy spz
#Running the simulations for N timesteps
-run 1000
+run 10
+#run 1000
diff --git a/src/SPIN/compute_spin.cpp b/src/SPIN/compute_spin.cpp
index 313250b6e9..fc308b8124 100644
--- a/src/SPIN/compute_spin.cpp
+++ b/src/SPIN/compute_spin.cpp
@@ -54,6 +54,7 @@ ComputeSpin::ComputeSpin(LAMMPS *lmp, int narg, char **arg) :
ComputeSpin::~ComputeSpin()
{
+ memory->destroy(vector);
}
/* ---------------------------------------------------------------------- */
diff --git a/src/SPIN/fix_integration_spin.cpp b/src/SPIN/fix_integration_spin.cpp
index 8a21463b7f..9862310533 100644
--- a/src/SPIN/fix_integration_spin.cpp
+++ b/src/SPIN/fix_integration_spin.cpp
@@ -73,16 +73,20 @@ FixIntegrationSpin::FixIntegrationSpin(LAMMPS *lmp, int narg, char **arg) :
extra = SPIN;
} else error->all(FLERR,"Illegal fix integration/spin command");
- int iarg = 3;
+ // defining mpi_flag
+ int nprocs_tmp = comm->nprocs;
+ if (nprocs_tmp == 1) {
+ mpi_flag = 0;
+ } else if (nprocs_tmp >= 1) {
+ mpi_flag = 1;
+ } else error->all(FLERR,"Illegal fix/integration/spin command");
+
+ // defining mech_flag
+
+ int iarg = 3;
while (iarg < narg) {
- if (strcmp(arg[iarg],"serial") == 0){
- mpi_flag = 0;
- iarg += 1;
- } else if (strcmp(arg[iarg],"mpi") == 0) {
- mpi_flag = 1;
- iarg += 1;
- } else if (strcmp(arg[iarg],"lattice") == 0) {
+ if (strcmp(arg[iarg],"lattice") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal fix/integration/spin command");
if (strcmp(arg[iarg+1],"no") == 0) mech_flag = 0;
else if (strcmp(arg[iarg+1],"yes") == 0) mech_flag = 1;
@@ -94,8 +98,8 @@ FixIntegrationSpin::FixIntegrationSpin(LAMMPS *lmp, int narg, char **arg) :
if (extra == SPIN && !atom->mumag_flag)
error->all(FLERR,"Fix integration/spin requires spin attribute mumag");
- //if (mpi_flag == NONE)
- // error->all(FLERR,"Illegal fix/integration/spin command");
+ if (mpi_flag == 0 && nprocs_tmp == 1)
+ error->all(FLERR,"Illegal fix/integration/spin command");
magpair_flag = 0;
exch_flag = 0;
@@ -134,6 +138,7 @@ int FixIntegrationSpin::setmask()
void FixIntegrationSpin::init()
{
+
// set timesteps
dtv = update->dt;
@@ -202,29 +207,20 @@ void FixIntegrationSpin::init()
if (locklangevinspin->temp_flag == 1) temp_flag = 1;
}
-
+ nsectors = 0;
memory->create(rsec,3,"integration/spin:rsec");
// perform the sectoring if mpi integration
- if (mpi_flag) {
- sectoring();
-
- // grow tables of stacking variables
-
- stack_head = memory->grow(stack_head,nsectors,"integration/spin:stack_head");
- stack_foot = memory->grow(stack_foot,nsectors,"integration/spin:stack_foot");
- forward_stacks = memory->grow(forward_stacks,atom->nmax,"integration/spin:forward_stacks");
- backward_stacks = memory->grow(backward_stacks,atom->nmax,"integration/spin:backward_stacks");
- }
+ if (mpi_flag) sectoring();
- // grow tables of stacking variables
- /*
+ // grow tables of stacking variables (mpi)
+
stack_head = memory->grow(stack_head,nsectors,"integration/spin:stack_head");
stack_foot = memory->grow(stack_foot,nsectors,"integration/spin:stack_foot");
forward_stacks = memory->grow(forward_stacks,atom->nmax,"integration/spin:forward_stacks");
backward_stacks = memory->grow(backward_stacks,atom->nmax,"integration/spin:backward_stacks");
-*/
+
}
/* ---------------------------------------------------------------------- */
@@ -358,7 +354,7 @@ void FixIntegrationSpin::setup_pre_neighbor()
}
/* ----------------------------------------------------------------------
- store in two linked lists the advance order of the spins
+ store in two linked lists the advance order of the spins (mpi)
---------------------------------------------------------------------- */
void FixIntegrationSpin::pre_neighbor()
@@ -591,23 +587,9 @@ int FixIntegrationSpin::coords2sector(double *x)
sublo[dim]=sublotmp[dim];
}
-//#define M1
-#if defined M1
- double rix = (x[0] - sublo[0])/rsec[0];
- double riy = (x[1] - sublo[1])/rsec[1];
- double riz = (x[2] - sublo[2])/rsec[2];
-
- seci[0] = static_cast(rix);
- seci[1] = static_cast(riy);
- seci[2] = static_cast(riz);
-#endif
-
-#define M2
-#if defined M2
seci[0] = x[0] > (sublo[0] + rsec[0]);
seci[1] = x[1] > (sublo[1] + rsec[1]);
seci[2] = x[2] > (sublo[2] + rsec[2]);
-#endif
nseci = (seci[0] + 2*seci[1] + 4*seci[2]);
diff --git a/src/SPIN/fix_integration_spin.h b/src/SPIN/fix_integration_spin.h
index 15471278ab..cb41f2337a 100644
--- a/src/SPIN/fix_integration_spin.h
+++ b/src/SPIN/fix_integration_spin.h
@@ -45,7 +45,8 @@ class FixIntegrationSpin : public Fix {
protected:
int extra;
- int mpi_flag; //mpi_flag = if parallel algorithm
+ int mpi_flag; // mpi_flag = 0 if serial algorithm
+ // mpi_flag = 1 if parallel algorithm
int mech_flag; // mech_flag = 0 if spins only
// mech_flag = 1 if spin-lattice calc.
diff --git a/src/atom.cpp b/src/atom.cpp
index 86ef309f09..04104272cb 100644
--- a/src/atom.cpp
+++ b/src/atom.cpp
@@ -278,6 +278,10 @@ Atom::~Atom()
memory->destroy(tri);
memory->destroy(body);
+ memory->destroy(mumag);
+ memory->destroy(sp);
+ memory->destroy(fm);
+
memory->destroy(vfrac);
memory->destroy(s0);
memory->destroy(x0);