From 70c816aa02085ddf7c33d185605981887ffcb26a Mon Sep 17 00:00:00 2001 From: julient31 Date: Wed, 10 Apr 2019 13:18:33 -0600 Subject: [PATCH] Commit JT 041019 - corrected setforce/spin - added an example - added the documentation (in setforce) - updated the Howto_spin documentation --- doc/src/Howto_spins.txt | 23 ++++++-- doc/src/fix_langevin_spin.txt | 2 +- doc/src/fix_nve_spin.txt | 2 +- doc/src/fix_setforce.txt | 20 ++++++- doc/src/pair_spin_dmi.txt | 2 +- doc/src/pair_spin_exchange.txt | 2 +- doc/src/pair_spin_magelec.txt | 2 +- doc/src/pair_spin_neel.txt | 2 +- .../SPIN/setforce_spin/in.spinmin.setforce | 59 +++++++++++++++++++ src/SPIN/fix_nve_spin.cpp | 2 - src/SPIN/fix_setforce_spin.cpp | 34 +++++------ 11 files changed, 117 insertions(+), 33 deletions(-) create mode 100644 examples/SPIN/setforce_spin/in.spinmin.setforce diff --git a/doc/src/Howto_spins.txt b/doc/src/Howto_spins.txt index 7f16883487..93823d7fde 100644 --- a/doc/src/Howto_spins.txt +++ b/doc/src/Howto_spins.txt @@ -10,7 +10,7 @@ Documentation"_ld - "LAMMPS Commands"_lc :c Magnetic spins :h3 The magnetic spin simulations are enabled by the SPIN package, whose -implementation is detailed in "Tranchida"_#Tranchida7. +implementation is detailed in "Tranchida"_#Tranchida. The model represents the simulation of atomic magnetic spins coupled to lattice vibrations. The dynamics of those magnetic spins can be used @@ -36,13 +36,28 @@ A Langevin thermostat can be applied to those magnetic spins using "fix langevin/spin"_fix_langevin_spin.html. Typically, this thermostat can be coupled to another Langevin thermostat applied to the atoms using "fix langevin"_fix_langevin.html in order to simulate -thermostatted spin-lattice system. +thermostatted spin-lattice systems. The magnetic Gilbert damping can also be applied using "fix langevin/spin"_fix_langevin_spin.html. It allows to either dissipate the thermal energy of the Langevin thermostat, or to perform a relaxation of the magnetic configuration toward an equilibrium state. +The command "fix setforce/spin"_fix_setforce.html allows to set the +components of the magnetic precession vectors (while erasing and +replacing the previsouly computed magnetic precession vectors on +the atom). +This command can be used to freeze the magnetic moment of certain +atoms in the simulation by zeroing their precession vector. + +The command "fix nve/spin"_fix_nve_spin.html can be used to +perform a simplectic integration of the combined dynamics of spins +and atomic motions. + +The minimization style "min/spin"_min_spin.html can be applied +to the spins to perform a minimization of the spin configuration. + + All the computed magnetic properties can be output by two main commands. The first one is "compute spin"_compute_spin.html, that enables to evaluate magnetic averaged quantities, such as the total @@ -54,6 +69,6 @@ magnetic spin, or the magnetic force acting on this spin. :line -:link(Tranchida7) +:link(Tranchida) [(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson, -arXiv preprint arXiv:1801.10233, (2018). +Journal of Computational Physics, 372, 406-425, (2018). diff --git a/doc/src/fix_langevin_spin.txt b/doc/src/fix_langevin_spin.txt index ddd3a0319b..e4065adad5 100644 --- a/doc/src/fix_langevin_spin.txt +++ b/doc/src/fix_langevin_spin.txt @@ -99,4 +99,4 @@ integration fix (e.g. {fix nve/spin}). :link(Tranchida2) [(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson, -Journal of Computational Physics, (2018). +Journal of Computational Physics, 372, 406-425, (2018). diff --git a/doc/src/fix_nve_spin.txt b/doc/src/fix_nve_spin.txt index af435dc730..7b382bb6ad 100644 --- a/doc/src/fix_nve_spin.txt +++ b/doc/src/fix_nve_spin.txt @@ -73,4 +73,4 @@ instead of "array" is also valid. :link(Tranchida1) [(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson, -Journal of Computational Physics, (2018). +Journal of Computational Physics, 372, 406-425, (2018). diff --git a/doc/src/fix_setforce.txt b/doc/src/fix_setforce.txt index 4b9abba52f..63713d87c2 100644 --- a/doc/src/fix_setforce.txt +++ b/doc/src/fix_setforce.txt @@ -8,6 +8,7 @@ fix setforce command :h3 fix setforce/kk command :h3 +fix setforce/spin command :h3 [Syntax:] @@ -27,6 +28,7 @@ keyword = {region} :l fix freeze indenter setforce 0.0 0.0 0.0 fix 2 edge setforce NULL 0.0 0.0 +fix 1 edge setforce/spin 0.0 0.0 0.0 fix 2 edge setforce NULL 0.0 v_oscillate :pre [Description:] @@ -65,6 +67,19 @@ to it. :line +Style {spin} suffix sets the components of the magnetic precession +vectors instead of the mechanical forces. This also erases all +previously computed magnetic precession vectors on the atom, though +additional magnetic fixes could add new forces. + +This command can be used to freeze the magnetic moment of certain +atoms in the simulation by zeroing their precession vector. + +All options defined above remain valid, they just apply to the magnetic +precession vectors instead of the forces. + +:line + Styles with a {gpu}, {intel}, {kk}, {omp}, or {opt} suffix are functionally the same as the corresponding style without the suffix. They have been optimized to run faster, depending on your available @@ -117,7 +132,10 @@ forces to any value besides zero when performing a minimization. Use the "fix addforce"_fix_addforce.html command if you want to apply a non-zero force to atoms during a minimization. -[Restrictions:] none +[Restrictions:] + +The fix {setforce/spin} only makes sense when LAMMPS was built with the +SPIN package. [Related commands:] diff --git a/doc/src/pair_spin_dmi.txt b/doc/src/pair_spin_dmi.txt index bc67e43ecd..9ddff8a8dc 100644 --- a/doc/src/pair_spin_dmi.txt +++ b/doc/src/pair_spin_dmi.txt @@ -88,4 +88,4 @@ package"_Build_package.html doc page for more info. Physical Review B, 88(18), 184422. (2013). :link(Tranchida5) [(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson, -Journal of Computational Physics, (2018). +Journal of Computational Physics, 372, 406-425, (2018). diff --git a/doc/src/pair_spin_exchange.txt b/doc/src/pair_spin_exchange.txt index 10d65a55a1..76a6d508d2 100644 --- a/doc/src/pair_spin_exchange.txt +++ b/doc/src/pair_spin_exchange.txt @@ -95,4 +95,4 @@ package"_Build_package.html doc page for more info. :link(Tranchida3) [(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson, -Journal of Computational Physics, (2018). +Journal of Computational Physics, 372, 406-425, (2018). diff --git a/doc/src/pair_spin_magelec.txt b/doc/src/pair_spin_magelec.txt index 151ecdec3d..206da4bb51 100644 --- a/doc/src/pair_spin_magelec.txt +++ b/doc/src/pair_spin_magelec.txt @@ -70,4 +70,4 @@ package"_Build_package.html doc page for more info. :link(Tranchida4) [(Tranchida)] Tranchida, Plimpton, Thibaudeau, and Thompson, -Journal of Computational Physics, (2018). +Journal of Computational Physics, 372, 406-425, (2018). diff --git a/doc/src/pair_spin_neel.txt b/doc/src/pair_spin_neel.txt index 8e2242f013..009ef7947d 100644 --- a/doc/src/pair_spin_neel.txt +++ b/doc/src/pair_spin_neel.txt @@ -80,4 +80,4 @@ package"_Build_package.html doc page for more info. :link(Tranchida6) [(Tranchida)] Tranchida, Plimpton, Thibaudeau and Thompson, -Journal of Computational Physics, (2018). +Journal of Computational Physics, 372, 406-425, (2018). diff --git a/examples/SPIN/setforce_spin/in.spinmin.setforce b/examples/SPIN/setforce_spin/in.spinmin.setforce new file mode 100644 index 0000000000..10d4df66ed --- /dev/null +++ b/examples/SPIN/setforce_spin/in.spinmin.setforce @@ -0,0 +1,59 @@ + +units metal +dimension 3 +boundary f f f +atom_style spin + +# necessary for the serial algorithm (sametag) +atom_modify map array + +lattice sc 3.0 +region box block 0.0 10.0 0.0 10.0 0.0 1.0 +create_box 2 box +region reg1 block 0.0 10.0 0.0 5.0 0.0 1.0 +region reg2 block 0.0 10.0 6.0 10.0 0.0 1.0 +create_atoms 1 region reg1 +create_atoms 2 region reg2 + +# setting mass, mag. moments, and interactions for bcc iron + +mass 1 55.845 +mass 2 55.845 +set region reg1 spin 2.2 0.0 0.0 1.0 +set region reg2 spin/random 31 2.2 + +group fixed_spin region reg1 + +pair_style hybrid/overlay spin/exchange 3.1 spin/dmi 3.1 +pair_coeff * * spin/exchange exchange 3.1 -0.01593 0.06626915552 1.211 +pair_coeff * * spin/dmi dmi 3.1 0.12e-03 0.0 0.0 1.0 + +neighbor 0.1 bin +neigh_modify every 10 check yes delay 20 + +fix 1 all precession/spin zeeman 0.0 0.0 0.0 1.0 anisotropy 5e-05 0.0 0.0 1.0 +fix_modify 1 energy yes +fix 2 fixed_spin setforce/spin 0.0 0.0 0.0 +fix 3 all langevin/spin 0.0 0.1 21 +fix 4 all nve/spin lattice no + +timestep 0.0001 + +compute out_mag all spin +variable magx equal c_out_mag[1] +variable magy equal c_out_mag[2] +variable magz equal c_out_mag[3] +variable magnorm equal c_out_mag[4] +variable emag equal c_out_mag[5] +variable tmag equal c_out_mag[6] + +thermo 1000 +thermo_style custom step time v_magx v_magz v_magnorm v_tmag etotal +thermo_modify format float %20.15g + +compute outsp all property/atom spx spy spz sp fmx fmy fmz +dump 1 all custom 1000 dump.lammpstrj type x y z c_outsp[1] c_outsp[2] c_outsp[3] c_outsp[5] c_outsp[6] c_outsp[7] + +min_style spin +min_modify alpha_damp 1.0 discrete_factor 20.0 +minimize 1.0e-16 1.0e-16 50000 1000 diff --git a/src/SPIN/fix_nve_spin.cpp b/src/SPIN/fix_nve_spin.cpp index 14e045b20e..20e0d355b1 100644 --- a/src/SPIN/fix_nve_spin.cpp +++ b/src/SPIN/fix_nve_spin.cpp @@ -475,8 +475,6 @@ void FixNVESpin::ComputeInteractionsSpin(int i) locksetforcespin->single_setforce_spin(i,fmi); } - //printf("test after setforce: %g %g %g \n",fmi[0],fmi[1],fmi[2]); - // replace the magnetic force fm[i] by its new value fmi fm[i][0] = fmi[0]; diff --git a/src/SPIN/fix_setforce_spin.cpp b/src/SPIN/fix_setforce_spin.cpp index 0509b2ba84..72ad1ec89a 100644 --- a/src/SPIN/fix_setforce_spin.cpp +++ b/src/SPIN/fix_setforce_spin.cpp @@ -128,8 +128,6 @@ void FixSetForceSpin::single_setforce_spin(int i, double fmi[3]) int *mask = atom->mask; int nlocal = atom->nlocal; - //printf("test inside before setforce: %g %g %g \n",fmi[0],fmi[1],fmi[2]); - // update region if necessary Region *region = NULL; @@ -148,19 +146,18 @@ void FixSetForceSpin::single_setforce_spin(int i, double fmi[3]) foriginal[0] = foriginal[1] = foriginal[2] = 0.0; force_flag = 0; - + + // constant force + if (varflag == CONSTANT) { if (mask[i] & groupbit) { - //if (region && !region->match(x[i][0],x[i][1],x[i][2])) continue; - //if (region && region->match(x[i][0],x[i][1],x[i][2])){ + if (region && !region->match(x[i][0],x[i][1],x[i][2])) return; foriginal[0] += fmi[0]; foriginal[1] += fmi[1]; foriginal[2] += fmi[2]; if (xstyle) fmi[0] = xvalue; if (ystyle) fmi[1] = yvalue; if (zstyle) fmi[2] = zvalue; - //printf("test inside inter setforce: %g %g %g \n",fmi[0],fmi[1],fmi[2]); - //} } // variable force, wrap with clear/add @@ -182,21 +179,18 @@ void FixSetForceSpin::single_setforce_spin(int i, double fmi[3]) modify->addstep_compute(update->ntimestep + 1); if (mask[i] & groupbit) { - //if (region && !region->match(x[i][0],x[i][1],x[i][2])) continue; - if (region && region->match(x[i][0],x[i][1],x[i][2])) { - foriginal[0] += fmi[0]; - foriginal[1] += fmi[1]; - foriginal[2] += fmi[2]; - if (xstyle == ATOM) fmi[0] = sforce[i][0]; - else if (xstyle) fmi[0] = xvalue; - if (ystyle == ATOM) fmi[1] = sforce[i][1]; - else if (ystyle) fmi[1] = yvalue; - if (zstyle == ATOM) fmi[2] = sforce[i][2]; - else if (zstyle) fmi[2] = zvalue; - } + if (region && !region->match(x[i][0],x[i][1],x[i][2])) return; + foriginal[0] += fmi[0]; + foriginal[1] += fmi[1]; + foriginal[2] += fmi[2]; + if (xstyle == ATOM) fmi[0] = sforce[i][0]; + else if (xstyle) fmi[0] = xvalue; + if (ystyle == ATOM) fmi[1] = sforce[i][1]; + else if (ystyle) fmi[1] = yvalue; + if (zstyle == ATOM) fmi[2] = sforce[i][2]; + else if (zstyle) fmi[2] = zvalue; } } - //printf("test inside after setforce: %g %g %g \n",fmi[0],fmi[1],fmi[2]); } /* ---------------------------------------------------------------------- */