From 79f1a420a4c7c2a3a91859779b81c237378beca4 Mon Sep 17 00:00:00 2001 From: Nils Wittemeier Date: Mon, 22 Apr 2024 16:42:41 +0200 Subject: [PATCH 1/8] Move periodic table definition to dictionary - Adds new dependency 'fhash' - Adds a new data type isotopes - Moves definition of isotopes to 'params' module - Moves definition of precisions to new module 'precision' --- fpm.toml | 1 + src/autodiff.f90 | 2 +- src/bte.f90 | 3 +- src/bz_sums.f90 | 3 +- src/crystal.f90 | 3 +- src/delta.f90 | 2 +- src/electron.f90 | 2 +- src/eliashberg.f90 | 2 +- src/green.f90 | 3 +- src/interactions.f90 | 3 +- src/m_isotopes.f90 | 37 ++++ src/migel_sc.f90 | 3 +- src/misc.f90 | 3 +- src/nano.f90 | 3 +- src/numerics.f90 | 3 +- src/params.f90 | 395 ++++++++++++++++++++++++++++++++++++++--- src/particle.f90 | 2 +- src/phonon.f90 | 3 +- src/phonon_defect.f90 | 3 +- src/precision.f90 | 10 ++ src/resource.f90 | 2 +- src/symmetry.f90 | 2 +- src/wannier.f90 | 3 +- test/test_autodiff.f90 | 2 +- 24 files changed, 454 insertions(+), 41 deletions(-) create mode 100644 src/m_isotopes.f90 create mode 100644 src/precision.f90 diff --git a/fpm.toml b/fpm.toml index cf25361a..9ee8afed 100644 --- a/fpm.toml +++ b/fpm.toml @@ -17,6 +17,7 @@ source-dir="src" #Pull from github #testify = { git = "git@github.com:nakib/testify.git" } testify = {path = "thirdparty/testify"} +fhash = { git = "https://github.com/LKedward/fhash.git" } #Use local copy from thirdparty directory spglib = {path = "thirdparty/spglib"} diff --git a/src/autodiff.f90 b/src/autodiff.f90 index 65a99cc2..78678ac3 100644 --- a/src/autodiff.f90 +++ b/src/autodiff.f90 @@ -19,7 +19,7 @@ module autodiff_m !! automatic differentiation. At the moment, only the real(64) !! kind is supported along with just the basis arithmetic operations. - use params, only: r64 + use precision, only: r64 implicit none diff --git a/src/bte.f90 b/src/bte.f90 index f1234c1e..d7177b19 100644 --- a/src/bte.f90 +++ b/src/bte.f90 @@ -18,7 +18,8 @@ module bte_module !! Module containing type and procedures related to the solution of the !! Boltzmann transport equation (BTE). - use params, only: r64, i64, qe, kB, hbar_eVps + use precision, only: r64, i64 + use params, only: qe, kB, hbar_eVps use misc, only: print_message, exit_with_message, write2file_rank2_real, & distribute_points, demux_state, binsearch, interpolate, demux_vector, mux_vector, & trace, subtitle, append2file_transport_tensor, write2file_response, & diff --git a/src/bz_sums.f90 b/src/bz_sums.f90 index 8dc4ac26..35890cf2 100644 --- a/src/bz_sums.f90 +++ b/src/bz_sums.f90 @@ -17,7 +17,8 @@ module bz_sums !! Module containing the procedures to do Brillouin zone sums. - use params, only: r64, i64, kB, qe, pi, hbar_eVps, perm0, twopi, oneI, bohr2nm + use precision, only: r64, i64 + use params, only: kB, qe, pi, hbar_eVps, perm0, twopi, oneI, bohr2nm use misc, only: exit_with_message, print_message, write2file_rank2_real, & distribute_points, Bose, Fermi, binsearch, mux_vector, twonorm, linspace, & write2file_rank1_real diff --git a/src/crystal.f90 b/src/crystal.f90 index 160177d2..221b9a4b 100644 --- a/src/crystal.f90 +++ b/src/crystal.f90 @@ -17,7 +17,8 @@ module crystal_module !! Module containing type and procedures related to the crystal structure. - use params, only: r64, i64, twopi + use precision, only: r64, i64 + use params, only: twopi use misc, only: exit_with_message, print_message, cross_product, demux_vector, & subtitle, trace diff --git a/src/delta.f90 b/src/delta.f90 index 4389488a..4dab8a83 100644 --- a/src/delta.f90 +++ b/src/delta.f90 @@ -17,7 +17,7 @@ module delta !! Module containing the procedures related to delta function evaulation. - use params, only: r64, i64 + use precision, only: r64, i64 use crystal_module, only: crystal use wannier_module, only: wannier use misc, only: exit_with_message, print_message, demux_vector, mux_vector, & diff --git a/src/electron.f90 b/src/electron.f90 index 72e95fc9..3da12514 100644 --- a/src/electron.f90 +++ b/src/electron.f90 @@ -17,7 +17,7 @@ module electron_module !! Module containing types and procedures related to the electronic properties. - use params, only: r64, i64 + use precision, only: r64, i64 use particle_module, only: particle use misc, only: exit_with_message, print_message, demux_state, sort, & binsearch, subtitle, Fermi, write2file_rank2_real, write2file_rank3_real diff --git a/src/eliashberg.f90 b/src/eliashberg.f90 index 48e7a627..70708a08 100644 --- a/src/eliashberg.f90 +++ b/src/eliashberg.f90 @@ -18,7 +18,7 @@ module eliashberg !! Module containing the procedures related to the computation of the Eliashberg !! spectral function a2F and the e-ph coupling factor lambda. - use params, only: i64, r64 + use precision, only: i64, r64 use misc, only: exit_with_message, print_message, distribute_points, & demux_state, mux_vector, write2file_rank1_real, write2file_rank2_real, & compsimps diff --git a/src/green.f90 b/src/green.f90 index 7923fd30..1af7d4be 100644 --- a/src/green.f90 +++ b/src/green.f90 @@ -17,7 +17,8 @@ module Green_function !! Module containing Green's function related procedures. - use params, only: i64, r64, pi, oneI, twopi, hbar_eVps + use precision, only: i64, r64 + use params, only: pi, oneI, twopi, hbar_eVps use electron_module, only: electron use phonon_module, only: phonon use crystal_module, only: crystal diff --git a/src/interactions.f90 b/src/interactions.f90 index 562d1f2d..c82e564b 100644 --- a/src/interactions.f90 +++ b/src/interactions.f90 @@ -21,7 +21,8 @@ module interactions use openacc #endif - use params, only: i64, r64, pi, twopi, amu, qe, hbar_eVps, perm0, oneI + use precision, only: i64, r64 + use params, only: pi, twopi, amu, qe, hbar_eVps, perm0, oneI use misc, only: exit_with_message, print_message, distribute_points, & demux_state, mux_vector, mux_state, expi, Bose, binsearch, Fermi, & twonorm, write2file_rank2_real, demux_vector, interpolate, expm1, & diff --git a/src/m_isotopes.f90 b/src/m_isotopes.f90 new file mode 100644 index 00000000..f3192e47 --- /dev/null +++ b/src/m_isotopes.f90 @@ -0,0 +1,37 @@ +module m_isotopes + + use precision, only: r64 + + implicit none + + private + public :: isotopes + + type isotopes + integer :: numisotopes = 0 + real(r64), allocatable :: masses(:) + real(r64), allocatable :: abundances(:) + contains + !TODO Add getters for: + !VCA mass + !VCA g-factor + !DIB mass + !DIB g-factor + end type isotopes + + interface isotopes + module procedure :: constructor + end interface isotopes + +contains + + function constructor(masses, abundances) result(this) + real(r64), intent(in) :: masses(:), abundances(:) + type(isotopes) :: this + + this%numisotopes = size(masses) + allocate(this%masses(this%numisotopes), this%abundances(this%numisotopes)) + this%masses = masses + this%abundances = abundances + end function constructor +end module m_isotopes diff --git a/src/migel_sc.f90 b/src/migel_sc.f90 index 92731e96..8b7f45bc 100644 --- a/src/migel_sc.f90 +++ b/src/migel_sc.f90 @@ -18,7 +18,8 @@ module MigEl_sc_module !! Module containing types and procedures related to the !! Migdal-Eliashberg (MigEl) solver environment. - use params, only: r64, i64, pi, kB, oneI + use precision, only: r64, i64 + use params, only: pi, kB, oneI use misc, only: subtitle, print_message, exit_with_message, write2file_rank1_real, & twonorm, distribute_points, Pade_continued, demux_state, mux_state use numerics_module, only: numerics diff --git a/src/misc.f90 b/src/misc.f90 index 46ce58ac..8c507b58 100644 --- a/src/misc.f90 +++ b/src/misc.f90 @@ -17,7 +17,8 @@ module misc !! Module containing miscellaneous math and numerics related functions and subroutines. - use params, only: r128, r64, i64, kB, twopi + use precision, only: r128, r64, i64 + use params, only: kB, twopi implicit none diff --git a/src/nano.f90 b/src/nano.f90 index 531dae10..8d0268df 100644 --- a/src/nano.f90 +++ b/src/nano.f90 @@ -24,7 +24,8 @@ module nano_module !! particles at reference equilibrium of the absorbing wall). !! See the subroutine compute_suppression for more information !! - use params, only: r64, i64, pi + use precision, only: r64, i64 + use params, only: pi use misc, only: print_message, exit_with_message use symmetry_module, only: symmetry use phonon_module, only: phonon diff --git a/src/numerics.f90 b/src/numerics.f90 index 7bc4426b..2b623a20 100644 --- a/src/numerics.f90 +++ b/src/numerics.f90 @@ -17,7 +17,8 @@ module numerics_module !! Module containing type and procedures related to the numerics. - use params, only: r64, i64, twopi + use precision, only: r64, i64 + use params, only: twopi use misc, only: exit_with_message, subtitle use crystal_module, only: crystal diff --git a/src/params.f90 b/src/params.f90 index 8ada8962..65179da0 100644 --- a/src/params.f90 +++ b/src/params.f90 @@ -17,13 +17,11 @@ module params !! Module containing various parameters and constants. - use iso_fortran_env, only: real64, real128, int64 - - implicit none + use precision + use fhash, only: fhash_tbl_t, key => fhash_key + use m_isotopes, only: isotopes - integer, parameter :: r64 = real64 - integer, parameter :: r128 = real128 - integer, parameter :: i64 = int64 + implicit none !Physical constants: real(r64), parameter :: qe = 1.602176634e-19_r64 @@ -36,7 +34,7 @@ module params !! Reduced Planck's constant (J/THz = J.ps) real(r64), parameter :: hbar_eVps = hbar/qe !! Reduced Planck's constant (eV/THz = eV.ps) - real(r64), parameter :: perm0 = 8.854187817e-12_r64 + real(r64), parameter :: perm0 = 8.854187817e-12_r64 !! Permittivity of free space (F/m) real(r64), parameter :: kB = 1.380649e-23_r64/qe !! Boltzmann constant (eV/K) @@ -52,23 +50,378 @@ module params real(r64), parameter :: Ryd2eV = 0.5_r64*Hartree2eV !Rydberg to eV real(r64), parameter :: Ryd2meV = Ryd2eV*1.0e3_r64 !Rydberg to meV real(r64), parameter :: Ryd2amu = 2.0_r64*me/amu !Rydberg mass to amu - real(r64), parameter :: bohr2nm=0.052917721092_r64 !Bohr to nm + real(r64), parameter :: bohr2nm = 0.052917721092_r64 !Bohr to nm !Miscellaneous complex(r64), parameter :: oneI = (0.0_r64,1.0_r64) complex(r64), parameter :: twopiI = twopi*oneI - !The code below is adapted from ShengBTE (file data.f90): - - !Periodic table from ShengBTE - character(len = 3), parameter :: periodic_table(114)=[character(len=3) :: & - "H","He","Li","Be","B","C","N","O", & - "F","Ne","Na","Mg","Al","Si","P","S","Cl","Ar","K","Ca","Sc","Ti","V", & - "Cr","Mn","Fe","Co","Ni","Cu","Zn","Ga","Ge","As","Se","Br","Kr","Rb", & - "Sr","Y","Zr","Nb","Mo","Tc","Ru","Rh","Pd","Ag","Cd","In","Sn","Sb", & - "Te","I","Xe","Cs","Ba","La","Ce","Pr","Nd","Pm","Sm","Eu","Gd","Tb", & - "Dy","Ho","Er","Tm","Yb","Lu","Hf","Ta","W","Re","Os","Ir","Pt","Au","Hg", & - "Tl","Pb","Bi","Po","At","Rn","Fr","Ra","Ac","Th","Pa","U","Np","Pu","Am", & - "Cm","Bk","Cf","Es","Fm","Md","No","Lr","Rf","Db","Sg","Bh","Hs","Mt","Ds" ,& - "Rg","Cn","Uuq","Uuh"] + !Not parameters, but effectively behaves as parameters + logical, private :: periodic_table_exists = .false. + type(fhash_tbl_t), private :: periodic_table + +contains + + function lookup_periodic_table(element) result(data) + character(*), intent(in) :: element + type(isotopes) :: data + + class(*), allocatable :: raw_data + + if (.not. periodic_table_exists) then + call create_periodic_table(periodic_table) + periodic_table_exists = .true. + end if + + call periodic_table%get_raw(key(element), raw_data) + + select type (raw_data) + type is (isotopes) + data = raw_data + class default + print *, 'Error in reading periodic table for element ' // element // '.' + end select + end function lookup_periodic_table + + subroutine create_periodic_table(periodic_table) + type(fhash_tbl_t), intent(out) :: periodic_table + + call periodic_table%set( & + key('Ag'), value=isotopes( & + [106.905095_r64, 108.904754_r64], & + [51.84_r64, 48.16_r64])) + call periodic_table%set( & + key('Al'), value=isotopes( & + [26.981541_r64], & + [100.0_r64])) + call periodic_table%set( & + key('Ar'), value=isotopes( & + [35.967546_r64, 37.962732_r64, 39.962383_r64], & + [0.34_r64, 0.063_r64, 99.6_r64])) + call periodic_table%set( & + key('As'), value=isotopes( & + [74.921596_r64], & + [100.0_r64])) + call periodic_table%set( & + key('Au'), value=isotopes( & + [196.96656_r64], & + [100.0_r64])) + call periodic_table%set( & + key('B'), value=isotopes( & + [10.012938_r64, 11.009305_r64], & + [19.8_r64, 80.2_r64])) + call periodic_table%set( & + key('Ba'), value=isotopes( & + [129.906277_r64, 131.905042_r64, 133.90449_r64, 134.905668_r64, 135.904556_r64, 136.905816_r64, 137.905236_r64], & + [0.11_r64, 0.1_r64, 2.42_r64, 6.59_r64, 7.85_r64, 11.23_r64, 71.7_r64])) + call periodic_table%set( & + key('Be'), value=isotopes( & + [9.012183_r64], & + [100.0_r64])) + call periodic_table%set( & + key('Bi'), value=isotopes( & + [208.980388_r64], & + [100.0_r64])) + call periodic_table%set( & + key('Br'), value=isotopes( & + [78.918336_r64, 80.91629_r64], & + [50.69_r64, 49.31_r64])) + call periodic_table%set( & + key('C'), value=isotopes( & + [12.0_r64, 13.003355_r64], & + [98.9_r64, 1.1_r64])) + call periodic_table%set( & + key('Ca'), value=isotopes( & + [39.962591_r64, 41.958622_r64, 42.95877_r64, 43.955485_r64, 45.953689_r64, 47.952532_r64], & + [96.95_r64, 0.65_r64, 0.14_r64, 2.086_r64, 0.004_r64, 0.19_r64])) + call periodic_table%set( & + key('Cd'), value=isotopes( & + [105.906461_r64, 107.904186_r64, 109.903007_r64, 110.904182_r64, 111.902761_r64, 112.904401_r64, 113.903361_r64, & + 115.904758_r64], & + [1.25_r64, 0.89_r64, 12.49_r64, 12.8_r64, 24.13_r64, 12.22_r64, 28.73_r64, 7.49_r64])) + call periodic_table%set( & + key('Ce'), value=isotopes( & + [135.90714_r64, 137.905996_r64, 139.905442_r64, 141.909249_r64], & + [0.19_r64, 0.25_r64, 88.48_r64, 11.08_r64])) + call periodic_table%set( & + key('Cl'), value=isotopes( & + [34.968853_r64, 36.965903_r64], & + [75.77_r64, 24.23_r64])) + call periodic_table%set( & + key('Co'), value=isotopes( & + [58.933198_r64], & + [100.0_r64])) + call periodic_table%set( & + key('Cr'), value=isotopes( & + [49.946046_r64, 51.94051_r64, 52.940651_r64, 53.938882_r64], & + [4.35_r64, 83.79_r64, 9.5_r64, 2.36_r64])) + call periodic_table%set( & + key('Cs'), value=isotopes( & + [132.905433_r64], & + [100.0_r64])) + call periodic_table%set( & + key('Cu'), value=isotopes( & + [62.929599_r64, 64.927792_r64], & + [69.17_r64, 30.83_r64])) + call periodic_table%set( & + key('Dy'), value=isotopes( & + [155.924287_r64, 157.924412_r64, 159.925203_r64, 160.926939_r64, 161.926805_r64, 162.928737_r64, 163.929183_r64], & + [0.06_r64, 0.1_r64, 2.34_r64, 18.9_r64, 25.5_r64, 24.9_r64, 28.2_r64])) + call periodic_table%set( & + key('Er'), value=isotopes( & + [161.928787_r64, 163.929211_r64, 165.930305_r64, 166.932061_r64, 167.932383_r64, 169.935476_r64], & + [0.14_r64, 1.61_r64, 33.6_r64, 22.95_r64, 26.8_r64, 14.9_r64])) + call periodic_table%set( & + key('Eu'), value=isotopes( & + [150.91986_r64, 152.921243_r64], & + [47.8_r64, 52.2_r64])) + call periodic_table%set( & + key('F'), value=isotopes( & + [18.998403_r64], & + [100.0_r64])) + call periodic_table%set( & + key('Fe'), value=isotopes( & + [53.939612_r64, 55.934939_r64, 56.935396_r64, 57.933278_r64], & + [5.8_r64, 91.72_r64, 2.2_r64, 0.28_r64])) + call periodic_table%set( & + key('Ga'), value=isotopes( & + [68.925581_r64, 70.924701_r64], & + [60.1_r64, 39.9_r64])) + call periodic_table%set( & + key('Gd'), value=isotopes( & + [151.919803_r64, 153.920876_r64, 154.822629_r64, 155.92213_r64, 156.923967_r64, 157.924111_r64, 159.927061_r64], & + [0.2_r64, 2.18_r64, 14.8_r64, 20.47_r64, 15.65_r64, 24.84_r64, 21.86_r64])) + call periodic_table%set( & + key('Ge'), value=isotopes( & + [69.92425_r64, 71.92208_r64, 72.923464_r64, 73.921179_r64, 75.921403_r64], & + [20.5_r64, 27.4_r64, 7.8_r64, 36.5_r64, 7.8_r64])) + call periodic_table%set( & + key('H'), value=isotopes( & + [1.007825_r64, 2.014102_r64], & + [99.99_r64, 0.015_r64])) + call periodic_table%set( & + key('He'), value=isotopes( & + [3.016029_r64, 4.002603_r64], & + [0.0001_r64, 100.0_r64])) + call periodic_table%set( & + key('Hf'), value=isotopes( & + [173.940065_r64, 175.94142_r64, 176.943233_r64, 177.94371_r64, 178.945827_r64, 179.946561_r64], & + [0.16_r64, 5.2_r64, 18.6_r64, 27.1_r64, 13.74_r64, 35.2_r64])) + call periodic_table%set( & + key('Hg'), value=isotopes( & + [195.965812_r64, 197.96676_r64, 198.968269_r64, 199.968316_r64, 200.970293_r64, 201.970632_r64, 203.973481_r64], & + [0.15_r64, 10.1_r64, 17.0_r64, 23.1_r64, 13.2_r64, 29.65_r64, 6.8_r64])) + call periodic_table%set( & + key('Ho'), value=isotopes( & + [164.930332_r64], & + [100.0_r64])) + call periodic_table%set( & + key('I'), value=isotopes( & + [126.904477_r64], & + [100.0_r64])) + call periodic_table%set( & + key('In'), value=isotopes( & + [112.904056_r64, 114.903875_r64], & + [4.3_r64, 95.7_r64])) + call periodic_table%set( & + key('Ir'), value=isotopes( & + [190.960603_r64, 192.962942_r64], & + [37.3_r64, 62.7_r64])) + call periodic_table%set( & + key('K'), value=isotopes( & + [38.963708_r64, 39.963999_r64, 40.961825_r64], & + [93.2_r64, 0.012_r64, 6.73_r64])) + call periodic_table%set( & + key('Kr'), value=isotopes( & + [77.920397_r64, 79.916375_r64, 81.913483_r64, 82.914134_r64, 83.911506_r64, 85.910614_r64], & + [0.35_r64, 2.25_r64, 11.6_r64, 11.5_r64, 57.0_r64, 17.3_r64])) + call periodic_table%set( & + key('La'), value=isotopes( & + [137.907114_r64, 138.906355_r64], & + [0.09_r64, 99.91_r64])) + call periodic_table%set( & + key('Li'), value=isotopes( & + [6.015123_r64, 7.016005_r64], & + [7.42_r64, 92.58_r64])) + call periodic_table%set( & + key('Lu'), value=isotopes( & + [174.940785_r64, 175.942694_r64], & + [97.4_r64, 2.6_r64])) + call periodic_table%set( & + key('Mg'), value=isotopes( & + [23.985045_r64, 24.985839_r64, 25.982595_r64], & + [78.9_r64, 10.0_r64, 11.1_r64])) + call periodic_table%set( & + key('Mn'), value=isotopes( & + [54.938046_r64], & + [100.0_r64])) + call periodic_table%set( & + key('Mo'), value=isotopes( & + [91.906809_r64, 93.905086_r64, 94.905838_r64, 95.904676_r64, 96.906018_r64, 97.905405_r64, 99.907473_r64], & + [14.84_r64, 9.25_r64, 15.92_r64, 16.68_r64, 9.55_r64, 24.13_r64, 9.63_r64])) + call periodic_table%set( & + key('N'), value=isotopes( & + [14.003074_r64, 15.000109_r64], & + [99.63_r64, 0.37_r64])) + call periodic_table%set( & + key('Na'), value=isotopes( & + [22.98977_r64], & + [100.0_r64])) + call periodic_table%set( & + key('Nb'), value=isotopes( & + [92.906378_r64], & + [100.0_r64])) + call periodic_table%set( & + key('Nd'), value=isotopes( & + [141.907731_r64, 142.909823_r64, 143.910096_r64, 144.912582_r64, 145.913126_r64, 147.916901_r64, 149.9209_r64], & + [27.13_r64, 12.18_r64, 23.8_r64, 8.3_r64, 17.19_r64, 5.76_r64, 5.64_r64])) + call periodic_table%set( & + key('Ne'), value=isotopes( & + [19.992439_r64, 20.993845_r64, 21.991384_r64], & + [90.6_r64, 0.26_r64, 9.2_r64])) + call periodic_table%set( & + key('Ni'), value=isotopes( & + [57.935347_r64, 59.930789_r64, 60.931059_r64, 61.928346_r64, 63.927968_r64], & + [68.27_r64, 26.1_r64, 1.13_r64, 3.59_r64, 0.91_r64])) + call periodic_table%set( & + key('O'), value=isotopes( & + [15.994915_r64, 16.999131_r64, 17.999159_r64], & + [99.76_r64, 0.038_r64, 0.2_r64])) + call periodic_table%set( & + key('Os'), value=isotopes( & + [183.952514_r64, 185.953852_r64, 186.955762_r64, 187.95585_r64, 188.958156_r64, 189.958455_r64, 191.961487_r64], & + [0.02_r64, 1.58_r64, 1.6_r64, 13.3_r64, 16.1_r64, 26.4_r64, 41.0_r64])) + call periodic_table%set( & + key('P'), value=isotopes( & + [30.973763_r64], & + [100.0_r64])) + call periodic_table%set( & + key('Pb'), value=isotopes( & + [203.973037_r64, 205.974455_r64, 206.975885_r64, 207.976641_r64], & + [1.4_r64, 24.1_r64, 22.1_r64, 52.4_r64])) + call periodic_table%set( & + key('Pd'), value=isotopes( & + [101.905609_r64, 103.904026_r64, 104.905075_r64, 105.903475_r64, 107.903894_r64, 109.905169_r64], & + [1.02_r64, 11.14_r64, 22.33_r64, 27.33_r64, 26.46_r64, 11.72_r64])) + call periodic_table%set( & + key('Pr'), value=isotopes( & + [140.907657_r64], & + [100.0_r64])) + call periodic_table%set( & + key('Pt'), value=isotopes( & + [189.959937_r64, 191.961049_r64, 193.962679_r64, 194.964785_r64, 195.964947_r64, 197.967879_r64], & + [0.01_r64, 0.79_r64, 32.9_r64, 33.8_r64, 25.3_r64, 7.2_r64])) + call periodic_table%set( & + key('Rb'), value=isotopes( & + [84.9118_r64, 86.909184_r64], & + [72.17_r64, 27.84_r64])) + call periodic_table%set( & + key('Re'), value=isotopes( & + [184.952977_r64, 186.955765_r64], & + [37.4_r64, 62.6_r64])) + call periodic_table%set( & + key('Rh'), value=isotopes( & + [102.905503_r64], & + [100.0_r64])) + call periodic_table%set( & + key('Ru'), value=isotopes( & + [95.907596_r64, 97.905287_r64, 98.905937_r64, 99.904218_r64, 100.905581_r64, 101.904348_r64, 103.905422_r64], & + [5.52_r64, 1.88_r64, 12.7_r64, 12.6_r64, 17.0_r64, 31.6_r64, 18.7_r64])) + call periodic_table%set( & + key('S'), value=isotopes( & + [31.972072_r64, 32.971459_r64, 33.967868_r64, 35.967079_r64], & + [95.02_r64, 0.75_r64, 4.21_r64, 0.02_r64])) + call periodic_table%set( & + key('Sb'), value=isotopes( & + [120.903824_r64, 122.904222_r64], & + [57.3_r64, 42.7_r64])) + call periodic_table%set( & + key('Sc'), value=isotopes( & + [44.955914_r64], & + [100.0_r64])) + call periodic_table%set( & + key('Se'), value=isotopes( & + [73.922477_r64, 75.919207_r64, 76.919908_r64, 77.917304_r64, 79.916521_r64, 81.916709_r64], & + [0.9_r64, 9.0_r64, 7.6_r64, 23.5_r64, 49.6_r64, 9.4_r64])) + call periodic_table%set( & + key('Si'), value=isotopes( & + [27.976928_r64, 28.976496_r64, 29.973772_r64], & + [92.23_r64, 4.67_r64, 3.1_r64])) + call periodic_table%set( & + key('Sm'), value=isotopes( & + [143.912009_r64, 146.914907_r64, 147.914832_r64, 148.917193_r64, 149.917285_r64, 151.919741_r64, 153.922218_r64], & + [3.1_r64, 15.0_r64, 11.3_r64, 13.8_r64, 7.4_r64, 26.7_r64, 22.7_r64])) + call periodic_table%set( & + key('Sn'), value=isotopes( & + [111.904826_r64, 113.902784_r64, 114.903348_r64, 115.901744_r64, 116.902954_r64, 117.901607_r64, 118.90331_r64, & + 119.902199_r64, 121.90344_r64, 123.905271_r64], & + [0.97_r64, 0.65_r64, 0.36_r64, 14.7_r64, 7.7_r64, 24.3_r64, 8.6_r64, 32.4_r64, 4.6_r64, 5.6_r64])) + call periodic_table%set( & + key('Sr'), value=isotopes( & + [83.913428_r64, 85.909273_r64, 86.908902_r64, 87.905625_r64], & + [0.56_r64, 9.86_r64, 7.0_r64, 82.58_r64])) + call periodic_table%set( & + key('Ta'), value=isotopes( & + [179.947489_r64, 180.948014_r64], & + [0.012_r64, 99.99_r64])) + call periodic_table%set( & + key('Tb'), value=isotopes( & + [158.92535_r64], & + [100.0_r64])) + call periodic_table%set( & + key('Te'), value=isotopes( & + [119.904021_r64, 121.903055_r64, 122.904278_r64, 123.902825_r64, 124.904435_r64, 125.90331_r64, 127.904464_r64, & + 129.906229_r64], & + [0.096_r64, 2.6_r64, 0.91_r64, 4.82_r64, 7.14_r64, 18.95_r64, 31.69_r64, 33.8_r64])) + call periodic_table%set( & + key('Th'), value=isotopes( & + [232.038054_r64], & + [100.0_r64])) + call periodic_table%set( & + key('Ti'), value=isotopes( & + [45.952633_r64, 46.951765_r64, 47.947947_r64, 48.947871_r64, 49.944786_r64], & + [8.0_r64, 7.3_r64, 73.8_r64, 5.5_r64, 5.4_r64])) + call periodic_table%set( & + key('Tl'), value=isotopes( & + [202.972336_r64, 204.97441_r64], & + [29.52_r64, 70.48_r64])) + call periodic_table%set( & + key('Tm'), value=isotopes( & + [168.934225_r64], & + [100.0_r64])) + call periodic_table%set( & + key('U'), value=isotopes( & + [234.040947_r64, 235.043925_r64, 238.050786_r64], & + [0.006_r64, 0.72_r64, 99.27_r64])) + call periodic_table%set( & + key('V'), value=isotopes( & + [49.947161_r64, 50.943963_r64], & + [0.25_r64, 99.75_r64])) + call periodic_table%set( & + key('W'), value=isotopes( & + [179.946727_r64, 181.948225_r64, 182.950245_r64, 183.950953_r64, 185.954377_r64], & + [0.13_r64, 26.3_r64, 14.3_r64, 30.67_r64, 28.6_r64])) + call periodic_table%set( & + key('Xe'), value=isotopes( & + [123.905894_r64, 125.904281_r64, 127.903531_r64, 128.90478_r64, 129.90351_r64, 130.905076_r64, 131.904148_r64, & + 133.905395_r64, 135.907219_r64], & + [0.1_r64, 0.09_r64, 1.91_r64, 26.4_r64, 4.1_r64, 21.2_r64, 26.9_r64, 10.4_r64, 8.9_r64])) + call periodic_table%set( & + key('Y'), value=isotopes( & + [88.905856_r64], & + [100.0_r64])) + call periodic_table%set( & + key('Yb'), value=isotopes( & + [167.933908_r64, 169.934774_r64, 170.936338_r64, 171.936393_r64, 172.938222_r64, 173.938873_r64, 175.942576_r64], & + [0.13_r64, 3.05_r64, 14.3_r64, 21.9_r64, 16.12_r64, 31.8_r64, 12.7_r64])) + call periodic_table%set( & + key('Zn'), value=isotopes( & + [63.929145_r64, 65.926035_r64, 66.927129_r64, 67.924846_r64, 69.925325_r64], & + [48.6_r64, 27.9_r64, 4.1_r64, 18.8_r64, 0.6_r64])) + call periodic_table%set( & + key('Zr'), value=isotopes( & + [89.904708_r64, 90.905644_r64, 91.905039_r64, 93.906319_r64, 95.908272_r64], & + [51.45_r64, 11.27_r64, 17.17_r64, 17.33_r64, 2.78_r64])) + + end subroutine create_periodic_table end module params diff --git a/src/particle.f90 b/src/particle.f90 index 0ac0765e..8dd80c1a 100644 --- a/src/particle.f90 +++ b/src/particle.f90 @@ -17,7 +17,7 @@ module particle_module !! Module containing the particle abstract data type. - use params, only: r64, i64 + use precision, only: r64, i64 implicit none diff --git a/src/phonon.f90 b/src/phonon.f90 index 32b8bf0b..78b0857e 100644 --- a/src/phonon.f90 +++ b/src/phonon.f90 @@ -19,7 +19,8 @@ module phonon_module !! Module containing type and procedures related to the phononic properties. - use params, only: r64, i64, bohr2nm, pi, twopi, Ryd2eV, oneI + use precision, only: r64, i64 + use params, only: bohr2nm, pi, twopi, Ryd2eV, oneI use particle_module, only: particle use misc, only: print_message, subtitle, expi, distribute_points, & write2file_rank2_real, exit_with_message, create_set, coarse_grain, & diff --git a/src/phonon_defect.f90 b/src/phonon_defect.f90 index 7cd9efbf..22c3e6fc 100644 --- a/src/phonon_defect.f90 +++ b/src/phonon_defect.f90 @@ -17,7 +17,8 @@ module phonon_defect_module !! Module containing phonon defect related data type and procedures. - use params, only: i64, r64, hbar_eVps, twopi, pi + use precision, only: i64, r64 + use params, only: hbar_eVps, twopi, pi use misc, only: exit_with_message, subtitle, demux_vector, twonorm, write2file_rank2_real, & kronecker, expi, demux_state, invert, distribute_points, mux_state use crystal_module, only: crystal diff --git a/src/precision.f90 b/src/precision.f90 new file mode 100644 index 00000000..35ce653b --- /dev/null +++ b/src/precision.f90 @@ -0,0 +1,10 @@ +module precision + use iso_fortran_env, only: real64, real128, int64 + + implicit none + + integer, parameter :: r64 = real64 + integer, parameter :: r128 = real128 + integer, parameter :: i64 = int64 + +end module precision \ No newline at end of file diff --git a/src/resource.f90 b/src/resource.f90 index db6db9b3..1c4d56be 100644 --- a/src/resource.f90 +++ b/src/resource.f90 @@ -4,7 +4,7 @@ module resource_module #ifdef _OPENACC use openacc #endif - use params, only: r64, i64 + use precision, only: r64, i64 use misc, only: create_set implicit none diff --git a/src/symmetry.f90 b/src/symmetry.f90 index 94117e9e..246aa2d0 100644 --- a/src/symmetry.f90 +++ b/src/symmetry.f90 @@ -18,7 +18,7 @@ module symmetry_module !! Module containing type and procedures related to crystal and !! Brillouin zone symmetries. - use params, only: r64, i64 + use precision, only: r64, i64 use misc, only: mux_vector, demux_mesh, demux_vector, & exit_with_message, subtitle, distribute_points, shrink use crystal_module, only : crystal diff --git a/src/wannier.f90 b/src/wannier.f90 index 6f6e77fe..dbf4e79f 100644 --- a/src/wannier.f90 +++ b/src/wannier.f90 @@ -17,7 +17,8 @@ module wannier_module !! Module containing type and procedures related to Wannierization. - use params, only: r64, i64, Ryd2eV, Ryd2radTHz, oneI, pi, twopi, twopiI, & + use precision, only: r64, i64 + use params, only: Ryd2eV, Ryd2radTHz, oneI, pi, twopi, twopiI, & Ryd2amu, bohr2nm use misc, only: exit_with_message, print_message, expi, twonorm, & distribute_points, demux_state, mux_vector, subtitle, write2file_rank2_complex, & diff --git a/test/test_autodiff.f90 b/test/test_autodiff.f90 index f8a0df93..13da8d02 100644 --- a/test/test_autodiff.f90 +++ b/test/test_autodiff.f90 @@ -1,6 +1,6 @@ program test_autodiff - use params, only : r64, i64 + use precision, only : r64, i64 use misc, only : linspace use testify_m, only : testify use autodiff_m, only : autodiff, & From 7d82910f322bb82b3e94e994601610efc49ad7bb Mon Sep 17 00:00:00 2001 From: Nils Wittemeier Date: Mon, 22 Apr 2024 17:05:23 +0200 Subject: [PATCH 2/8] Remove old periodic table, and update lookups --- src/crystal.f90 | 930 +----------------------------------------------- 1 file changed, 17 insertions(+), 913 deletions(-) diff --git a/src/crystal.f90 b/src/crystal.f90 index 221b9a4b..340f84a6 100644 --- a/src/crystal.f90 +++ b/src/crystal.f90 @@ -27,14 +27,6 @@ module crystal_module private public crystal, calculate_wavevectors_full - !Captain's log. August 11, 2023. - !Ideally these should be immutables defined once and for all - !in params.f90. Also, these should be stored in a dictionary - !but I'm still shopping for a suitable one. - character(len = 3), allocatable :: isotope_element(:) - real(r64), allocatable :: isotope_mass(:) - real(r64), allocatable :: isotope_abundance(:) - type crystal !! Data and procedures related to the crystal structure. @@ -261,9 +253,6 @@ subroutine read_input_and_setup_crystal(self) self%dim = 3 end if - !Generate periodic table - call create_periodic_table(isotope_element, isotope_mass, isotope_abundance) - !Dopant masses and concentrations allocate(self%dopant_masses(maxval(numdopants_types), self%numelements), & self%dopant_conc(maxval(numdopants_types), self%numelements)) @@ -419,30 +408,29 @@ subroutine calculate_mavg_and_g(elements, m, g) !! deviation coefficient of the masses). !! !! This subroutine is adapted from ShengBTE. + use params, only: lookup_periodic_table + use m_isotopes, only: isotopes character(len=3), intent(in) :: elements(:) real(r64), intent(out) :: m(:), g(:) !Local variables integer(i64) :: i, niso, nelems, e + type(isotopes) :: iso_data nelems = size(elements) niso = 287 do e = 1, nelems + iso_data = lookup_periodic_table(elements(e)) m(e) = 0.0_r64 - do i = 1, niso - if(isotope_element(i) .eq. elements(e)) then - m(e) = m(e) + isotope_mass(i)*isotope_abundance(i) - end if + do i = 1, iso_data%numisotopes + m(e) = m(e) + iso_data%masses(i)*iso_data%abundances(i) end do m(e) = m(e)/100.0_r64 g(e) = 0.0_r64 - do i = 1, niso - if(isotope_element(i) .eq. elements(e)) then - g(e) = g(e) + isotope_abundance(i)*& - (1.0_r64 - isotope_mass(i)/m(e))**2 - end if + do i = 1, iso_data%numisotopes + g(e) = g(e) + iso_data%abundances(i)*(1.0_r64 - iso_data%masses(i)/m(e))**2 end do g(e) = g(e)/100.0_r64 end do @@ -451,6 +439,8 @@ end subroutine calculate_mavg_and_g subroutine calculate_g_DIB(elements, m, g) !! Find the dominant isotopic masses from the periodic table !! and the average mass perturbation for use in the DIB-1st Born ph-iso scattering theory. + use params, only: lookup_periodic_table + use m_isotopes, only: isotopes character(len=3), intent(in) :: elements(:) real(r64), intent(out) :: m(:), g(:) @@ -458,918 +448,32 @@ subroutine calculate_g_DIB(elements, m, g) !Local variables integer :: i, total_numiso, nelems, e, iso_count, numiso real(r64), allocatable :: these_iso_masses(:), these_iso_abundances(:) + type(isotopes) :: iso_data nelems = size(elements) total_numiso = 287 do e = 1, nelems - !1st pass to get the number of isotopes of this element - numiso = 0 - do i = 1, total_numiso - if(isotope_element(i) == elements(e)) numiso = numiso + 1 - end do - - allocate(these_iso_masses(numiso), these_iso_abundances(numiso)) - - !Get as 1d array the isotopic masses and abundances of element e - iso_count = 0 - do i = 1, total_numiso - if(isotope_element(i) .eq. elements(e)) then - iso_count = iso_count + 1 - these_iso_masses(iso_count) = isotope_mass(i) - these_iso_abundances(iso_count) = isotope_abundance(i) - end if - end do + iso_data = lookup_periodic_table(elements(e)) !Set the dominant isotopic mass of element e - m(e) = these_iso_masses(maxloc(these_iso_abundances, dim = 1)) + m(e) = iso_data%masses(maxloc(iso_data%abundances, dim = 1)) !Calculate g_2 for this element. g(e) = 0.0_r64 - do i = 1, numiso + do i = 1, iso_data%numisotopes !This step is an overkill since the perturbation !will come out zero for one of the isotopes anyway. !Still, explicitly taking out the dominant isotope from !the list of defects. - if(i == maxloc(these_iso_abundances, dim = 1)) cycle + if(i == maxloc(iso_data%abundances, dim = 1)) cycle - g(e) = g(e) + these_iso_abundances(i)* & - (1.0_r64 - these_iso_masses(i)/m(e))**2 + g(e) = g(e) + iso_data%abundances(i)* & + (1.0_r64 - iso_data%masses(i)/m(e))**2 end do g(e) = g(e)/100.0_r64 - deallocate(these_iso_masses, these_iso_abundances) end do end subroutine calculate_g_DIB - subroutine create_periodic_table(element, mass, abundance) - character(len = 3), allocatable, intent(out) :: element(:) - real(r64), allocatable, intent(out) :: mass(:) - real(r64), allocatable, intent(out) :: abundance(:) - - allocate(element(287), mass(287), abundance(287)) - - ! Fill in isotope data. - element(1) = "Ag" - mass(1) = 106.905095_r64 - abundance(1) = 51.84_r64 - element(2) = "Ag" - mass(2) = 108.904754_r64 - abundance(2) = 48.16_r64 - element(3) = "Al" - mass(3) = 26.981541_r64 - abundance(3) = 100.0_r64 - element(4) = "Ar" - mass(4) = 35.967546_r64 - abundance(4) = 0.34_r64 - element(5) = "Ar" - mass(5) = 37.962732_r64 - abundance(5) = 0.063_r64 - element(6) = "Ar" - mass(6) = 39.962383_r64 - abundance(6) = 99.6_r64 - element(7) = "As" - mass(7) = 74.921596_r64 - abundance(7) = 100.0_r64 - element(8) = "Au" - mass(8) = 196.96656_r64 - abundance(8) = 100.0_r64 - element(9) = "B" - mass(9) = 10.012938_r64 - abundance(9) = 19.8_r64 - element(10) = "B" - mass(10) = 11.009305_r64 - abundance(10) = 80.2_r64 - element(11) = "Ba" - mass(11) = 129.906277_r64 - abundance(11) = 0.11_r64 - element(12) = "Ba" - mass(12) = 131.905042_r64 - abundance(12) = 0.1_r64 - element(13) = "Ba" - mass(13) = 133.90449_r64 - abundance(13) = 2.42_r64 - element(14) = "Ba" - mass(14) = 134.905668_r64 - abundance(14) = 6.59_r64 - element(15) = "Ba" - mass(15) = 135.904556_r64 - abundance(15) = 7.85_r64 - element(16) = "Ba" - mass(16) = 136.905816_r64 - abundance(16) = 11.23_r64 - element(17) = "Ba" - mass(17) = 137.905236_r64 - abundance(17) = 71.7_r64 - element(18) = "Be" - mass(18) = 9.012183_r64 - abundance(18) = 100.0_r64 - element(19) = "Bi" - mass(19) = 208.980388_r64 - abundance(19) = 100.0_r64 - element(20) = "Br" - mass(20) = 78.918336_r64 - abundance(20) = 50.69_r64 - element(21) = "Br" - mass(21) = 80.91629_r64 - abundance(21) = 49.31_r64 - element(22) = "C" - mass(22) = 12.0_r64 - abundance(22) = 98.9_r64 - element(23) = "C" - mass(23) = 13.003355_r64 - abundance(23) = 1.1_r64 - element(24) = "Ca" - mass(24) = 39.962591_r64 - abundance(24) = 96.95_r64 - element(25) = "Ca" - mass(25) = 41.958622_r64 - abundance(25) = 0.65_r64 - element(26) = "Ca" - mass(26) = 42.95877_r64 - abundance(26) = 0.14_r64 - element(27) = "Ca" - mass(27) = 43.955485_r64 - abundance(27) = 2.086_r64 - element(28) = "Ca" - mass(28) = 45.953689_r64 - abundance(28) = 0.004_r64 - element(29) = "Ca" - mass(29) = 47.952532_r64 - abundance(29) = 0.19_r64 - element(30) = "Cd" - mass(30) = 105.906461_r64 - abundance(30) = 1.25_r64 - element(31) = "Cd" - mass(31) = 107.904186_r64 - abundance(31) = 0.89_r64 - element(32) = "Cd" - mass(32) = 109.903007_r64 - abundance(32) = 12.49_r64 - element(33) = "Cd" - mass(33) = 110.904182_r64 - abundance(33) = 12.8_r64 - element(34) = "Cd" - mass(34) = 111.902761_r64 - abundance(34) = 24.13_r64 - element(35) = "Cd" - mass(35) = 112.904401_r64 - abundance(35) = 12.22_r64 - element(36) = "Cd" - mass(36) = 113.903361_r64 - abundance(36) = 28.73_r64 - element(37) = "Cd" - mass(37) = 115.904758_r64 - abundance(37) = 7.49_r64 - element(38) = "Ce" - mass(38) = 135.90714_r64 - abundance(38) = 0.19_r64 - element(39) = "Ce" - mass(39) = 137.905996_r64 - abundance(39) = 0.25_r64 - element(40) = "Ce" - mass(40) = 139.905442_r64 - abundance(40) = 88.48_r64 - element(41) = "Ce" - mass(41) = 141.909249_r64 - abundance(41) = 11.08_r64 - element(42) = "Cl" - mass(42) = 34.968853_r64 - abundance(42) = 75.77_r64 - element(43) = "Cl" - mass(43) = 36.965903_r64 - abundance(43) = 24.23_r64 - element(44) = "Co" - mass(44) = 58.933198_r64 - abundance(44) = 100.0_r64 - element(45) = "Cr" - mass(45) = 49.946046_r64 - abundance(45) = 4.35_r64 - element(46) = "Cr" - mass(46) = 51.94051_r64 - abundance(46) = 83.79_r64 - element(47) = "Cr" - mass(47) = 52.940651_r64 - abundance(47) = 9.5_r64 - element(48) = "Cr" - mass(48) = 53.938882_r64 - abundance(48) = 2.36_r64 - element(49) = "Cs" - mass(49) = 132.905433_r64 - abundance(49) = 100.0_r64 - element(50) = "Cu" - mass(50) = 62.929599_r64 - abundance(50) = 69.17_r64 - element(51) = "Cu" - mass(51) = 64.927792_r64 - abundance(51) = 30.83_r64 - element(52) = "Dy" - mass(52) = 155.924287_r64 - abundance(52) = 0.06_r64 - element(53) = "Dy" - mass(53) = 157.924412_r64 - abundance(53) = 0.1_r64 - element(54) = "Dy" - mass(54) = 159.925203_r64 - abundance(54) = 2.34_r64 - element(55) = "Dy" - mass(55) = 160.926939_r64 - abundance(55) = 18.9_r64 - element(56) = "Dy" - mass(56) = 161.926805_r64 - abundance(56) = 25.5_r64 - element(57) = "Dy" - mass(57) = 162.928737_r64 - abundance(57) = 24.9_r64 - element(58) = "Dy" - mass(58) = 163.929183_r64 - abundance(58) = 28.2_r64 - element(59) = "Er" - mass(59) = 161.928787_r64 - abundance(59) = 0.14_r64 - element(60) = "Er" - mass(60) = 163.929211_r64 - abundance(60) = 1.61_r64 - element(61) = "Er" - mass(61) = 165.930305_r64 - abundance(61) = 33.6_r64 - element(62) = "Er" - mass(62) = 166.932061_r64 - abundance(62) = 22.95_r64 - element(63) = "Er" - mass(63) = 167.932383_r64 - abundance(63) = 26.8_r64 - element(64) = "Er" - mass(64) = 169.935476_r64 - abundance(64) = 14.9_r64 - element(65) = "Eu" - mass(65) = 150.91986_r64 - abundance(65) = 47.8_r64 - element(66) = "Eu" - mass(66) = 152.921243_r64 - abundance(66) = 52.2_r64 - element(67) = "F" - mass(67) = 18.998403_r64 - abundance(67) = 100.0_r64 - element(68) = "Fe" - mass(68) = 53.939612_r64 - abundance(68) = 5.8_r64 - element(69) = "Fe" - mass(69) = 55.934939_r64 - abundance(69) = 91.72_r64 - element(70) = "Fe" - mass(70) = 56.935396_r64 - abundance(70) = 2.2_r64 - element(71) = "Fe" - mass(71) = 57.933278_r64 - abundance(71) = 0.28_r64 - element(72) = "Ga" - mass(72) = 68.925581_r64 - abundance(72) = 60.1_r64 - element(73) = "Ga" - mass(73) = 70.924701_r64 - abundance(73) = 39.9_r64 - element(74) = "Gd" - mass(74) = 151.919803_r64 - abundance(74) = 0.2_r64 - element(75) = "Gd" - mass(75) = 153.920876_r64 - abundance(75) = 2.18_r64 - element(76) = "Gd" - mass(76) = 154.822629_r64 - abundance(76) = 14.8_r64 - element(77) = "Gd" - mass(77) = 155.92213_r64 - abundance(77) = 20.47_r64 - element(78) = "Gd" - mass(78) = 156.923967_r64 - abundance(78) = 15.65_r64 - element(79) = "Gd" - mass(79) = 157.924111_r64 - abundance(79) = 24.84_r64 - element(80) = "Gd" - mass(80) = 159.927061_r64 - abundance(80) = 21.86_r64 - element(81) = "Ge" - mass(81) = 69.92425_r64 - abundance(81) = 20.5_r64 - element(82) = "Ge" - mass(82) = 71.92208_r64 - abundance(82) = 27.4_r64 - element(83) = "Ge" - mass(83) = 72.923464_r64 - abundance(83) = 7.8_r64 - element(84) = "Ge" - mass(84) = 73.921179_r64 - abundance(84) = 36.5_r64 - element(85) = "Ge" - mass(85) = 75.921403_r64 - abundance(85) = 7.8_r64 - element(86) = "H" - mass(86) = 1.007825_r64 - abundance(86) = 99.99_r64 - element(87) = "H" - mass(87) = 2.014102_r64 - abundance(87) = 0.015_r64 - element(88) = "He" - mass(88) = 3.016029_r64 - abundance(88) = 0.0001_r64 - element(89) = "He" - mass(89) = 4.002603_r64 - abundance(89) = 100.0_r64 - element(90) = "Hf" - mass(90) = 173.940065_r64 - abundance(90) = 0.16_r64 - element(91) = "Hf" - mass(91) = 175.94142_r64 - abundance(91) = 5.2_r64 - element(92) = "Hf" - mass(92) = 176.943233_r64 - abundance(92) = 18.6_r64 - element(93) = "Hf" - mass(93) = 177.94371_r64 - abundance(93) = 27.1_r64 - element(94) = "Hf" - mass(94) = 178.945827_r64 - abundance(94) = 13.74_r64 - element(95) = "Hf" - mass(95) = 179.946561_r64 - abundance(95) = 35.2_r64 - element(96) = "Hg" - mass(96) = 195.965812_r64 - abundance(96) = 0.15_r64 - element(97) = "Hg" - mass(97) = 197.96676_r64 - abundance(97) = 10.1_r64 - element(98) = "Hg" - mass(98) = 198.968269_r64 - abundance(98) = 17.0_r64 - element(99) = "Hg" - mass(99) = 199.968316_r64 - abundance(99) = 23.1_r64 - element(100) = "Hg" - mass(100) = 200.970293_r64 - abundance(100) = 13.2_r64 - element(101) = "Hg" - mass(101) = 201.970632_r64 - abundance(101) = 29.65_r64 - element(102) = "Hg" - mass(102) = 203.973481_r64 - abundance(102) = 6.8_r64 - element(103) = "Ho" - mass(103) = 164.930332_r64 - abundance(103) = 100.0_r64 - element(104) = "I" - mass(104) = 126.904477_r64 - abundance(104) = 100.0_r64 - element(105) = "In" - mass(105) = 112.904056_r64 - abundance(105) = 4.3_r64 - element(106) = "In" - mass(106) = 114.903875_r64 - abundance(106) = 95.7_r64 - element(107) = "Ir" - mass(107) = 190.960603_r64 - abundance(107) = 37.3_r64 - element(108) = "Ir" - mass(108) = 192.962942_r64 - abundance(108) = 62.7_r64 - element(109) = "K" - mass(109) = 38.963708_r64 - abundance(109) = 93.2_r64 - element(110) = "K" - mass(110) = 39.963999_r64 - abundance(110) = 0.012_r64 - element(111) = "K" - mass(111) = 40.961825_r64 - abundance(111) = 6.73_r64 - element(112) = "Kr" - mass(112) = 77.920397_r64 - abundance(112) = 0.35_r64 - element(113) = "Kr" - mass(113) = 79.916375_r64 - abundance(113) = 2.25_r64 - element(114) = "Kr" - mass(114) = 81.913483_r64 - abundance(114) = 11.6_r64 - element(115) = "Kr" - mass(115) = 82.914134_r64 - abundance(115) = 11.5_r64 - element(116) = "Kr" - mass(116) = 83.911506_r64 - abundance(116) = 57.0_r64 - element(117) = "Kr" - mass(117) = 85.910614_r64 - abundance(117) = 17.3_r64 - element(118) = "La" - mass(118) = 137.907114_r64 - abundance(118) = 0.09_r64 - element(119) = "La" - mass(119) = 138.906355_r64 - abundance(119) = 99.91_r64 - element(120) = "Li" - mass(120) = 6.015123_r64 - abundance(120) = 7.42_r64 - element(121) = "Li" - mass(121) = 7.016005_r64 - abundance(121) = 92.58_r64 - element(122) = "Lu" - mass(122) = 174.940785_r64 - abundance(122) = 97.4_r64 - element(123) = "Lu" - mass(123) = 175.942694_r64 - abundance(123) = 2.6_r64 - element(124) = "Mg" - mass(124) = 23.985045_r64 - abundance(124) = 78.9_r64 - element(125) = "Mg" - mass(125) = 24.985839_r64 - abundance(125) = 10.0_r64 - element(126) = "Mg" - mass(126) = 25.982595_r64 - abundance(126) = 11.1_r64 - element(127) = "Mn" - mass(127) = 54.938046_r64 - abundance(127) = 100.0_r64 - element(128) = "Mo" - mass(128) = 91.906809_r64 - abundance(128) = 14.84_r64 - element(129) = "Mo" - mass(129) = 93.905086_r64 - abundance(129) = 9.25_r64 - element(130) = "Mo" - mass(130) = 94.905838_r64 - abundance(130) = 15.92_r64 - element(131) = "Mo" - mass(131) = 95.904676_r64 - abundance(131) = 16.68_r64 - element(132) = "Mo" - mass(132) = 96.906018_r64 - abundance(132) = 9.55_r64 - element(133) = "Mo" - mass(133) = 97.905405_r64 - abundance(133) = 24.13_r64 - element(134) = "Mo" - mass(134) = 99.907473_r64 - abundance(134) = 9.63_r64 - element(135) = "N" - mass(135) = 14.003074_r64 - abundance(135) = 99.63_r64 - element(136) = "N" - mass(136) = 15.000109_r64 - abundance(136) = 0.37_r64 - element(137) = "Na" - mass(137) = 22.98977_r64 - abundance(137) = 100.0_r64 - element(138) = "Nb" - mass(138) = 92.906378_r64 - abundance(138) = 100.0_r64 - element(139) = "Nd" - mass(139) = 141.907731_r64 - abundance(139) = 27.13_r64 - element(140) = "Nd" - mass(140) = 142.909823_r64 - abundance(140) = 12.18_r64 - element(141) = "Nd" - mass(141) = 143.910096_r64 - abundance(141) = 23.8_r64 - element(142) = "Nd" - mass(142) = 144.912582_r64 - abundance(142) = 8.3_r64 - element(143) = "Nd" - mass(143) = 145.913126_r64 - abundance(143) = 17.19_r64 - element(144) = "Nd" - mass(144) = 147.916901_r64 - abundance(144) = 5.76_r64 - element(145) = "Nd" - mass(145) = 149.9209_r64 - abundance(145) = 5.64_r64 - element(146) = "Ne" - mass(146) = 19.992439_r64 - abundance(146) = 90.6_r64 - element(147) = "Ne" - mass(147) = 20.993845_r64 - abundance(147) = 0.26_r64 - element(148) = "Ne" - mass(148) = 21.991384_r64 - abundance(148) = 9.2_r64 - element(149) = "Ni" - mass(149) = 57.935347_r64 - abundance(149) = 68.27_r64 - element(150) = "Ni" - mass(150) = 59.930789_r64 - abundance(150) = 26.1_r64 - element(151) = "Ni" - mass(151) = 60.931059_r64 - abundance(151) = 1.13_r64 - element(152) = "Ni" - mass(152) = 61.928346_r64 - abundance(152) = 3.59_r64 - element(153) = "Ni" - mass(153) = 63.927968_r64 - abundance(153) = 0.91_r64 - element(154) = "O" - mass(154) = 15.994915_r64 - abundance(154) = 99.76_r64 - element(155) = "O" - mass(155) = 16.999131_r64 - abundance(155) = 0.038_r64 - element(156) = "O" - mass(156) = 17.999159_r64 - abundance(156) = 0.2_r64 - element(157) = "Os" - mass(157) = 183.952514_r64 - abundance(157) = 0.02_r64 - element(158) = "Os" - mass(158) = 185.953852_r64 - abundance(158) = 1.58_r64 - element(159) = "Os" - mass(159) = 186.955762_r64 - abundance(159) = 1.6_r64 - element(160) = "Os" - mass(160) = 187.95585_r64 - abundance(160) = 13.3_r64 - element(161) = "Os" - mass(161) = 188.958156_r64 - abundance(161) = 16.1_r64 - element(162) = "Os" - mass(162) = 189.958455_r64 - abundance(162) = 26.4_r64 - element(163) = "Os" - mass(163) = 191.961487_r64 - abundance(163) = 41.0_r64 - element(164) = "P" - mass(164) = 30.973763_r64 - abundance(164) = 100.0_r64 - element(165) = "Pb" - mass(165) = 203.973037_r64 - abundance(165) = 1.4_r64 - element(166) = "Pb" - mass(166) = 205.974455_r64 - abundance(166) = 24.1_r64 - element(167) = "Pb" - mass(167) = 206.975885_r64 - abundance(167) = 22.1_r64 - element(168) = "Pb" - mass(168) = 207.976641_r64 - abundance(168) = 52.4_r64 - element(169) = "Pd" - mass(169) = 101.905609_r64 - abundance(169) = 1.02_r64 - element(170) = "Pd" - mass(170) = 103.904026_r64 - abundance(170) = 11.14_r64 - element(171) = "Pd" - mass(171) = 104.905075_r64 - abundance(171) = 22.33_r64 - element(172) = "Pd" - mass(172) = 105.903475_r64 - abundance(172) = 27.33_r64 - element(173) = "Pd" - mass(173) = 107.903894_r64 - abundance(173) = 26.46_r64 - element(174) = "Pd" - mass(174) = 109.905169_r64 - abundance(174) = 11.72_r64 - element(175) = "Pr" - mass(175) = 140.907657_r64 - abundance(175) = 100.0_r64 - element(176) = "Pt" - mass(176) = 189.959937_r64 - abundance(176) = 0.01_r64 - element(177) = "Pt" - mass(177) = 191.961049_r64 - abundance(177) = 0.79_r64 - element(178) = "Pt" - mass(178) = 193.962679_r64 - abundance(178) = 32.9_r64 - element(179) = "Pt" - mass(179) = 194.964785_r64 - abundance(179) = 33.8_r64 - element(180) = "Pt" - mass(180) = 195.964947_r64 - abundance(180) = 25.3_r64 - element(181) = "Pt" - mass(181) = 197.967879_r64 - abundance(181) = 7.2_r64 - element(182) = "Rb" - mass(182) = 84.9118_r64 - abundance(182) = 72.17_r64 - element(183) = "Rb" - mass(183) = 86.909184_r64 - abundance(183) = 27.84_r64 - element(184) = "Re" - mass(184) = 184.952977_r64 - abundance(184) = 37.4_r64 - element(185) = "Re" - mass(185) = 186.955765_r64 - abundance(185) = 62.6_r64 - element(186) = "Rh" - mass(186) = 102.905503_r64 - abundance(186) = 100.0_r64 - element(187) = "Ru" - mass(187) = 95.907596_r64 - abundance(187) = 5.52_r64 - element(188) = "Ru" - mass(188) = 97.905287_r64 - abundance(188) = 1.88_r64 - element(189) = "Ru" - mass(189) = 98.905937_r64 - abundance(189) = 12.7_r64 - element(190) = "Ru" - mass(190) = 99.904218_r64 - abundance(190) = 12.6_r64 - element(191) = "Ru" - mass(191) = 100.905581_r64 - abundance(191) = 17.0_r64 - element(192) = "Ru" - mass(192) = 101.904348_r64 - abundance(192) = 31.6_r64 - element(193) = "Ru" - mass(193) = 103.905422_r64 - abundance(193) = 18.7_r64 - element(194) = "S" - mass(194) = 31.972072_r64 - abundance(194) = 95.02_r64 - element(195) = "S" - mass(195) = 32.971459_r64 - abundance(195) = 0.75_r64 - element(196) = "S" - mass(196) = 33.967868_r64 - abundance(196) = 4.21_r64 - element(197) = "S" - mass(197) = 35.967079_r64 - abundance(197) = 0.02_r64 - element(198) = "Sb" - mass(198) = 120.903824_r64 - abundance(198) = 57.3_r64 - element(199) = "Sb" - mass(199) = 122.904222_r64 - abundance(199) = 42.7_r64 - element(200) = "Sc" - mass(200) = 44.955914_r64 - abundance(200) = 100.0_r64 - element(201) = "Se" - mass(201) = 73.922477_r64 - abundance(201) = 0.9_r64 - element(202) = "Se" - mass(202) = 75.919207_r64 - abundance(202) = 9.0_r64 - element(203) = "Se" - mass(203) = 76.919908_r64 - abundance(203) = 7.6_r64 - element(204) = "Se" - mass(204) = 77.917304_r64 - abundance(204) = 23.5_r64 - element(205) = "Se" - mass(205) = 79.916521_r64 - abundance(205) = 49.6_r64 - element(206) = "Se" - mass(206) = 81.916709_r64 - abundance(206) = 9.4_r64 - element(207) = "Si" - mass(207) = 27.976928_r64 - abundance(207) = 92.23_r64 - element(208) = "Si" - mass(208) = 28.976496_r64 - abundance(208) = 4.67_r64 - element(209) = "Si" - mass(209) = 29.973772_r64 - abundance(209) = 3.1_r64 - element(210) = "Sm" - mass(210) = 143.912009_r64 - abundance(210) = 3.1_r64 - element(211) = "Sm" - mass(211) = 146.914907_r64 - abundance(211) = 15.0_r64 - element(212) = "Sm" - mass(212) = 147.914832_r64 - abundance(212) = 11.3_r64 - element(213) = "Sm" - mass(213) = 148.917193_r64 - abundance(213) = 13.8_r64 - element(214) = "Sm" - mass(214) = 149.917285_r64 - abundance(214) = 7.4_r64 - element(215) = "Sm" - mass(215) = 151.919741_r64 - abundance(215) = 26.7_r64 - element(216) = "Sm" - mass(216) = 153.922218_r64 - abundance(216) = 22.7_r64 - element(217) = "Sn" - mass(217) = 111.904826_r64 - abundance(217) = 0.97_r64 - element(218) = "Sn" - mass(218) = 113.902784_r64 - abundance(218) = 0.65_r64 - element(219) = "Sn" - mass(219) = 114.903348_r64 - abundance(219) = 0.36_r64 - element(220) = "Sn" - mass(220) = 115.901744_r64 - abundance(220) = 14.7_r64 - element(221) = "Sn" - mass(221) = 116.902954_r64 - abundance(221) = 7.7_r64 - element(222) = "Sn" - mass(222) = 117.901607_r64 - abundance(222) = 24.3_r64 - element(223) = "Sn" - mass(223) = 118.90331_r64 - abundance(223) = 8.6_r64 - element(224) = "Sn" - mass(224) = 119.902199_r64 - abundance(224) = 32.4_r64 - element(225) = "Sn" - mass(225) = 121.90344_r64 - abundance(225) = 4.6_r64 - element(226) = "Sn" - mass(226) = 123.905271_r64 - abundance(226) = 5.6_r64 - element(227) = "Sr" - mass(227) = 83.913428_r64 - abundance(227) = 0.56_r64 - element(228) = "Sr" - mass(228) = 85.909273_r64 - abundance(228) = 9.86_r64 - element(229) = "Sr" - mass(229) = 86.908902_r64 - abundance(229) = 7.0_r64 - element(230) = "Sr" - mass(230) = 87.905625_r64 - abundance(230) = 82.58_r64 - element(231) = "Ta" - mass(231) = 179.947489_r64 - abundance(231) = 0.012_r64 - element(232) = "Ta" - mass(232) = 180.948014_r64 - abundance(232) = 99.99_r64 - element(233) = "Tb" - mass(233) = 158.92535_r64 - abundance(233) = 100.0_r64 - element(234) = "Te" - mass(234) = 119.904021_r64 - abundance(234) = 0.096_r64 - element(235) = "Te" - mass(235) = 121.903055_r64 - abundance(235) = 2.6_r64 - element(236) = "Te" - mass(236) = 122.904278_r64 - abundance(236) = 0.91_r64 - element(237) = "Te" - mass(237) = 123.902825_r64 - abundance(237) = 4.82_r64 - element(238) = "Te" - mass(238) = 124.904435_r64 - abundance(238) = 7.14_r64 - element(239) = "Te" - mass(239) = 125.90331_r64 - abundance(239) = 18.95_r64 - element(240) = "Te" - mass(240) = 127.904464_r64 - abundance(240) = 31.69_r64 - element(241) = "Te" - mass(241) = 129.906229_r64 - abundance(241) = 33.8_r64 - element(242) = "Th" - mass(242) = 232.038054_r64 - abundance(242) = 100.0_r64 - element(243) = "Ti" - mass(243) = 45.952633_r64 - abundance(243) = 8.0_r64 - element(244) = "Ti" - mass(244) = 46.951765_r64 - abundance(244) = 7.3_r64 - element(245) = "Ti" - mass(245) = 47.947947_r64 - abundance(245) = 73.8_r64 - element(246) = "Ti" - mass(246) = 48.947871_r64 - abundance(246) = 5.5_r64 - element(247) = "Ti" - mass(247) = 49.944786_r64 - abundance(247) = 5.4_r64 - element(248) = "Tl" - mass(248) = 202.972336_r64 - abundance(248) = 29.52_r64 - element(249) = "Tl" - mass(249) = 204.97441_r64 - abundance(249) = 70.48_r64 - element(250) = "Tm" - mass(250) = 168.934225_r64 - abundance(250) = 100.0_r64 - element(251) = "U" - mass(251) = 234.040947_r64 - abundance(251) = 0.006_r64 - element(252) = "U" - mass(252) = 235.043925_r64 - abundance(252) = 0.72_r64 - element(253) = "U" - mass(253) = 238.050786_r64 - abundance(253) = 99.27_r64 - element(254) = "V" - mass(254) = 49.947161_r64 - abundance(254) = 0.25_r64 - element(255) = "V" - mass(255) = 50.943963_r64 - abundance(255) = 99.75_r64 - element(256) = "W" - mass(256) = 179.946727_r64 - abundance(256) = 0.13_r64 - element(257) = "W" - mass(257) = 181.948225_r64 - abundance(257) = 26.3_r64 - element(258) = "W" - mass(258) = 182.950245_r64 - abundance(258) = 14.3_r64 - element(259) = "W" - mass(259) = 183.950953_r64 - abundance(259) = 30.67_r64 - element(260) = "W" - mass(260) = 185.954377_r64 - abundance(260) = 28.6_r64 - element(261) = "Xe" - mass(261) = 123.905894_r64 - abundance(261) = 0.1_r64 - element(262) = "Xe" - mass(262) = 125.904281_r64 - abundance(262) = 0.09_r64 - element(263) = "Xe" - mass(263) = 127.903531_r64 - abundance(263) = 1.91_r64 - element(264) = "Xe" - mass(264) = 128.90478_r64 - abundance(264) = 26.4_r64 - element(265) = "Xe" - mass(265) = 129.90351_r64 - abundance(265) = 4.1_r64 - element(266) = "Xe" - mass(266) = 130.905076_r64 - abundance(266) = 21.2_r64 - element(267) = "Xe" - mass(267) = 131.904148_r64 - abundance(267) = 26.9_r64 - element(268) = "Xe" - mass(268) = 133.905395_r64 - abundance(268) = 10.4_r64 - element(269) = "Xe" - mass(269) = 135.907219_r64 - abundance(269) = 8.9_r64 - element(270) = "Y" - mass(270) = 88.905856_r64 - abundance(270) = 100.0_r64 - element(271) = "Yb" - mass(271) = 167.933908_r64 - abundance(271) = 0.13_r64 - element(272) = "Yb" - mass(272) = 169.934774_r64 - abundance(272) = 3.05_r64 - element(273) = "Yb" - mass(273) = 170.936338_r64 - abundance(273) = 14.3_r64 - element(274) = "Yb" - mass(274) = 171.936393_r64 - abundance(274) = 21.9_r64 - element(275) = "Yb" - mass(275) = 172.938222_r64 - abundance(275) = 16.12_r64 - element(276) = "Yb" - mass(276) = 173.938873_r64 - abundance(276) = 31.8_r64 - element(277) = "Yb" - mass(277) = 175.942576_r64 - abundance(277) = 12.7_r64 - element(278) = "Zn" - mass(278) = 63.929145_r64 - abundance(278) = 48.6_r64 - element(279) = "Zn" - mass(279) = 65.926035_r64 - abundance(279) = 27.9_r64 - element(280) = "Zn" - mass(280) = 66.927129_r64 - abundance(280) = 4.1_r64 - element(281) = "Zn" - mass(281) = 67.924846_r64 - abundance(281) = 18.8_r64 - element(282) = "Zn" - mass(282) = 69.925325_r64 - abundance(282) = 0.6_r64 - element(283) = "Zr" - mass(283) = 89.904708_r64 - abundance(283) = 51.45_r64 - element(284) = "Zr" - mass(284) = 90.905644_r64 - abundance(284) = 11.27_r64 - element(285) = "Zr" - mass(285) = 91.905039_r64 - abundance(285) = 17.17_r64 - element(286) = "Zr" - mass(286) = 93.906319_r64 - abundance(286) = 17.33_r64 - element(287) = "Zr" - mass(287) = 95.908272_r64 - abundance(287) = 2.78_r64 - end subroutine create_periodic_table end module crystal_module From f3216a1796e5b6cc91b778654d87c3d2ffd37a47 Mon Sep 17 00:00:00 2001 From: Nils Wittemeier Date: Thu, 25 Apr 2024 14:43:11 +0200 Subject: [PATCH 3/8] Remove unused variables --- src/crystal.f90 | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/crystal.f90 b/src/crystal.f90 index 340f84a6..1ac1305b 100644 --- a/src/crystal.f90 +++ b/src/crystal.f90 @@ -415,11 +415,10 @@ subroutine calculate_mavg_and_g(elements, m, g) real(r64), intent(out) :: m(:), g(:) !Local variables - integer(i64) :: i, niso, nelems, e + integer(i64) :: i, nelems, e type(isotopes) :: iso_data nelems = size(elements) - niso = 287 do e = 1, nelems iso_data = lookup_periodic_table(elements(e)) @@ -440,18 +439,16 @@ subroutine calculate_g_DIB(elements, m, g) !! Find the dominant isotopic masses from the periodic table !! and the average mass perturbation for use in the DIB-1st Born ph-iso scattering theory. use params, only: lookup_periodic_table - use m_isotopes, only: isotopes + use isotopes_module, only: isotopes character(len=3), intent(in) :: elements(:) real(r64), intent(out) :: m(:), g(:) !Local variables - integer :: i, total_numiso, nelems, e, iso_count, numiso - real(r64), allocatable :: these_iso_masses(:), these_iso_abundances(:) + integer :: i, nelems, e type(isotopes) :: iso_data nelems = size(elements) - total_numiso = 287 do e = 1, nelems iso_data = lookup_periodic_table(elements(e)) From 2e3bc18440d4049b9c5258ced146d21cc351334c Mon Sep 17 00:00:00 2001 From: Nils Wittemeier Date: Thu, 25 Apr 2024 14:44:11 +0200 Subject: [PATCH 4/8] Rename isotopes file and module --- src/crystal.f90 | 2 +- src/{m_isotopes.f90 => isotopes.f90} | 6 +++--- src/params.f90 | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) rename src/{m_isotopes.f90 => isotopes.f90} (88%) diff --git a/src/crystal.f90 b/src/crystal.f90 index 1ac1305b..9c3d998e 100644 --- a/src/crystal.f90 +++ b/src/crystal.f90 @@ -409,7 +409,7 @@ subroutine calculate_mavg_and_g(elements, m, g) !! !! This subroutine is adapted from ShengBTE. use params, only: lookup_periodic_table - use m_isotopes, only: isotopes + use isotopes_module, only: isotopes character(len=3), intent(in) :: elements(:) real(r64), intent(out) :: m(:), g(:) diff --git a/src/m_isotopes.f90 b/src/isotopes.f90 similarity index 88% rename from src/m_isotopes.f90 rename to src/isotopes.f90 index f3192e47..a3417b68 100644 --- a/src/m_isotopes.f90 +++ b/src/isotopes.f90 @@ -1,4 +1,4 @@ -module m_isotopes +module isotopes_module use precision, only: r64 @@ -20,13 +20,13 @@ module m_isotopes end type isotopes interface isotopes + !! Create new collection of isotopes module procedure :: constructor end interface isotopes contains function constructor(masses, abundances) result(this) - real(r64), intent(in) :: masses(:), abundances(:) type(isotopes) :: this this%numisotopes = size(masses) @@ -34,4 +34,4 @@ function constructor(masses, abundances) result(this) this%masses = masses this%abundances = abundances end function constructor -end module m_isotopes +end module isotopes_module diff --git a/src/params.f90 b/src/params.f90 index 65179da0..42151bfb 100644 --- a/src/params.f90 +++ b/src/params.f90 @@ -19,7 +19,7 @@ module params use precision use fhash, only: fhash_tbl_t, key => fhash_key - use m_isotopes, only: isotopes + use isotopes_module, only: isotopes implicit none From 3337bf432ec2344aae95ad5bad36b272f1ba808d Mon Sep 17 00:00:00 2001 From: Nils Wittemeier Date: Thu, 25 Apr 2024 14:44:39 +0200 Subject: [PATCH 5/8] Expand code documentation --- src/isotopes.f90 | 8 ++++++++ src/params.f90 | 6 +++++- src/precision.f90 | 9 +++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/isotopes.f90 b/src/isotopes.f90 index a3417b68..86e6c240 100644 --- a/src/isotopes.f90 +++ b/src/isotopes.f90 @@ -8,9 +8,13 @@ module isotopes_module public :: isotopes type isotopes + !! Datatype for storing information related to isotopes of a species integer :: numisotopes = 0 + !! Number of isotopes real(r64), allocatable :: masses(:) + !! Mass of each isotope in atomic mass units real(r64), allocatable :: abundances(:) + !! Abundance of each isoptope in percent contains !TODO Add getters for: !VCA mass @@ -27,6 +31,10 @@ module isotopes_module contains function constructor(masses, abundances) result(this) + real(r64), intent(in) :: masses(:) + !! Array containing the mass of each isotope in atomic mass units + real(r64), intent(in) :: abundances(:) + !! Array containing the abundance of each isotope in percent type(isotopes) :: this this%numisotopes = size(masses) diff --git a/src/params.f90 b/src/params.f90 index 42151bfb..4029ec4a 100644 --- a/src/params.f90 +++ b/src/params.f90 @@ -63,12 +63,16 @@ module params contains function lookup_periodic_table(element) result(data) + !! Return the isotopes of a specific element character(*), intent(in) :: element + !! Symbol of the element to be looked up type(isotopes) :: data class(*), allocatable :: raw_data if (.not. periodic_table_exists) then + ! Only, the first time a look-up is requested the periodic table is + ! generated call create_periodic_table(periodic_table) periodic_table_exists = .true. end if @@ -84,8 +88,8 @@ function lookup_periodic_table(element) result(data) end function lookup_periodic_table subroutine create_periodic_table(periodic_table) + !! Initialize the periodic table type(fhash_tbl_t), intent(out) :: periodic_table - call periodic_table%set( & key('Ag'), value=isotopes( & [106.905095_r64, 108.904754_r64], & diff --git a/src/precision.f90 b/src/precision.f90 index 35ce653b..339cee68 100644 --- a/src/precision.f90 +++ b/src/precision.f90 @@ -1,10 +1,19 @@ module precision + !! Module containing short hands for precisions of various data type defined in + !! `iso_fortran_env` + use iso_fortran_env, only: real64, real128, int64 implicit none + ! Floating point precisions integer, parameter :: r64 = real64 + !! 64-bit float integer, parameter :: r128 = real128 + !! 128-bit float + + ! Integer precisions integer, parameter :: i64 = int64 + !! 64-bit integer (single) end module precision \ No newline at end of file From 3a0cff6f7bbe1adf3068059fef31409592b0e70e Mon Sep 17 00:00:00 2001 From: Nils Wittemeier Date: Thu, 25 Apr 2024 14:45:16 +0200 Subject: [PATCH 6/8] Avoid 'use' without 'only' --- src/params.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/params.f90 b/src/params.f90 index 4029ec4a..b1cf4928 100644 --- a/src/params.f90 +++ b/src/params.f90 @@ -17,7 +17,7 @@ module params !! Module containing various parameters and constants. - use precision + use precision, only: r64 use fhash, only: fhash_tbl_t, key => fhash_key use isotopes_module, only: isotopes From 940deeb0ee361bf02df469f3cd5ee587ca4dae76 Mon Sep 17 00:00:00 2001 From: Nils Wittemeier Date: Thu, 25 Apr 2024 14:47:21 +0200 Subject: [PATCH 7/8] fix periodic table lookup by trimming element names --- src/params.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/params.f90 b/src/params.f90 index b1cf4928..5886e3ac 100644 --- a/src/params.f90 +++ b/src/params.f90 @@ -77,7 +77,7 @@ function lookup_periodic_table(element) result(data) periodic_table_exists = .true. end if - call periodic_table%get_raw(key(element), raw_data) + call periodic_table%get_raw(key(trim(element)), raw_data) select type (raw_data) type is (isotopes) From 38279bf1180d6e570d8f014293d79db1d53d8a40 Mon Sep 17 00:00:00 2001 From: Nils Wittemeier Date: Thu, 25 Apr 2024 15:30:44 +0200 Subject: [PATCH 8/8] Add test for periodic table lookup --- fpm.toml | 5 + test/test_periodictable.f90 | 962 ++++++++++++++++++++++++++++++++++++ 2 files changed, 967 insertions(+) create mode 100644 test/test_periodictable.f90 diff --git a/fpm.toml b/fpm.toml index 9ee8afed..a09bf7bf 100644 --- a/fpm.toml +++ b/fpm.toml @@ -60,6 +60,11 @@ name = "test_autodiff" source-dir="test" main = "test_autodiff.f90" +[[test]] +name = "test_periodictable" +source-dir="test" +main = "test_periodictable.f90" + [[test]] name = "bte_regression" source-dir="test" diff --git a/test/test_periodictable.f90 b/test/test_periodictable.f90 new file mode 100644 index 00000000..4c2f54fd --- /dev/null +++ b/test/test_periodictable.f90 @@ -0,0 +1,962 @@ +program test_periodictable + use precision, only: r64, i64 + use isotopes_module, only: isotopes + use testify_m, only: testify + use params, only : lookup_periodic_table + + implicit none + + integer, parameter :: nelements = 83 + + ! Testify + integer :: itest + integer, parameter :: num_tests = 2*nelements + type(testify) :: test_array(num_tests), tests_all + + ! Variables for old format periodic table + integer :: niso + character(len=3), allocatable :: isotope_element(:) + real(r64), allocatable :: isotope_mass(:) + real(r64), allocatable :: isotope_abundance(:) + + ! Other variables + integer :: i, j + real(r64), allocatable :: mass_new(:), mass_old(:) + real(r64), allocatable :: abundance_new(:), abundance_old(:) + character(len=3) :: cur_element + type(isotopes) :: iso_data + + + !Generate periodic table + call create_old_periodic_table(isotope_element, isotope_mass, isotope_abundance) + niso = size(isotope_element) + + cur_element = "" + itest = 0 + do i = 1, niso + if (cur_element /= isotope_element(i)) then + if (allocated(mass_new)) then + call compare() + ! Clean-up + deallocate (mass_new, mass_old, abundance_new, abundance_old) + end if + + cur_element = isotope_element(i) + + ! Look up new element + iso_data = lookup_periodic_table(isotope_element(i)) + + ! Allocate new test arrays + allocate(mass_new(iso_data%numisotopes), & + mass_old(iso_data%numisotopes), & + abundance_new(iso_data%numisotopes), & + abundance_old(iso_data%numisotopes)) + do j = 1, iso_data%numisotopes + mass_new(:) = iso_data%masses(:) + abundance_new(:) = iso_data%abundances(:) + end do + j = 0 + end if + j = j+1 + mass_old(j) = isotope_mass(i) + abundance_old(j) = isotope_abundance(i) + end do + + if (allocated(mass_new)) then + call compare() + ! Clean-up + deallocate (mass_new, mass_old, abundance_new, abundance_old) + end if + + tests_all = testify(test_array) + call tests_all%report + + if(tests_all%get_status() .eqv. .false.) error stop -1 + +contains + + subroutine compare() + !! Compare data from old and new tables + ! IMPORTANT: test requires isotopes to ocur in the same order in both tables + ! + ! Test if last elements data was correct + itest = itest + 1 + test_array(itest) = testify("Isotope masses of " // trim(cur_element)) + call test_array(itest)%assert(mass_new, mass_old) + + itest = itest + 1 + test_array(itest) = testify("Isotope abundancees of " // trim(cur_element)) + call test_array(itest)%assert(abundance_new, abundance_old) + end subroutine compare + + subroutine create_old_periodic_table(element, mass, abundance) + character(len=3), allocatable, intent(out) :: element(:) + real(r64), allocatable, intent(out) :: mass(:) + real(r64), allocatable, intent(out) :: abundance(:) + + allocate (element(287), mass(287), abundance(287)) + + ! Fill in isotope data. + element(1) = "Ag" + mass(1) = 106.905095_r64 + abundance(1) = 51.84_r64 + element(2) = "Ag" + mass(2) = 108.904754_r64 + abundance(2) = 48.16_r64 + element(3) = "Al" + mass(3) = 26.981541_r64 + abundance(3) = 100.0_r64 + element(4) = "Ar" + mass(4) = 35.967546_r64 + abundance(4) = 0.34_r64 + element(5) = "Ar" + mass(5) = 37.962732_r64 + abundance(5) = 0.063_r64 + element(6) = "Ar" + mass(6) = 39.962383_r64 + abundance(6) = 99.6_r64 + element(7) = "As" + mass(7) = 74.921596_r64 + abundance(7) = 100.0_r64 + element(8) = "Au" + mass(8) = 196.96656_r64 + abundance(8) = 100.0_r64 + element(9) = "B" + mass(9) = 10.012938_r64 + abundance(9) = 19.8_r64 + element(10) = "B" + mass(10) = 11.009305_r64 + abundance(10) = 80.2_r64 + element(11) = "Ba" + mass(11) = 129.906277_r64 + abundance(11) = 0.11_r64 + element(12) = "Ba" + mass(12) = 131.905042_r64 + abundance(12) = 0.1_r64 + element(13) = "Ba" + mass(13) = 133.90449_r64 + abundance(13) = 2.42_r64 + element(14) = "Ba" + mass(14) = 134.905668_r64 + abundance(14) = 6.59_r64 + element(15) = "Ba" + mass(15) = 135.904556_r64 + abundance(15) = 7.85_r64 + element(16) = "Ba" + mass(16) = 136.905816_r64 + abundance(16) = 11.23_r64 + element(17) = "Ba" + mass(17) = 137.905236_r64 + abundance(17) = 71.7_r64 + element(18) = "Be" + mass(18) = 9.012183_r64 + abundance(18) = 100.0_r64 + element(19) = "Bi" + mass(19) = 208.980388_r64 + abundance(19) = 100.0_r64 + element(20) = "Br" + mass(20) = 78.918336_r64 + abundance(20) = 50.69_r64 + element(21) = "Br" + mass(21) = 80.91629_r64 + abundance(21) = 49.31_r64 + element(22) = "C" + mass(22) = 12.0_r64 + abundance(22) = 98.9_r64 + element(23) = "C" + mass(23) = 13.003355_r64 + abundance(23) = 1.1_r64 + element(24) = "Ca" + mass(24) = 39.962591_r64 + abundance(24) = 96.95_r64 + element(25) = "Ca" + mass(25) = 41.958622_r64 + abundance(25) = 0.65_r64 + element(26) = "Ca" + mass(26) = 42.95877_r64 + abundance(26) = 0.14_r64 + element(27) = "Ca" + mass(27) = 43.955485_r64 + abundance(27) = 2.086_r64 + element(28) = "Ca" + mass(28) = 45.953689_r64 + abundance(28) = 0.004_r64 + element(29) = "Ca" + mass(29) = 47.952532_r64 + abundance(29) = 0.19_r64 + element(30) = "Cd" + mass(30) = 105.906461_r64 + abundance(30) = 1.25_r64 + element(31) = "Cd" + mass(31) = 107.904186_r64 + abundance(31) = 0.89_r64 + element(32) = "Cd" + mass(32) = 109.903007_r64 + abundance(32) = 12.49_r64 + element(33) = "Cd" + mass(33) = 110.904182_r64 + abundance(33) = 12.8_r64 + element(34) = "Cd" + mass(34) = 111.902761_r64 + abundance(34) = 24.13_r64 + element(35) = "Cd" + mass(35) = 112.904401_r64 + abundance(35) = 12.22_r64 + element(36) = "Cd" + mass(36) = 113.903361_r64 + abundance(36) = 28.73_r64 + element(37) = "Cd" + mass(37) = 115.904758_r64 + abundance(37) = 7.49_r64 + element(38) = "Ce" + mass(38) = 135.90714_r64 + abundance(38) = 0.19_r64 + element(39) = "Ce" + mass(39) = 137.905996_r64 + abundance(39) = 0.25_r64 + element(40) = "Ce" + mass(40) = 139.905442_r64 + abundance(40) = 88.48_r64 + element(41) = "Ce" + mass(41) = 141.909249_r64 + abundance(41) = 11.08_r64 + element(42) = "Cl" + mass(42) = 34.968853_r64 + abundance(42) = 75.77_r64 + element(43) = "Cl" + mass(43) = 36.965903_r64 + abundance(43) = 24.23_r64 + element(44) = "Co" + mass(44) = 58.933198_r64 + abundance(44) = 100.0_r64 + element(45) = "Cr" + mass(45) = 49.946046_r64 + abundance(45) = 4.35_r64 + element(46) = "Cr" + mass(46) = 51.94051_r64 + abundance(46) = 83.79_r64 + element(47) = "Cr" + mass(47) = 52.940651_r64 + abundance(47) = 9.5_r64 + element(48) = "Cr" + mass(48) = 53.938882_r64 + abundance(48) = 2.36_r64 + element(49) = "Cs" + mass(49) = 132.905433_r64 + abundance(49) = 100.0_r64 + element(50) = "Cu" + mass(50) = 62.929599_r64 + abundance(50) = 69.17_r64 + element(51) = "Cu" + mass(51) = 64.927792_r64 + abundance(51) = 30.83_r64 + element(52) = "Dy" + mass(52) = 155.924287_r64 + abundance(52) = 0.06_r64 + element(53) = "Dy" + mass(53) = 157.924412_r64 + abundance(53) = 0.1_r64 + element(54) = "Dy" + mass(54) = 159.925203_r64 + abundance(54) = 2.34_r64 + element(55) = "Dy" + mass(55) = 160.926939_r64 + abundance(55) = 18.9_r64 + element(56) = "Dy" + mass(56) = 161.926805_r64 + abundance(56) = 25.5_r64 + element(57) = "Dy" + mass(57) = 162.928737_r64 + abundance(57) = 24.9_r64 + element(58) = "Dy" + mass(58) = 163.929183_r64 + abundance(58) = 28.2_r64 + element(59) = "Er" + mass(59) = 161.928787_r64 + abundance(59) = 0.14_r64 + element(60) = "Er" + mass(60) = 163.929211_r64 + abundance(60) = 1.61_r64 + element(61) = "Er" + mass(61) = 165.930305_r64 + abundance(61) = 33.6_r64 + element(62) = "Er" + mass(62) = 166.932061_r64 + abundance(62) = 22.95_r64 + element(63) = "Er" + mass(63) = 167.932383_r64 + abundance(63) = 26.8_r64 + element(64) = "Er" + mass(64) = 169.935476_r64 + abundance(64) = 14.9_r64 + element(65) = "Eu" + mass(65) = 150.91986_r64 + abundance(65) = 47.8_r64 + element(66) = "Eu" + mass(66) = 152.921243_r64 + abundance(66) = 52.2_r64 + element(67) = "F" + mass(67) = 18.998403_r64 + abundance(67) = 100.0_r64 + element(68) = "Fe" + mass(68) = 53.939612_r64 + abundance(68) = 5.8_r64 + element(69) = "Fe" + mass(69) = 55.934939_r64 + abundance(69) = 91.72_r64 + element(70) = "Fe" + mass(70) = 56.935396_r64 + abundance(70) = 2.2_r64 + element(71) = "Fe" + mass(71) = 57.933278_r64 + abundance(71) = 0.28_r64 + element(72) = "Ga" + mass(72) = 68.925581_r64 + abundance(72) = 60.1_r64 + element(73) = "Ga" + mass(73) = 70.924701_r64 + abundance(73) = 39.9_r64 + element(74) = "Gd" + mass(74) = 151.919803_r64 + abundance(74) = 0.2_r64 + element(75) = "Gd" + mass(75) = 153.920876_r64 + abundance(75) = 2.18_r64 + element(76) = "Gd" + mass(76) = 154.822629_r64 + abundance(76) = 14.8_r64 + element(77) = "Gd" + mass(77) = 155.92213_r64 + abundance(77) = 20.47_r64 + element(78) = "Gd" + mass(78) = 156.923967_r64 + abundance(78) = 15.65_r64 + element(79) = "Gd" + mass(79) = 157.924111_r64 + abundance(79) = 24.84_r64 + element(80) = "Gd" + mass(80) = 159.927061_r64 + abundance(80) = 21.86_r64 + element(81) = "Ge" + mass(81) = 69.92425_r64 + abundance(81) = 20.5_r64 + element(82) = "Ge" + mass(82) = 71.92208_r64 + abundance(82) = 27.4_r64 + element(83) = "Ge" + mass(83) = 72.923464_r64 + abundance(83) = 7.8_r64 + element(84) = "Ge" + mass(84) = 73.921179_r64 + abundance(84) = 36.5_r64 + element(85) = "Ge" + mass(85) = 75.921403_r64 + abundance(85) = 7.8_r64 + element(86) = "H" + mass(86) = 1.007825_r64 + abundance(86) = 99.99_r64 + element(87) = "H" + mass(87) = 2.014102_r64 + abundance(87) = 0.015_r64 + element(88) = "He" + mass(88) = 3.016029_r64 + abundance(88) = 0.0001_r64 + element(89) = "He" + mass(89) = 4.002603_r64 + abundance(89) = 100.0_r64 + element(90) = "Hf" + mass(90) = 173.940065_r64 + abundance(90) = 0.16_r64 + element(91) = "Hf" + mass(91) = 175.94142_r64 + abundance(91) = 5.2_r64 + element(92) = "Hf" + mass(92) = 176.943233_r64 + abundance(92) = 18.6_r64 + element(93) = "Hf" + mass(93) = 177.94371_r64 + abundance(93) = 27.1_r64 + element(94) = "Hf" + mass(94) = 178.945827_r64 + abundance(94) = 13.74_r64 + element(95) = "Hf" + mass(95) = 179.946561_r64 + abundance(95) = 35.2_r64 + element(96) = "Hg" + mass(96) = 195.965812_r64 + abundance(96) = 0.15_r64 + element(97) = "Hg" + mass(97) = 197.96676_r64 + abundance(97) = 10.1_r64 + element(98) = "Hg" + mass(98) = 198.968269_r64 + abundance(98) = 17.0_r64 + element(99) = "Hg" + mass(99) = 199.968316_r64 + abundance(99) = 23.1_r64 + element(100) = "Hg" + mass(100) = 200.970293_r64 + abundance(100) = 13.2_r64 + element(101) = "Hg" + mass(101) = 201.970632_r64 + abundance(101) = 29.65_r64 + element(102) = "Hg" + mass(102) = 203.973481_r64 + abundance(102) = 6.8_r64 + element(103) = "Ho" + mass(103) = 164.930332_r64 + abundance(103) = 100.0_r64 + element(104) = "I" + mass(104) = 126.904477_r64 + abundance(104) = 100.0_r64 + element(105) = "In" + mass(105) = 112.904056_r64 + abundance(105) = 4.3_r64 + element(106) = "In" + mass(106) = 114.903875_r64 + abundance(106) = 95.7_r64 + element(107) = "Ir" + mass(107) = 190.960603_r64 + abundance(107) = 37.3_r64 + element(108) = "Ir" + mass(108) = 192.962942_r64 + abundance(108) = 62.7_r64 + element(109) = "K" + mass(109) = 38.963708_r64 + abundance(109) = 93.2_r64 + element(110) = "K" + mass(110) = 39.963999_r64 + abundance(110) = 0.012_r64 + element(111) = "K" + mass(111) = 40.961825_r64 + abundance(111) = 6.73_r64 + element(112) = "Kr" + mass(112) = 77.920397_r64 + abundance(112) = 0.35_r64 + element(113) = "Kr" + mass(113) = 79.916375_r64 + abundance(113) = 2.25_r64 + element(114) = "Kr" + mass(114) = 81.913483_r64 + abundance(114) = 11.6_r64 + element(115) = "Kr" + mass(115) = 82.914134_r64 + abundance(115) = 11.5_r64 + element(116) = "Kr" + mass(116) = 83.911506_r64 + abundance(116) = 57.0_r64 + element(117) = "Kr" + mass(117) = 85.910614_r64 + abundance(117) = 17.3_r64 + element(118) = "La" + mass(118) = 137.907114_r64 + abundance(118) = 0.09_r64 + element(119) = "La" + mass(119) = 138.906355_r64 + abundance(119) = 99.91_r64 + element(120) = "Li" + mass(120) = 6.015123_r64 + abundance(120) = 7.42_r64 + element(121) = "Li" + mass(121) = 7.016005_r64 + abundance(121) = 92.58_r64 + element(122) = "Lu" + mass(122) = 174.940785_r64 + abundance(122) = 97.4_r64 + element(123) = "Lu" + mass(123) = 175.942694_r64 + abundance(123) = 2.6_r64 + element(124) = "Mg" + mass(124) = 23.985045_r64 + abundance(124) = 78.9_r64 + element(125) = "Mg" + mass(125) = 24.985839_r64 + abundance(125) = 10.0_r64 + element(126) = "Mg" + mass(126) = 25.982595_r64 + abundance(126) = 11.1_r64 + element(127) = "Mn" + mass(127) = 54.938046_r64 + abundance(127) = 100.0_r64 + element(128) = "Mo" + mass(128) = 91.906809_r64 + abundance(128) = 14.84_r64 + element(129) = "Mo" + mass(129) = 93.905086_r64 + abundance(129) = 9.25_r64 + element(130) = "Mo" + mass(130) = 94.905838_r64 + abundance(130) = 15.92_r64 + element(131) = "Mo" + mass(131) = 95.904676_r64 + abundance(131) = 16.68_r64 + element(132) = "Mo" + mass(132) = 96.906018_r64 + abundance(132) = 9.55_r64 + element(133) = "Mo" + mass(133) = 97.905405_r64 + abundance(133) = 24.13_r64 + element(134) = "Mo" + mass(134) = 99.907473_r64 + abundance(134) = 9.63_r64 + element(135) = "N" + mass(135) = 14.003074_r64 + abundance(135) = 99.63_r64 + element(136) = "N" + mass(136) = 15.000109_r64 + abundance(136) = 0.37_r64 + element(137) = "Na" + mass(137) = 22.98977_r64 + abundance(137) = 100.0_r64 + element(138) = "Nb" + mass(138) = 92.906378_r64 + abundance(138) = 100.0_r64 + element(139) = "Nd" + mass(139) = 141.907731_r64 + abundance(139) = 27.13_r64 + element(140) = "Nd" + mass(140) = 142.909823_r64 + abundance(140) = 12.18_r64 + element(141) = "Nd" + mass(141) = 143.910096_r64 + abundance(141) = 23.8_r64 + element(142) = "Nd" + mass(142) = 144.912582_r64 + abundance(142) = 8.3_r64 + element(143) = "Nd" + mass(143) = 145.913126_r64 + abundance(143) = 17.19_r64 + element(144) = "Nd" + mass(144) = 147.916901_r64 + abundance(144) = 5.76_r64 + element(145) = "Nd" + mass(145) = 149.9209_r64 + abundance(145) = 5.64_r64 + element(146) = "Ne" + mass(146) = 19.992439_r64 + abundance(146) = 90.6_r64 + element(147) = "Ne" + mass(147) = 20.993845_r64 + abundance(147) = 0.26_r64 + element(148) = "Ne" + mass(148) = 21.991384_r64 + abundance(148) = 9.2_r64 + element(149) = "Ni" + mass(149) = 57.935347_r64 + abundance(149) = 68.27_r64 + element(150) = "Ni" + mass(150) = 59.930789_r64 + abundance(150) = 26.1_r64 + element(151) = "Ni" + mass(151) = 60.931059_r64 + abundance(151) = 1.13_r64 + element(152) = "Ni" + mass(152) = 61.928346_r64 + abundance(152) = 3.59_r64 + element(153) = "Ni" + mass(153) = 63.927968_r64 + abundance(153) = 0.91_r64 + element(154) = "O" + mass(154) = 15.994915_r64 + abundance(154) = 99.76_r64 + element(155) = "O" + mass(155) = 16.999131_r64 + abundance(155) = 0.038_r64 + element(156) = "O" + mass(156) = 17.999159_r64 + abundance(156) = 0.2_r64 + element(157) = "Os" + mass(157) = 183.952514_r64 + abundance(157) = 0.02_r64 + element(158) = "Os" + mass(158) = 185.953852_r64 + abundance(158) = 1.58_r64 + element(159) = "Os" + mass(159) = 186.955762_r64 + abundance(159) = 1.6_r64 + element(160) = "Os" + mass(160) = 187.95585_r64 + abundance(160) = 13.3_r64 + element(161) = "Os" + mass(161) = 188.958156_r64 + abundance(161) = 16.1_r64 + element(162) = "Os" + mass(162) = 189.958455_r64 + abundance(162) = 26.4_r64 + element(163) = "Os" + mass(163) = 191.961487_r64 + abundance(163) = 41.0_r64 + element(164) = "P" + mass(164) = 30.973763_r64 + abundance(164) = 100.0_r64 + element(165) = "Pb" + mass(165) = 203.973037_r64 + abundance(165) = 1.4_r64 + element(166) = "Pb" + mass(166) = 205.974455_r64 + abundance(166) = 24.1_r64 + element(167) = "Pb" + mass(167) = 206.975885_r64 + abundance(167) = 22.1_r64 + element(168) = "Pb" + mass(168) = 207.976641_r64 + abundance(168) = 52.4_r64 + element(169) = "Pd" + mass(169) = 101.905609_r64 + abundance(169) = 1.02_r64 + element(170) = "Pd" + mass(170) = 103.904026_r64 + abundance(170) = 11.14_r64 + element(171) = "Pd" + mass(171) = 104.905075_r64 + abundance(171) = 22.33_r64 + element(172) = "Pd" + mass(172) = 105.903475_r64 + abundance(172) = 27.33_r64 + element(173) = "Pd" + mass(173) = 107.903894_r64 + abundance(173) = 26.46_r64 + element(174) = "Pd" + mass(174) = 109.905169_r64 + abundance(174) = 11.72_r64 + element(175) = "Pr" + mass(175) = 140.907657_r64 + abundance(175) = 100.0_r64 + element(176) = "Pt" + mass(176) = 189.959937_r64 + abundance(176) = 0.01_r64 + element(177) = "Pt" + mass(177) = 191.961049_r64 + abundance(177) = 0.79_r64 + element(178) = "Pt" + mass(178) = 193.962679_r64 + abundance(178) = 32.9_r64 + element(179) = "Pt" + mass(179) = 194.964785_r64 + abundance(179) = 33.8_r64 + element(180) = "Pt" + mass(180) = 195.964947_r64 + abundance(180) = 25.3_r64 + element(181) = "Pt" + mass(181) = 197.967879_r64 + abundance(181) = 7.2_r64 + element(182) = "Rb" + mass(182) = 84.9118_r64 + abundance(182) = 72.17_r64 + element(183) = "Rb" + mass(183) = 86.909184_r64 + abundance(183) = 27.84_r64 + element(184) = "Re" + mass(184) = 184.952977_r64 + abundance(184) = 37.4_r64 + element(185) = "Re" + mass(185) = 186.955765_r64 + abundance(185) = 62.6_r64 + element(186) = "Rh" + mass(186) = 102.905503_r64 + abundance(186) = 100.0_r64 + element(187) = "Ru" + mass(187) = 95.907596_r64 + abundance(187) = 5.52_r64 + element(188) = "Ru" + mass(188) = 97.905287_r64 + abundance(188) = 1.88_r64 + element(189) = "Ru" + mass(189) = 98.905937_r64 + abundance(189) = 12.7_r64 + element(190) = "Ru" + mass(190) = 99.904218_r64 + abundance(190) = 12.6_r64 + element(191) = "Ru" + mass(191) = 100.905581_r64 + abundance(191) = 17.0_r64 + element(192) = "Ru" + mass(192) = 101.904348_r64 + abundance(192) = 31.6_r64 + element(193) = "Ru" + mass(193) = 103.905422_r64 + abundance(193) = 18.7_r64 + element(194) = "S" + mass(194) = 31.972072_r64 + abundance(194) = 95.02_r64 + element(195) = "S" + mass(195) = 32.971459_r64 + abundance(195) = 0.75_r64 + element(196) = "S" + mass(196) = 33.967868_r64 + abundance(196) = 4.21_r64 + element(197) = "S" + mass(197) = 35.967079_r64 + abundance(197) = 0.02_r64 + element(198) = "Sb" + mass(198) = 120.903824_r64 + abundance(198) = 57.3_r64 + element(199) = "Sb" + mass(199) = 122.904222_r64 + abundance(199) = 42.7_r64 + element(200) = "Sc" + mass(200) = 44.955914_r64 + abundance(200) = 100.0_r64 + element(201) = "Se" + mass(201) = 73.922477_r64 + abundance(201) = 0.9_r64 + element(202) = "Se" + mass(202) = 75.919207_r64 + abundance(202) = 9.0_r64 + element(203) = "Se" + mass(203) = 76.919908_r64 + abundance(203) = 7.6_r64 + element(204) = "Se" + mass(204) = 77.917304_r64 + abundance(204) = 23.5_r64 + element(205) = "Se" + mass(205) = 79.916521_r64 + abundance(205) = 49.6_r64 + element(206) = "Se" + mass(206) = 81.916709_r64 + abundance(206) = 9.4_r64 + element(207) = "Si" + mass(207) = 27.976928_r64 + abundance(207) = 92.23_r64 + element(208) = "Si" + mass(208) = 28.976496_r64 + abundance(208) = 4.67_r64 + element(209) = "Si" + mass(209) = 29.973772_r64 + abundance(209) = 3.1_r64 + element(210) = "Sm" + mass(210) = 143.912009_r64 + abundance(210) = 3.1_r64 + element(211) = "Sm" + mass(211) = 146.914907_r64 + abundance(211) = 15.0_r64 + element(212) = "Sm" + mass(212) = 147.914832_r64 + abundance(212) = 11.3_r64 + element(213) = "Sm" + mass(213) = 148.917193_r64 + abundance(213) = 13.8_r64 + element(214) = "Sm" + mass(214) = 149.917285_r64 + abundance(214) = 7.4_r64 + element(215) = "Sm" + mass(215) = 151.919741_r64 + abundance(215) = 26.7_r64 + element(216) = "Sm" + mass(216) = 153.922218_r64 + abundance(216) = 22.7_r64 + element(217) = "Sn" + mass(217) = 111.904826_r64 + abundance(217) = 0.97_r64 + element(218) = "Sn" + mass(218) = 113.902784_r64 + abundance(218) = 0.65_r64 + element(219) = "Sn" + mass(219) = 114.903348_r64 + abundance(219) = 0.36_r64 + element(220) = "Sn" + mass(220) = 115.901744_r64 + abundance(220) = 14.7_r64 + element(221) = "Sn" + mass(221) = 116.902954_r64 + abundance(221) = 7.7_r64 + element(222) = "Sn" + mass(222) = 117.901607_r64 + abundance(222) = 24.3_r64 + element(223) = "Sn" + mass(223) = 118.90331_r64 + abundance(223) = 8.6_r64 + element(224) = "Sn" + mass(224) = 119.902199_r64 + abundance(224) = 32.4_r64 + element(225) = "Sn" + mass(225) = 121.90344_r64 + abundance(225) = 4.6_r64 + element(226) = "Sn" + mass(226) = 123.905271_r64 + abundance(226) = 5.6_r64 + element(227) = "Sr" + mass(227) = 83.913428_r64 + abundance(227) = 0.56_r64 + element(228) = "Sr" + mass(228) = 85.909273_r64 + abundance(228) = 9.86_r64 + element(229) = "Sr" + mass(229) = 86.908902_r64 + abundance(229) = 7.0_r64 + element(230) = "Sr" + mass(230) = 87.905625_r64 + abundance(230) = 82.58_r64 + element(231) = "Ta" + mass(231) = 179.947489_r64 + abundance(231) = 0.012_r64 + element(232) = "Ta" + mass(232) = 180.948014_r64 + abundance(232) = 99.99_r64 + element(233) = "Tb" + mass(233) = 158.92535_r64 + abundance(233) = 100.0_r64 + element(234) = "Te" + mass(234) = 119.904021_r64 + abundance(234) = 0.096_r64 + element(235) = "Te" + mass(235) = 121.903055_r64 + abundance(235) = 2.6_r64 + element(236) = "Te" + mass(236) = 122.904278_r64 + abundance(236) = 0.91_r64 + element(237) = "Te" + mass(237) = 123.902825_r64 + abundance(237) = 4.82_r64 + element(238) = "Te" + mass(238) = 124.904435_r64 + abundance(238) = 7.14_r64 + element(239) = "Te" + mass(239) = 125.90331_r64 + abundance(239) = 18.95_r64 + element(240) = "Te" + mass(240) = 127.904464_r64 + abundance(240) = 31.69_r64 + element(241) = "Te" + mass(241) = 129.906229_r64 + abundance(241) = 33.8_r64 + element(242) = "Th" + mass(242) = 232.038054_r64 + abundance(242) = 100.0_r64 + element(243) = "Ti" + mass(243) = 45.952633_r64 + abundance(243) = 8.0_r64 + element(244) = "Ti" + mass(244) = 46.951765_r64 + abundance(244) = 7.3_r64 + element(245) = "Ti" + mass(245) = 47.947947_r64 + abundance(245) = 73.8_r64 + element(246) = "Ti" + mass(246) = 48.947871_r64 + abundance(246) = 5.5_r64 + element(247) = "Ti" + mass(247) = 49.944786_r64 + abundance(247) = 5.4_r64 + element(248) = "Tl" + mass(248) = 202.972336_r64 + abundance(248) = 29.52_r64 + element(249) = "Tl" + mass(249) = 204.97441_r64 + abundance(249) = 70.48_r64 + element(250) = "Tm" + mass(250) = 168.934225_r64 + abundance(250) = 100.0_r64 + element(251) = "U" + mass(251) = 234.040947_r64 + abundance(251) = 0.006_r64 + element(252) = "U" + mass(252) = 235.043925_r64 + abundance(252) = 0.72_r64 + element(253) = "U" + mass(253) = 238.050786_r64 + abundance(253) = 99.27_r64 + element(254) = "V" + mass(254) = 49.947161_r64 + abundance(254) = 0.25_r64 + element(255) = "V" + mass(255) = 50.943963_r64 + abundance(255) = 99.75_r64 + element(256) = "W" + mass(256) = 179.946727_r64 + abundance(256) = 0.13_r64 + element(257) = "W" + mass(257) = 181.948225_r64 + abundance(257) = 26.3_r64 + element(258) = "W" + mass(258) = 182.950245_r64 + abundance(258) = 14.3_r64 + element(259) = "W" + mass(259) = 183.950953_r64 + abundance(259) = 30.67_r64 + element(260) = "W" + mass(260) = 185.954377_r64 + abundance(260) = 28.6_r64 + element(261) = "Xe" + mass(261) = 123.905894_r64 + abundance(261) = 0.1_r64 + element(262) = "Xe" + mass(262) = 125.904281_r64 + abundance(262) = 0.09_r64 + element(263) = "Xe" + mass(263) = 127.903531_r64 + abundance(263) = 1.91_r64 + element(264) = "Xe" + mass(264) = 128.90478_r64 + abundance(264) = 26.4_r64 + element(265) = "Xe" + mass(265) = 129.90351_r64 + abundance(265) = 4.1_r64 + element(266) = "Xe" + mass(266) = 130.905076_r64 + abundance(266) = 21.2_r64 + element(267) = "Xe" + mass(267) = 131.904148_r64 + abundance(267) = 26.9_r64 + element(268) = "Xe" + mass(268) = 133.905395_r64 + abundance(268) = 10.4_r64 + element(269) = "Xe" + mass(269) = 135.907219_r64 + abundance(269) = 8.9_r64 + element(270) = "Y" + mass(270) = 88.905856_r64 + abundance(270) = 100.0_r64 + element(271) = "Yb" + mass(271) = 167.933908_r64 + abundance(271) = 0.13_r64 + element(272) = "Yb" + mass(272) = 169.934774_r64 + abundance(272) = 3.05_r64 + element(273) = "Yb" + mass(273) = 170.936338_r64 + abundance(273) = 14.3_r64 + element(274) = "Yb" + mass(274) = 171.936393_r64 + abundance(274) = 21.9_r64 + element(275) = "Yb" + mass(275) = 172.938222_r64 + abundance(275) = 16.12_r64 + element(276) = "Yb" + mass(276) = 173.938873_r64 + abundance(276) = 31.8_r64 + element(277) = "Yb" + mass(277) = 175.942576_r64 + abundance(277) = 12.7_r64 + element(278) = "Zn" + mass(278) = 63.929145_r64 + abundance(278) = 48.6_r64 + element(279) = "Zn" + mass(279) = 65.926035_r64 + abundance(279) = 27.9_r64 + element(280) = "Zn" + mass(280) = 66.927129_r64 + abundance(280) = 4.1_r64 + element(281) = "Zn" + mass(281) = 67.924846_r64 + abundance(281) = 18.8_r64 + element(282) = "Zn" + mass(282) = 69.925325_r64 + abundance(282) = 0.6_r64 + element(283) = "Zr" + mass(283) = 89.904708_r64 + abundance(283) = 51.45_r64 + element(284) = "Zr" + mass(284) = 90.905644_r64 + abundance(284) = 11.27_r64 + element(285) = "Zr" + mass(285) = 91.905039_r64 + abundance(285) = 17.17_r64 + element(286) = "Zr" + mass(286) = 93.906319_r64 + abundance(286) = 17.33_r64 + element(287) = "Zr" + mass(287) = 95.908272_r64 + abundance(287) = 2.78_r64 + end subroutine create_old_periodic_table +end program test_periodictable