C++ mpi module for stochmagnet_main Package
SM_DipolarField.h
1 #ifndef SM_DipolarField_H
2 #define SM_DipolarField_H
3 
4 //base classes
5 #include "SM_Object.h"
6 
7 
15 class SM_DipolarField : public virtual SM_Object {
16 
17 
18 public:
19 private :
20  typedef SM_DipolarField SelfClass;
21  typedef SM_Object SuperClass;
22  //multiple associations
23  //---------------------
24 
25 
26 
27 protected:
28  // CONSTRUCTORS
32  }
33 
34  // DESTRUCTORS
37  virtual ~SM_DipolarField(void) {
38  }
39 
40 public:
41 
45  inline static CORE_UniquePointer<SelfClass> New() {
46  return CORE_UniquePointer<SelfClass>(new SelfClass(),
48  }
49 
60  inline static void ComputeUnscaledSpinDipolarField(const tReal *Xi,
61  const tReal* sXj,const tReal *eXj,
62  const tReal *sSj,
63  std::array<tReal,SM_Constants::DIM>& Hi,
64  std::array<tReal,SM_Constants::DIM>& U) {
65 
66  //iteratoron coordinate at particle i
67  const tReal *iXi=null;
68 
69 
70  //iterator on U which is the normalize direction U=Xj-Xi
71  tReal *iU=U.data();
72  const tReal *eU=iU;eU+=SM_Constants::DIM;
73 
74  tReal rij,rij3;//distance between particle i & j
75 
76 
77  //scalar product
78  tReal sUSj;//<U,Sj>
79 
80  //iterators on coordinates of points j
81  const tReal *iXj=sXj;
82 
83  //iterators on dierction of spin of points j
84  const tReal *iSj=sSj;
85  const tReal *iSjk=null;
86 
87  //iterator on Hi
88  tReal *iHi=Hi.data();
89 
90  //Hi=0
91  functions_array::reset(Hi);
92 
93  while (iXj!=eXj) {//loop on particle j
94 
95  if (iXj!=Xi) {//particles j must be different from particle i
96 
97  //|Xj-Xi|^3
98  rij=0;
99 
100  //iterator on X at particle i
101  iXi=Xi;
102  //iterator on U=Xj-Xi
103  iU=U.data();
104  while (iU!=eU) {
105 
106  //U=Xj-Xi
107  (*iU)=(*iXj)-(*iXi);
108 
109  //rij=|Xj-Xi|^2
110  rij+=(*iU)*(*iU);
111 
112  //iterators at next coordinate
113  iU++;
114  iXj++;
115  iXi++;
116 
117  }
118  //|X_i-X_j|^2
119  rij3=rij;
120 
121  //|X_i-X_j|
122  rij=sqrt(rij);
123 
124 
125  //|X_i-X_j|^3
126  rij3*=rij;
127 
128  //Computes:
129  //U=U/|U|
130 
131  //sUSj=<U,Sj>
132  sUSj=0;
133 
134 
135  //iterator on Pj-Pi
136  iU=U.data();
137 
138  //iterator on Sj
139  iSjk=iSj;
140  while (iU!=eU) {//loop on coordinate
141 
142  //er=Xj-Xi/|Xj-Xi|
143  (*iU)/=rij;
144 
145 
146  //<U,Sj>
147  sUSj+=(*iSjk)*(*iU);
148 
149  //iterator on next coordinate
150  iU++;
151  iSjk++;
152 
153  }
154 
155  //iterator on U=Pj-Pi/|Pj-Pi|
156  iU=U.data();
157  //iterator on H at point i
158  iHi=Hi.data();
159 
160  while (iU!=eU) {//loop on coordinate
161 
162  //Hi[d]=\sum_j (3 <U,Sj>U-Sj)/r^3
163  (*iHi)+=(3*sUSj*(*iU)-(*iSj))/rij3;
164 
165 
166  //iterator at next coordinates
167  iHi++;
168  iSj++;
169  iU++;
170  }
171 
172 
173  }//end condition Xi!=Xj
174  else {
175  //next particle j
176  iXj+=SM_Constants::DIM;
177  iSj+=SM_Constants::DIM;
178  }
179  }//end loop on particle j
180 
181 
182  }
194  const tReal* sYj,const tReal *eYj,
195  const tReal *sSj,
196  std::array<tReal,SM_Constants::DIM>& Hi,
197  std::array<tReal,SM_Constants::DIM>& U) {
198  //zero
199  tReal eps=1.e-9;
200 
201  //iteratoron coordinate at particle i
202  const tReal *iXi=null;
203 
204 
205  //iterator on U which is the normalize direction U=Xj-Xi
206  tReal *iU=U.data();
207  const tReal *eU=iU;eU+=SM_Constants::DIM;
208 
209  tReal rij,rij3;//distance between particle i & j
210 
211 
212  //scalar product
213  tReal sUSj;//<U,Sj>
214 
215  //iterators on coordinates of points j
216  const tReal *iYj=sYj;
217 
218  //iterators on dierction of spin of points j
219  const tReal *iSj=sSj;
220  const tReal *iSjk=null;
221 
222  //iterator on Hi
223  tReal *iHi=Hi.data();
224 
225  //Hi=0
226  memset(iHi,0,sizeof(tReal)*SM_Constants::DIM);
227 
228  while (iYj!=eYj) {//loop on particle j
229 
230 
231 
232  //|Xj-Xi|^3
233  rij=0;
234 
235  //iterator on X at particle i
236  iXi=Xi;
237 
238  //iterator on U=Xj-Xi
239  iU=U.data();
240  while (iU!=eU) {
241 
242  //U=Yj-Xi
243  (*iU)=(*iYj)-(*iXi);
244 
245  //rij=|Xj-Xi|^2
246  rij+=(*iU)*(*iU);
247 
248  //iterators at next coordinate
249  iU++;
250  iYj++;
251  iXi++;
252 
253  }
254  //|Y_j-X_i|^2
255  rij3=rij;
256 
257  //|Y_j-X_i|
258  rij=sqrt(rij);
259 
260  //std::cout<<"Xi="<<functions_array::toString(3,Xi)<<" Yj="<<functions_array::toString(3,iYj-3)<<" rij="<<rij<<"\n";
261  if (rij>eps) {
262 
263  //|Y_j-X_i|^3
264  rij3*=rij;
265 
266  //Computes:
267  //U=U/|U|
268 
269  //sUSj=<U,Sj>
270  sUSj=0;
271 
272 
273  //iterator on Yj-Xi
274  iU=U.data();
275 
276  //iterator on Sj
277  iSjk=iSj;
278  while (iU!=eU) {//loop on coordinate
279 
280  //Yj-Xi/|Yj-Xi|
281  (*iU)/=rij;
282 
283 
284  //<U,Sj>
285  sUSj+=(*iSjk)*(*iU);
286 
287  //iterator on next coordinate
288  iU++;
289  iSjk++;
290 
291  }
292 
293  //iterator on U=Yj-Xi/|Yj-Xi|
294  iU=U.data();
295  //iterator on H at point i
296  iHi=Hi.data();
297 
298  while (iU!=eU) {//loop on coordinate
299 
300  //Hi[d]=\sum_j (3 <U,Sj>U-Sj)/r^3
301  (*iHi)+=(3*sUSj*(*iU)-(*iSj))/rij3;
302 
303 
304  //iterator at next coordinates
305  iHi++;
306  iSj++;
307  iU++;
308  }
309 
310 
311  }//end condition rij>0
312  else {
313  //next particle j
314  iSj+=SM_Constants::DIM;
315  }
316  }//end loop on particle j
317 
318 
319  }
320 
321 
332  inline static void ComputeSeparatedUnscaledSpinDipolarField(const tReal *Xi,
333  const tReal* sXj,const tReal *eXj,
334  const tReal *sSj,
335  std::array<tReal,SM_Constants::DIM>& Hi,
336  std::array<tReal,SM_Constants::DIM>& U) {
337 
338  //iteratoron coordinate at particle i
339  const tReal *iXi=null;
340 
341 
342  //iterator on U which is the normalize direction U=Xj-Xi
343  tReal *iU=U.data();
344  const tReal *eU=iU;eU+=SM_Constants::DIM;
345 
346  tReal rij,rij3;//distance between particle i & j
347 
348 
349  //scalar product
350  tReal sUSj;//<U,Sj>
351 
352  //iterators on coordinates of points j
353  const tReal *iXj=sXj;
354 
355  //iterators on dierction of spin of points j
356  const tReal *iSj=sSj;
357  const tReal *iSjk=null;
358 
359  //iterator on Hi
360  tReal *iHi=Hi.data();
361 
362  //Hi=0
363  memset(iHi,0,sizeof(tReal)*SM_Constants::DIM);
364 
365  while (iXj!=eXj) {//loop on particle j
366 
367 
368 
369  //|Xj-Xi|^3
370  rij=0;
371 
372  //iterator on X at particle i
373  iXi=Xi;
374  //iterator on U=Xj-Xi
375  iU=U.data();
376  while (iU!=eU) {
377 
378  //U=Xj-Xi
379  (*iU)=(*iXj)-(*iXi);
380 
381  //rij=|Xj-Xi|^2
382  rij+=(*iU)*(*iU);
383 
384  //iterators at next coordinate
385  iU++;
386  iXj++;
387  iXi++;
388 
389  }//end loop on U coordinates
390 
391  //|X_i-X_j|^2
392  rij3=rij;
393 
394  //|X_i-X_j|
395  rij=sqrt(rij);
396 
397 
398  //|X_i-X_j|^3
399  rij3*=rij;
400 
401  //Computes:
402  //U=U/|U|
403 
404  //sUSj=<U,Sj>
405  sUSj=0;
406 
407 
408  //iterator on Pj-Pi
409  iU=U.data();
410 
411  //iterator on Sj
412  iSjk=iSj;
413  while (iU!=eU) {//loop on U coordinate
414 
415  //Xj-Xi/|Xj-Xi|
416  (*iU)/=rij;
417 
418 
419  //<U,Sj>
420  sUSj+=(*iSjk)*(*iU);
421 
422  //iterator on next coordinate
423  iU++;
424  iSjk++;
425 
426  }//end llo on U coordinate
427 
428  //iterator on U=Pj-Pi/|Pj-Pi|
429  iU=U.data();
430  //iterator on H at point i
431  iHi=Hi.data();
432  while (iU!=eU) {//loop on U coordinate
433 
434  //Hi[d]=\sum_j (3 <U,Sj>U-Sj)/r^3
435  (*iHi)+=(3*sUSj*(*iU)-(*iSj))/rij3;
436 
437 
438  //iterator at next coordinates
439  iHi++;
440  iSj++;
441  iU++;
442  }//end loop on U coordinate
443 
444 
445  }//end loop on particle j
446  }
447 
448 
449 
459  inline static void ComputeUnscaledSpinEnergy(const tReal *Xi,const tReal *Si,
460  const tReal* iXj,const tReal* eXj,const tReal* iSj,
461  tReal& Ei) {
462 
463 
464  //iteratoron coordinate at particle i
465  const tReal *iXi=null;
466 
467  //iterator on Si
468  const tReal *iSi=null;
469 
470 
471 
472  //iterator on U which is the normalize direction U=Xj-Xi
473  std::array<tReal,SM_Constants::DIM> U;
474  tReal *iU=U.data();
475  const tReal *eU=iU;eU+=SM_Constants::DIM;
476 
477  tReal rij,rij3;//distance between particle i & j
478 
479 
480  //scalar product
481  tReal sUSj;//<U,Sj>
482  tReal sUSi;//<U,Si>
483  tReal sSiSj;//<U,Si>
484 
485  Ei=0;
486 
487 
488  while (iXj!=eXj) {//loop on particle j
489 
490  if (iXj!=Xi) {//particles j must be different from particle i
491 
492  //|Pj-Pi|^3
493  rij=0;
494 
495  //iterator on X at particle i
496  iXi=Xi;
497  //iterator on U=Xj-Xi
498  iU=U.data();
499  while (iU!=eU) {
500 
501  //U=Xj-Xi
502  (*iU)=(*iXj)-(*iXi);
503 
504  //rij=|Xj-Xi|^2
505  rij+=(*iU)*(*iU);
506 
507  //iterators at next coordinate
508  iU++;
509  iXj++;
510  iXi++;
511 
512  }
513  //|X_i-X_j|^2
514  rij3=rij;
515 
516  //|X_i-X_j|
517  rij=sqrt(rij);
518 
519  //|X_i-X_j|^3
520  rij3*=rij;
521 
522  //Computes:
523  //U=U/|U|
524 
525  //sUSj=<U,Sj>
526  sUSj=0;
527 
528  //sUSi=<U,Si>
529  sUSi=0;
530 
531  //sUSi=<Si,Sj>
532  sSiSj=0;
533 
534  //iterator on Pj-Pi
535  iU=U.data();
536 
537  //iterator on Si
538  iSi=Si;
539  while (iU!=eU) {//loop on coordinate
540 
541  //Xj-Xi/|Xj-Xi|
542  (*iU)/=rij;
543 
544 
545  //<U,Sj>
546  sUSj+=(*iSj)*(*iU);
547 
548  //<U,Si>
549  sUSi+=(*iSi)*(*iU);
550 
551  //<Si,Sj>
552  sSiSj+=(*iSi)*(*iSj);
553 
554  //iterator on next coordinate
555  iU++;
556  iSj++;
557  iSi++;
558 
559  }
560 
561 
562  Ei+=(sSiSj-3*sUSi*sUSj)/rij3;
563 
564  }//end condition Xi!=Xj
565  else {
566  //next particle j
567  iXj+=SM_Constants::DIM;
568  iSj+=SM_Constants::DIM;
569  }
570  }//end loop on particle j
571 
572 
573  }
583  inline static void ComputeSeparatedUnscaledSpinEnergy(const tReal *Xi,const tReal *Si,
584  const tReal* iXj,const tReal* eXj,const tReal* iSj,
585  tReal& Ei) {
586 
587 
588  //iteratoron coordinate at particle i
589  const tReal *iXi=null;
590 
591  //iterator on Si
592  const tReal *iSi=null;
593 
594 
595 
596  //iterator on U which is the normalize direction U=Xj-Xi
597  std::array<tReal,SM_Constants::DIM> U;
598  tReal *iU=U.data();
599  const tReal *eU=iU;eU+=SM_Constants::DIM;
600 
601  tReal rij,rij3;//distance between particle i & j
602 
603 
604  //scalar product
605  tReal sUSj;//<U,Sj>
606  tReal sUSi;//<U,Si>
607  tReal sSiSj;//<U,Si>
608 
609  Ei=0;
610 
611 
612  while (iXj!=eXj) {//loop on particle j
613 
614 
615  //|Pj-Pi|^3
616  rij=0;
617 
618  //iterator on X at particle i
619  iXi=Xi;
620  //iterator on U=Xj-Xi
621  iU=U.data();
622  while (iU!=eU) {
623 
624  //U=Xj-Xi
625  (*iU)=(*iXj)-(*iXi);
626 
627  //rij=|Xj-Xi|^2
628  rij+=(*iU)*(*iU);
629 
630  //iterators at next coordinate
631  iU++;
632  iXj++;
633  iXi++;
634 
635  }
636  //|X_i-X_j|^2
637  rij3=rij;
638 
639  //|X_i-X_j|
640  rij=sqrt(rij);
641 
642  //|X_i-X_j|^3
643  rij3*=rij;
644 
645  //Computes:
646  //U=U/|U|
647 
648  //sUSj=<U,Sj>
649  sUSj=0;
650 
651  //sUSi=<U,Si>
652  sUSi=0;
653 
654  //sUSi=<Si,Sj>
655  sSiSj=0;
656 
657  //iterator on Pj-Pi
658  iU=U.data();
659 
660  //iterator on Si
661  iSi=Si;
662  while (iU!=eU) {//loop on coordinate
663 
664  //Xj-Xi/|Xj-Xi|
665  (*iU)/=rij;
666 
667 
668  //<U,Sj>
669  sUSj+=(*iSj)*(*iU);
670 
671  //<U,Si>
672  sUSi+=(*iSi)*(*iU);
673 
674  //<Si,Sj>
675  sSiSj+=(*iSi)*(*iSj);
676 
677  //iterator on next coordinate
678  iU++;
679  iSj++;
680  iSi++;
681 
682  }
683 
684 
685  Ei+=(sSiSj-3*sUSi*sUSj)/rij3;
686 
687 
688  }//end loop on particle j
689 
690 
691  }
692 
703  inline static void ComputeSeparatedUnscaledSpinEnergy(const tReal* iXi,const tReal *eXi,const tReal *iSi,
704  const tReal* iXj,const tReal* eXj,const tReal* iSj,
705  tReal& E) {
706 
707 
708 
709 
710 
711  E=0;
712  tReal Ei=0;
713  while (iXi!=eXi) {//loop on particles i
714 
715  //compute the spin energy of the spin i
716  Ei=0;
717  ComputeSeparatedUnscaledSpinEnergy(iXi,iSi,iXj,eXj,iSj,Ei);
718 
719  E+=Ei;
720  //next spin
721  iXi+=SM_Constants::DIM;
722  iSi+=SM_Constants::DIM;
723  }
724 
725 
726 
727  }
728 
739  inline static void ComputeUnscaledSpinEnergy(const tReal* iXi,const tReal *eXi,const tReal *iSi,
740  const tReal* iXj,const tReal* eXj,const tReal* iSj,
741  tReal& E) {
742 
743 
744 
745 
746 
747  E=0;
748  tReal Ei=0;
749  while (iXi!=eXi) {//loop on particles i
750 
751  //compute the spin energy of the spin i
752  Ei=0;
753  ComputeUnscaledSpinEnergy(iXi,iSi,iXj,eXj,iSj,Ei);
754 
755  E+=Ei;
756  //next spin
757  iXi+=SM_Constants::DIM;
758  iSi+=SM_Constants::DIM;
759  }
760 
761 
762 
763  }
764 
765 
766 };
767 
768 
769 #endif
class Free introduced for deleting a smart pointer
Definition: CORE_Object.h:113
static constexpr tDimension DIM
space dimension
Definition: SM_Constants.h:80
Definition: SM_DipolarField.h:15
SM_DipolarField(void)
create a network class
Definition: SM_DipolarField.h:31
static void ComputeSeparatedUnscaledSpinDipolarField(const tReal *Xi, const tReal *sXj, const tReal *eXj, const tReal *sSj, std::array< tReal, SM_Constants::DIM > &Hi, std::array< tReal, SM_Constants::DIM > &U)
compute the dipolar spin dipolar field at point X for separated domain
Definition: SM_DipolarField.h:332
static void ComputeSeparatedUnscaledSpinEnergy(const tReal *iXi, const tReal *eXi, const tReal *iSi, const tReal *iXj, const tReal *eXj, const tReal *iSj, tReal &E)
compute the dipolar field energy
Definition: SM_DipolarField.h:703
static void ComputeSeparatedUnscaledSpinEnergy(const tReal *Xi, const tReal *Si, const tReal *iXj, const tReal *eXj, const tReal *iSj, tReal &Ei)
compute the dipolar field unscaled energy in sperated domain
Definition: SM_DipolarField.h:583
virtual ~SM_DipolarField(void)
destroy
Definition: SM_DipolarField.h:37
static void ComputeUnscaledSpinDipolarFieldInSeparatedNetworkStorage(const tReal *Xi, const tReal *sYj, const tReal *eYj, const tReal *sSj, std::array< tReal, SM_Constants::DIM > &Hi, std::array< tReal, SM_Constants::DIM > &U)
compute the dipolar sping dipolar fiel at point X
Definition: SM_DipolarField.h:193
static void ComputeUnscaledSpinEnergy(const tReal *iXi, const tReal *eXi, const tReal *iSi, const tReal *iXj, const tReal *eXj, const tReal *iSj, tReal &E)
compute the dipolar field energy
Definition: SM_DipolarField.h:739
static void ComputeUnscaledSpinDipolarField(const tReal *Xi, const tReal *sXj, const tReal *eXj, const tReal *sSj, std::array< tReal, SM_Constants::DIM > &Hi, std::array< tReal, SM_Constants::DIM > &U)
compute the dipolar sping dipolar fiel at point X
Definition: SM_DipolarField.h:60
static CORE_UniquePointer< SelfClass > New()
build a new unique instance of the class thos
Definition: SM_DipolarField.h:45
static void ComputeUnscaledSpinEnergy(const tReal *Xi, const tReal *Si, const tReal *iXj, const tReal *eXj, const tReal *iSj, tReal &Ei)
compute the dipolar field energy
Definition: SM_DipolarField.h:459
This class is a base class for Stoch Microm package.
Definition: SM_Object.h:36