@@ -477,273 +477,6 @@ struct DTD_BConds<T, 3, SUPERCELL_WIRE>
477477 }
478478};
479479
480- /* * specialization for a periodic 3D general cell
481- *
482- * Slow method and not used unless one needs to check if faster methods fail
483- */
484- template <class T >
485- struct DTD_BConds <T, 3 , PPPX >
486- {
487- T r00, r10, r20, r01, r11, r21, r02, r12, r22;
488- T g00, g10, g20, g01, g11, g21, g02, g12, g22;
489- T r2max;
490- std::vector<TinyVector<T, 3 >> nextcells;
491-
492- DTD_BConds (const CrystalLattice<T, 3 >& lat)
493- : r00(lat.R(0 )),
494- r10 (lat.R(3 )),
495- r20(lat.R(6 )),
496- r01(lat.R(1 )),
497- r11(lat.R(4 )),
498- r21(lat.R(7 )),
499- r02(lat.R(2 )),
500- r12(lat.R(5 )),
501- r22(lat.R(8 )),
502- g00(lat.G(0 )),
503- g10(lat.G(3 )),
504- g20(lat.G(6 )),
505- g01(lat.G(1 )),
506- g11(lat.G(4 )),
507- g21(lat.G(7 )),
508- g02(lat.G(2 )),
509- g12(lat.G(5 )),
510- g22(lat.G(8 )),
511- r2max(lat.CellRadiusSq)
512- {
513- nextcells.resize (26 );
514- int ic = 0 ;
515- for (int i = -1 ; i <= 1 ; ++i)
516- for (int j = -1 ; j <= 1 ; ++j)
517- for (int k = -1 ; k <= 1 ; ++k)
518- {
519- if (!(i || j || k))
520- continue ; // exclude zero
521- nextcells[ic][0 ] = i * r00 + j * r10 + k * r20;
522- nextcells[ic][1 ] = i * r01 + j * r11 + k * r21;
523- nextcells[ic][2 ] = i * r02 + j * r12 + k * r22;
524- ++ic;
525- }
526- }
527-
528- /* * evaluate the minimum distance
529- * @param lat lattice
530- * @param a displacement vector [-0.5,0.5)x[-0.5,0.5)x[-0.5,0.5)
531- * @param r2max square of the maximum cutoff
532- * @return square of the minimum-image distance
533- *
534- * Search the ghost cells to match Wigner-Seitz cell
535- */
536- inline T get_min_distance (TinyVector<T, 3 >& a) const
537- {
538- T d2 = a[0 ] * a[0 ] + a[1 ] * a[1 ] + a[2 ] * a[2 ];
539- if (d2 < r2max)
540- return d2;
541- else
542- {
543- T d2min = d2;
544- int ic = -1 ;
545- for (int i = 0 ; i < nextcells.size (); ++i)
546- {
547- TinyVector<T, 3 > c (a + nextcells[i]);
548- d2 = c[0 ] * c[0 ] + c[1 ] * c[1 ] + c[2 ] * c[2 ];
549- if (d2 < d2min)
550- {
551- d2min = d2;
552- ic = i;
553- }
554- }
555- if (ic >= 0 )
556- a += nextcells[ic];
557- return d2min;
558- }
559- }
560-
561- /* * apply BC to a displacement vector a and return the minimum-image distance
562- * @param lat lattice
563- * @param a displacement vector
564- * @return the minimum-image distance
565- */
566- inline T apply_bc (TinyVector<T, 3 >& displ) const
567- {
568- // cart2unit
569- TinyVector<T, 3 > ar (displ[0 ] * g00 + displ[1 ] * g10 + displ[2 ] * g20,
570- displ[0 ] * g01 + displ[1 ] * g11 + displ[2 ] * g21,
571- displ[0 ] * g02 + displ[1 ] * g12 + displ[2 ] * g22);
572- // put them in the box
573- ar[0 ] -= round (ar[0 ]);
574- ar[1 ] -= round (ar[1 ]);
575- ar[2 ] -= round (ar[2 ]);
576- // unit2cart
577- displ[0 ] = ar[0 ] * r00 + ar[1 ] * r10 + ar[2 ] * r20;
578- displ[1 ] = ar[0 ] * r01 + ar[1 ] * r11 + ar[2 ] * r21;
579- displ[2 ] = ar[0 ] * r02 + ar[1 ] * r12 + ar[2 ] * r22;
580- // return |displ|^2 after checking the ghost cells
581- return get_min_distance (displ);
582- }
583-
584- /* * out = prod (in ,lattice)
585- * @param lattice 3x3 tensor to for conversion, either CrystalLattice::R or CrystalLattice::G
586- * @param in start address of input vectors, in[n][3]
587- * @param out start address of output vectors, out[n][3]
588- * @param n number of 3d vectors
589- */
590- inline void convert2Cart (const T* restrict in, T* restrict out, int n) const
591- {
592- for (int i = 0 , i3 = 0 ; i < n; ++i, i3 += 3 )
593- {
594- out[i3] = in[i3] * r00 + in[i3 + 1 ] * r10 + in[i3 + 2 ] * r20;
595- out[i3 + 1 ] = in[i3] * r01 + in[i3 + 1 ] * r11 + in[i3 + 2 ] * r21;
596- out[i3 + 2 ] = in[i3] * r02 + in[i3 + 1 ] * r12 + in[i3 + 2 ] * r22;
597- }
598- }
599-
600- inline void convert2Unit (const T* restrict in, T* restrict out, int n) const
601- {
602- for (int i = 0 , i3 = 0 ; i < n; ++i, i3 += 3 )
603- {
604- out[i3] = in[i3] * g00 + in[i3 + 1 ] * g10 + in[i3 + 2 ] * g20;
605- out[i3 + 1 ] = in[i3] * g01 + in[i3 + 1 ] * g11 + in[i3 + 2 ] * g21;
606- out[i3 + 2 ] = in[i3] * g02 + in[i3 + 1 ] * g12 + in[i3 + 2 ] * g22;
607- }
608- }
609-
610- inline void apply_bc (std::vector<TinyVector<T, 3 >>& dr, std::vector<T>& r, std::vector<T>& rinv) const
611- {
612- const int n = dr.size ();
613- for (int i = 0 ; i < n; ++i)
614- rinv[i] = apply_bc (dr[i]);
615- // using inline function but is not better
616- // T drnew[n*3];
617- // convert2Unit(&dr[0][0],drnew,n);
618- // for(int i=0; i<n*3;++i) drnew[i]-= round(drnew[i]);
619- // convert2Cart(drnew,&dr[0][0],n);
620- // for(int i=0; i<n; ++i) rinv[i]=get_min_distance(dr[i]);
621- simd::sqrt (&rinv[0 ], &r[0 ], n);
622- simd::inv (&r[0 ], &rinv[0 ], n);
623- }
624-
625- inline void apply_bc (std::vector<TinyVector<T, 3 >>& dr, std::vector<T>& r) const
626- {
627- for (int i = 0 ; i < dr.size (); ++i)
628- r[i] = apply_bc (dr[i]);
629- }
630-
631- inline void evaluate_rsquared (TinyVector<T, 3 >* restrict dr, T* restrict rr, int n)
632- {
633- for (int i = 0 ; i < n; ++i)
634- rr[i] = apply_bc (dr[i]);
635- }
636- };
637-
638- /* * specialization for a slab, general cell
639- */
640- template <class T >
641- struct DTD_BConds <T, 3 , PPNX >
642- {
643- T r00, r10, r01, r11;
644- T g00, g10, g01, g11;
645- T r2max;
646- std::vector<TinyVector<T, 3 >> nextcells;
647-
648- DTD_BConds (const CrystalLattice<T, 3 >& lat)
649- : r00(lat.R(0 )),
650- r10 (lat.R(3 )),
651- r01(lat.R(1 )),
652- r11(lat.R(4 )),
653- g00(lat.G(0 )),
654- g10(lat.G(3 )),
655- g01(lat.G(1 )),
656- g11(lat.G(4 )),
657- r2max(lat.CellRadiusSq)
658- {
659- nextcells.resize (8 );
660- int ic = 0 ;
661- for (int i = -1 ; i <= 1 ; ++i)
662- for (int j = -1 ; j <= 1 ; ++j)
663- {
664- if (!(i || j))
665- continue ; // exclude zero
666- nextcells[ic][0 ] = i * r00 + j * r10;
667- nextcells[ic][1 ] = i * r01 + j * r11;
668- nextcells[ic][2 ] = 0 ;
669- ++ic;
670- }
671- }
672-
673- /* * evaluate the minimum distance
674- * @param lat lattice
675- * @param a displacement vector \f$[-0.5,0.5)\times [-0.5,0.5)\times [-\infty,\infty)\f$
676- * @param r2max square of the maximum cutoff
677- * @return square of the minimum-image distance
678- *
679- * Search the ghost cells to match Wigner-Seitz cell
680- */
681- inline T get_min_distance (TinyVector<T, 3 >& a) const
682- {
683- T d2 = a[0 ] * a[0 ] + a[1 ] * a[1 ] + a[2 ] * a[2 ];
684- if (d2 < r2max)
685- return d2;
686- else
687- {
688- T d2min = d2;
689- int ic = -1 ;
690- for (int i = 0 ; i < 8 ; ++i)
691- {
692- TinyVector<T, 3 > c (a + nextcells[i]);
693- d2 = c[0 ] * c[0 ] + c[1 ] * c[1 ] + c[2 ] * c[2 ];
694- if (d2 < d2min)
695- {
696- d2min = d2;
697- ic = i;
698- }
699- }
700- if (ic >= 0 )
701- a += nextcells[ic];
702- return d2min;
703- }
704- }
705-
706- /* * apply BC to a displacement vector a and return the minimum-image distance
707- * @param lat lattice
708- * @param a displacement vector
709- * @return the minimum-image distance
710- */
711- inline T apply_bc (TinyVector<T, 3 >& displ) const
712- {
713- // cart2unit
714- TinyVector<T, 2 > ar (displ[0 ] * g00 + displ[1 ] * g10, displ[0 ] * g01 + displ[1 ] * g11);
715- // put them in the box
716- ar[0 ] -= round (ar[0 ]);
717- ar[1 ] -= round (ar[1 ]);
718- // unit2cart
719- displ[0 ] = ar[0 ] * r00 + ar[1 ] * r10;
720- displ[1 ] = ar[0 ] * r01 + ar[1 ] * r11;
721- // return |displ|^2 after checking the ghost cells
722- return get_min_distance (displ);
723- }
724-
725- inline void apply_bc (std::vector<TinyVector<T, 3 >>& dr, std::vector<T>& r, std::vector<T>& rinv) const
726- {
727- const int n = dr.size ();
728- for (int i = 0 ; i < n; ++i)
729- rinv[i] = apply_bc (dr[i]);
730- simd::sqrt (&rinv[0 ], &r[0 ], n);
731- simd::inv (&r[0 ], &rinv[0 ], n);
732- }
733-
734- inline void apply_bc (std::vector<TinyVector<T, 3 >>& dr, std::vector<T>& r) const
735- {
736- for (int i = 0 ; i < dr.size (); ++i)
737- r[i] = apply_bc (dr[i]);
738- }
739-
740- inline void evaluate_rsquared (TinyVector<T, 3 >* restrict dr, T* restrict rr, int n)
741- {
742- for (int i = 0 ; i < n; ++i)
743- rr[i] = apply_bc (dr[i]);
744- }
745- };
746-
747480
748481} // namespace qmcplusplus
749482
0 commit comments