DFT-FE 1.1.0-pre
Density Functional Theory With Finite-Elements
Loading...
Searching...
No Matches
energyCalculator.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#include <headers.h>
19#include <dftd.h>
20#include <excManager.h>
21#include "dftParameters.h"
22#include <FEBasisOperations.h>
23#include <AuxDensityMatrix.h>
24#ifndef energyCalculator_H_
25# define energyCalculator_H_
26
27namespace dftfe
28{
30 {
31 template <typename T>
32 double
34 const std::shared_ptr<
36 FEBasisOperations<T, double, dftfe::utils::MemorySpace::HOST>>
37 &basisOperationsPtr,
38 const dftfe::uInt quadratureId,
39 const std::map<dealii::CellId, std::vector<double>> &fieldValues,
41 &densityQuadValues);
42
43 template <typename T>
44 double
46 const std::shared_ptr<
48 FEBasisOperations<T, double, dftfe::utils::MemorySpace::HOST>>
49 &basisOperationsPtr,
50 const dftfe::uInt quadratureId,
51 const std::map<dealii::CellId, std::vector<double>> &fieldValues,
53 &densityQuadValuesIn,
55 &densityQuadValuesOut);
56
57 template <typename T>
58 double
60 const std::shared_ptr<
62 FEBasisOperations<T, double, dftfe::utils::MemorySpace::HOST>>
63 &basisOperationsPtr,
64 const dftfe::uInt quadratureId,
66 &fieldValues,
68 &densityQuadValues);
69
70 template <typename T>
71 double
73 const std::shared_ptr<
75 FEBasisOperations<T, double, dftfe::utils::MemorySpace::HOST>>
76 &basisOperationsPtr,
77 const dftfe::uInt quadratureId,
79 &fieldValues,
81 &densityQuadValuesIn,
83 &densityQuadValuesOut);
84
85 void
86 printEnergy(const double bandEnergy,
87 const double totalkineticEnergy,
88 const double totalexchangeEnergy,
89 const double totalcorrelationEnergy,
90 const double totalElectrostaticEnergy,
91 const double dispersionEnergy,
92 const double totalEnergy,
93 const dftfe::uInt numberAtoms,
94 const dealii::ConditionalOStream &pcout,
95 const bool reproducibleOutput,
96 const bool isPseudo,
97 const dftfe::uInt verbosity,
98 const dftParameters &dftParams);
99
100 double
101 localBandEnergy(const std::vector<std::vector<double>> &eigenValues,
102 const std::vector<std::vector<double>> &partialOccupancies,
103 const std::vector<double> &kPointWeights,
104 const double fermiEnergy,
105 const double fermiEnergyUp,
106 const double fermiEnergyDown,
107 const double TVal,
108 const dftfe::uInt spinPolarized,
109 const dealii::ConditionalOStream &scout,
110 const MPI_Comm &interpoolcomm,
111 const dftfe::uInt lowerBoundKindex,
112 const dftfe::uInt verbosity,
113 const dftParameters &dftParams);
114
115 double
117 const distributedCPUVec<double> &phiTotRhoOut,
118 const std::vector<std::vector<double>> &localVselfs,
119 const std::map<dealii::CellId, std::vector<double>> &smearedbValues,
120 const std::map<dealii::CellId, std::vector<dftfe::uInt>>
121 &smearedbNonTrivialAtomIds,
122 const dealii::DoFHandler<3> &dofHandlerElectrostatic,
123 const dealii::Quadrature<3> &quadratureElectrostatic,
124 const dealii::Quadrature<3> &quadratureSmearedCharge,
125 const std::map<dealii::types::global_dof_index, double>
126 &atomElectrostaticNodeIdToChargeMap,
127 const bool smearedNuclearCharges = false);
128
129 double
131 const distributedCPUVec<double> &phiTotRhoIn,
132 const distributedCPUVec<double> &phiTotRhoOut,
133 const std::map<dealii::CellId, std::vector<double>> &smearedbValues,
134 const std::map<dealii::CellId, std::vector<dftfe::uInt>>
135 &smearedbNonTrivialAtomIds,
136 const dealii::DoFHandler<3> &dofHandlerElectrostatic,
137 const dealii::Quadrature<3> &quadratureSmearedCharge,
138 const std::map<dealii::types::global_dof_index, double>
139 &atomElectrostaticNodeIdToChargeMap,
140 const bool smearedNuclearCharges = false);
141
142 double
144 const std::vector<std::vector<double>> &atomLocationsAndCharge,
145 const bool isPseudopotential);
146 } // namespace internalEnergy
147
148 /**
149 * @brief Calculates the ksdft problem total energy and its components
150 *
151 * @author Sambit Das, Shiva Rudraraju, Phani Motamarri, Krishnendu Ghosh
152 */
153 template <dftfe::utils::MemorySpace memorySpace>
155 {
156 public:
157 /**
158 * @brief Constructor
159 *
160 * @param mpi_comm_parent parent mpi communicator
161 * @param mpi_comm_domain mpi communicator of domain decomposition
162 * @param interpool_comm mpi interpool communicator over k points
163 * @param interBandGroupComm mpi interpool communicator over band groups
164 */
165 energyCalculator(const MPI_Comm &mpi_comm_parent,
166 const MPI_Comm &mpi_comm_domain,
167 const MPI_Comm &interpool_comm,
168 const MPI_Comm &interBandGroupComm,
169 const dftParameters &dftParams);
170
171 /**
172 * Computes total energy of the ksdft problem in the current state and also
173 * prints the individual components of the energy
174 *
175 * @param dofHandlerElectrostatic p refined DoFHandler object used for re-computing
176 * the electrostatic fields using the ground state electron density. If
177 * electrostatics is not recomputed on p refined mesh, use
178 * dofHandlerElectronic for this argument.
179 * @param dofHandlerElectronic DoFHandler object on which the electrostatics for the
180 * eigen solve are computed.
181 * @param quadratureElectrostatic qudarature object for dofHandlerElectrostatic.
182 * @param quadratureElectronic qudarature object for dofHandlerElectronic.
183 * @param eigenValues eigenValues for each k point.
184 * @param kPointWeights
185 * @param fermiEnergy
186 * @param funcX exchange functional object.
187 * @param funcC correlation functional object.
188 * @param phiTotRhoIn nodal vector field of total electrostatic potential using input
189 * electron density to an eigensolve. This vector field is based on
190 * dofHandlerElectronic.
191 * @param phiTotRhoOut nodal vector field of total electrostatic potential using output
192 * electron density to an eigensolve. This vector field is based on
193 * dofHandlerElectrostatic.
194 * @param rhoInValues cell quadrature data of input electron density to an eigensolve. This
195 * data must correspond to quadratureElectronic.
196 * @param rhoOutValues cell quadrature data of output electron density of an eigensolve. This
197 * data must correspond to quadratureElectronic.
198 * @param rhoOutValuesElectrostatic cell quadrature data of output electron density of an eigensolve
199 * evaluated on a p refined mesh. This data corresponds to
200 * quadratureElectrostatic.
201 * @param gradRhoInValues cell quadrature data of input gradient electron density
202 * to an eigensolve. This data must correspond to quadratureElectronic.
203 * @param gradRhoOutValues cell quadrature data of output gradient electron density
204 * of an eigensolve. This data must correspond to quadratureElectronic.
205 * @param localVselfs peak vselfs of local atoms in each vself bin
206 * @param atomElectrostaticNodeIdToChargeMap map between locally processor atom global node ids
207 * of dofHandlerElectrostatic to atom charge value.
208 * @param numberGlobalAtoms
209 * @param lowerBoundKindex global k index of lower bound of the local k point set in the current pool
210 * @param if scf is converged
211 * @param print
212 *
213 * @return total energy
214 */
215 double
217 const std::shared_ptr<
219 double,
221 &basisOperationsPtr,
222 const std::shared_ptr<
224 FEBasisOperations<double, double, dftfe::utils::MemorySpace::HOST>>
225 &basisOperationsPtrElectro,
226 const dftfe::uInt densityQuadratureID,
227 const dftfe::uInt densityQuadratureIDElectro,
228 const dftfe::uInt smearedChargeQuadratureIDElectro,
229 const dftfe::uInt lpspQuadratureIDElectro,
230 const std::vector<std::vector<double>> &eigenValues,
231 const std::vector<std::vector<double>> &partialOccupancies,
232 const std::vector<double> &kPointWeights,
233 const double fermiEnergy,
234 const double fermiEnergyUp,
235 const double fermiEnergyDown,
236 const std::shared_ptr<excManager<memorySpace>> excManagerPtr,
237 const dispersionCorrection &dispersionCorr,
239 &phiTotRhoInValues,
241 &phiTotRhoOutValues,
242 const distributedCPUVec<double> &phiTotRhoOut,
243 const std::vector<
245 &densityInValues,
246 const std::vector<
248 &densityOutValues,
249 const std::vector<
251 &gradDensityOutValues,
252 const std::vector<
254 &tauInValues,
255 const std::vector<
257 &tauOutValues,
259 &rhoOutValuesLpsp,
260 std::shared_ptr<AuxDensityMatrix<memorySpace>>
261 auxDensityXCInRepresentationPtr,
262 std::shared_ptr<AuxDensityMatrix<memorySpace>>
263 auxDensityXCOutRepresentationPtr,
264 const std::map<dealii::CellId, std::vector<double>> &smearedbValues,
265 const std::map<dealii::CellId, std::vector<dftfe::uInt>>
266 &smearedbNonTrivialAtomIds,
267 const std::vector<std::vector<double>> &localVselfs,
268 const std::map<dealii::CellId, std::vector<double>> &pseudoLocValues,
269 const std::map<dealii::types::global_dof_index, double>
270 &atomElectrostaticNodeIdToChargeMap,
271 const dftfe::uInt numberGlobalAtoms,
272 const dftfe::uInt lowerBoundKindex,
273 const dftfe::uInt scfConverged,
274 const bool print,
275 const bool smearedNuclearCharges = false);
276
277 double
279 const std::shared_ptr<
281 double,
283 &basisOperationsPtr,
284 const std::shared_ptr<
286 FEBasisOperations<double, double, dftfe::utils::MemorySpace::HOST>>
287 &basisOperationsPtrElectro,
288 const dftfe::uInt densityQuadratureID,
289 const dftfe::uInt densityQuadratureIDElectro,
290 const dftfe::uInt smearedChargeQuadratureIDElectro,
291 const dftfe::uInt lpspQuadratureIDElectro,
292 const std::shared_ptr<excManager<memorySpace>> excManagerPtr,
294 &phiTotRhoInValues,
296 &phiTotRhoOutValues,
297 const distributedCPUVec<double> &phiTotRhoIn,
298 const distributedCPUVec<double> &phiTotRhoOut,
299 const std::vector<
301 &densityInValues,
302 const std::vector<
304 &densityOutValues,
305 const std::vector<
307 &gradDensityInValues,
308 const std::vector<
310 &gradDensityOutValues,
311 const std::vector<
313 &tauInValues,
314 const std::vector<
316 &tauOutValues,
317 std::shared_ptr<AuxDensityMatrix<memorySpace>>
318 AuxDensityXCInRepresentationPtr,
319 std::shared_ptr<AuxDensityMatrix<memorySpace>>
320 AuxDensityXCOutRepresentationPtr,
321 const std::map<dealii::CellId, std::vector<double>> &smearedbValues,
322 const std::map<dealii::CellId, std::vector<dftfe::uInt>>
323 &smearedbNonTrivialAtomIds,
324 const std::vector<std::vector<double>> &localVselfs,
325 const std::map<dealii::types::global_dof_index, double>
326 &atomElectrostaticNodeIdToChargeMap,
327 const bool smearedNuclearCharges);
328
329
330 void
332 const std::shared_ptr<
334 double,
336 &basisOperationsPtr,
337 const dftfe::uInt quadratureId,
338 const std::shared_ptr<excManager<memorySpace>> excManagerPtr,
339 const std::vector<
341 &densityInValues,
342 const std::vector<
344 &gradDensityOutValues,
345 const std::vector<
347 &tauInValues,
348 std::shared_ptr<AuxDensityMatrix<memorySpace>>
349 AuxDensityXCInRepresentationPtr,
350 std::shared_ptr<AuxDensityMatrix<memorySpace>>
351 auxDensityXCOutRepresentationPtr,
352 double &exchangeEnergy,
353 double &correlationEnergy,
354 double &excCorrPotentialTimesRho);
355
356 double
358 const std::vector<std::vector<double>> &eigenValues,
359 const std::vector<std::vector<double>> &partialOccupancies,
360 const std::vector<double> &kPointWeights,
361 const double fermiEnergy,
362 const double fermiEnergyUp,
363 const double fermiEnergyDown,
364 const bool isSpinPolarized,
365 const bool isConstraintMagnetization,
366 const double temperature) const;
367
368
369
370 private:
371 const MPI_Comm d_mpiCommParent;
372 const MPI_Comm mpi_communicator;
373 const MPI_Comm interpoolcomm;
374 const MPI_Comm interBandGroupComm;
375
377
378 /// parallel message stream
379 dealii::ConditionalOStream pcout;
380 };
381
382} // namespace dftfe
383#endif // energyCalculator_H_
Definition AuxDensityMatrix.h:40
Definition FEBasisOperations.h:85
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
const MPI_Comm interpoolcomm
Definition energyCalculator.h:373
double computeEnergyResidual(const std::shared_ptr< dftfe::basis::FEBasisOperations< dataTypes::number, double, dftfe::utils::MemorySpace::HOST > > &basisOperationsPtr, const std::shared_ptr< dftfe::basis::FEBasisOperations< double, double, dftfe::utils::MemorySpace::HOST > > &basisOperationsPtrElectro, const dftfe::uInt densityQuadratureID, const dftfe::uInt densityQuadratureIDElectro, const dftfe::uInt smearedChargeQuadratureIDElectro, const dftfe::uInt lpspQuadratureIDElectro, const std::shared_ptr< excManager< memorySpace > > excManagerPtr, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &phiTotRhoInValues, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &phiTotRhoOutValues, const distributedCPUVec< double > &phiTotRhoIn, const distributedCPUVec< double > &phiTotRhoOut, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &densityInValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &densityOutValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &gradDensityInValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &gradDensityOutValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &tauInValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &tauOutValues, std::shared_ptr< AuxDensityMatrix< memorySpace > > AuxDensityXCInRepresentationPtr, std::shared_ptr< AuxDensityMatrix< memorySpace > > AuxDensityXCOutRepresentationPtr, const std::map< dealii::CellId, std::vector< double > > &smearedbValues, const std::map< dealii::CellId, std::vector< dftfe::uInt > > &smearedbNonTrivialAtomIds, const std::vector< std::vector< double > > &localVselfs, const std::map< dealii::types::global_dof_index, double > &atomElectrostaticNodeIdToChargeMap, const bool smearedNuclearCharges)
double computeEntropicEnergy(const std::vector< std::vector< double > > &eigenValues, const std::vector< std::vector< double > > &partialOccupancies, const std::vector< double > &kPointWeights, const double fermiEnergy, const double fermiEnergyUp, const double fermiEnergyDown, const bool isSpinPolarized, const bool isConstraintMagnetization, const double temperature) const
void computeXCEnergyTermsSpinPolarized(const std::shared_ptr< dftfe::basis::FEBasisOperations< dataTypes::number, double, dftfe::utils::MemorySpace::HOST > > &basisOperationsPtr, const dftfe::uInt quadratureId, const std::shared_ptr< excManager< memorySpace > > excManagerPtr, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &densityInValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &gradDensityOutValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &tauInValues, std::shared_ptr< AuxDensityMatrix< memorySpace > > AuxDensityXCInRepresentationPtr, std::shared_ptr< AuxDensityMatrix< memorySpace > > auxDensityXCOutRepresentationPtr, double &exchangeEnergy, double &correlationEnergy, double &excCorrPotentialTimesRho)
const MPI_Comm d_mpiCommParent
Definition energyCalculator.h:371
const dftParameters & d_dftParams
Definition energyCalculator.h:376
const MPI_Comm interBandGroupComm
Definition energyCalculator.h:374
const MPI_Comm mpi_communicator
Definition energyCalculator.h:372
dealii::ConditionalOStream pcout
parallel message stream
Definition energyCalculator.h:379
double computeEnergy(const std::shared_ptr< dftfe::basis::FEBasisOperations< dataTypes::number, double, dftfe::utils::MemorySpace::HOST > > &basisOperationsPtr, const std::shared_ptr< dftfe::basis::FEBasisOperations< double, double, dftfe::utils::MemorySpace::HOST > > &basisOperationsPtrElectro, const dftfe::uInt densityQuadratureID, const dftfe::uInt densityQuadratureIDElectro, const dftfe::uInt smearedChargeQuadratureIDElectro, const dftfe::uInt lpspQuadratureIDElectro, const std::vector< std::vector< double > > &eigenValues, const std::vector< std::vector< double > > &partialOccupancies, const std::vector< double > &kPointWeights, const double fermiEnergy, const double fermiEnergyUp, const double fermiEnergyDown, const std::shared_ptr< excManager< memorySpace > > excManagerPtr, const dispersionCorrection &dispersionCorr, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &phiTotRhoInValues, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &phiTotRhoOutValues, const distributedCPUVec< double > &phiTotRhoOut, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &densityInValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &densityOutValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &gradDensityOutValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &tauInValues, const std::vector< dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > > &tauOutValues, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &rhoOutValuesLpsp, std::shared_ptr< AuxDensityMatrix< memorySpace > > auxDensityXCInRepresentationPtr, std::shared_ptr< AuxDensityMatrix< memorySpace > > auxDensityXCOutRepresentationPtr, const std::map< dealii::CellId, std::vector< double > > &smearedbValues, const std::map< dealii::CellId, std::vector< dftfe::uInt > > &smearedbNonTrivialAtomIds, const std::vector< std::vector< double > > &localVselfs, const std::map< dealii::CellId, std::vector< double > > &pseudoLocValues, const std::map< dealii::types::global_dof_index, double > &atomElectrostaticNodeIdToChargeMap, const dftfe::uInt numberGlobalAtoms, const dftfe::uInt lowerBoundKindex, const dftfe::uInt scfConverged, const bool print, const bool smearedNuclearCharges=false)
energyCalculator(const MPI_Comm &mpi_comm_parent, const MPI_Comm &mpi_comm_domain, const MPI_Comm &interpool_comm, const MPI_Comm &interBandGroupComm, const dftParameters &dftParams)
Constructor.
Definition excManager.h:28
Definition MemoryStorage.h:33
Definition FEBasisOperations.h:30
double number
Definition dftfeDataTypes.h:42
Definition energyCalculator.h:30
double computeFieldTimesDensity(const std::shared_ptr< dftfe::basis::FEBasisOperations< T, double, dftfe::utils::MemorySpace::HOST > > &basisOperationsPtr, const dftfe::uInt quadratureId, const std::map< dealii::CellId, std::vector< double > > &fieldValues, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &densityQuadValues)
double nuclearElectrostaticEnergyResidualLocal(const distributedCPUVec< double > &phiTotRhoIn, const distributedCPUVec< double > &phiTotRhoOut, const std::map< dealii::CellId, std::vector< double > > &smearedbValues, const std::map< dealii::CellId, std::vector< dftfe::uInt > > &smearedbNonTrivialAtomIds, const dealii::DoFHandler< 3 > &dofHandlerElectrostatic, const dealii::Quadrature< 3 > &quadratureSmearedCharge, const std::map< dealii::types::global_dof_index, double > &atomElectrostaticNodeIdToChargeMap, const bool smearedNuclearCharges=false)
double localBandEnergy(const std::vector< std::vector< double > > &eigenValues, const std::vector< std::vector< double > > &partialOccupancies, const std::vector< double > &kPointWeights, const double fermiEnergy, const double fermiEnergyUp, const double fermiEnergyDown, const double TVal, const dftfe::uInt spinPolarized, const dealii::ConditionalOStream &scout, const MPI_Comm &interpoolcomm, const dftfe::uInt lowerBoundKindex, const dftfe::uInt verbosity, const dftParameters &dftParams)
double computeRepulsiveEnergy(const std::vector< std::vector< double > > &atomLocationsAndCharge, const bool isPseudopotential)
double nuclearElectrostaticEnergyLocal(const distributedCPUVec< double > &phiTotRhoOut, const std::vector< std::vector< double > > &localVselfs, const std::map< dealii::CellId, std::vector< double > > &smearedbValues, const std::map< dealii::CellId, std::vector< dftfe::uInt > > &smearedbNonTrivialAtomIds, const dealii::DoFHandler< 3 > &dofHandlerElectrostatic, const dealii::Quadrature< 3 > &quadratureElectrostatic, const dealii::Quadrature< 3 > &quadratureSmearedCharge, const std::map< dealii::types::global_dof_index, double > &atomElectrostaticNodeIdToChargeMap, const bool smearedNuclearCharges=false)
double computeFieldTimesDensityResidual(const std::shared_ptr< dftfe::basis::FEBasisOperations< T, double, dftfe::utils::MemorySpace::HOST > > &basisOperationsPtr, const dftfe::uInt quadratureId, const std::map< dealii::CellId, std::vector< double > > &fieldValues, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &densityQuadValuesIn, const dftfe::utils::MemoryStorage< double, dftfe::utils::MemorySpace::HOST > &densityQuadValuesOut)
void printEnergy(const double bandEnergy, const double totalkineticEnergy, const double totalexchangeEnergy, const double totalcorrelationEnergy, const double totalElectrostaticEnergy, const double dispersionEnergy, const double totalEnergy, const dftfe::uInt numberAtoms, const dealii::ConditionalOStream &pcout, const bool reproducibleOutput, const bool isPseudo, const dftfe::uInt verbosity, const dftParameters &dftParams)
@ HOST
Definition MemorySpaceType.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