|  | @@ -706,17 +706,20 @@ namespace nmie {
 | 
	
		
			
				|  |  |    // Output parameters:                                                               //
 | 
	
		
			
				|  |  |    //   Psi, Zeta: Riccati-Bessel functions                                            //
 | 
	
		
			
				|  |  |    //**********************************************************************************//
 | 
	
		
			
				|  |  | -  void MultiLayerMie::calcPsiZeta(double x,
 | 
	
		
			
				|  |  | +  void MultiLayerMie::calcPsiZeta(std::complex<double> z,
 | 
	
		
			
				|  |  |  				  std::vector<std::complex<double> > D1,
 | 
	
		
			
				|  |  |  				  std::vector<std::complex<double> > D3,
 | 
	
		
			
				|  |  |  				  std::vector<std::complex<double> >& Psi,
 | 
	
		
			
				|  |  |  				  std::vector<std::complex<double> >& Zeta) {
 | 
	
		
			
				|  |  |      //Upward recurrence for Psi and Zeta - equations (20a) - (21b)
 | 
	
		
			
				|  |  | -    Psi[0] = std::complex<double>(std::sin(x), 0);
 | 
	
		
			
				|  |  | -    Zeta[0] = std::complex<double>(std::sin(x), -std::cos(x));
 | 
	
		
			
				|  |  | +    //Psi[0] = std::complex<double>(std::sin(x), 0);
 | 
	
		
			
				|  |  | +    std::complex<double> c_i(0.0, 1.0);
 | 
	
		
			
				|  |  | +    Psi[0] = std::sin(z);
 | 
	
		
			
				|  |  | +    //Zeta[0] = std::complex<double>(std::sin(x), -std::cos(x));
 | 
	
		
			
				|  |  | +    Zeta[0] = std::sin(z) - c_i*std::cos(z);
 | 
	
		
			
				|  |  |      for (int n = 1; n <= nmax_; n++) {
 | 
	
		
			
				|  |  | -      Psi[n] = Psi[n - 1]*(n/x - D1[n - 1]);
 | 
	
		
			
				|  |  | -      Zeta[n] = Zeta[n - 1]*(n/x - D3[n - 1]);
 | 
	
		
			
				|  |  | +      Psi[n] = Psi[n - 1]*(static_cast<double>(n)/z - D1[n - 1]);
 | 
	
		
			
				|  |  | +      Zeta[n] = Zeta[n - 1]*(static_cast<double>(n)/z - D3[n - 1]);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    }
 | 
	
	
		
			
				|  | @@ -1298,25 +1301,72 @@ c    MM       + 1  and - 1, alternately
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      z[L-1]  =size_parameter_[L-1]*index_[L-1];
 | 
	
		
			
				|  |  |      z1[L-1]  =size_parameter_[L-1];
 | 
	
		
			
				|  |  | -    std::vector< std::vector<std::complex<double> > > D1zn(L), D1z1n(L), D3zn(L), D3z1n(L);
 | 
	
		
			
				|  |  | +    std::vector< std::vector<std::complex<double> > > D1z(L), D1z1(L), D3z(L), D3z1(L);
 | 
	
		
			
				|  |  | +    std::vector< std::vector<std::complex<double> > > Psiz(L), Psiz1(L), Zetaz(L), Zetaz1(L);
 | 
	
		
			
				|  |  |      for (int l = 0; l < L; ++l) {
 | 
	
		
			
				|  |  | -      D1zn[l].resize(nmax_ +1);
 | 
	
		
			
				|  |  | -      D1z1n[l].resize(nmax_ +1);
 | 
	
		
			
				|  |  | -      D3zn[l].resize(nmax_ +1);
 | 
	
		
			
				|  |  | -      D3z1n[l].resize(nmax_ +1);
 | 
	
		
			
				|  |  | -      calcD1D3(z[l],D1zn[l],D3zn[l]);
 | 
	
		
			
				|  |  | -      calcD1D3(z1[l],D1z1n[l],D3z1n[l]);
 | 
	
		
			
				|  |  | +      D1z[l].resize(nmax_ +1);
 | 
	
		
			
				|  |  | +      D1z1[l].resize(nmax_ +1);
 | 
	
		
			
				|  |  | +      D3z[l].resize(nmax_ +1);
 | 
	
		
			
				|  |  | +      D3z1[l].resize(nmax_ +1);
 | 
	
		
			
				|  |  | +      Psiz[l].resize(nmax_ +1);
 | 
	
		
			
				|  |  | +      Psiz1[l].resize(nmax_ +1);
 | 
	
		
			
				|  |  | +      Zetaz[l].resize(nmax_ +1);
 | 
	
		
			
				|  |  | +      Zetaz1[l].resize(nmax_ +1);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      for (int l = 0; l < L; ++l) {
 | 
	
		
			
				|  |  | -      printf("l=%d --> ", l);
 | 
	
		
			
				|  |  | -      for (int n = 0; n < nmax_ + 1; ++n) {
 | 
	
		
			
				|  |  | -	printf("n=%d --> D1zn=%g, D3zn=%g, D1zn=%g, D3zn=%g || ",
 | 
	
		
			
				|  |  | -	       n,
 | 
	
		
			
				|  |  | -	       D1zn[l][n].real(), D3zn[l][n].real(),
 | 
	
		
			
				|  |  | -	       D1z1n[l][n].real(), D3z1n[l][n].real());
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -      printf("\n\n");
 | 
	
		
			
				|  |  | +      calcD1D3(z[l],D1z[l],D3z[l]);
 | 
	
		
			
				|  |  | +      calcD1D3(z1[l],D1z1[l],D3z1[l]);
 | 
	
		
			
				|  |  | +      calcPsiZeta(z[l],D1z[l],D3z[l], Psiz[l],Zetaz[l]);
 | 
	
		
			
				|  |  | +      calcPsiZeta(z1[l],D1z1[l],D3z1[l], Psiz1[l],Zetaz1[l]);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +    auto& m = index_;
 | 
	
		
			
				|  |  | +    std::vector< std::complex<double> > m1(L);
 | 
	
		
			
				|  |  | +    for (int l = 0; l < L-1; ++l) m1[l] = m[l+1];
 | 
	
		
			
				|  |  | +    m1[L-1] = std::complex<double> (1.0, 0.0);
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    for (int l = L-1; l > 0; --l) {
 | 
	
		
			
				|  |  | +      for (int n = 0; n < nmax_; ++n) {
 | 
	
		
			
				|  |  | +	// al_n
 | 
	
		
			
				|  |  | +	auto denom = m1[l]*Zetaz[l][n] * ( D1z[l][n] - D3z[l][n] );
 | 
	
		
			
				|  |  | +	al_n_[l][n] = D1z[l][n]* m1[l]
 | 
	
		
			
				|  |  | +	  *(al_n_[l+1][n]*Zetaz1[l][n] - dl_n_[l+1][n]*Psiz1[l][n])
 | 
	
		
			
				|  |  | +	  - m[l]*(-D1z1[l][n]*dl_n_[l+1][n]*Psiz1[l][n]
 | 
	
		
			
				|  |  | +		  +D3z1[l][n]*al_n_[l+1][n]*Zetaz1[l][n]);
 | 
	
		
			
				|  |  | +	al_n_[l][n] /= denom;
 | 
	
		
			
				|  |  | +	// dl_n
 | 
	
		
			
				|  |  | +	denom = m1[l]*Psiz[l][n] * ( D1z[l][n] - D3z[l][n] );
 | 
	
		
			
				|  |  | +	dl_n_[l][n] = D3z[l][n]*m1[l]
 | 
	
		
			
				|  |  | +	  *(al_n_[l+1][n]*Zetaz1[l][n] - dl_n_[l+1][n]*Psiz1[l][n])
 | 
	
		
			
				|  |  | +	  - m[l]*(-D1z1[l][n]*dl_n_[l+1][n]*Psiz1[l][n]
 | 
	
		
			
				|  |  | +		  +D3z1[l][n]*al_n_[l+1][n]*Zetaz1[l][n]);
 | 
	
		
			
				|  |  | +	dl_n_[l][n] /= denom;
 | 
	
		
			
				|  |  | +	// bl_n
 | 
	
		
			
				|  |  | +	denom = m1[l]*Zetaz[l][n] * ( D1z[l][n] - D3z[l][n] );
 | 
	
		
			
				|  |  | +	bl_n_[l][n] = D1z[l][n]* m[l]
 | 
	
		
			
				|  |  | +	  *(bl_n_[l+1][n]*Zetaz1[l][n] - cl_n_[l+1][n]*Psiz1[l][n])
 | 
	
		
			
				|  |  | +	  - m1[l]*(-D1z1[l][n]*cl_n_[l+1][n]*Psiz1[l][n]
 | 
	
		
			
				|  |  | +		  +D3z1[l][n]*bl_n_[l+1][n]*Zetaz1[l][n]);
 | 
	
		
			
				|  |  | +	bl_n_[l][n] /= denom;
 | 
	
		
			
				|  |  | +	// cl_n
 | 
	
		
			
				|  |  | +	denom = m1[l]*Psiz[l][n] * ( D1z[l][n] - D3z[l][n] );
 | 
	
		
			
				|  |  | +	cl_n_[l][n] = D3z[l][n]*m[l]
 | 
	
		
			
				|  |  | +	  *(bl_n_[l+1][n]*Zetaz1[l][n] - cl_n_[l+1][n]*Psiz1[l][n])
 | 
	
		
			
				|  |  | +	  - m1[l]*(-D1z1[l][n]*cl_n_[l+1][n]*Psiz1[l][n]
 | 
	
		
			
				|  |  | +		  +D3z1[l][n]*bl_n_[l+1][n]*Zetaz1[l][n]);
 | 
	
		
			
				|  |  | +	cl_n_[l][n] /= denom;   
 | 
	
		
			
				|  |  | +      }  // end of all n
 | 
	
		
			
				|  |  | +    }  // end of for all l
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    // for (int l = 0; l < L; ++l) {
 | 
	
		
			
				|  |  | +    //   printf("l=%d --> ", l);
 | 
	
		
			
				|  |  | +    //   for (int n = 0; n < nmax_ + 1; ++n) {
 | 
	
		
			
				|  |  | +    // 	printf("n=%d --> D1zn=%g, D3zn=%g, D1zn=%g, D3zn=%g || ",
 | 
	
		
			
				|  |  | +    // 	       n,
 | 
	
		
			
				|  |  | +    // 	       D1z[l][n].real(), D3z[l][n].real(),
 | 
	
		
			
				|  |  | +    // 	       D1z1[l][n].real(), D3z1[l][n].real());
 | 
	
		
			
				|  |  | +    //   }
 | 
	
		
			
				|  |  | +    //   printf("\n\n");
 | 
	
		
			
				|  |  | +    // }
 | 
	
		
			
				|  |  |      // for (int j = 0; j < nmax_; ++j) {
 | 
	
		
			
				|  |  |      //   int i = L;
 | 
	
		
			
				|  |  |      //   printf("n=%d --> a=%g, b=%g, c=%g, d=%g\n",
 |