|
@@ -175,13 +175,13 @@ namespace nmie {
|
|
|
print_count++;
|
|
|
std::cout<< std::setprecision(print_precision)
|
|
|
<< "Warning: Potentially unstable calculation of aln[0]["
|
|
|
- << n << "] = "<< aln_[0][n] <<std::endl;
|
|
|
+ << n << "] = "<< aln_[0][n] << " which is expected to be exact zero!"<<std::endl;
|
|
|
}
|
|
|
if (cabs(bln_[0][n]) > 1e-10 && print_count < 2) {
|
|
|
print_count++;
|
|
|
std::cout<< std::setprecision(print_precision)
|
|
|
<< "Warning: Potentially unstable calculation of bln[0]["
|
|
|
- << n << "] = "<< bln_[0][n] <<std::endl;
|
|
|
+ << n << "] = "<< bln_[0][n] << " which is expected to be exact zero!" <<std::endl;
|
|
|
}
|
|
|
aln_[0][n] = 0.0;
|
|
|
bln_[0][n] = 0.0;
|
|
@@ -280,6 +280,8 @@ namespace nmie {
|
|
|
|
|
|
isConvergedE = {false, false, false}, isConvergedH = {false, false, false};
|
|
|
// evalType E0 = 0, H0=0;
|
|
|
+ std::vector< std::complex<evalType> > Ediff_prev = {{0.,0.},{0.,0.},{0.,0.}},
|
|
|
+ Hdiff_prev = {{0.,0.},{0.,0.},{0.,0.}};
|
|
|
for (unsigned int n = 0; n < nmax; n++) {
|
|
|
int n1 = n + 1;
|
|
|
auto rn = static_cast<evalType>(n1);
|
|
@@ -298,7 +300,7 @@ namespace nmie {
|
|
|
auto cln = ConvertComplex<evalType>(cln_[l][n]);
|
|
|
auto dln = ConvertComplex<evalType>(dln_[l][n]);
|
|
|
for (int i = 0; i < 3; i++) {
|
|
|
- if (isConvergedE[i] && isConvergedH[i]) continue;
|
|
|
+ if (isConvergedE[i] && isConvergedH[i]) continue; // TODO is it safe?
|
|
|
Ediff = En*( cln*M1o1n[i] - c_i*dln*N1e1n[i]
|
|
|
+ c_i*aln*N3e1n[i] - bln*M3o1n[i]);
|
|
|
Hdiff = En*( -dln*M1e1n[i] - c_i*cln*N1o1n[i]
|
|
@@ -311,16 +313,19 @@ namespace nmie {
|
|
|
<< " (of total nmax = "<<nmax<<")!!!"<<std::endl;
|
|
|
break;
|
|
|
}
|
|
|
- if (n!=0) {
|
|
|
- if (cabs(Ediff) == 0) isConvergedE[i] = true;
|
|
|
- if (cabs(Hdiff) == 0) isConvergedH[i] = true;
|
|
|
- if (cabs(E[i]) != 0.)
|
|
|
- if (cabs(Ediff)/cabs(E[i]) < nearfield_convergence_threshold_) isConvergedE[i] = true;
|
|
|
- if (cabs(H[i]) != 0.)
|
|
|
- if (cabs(Hdiff)/cabs(H[i]) < nearfield_convergence_threshold_) isConvergedH[i] = true;
|
|
|
+ if (n>0) {
|
|
|
+ if (
|
|
|
+ (cabs(Ediff_prev[i]) <= cabs(E[i]) * nearfield_convergence_threshold_)
|
|
|
+ && (cabs(Ediff) <= cabs(E[i]) * nearfield_convergence_threshold_)
|
|
|
+ ) isConvergedE[i] = true;
|
|
|
+ if (
|
|
|
+ (cabs(Hdiff_prev[i]) <= cabs(H[i]) * nearfield_convergence_threshold_)
|
|
|
+ && (cabs(Hdiff) <= cabs(H[i]) * nearfield_convergence_threshold_)
|
|
|
+ ) isConvergedH[i] = true;
|
|
|
}
|
|
|
- if (isConvergedE[i]) Ediff = c_zero;
|
|
|
- if (isConvergedH[i]) Hdiff = c_zero;
|
|
|
+ Ediff_prev[i] = Ediff;
|
|
|
+ Hdiff_prev[i] = Hdiff;
|
|
|
+
|
|
|
if ((!isConvergedH[i] || !isConvergedE[i]) && n==nmax-1 && GetFieldConvergence()) {
|
|
|
std::cout<<"Econv:"<<cabs(Ediff)/cabs(E[i])<<" Hconv:"<<cabs(Hdiff)/cabs(H[i])<<std::endl;
|
|
|
|
|
@@ -331,6 +336,9 @@ namespace nmie {
|
|
|
H[i] += Hdiff;
|
|
|
continue;
|
|
|
}
|
|
|
+ if (n == 0) {
|
|
|
+
|
|
|
+ }
|
|
|
if (n1 == mode_n_) {
|
|
|
if (mode_type_ == Modes::kElectric || mode_type_ == Modes::kAll) {
|
|
|
E[i] += En*( -c_i*dln*N1e1n[i]
|
|
@@ -359,8 +367,6 @@ namespace nmie {
|
|
|
|
|
|
// Add the incident field
|
|
|
if(l==L) {
|
|
|
-// using nmm::sin_t;
|
|
|
-// using nmm::cos_t;
|
|
|
const auto z = Rho*cos_t(Theta);
|
|
|
const auto Ex = std::complex<evalType>(cos_t(z), sin_t(z));
|
|
|
E[0] += Ex*cos_t(Phi)*sin_t(Theta);
|