Normalize basis set name to filename-safe format
Rules: * -> s + -> p Remove parentheses and commas
Examples: 6-31G -> 6-31Gs 6-31+G -> 6-31pGs 6-31G(d) -> 6-31Gd 6-311G(d,p) -> 6-311Gdp 6-311++G** -> 6-311ppGss cc-pVDZ -> cc-pVDZ (unchanged)
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| character(len=*), | intent(in) | :: | basis_name |
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| character(len=256), | private | :: | buffer | ||||
| integer, | private | :: | i | ||||
| logical, | private | :: | in_parens | ||||
| integer, | private | :: | out_pos |
pure function normalize_basis_name(basis_name) result(normalized) !! Normalize basis set name to filename-safe format !! !! Rules: !! * -> s !! + -> p !! Remove parentheses and commas !! !! Examples: !! 6-31G* -> 6-31Gs !! 6-31+G* -> 6-31pGs !! 6-31G(d) -> 6-31Gd !! 6-311G(d,p) -> 6-311Gdp !! 6-311++G** -> 6-311ppGss !! cc-pVDZ -> cc-pVDZ (unchanged) character(len=*), intent(in) :: basis_name character(len=:), allocatable :: normalized integer :: i, out_pos character(len=256) :: buffer logical :: in_parens buffer = "" out_pos = 0 in_parens = .false. do i = 1, len_trim(basis_name) select case (basis_name(i:i)) case ('*') ! Star becomes 's' out_pos = out_pos + 1 buffer(out_pos:out_pos) = 's' case ('+') ! Plus becomes 'p' out_pos = out_pos + 1 buffer(out_pos:out_pos) = 'p' case ('(') ! Start of parentheses - we'll extract contents in_parens = .true. case (')') ! End of parentheses in_parens = .false. case (',', ' ') ! Skip commas and spaces (inside or outside parentheses) continue case default ! Copy character as-is out_pos = out_pos + 1 buffer(out_pos:out_pos) = basis_name(i:i) end select end do normalized = trim(buffer(1:out_pos)) end function normalize_basis_name