ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/math/RealSphericalHarmonic.cpp
Revision: 1850
Committed: Wed Feb 20 15:39:39 2013 UTC (12 years, 2 months ago) by gezelter
File size: 4054 byte(s)
Log Message:
Fixed a widespread typo in the license 

File Contents

# User Rev Content
1 gezelter 507 /*
2 gezelter 246 * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3     *
4     * The University of Notre Dame grants you ("Licensee") a
5     * non-exclusive, royalty free, license to use, modify and
6     * redistribute this software in source and binary code form, provided
7     * that the following conditions are met:
8     *
9 gezelter 1390 * 1. Redistributions of source code must retain the above copyright
10 gezelter 246 * notice, this list of conditions and the following disclaimer.
11     *
12 gezelter 1390 * 2. Redistributions in binary form must reproduce the above copyright
13 gezelter 246 * notice, this list of conditions and the following disclaimer in the
14     * documentation and/or other materials provided with the
15     * distribution.
16     *
17     * This software is provided "AS IS," without a warranty of any
18     * kind. All express or implied conditions, representations and
19     * warranties, including any implied warranty of merchantability,
20     * fitness for a particular purpose or non-infringement, are hereby
21     * excluded. The University of Notre Dame and its licensors shall not
22     * be liable for any damages suffered by licensee as a result of
23     * using, modifying or distributing the software or its
24     * derivatives. In no event will the University of Notre Dame or its
25     * licensors be liable for any lost revenue, profit or data, or for
26     * direct, indirect, special, consequential, incidental or punitive
27     * damages, however caused and regardless of the theory of liability,
28     * arising out of the use of or inability to use software, even if the
29     * University of Notre Dame has been advised of the possibility of
30     * such damages.
31 gezelter 1390 *
32     * SUPPORT OPEN SCIENCE! If you use OpenMD or its source code in your
33     * research, please cite the appropriate papers when you publish your
34     * work. Good starting points are:
35     *
36     * [1] Meineke, et al., J. Comp. Chem. 26, 252-271 (2005).
37     * [2] Fennell & Gezelter, J. Chem. Phys. 124, 234104 (2006).
38 gezelter 1850 * [3] Sun, Lin & Gezelter, J. Chem. Phys. 128, 234107 (2008).
39 gezelter 1665 * [4] Kuang & Gezelter, J. Chem. Phys. 133, 164101 (2010).
40     * [5] Vardeman, Stocker & Gezelter, J. Chem. Theory Comput. 7, 834 (2011).
41 gezelter 246 */
42    
43 gezelter 98 #include <stdio.h>
44     #include <cmath>
45 chuckv 526 #include <limits>
46 gezelter 98 #include "math/RealSphericalHarmonic.hpp"
47    
48 gezelter 1390 using namespace OpenMD;
49 gezelter 98
50     RealSphericalHarmonic::RealSphericalHarmonic() {
51     }
52    
53 tim 963 RealType RealSphericalHarmonic::getValueAt(RealType costheta, RealType phi) {
54 gezelter 98
55 tim 963 RealType p, phase;
56 gezelter 98
57     // associated Legendre polynomial
58     p = LegendreP(L,M,costheta);
59 chrisfen 195
60 gezelter 158 if (functionType == RSH_SIN) {
61 tim 963 phase = sin((RealType)M * phi);
62 gezelter 98 } else {
63 tim 963 phase = cos((RealType)M * phi);
64 gezelter 98 }
65    
66     return coefficient*p*phase;
67    
68     }
69    
70     //---------------------------------------------------------------------------//
71     //
72 tim 963 // RealType LegendreP (int l, int m, RealType x);
73 gezelter 98 //
74     // Computes the value of the associated Legendre polynomial P_lm (x)
75     // of order l at a given point.
76     //
77     // Input:
78     // l = degree of the polynomial >= 0
79     // m = parameter satisfying 0 <= m <= l,
80     // x = point in which the computation is performed, range -1 <= x <= 1.
81     // Returns:
82     // value of the polynomial in x
83     //
84     //---------------------------------------------------------------------------//
85 tim 963 RealType RealSphericalHarmonic::LegendreP (int l, int m, RealType x) {
86 gezelter 98 // check parameters
87     if (m < 0 || m > l || fabs(x) > 1.0) {
88     printf("LegendreP got a bad argument: l = %d\tm = %d\tx = %lf\n", l, m, x);
89 chuckv 526 // return NAN;
90 tim 963 return std::numeric_limits <RealType>:: quiet_NaN();
91 gezelter 98 }
92    
93 tim 963 RealType pmm = 1.0;
94 gezelter 98 if (m > 0) {
95 tim 963 RealType h = sqrt((1.0-x)*(1.0+x)),
96 gezelter 98 f = 1.0;
97     for (int i = 1; i <= m; i++) {
98     pmm *= -f * h;
99     f += 2.0;
100     }
101     }
102     if (l == m)
103     return pmm;
104     else {
105 tim 963 RealType pmmp1 = x * (2 * m + 1) * pmm;
106 gezelter 98 if (l == (m+1))
107     return pmmp1;
108     else {
109 tim 963 RealType pll = 0.0;
110 gezelter 98 for (int ll = m+2; ll <= l; ll++) {
111     pll = (x * (2 * ll - 1) * pmmp1 - (ll + m - 1) * pmm) / (ll - m);
112     pmm = pmmp1;
113     pmmp1 = pll;
114     }
115     return pll;
116     }
117     }
118     }
119    

Properties

Name Value
svn:keywords Author Id Revision Date