DFT-FE 1.3.0-pre
Density Functional Theory With Finite-Elements
Loading...
Searching...
No Matches
groupSymmetry.h
Go to the documentation of this file.
1// ---------------------------------------------------------------------
2//
3// Copyright (c) 2017-2025 The Regents of the University of Michigan and DFT-FE
4// authors.
5//
6// This file is part of the DFT-FE code.
7//
8// The DFT-FE code is free software; you can use it, redistribute
9// it, and/or modify it under the terms of the GNU Lesser General
10// Public License as published by the Free Software Foundation; either
11// version 2.1 of the License, or (at your option) any later version.
12// The full text of the license can be found in the file LICENSE at
13// the top level of the DFT-FE distribution.
14//
15
16#ifndef groupSymmetry_H_
17#define groupSymmetry_H_
18#include <complex>
19#include <deque>
20#include <iomanip>
21#include <iostream>
22#include <numeric>
23#include <sstream>
24
25#include "constants.h"
26#include "headers.h"
27#include "BLASWrapper.h"
28#include <deal.II/base/mpi_remote_point_evaluation.h>
29namespace dftfe
30{
31 /**
32 * @brief density symmetrization based on irreducible Brillouin zone calculation,
33 * only relevant for calculations using point group symmetries
34 *
35 * @author Nikhil Kodali
36 */
37
39 {
40 public:
41 /**
42 * groupSymmetryClass constructor
43 */
44 groupSymmetryClass(const MPI_Comm &mpi_comm_parent,
45 const MPI_Comm &mpi_comm_domain,
46 const bool isGroupSymmetry,
47 const bool isTimeReversal);
48
49 void
50 initGroupSymmetry(std::vector<std::vector<double>> &atomLocations,
51 std::vector<std::vector<double>> &domainBoundingVectors,
52 std::vector<bool> &periodicBoundaryConditions,
53 const bool isCollinearSpin = false,
54 const bool isNonCollinearSpin = false);
55
56 void
58 std::vector<std::vector<double>> &atomLocations,
59 std::vector<std::vector<double>> &domainBoundingVectors);
60
61 void
62 setupCommPatternForNodalField(const dealii::DoFHandler<3> &dofHandler);
63
64 bool
67 &globalPointCoords);
68
69 void
71 distributedCPUVec<double> &scalarField,
72 const dealii::DoFHandler<3> &dofHandler);
73
74 void
76 distributedCPUVec<double> &vectorFieldComponentx,
77 distributedCPUVec<double> &vectorFieldComponenty,
78 distributedCPUVec<double> &vectorFieldComponentz,
79 const dealii::DoFHandler<3> &dofHandler);
80
81 void
84 &vectorFieldValues) const;
85
86 void
89 &tensorValues) const;
90
91 void
92 reduceKPointGrid(std::vector<double> &kPointCoordinatesFrac,
93 std::vector<double> &kPointWeights) const;
94
95
96 private:
97 /**
98 * compute-time logger
99 */
100 dealii::TimerOutput computing_timer;
101 /**
102 * parallel objects
103 */
107 dealii::ConditionalOStream pcout;
108 /**
109 * Space group symmetry related data
110 */
112 std::vector<std::vector<double>> d_symmMat;
113 std::vector<std::vector<double>> d_symmMatCart;
114 std::vector<std::vector<double>> d_symmMatInverse;
115 std::vector<std::vector<double>> d_translation;
116
124
125
127
128 std::vector<std::vector<dftfe::uInt>> d_pointMapsForSymmetry;
129
132
133 std::vector<std::vector<dftfe::uInt>> localDoFIndexToPointIndexMap;
134 mutable dealii::Utilities::MPI::RemotePointEvaluation<3, 3>
136 std::vector<dealii::Point<3>> requiredPointCoordinates;
137 dealii::MappingQ1<3> mapping;
138 };
139} // namespace dftfe
140#endif
void reduceKPointGrid(std::vector< double > &kPointCoordinatesFrac, std::vector< double > &kPointWeights) const
std::vector< std::vector< dftfe::uInt > > d_pointMapsForSymmetry
Definition groupSymmetry.h:128
void symmetrizeScalarFieldFromLocalValues(distributedCPUVec< double > &scalarField, const dealii::DoFHandler< 3 > &dofHandler)
dealii::MappingQ1< 3 > mapping
Definition groupSymmetry.h:137
std::vector< std::vector< double > > d_translation
Definition groupSymmetry.h:115
dftfe::uInt d_numAtoms
Definition groupSymmetry.h:117
std::vector< dealii::Point< 3 > > requiredPointCoordinates
Definition groupSymmetry.h:136
void reinitGroupSymmetry(std::vector< std::vector< double > > &atomLocations, std::vector< std::vector< double > > &domainBoundingVectors)
dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > d_domainBoundingVectorsInverse
Definition groupSymmetry.h:123
groupSymmetryClass(const MPI_Comm &mpi_comm_parent, const MPI_Comm &mpi_comm_domain, const bool isGroupSymmetry, const bool isTimeReversal)
dealii::ConditionalOStream pcout
Definition groupSymmetry.h:107
const MPI_Comm d_mpiCommDomain
Definition groupSymmetry.h:104
dealii::Utilities::MPI::RemotePointEvaluation< 3, 3 > remotePointCache
Definition groupSymmetry.h:135
void symmetrizeForce(dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &vectorFieldValues) const
std::vector< bool > d_periodicBoundaryConditions
Definition groupSymmetry.h:126
const bool d_isTimeReversal
Definition groupSymmetry.h:130
std::vector< std::vector< double > > d_symmMatInverse
Definition groupSymmetry.h:114
dealii::TimerOutput computing_timer
Definition groupSymmetry.h:100
const MPI_Comm d_mpiCommParent
Definition groupSymmetry.h:104
std::vector< std::vector< dftfe::uInt > > localDoFIndexToPointIndexMap
Definition groupSymmetry.h:133
const dftfe::uInt this_mpi_process
Definition groupSymmetry.h:106
std::vector< std::vector< double > > d_symmMatCart
Definition groupSymmetry.h:113
const bool d_isGroupSymmetry
Definition groupSymmetry.h:131
dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > d_domainBoundingVectors
Definition groupSymmetry.h:121
void symmetrizeVectorFieldFromLocalValues(distributedCPUVec< double > &vectorFieldComponentx, distributedCPUVec< double > &vectorFieldComponenty, distributedCPUVec< double > &vectorFieldComponentz, const dealii::DoFHandler< 3 > &dofHandler)
dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > d_atomicCoordsFrac
Definition groupSymmetry.h:119
const dftfe::uInt n_mpi_processes
Definition groupSymmetry.h:105
void symmetrizeStress(dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &tensorValues) const
dftfe::uInt d_numSymm
Definition groupSymmetry.h:111
void setupCommPatternForNodalField(const dealii::DoFHandler< 3 > &dofHandler)
bool computeAtomIdMapsFromGlobalFractionalCoordinates(dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &globalPointCoords)
std::vector< std::vector< double > > d_symmMat
Definition groupSymmetry.h:112
void initGroupSymmetry(std::vector< std::vector< double > > &atomLocations, std::vector< std::vector< double > > &domainBoundingVectors, std::vector< bool > &periodicBoundaryConditions, const bool isCollinearSpin=false, const bool isNonCollinearSpin=false)
Definition MemoryStorage.h:33
Definition pseudoPotentialToDftfeConverter.cc:34
std::uint32_t uInt
Definition TypeConfig.h:10
dealii::LinearAlgebra::distributed::Vector< elem_type, dealii::MemorySpace::Host > distributedCPUVec
Definition headers.h:92