Skip to content

Commit

Permalink
add orbital formatting
Browse files Browse the repository at this point in the history
  • Loading branch information
KommuSoft committed Jul 28, 2023
1 parent 10e5653 commit 20737d6
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 21 deletions.
1 change: 1 addition & 0 deletions chem-formula.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ library
, Chemistry.Element
, Chemistry.Formula
, Chemistry.Isotope
, Chemistry.Orbit
, Chemistry.Parser
build-depends:
base >= 4.7 && < 5
Expand Down
21 changes: 0 additions & 21 deletions src/Chemistry/Element.hs
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,6 @@ module Chemistry.Element (
, elementName
-- * Possible covalent bonds
, covalentBonds
-- * Orbitals
, molecularOrbital, dd
-- * Colors
, withElementColorS, elementCPK, symbolColoured, symbolColouredS
) where
Expand All @@ -50,14 +48,6 @@ import Numeric.Units.Dimensional.NonSI (dalton)
import Text.Blaze(ToMarkup(toMarkup), preEscapedString)
import Test.QuickCheck.Arbitrary(Arbitrary(arbitrary), arbitraryBoundedEnum)

data Orbital = OrbS | OrbP | OrbD | OrbF | OrbG

maxElectronsPerOrbital :: Int -> Int
maxElectronsPerOrbital n = 4*n + 2

orbitalNames :: [Char]
orbitalNames = "spdfgh"

-- | A data type that defines the different chemical elements.
data Element
= H -- ^ The /hydrogen/ element.
Expand Down Expand Up @@ -255,17 +245,6 @@ pattern Uus = Ts
pattern Uuo :: Element
pattern Uuo = Og

molecularOrbital :: Element -> [(Int, Char, Int)]
molecularOrbital = fill 0 0 . atomNumber
where fill _ _ 0 = []
fill m 0 k = (m+1, 's', d) : fill (m - (m-1) `div` 2) ((m+1) `div` 2) (k-d)
where d = min 2 k
fill m n k = (m+1, "spdfg" !! n, d) : fill (m+1) (n-1) (k-d)
where d = min (maxElectronsPerOrbital n) k

-- electronsPerShell :: Element -> [Int]
-- electronsPerShell = map sum . molecularOrbital

-- | Obtain the atomic number of the given 'Element'.
atomNumber :: Element -- ^ The element for which we want to calculate the atomic number.
-> Int -- ^ The atomic number of the given element.
Expand Down
31 changes: 31 additions & 0 deletions src/Chemistry/Orbit.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
module Chemistry.Orbit where

import Data.List.NonEmpty(NonEmpty)

data Orbit = S | P | D | F | G deriving (Enum, Eq, Ord, Read, Show)
newtype OrbitalConfig = OrbitalConfig (NonEmpty (NonEmpty Int)) deriving (Eq, Ord, Read, Show)

totalElectrons :: OrbitalConfig -> Int
totalElectrons (OrbitalConfig vs) = sum (fmap sum vs)

toArrowText :: Int -> Int -> String
toArrowText n k = concat (replicate f "\8645\8414" ++ [ "\8593\8414" | h == 1 ] ++ replicate ((maxElectronsForOrbit' n `div` 2) - f - h) " \8414")
where ~(f, h) = k `divMod` 2

maxElectronsForOrbit' :: Int -> Int
maxElectronsForOrbit' = (2+) . (4*)

maxElectronsForOrbit :: Orbit -> Int
maxElectronsForOrbit = maxElectronsForOrbit' . fromEnum

electronsToOrbitals :: Int -> [(Int, Orbit, Int)]
electronsToOrbitals = fill 0 0
where fill _ _ 0 = []
fill m 0 k = (m+1, S, d) : fill (m - (m-1) `div` 2) ((m+1) `div` 2) (k-d)
where d = min 2 k
fill m n k = (m+1, toEnum n, d) : fill (m+1) (n-1) (k-d)
where d = min (maxElectronsForOrbit' n) k

-- electronsPerShell :: Element -> [Int]
-- electronsPerShell = map sum . molecularOrbital

0 comments on commit 20737d6

Please sign in to comment.