Skip to content

Commit

Permalink
Core: added dm_chirality to Isotropic Hamiltonian.
Browse files Browse the repository at this point in the history
Also added it as input parameter.
  • Loading branch information
GPMueller committed Feb 9, 2017
1 parent 59ed8f8 commit ed54e7b
Show file tree
Hide file tree
Showing 5 changed files with 46 additions and 16 deletions.
2 changes: 1 addition & 1 deletion core/include/engine/Hamiltonian_Isotropic.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ namespace Engine
// Constructor
Hamiltonian_Isotropic(std::vector<bool> boundary_conditions, scalar external_field_magnitude, Vector3 external_field_normal, scalar mu_s,
scalar anisotropy_magnitude, Vector3 anisotropy_normal,
int n_neigh_shells, std::vector<scalar> jij, scalar dij, scalar bij, scalar kijkl, scalar dd_radius, Data::Geometry geometry);
int n_neigh_shells, std::vector<scalar> jij, scalar dij, int dm_chirality, scalar bij, scalar kijkl, scalar dd_radius, Data::Geometry geometry);

void Update_Energy_Contributions() override;

Expand Down
6 changes: 3 additions & 3 deletions core/include/engine/Neighbours.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ namespace Engine
const int n_shells, std::vector<std::vector<int>> &n_spins_in_shell,
std::vector<std::vector<std::vector<int>>> & neigh,
std::vector<int> &n_4spin, int &max_n_4spin, std::vector<std::vector<std::vector<int>>> &neigh_4spin,
std::vector<vectorfield> &dm_normal,
std::vector<vectorfield> &dm_normal, int dm_chirality,
std::vector<std::vector<int>> &segments, std::vector<std::vector<Vector3>> &segments_pos);

// calculates shell radii for every shell
Expand All @@ -41,13 +41,13 @@ namespace Engine
void Create_DM_Norm_Vectors_Bulk(const int nos, const vectorfield &spin_pos, const int number_b_vectors,
const std::vector<Vector3> &boundary_vectors, const int n_shells, const std::vector<std::vector<int>> &n_spins_in_shell,
const std::vector<std::vector<std::vector<int>>> & neigh, std::vector<std::vector<std::vector<Vector3>>> & neigh_pos,
const int max_ndm, std::vector<vectorfield> &dm_normal);
const int max_ndm, std::vector<vectorfield> &dm_normal, int dm_chirality=1);

// calculates the surface DMI vectors
void Create_DM_Norm_Vectors_Surface(const int nos, const vectorfield &spin_pos, const int number_b_vectors,
const std::vector<Vector3> &boundary_vectors, const int n_shells, const std::vector<std::vector<int>> &n_spins_in_shell,
const std::vector<std::vector<std::vector<int>>> & neigh, std::vector<std::vector<std::vector<Vector3>>> & neigh_pos,
const int max_ndm, std::vector<vectorfield> &dm_normal);
const int max_ndm, std::vector<vectorfield> &dm_normal, int dm_chirality=0);

// prints DMI vectors to file
void DM_Norm_Vectors_To_File(const int nos, const int n_shells, const std::vector<std::vector<int>> &n_spins_in_shell, const std::vector<std::vector<std::vector<int>>> & neigh,
Expand Down
4 changes: 2 additions & 2 deletions core/src/engine/Hamiltonian_Isotropic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ namespace Engine
Hamiltonian_Isotropic::Hamiltonian_Isotropic(
std::vector<bool> boundary_conditions, scalar external_field_magnitude_i, Vector3 external_field_normal, scalar mu_s,
scalar anisotropy_magnitude, Vector3 anisotropy_normal,
int n_neigh_shells, std::vector<scalar> jij, scalar dij, scalar bij, scalar kijkl, scalar dd_radius,
int n_neigh_shells, std::vector<scalar> jij, scalar dij, int dm_chirality, scalar bij, scalar kijkl, scalar dd_radius,
Data::Geometry geometry) :
Hamiltonian(boundary_conditions),
mu_s(mu_s),
Expand All @@ -34,7 +34,7 @@ namespace Engine
// Calculate Neighbours
Log(Log_Level::Info, Log_Sender::All, "Building Neighbours ...");
Engine::Neighbours::Create_Neighbours(geometry, boundary_conditions, n_neigh_shells,
n_spins_in_shell, neigh, n_4spin, max_n_4spin, neigh_4spin, dm_normal, segments, segments_pos);
n_spins_in_shell, neigh, n_4spin, max_n_4spin, neigh_4spin, dm_normal, dm_chirality, segments, segments_pos);
Engine::Neighbours::Create_Dipole_Neighbours(geometry, boundary_conditions,
dd_radius, dd_neigh, dd_neigh_pos, dd_normal, dd_distance);
Log(Log_Level::Info, Log_Sender::All, "Done Caclulating Neighbours");
Expand Down
45 changes: 36 additions & 9 deletions core/src/engine/Neighbours.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ namespace Engine
const int n_shells, std::vector<std::vector<int>> &n_spins_in_shell,
std::vector<std::vector<std::vector<int>>> & neigh,
std::vector<int> &n_4spin, int &max_n_4spin, std::vector<std::vector<std::vector<int>>> &neigh_4spin,
std::vector<vectorfield> &dm_normal,
std::vector<vectorfield> &dm_normal, int dm_chirality,
std::vector<std::vector<int>> &segments, std::vector<std::vector<Vector3>> &segments_pos)
{
//========================= Init local vars ================================
Expand Down Expand Up @@ -124,7 +124,7 @@ namespace Engine
max_ndm = max_number_n_in_shell[0];
// Calculate DM normal vectors
dm_normal = std::vector<vectorfield>(nos, vectorfield(max_ndm));
Create_DM_Norm_Vectors_Bulk(nos, geometry.spin_pos, n_boundary_vectors, boundary_vectors, n_shells, n_spins_in_shell, neigh, neigh_pos, max_ndm, dm_normal);
Create_DM_Norm_Vectors_Bulk(nos, geometry.spin_pos, n_boundary_vectors, boundary_vectors, n_shells, n_spins_in_shell, neigh, neigh_pos, max_ndm, dm_normal, dm_chirality);
//DM_Norm_Vectors_To_File(nos, n_shells, n_spins_in_shell, neigh, dm_normal);

Log(Log_Level::Info, Log_Sender::All, "Done creating Neighbours");
Expand Down Expand Up @@ -448,7 +448,7 @@ namespace Engine
void Neighbours::Create_DM_Norm_Vectors_Bulk(const int nos, const vectorfield &spin_pos, const int number_b_vectors,
const std::vector<Vector3> &boundary_vectors, const int n_shells, const std::vector<std::vector<int>> &n_spins_in_shell,
const std::vector<std::vector<std::vector<int>>> & neigh, std::vector<std::vector<std::vector<Vector3>>> & neigh_pos,
const int max_ndm, std::vector<vectorfield> &dm_normal)
const int max_ndm, std::vector<vectorfield> &dm_normal, int chirality)
{
//========================= Init local vars ================================
int ispin, jspin, jneigh;
Expand All @@ -468,8 +468,24 @@ namespace Engine
{ // loop over all neighbours of that spin
jspin = neigh[ispin][0][jneigh];
jspin_pos = neigh_pos[ispin][0][jneigh];
//r_a = ispin_pos - jspin_pos; //get DMI vec with chirality "-"
r_a = jspin_pos - ispin_pos; // get DMI vec with chirality "+"
if (chirality == -1)
{
r_a = ispin_pos - jspin_pos; //get DMI vec with chirality "-"
}
else if (chirality == 2)
{
// This should only be used in 2D case, not in bulk
r_a = (jspin_pos - ispin_pos).cross(Vector3{ 0,0,1 });
}
else if (chirality == -2)
{
// This should only be used in 2D case, not in bulk
r_a = (ispin_pos - jspin_pos).cross(Vector3{ 0,0,1 });
}
else
{
r_a = jspin_pos - ispin_pos; // get DMI vec with chirality "+"
}
r_a.normalize();
dm_normal[ispin][jneigh] = r_a;
}//endfor jneigh
Expand All @@ -480,7 +496,7 @@ namespace Engine
void Neighbours::Create_DM_Norm_Vectors_Surface(const int nos, const vectorfield &spin_pos, const int number_b_vectors,
const std::vector<Vector3> &boundary_vectors, const int n_shells, const std::vector<std::vector<int>> &n_spins_in_shell,
const std::vector<std::vector<std::vector<int>>> & neigh, std::vector<std::vector<std::vector<Vector3>>> & neigh_pos,
const int max_ndm, std::vector<vectorfield> &dm_normal)
const int max_ndm, std::vector<vectorfield> &dm_normal, int chirality)
{
//========================= Init local vars ================================
int ispin, jneigh;
Expand All @@ -494,9 +510,20 @@ namespace Engine
{
for (jneigh = 0; jneigh < max_ndm; ++jneigh)
{
build_array_1 = dm_normal[ispin][jneigh];
build_array_2 = build_array_1.cross(unit_vec_z);
dm_normal[ispin][jneigh] = build_array_2;
if (chirality == 2)
{
// This should only be used in 2D case, not in bulk
dm_normal[ispin][jneigh] = dm_normal[ispin][jneigh].cross(Vector3{ 0,0,1 });
}
else if (chirality == -2)
{
// This should only be used in 2D case, not in bulk
dm_normal[ispin][jneigh] = -dm_normal[ispin][jneigh].cross(Vector3{ 0,0,1 });
}
else if (chirality == -1)
{
dm_normal[ispin][jneigh] *= -1;
}
}
}
Log(Log_Level::Debug, Log_Sender::All, "Done calculating Surface DMI norm vectors.");
Expand Down
5 changes: 4 additions & 1 deletion core/src/utility/IO_Configparser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -567,6 +567,7 @@ namespace Utility
std::vector<scalar> jij = { 10.0, 0.0, 0.0, 0.0 };
// DM constant
scalar dij = 6.0;
int dm_chirality = 1;
// Biquidratic exchange constant
scalar bij = 0.0;
// 4 Spin Interaction constant
Expand Down Expand Up @@ -605,6 +606,7 @@ namespace Utility
else Log(Log_Level::Error, Log_Sender::IO, "Hamiltonian_Isotropic: Keyword 'jij' not found. Using Default: { 10.0, 0.5, 0.0, 0.0 }");

myfile.Read_Single(dij, "dij");
myfile.Read_Single(dm_chirality, "dm_chirality");
myfile.Read_Single(bij, "bij");
myfile.Read_Single(kijkl, "kijkl");
myfile.Read_Single(dd_radius, "dd_radius");
Expand All @@ -630,12 +632,13 @@ namespace Utility
Log(Log_Level::Parameter, Log_Sender::IO, " n_neigh_shells = " + std::to_string(n_neigh_shells));
Log(Log_Level::Parameter, Log_Sender::IO, " J_ij[0] = " + std::to_string(jij[0]));
Log(Log_Level::Parameter, Log_Sender::IO, " D_ij = " + std::to_string(dij));
Log(Log_Level::Parameter, Log_Sender::IO, " DM chirality = " + std::to_string(dm_chirality));
Log(Log_Level::Parameter, Log_Sender::IO, " B_ij = " + std::to_string(bij));
Log(Log_Level::Parameter, Log_Sender::IO, " K_ijkl = " + std::to_string(kijkl));
Log(Log_Level::Parameter, Log_Sender::IO, " dd_radius = " + std::to_string(dd_radius));
auto hamiltonian = std::unique_ptr<Engine::Hamiltonian_Isotropic>(new Engine::Hamiltonian_Isotropic(boundary_conditions, external_field_magnitude,
external_field_normal, mu_s, anisotropy_magnitude, anisotropy_normal,
n_neigh_shells, jij, dij, bij, kijkl, dd_radius, geometry));
n_neigh_shells, jij, dij, dm_chirality, bij, kijkl, dd_radius, geometry));
Log(Log_Level::Info, Log_Sender::IO, "Hamiltonian_Isotropic: built");
return hamiltonian;
}// end Hamiltonian_Isotropic_from_Config
Expand Down

0 comments on commit ed54e7b

Please sign in to comment.