Я написал функцию в C ++ для вычисления сферической гармоники (используя комплексную библиотеку gcc):
#include <iostream>
#include <cmath>
#include <complex>
using namespace std;
double plegendre( int, int, double );
complex<double> SphericalHarmonicY( int l, int m, double theta, double phi )
{
int m_abs;
double im, re, plm;
complex<double> output;
m_abs = fabs(m);
plm = plegendre( l, m_abs, cos( theta ) );
re = plm * cos( m * phi );
im = plm * sin( m * phi );
if ( m < 0 )
{
re = - re;
im = - im;
}
output = complex<double>( re, im );
cout << " {" << l << "," << m << "}\t" << "theta = " << theta << " phi = " << phi <<
" SH = " << output << endl;
return output;
}
Если я вызываю эту функцию через простой метод main (), она работает и выдает правильные значения.
Однако при вызове через подпрограмму ниже она дает правильную действительную часть только для значений m, которые являются четными, и правильную мнимую часть для значений m, которые являются нечетными. Кто-нибудь может объяснить это?
#include <iostream>
#include <cmath>
#include <complex>
#include "MyHeader.h"
void SphericalHarmCalc( int* P, double* theta, double* phi, SpherHarm** &SHout )
{
int l, m, i{0};
double theta_, phi_;
theta_ = *theta;
phi_ = *phi;
SHout = new SpherHarm*[(*P)+1];
for ( i = 0; i <= (*P); i++ )
{
SHout[i] = new SpherHarm[(2*i)+1];
}
for ( l = 0; l <= (*P); l++)
{
i = 0;
for ( m = -l; m <= l; m++ )
{
SHout[l][i].lm[0] = l;
SHout[l][i].lm[1] = m;
SHout[l][i].val = SphericalHarmonicY( l, m, theta_, phi_ );
i++;
}
cout << endl << endl;
}
}
Это сбило меня с толку в течение некоторого времени.
(также я использую delete[]
чтобы освободить кучу позже — вне этой подпрограммы).
Класс SpherHarm определен в MyHeader.h:
class SpherHarm
{
public:
int* lm = new int[2];
complex<double> val;
};
И я использую компилятор g ++ (версия 4.8.2) с флагами:
g++ -Wall -std=c++11
Заранее спасибо!
Задача ещё не решена.
Других решений пока нет …