Почему эта функция возвращает разные значения?

Я написал функцию в 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

Заранее спасибо!

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]