DFT-FE 1.3.0-pre
Density Functional Theory With Finite-Elements
Loading...
Searching...
No Matches
force.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
17
18#ifndef force_H_
19#define force_H_
20#include "vselfBinsManager.h"
21#include "dftParameters.h"
22
23#include "constants.h"
24#include "headers.h"
26#include <dftd.h>
27#include <oncvClass.h>
29#include <feevaluationWrapper.h>
30#include <groupSymmetry.h>
31namespace dftfe
32{
33 // forward declaration
34 template <dftfe::utils::MemorySpace memory>
35 class dftClass;
36
37 /**
38 * @brief computes configurational forces in KSDFT
39 *
40 * This class computes and stores the configurational forces corresponding to
41 * geometry optimization. It uses the formulation in the paper by Motamarri
42 * et.al. (https://link.aps.org/doi/10.1103/PhysRevB.97.165132) which provides
43 * an unified approach to atomic forces corresponding to internal atomic
44 * relaxation and cell stress corresponding to cell relaxation.
45 *
46 * @author Sambit Das
47 */
48 template <dftfe::utils::MemorySpace memorySpace>
50 {
51 friend class dftClass<memorySpace>;
52
53 public:
54 /** @brief Constructor.
55 *
56 * @param _dftPtr pointer to dftClass
57 * @param mpi_comm_parent parent mpi_communicator
58 * @param mpi_comm_domain domain decomposition mpi_communicator
59 */
61 const MPI_Comm &mpi_comm_parent,
62 const MPI_Comm &mpi_comm_domain,
63 const dftParameters &dftParams);
64
65 /** @brief initializes data structures inside forceClass assuming unmoved triangulation.
66 *
67 * initUnmoved is the first step of the initialization/reinitialization of
68 * force class when starting from a new unmoved triangulation. It creates
69 * the dofHandler with linear finite elements and three components
70 * corresponding to the three force components. It also creates the
71 * corresponding constraint matrices which is why an unmoved triangulation
72 * is necessary. Finally this function also initializes the gaussianMovePar
73 * data member.
74 *
75 * @param triangulation reference to unmoved triangulation where the mesh nodes have not
76 * been manually moved.
77 * @param isElectrostaticsMesh boolean parameter specifying whether this triangulatio is to be used for
78 * for the electrostatics part of the configurational force.
79 * @return void.
80 */
81 void
82 initUnmoved(const dealii::Triangulation<3, 3> &triangulation,
83 const dealii::Triangulation<3, 3> &serialTriangulation,
84 const std::vector<std::vector<double>> &domainBoundingVectors,
85 const bool isElectrostaticsMesh);
86
87 /** @brief initializes data structures inside forceClass which depend on the moved mesh.
88 *
89 * initMoved is the second step (first step call initUnmoved) of the
90 * initialization/reinitialization of force class when starting from a new
91 * mesh, and the first step when recomputing forces on a perturbed mesh.
92 * initMoved assumes that the triangulation whose reference was passed to
93 * the forceClass object in the initUnmoved call now has its nodes moved
94 * such that all atomic positions lie on nodes.
95 *
96 * @return void.
97 */
98 void
100 std::vector<const dealii::DoFHandler<3> *> &dofHandlerVectorMatrixFree,
101 std::vector<const dealii::AffineConstraints<double> *>
102 &constraintsVectorMatrixFree,
103 const bool isElectrostaticsMesh);
104
105 /** @brief initializes and precomputes pseudopotential related data structuers required for configurational force
106 * and stress computation.
107 *
108 * This function is only activated for pseudopotential calculations and is
109 * currently called when initializing/reinitializing the dftClass object.
110 * This function initializes and precomputes the pseudopotential
111 * datastructures for local and non-local parts. Separate internal function
112 * calls are made for KB and ONCV projectors.
113 *
114 * @return void.
115 */
116 void
118
119 /** @brief computes the configurational force on all atoms corresponding to a Gaussian generator,
120 * which represents perturbation of the underlying space.
121 *
122 * The Gaussian generator is taken to be exp(-d_gaussianConstant*r^2), r
123 * being the distance from the atom. Currently d_gaussianConstant is
124 * hardcoded to be 4.0. To get the computed atomic forces use getAtomsForces
125 *
126 * @return void.
127 */
128 void
130 const dealii::MatrixFree<3, double> &matrixFreeData,
131 const std::shared_ptr<groupSymmetryClass> &groupSymmetryPtr,
132 const dispersionCorrection &dispersionCorr,
133 const dftfe::uInt eigenDofHandlerIndex,
134 const dftfe::uInt smearedChargeQuadratureId,
135 const dftfe::uInt lpspQuadratureIdElectro,
136 const dealii::MatrixFree<3, double> &matrixFreeDataElectro,
137 const dftfe::uInt phiTotDofHandlerIndexElectro,
138 const distributedCPUVec<double> &phiTotRhoOutElectro,
139 const std::vector<
141 &rhoOutValues,
142 const std::vector<
144 &gradRhoOutValues,
146 &rhoTotalOutValuesLpsp,
148 &gradRhoTotalOutValuesLpsp,
149 const std::map<dealii::CellId, std::vector<double>> &rhoCoreValues,
150 const std::map<dealii::CellId, std::vector<double>> &gradRhoCoreValues,
151 const std::map<dealii::CellId, std::vector<double>> &hessianRhoCoreValues,
152 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
153 &gradRhoCoreAtoms,
154 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
155 &hessianRhoCoreAtoms,
156 const std::map<dealii::CellId, std::vector<double>> &pseudoVLocElectro,
157 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
158 &pseudoVLocAtomsElectro,
159 const dealii::AffineConstraints<double> &hangingPlusPBCConstraintsElectro,
160 const vselfBinsManager &vselfBinsManagerElectro);
161
162 /** @brief returns a copy of the configurational force on all global atoms.
163 *
164 * computeAtomsForces must be called prior to this function call.
165 *
166 * @return std::vector<double> flattened array of the configurational force on all atoms,
167 * the three force components on each atom being the leading dimension.
168 * Units- Hartree/Bohr
169 */
170 std::vector<double> &
172
173 /** @brief prints the currently stored configurational forces on atoms and the Gaussian generator constant
174 * used to compute them.
175 *
176 * @return void.
177 */
178 void
180
181 /** @brief Update force generator Gaussian constant.
182 *
183 * @return void.
184 */
185 // void updateGaussianConstant(const double newGaussianConstant);
186
187 /** @brief computes the configurational stress on the domain corresponding to
188 * affine deformation of the periodic cell.
189 *
190 * This function cannot be called for fully non-periodic calculations.
191 *
192 * @return void.
193 */
194 void
196 const dealii::MatrixFree<3, double> &matrixFreeData,
197 const std::shared_ptr<groupSymmetryClass> &groupSymmetryPtr,
198 const dispersionCorrection &dispersionCorr,
199 const dftfe::uInt eigenDofHandlerIndex,
200 const dftfe::uInt smearedChargeQuadratureId,
201 const dftfe::uInt lpspQuadratureIdElectro,
202 const dealii::MatrixFree<3, double> &matrixFreeDataElectro,
203 const dftfe::uInt phiTotDofHandlerIndexElectro,
204 const distributedCPUVec<double> &phiTotRhoOutElectro,
205 const std::vector<
207 &rhoOutValues,
208 const std::vector<
210 &gradRhoOutValues,
212 &rhoTotalOutValuesLpsp,
214 &gradRhoTotalOutValuesLpsp,
215 const std::map<dealii::CellId, std::vector<double>> &pseudoVLocElectro,
216 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
217 &pseudoVLocAtomsElectro,
218 const std::map<dealii::CellId, std::vector<double>> &rhoCoreValues,
219 const std::map<dealii::CellId, std::vector<double>> &gradRhoCoreValues,
220 const std::map<dealii::CellId, std::vector<double>> &hessianRhoCoreValues,
221 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
222 &gradRhoCoreAtoms,
223 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
224 &hessianRhoCoreAtoms,
225 const dealii::AffineConstraints<double> &hangingPlusPBCConstraintsElectro,
226 const vselfBinsManager &vselfBinsManagerElectro);
227
228 /** @brief prints the currently stored configurational stress tensor.
229 *
230 * @return void.
231 */
232 void
234
235 /** @brief returns a copy of the current stress tensor value.
236 *
237 * computeStress must be call prior to this function call.
238 *
239 * @return dealii::Tensor<2,3,double> second order stress Tensor in Hartree/Bohr^3
240 */
241 dealii::Tensor<2, 3, double> &
243
244 /** @brief get the value of Gaussian generator parameter (d_gaussianConstant).
245 * Gaussian generator: Gamma(r)= exp(-d_gaussianConstant*r^2).
246 *
247 */
248 // double getGaussianGeneratorParameter() const;
249
250 private:
251 /** @brief Locates and stores the global dof indices of d_dofHandlerForce whose cooridinates match
252 * with the atomic positions.
253 *
254 * @return void.
255 */
256 void
257 locateAtomCoreNodesForce(const dealii::DoFHandler<3> &dofHandlerForce,
258 const dealii::IndexSet &locally_owned_dofsForce,
259 std::map<std::pair<dftfe::uInt, dftfe::uInt>,
260 dftfe::uInt> &atomsForceDofs);
261
262 void
264 const dealii::DoFHandler<3> &dofHandler,
265 const dealii::DoFHandler<3> &dofHandlerForce,
266 const dealii::AffineConstraints<double> &hangingPlusPBCConstraints,
268 std::vector<std::vector<dealii::DoFHandler<3>::active_cell_iterator>>
269 &cellsVselfBallsDofHandler,
270 std::vector<std::vector<dealii::DoFHandler<3>::active_cell_iterator>>
271 &cellsVselfBallsDofHandlerForce,
272 std::vector<std::map<dealii::CellId, dftfe::uInt>>
273 &cellsVselfBallsClosestAtomIdDofHandler,
274 std::map<dftfe::uInt, dftfe::uInt> &AtomIdBinIdLocalDofHandler,
275 std::vector<std::map<dealii::DoFHandler<3>::active_cell_iterator,
276 std::vector<dftfe::uInt>>>
277 &cellFacesVselfBallSurfacesDofHandler,
278 std::vector<std::map<dealii::DoFHandler<3>::active_cell_iterator,
279 std::vector<dftfe::uInt>>>
280 &cellFacesVselfBallSurfacesDofHandlerForce);
281
282 void
284 const dealii::MatrixFree<3, double> &matrixFreeData,
285 const dealii::MatrixFree<3, double> &matrixFreeDataElectro);
286
287 void
289
290 void
292 const dealii::MatrixFree<3, double> &matrixFreeData,
293 const dftfe::uInt eigenDofHandlerIndex,
294 const dftfe::uInt smearedChargeQuadratureId,
295 const dftfe::uInt lpspQuadratureIdElectro,
296 const dealii::MatrixFree<3, double> &matrixFreeDataElectro,
297 const dftfe::uInt phiTotDofHandlerIndexElectro,
298 const distributedCPUVec<double> &phiTotRhoOutElectro,
299 const std::vector<
301 &rhoOutValues,
302 const std::vector<
304 &gradRhoOutValues,
306 &rhoTotalOutValuesLpsp,
308 &gradRhoTotalOutValuesLpsp,
309 const std::map<dealii::CellId, std::vector<double>> &rhoCoreValues,
310 const std::map<dealii::CellId, std::vector<double>> &gradRhoCoreValues,
311 const std::map<dealii::CellId, std::vector<double>> &hessianRhoCoreValues,
312 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
313 &gradRhoCoreAtoms,
314 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
315 &hessianRhoCoreAtoms,
316 const std::map<dealii::CellId, std::vector<double>> &pseudoVLocElectro,
317 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
318 &pseudoVLocAtomsElectro,
319 const vselfBinsManager &vselfBinsManagerElectro);
320
321 void
323 const dealii::MatrixFree<3, double> &matrixFreeDataElectro,
324 const dftfe::uInt phiTotDofHandlerIndexElectro,
325 const dftfe::uInt smearedChargeQuadratureId,
326 const dftfe::uInt lpspQuadratureIdElectro,
327 const distributedCPUVec<double> &phiTotRhoOutElectro,
329 &rhoTotalOutValues,
331 &rhoTotalOutValuesLpsp,
333 &gradRhoTotalOutValues,
335 &gradRhoTotalOutValuesLpsp,
336 const std::map<dealii::CellId, std::vector<double>> &pseudoVLocElectro,
337 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
338 &pseudoVLocAtomsElectro,
339 const vselfBinsManager &vselfBinsManagerElectro);
340
341 void
343
344 void
346 const dealii::DoFHandler<3> &dofHandlerElectro,
347 const vselfBinsManager &vselfBinsManagerElectro,
348 const dealii::MatrixFree<3, double> &matrixFreeDataElectro,
349 const dftfe::uInt smearedChargeQuadratureId);
350
351 void
353
354 void
356 const dealii::MatrixFree<3, double> &matrixFreeData,
357 const dftfe::uInt eigenDofHandlerIndex,
358 const dftfe::uInt smearedChargeQuadratureId,
359 const dftfe::uInt lpspQuadratureIdElectro,
360 const dealii::MatrixFree<3, double> &matrixFreeDataElectro,
361 const dftfe::uInt phiTotDofHandlerIndexElectro,
362 const distributedCPUVec<double> &phiTotRhoOutElectro,
363 const std::vector<
365 &rhoOutValues,
366 const std::vector<
368 &gradRhoOutValues,
370 &rhoTotalOutValuesLpsp,
372 &gradRhoTotalOutValuesLpsp,
373 const std::map<dealii::CellId, std::vector<double>> &rhoCoreValues,
374 const std::map<dealii::CellId, std::vector<double>> &gradRhoCoreValues,
375 const std::map<dealii::CellId, std::vector<double>> &hessianRhoCoreValues,
376 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
377 &gradRhoCoreAtoms,
378 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
379 &hessianRhoCoreAtoms,
380 const std::map<dealii::CellId, std::vector<double>> &pseudoVLocElectro,
381 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
382 &pseudoVLocAtomsElectro,
383 const vselfBinsManager &vselfBinsManagerElectro);
384
385 void
387 std::map<dftfe::uInt, std::vector<double>>
388 &forceContributionFPSPLocalGammaAtoms,
389 dealii::FEValues<3> &feValues,
390 dealii::FEFaceValues<3> &feFaceValues,
392 const dealii::MatrixFree<3, double> &matrixFreeData,
393 const dftfe::uInt phiTotDofHandlerIndexElectro,
394 const dftfe::uInt cell,
395 const dealii::AlignedVector<dealii::VectorizedArray<double>> &rhoQuads,
396 const dealii::AlignedVector<
397 dealii::Tensor<1, 3, dealii::VectorizedArray<double>>> &gradRhoQuads,
398 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
399 &pseudoVLocAtoms,
401 const std::vector<std::map<dealii::CellId, dftfe::uInt>>
402 &cellsVselfBallsClosestAtomIdDofHandler);
403
404 void
406 std::map<dftfe::uInt, std::vector<double>>
407 &forceContributionSmearedChargesGammaAtoms,
409 const dealii::MatrixFree<3, double> &matrixFreeData,
410 const dftfe::uInt cell,
411 const dealii::AlignedVector<
412 dealii::Tensor<1, 3, dealii::VectorizedArray<double>>> &gradPhiTotQuads,
413 const std::vector<dftfe::uInt> &nonTrivialAtomIdsMacroCell,
414 const std::map<dealii::CellId, std::vector<dftfe::Int>>
415 &bQuadAtomIdsAllAtoms,
416 const dealii::AlignedVector<dealii::VectorizedArray<double>>
417 &smearedbQuads);
418
419 void
421 std::map<dftfe::uInt, std::vector<double>>
422 &forceContributionSmearedChargesGammaAtoms,
424 const dealii::MatrixFree<3, double> &matrixFreeData,
425 const dftfe::uInt cell,
426 const dealii::AlignedVector<
427 dealii::Tensor<1, 3, dealii::VectorizedArray<double>>>
428 &gradVselfBinQuads,
429 const std::vector<dftfe::uInt> &nonTrivialAtomIdsMacroCell,
430 const std::map<dealii::CellId, std::vector<dftfe::Int>>
431 &bQuadAtomIdsAllAtoms,
432 const dealii::AlignedVector<dealii::VectorizedArray<double>>
433 &smearedbQuads);
434
435 void
437 std::map<dftfe::uInt, std::vector<double>>
438 &forceContributionFNonlinearCoreCorrectionGammaAtoms,
440 const dealii::MatrixFree<3, double> &matrixFreeData,
441 const dftfe::uInt cell,
442 const dealii::AlignedVector<dealii::VectorizedArray<double>> &vxcQuads,
443 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
444 &gradRhoCoreAtoms);
445
446
447 void
449 std::map<dftfe::uInt, std::vector<double>>
450 &forceContributionFNonlinearCoreCorrectionGammaAtoms,
452 const dealii::MatrixFree<3, double> &matrixFreeData,
453 const dftfe::uInt cell,
454 const dealii::AlignedVector<
455 dealii::Tensor<1, 3, dealii::VectorizedArray<double>>> &derExcGradRho,
456 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
457 &hessianRhoCoreAtoms);
458
459 void
461 std::map<dftfe::uInt, std::vector<double>>
462 &forceContributionFNonlinearCoreCorrectionGammaAtoms,
464 const dealii::MatrixFree<3, double> &matrixFreeData,
465 const dftfe::uInt cell,
466 const dealii::AlignedVector<dealii::VectorizedArray<double>>
467 &vxcQuadsSpin0,
468 const dealii::AlignedVector<dealii::VectorizedArray<double>>
469 &vxcQuadsSpin1,
470 const dealii::AlignedVector<
471 dealii::Tensor<1, 3, dealii::VectorizedArray<double>>>
472 &derExcGradRhoSpin0,
473 const dealii::AlignedVector<
474 dealii::Tensor<1, 3, dealii::VectorizedArray<double>>>
475 &derExcGradRhoSpin1,
476 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
477 &gradRhoCoreAtoms,
478 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
479 &hessianRhoCoreAtoms,
480 const bool isXCGGA = false);
481
482 void
484 const std::map<dftfe::uInt, std::vector<double>>
485 &forceContributionFPSPLocalGammaAtoms,
486 const std::map<std::pair<dftfe::uInt, dftfe::uInt>, dftfe::uInt>
487 &atomsForceDofs,
488 const dealii::AffineConstraints<double> &constraintsNoneForce,
489 distributedCPUVec<double> &configForceVectorLinFE);
490
491 void
493 const std::map<dftfe::uInt, std::vector<double>>
494 &forceContributionLocalGammaAtoms,
495 std::vector<double> &accumForcesVector);
496
497
498 void
500 std::map<dftfe::uInt, std::vector<double>>
501 &forceContributionFnlGammaAtoms,
502 const dealii::MatrixFree<3, double> &matrixFreeData,
503 FEEvaluationWrapperClass<3> &forceEvalNLP,
504 const std::shared_ptr<
506 nonLocalOp,
507 dftfe::uInt numNonLocalAtomsCurrentProcess,
508 const std::vector<dftfe::Int> &globalChargeIdNonLocalAtoms,
509 const std::vector<dftfe::uInt> &numberPseudoWaveFunctionsPerAtom,
510 const dftfe::uInt cell,
511 const std::map<dealii::CellId, dftfe::uInt> &cellIdToCellNumberMap,
512#ifdef USE_COMPLEX
513 const std::vector<dataTypes::number>
514 &projectorKetTimesPsiTimesVTimesPartOccContractionPsiQuadsFlattened,
515#endif
516 const std::vector<dataTypes::number> &zetaDeltaVQuadsFlattened,
517 const std::vector<dataTypes::number> &
518 projectorKetTimesPsiTimesVTimesPartOccContractionGradPsiQuadsFlattened);
519
520
521 void
523 dealii::AlignedVector<
524 dealii::Tensor<1, 3, dealii::VectorizedArray<double>>> &FVectQuads,
525 const dealii::MatrixFree<3, double> &matrixFreeData,
526 const dftfe::uInt numQuadPoints,
527 const std::shared_ptr<
529 nonLocalOp,
530 const dftfe::uInt numNonLocalAtomsCurrentProcess,
531 const std::vector<dftfe::Int> &globalChargeIdNonLocalAtoms,
532 const std::vector<dftfe::uInt> &numberPseudoWaveFunctionsPerAtom,
533 const dftfe::uInt cell,
534 const std::map<dealii::CellId, dftfe::uInt> &cellIdToCellNumberMap,
535 const std::vector<dataTypes::number> &zetaDeltaVQuadsFlattened,
536 const std::vector<dataTypes::number> &
537 projectorKetTimesPsiTimesVTimesPartOccContractionGradPsiQuadsFlattened);
538
539 void
541 const std::map<dftfe::uInt, std::vector<double>>
542 &forceContributionFnlGammaAtoms);
543
544 void
546 dealii::Tensor<2, 3, double> &stressContribution,
547 const dealii::MatrixFree<3, double> &matrixFreeData,
548 const dftfe::uInt numQuadPoints,
549 const std::vector<double> &jxwQuadsSubCells,
550 const dftfe::uInt cell,
551 const dftfe::uInt numNonLocalAtomsCurrentProcess,
552 const std::shared_ptr<
554 nonLocalOp,
555 const std::vector<dftfe::uInt> &numberPseudoWaveFunctionsPerAtom,
556 const std::map<dealii::CellId, dftfe::uInt> &cellIdToCellNumberMap,
557 const std::vector<dataTypes::number> &zetalmDeltaVlProductDistImageAtoms,
558#ifdef USE_COMPLEX
559 const std::vector<dataTypes::number>
560 &projectorKetTimesPsiTimesVTimesPartOccContractionPsiQuadsFlattened,
561#endif
562 const std::vector<dataTypes::number>
563 &projectorKetTimesPsiTimesVTimesPartOccContractionGradPsiQuadsFlattened,
564 const bool isSpinPolarized);
565
566 void
568 bool allowGaussianOverlapOnAtoms = false);
569
570 void
572
573 void
575 const dealii::DoFHandler<3> &dofHandlerElectro,
576 const vselfBinsManager &vselfBinsManagerElectro,
577 const dealii::MatrixFree<3, double> &matrixFreeDataElectro,
578 const dftfe::uInt smearedChargeQuadratureId);
579
580 void
582 const dealii::MatrixFree<3, double> &matrixFreeData,
583 const dftfe::uInt eigenDofHandlerIndex,
584 const dftfe::uInt smearedChargeQuadratureId,
585 const dftfe::uInt lpspQuadratureIdElectro,
586 const dealii::MatrixFree<3, double> &matrixFreeDataElectro,
587 const dftfe::uInt phiTotDofHandlerIndexElectro,
588 const distributedCPUVec<double> &phiTotRhoOutElectro,
589 const std::vector<
591 &rhoOutValues,
592 const std::vector<
594 &gradRhoOutValues,
596 &rhoTotalOutValuesLpsp,
598 &gradRhoTotalOutValuesLpsp,
599 const std::map<dealii::CellId, std::vector<double>> &pseudoVLocElectro,
600 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
601 &pseudoVLocAtomsElectro,
602 const std::map<dealii::CellId, std::vector<double>> &rhoCoreValues,
603 const std::map<dealii::CellId, std::vector<double>> &gradRhoCoreValues,
604 const std::map<dealii::CellId, std::vector<double>> &hessianRhoCoreValues,
605 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
606 &gradRhoCoreAtoms,
607 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
608 &hessianRhoCoreAtoms,
609 const vselfBinsManager &vselfBinsManagerElectro);
610
611 void
613 const dealii::MatrixFree<3, double> &matrixFreeDataElectro,
614 const dftfe::uInt phiTotDofHandlerIndexElectro,
615 const dftfe::uInt smearedChargeQuadratureId,
616 const dftfe::uInt lpspQuadratureIdElectro,
617 const distributedCPUVec<double> &phiTotRhoOutElectro,
619 &rhoTotalOutValues,
621 &rhoTotalOutValuesLpsp,
623 &gradRhoTotalOutValuesElectro,
625 &gradRhoTotalOutValuesElectroLpsp,
626 const std::map<dealii::CellId, std::vector<double>> &pseudoVLocElectro,
627 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
628 &pseudoVLocAtomsElectro,
629 const vselfBinsManager &vselfBinsManagerElectro);
630
631 void
633 dealii::FEValues<3> &feValues,
634 dealii::FEFaceValues<3> &feFaceValues,
636 const dealii::MatrixFree<3, double> &matrixFreeData,
637 const dftfe::uInt phiTotDofHandlerIndexElectro,
638 const dftfe::uInt cell,
639 const dealii::AlignedVector<dealii::VectorizedArray<double>> &rhoQuads,
640 const dealii::AlignedVector<
641 dealii::Tensor<1, 3, dealii::VectorizedArray<double>>> &gradRhoQuads,
642 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
643 &pseudoVLocAtoms,
645 const std::vector<std::map<dealii::CellId, dftfe::uInt>>
646 &cellsVselfBallsClosestAtomIdDofHandler);
647
648 void
651 const dealii::MatrixFree<3, double> &matrixFreeData,
652 const dftfe::uInt cell,
653 const dealii::AlignedVector<dealii::VectorizedArray<double>> &vxcQuads,
654 const dealii::AlignedVector<
655 dealii::Tensor<1, 3, dealii::VectorizedArray<double>>> &derExcGradRho,
656 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
657 &gradRhoCoreAtoms,
658 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
659 &hessianRhoCoreAtoms);
660
661 void
664 const dealii::MatrixFree<3, double> &matrixFreeData,
665 const dftfe::uInt cell,
666 const dealii::AlignedVector<dealii::VectorizedArray<double>>
667 &vxcQuadsSpin0,
668 const dealii::AlignedVector<dealii::VectorizedArray<double>>
669 &vxcQuadsSpin1,
670 const dealii::AlignedVector<
671 dealii::Tensor<1, 3, dealii::VectorizedArray<double>>>
672 &derExcGradRhoSpin0,
673 const dealii::AlignedVector<
674 dealii::Tensor<1, 3, dealii::VectorizedArray<double>>>
675 &derExcGradRhoSpin1,
676 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
677 &gradRhoCoreAtoms,
678 const std::map<dftfe::uInt, std::map<dealii::CellId, std::vector<double>>>
679 &hessianRhoCoreAtoms,
680 const bool isXCGGA = false);
681
682 void
685 const dealii::MatrixFree<3, double> &matrixFreeData,
686 const dftfe::uInt cell,
687 const dealii::AlignedVector<
688 dealii::Tensor<1, 3, dealii::VectorizedArray<double>>> &gradPhiTotQuads,
689 const std::vector<dftfe::uInt> &nonTrivialAtomImageIdsMacroCell,
690 const std::map<dealii::CellId, std::vector<dftfe::Int>>
691 &bQuadAtomIdsAllAtomsImages,
692 const dealii::AlignedVector<dealii::VectorizedArray<double>>
693 &smearedbQuads);
694
695 void
698 const dealii::MatrixFree<3, double> &matrixFreeData,
699 const dftfe::uInt cell,
700 const dealii::AlignedVector<
701 dealii::Tensor<1, 3, dealii::VectorizedArray<double>>> &gradVselfQuads,
702 const std::vector<dftfe::uInt> &nonTrivialAtomImageIdsMacroCell,
703 const std::map<dealii::CellId, std::vector<dftfe::Int>>
704 &bQuadAtomIdsAllAtomsImages,
705 const dealii::AlignedVector<dealii::VectorizedArray<double>>
706 &smearedbQuads);
707
708 void
710
711
712 /// Parallel distributed vector field which stores the configurational force
713 /// for each fem node corresponding to linear shape function generator (see
714 /// equations 52-53 in
715 /// (https://link.aps.org/doi/10.1103/PhysRevB.97.165132)). This vector
716 /// doesn't contain contribution from terms which have sums over k points.
718
719 /// Parallel distributed vector field which stores the configurational force
720 /// for each fem node corresponding to linear shape function generator (see
721 /// equations 52-53 in
722 /// (https://link.aps.org/doi/10.1103/PhysRevB.97.165132)). This vector only
723 /// containts contribution from the electrostatic part.
725
726#ifdef USE_COMPLEX
727 /// Parallel distributed vector field which stores the configurational force
728 /// for each fem node corresponding to linear shape function generator (see
729 /// equations 52-53 in
730 /// (https://link.aps.org/doi/10.1103/PhysRevB.97.165132)). This vector only
731 /// contains contribution from terms which have sums over k points.
732 distributedCPUVec<double> d_configForceVectorLinFEKPoints;
733#endif
734
735
736 std::vector<double> d_forceAtomsFloating;
737
738#ifdef USE_COMPLEX
739 std::vector<double> d_forceAtomsFloatingKPoints;
740#endif
741
742
743
744 /// Gaussian generator constant. Gaussian generator: Gamma(r)=
745 /// exp(-d_gaussianConstant*r^2)
746 /// FIXME: Until the hanging nodes surface integral issue is fixed use a
747 /// value >=4.0
748 // double d_gaussianConstant;
749
750 /// Storage for configurational force on all global atoms.
751 std::vector<double> d_globalAtomsForces;
752
753 /// Storage for configurational stress tensor
754 dealii::Tensor<2, 3, double> d_stress;
755
756
757
758 /* Part of the stress tensor which is summed over k points.
759 * It is a temporary data structure required for stress evaluation
760 * (d_stress) when parallization over k points is on.
761 */
762 dealii::Tensor<2, 3, double> d_stressKPoints;
763
764 /* Dont use true except for debugging forces only without mesh movement, as
765 * gaussian ovelap on atoms for move mesh is by default set to false
766 */
768
769 /// pointer to dft class
771
772 /// Finite element object for configurational force computation. Linear
773 /// finite elements with three force field components are used.
774 dealii::FESystem<3> FEForce;
775
776 /* DofHandler on which we define the configurational force field. Each
777 * geometric fem node has three dofs corresponding the the three force
778 * components. The generator for the configurational force on the fem node
779 * is the linear shape function attached to it. This DofHandler is based on
780 * the same triangulation on which we solve the dft problem.
781 */
782 dealii::DoFHandler<3> d_dofHandlerForce;
783
784 /* DofHandler on which we define the configurational force field from
785 * electrostatic part (without psp). Each geometric fem node has three dofs
786 * corresponding the the three force components. The generator for the
787 * configurational force on the fem node is the linear shape function
788 * attached to it. This DofHandler is based on the same triangulation on
789 * which we solve the dft problem.
790 */
791 dealii::DoFHandler<3> d_dofHandlerForceElectro;
792
793 /// Index of the d_dofHandlerForce in the MatrixFree object stored in
794 /// dftClass. This is required to correctly use FEEvaluation class.
796
797 /// Index of the d_dofHandlerForceElectro in the MatrixFree object stored in
798 /// dftClass. This is required to correctly use FEEvaluation class.
800
801 /// dealii::IndexSet of locally owned dofs of in d_dofHandlerForce the
802 /// current processor
804
805 /// dealii::IndexSet of locally owned dofs of in d_dofHandlerForceElectro
806 /// the current processor
808
809 /// dealii::IndexSet of locally relevant dofs of in d_dofHandlerForce the
810 /// current processor
812
813 /// dealii::IndexSet of locally relevant dofs of in d_dofHandlerForceElectro
814 /// the current processor
816
817 /// Constraint matrix for hanging node and periodic constaints on
818 /// d_dofHandlerForce.
819 dealii::AffineConstraints<double> d_constraintsNoneForce;
820
821 /// Constraint matrix for hanging node and periodic constaints on
822 /// d_dofHandlerForceElectro.
823 dealii::AffineConstraints<double> d_constraintsNoneForceElectro;
824
825 /// Internal data: map < <atomId,force component>, globaldof in
826 /// d_dofHandlerForce>
827 std::map<std::pair<dftfe::uInt, dftfe::uInt>, dftfe::uInt> d_atomsForceDofs;
828
829 /// Internal data: map < <atomId,force component>, globaldof in
830 /// d_dofHandlerForceElectro>
831 std::map<std::pair<dftfe::uInt, dftfe::uInt>, dftfe::uInt>
833
834 /// Internal data: stores cell iterators of all cells in
835 /// dftPtr->d_dofHandler which are part of the vself ball. Outer vector is
836 /// over vself bins.
837 std::vector<std::vector<dealii::DoFHandler<3>::active_cell_iterator>>
839
840 /// Internal data: stores cell iterators of all cells in d_dofHandlerForce
841 /// which are part of the vself ball. Outer vector is over vself bins.
842 std::vector<std::vector<dealii::DoFHandler<3>::active_cell_iterator>>
844
845 /// Internal data: stores map of vself ball cell Id to the closest atom Id
846 /// of that cell. Outer vector over vself bins.
847 std::vector<std::map<dealii::CellId, dftfe::uInt>>
849
850 /// Internal data: stores the map of atom Id (only in the local processor)
851 /// to the vself bin Id.
852 std::map<dftfe::uInt, dftfe::uInt> d_AtomIdBinIdLocalDofHandler;
853
854 /* Internal data: stores the face ids of dftPtr->d_dofHandler (single
855 * component field) on which to evaluate the vself ball surface integral in
856 * the configurational force expression. Outer vector is over the vself
857 * bins. Inner map is between the cell iterator and the vector of face ids
858 * to integrate on for that cell iterator.
859 */
860 std::vector<std::map<dealii::DoFHandler<3>::active_cell_iterator,
861 std::vector<dftfe::uInt>>>
863
864 /* Internal data: stores the face ids of d_dofHandlerForce (three component
865 * field) on which to evaluate the vself ball surface integral in the
866 * configurational force expression. Outer vector is over the vself bins.
867 * Inner map is between the cell iterator and the vector of face ids to
868 * integrate on for that cell iterator.
869 */
870 std::vector<std::map<dealii::DoFHandler<3>::active_cell_iterator,
871 std::vector<dftfe::uInt>>>
873
874 /// Internal data: stores cell iterators of all cells in
875 /// dftPtr->d_dofHandler which are part of the vself ball. Outer vector is
876 /// over vself bins.
877 std::vector<std::vector<dealii::DoFHandler<3>::active_cell_iterator>>
879
880 /// Internal data: stores cell iterators of all cells in d_dofHandlerForce
881 /// which are part of the vself ball. Outer vector is over vself bins.
882 std::vector<std::vector<dealii::DoFHandler<3>::active_cell_iterator>>
884
885 /// Internal data: stores map of vself ball cell Id to the closest atom Id
886 /// of that cell. Outer vector over vself bins.
887 std::vector<std::map<dealii::CellId, dftfe::uInt>>
889
890 /// Internal data: stores the map of atom Id (only in the local processor)
891 /// to the vself bin Id.
892 std::map<dftfe::uInt, dftfe::uInt> d_AtomIdBinIdLocalDofHandlerElectro;
893
894 /* Internal data: stores the face ids of dftPtr->d_dofHandler (single
895 * component field) on which to evaluate the vself ball surface integral in
896 * the configurational force expression. Outer vector is over the vself
897 * bins. Inner map is between the cell iterator and the vector of face ids
898 * to integrate on for that cell iterator.
899 */
900 std::vector<std::map<dealii::DoFHandler<3>::active_cell_iterator,
901 std::vector<dftfe::uInt>>>
903
904 /* Internal data: stores the face ids of d_dofHandlerForce (three component
905 * field) on which to evaluate the vself ball surface integral in the
906 * configurational force expression. Outer vector is over the vself bins.
907 * Inner map is between the cell iterator and the vector of face ids to
908 * integrate on for that cell iterator.
909 */
910 std::vector<std::map<dealii::DoFHandler<3>::active_cell_iterator,
911 std::vector<dftfe::uInt>>>
913
914 std::map<dealii::CellId, dealii::DoFHandler<3>::active_cell_iterator>
916
917 std::vector<distributedCPUVec<double>> d_gaussianWeightsVecAtoms;
918
919
920
921 /// domain decomposition mpi_communicator
922 const MPI_Comm d_mpiCommParent;
923
924 /// domain decomposition mpi_communicator
925 const MPI_Comm mpi_communicator;
926
928
929 /// number of mpi processes in the current pool
931
932 /// current mpi process id in the current pool
934
935 /// conditional stream object to enable printing only on root processor
936 /// across all pools
937 dealii::ConditionalOStream pcout;
938 };
939
940} // namespace dftfe
941#endif
Definition AtomicCenteredNonLocalOperator.h:58
Definition feevaluationWrapper.h:104
This class is the primary interface location of all other parts of the DFT-FE code for all steps invo...
Definition dft.h:110
Namespace which declares the input parameters and the functions to parse them from the input paramete...
Definition dftParameters.h:36
Calculates dispersion correction to energy, force and stress.
Definition dftd.h:37
void computeConfigurationalForceEEshelbyTensorFPSPFnlLinFE(const dealii::MatrixFree< 3, double > &matrixFreeData, const dftfe::uInt eigenDofHandlerIndex, const dftfe::uInt smearedChargeQuadratureId, const dftfe::uInt lpspQuadratureIdElectro, const dealii::MatrixFree< 3, double > &matrixFreeDataElectro, const dftfe::uInt phiTotDofHandlerIndexElectro, const distributedCPUVec< double > &phiTotRhoOutElectro, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &rhoOutValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &gradRhoOutValues, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &rhoTotalOutValuesLpsp, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &gradRhoTotalOutValuesLpsp, const std::map< dealii::CellId, std::vector< double > > &rhoCoreValues, const std::map< dealii::CellId, std::vector< double > > &gradRhoCoreValues, const std::map< dealii::CellId, std::vector< double > > &hessianRhoCoreValues, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &gradRhoCoreAtoms, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &hessianRhoCoreAtoms, const std::map< dealii::CellId, std::vector< double > > &pseudoVLocElectro, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &pseudoVLocAtomsElectro, const vselfBinsManager &vselfBinsManagerElectro)
void computeConfigurationalForceEEshelbyEElectroPhiTot(const dealii::MatrixFree< 3, double > &matrixFreeDataElectro, const dftfe::uInt phiTotDofHandlerIndexElectro, const dftfe::uInt smearedChargeQuadratureId, const dftfe::uInt lpspQuadratureIdElectro, const distributedCPUVec< double > &phiTotRhoOutElectro, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &rhoTotalOutValues, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &rhoTotalOutValuesLpsp, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &gradRhoTotalOutValues, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &gradRhoTotalOutValuesLpsp, const std::map< dealii::CellId, std::vector< double > > &pseudoVLocElectro, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &pseudoVLocAtomsElectro, const vselfBinsManager &vselfBinsManagerElectro)
std::vector< std::map< dealii::CellId, dftfe::uInt > > d_cellsVselfBallsClosestAtomIdDofHandler
Definition force.h:848
void computeConfigurationalForceTotalLinFE(const dealii::MatrixFree< 3, double > &matrixFreeData, const dftfe::uInt eigenDofHandlerIndex, const dftfe::uInt smearedChargeQuadratureId, const dftfe::uInt lpspQuadratureIdElectro, const dealii::MatrixFree< 3, double > &matrixFreeDataElectro, const dftfe::uInt phiTotDofHandlerIndexElectro, const distributedCPUVec< double > &phiTotRhoOutElectro, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &rhoOutValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &gradRhoOutValues, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &rhoTotalOutValuesLpsp, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &gradRhoTotalOutValuesLpsp, const std::map< dealii::CellId, std::vector< double > > &rhoCoreValues, const std::map< dealii::CellId, std::vector< double > > &gradRhoCoreValues, const std::map< dealii::CellId, std::vector< double > > &hessianRhoCoreValues, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &gradRhoCoreAtoms, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &hessianRhoCoreAtoms, const std::map< dealii::CellId, std::vector< double > > &pseudoVLocElectro, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &pseudoVLocAtomsElectro, const vselfBinsManager &vselfBinsManagerElectro)
void computeAtomsForcesGaussianGenerator(bool allowGaussianOverlapOnAtoms=false)
void stressEnlElementalContribution(dealii::Tensor< 2, 3, double > &stressContribution, const dealii::MatrixFree< 3, double > &matrixFreeData, const dftfe::uInt numQuadPoints, const std::vector< double > &jxwQuadsSubCells, const dftfe::uInt cell, const dftfe::uInt numNonLocalAtomsCurrentProcess, const std::shared_ptr< AtomicCenteredNonLocalOperator< dataTypes::number, memorySpace > > nonLocalOp, const std::vector< dftfe::uInt > &numberPseudoWaveFunctionsPerAtom, const std::map< dealii::CellId, dftfe::uInt > &cellIdToCellNumberMap, const std::vector< dataTypes::number > &zetalmDeltaVlProductDistImageAtoms, const std::vector< dataTypes::number > &projectorKetTimesPsiTimesVTimesPartOccContractionGradPsiQuadsFlattened, const bool isSpinPolarized)
std::vector< std::map< dealii::DoFHandler< 3 >::active_cell_iterator, std::vector< dftfe::uInt > > > d_cellFacesVselfBallSurfacesDofHandlerForceElectro
Definition force.h:912
std::vector< std::vector< dealii::DoFHandler< 3 >::active_cell_iterator > > d_cellsVselfBallsDofHandlerForce
Definition force.h:843
void configForceLinFEInit(const dealii::MatrixFree< 3, double > &matrixFreeData, const dealii::MatrixFree< 3, double > &matrixFreeDataElectro)
void computeStressEEshelbyEPSPEnlEk(const dealii::MatrixFree< 3, double > &matrixFreeData, const dftfe::uInt eigenDofHandlerIndex, const dftfe::uInt smearedChargeQuadratureId, const dftfe::uInt lpspQuadratureIdElectro, const dealii::MatrixFree< 3, double > &matrixFreeDataElectro, const dftfe::uInt phiTotDofHandlerIndexElectro, const distributedCPUVec< double > &phiTotRhoOutElectro, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &rhoOutValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &gradRhoOutValues, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &rhoTotalOutValuesLpsp, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &gradRhoTotalOutValuesLpsp, const std::map< dealii::CellId, std::vector< double > > &pseudoVLocElectro, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &pseudoVLocAtomsElectro, const std::map< dealii::CellId, std::vector< double > > &rhoCoreValues, const std::map< dealii::CellId, std::vector< double > > &gradRhoCoreValues, const std::map< dealii::CellId, std::vector< double > > &hessianRhoCoreValues, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &gradRhoCoreAtoms, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &hessianRhoCoreAtoms, const vselfBinsManager &vselfBinsManagerElectro)
std::vector< std::map< dealii::DoFHandler< 3 >::active_cell_iterator, std::vector< dftfe::uInt > > > d_cellFacesVselfBallSurfacesDofHandler
Definition force.h:862
void addEVselfSmearedStressContribution(FEEvaluationWrapperClass< 3 > &forceEval, const dealii::MatrixFree< 3, double > &matrixFreeData, const dftfe::uInt cell, const dealii::AlignedVector< dealii::Tensor< 1, 3, dealii::VectorizedArray< double > > > &gradVselfQuads, const std::vector< dftfe::uInt > &nonTrivialAtomImageIdsMacroCell, const std::map< dealii::CellId, std::vector< dftfe::Int > > &bQuadAtomIdsAllAtomsImages, const dealii::AlignedVector< dealii::VectorizedArray< double > > &smearedbQuads)
void distributeForceContributionFPSPLocalGammaAtoms(const std::map< dftfe::uInt, std::vector< double > > &forceContributionFPSPLocalGammaAtoms, const std::map< std::pair< dftfe::uInt, dftfe::uInt >, dftfe::uInt > &atomsForceDofs, const dealii::AffineConstraints< double > &constraintsNoneForce, distributedCPUVec< double > &configForceVectorLinFE)
distributedCPUVec< double > d_configForceVectorLinFE
Definition force.h:717
void createBinObjectsForce(const dealii::DoFHandler< 3 > &dofHandler, const dealii::DoFHandler< 3 > &dofHandlerForce, const dealii::AffineConstraints< double > &hangingPlusPBCConstraints, const vselfBinsManager &vselfBinsManager, std::vector< std::vector< dealii::DoFHandler< 3 >::active_cell_iterator > > &cellsVselfBallsDofHandler, std::vector< std::vector< dealii::DoFHandler< 3 >::active_cell_iterator > > &cellsVselfBallsDofHandlerForce, std::vector< std::map< dealii::CellId, dftfe::uInt > > &cellsVselfBallsClosestAtomIdDofHandler, std::map< dftfe::uInt, dftfe::uInt > &AtomIdBinIdLocalDofHandler, std::vector< std::map< dealii::DoFHandler< 3 >::active_cell_iterator, std::vector< dftfe::uInt > > > &cellFacesVselfBallSurfacesDofHandler, std::vector< std::map< dealii::DoFHandler< 3 >::active_cell_iterator, std::vector< dftfe::uInt > > > &cellFacesVselfBallSurfacesDofHandlerForce)
void computeStress(const dealii::MatrixFree< 3, double > &matrixFreeData, const std::shared_ptr< groupSymmetryClass > &groupSymmetryPtr, const dispersionCorrection &dispersionCorr, const dftfe::uInt eigenDofHandlerIndex, const dftfe::uInt smearedChargeQuadratureId, const dftfe::uInt lpspQuadratureIdElectro, const dealii::MatrixFree< 3, double > &matrixFreeDataElectro, const dftfe::uInt phiTotDofHandlerIndexElectro, const distributedCPUVec< double > &phiTotRhoOutElectro, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &rhoOutValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &gradRhoOutValues, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &rhoTotalOutValuesLpsp, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &gradRhoTotalOutValuesLpsp, const std::map< dealii::CellId, std::vector< double > > &pseudoVLocElectro, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &pseudoVLocAtomsElectro, const std::map< dealii::CellId, std::vector< double > > &rhoCoreValues, const std::map< dealii::CellId, std::vector< double > > &gradRhoCoreValues, const std::map< dealii::CellId, std::vector< double > > &hessianRhoCoreValues, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &gradRhoCoreAtoms, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &hessianRhoCoreAtoms, const dealii::AffineConstraints< double > &hangingPlusPBCConstraintsElectro, const vselfBinsManager &vselfBinsManagerElectro)
Update force generator Gaussian constant.
void initMoved(std::vector< const dealii::DoFHandler< 3 > * > &dofHandlerVectorMatrixFree, std::vector< const dealii::AffineConstraints< double > * > &constraintsVectorMatrixFree, const bool isElectrostaticsMesh)
initializes data structures inside forceClass which depend on the moved mesh.
const MPI_Comm d_mpiCommParent
domain decomposition mpi_communicator
Definition force.h:922
void computeConfigurationalForceEselfNoSurfaceLinFE()
dealii::IndexSet d_locally_owned_dofsForce
Definition force.h:803
std::vector< std::map< dealii::CellId, dftfe::uInt > > d_cellsVselfBallsClosestAtomIdDofHandlerElectro
Definition force.h:888
void printStress()
prints the currently stored configurational stress tensor.
void computeConfigurationalForceEselfLinFE(const dealii::DoFHandler< 3 > &dofHandlerElectro, const vselfBinsManager &vselfBinsManagerElectro, const dealii::MatrixFree< 3, double > &matrixFreeDataElectro, const dftfe::uInt smearedChargeQuadratureId)
dealii::IndexSet d_locally_relevant_dofsForceElectro
Definition force.h:815
std::map< dftfe::uInt, dftfe::uInt > d_AtomIdBinIdLocalDofHandlerElectro
Definition force.h:892
dealii::DoFHandler< 3 > d_dofHandlerForce
Definition force.h:782
void initUnmoved(const dealii::Triangulation< 3, 3 > &triangulation, const dealii::Triangulation< 3, 3 > &serialTriangulation, const std::vector< std::vector< double > > &domainBoundingVectors, const bool isElectrostaticsMesh)
initializes data structures inside forceClass assuming unmoved triangulation.
dftClass< memorySpace > * dftPtr
pointer to dft class
Definition force.h:770
void addENonlinearCoreCorrectionStressContribution(FEEvaluationWrapperClass< 3 > &forceEval, const dealii::MatrixFree< 3, double > &matrixFreeData, const dftfe::uInt cell, const dealii::AlignedVector< dealii::VectorizedArray< double > > &vxcQuads, const dealii::AlignedVector< dealii::Tensor< 1, 3, dealii::VectorizedArray< double > > > &derExcGradRho, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &gradRhoCoreAtoms, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &hessianRhoCoreAtoms)
void FPhiTotSmearedChargesGammaAtomsElementalContribution(std::map< dftfe::uInt, std::vector< double > > &forceContributionSmearedChargesGammaAtoms, FEEvaluationWrapperClass< 3 > &forceEval, const dealii::MatrixFree< 3, double > &matrixFreeData, const dftfe::uInt cell, const dealii::AlignedVector< dealii::Tensor< 1, 3, dealii::VectorizedArray< double > > > &gradPhiTotQuads, const std::vector< dftfe::uInt > &nonTrivialAtomIdsMacroCell, const std::map< dealii::CellId, std::vector< dftfe::Int > > &bQuadAtomIdsAllAtoms, const dealii::AlignedVector< dealii::VectorizedArray< double > > &smearedbQuads)
const dftfe::uInt n_mpi_processes
number of mpi processes in the current pool
Definition force.h:930
std::vector< double > d_globalAtomsForces
Storage for configurational force on all global atoms.
Definition force.h:751
std::vector< std::vector< dealii::DoFHandler< 3 >::active_cell_iterator > > d_cellsVselfBallsDofHandler
Definition force.h:838
void computeAtomsForces(const dealii::MatrixFree< 3, double > &matrixFreeData, const std::shared_ptr< groupSymmetryClass > &groupSymmetryPtr, const dispersionCorrection &dispersionCorr, const dftfe::uInt eigenDofHandlerIndex, const dftfe::uInt smearedChargeQuadratureId, const dftfe::uInt lpspQuadratureIdElectro, const dealii::MatrixFree< 3, double > &matrixFreeDataElectro, const dftfe::uInt phiTotDofHandlerIndexElectro, const distributedCPUVec< double > &phiTotRhoOutElectro, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &rhoOutValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &gradRhoOutValues, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &rhoTotalOutValuesLpsp, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &gradRhoTotalOutValuesLpsp, const std::map< dealii::CellId, std::vector< double > > &rhoCoreValues, const std::map< dealii::CellId, std::vector< double > > &gradRhoCoreValues, const std::map< dealii::CellId, std::vector< double > > &hessianRhoCoreValues, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &gradRhoCoreAtoms, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &hessianRhoCoreAtoms, const std::map< dealii::CellId, std::vector< double > > &pseudoVLocElectro, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &pseudoVLocAtomsElectro, const dealii::AffineConstraints< double > &hangingPlusPBCConstraintsElectro, const vselfBinsManager &vselfBinsManagerElectro)
computes the configurational force on all atoms corresponding to a Gaussian generator,...
dealii::Tensor< 2, 3, double > & getStress()
returns a copy of the current stress tensor value.
void accumulateForceContributionGammaAtomsFloating(const std::map< dftfe::uInt, std::vector< double > > &forceContributionLocalGammaAtoms, std::vector< double > &accumForcesVector)
std::vector< double > d_forceAtomsFloating
Definition force.h:736
std::map< std::pair< dftfe::uInt, dftfe::uInt >, dftfe::uInt > d_atomsForceDofsElectro
Definition force.h:832
void addEPhiTotSmearedStressContribution(FEEvaluationWrapperClass< 3 > &forceEval, const dealii::MatrixFree< 3, double > &matrixFreeData, const dftfe::uInt cell, const dealii::AlignedVector< dealii::Tensor< 1, 3, dealii::VectorizedArray< double > > > &gradPhiTotQuads, const std::vector< dftfe::uInt > &nonTrivialAtomImageIdsMacroCell, const std::map< dealii::CellId, std::vector< dftfe::Int > > &bQuadAtomIdsAllAtomsImages, const dealii::AlignedVector< dealii::VectorizedArray< double > > &smearedbQuads)
const dftParameters & d_dftParams
Definition force.h:927
void initPseudoData()
initializes and precomputes pseudopotential related data structuers required for configurational forc...
std::vector< std::map< dealii::DoFHandler< 3 >::active_cell_iterator, std::vector< dftfe::uInt > > > d_cellFacesVselfBallSurfacesDofHandlerElectro
Definition force.h:902
dealii::FESystem< 3 > FEForce
Definition force.h:774
void computeStressEEshelbyEElectroPhiTot(const dealii::MatrixFree< 3, double > &matrixFreeDataElectro, const dftfe::uInt phiTotDofHandlerIndexElectro, const dftfe::uInt smearedChargeQuadratureId, const dftfe::uInt lpspQuadratureIdElectro, const distributedCPUVec< double > &phiTotRhoOutElectro, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &rhoTotalOutValues, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &rhoTotalOutValuesLpsp, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &gradRhoTotalOutValuesElectro, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &gradRhoTotalOutValuesElectroLpsp, const std::map< dealii::CellId, std::vector< double > > &pseudoVLocElectro, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &pseudoVLocAtomsElectro, const vselfBinsManager &vselfBinsManagerElectro)
void FNonlinearCoreCorrectionGammaAtomsElementalContribution(std::map< dftfe::uInt, std::vector< double > > &forceContributionFNonlinearCoreCorrectionGammaAtoms, FEEvaluationWrapperClass< 3 > &forceEval, const dealii::MatrixFree< 3, double > &matrixFreeData, const dftfe::uInt cell, const dealii::AlignedVector< dealii::Tensor< 1, 3, dealii::VectorizedArray< double > > > &derExcGradRho, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &hessianRhoCoreAtoms)
void locateAtomCoreNodesForce(const dealii::DoFHandler< 3 > &dofHandlerForce, const dealii::IndexSet &locally_owned_dofsForce, std::map< std::pair< dftfe::uInt, dftfe::uInt >, dftfe::uInt > &atomsForceDofs)
get the value of Gaussian generator parameter (d_gaussianConstant). Gaussian generator: Gamma(r)= exp...
void distributeForceContributionFnlGammaAtoms(const std::map< dftfe::uInt, std::vector< double > > &forceContributionFnlGammaAtoms)
forceClass(dftClass< memorySpace > *_dftPtr, const MPI_Comm &mpi_comm_parent, const MPI_Comm &mpi_comm_domain, const dftParameters &dftParams)
Constructor.
void computeConfigurationalForcePhiExtLinFE()
dealii::Tensor< 2, 3, double > d_stress
Storage for configurational stress tensor.
Definition force.h:754
void configForceLinFEFinalize()
void computeFloatingAtomsForces()
dftfe::uInt d_forceDofHandlerIndexElectro
Definition force.h:799
dftfe::uInt d_forceDofHandlerIndex
Definition force.h:795
void addEPSPStressContribution(dealii::FEValues< 3 > &feValues, dealii::FEFaceValues< 3 > &feFaceValues, FEEvaluationWrapperClass< 3 > &forceEval, const dealii::MatrixFree< 3, double > &matrixFreeData, const dftfe::uInt phiTotDofHandlerIndexElectro, const dftfe::uInt cell, const dealii::AlignedVector< dealii::VectorizedArray< double > > &rhoQuads, const dealii::AlignedVector< dealii::Tensor< 1, 3, dealii::VectorizedArray< double > > > &gradRhoQuads, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &pseudoVLocAtoms, const vselfBinsManager &vselfBinsManager, const std::vector< std::map< dealii::CellId, dftfe::uInt > > &cellsVselfBallsClosestAtomIdDofHandler)
std::vector< distributedCPUVec< double > > d_gaussianWeightsVecAtoms
Definition force.h:917
void computeElementalNonLocalPseudoOVDataForce()
distributedCPUVec< double > d_configForceVectorLinFEElectro
Definition force.h:724
void FNonlinearCoreCorrectionGammaAtomsElementalContribution(std::map< dftfe::uInt, std::vector< double > > &forceContributionFNonlinearCoreCorrectionGammaAtoms, FEEvaluationWrapperClass< 3 > &forceEval, const dealii::MatrixFree< 3, double > &matrixFreeData, const dftfe::uInt cell, const dealii::AlignedVector< dealii::VectorizedArray< double > > &vxcQuads, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &gradRhoCoreAtoms)
std::map< std::pair< dftfe::uInt, dftfe::uInt >, dftfe::uInt > d_atomsForceDofs
Definition force.h:827
const dftfe::uInt this_mpi_process
current mpi process id in the current pool
Definition force.h:933
std::map< dealii::CellId, dealii::DoFHandler< 3 >::active_cell_iterator > d_cellIdToActiveCellIteratorMapDofHandlerRhoNodalElectro
Definition force.h:915
const bool d_allowGaussianOverlapOnAtoms
Definition force.h:767
void FnlGammaAtomsElementalContribution(std::map< dftfe::uInt, std::vector< double > > &forceContributionFnlGammaAtoms, const dealii::MatrixFree< 3, double > &matrixFreeData, FEEvaluationWrapperClass< 3 > &forceEvalNLP, const std::shared_ptr< AtomicCenteredNonLocalOperator< dataTypes::number, memorySpace > > nonLocalOp, dftfe::uInt numNonLocalAtomsCurrentProcess, const std::vector< dftfe::Int > &globalChargeIdNonLocalAtoms, const std::vector< dftfe::uInt > &numberPseudoWaveFunctionsPerAtom, const dftfe::uInt cell, const std::map< dealii::CellId, dftfe::uInt > &cellIdToCellNumberMap, const std::vector< dataTypes::number > &zetaDeltaVQuadsFlattened, const std::vector< dataTypes::number > &projectorKetTimesPsiTimesVTimesPartOccContractionGradPsiQuadsFlattened)
dealii::ConditionalOStream pcout
Definition force.h:937
void FnlGammaxElementalContribution(dealii::AlignedVector< dealii::Tensor< 1, 3, dealii::VectorizedArray< double > > > &FVectQuads, const dealii::MatrixFree< 3, double > &matrixFreeData, const dftfe::uInt numQuadPoints, const std::shared_ptr< AtomicCenteredNonLocalOperator< dataTypes::number, memorySpace > > nonLocalOp, const dftfe::uInt numNonLocalAtomsCurrentProcess, const std::vector< dftfe::Int > &globalChargeIdNonLocalAtoms, const std::vector< dftfe::uInt > &numberPseudoWaveFunctionsPerAtom, const dftfe::uInt cell, const std::map< dealii::CellId, dftfe::uInt > &cellIdToCellNumberMap, const std::vector< dataTypes::number > &zetaDeltaVQuadsFlattened, const std::vector< dataTypes::number > &projectorKetTimesPsiTimesVTimesPartOccContractionGradPsiQuadsFlattened)
void FPSPLocalGammaAtomsElementalContribution(std::map< dftfe::uInt, std::vector< double > > &forceContributionFPSPLocalGammaAtoms, dealii::FEValues< 3 > &feValues, dealii::FEFaceValues< 3 > &feFaceValues, FEEvaluationWrapperClass< 3 > &forceEval, const dealii::MatrixFree< 3, double > &matrixFreeData, const dftfe::uInt phiTotDofHandlerIndexElectro, const dftfe::uInt cell, const dealii::AlignedVector< dealii::VectorizedArray< double > > &rhoQuads, const dealii::AlignedVector< dealii::Tensor< 1, 3, dealii::VectorizedArray< double > > > &gradRhoQuads, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &pseudoVLocAtoms, const vselfBinsManager &vselfBinsManager, const std::vector< std::map< dealii::CellId, dftfe::uInt > > &cellsVselfBallsClosestAtomIdDofHandler)
dealii::AffineConstraints< double > d_constraintsNoneForce
Definition force.h:819
dealii::IndexSet d_locally_owned_dofsForceElectro
Definition force.h:807
dealii::IndexSet d_locally_relevant_dofsForce
Definition force.h:811
void printAtomsForces()
prints the currently stored configurational forces on atoms and the Gaussian generator constant used ...
std::vector< std::map< dealii::DoFHandler< 3 >::active_cell_iterator, std::vector< dftfe::uInt > > > d_cellFacesVselfBallSurfacesDofHandlerForce
Definition force.h:872
std::map< dftfe::uInt, dftfe::uInt > d_AtomIdBinIdLocalDofHandler
Definition force.h:852
std::vector< std::vector< dealii::DoFHandler< 3 >::active_cell_iterator > > d_cellsVselfBallsDofHandlerElectro
Definition force.h:878
std::vector< std::vector< dealii::DoFHandler< 3 >::active_cell_iterator > > d_cellsVselfBallsDofHandlerForceElectro
Definition force.h:883
const MPI_Comm mpi_communicator
domain decomposition mpi_communicator
Definition force.h:925
std::vector< double > & getAtomsForces()
returns a copy of the configurational force on all global atoms.
dealii::Tensor< 2, 3, double > d_stressKPoints
Definition force.h:762
void addENonlinearCoreCorrectionStressContributionSpinPolarized(FEEvaluationWrapperClass< 3 > &forceEval, const dealii::MatrixFree< 3, double > &matrixFreeData, const dftfe::uInt cell, const dealii::AlignedVector< dealii::VectorizedArray< double > > &vxcQuadsSpin0, const dealii::AlignedVector< dealii::VectorizedArray< double > > &vxcQuadsSpin1, const dealii::AlignedVector< dealii::Tensor< 1, 3, dealii::VectorizedArray< double > > > &derExcGradRhoSpin0, const dealii::AlignedVector< dealii::Tensor< 1, 3, dealii::VectorizedArray< double > > > &derExcGradRhoSpin1, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &gradRhoCoreAtoms, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &hessianRhoCoreAtoms, const bool isXCGGA=false)
dealii::AffineConstraints< double > d_constraintsNoneForceElectro
Definition force.h:823
void computeStressEself(const dealii::DoFHandler< 3 > &dofHandlerElectro, const vselfBinsManager &vselfBinsManagerElectro, const dealii::MatrixFree< 3, double > &matrixFreeDataElectro, const dftfe::uInt smearedChargeQuadratureId)
void FNonlinearCoreCorrectionGammaAtomsElementalContributionSpinPolarized(std::map< dftfe::uInt, std::vector< double > > &forceContributionFNonlinearCoreCorrectionGammaAtoms, FEEvaluationWrapperClass< 3 > &forceEval, const dealii::MatrixFree< 3, double > &matrixFreeData, const dftfe::uInt cell, const dealii::AlignedVector< dealii::VectorizedArray< double > > &vxcQuadsSpin0, const dealii::AlignedVector< dealii::VectorizedArray< double > > &vxcQuadsSpin1, const dealii::AlignedVector< dealii::Tensor< 1, 3, dealii::VectorizedArray< double > > > &derExcGradRhoSpin0, const dealii::AlignedVector< dealii::Tensor< 1, 3, dealii::VectorizedArray< double > > > &derExcGradRhoSpin1, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &gradRhoCoreAtoms, const std::map< dftfe::uInt, std::map< dealii::CellId, std::vector< double > > > &hessianRhoCoreAtoms, const bool isXCGGA=false)
void FVselfSmearedChargesGammaAtomsElementalContribution(std::map< dftfe::uInt, std::vector< double > > &forceContributionSmearedChargesGammaAtoms, FEEvaluationWrapperClass< 3 > &forceEval, const dealii::MatrixFree< 3, double > &matrixFreeData, const dftfe::uInt cell, const dealii::AlignedVector< dealii::Tensor< 1, 3, dealii::VectorizedArray< double > > > &gradVselfBinQuads, const std::vector< dftfe::uInt > &nonTrivialAtomIdsMacroCell, const std::map< dealii::CellId, std::vector< dftfe::Int > > &bQuadAtomIdsAllAtoms, const dealii::AlignedVector< dealii::VectorizedArray< double > > &smearedbQuads)
dealii::DoFHandler< 3 > d_dofHandlerForceElectro
Definition force.h:791
Definition MemoryStorage.h:33
Categorizes atoms into bins for efficient solution of nuclear electrostatic self-potential.
Definition vselfBinsManager.h:34
Definition pseudoPotentialToDftfeConverter.cc:34
dealii::LinearAlgebra::distributed::Vector< elem_type, dealii::MemorySpace::Host > distributedCPUVec
Definition headers.h:92
std::uint32_t uInt
Definition TypeConfig.h:10