6 #define GSL_SIGN(x) (x<0 ? -1: (x>0 ? 1: 0))
29 this->
_M_n_m=
new std::complex <double>[(this->
p+1)*(this->
p+2)/2];
30 for (
unsigned int i=0; i<(this->
p+1)*(this->
p+2)/2; ++i)
31 this->
_M_n_m[i] = std::complex <double>(0.0,0.0);
41 this->
_M_n_m =
new std::complex <double>[(this->
p+1)*(this->
p+2)/2];
42 memcpy(this->
_M_n_m, other.
GetCoeffs(),
sizeof(std::complex <double>)*(this->
p+1)*(this->
p+2)/2);
55 this->
_M_n_m =
new std::complex <double>[(this->
p+1)*(this->
p+2)/2];
56 memcpy(this->
_M_n_m, other.
GetCoeffs(),
sizeof(std::complex <double>)*(this->
p+1)*(this->
p+2)/2);
71 if (multipole.
is_zero || sol==0)
77 for (
int n = 0; n < int(this->
p)+1 ; n++)
78 for (
int m = 0; m < n + 1 ; m++)
80 std::complex <double> a = multipole.
GetCoeff(n,m)*sol;
98 dealii::Point<3> pointRelPos = point + (-1.0*this->
center);
99 double rho = sqrt(pointRelPos.square());
100 double cos_alpha_ = pointRelPos(2)/rho;
101 double beta = atan2(pointRelPos(1),pointRelPos(0));
103 for (
int n = 0; n < int(this->
p) + 1 ; n++)
105 for (
int m = 0; m < n + 1 ; m++)
108 double realFact = P_n_m * pow(rho,
double(n)) * strength;
109 std::complex <double> a = exp(std::complex<double>(0.,-m*beta))*realFact;
127 dealii::Point<3> pointRelPos = point + (-1.0*this->
center);
128 dealii::Tensor<1,3> normVersor = normal/sqrt(normal[0]*normal[0]+normal[1]*normal[1]+normal[2]*normal[2]);
129 double rho = sqrt(pointRelPos.square());
130 double dRhodN = (pointRelPos/rho)*normVersor;
131 double beta = atan2(pointRelPos(1),pointRelPos(0));
132 double dBetadN = (dealii::Point<3>( -pointRelPos(1), pointRelPos(0), 0.)/(pow(pointRelPos(0),2.)+pow(pointRelPos(1),2.)))*normVersor;
134 double cos_alpha_ = pointRelPos(2)/rho;
135 double dAlphadN = (dealii::Point<3>( cos_alpha_*cos(beta),cos_alpha_*sin(beta),-sqrt(1.-pow(cos_alpha_,2.)))/rho) * normVersor;
140 for (
int n = 0; n < int(this->
p) + 1 ; n++)
142 for (
int m = 0; m < n + 1 ; m++)
146 std::complex <double> z = exp(std::complex <double>(0.,-
double(m)*beta));
147 z *= std::complex <double> (double(n)*pow(rho,
double(n)-1.)*P_n_m*dRhodN -
148 pow(rho,
double(n))*dP_n_m_sin*dAlphadN, -double(m)*pow(rho,
double(n))*P_n_m*dBetadN);
170 if (other.
center.distance(this->center) > 1e-7)
173 dealii::Point<3> blockRelPos = other.
center + (-1.0*this->
center);
174 double rho = sqrt(blockRelPos.square());
175 double cos_alpha_ = blockRelPos(2)/rho;
176 double beta = atan2(blockRelPos(1),blockRelPos(0));
178 std::complex <double> imUnit(0.,1.);
182 for (
int n = 0; n < int(this->
p)+1 ; n++)
184 for (
int m = 0; m < n+1 ; m++)
186 std::complex <double> z(0.,0.);
187 for (
int nn = 0; nn < n+1 ; nn++)
189 for (
int mm = -1*nn; mm < nn+1 ; mm++)
191 if (abs(m-mm) > n-nn)
196 std::complex <double> a = std::complex<double>((other.
GetCoeff(abs(n-nn),abs(m-mm))).real(),
GSL_SIGN(m-mm)*
197 (other.
GetCoeff(abs(n-nn),abs(m-mm))).imag());
199 double realFact = P_nn_mm * pow(rho,
double(nn)) *
A_n_m(abs(nn),abs(mm)) *
200 A_n_m(abs(n-nn),abs(m-mm)) /
A_n_m(abs(n),abs(m));
201 realFact *= (pow(imUnit,
double(abs(m)-abs(mm)-abs(m-mm)))).real();
202 z += realFact*(a*exp(std::complex <double>(0.,-mm*beta)));
212 for (
int n = 0; n < int(this->
p)+1 ; n++)
214 for (
int m = 0; m < n+1 ; m++)
227 std::complex <double> fieldValue(0.,0.);
233 dealii::Point<3> blockRelPos = evalPoint + (-1.0*this->
center);
234 double rho = sqrt(blockRelPos.square());
235 double cos_alpha_ = blockRelPos(2)/rho;
236 double beta = atan2(blockRelPos(1),blockRelPos(0));
240 for (
int n = 0; n < int(this->
p)+1 ; n++)
243 double realFact = P_n_m * pow(rho,
double(-n-1));
244 fieldValue += this->
GetCoeff(n, 0)*realFact;
245 for (
int m = 1; m < n + 1 ; m++)
248 double realFact = P_n_m * pow(rho,
double(-n-1));
249 fieldValue += this->
GetCoeff(n, m)*exp(std::complex <double>(0., m*beta))*2.*realFact;
253 return fieldValue.real();
double GetAssLegFunSphDeriv(const unsigned int n, const unsigned int m, double x) const
std::complex< double > & GetCoeff(unsigned int n, unsigned int m) const
FullMatrix< double > & GetA_n_m() const
MultipoleExpansion & operator=(const MultipoleExpansion &other)
void AddToCoeff(unsigned int n, unsigned int m, std::complex< double > &value) const
std::complex< double > * GetCoeffs() const
double GetAssLegFunSph(const unsigned int n, const unsigned int m, double x) const
dealii::Point< 3 > center
void Add(const MultipoleExpansion &multipole, const double sol)
const AssLegFunction * assLegFunction
std::complex< double > * _M_n_m
void AddNormDer(const double strength, const dealii::Point< 3 > &point, const dealii::Tensor< 1, 3 > &normal)
static FullMatrix< double > A_n_m_Matrix(unsigned int dim)
double Evaluate(const dealii::Point< 3 > &evalPoint)
static FullMatrix< double > A_n_m