From aa2aa4b6ef05fd69cb52c4ba450d03c7758b608a Mon Sep 17 00:00:00 2001 From: davidcortesortuno Date: Wed, 12 Jun 2019 20:03:11 +0100 Subject: [PATCH] Implemented compute eff field in sim class. Simplified interactions array. Fixed circular dependency in sim and energy class headers --- fidimag/common/c_clib.pyx | 8 ++------ native/include/c_energy.h | 4 ++-- native/include/c_micro_sim.h | 25 ++++++++++++++++--------- native/src/c_micro_sim.cpp | 20 +++++++++++++++----- native/src/m_dmi.cpp | 1 + 5 files changed, 36 insertions(+), 22 deletions(-) diff --git a/fidimag/common/c_clib.pyx b/fidimag/common/c_clib.pyx index 2efc6757..1b4dacfb 100644 --- a/fidimag/common/c_clib.pyx +++ b/fidimag/common/c_clib.pyx @@ -307,8 +307,7 @@ cdef class PyEnergy: return self.thisptr.compute_energy() def add_interaction_to_sim(self, PyMicroSim sim): - sim.thisptr.add_interaction( self.thisptr, - self.thisptr.interaction_id) + sim.thisptr.add_interaction( self.thisptr) def get_interaction_id(self): return self._thisptr.interaction_id @@ -375,8 +374,7 @@ cdef extern from "c_micro_sim.h": double *energy, double *field, int *pins ) - void add_interaction(void * interaction, int int_id) - void print_interactions_id() + void add_interaction(Energy * interaction) cdef class PyMicroSim(object): @@ -406,5 +404,3 @@ cdef class PyMicroSim(object): def add_interaction(self, Interaction): Interaction.add_interaction_to_sim(self) - self.thisptr.print_interactions_id() - diff --git a/native/include/c_energy.h b/native/include/c_energy.h index 61af82f4..474ca676 100644 --- a/native/include/c_energy.h +++ b/native/include/c_energy.h @@ -46,7 +46,7 @@ class AnisotropyEnergy : public Energy { public: AnisotropyEnergy() { std::cout << "Instatiating AnisotropyEnergy class; at " << this << "\n"; - this->interaction_id = 1; + this->interaction_id = UNIAXIAL_ANISOTROPY; }; ~AnisotropyEnergy() {std::cout << "Killing Anisotropy\n";}; double *Ku; @@ -64,7 +64,7 @@ class DMIEnergy : public Energy { public: DMIEnergy() { std::cout << "Instatiating DMIEnergy class; at " << this << "\n"; - this->interaction_id = 1; + this->interaction_id = DMI; }; ~DMIEnergy() {std::cout << "Killing DMI\n";}; double *D; diff --git a/native/include/c_micro_sim.h b/native/include/c_micro_sim.h index 06e49def..44fbb1d1 100644 --- a/native/include/c_micro_sim.h +++ b/native/include/c_micro_sim.h @@ -2,8 +2,10 @@ #include #include #include +#include // #define MAX_ENERGY_TERMS 20 +class Energy; // forward declaration; Energy is defined in c_energy.h class MicroSim { public: MicroSim() {std::cout << "Instatiating MicroSim class; at " << this << "\n";}; @@ -28,22 +30,27 @@ class MicroSim { // Array with interactions // void * interactions; // int interactions_id[MAX_ENERGY_TERMS]; - std::vector interactions; - std::vector interactions_id; + // Should we use a vector of weak_ptr? : std::vector> interactions; + std::vector interactions; + + // Not necessary at least we re creating an array of void pointers: + // std::vector interactions_id; // Methods void setup(int nx, int ny, int nz, double dx, double dy, double dz, - double unit_length, double *coordinates, int *ngbs, - double *spin, double *Ms, double *Ms_inv, + double unit_length, double *coordinates, int *ngbs, + double *spin, double *Ms, double *Ms_inv, double *energy, double *field, int *pins ); - void add_interaction(void * interaction, int int_id); + void add_interaction(Energy * interaction); + + // void print_interactions_id() { + // for(int i : interactions_id) std::cout << i << "\n"; + // for(auto i : interactions) std::cout << i << "\n"; + // } - void print_interactions_id() { - for(int i : interactions_id) std::cout << i << "\n"; - for(auto i : interactions) std::cout << i << "\n"; - } + void compute_effective_field(double t); }; enum EnergyTermIDs { diff --git a/native/src/c_micro_sim.cpp b/native/src/c_micro_sim.cpp index 65b93f29..37da3a33 100644 --- a/native/src/c_micro_sim.cpp +++ b/native/src/c_micro_sim.cpp @@ -1,10 +1,11 @@ +#include "c_energy.h" #include "c_micro_sim.h" #include "c_constants.h" void MicroSim::setup(int nx, int ny, int nz, double dx, double dy, double dz, - double unit_length, double *coordinates, int *ngbs, - double *spin, double *Ms, double *Ms_inv, + double unit_length, double *coordinates, int *ngbs, + double *spin, double *Ms, double *Ms_inv, double *energy, double *field, int *pins ) { @@ -29,9 +30,18 @@ void MicroSim::setup(int nx, int ny, int nz, double dx, double dy, double dz, set_up = true; } -void MicroSim::add_interaction(void * interaction_ptr, int int_id) { - +void MicroSim::add_interaction(Energy * interaction_ptr) { + interactions.push_back(interaction_ptr); - interactions_id.push_back(int_id); + // interactions_id.push_back(int_id); + +} + +void MicroSim::compute_effective_field(double t) { + // Using indices + std::vector::iterator it; + for(it = interactions.begin(); it != interactions.end(); it++) { + (*it)->compute_field(t); + } } diff --git a/native/src/m_dmi.cpp b/native/src/m_dmi.cpp index 433f7c17..ec0dd209 100644 --- a/native/src/m_dmi.cpp +++ b/native/src/m_dmi.cpp @@ -373,6 +373,7 @@ void dmi_field(double * m, double * field, void DMIEnergy::compute_field(double t) { + // Should use: std::unique_ptr dxs ?? /* These are for the DMI prefactor or coefficient */ double dxs[6] = {dx, dx, dy, dy, dz, dz};