LCOV - code coverage report
Current view: top level - src/common - physcon.F (source / functions) Hit Total Coverage
Test: CP2K Regtests (git:4dc10b3) Lines: 41 41 100.0 %
Date: 2024-11-21 06:45:46 Functions: 1 1 100.0 %

          Line data    Source code
       1             : !--------------------------------------------------------------------------------------------------!
       2             : !   CP2K: A general program to perform molecular dynamics simulations                              !
       3             : !   Copyright 2000-2024 CP2K developers group <https://cp2k.org>                                   !
       4             : !                                                                                                  !
       5             : !   SPDX-License-Identifier: GPL-2.0-or-later                                                      !
       6             : !--------------------------------------------------------------------------------------------------!
       7             : 
       8             : ! **************************************************************************************************
       9             : !> \brief Definition of physical constants:
      10             : !>
      11             : !>      a_bohr      : Bohr radius [m]
      12             : !>      a_fine      : Fine-structure constant
      13             : !>      a_mass      : Atomic mass unit [kg]; conversion factor [u] -> [kg]
      14             : !>      angstrom    : Conversion factor [Bohr] -> [Angstrom]
      15             : !>      bar         : Conversion factor [a.u.] -> [bar]
      16             : !>      bohr        : Conversion factor [Angstrom] -> [Bohr]
      17             : !>      boltzmann   : Boltzmann constant [J/K]
      18             : !>      c_light     : Speed of light in vacuum [m/s]
      19             : !>      c_light_au  : Speed of light in vacuum [a.u.]
      20             : !>      e_charge    : Elementary charge [C]
      21             : !>      e_mass      : Electron mass [kg]
      22             : !>      e_gfactor   : Electron g factor [ ]
      23             : !>      esu         : Conversion factors [a.u.] -> [esu]
      24             : !>      evolt       : Conversion factor [a.u.] -> [eV]
      25             : !>      femtoseconds: Conversion factor [a.u.] -> [fs]
      26             : !>      h_bar       : Planck constant [J*s]
      27             : !>      h_planck    : Planck constant [J*s]
      28             : !>      hertz       : Conversion factor [a.u.] -> [Hz]
      29             : !>      joule       : Conversion factor [a.u.] -> [J]
      30             : !>      kcalmol     : Conversion factor [a.u.] -> [kcal/mol]
      31             : !>      kelvin      : Conversion factor [a.u.] -> [K]
      32             : !>      kjmol       : Conversion factor [a.u.] -> [kJ/mol]
      33             : !>      massunit    : Conversion factor [u] -> [a.u.]
      34             : !>      mu_perm     : Magnetic constant or permeability of vacuum [N/A**2]
      35             : !>      n_avogadro  : Avogadro constant [1/mol]
      36             : !>      newton      : Conversion factor [a.u.] -> [N]
      37             : !>      pascal      : Conversion factor [a.u.] -> [Pa]
      38             : !>      permittivity: Electric constant or permittivity of vacuum [F/m]
      39             : !>      picoseconds : Conversion factor [a.u.] -> [ps]
      40             : !>      rydberg     : Rydberg constant [1/m]
      41             : !>      seconds     : Conversion factor [a.u.] -> [s]
      42             : !>      vibfac      : Conversion factor [a.u./Bohr**2] -> [1/cm]
      43             : !>      wavenumbers : Conversion factor [a.u.] -> [1/cm]
      44             : !>      debye       : Conversion factor [a.u.] -> Debye
      45             : !> \note
      46             : !>      Fundamental physical constants (SI units)
      47             : !>      Literature: - P. J. Mohr and B. N. Taylor,
      48             : !>                    "CODATA recommended values of the fundamental physical
      49             : !>                     constants: 1998 Rev. Mod. Phys. 72, 351-495 (2000)
      50             : !>                  - P. J. Mohr and B. N. Taylor,
      51             : !>                    "CODATA recommended values of the fundamental physical
      52             : !>                     constants: 2002", Rev. Mod. Phys. 77, 1 (2005).
      53             : !>                  - P. J. Mohr, B. N. Taylor, and D. B. Newell,
      54             : !>                    "CODATA recommended values of the fundamental physical
      55             : !>                     constants: 2006 Rev. Mod. Phys. 80, 633 (2008)
      56             : !>                  - P. J. Mohr, B. N. Taylor, and D. B. Newell,
      57             : !>                    "CODATA recommended values of the fundamental physical
      58             : !>                     constants: 2010", Rev. Mod. Phys. 84, 1527-1605 (2012)
      59             : !> \par History
      60             : !>      - Adapted for use in CP2K (JGH)
      61             : !>      - Updated to CODATA 1998 and cleaned (05.09.2003,MK)
      62             : !>      - Updated to CODATA 2006. (26.03.2008,AK)
      63             : !>      - Updated to CODATA 2010. (10.12.2012,MK)
      64             : !>      - Turned constants into Fortran parameters (2014, Ole Schuett)
      65             : !>      - Remove all but CODATA 2006 (2015, Ole Schuett)
      66             : !> \author Matthias Krack (MK)
      67             : ! **************************************************************************************************
      68             : MODULE physcon
      69             : 
      70             :    USE kinds,                           ONLY: dp
      71             :    USE mathconstants,                   ONLY: pi
      72             : 
      73             :    IMPLICIT NONE
      74             : 
      75             :    PRIVATE
      76             : 
      77             :    PUBLIC :: a_bohr, a_fine, a_mass, angstrom, atm, bar, bohr, boltzmann, c_light_au, &
      78             :              debye, e_charge, e_gfactor, e_mass, evolt, femtoseconds, h_bar, &
      79             :              hertz, joule, kcalmol, kelvin, kjmol, massunit, mu_perm, n_avogadro, newton, &
      80             :              p_mass, pascal, picoseconds, seconds, vibfac, wavenumbers
      81             : 
      82             :    PUBLIC :: write_physcon
      83             : 
      84             :    ! CP2K uses the CODATA from 2006
      85             : 
      86             :    ! Exact constants
      87             :    ! Speed of light in vacuum [m/s]
      88             :    REAL(KIND=dp), PARAMETER :: c_light = 299792458.0_dp
      89             :    ! Speed of light in vacuum, in atomic units (=1/a_fine)
      90             :    REAL(KIND=dp), PARAMETER :: c_light_au = 137.035999679_dp
      91             : 
      92             :    ! Magnetic constant or permeability of vacuum [N/A**2]
      93             :    REAL(KIND=dp), PARAMETER :: mu_perm = 4.0_dp*pi*1.0E-7_dp
      94             : 
      95             :    ! Electric constant or permittivity of vacuum [F/m]
      96             :    REAL(KIND=dp), PARAMETER :: permittivity = 1.0_dp/(mu_perm*c_light**2)
      97             : 
      98             :    ! Recommended fundamental constants of physics
      99             :    ! and chemistry based on the 2006 adjustment
     100             : 
     101             :    ! Planck constant [J*s]
     102             :    REAL(KIND=dp), PARAMETER :: h_planck = 6.62606896E-34_dp
     103             :    REAL(KIND=dp), PARAMETER :: h_bar = h_planck/(2.0_dp*pi)
     104             : 
     105             :    ! Elementary charge [C]
     106             :    REAL(KIND=dp), PARAMETER :: e_charge = 1.602176487E-19_dp
     107             : 
     108             :    ! Electron mass [kg]
     109             :    REAL(KIND=dp), PARAMETER :: e_mass = 9.10938215E-31_dp
     110             : 
     111             :    ! Proton mass [kg]
     112             :    REAL(KIND=dp), PARAMETER :: p_mass = 1.672621637E-27_dp
     113             : 
     114             :    ! Electron g factor [ ]
     115             :    REAL(KIND=dp), PARAMETER :: e_gfactor = -2.0023193043622_dp
     116             : 
     117             :    ! Fine-structure constant
     118             : !MK a_fine = 0.5_dp*mu_perm*c_light*e_charge**2/h_planck
     119             :    REAL(KIND=dp), PARAMETER :: a_fine = 7.2973525376E-3_dp
     120             : 
     121             :    ! Rydberg constant [1/m]
     122             : !MK rydberg = 0.5_dp*e_mass*c_light*a_fine**2/h_planck
     123             :    REAL(KIND=dp), PARAMETER :: rydberg = 10973731.568527_dp
     124             : 
     125             :    ! Avogadro constant [1/mol]
     126             :    REAL(KIND=dp), PARAMETER :: n_avogadro = 6.02214179E+23_dp
     127             : 
     128             :    ! Boltzmann constant [J/K]
     129             :    REAL(KIND=dp), PARAMETER :: boltzmann = 1.3806504E-23_dp
     130             : 
     131             :    ! Atomic mass unit [kg]; conversion factor [u] -> [kg]
     132             :    REAL(KIND=dp), PARAMETER :: a_mass = 1.660538782E-27_dp
     133             : 
     134             :    ! Bohr radius [m]
     135             : !MK a_bohr = a_fine/(4.0_dp*pi*rydberg)
     136             :    REAL(KIND=dp), PARAMETER :: a_bohr = 0.52917720859E-10_dp
     137             : 
     138             :    ! Conversion factors
     139             : 
     140             :    ! [u] -> [a.u.]
     141             :    REAL(KIND=dp), PARAMETER :: massunit = a_mass/e_mass
     142             : 
     143             :    ! [Bohr] -> [Angstrom]
     144             :    REAL(KIND=dp), PARAMETER :: angstrom = 1.0E+10_dp*a_bohr
     145             : 
     146             :    ! [Angstrom] -> [Bohr]
     147             :    REAL(KIND=dp), PARAMETER :: bohr = 1.0_dp/angstrom
     148             : 
     149             :    ! [a.u.] -> [s]
     150             :    REAL(KIND=dp), PARAMETER :: seconds = 1.0_dp/(4.0_dp*pi*rydberg*c_light)
     151             : 
     152             :    ! [a.u.] -> [fs]
     153             :    REAL(KIND=dp), PARAMETER :: femtoseconds = 1.0E+15_dp*seconds
     154             : 
     155             :    ! [a.u.] -> [ps]
     156             :    REAL(KIND=dp), PARAMETER :: picoseconds = 1.0E+12_dp*seconds
     157             : 
     158             :    ! [a.u.] -> [J]
     159             :    REAL(KIND=dp), PARAMETER :: joule = 2.0_dp*rydberg*h_planck*c_light
     160             : 
     161             :    ! [a.u.] -> [N]
     162             :    REAL(KIND=dp), PARAMETER :: newton = joule/a_bohr
     163             : 
     164             :    ! [a.u.] -> [K]
     165             :    REAL(KIND=dp), PARAMETER :: kelvin = joule/boltzmann
     166             : 
     167             :    ! [a.u.] -> [kJ/mol]
     168             :    REAL(KIND=dp), PARAMETER :: kjmol = 0.001_dp*joule*n_avogadro
     169             : 
     170             :    ! [a.u.] -> [kcal/mol]
     171             :    REAL(KIND=dp), PARAMETER :: kcalmol = kjmol/4.184_dp
     172             : 
     173             :    ! [a.u.] -> [Pa]
     174             :    REAL(KIND=dp), PARAMETER :: pascal = joule/a_bohr**3
     175             : 
     176             :    ! [a.u.] -> [bar]
     177             :    REAL(KIND=dp), PARAMETER :: bar = pascal/1.0E+5_dp
     178             : 
     179             :    ! [a.u.] -> [atm]
     180             :    REAL(KIND=dp), PARAMETER :: atm = pascal/1.013250E+5_dp
     181             : 
     182             :    ! [a.u.] -> [eV]
     183             :    REAL(KIND=dp), PARAMETER :: evolt = joule/e_charge
     184             : 
     185             :    ! [a.u.] -> [Hz]
     186             :    REAL(KIND=dp), PARAMETER :: hertz = joule/h_planck
     187             : 
     188             :    ! [a.u./Bohr**2] -> [1/cm] (wave numbers)
     189             :    REAL(KIND=dp), PARAMETER :: vibfac = 5.0_dp*SQRT(kjmol)/(pi*a_bohr*c_light)
     190             : 
     191             :    ! [a.u.] -> [1/cm] (wave numbers)
     192             :    REAL(KIND=dp), PARAMETER :: wavenumbers = 0.02_dp*rydberg
     193             : 
     194             :    ! [a.u.] -> [esu] (electrostatic units)
     195             :    REAL(KIND=dp), PARAMETER :: esu_1 = 1.0E+21_dp*a_bohr*c_light*e_charge
     196             :    !REAL(KIND=dp), PARAMETER :: esu_2  = esu_1/bohr
     197             :    !REAL(KIND=dp), PARAMETER :: esu_3  = esu_2/bohr
     198             :    !REAL(KIND=dp), PARAMETER :: esu(3) = (/ esu_1, esu_2, esu_3 /)
     199             : 
     200             :    ! [a.u.] -> [debye] (electrostatic units)
     201             :    REAL(KIND=dp), PARAMETER :: debye = esu_1
     202             : 
     203             : CONTAINS
     204             : 
     205             : ! **************************************************************************************************
     206             : !> \brief  Write all basic physical constants used by CP2K to a logical
     207             : !>           output unit.
     208             : !> \param output_unit ...
     209             : !> \date    14.11.2000
     210             : !> \par History
     211             : !>       - Updated to CODATA 1998 and cleaned (05.09.2003,MK)
     212             : !>       - Updated to CODATA 2006. (26.03.2008,AK)
     213             : !> \author  JGH
     214             : !> \version 1.1
     215             : ! **************************************************************************************************
     216        2508 :    SUBROUTINE write_physcon(output_unit)
     217             : 
     218             :       INTEGER, INTENT(IN)                                :: output_unit
     219             : 
     220             :       WRITE (UNIT=output_unit, FMT="(T2,/,T2,A,/,/,(T2,A))") &
     221        2508 :          "*** Fundamental physical constants (SI units) ***", &
     222        2508 :          "*** Literature: B. J. Mohr and B. N. Taylor,", &
     223        2508 :          "***             CODATA recommended values of the fundamental physical", &
     224        2508 :          "***             constants: 2006, Web Version 5.1", &
     225        5016 :          "***             http://physics.nist.gov/constants"
     226             : 
     227             :       WRITE (UNIT=output_unit, FMT="(/,T2,A,T61,ES20.14)") &
     228        2508 :          "Speed of light in vacuum [m/s]", c_light
     229             :       WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.14)") &
     230        2508 :          "Magnetic constant or permeability of vacuum [N/A**2]", mu_perm
     231             :       WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.14)") &
     232        2508 :          "Electric constant or permittivity of vacuum [F/m]", permittivity
     233             :       WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.14)") &
     234        2508 :          "Planck constant (h) [J*s]", h_planck
     235             :       WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.14)") &
     236        2508 :          "Planck constant (h-bar) [J*s]", h_bar
     237             :       WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.14)") &
     238        2508 :          "Elementary charge [C]", e_charge
     239             :       WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.14)") &
     240        2508 :          "Electron mass [kg]", e_mass
     241             :       WRITE (UNIT=output_unit, FMT="(T2,A,T60,ES21.14)") &
     242        2508 :          "Electron g factor [ ]", e_gfactor
     243             :       WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.14)") &
     244        2508 :          "Proton mass [kg]", p_mass
     245             :       WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.14)") &
     246        2508 :          "Fine-structure constant", a_fine
     247             :       WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.14)") &
     248        2508 :          "Rydberg constant [1/m]", rydberg
     249             :       WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.14)") &
     250        2508 :          "Avogadro constant [1/mol]", n_avogadro
     251             :       WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.14)") &
     252        2508 :          "Boltzmann constant [J/K]", boltzmann
     253             :       WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.14)") &
     254        2508 :          "Atomic mass unit [kg]", a_mass
     255             :       WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.14)") &
     256        2508 :          "Bohr radius [m]", a_bohr
     257             : 
     258             :       ! Conversion factors
     259             : 
     260             :       WRITE (UNIT=output_unit, FMT="(/,T2,A,/)") &
     261        2508 :          "*** Conversion factors ***"
     262             : 
     263             :       WRITE (UNIT=output_unit, FMT="(T2,A,T61,ES20.14)") &
     264        2508 :          "[u] -> [a.u.]", massunit, &
     265        2508 :          "[Angstrom] -> [Bohr] = [a.u.]", bohr, &
     266        2508 :          "[a.u.] = [Bohr] -> [Angstrom]", angstrom, &
     267        2508 :          "[a.u.] -> [s]", seconds, &
     268        2508 :          "[a.u.] -> [fs]", femtoseconds, &
     269        2508 :          "[a.u.] -> [J]", joule, &
     270        2508 :          "[a.u.] -> [N]", newton, &
     271        2508 :          "[a.u.] -> [K]", kelvin, &
     272        2508 :          "[a.u.] -> [kJ/mol]", kjmol, &
     273        2508 :          "[a.u.] -> [kcal/mol]", kcalmol, &
     274        2508 :          "[a.u.] -> [Pa]", pascal, &
     275        2508 :          "[a.u.] -> [bar]", bar, &
     276        2508 :          "[a.u.] -> [atm]", atm, &
     277        2508 :          "[a.u.] -> [eV]", evolt, &
     278        2508 :          "[a.u.] -> [Hz]", hertz, &
     279        2508 :          "[a.u.] -> [1/cm] (wave numbers)", wavenumbers, &
     280        5016 :          "[a.u./Bohr**2] -> [1/cm]", vibfac
     281        2508 :       WRITE (UNIT=output_unit, FMT="(T2,A)") ""
     282             : 
     283        2508 :    END SUBROUTINE write_physcon
     284             : 
     285             : END MODULE physcon

Generated by: LCOV version 1.15