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