1 //
2 // basis_function.c
3 // libmsym
4 //
5 // Created by Marcus Johansson on 07/11/14.
6 // Copyright (c) 2014 Marcus Johansson.
7 //
8 // Distributed under the MIT License ( See LICENSE file or copy at http://opensource.org/licenses/MIT )
9 //
10
11 #include <stdlib.h>
12 #include <string.h>
13
14 #include "basis_function.h"
15
16 //These are real shperical harmonics cannot handle complex
basisFunctionFromQuantumNumbers(int n,int l,int m,msym_basis_function_t * bf)17 msym_error_t basisFunctionFromQuantumNumbers(int n, int l, int m, msym_basis_function_t *bf){
18
19 if(l > n || abs(m) > l) goto err;
20
21 bf->f.rsh.n = n;
22 bf->f.rsh.l = l;
23 bf->f.rsh.m = m;
24
25 memset(bf->name,0,sizeof(bf->name));
26
27 switch(l) {
28 case 0 :
29 snprintf(bf->name, sizeof(bf->name), "%ds",n);
30 break;
31 case 1 : {
32 char *d = "?";
33 switch(m) {
34 case -1 :
35 d = "y";
36 break;
37 case 1 :
38 d = "x";
39 break;
40 case 0 :
41 d = "z";
42 break;
43 }
44 snprintf(bf->name, sizeof(bf->name), "%dp%s",n,d);
45 break;
46 }
47 case 2 : {
48 char *d = (m < 0 ? "-" : "+");
49 snprintf(bf->name, sizeof(bf->name), "%dd%d%s",n,abs(m),d);
50 break;
51 }
52 default : {
53 char t = l <= 20 ? ('f' - 3 + l + (l >= 7) + (l >= 12) + (l >= 14)) : '?';
54 char *d = (m == 0 ? "" : m < 0 ? "-" : "+");
55 snprintf(bf->name, sizeof(bf->name), "%d%c%d%s",n,t,abs(m),d);
56 }
57 }
58 return MSYM_SUCCESS;
59 err:
60 msymSetErrorDetails("Invalid orbital quantum numbers n:%d l:%d m:%d",n,l,m);
61 return MSYM_INVALID_BASIS_FUNCTIONS;
62 }
63
basisFunctionFromName(char * name,msym_basis_function_t * bf)64 msym_error_t basisFunctionFromName(char *name, msym_basis_function_t *bf){
65 int n, l, m;
66 char cl, cm1 = '\0', cm2 = '\0';
67
68 sscanf(name,"%d%c%c%c",&n,&cl,&cm1,&cm2);
69
70 switch(cl) {
71 case 's' : l = m = 0; break;
72 case 'p' : {
73 l = 1;
74 switch(cm1) {
75 case 'x' : m = 1; break;
76 case 'y' : m = -1; break;
77 case 'z' : m = 0; break;
78 default : goto err;
79 }
80 break;
81 }
82 default :
83 if(cl < 'd' || cl == 'e' || cl == 'j' || cl > 'z') goto err;
84
85 l = cl - 'd' + 2 - (cl > 'e') - (cl > 'j') - (cl > 'p') - (cl > 's');
86
87 m = (cm1 - (int)'0')*(cm2 == '-' ? -1 : 1);
88 }
89
90 return basisFunctionFromQuantumNumbers(n,l,m,bf);
91
92 err:
93 msymSetErrorDetails("Invalid orbital name %s",name);
94 return MSYM_INVALID_BASIS_FUNCTIONS;
95
96 }
97