@@ -94,3 +94,38 @@ def compute_energy(self):
9494 self .energy /= self .scale
9595
9696 return energy / self .scale
97+
98+
99+ class DemagFMM (Energy ):
100+ def __init__ (self , order , ncrit , theta , name = "DemagFMM" , type = 'fmm' ):
101+ self .type = type
102+ if self .type == 'fmm' :
103+ self ._type = 0
104+ elif self .type == 'bh' :
105+ self ._type = 1
106+
107+ self .name = name
108+ assert order > 0 , "Order must be 1 or higher"
109+ assert order < 11 , "Order bust be < 11"
110+ self .order = order
111+ assert ncrit >= 2 , "ncrit must be greater than 1."
112+ self .ncrit = ncrit
113+ assert theta >= 0.0 , "theta must be >= 0.0"
114+ self .theta = theta
115+
116+ def setup (self , mesh , spin , mu_s , mu_s_inv ):
117+ super (DemagFMM , self ).setup (mesh , spin , mu_s , mu_s_inv )
118+ self .coords = mesh .coordinates * mesh .unit_length
119+ self .m_temp = np .zeros_like (spin )
120+ self .fmm = fmm .FMM (self .n , self .ncrit , self .theta ,
121+ self .order ,
122+ self .coords ,
123+ self .m_temp ,
124+ self .mu_s , self ._type
125+ )
126+
127+ def compute_field (self , t = 0 , spin = None ):
128+ self .m_temp [:] = spin if spin is not None else self .spin
129+ self .fmm .compute_field (self .field )
130+ self .field *= - 1e-7
131+ return self .field
0 commit comments