|  | @@ -2074,9 +2074,9 @@ template <class Real, Integer ORDER=10> class Stellarator {
 | 
	
		
			
				|  |  |          ValueType r2 = r[0]*r[0]+r[1]*r[1]+r[2]*r[2];
 | 
	
		
			
				|  |  |          ValueType rinv = (r2>1e-16 ? 1/sqrt<ValueType>(r2) : 0);
 | 
	
		
			
				|  |  |          ValueType rinv3 = rinv * rinv * rinv;
 | 
	
		
			
				|  |  | -        u[0][0] =   (0) * rinv3; u[0][1] = -r[2] * rinv3; u[0][2] =  r[1] * rinv3;
 | 
	
		
			
				|  |  | -        u[1][0] =  r[2] * rinv3; u[1][1] =   (0) * rinv3; u[1][2] = -r[0] * rinv3;
 | 
	
		
			
				|  |  | -        u[2][0] = -r[1] * rinv3; u[2][1] =  r[0] * rinv3; u[2][2] =   (0) * rinv3;
 | 
	
		
			
				|  |  | +        u[0][0] =   (0) * rinv3; u[1][0] =  r[2] * rinv3; u[2][0] = -r[1] * rinv3;
 | 
	
		
			
				|  |  | +        u[0][1] = -r[2] * rinv3; u[1][1] =   (0) * rinv3; u[2][1] =  r[0] * rinv3;
 | 
	
		
			
				|  |  | +        u[0][2] =  r[1] * rinv3; u[1][2] = -r[0] * rinv3; u[2][2] =   (0) * rinv3;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -2092,16 +2092,16 @@ template <class Real, Integer ORDER=10> class Stellarator {
 | 
	
		
			
				|  |  |          ValueType rinv5 = rinv2 * rinv3;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          u[0][0] =                                      0; u[1][0] =              - 3 * r[2] * r[0] * rinv5; u[2][0] =                3 * r[1] * r[0] * rinv5;
 | 
	
		
			
				|  |  | -        u[0][1] =                                      0; u[1][0] =              - 3 * r[2] * r[1] * rinv5; u[2][0] = -(1) * rinv3 + 3 * r[1] * r[1] * rinv5;
 | 
	
		
			
				|  |  | -        u[0][2] =                                      0; u[1][0] =  (1) * rinv3 - 3 * r[2] * r[2] * rinv5; u[2][0] =                3 * r[1] * r[2] * rinv5;
 | 
	
		
			
				|  |  | +        u[0][1] =                                      0; u[1][1] =              - 3 * r[2] * r[1] * rinv5; u[2][1] = -(1) * rinv3 + 3 * r[1] * r[1] * rinv5;
 | 
	
		
			
				|  |  | +        u[0][2] =                                      0; u[1][2] =  (1) * rinv3 - 3 * r[2] * r[2] * rinv5; u[2][2] =                3 * r[1] * r[2] * rinv5;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        u[0][3] =                3 * r[2] * r[0] * rinv5; u[1][1] =                                      0; u[2][1] =  (1) * rinv3 - 3 * r[0] * r[0] * rinv5;
 | 
	
		
			
				|  |  | -        u[0][4] =                3 * r[2] * r[1] * rinv5; u[1][1] =                                      0; u[2][1] =              - 3 * r[0] * r[1] * rinv5;
 | 
	
		
			
				|  |  | -        u[0][5] = -(1) * rinv3 + 3 * r[2] * r[2] * rinv5; u[1][1] =                                      0; u[2][1] =              - 3 * r[0] * r[2] * rinv5;
 | 
	
		
			
				|  |  | +        u[0][3] =                3 * r[2] * r[0] * rinv5; u[1][3] =                                      0; u[2][3] =  (1) * rinv3 - 3 * r[0] * r[0] * rinv5;
 | 
	
		
			
				|  |  | +        u[0][4] =                3 * r[2] * r[1] * rinv5; u[1][4] =                                      0; u[2][4] =              - 3 * r[0] * r[1] * rinv5;
 | 
	
		
			
				|  |  | +        u[0][5] = -(1) * rinv3 + 3 * r[2] * r[2] * rinv5; u[1][5] =                                      0; u[2][5] =              - 3 * r[0] * r[2] * rinv5;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        u[0][6] =              - 3 * r[1] * r[0] * rinv5; u[1][2] = -(1) * rinv3 + 3 * r[0] * r[0] * rinv5; u[2][2] =                                      0;
 | 
	
		
			
				|  |  | -        u[0][7] =  (1) * rinv3 - 3 * r[1] * r[1] * rinv5; u[1][2] =                3 * r[0] * r[1] * rinv5; u[2][2] =                                      0;
 | 
	
		
			
				|  |  | -        u[0][8] =              - 3 * r[1] * r[2] * rinv5; u[1][2] =                3 * r[0] * r[2] * rinv5; u[2][2] =                                      0;
 | 
	
		
			
				|  |  | +        u[0][6] =              - 3 * r[1] * r[0] * rinv5; u[1][6] = -(1) * rinv3 + 3 * r[0] * r[0] * rinv5; u[2][6] =                                      0;
 | 
	
		
			
				|  |  | +        u[0][7] =  (1) * rinv3 - 3 * r[1] * r[1] * rinv5; u[1][7] =                3 * r[0] * r[1] * rinv5; u[2][7] =                                      0;
 | 
	
		
			
				|  |  | +        u[0][8] =              - 3 * r[1] * r[2] * rinv5; u[1][8] =                3 * r[0] * r[2] * rinv5; u[2][8] =                                      0;
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -2351,43 +2351,46 @@ template <class Real, Integer ORDER=10> class Stellarator {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        Long Nelem = S.GetElemList().NElem();
 | 
	
		
			
				|  |  |        Vector<ElemBasis> Jt(Nelem*COORD_DIM), Jp(Nelem*COORD_DIM);
 | 
	
		
			
				|  |  | -      for (Long k = 0; k < S.Nsurf(); k++) {
 | 
	
		
			
				|  |  | -        Long Nt = S.NTor(k)*ORDER, Np = S.NPol(k)*ORDER;
 | 
	
		
			
				|  |  | -        const auto& X_ = S.GetElemList().ElemVector();
 | 
	
		
			
				|  |  | -        Vector<ElemBasis> X(S.NTor(k)*S.NPol(k)*COORD_DIM, (Iterator<ElemBasis>)X_.begin()+S.ElemDsp(k)*COORD_DIM, false);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        biest::Surface<Real> SS(Nt, Np);
 | 
	
		
			
				|  |  | -        biest::SurfaceOp<Real> surf_op(comm, Nt, Np);
 | 
	
		
			
				|  |  | -        SS.Coord() = cheb2grid(X, S.NTor(k), S.NPol(k), Nt, Np);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        Vector<Real> dX, d2X;
 | 
	
		
			
				|  |  | -        surf_op.Grad2D(dX, SS.Coord());
 | 
	
		
			
				|  |  | -        surf_op.Grad2D(d2X, dX);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        sctl::Vector<Real> Jt_(COORD_DIM * Nt * Np);
 | 
	
		
			
				|  |  | -        sctl::Vector<Real> Jp_(COORD_DIM * Nt * Np);
 | 
	
		
			
				|  |  | -        { // Set Jt_, Jp_
 | 
	
		
			
				|  |  | -          Vector<Real> DivV, InvLapDivV, GradInvLapDivV;
 | 
	
		
			
				|  |  | -          for (sctl::Long i = 0; i < Nt*Np; i++) { // Set V
 | 
	
		
			
				|  |  | -            for (sctl::Long k =0; k < COORD_DIM; k++) {
 | 
	
		
			
				|  |  | -              Jt_[k * Nt*Np + i] = dX[(k*2+0) * Nt*Np + i];
 | 
	
		
			
				|  |  | -              Jp_[k * Nt*Np + i] = dX[(k*2+1) * Nt*Np + i];
 | 
	
		
			
				|  |  | +      auto compute_harmonic_vector_potentials = [&S,&comm,&cheb2grid,&grid2cheb,max_iter,gmres_tol](Vector<ElemBasis>& Jt, Vector<ElemBasis>& Jp) {
 | 
	
		
			
				|  |  | +        for (Long k = 0; k < S.Nsurf(); k++) {
 | 
	
		
			
				|  |  | +          Long Nt = S.NTor(k)*ORDER, Np = S.NPol(k)*ORDER;
 | 
	
		
			
				|  |  | +          const auto& X_ = S.GetElemList().ElemVector();
 | 
	
		
			
				|  |  | +          Vector<ElemBasis> X(S.NTor(k)*S.NPol(k)*COORD_DIM, (Iterator<ElemBasis>)X_.begin()+S.ElemDsp(k)*COORD_DIM, false);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          biest::Surface<Real> SS(Nt, Np);
 | 
	
		
			
				|  |  | +          biest::SurfaceOp<Real> surf_op(comm, Nt, Np);
 | 
	
		
			
				|  |  | +          SS.Coord() = cheb2grid(X, S.NTor(k), S.NPol(k), Nt, Np);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          Vector<Real> dX, d2X;
 | 
	
		
			
				|  |  | +          surf_op.Grad2D(dX, SS.Coord());
 | 
	
		
			
				|  |  | +          surf_op.Grad2D(d2X, dX);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +          sctl::Vector<Real> Jt_(COORD_DIM * Nt * Np);
 | 
	
		
			
				|  |  | +          sctl::Vector<Real> Jp_(COORD_DIM * Nt * Np);
 | 
	
		
			
				|  |  | +          { // Set Jt_, Jp_
 | 
	
		
			
				|  |  | +            Vector<Real> DivV, InvLapDivV, GradInvLapDivV;
 | 
	
		
			
				|  |  | +            for (sctl::Long i = 0; i < Nt*Np; i++) { // Set V
 | 
	
		
			
				|  |  | +              for (sctl::Long k =0; k < COORD_DIM; k++) {
 | 
	
		
			
				|  |  | +                Jt_[k * Nt*Np + i] = dX[(k*2+0) * Nt*Np + i];
 | 
	
		
			
				|  |  | +                Jp_[k * Nt*Np + i] = dX[(k*2+1) * Nt*Np + i];
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  | -          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -          surf_op.SurfDiv(DivV, dX, Jt_);
 | 
	
		
			
				|  |  | -          surf_op.GradInvSurfLap(GradInvLapDivV, dX, d2X, DivV, gmres_tol * max_norm(Jt_) / max_norm(DivV), max_iter, 1.5);
 | 
	
		
			
				|  |  | -          Jt_ = Jt_ - GradInvLapDivV;
 | 
	
		
			
				|  |  | +            surf_op.SurfDiv(DivV, dX, Jt_);
 | 
	
		
			
				|  |  | +            surf_op.GradInvSurfLap(GradInvLapDivV, dX, d2X, DivV, gmres_tol * max_norm(Jt_) / max_norm(DivV), max_iter, 1.5);
 | 
	
		
			
				|  |  | +            Jt_ = Jt_ - GradInvLapDivV;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -          surf_op.SurfDiv(DivV, dX, Jp_);
 | 
	
		
			
				|  |  | -          surf_op.GradInvSurfLap(GradInvLapDivV, dX, d2X, DivV, gmres_tol * max_norm(Jp_) / max_norm(DivV), max_iter, 1.5);
 | 
	
		
			
				|  |  | -          Jp_ = Jp_ - GradInvLapDivV;
 | 
	
		
			
				|  |  | +            surf_op.SurfDiv(DivV, dX, Jp_);
 | 
	
		
			
				|  |  | +            surf_op.GradInvSurfLap(GradInvLapDivV, dX, d2X, DivV, gmres_tol * max_norm(Jp_) / max_norm(DivV), max_iter, 1.5);
 | 
	
		
			
				|  |  | +            Jp_ = Jp_ - GradInvLapDivV;
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +          Vector<ElemBasis> Jt__(S.NTor(k)*S.NPol(k)*COORD_DIM, (Iterator<ElemBasis>)Jt.begin()+S.ElemDsp(k)*COORD_DIM, false);
 | 
	
		
			
				|  |  | +          Vector<ElemBasis> Jp__(S.NTor(k)*S.NPol(k)*COORD_DIM, (Iterator<ElemBasis>)Jp.begin()+S.ElemDsp(k)*COORD_DIM, false);
 | 
	
		
			
				|  |  | +          Jt__ = grid2cheb(Jt_, Nt, Np, S.NTor(k), S.NPol(k));
 | 
	
		
			
				|  |  | +          Jp__ = grid2cheb(Jp_, Nt, Np, S.NTor(k), S.NPol(k));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        Vector<ElemBasis> Jt__(S.NTor(k)*S.NPol(k)*COORD_DIM, (Iterator<ElemBasis>)Jt.begin()+S.ElemDsp(k)*COORD_DIM, false);
 | 
	
		
			
				|  |  | -        Vector<ElemBasis> Jp__(S.NTor(k)*S.NPol(k)*COORD_DIM, (Iterator<ElemBasis>)Jp.begin()+S.ElemDsp(k)*COORD_DIM, false);
 | 
	
		
			
				|  |  | -        Jt__ = grid2cheb(Jt_, Nt, Np, S.NTor(k), S.NPol(k));
 | 
	
		
			
				|  |  | -        Jp__ = grid2cheb(Jp_, Nt, Np, S.NTor(k), S.NPol(k));
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | +      };
 | 
	
		
			
				|  |  | +      compute_harmonic_vector_potentials(Jt, Jp);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        Vector<ElemBasis> normal, area_elem;
 | 
	
		
			
				|  |  |        auto compute_dot_prod = [](const Vector<ElemBasis>& A, const Vector<ElemBasis>& B) {
 | 
	
	
		
			
				|  | @@ -2467,16 +2470,19 @@ template <class Real, Integer ORDER=10> class Stellarator {
 | 
	
		
			
				|  |  |        };
 | 
	
		
			
				|  |  |        compute_norm_area_elem(S.GetElemList(), normal, area_elem);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      S.quadrature_FxU .template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.Laplace_FxU , order_singular, order_direct, -1.0, comm);
 | 
	
		
			
				|  |  | -      S.quadrature_DxU .template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.Laplace_DxU , order_singular, order_direct, -1.0, comm);
 | 
	
		
			
				|  |  | -      S.quadrature_FxdU.template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.Laplace_FxdU, order_singular, order_direct, -1.0, comm);
 | 
	
		
			
				|  |  | -      S.quadrature_dUxF.template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.Laplace_dUxF, order_singular, order_direct, -1.0, comm);
 | 
	
		
			
				|  |  | +      S.quadrature_BS  .template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.BiotSavart    , order_singular, order_direct, -1.0, comm, -0.01 * pow<-2,Real>(ORDER));
 | 
	
		
			
				|  |  | +      S.quadrature_dBS .template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.BiotSavartGrad, order_singular, order_direct, -1.0, comm, -0.01 * pow<-2,Real>(ORDER));
 | 
	
		
			
				|  |  | +      S.quadrature_FxU .template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.Laplace_FxU   , order_singular, order_direct, -1.0, comm);
 | 
	
		
			
				|  |  | +      S.quadrature_DxU .template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.Laplace_DxU   , order_singular, order_direct, -1.0, comm);
 | 
	
		
			
				|  |  | +      S.quadrature_FxdU.template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.Laplace_FxdU  , order_singular, order_direct, -1.0, comm);
 | 
	
		
			
				|  |  | +      S.quadrature_dUxF.template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.Laplace_dUxF  , order_singular, order_direct, -1.0, comm);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -      GenericKernel<BiotSavart3D> BiotSavart;
 | 
	
		
			
				|  |  | -      GenericKernel<BiotSavartGrad3D> BiotSavartGrad;
 | 
	
		
			
				|  |  | -      Quadrature<Real> quadrature_BS, quadrature_dBS;
 | 
	
		
			
				|  |  | -      quadrature_BS .template Setup<ElemBasis, ElemBasis>(S.GetElemList(), BiotSavart    , order_singular, order_direct, -1.0, comm, -0.01 * pow<-2,Real>(ORDER));
 | 
	
		
			
				|  |  | -      quadrature_dBS.template Setup<ElemBasis, ElemBasis>(S.GetElemList(), BiotSavartGrad, order_singular, order_direct, -1.0, comm, -0.01 * pow<-2,Real>(ORDER));
 | 
	
		
			
				|  |  | +      //Quadrature<Real> quadrature_Fxd2U;
 | 
	
		
			
				|  |  | +      //Quadrature<Real> quadrature_dUxF;
 | 
	
		
			
				|  |  | +      //Quadrature<Real> quadrature_dUxD;
 | 
	
		
			
				|  |  | +      //quadrature_Fxd2U.template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.Laplace_Fxd2U, order_singular, order_direct, -1.0, comm, -0.01 * pow<-2,Real>(ORDER));
 | 
	
		
			
				|  |  | +      //quadrature_dUxF .template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.Laplace_dUxF, order_singular, order_direct, -1.0, comm, 0.01 * pow<-2,Real>(ORDER));
 | 
	
		
			
				|  |  | +      //quadrature_dUxD .template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.Laplace_dUxD, order_singular, order_direct, -1.0, comm, 0.01 * pow<-2,Real>(ORDER));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        auto compute_B0_deprecated = [&S](const Real alpha) { // alpha/|r| \hat{\theta}
 | 
	
		
			
				|  |  |          const Vector<ElemBasis> X = S.GetElemList().ElemVector();
 | 
	
	
		
			
				|  | @@ -2523,12 +2529,12 @@ template <class Real, Integer ORDER=10> class Stellarator {
 | 
	
		
			
				|  |  |              x(2) = X[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  |              Real R2inv = 1 / (x(0)*x(0) + x(1)*x(1));
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            dB0[(i*COORD_DIM+0)*COORD_DIM+0][j] = alpha * (2*x(0)*x(1) * R2inv*R2inv);
 | 
	
		
			
				|  |  | -            dB0[(i*COORD_DIM+0)*COORD_DIM+1][j] = alpha * (-R2inv + 2*x(1)*x(1) * R2inv*R2inv);
 | 
	
		
			
				|  |  | +            dB0[(i*COORD_DIM+0)*COORD_DIM+0][j] = -alpha * (2*x(0)*x(1) * R2inv*R2inv);
 | 
	
		
			
				|  |  | +            dB0[(i*COORD_DIM+0)*COORD_DIM+1][j] = -alpha * (-R2inv + 2*x(1)*x(1) * R2inv*R2inv);
 | 
	
		
			
				|  |  |              dB0[(i*COORD_DIM+0)*COORD_DIM+2][j] = 0;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -            dB0[(i*COORD_DIM+1)*COORD_DIM+0][j] = alpha * (R2inv - 2*x(0)*x(0) * R2inv*R2inv);
 | 
	
		
			
				|  |  | -            dB0[(i*COORD_DIM+1)*COORD_DIM+1][j] = alpha * (-2*x(0)*x(1) * R2inv*R2inv);
 | 
	
		
			
				|  |  | +            dB0[(i*COORD_DIM+1)*COORD_DIM+0][j] = -alpha * (R2inv - 2*x(0)*x(0) * R2inv*R2inv);
 | 
	
		
			
				|  |  | +            dB0[(i*COORD_DIM+1)*COORD_DIM+1][j] = -alpha * (-2*x(0)*x(1) * R2inv*R2inv);
 | 
	
		
			
				|  |  |              dB0[(i*COORD_DIM+1)*COORD_DIM+2][j] = 0;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              dB0[(i*COORD_DIM+2)*COORD_DIM+0][j] = 0;
 | 
	
	
		
			
				|  | @@ -2538,14 +2544,14 @@ template <class Real, Integer ORDER=10> class Stellarator {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |          return dB0;
 | 
	
		
			
				|  |  |        };
 | 
	
		
			
				|  |  | -      auto compute_B0 = [&S, &Jp,&BiotSavart,&quadrature_BS](const Real alpha) {
 | 
	
		
			
				|  |  | +      auto compute_B0 = [&S, &Jp](const Real alpha) {
 | 
	
		
			
				|  |  |          Vector<ElemBasis> B0;
 | 
	
		
			
				|  |  | -        quadrature_BS.Eval(B0, S.GetElemList(), Jp, BiotSavart);
 | 
	
		
			
				|  |  | +        S.quadrature_BS.Eval(B0, S.GetElemList(), Jp, S.BiotSavart);
 | 
	
		
			
				|  |  |          return B0*alpha;
 | 
	
		
			
				|  |  |        };
 | 
	
		
			
				|  |  | -      auto compute_dB0 = [&S, &Jp,&BiotSavartGrad,&quadrature_dBS](const Real alpha) {
 | 
	
		
			
				|  |  | +      auto compute_dB0 = [&S, &Jp](const Real alpha) {
 | 
	
		
			
				|  |  |          Vector<ElemBasis> dB0;
 | 
	
		
			
				|  |  | -        quadrature_dBS.Eval(dB0, S.GetElemList(), Jp, BiotSavartGrad);
 | 
	
		
			
				|  |  | +        S.quadrature_dBS.Eval(dB0, S.GetElemList(), Jp, S.BiotSavartGrad);
 | 
	
		
			
				|  |  |          return dB0*alpha;
 | 
	
		
			
				|  |  |        };
 | 
	
		
			
				|  |  |        auto compute_half_n_plus_dG = [&S, &normal](const Vector<ElemBasis>& sigma) { // B = n sigma/2 + dG[sigma]
 | 
	
	
		
			
				|  | @@ -2973,17 +2979,17 @@ template <class Real, Integer ORDER=10> class Stellarator {
 | 
	
		
			
				|  |  |            for (Long i = 0; i < Nelem; i++) {
 | 
	
		
			
				|  |  |              for (Long j = 0; j < Nnodes; j++) {
 | 
	
		
			
				|  |  |                dg_dnu2[i][j] = 0;
 | 
	
		
			
				|  |  | -              dg_dnu2[i][j] += dB0[i*9+0][j] * normal[i*COORD_DIM+0][j] * v[i*COORD_DIM+0][j];
 | 
	
		
			
				|  |  | -              dg_dnu2[i][j] += dB0[i*9+1][j] * normal[i*COORD_DIM+1][j] * v[i*COORD_DIM+0][j];
 | 
	
		
			
				|  |  | -              dg_dnu2[i][j] += dB0[i*9+2][j] * normal[i*COORD_DIM+2][j] * v[i*COORD_DIM+0][j];
 | 
	
		
			
				|  |  | +              dg_dnu2[i][j] -= dB0[i*9+0][j] * normal[i*COORD_DIM+0][j] * v[i*COORD_DIM+0][j];
 | 
	
		
			
				|  |  | +              dg_dnu2[i][j] -= dB0[i*9+1][j] * normal[i*COORD_DIM+1][j] * v[i*COORD_DIM+0][j];
 | 
	
		
			
				|  |  | +              dg_dnu2[i][j] -= dB0[i*9+2][j] * normal[i*COORD_DIM+2][j] * v[i*COORD_DIM+0][j];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -              dg_dnu2[i][j] += dB0[i*9+3][j] * normal[i*COORD_DIM+0][j] * v[i*COORD_DIM+1][j];
 | 
	
		
			
				|  |  | -              dg_dnu2[i][j] += dB0[i*9+4][j] * normal[i*COORD_DIM+1][j] * v[i*COORD_DIM+1][j];
 | 
	
		
			
				|  |  | -              dg_dnu2[i][j] += dB0[i*9+5][j] * normal[i*COORD_DIM+2][j] * v[i*COORD_DIM+1][j];
 | 
	
		
			
				|  |  | +              dg_dnu2[i][j] -= dB0[i*9+3][j] * normal[i*COORD_DIM+0][j] * v[i*COORD_DIM+1][j];
 | 
	
		
			
				|  |  | +              dg_dnu2[i][j] -= dB0[i*9+4][j] * normal[i*COORD_DIM+1][j] * v[i*COORD_DIM+1][j];
 | 
	
		
			
				|  |  | +              dg_dnu2[i][j] -= dB0[i*9+5][j] * normal[i*COORD_DIM+2][j] * v[i*COORD_DIM+1][j];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -              dg_dnu2[i][j] += dB0[i*9+6][j] * normal[i*COORD_DIM+0][j] * v[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  | -              dg_dnu2[i][j] += dB0[i*9+7][j] * normal[i*COORD_DIM+1][j] * v[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  | -              dg_dnu2[i][j] += dB0[i*9+8][j] * normal[i*COORD_DIM+2][j] * v[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  | +              dg_dnu2[i][j] -= dB0[i*9+6][j] * normal[i*COORD_DIM+0][j] * v[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  | +              dg_dnu2[i][j] -= dB0[i*9+7][j] * normal[i*COORD_DIM+1][j] * v[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  | +              dg_dnu2[i][j] -= dB0[i*9+8][j] * normal[i*COORD_DIM+2][j] * v[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -3254,17 +3260,17 @@ template <class Real, Integer ORDER=10> class Stellarator {
 | 
	
		
			
				|  |  |            for (Long i = 0; i < Nelem; i++) {
 | 
	
		
			
				|  |  |              for (Long j = 0; j < Nnodes; j++) {
 | 
	
		
			
				|  |  |                Real n_n_dB0 = 0;
 | 
	
		
			
				|  |  | -              n_n_dB0 += dB0[i*9+0][j] * normal[i*COORD_DIM+0][j] * normal[i*COORD_DIM+0][j];
 | 
	
		
			
				|  |  | -              n_n_dB0 += dB0[i*9+1][j] * normal[i*COORD_DIM+1][j] * normal[i*COORD_DIM+0][j];
 | 
	
		
			
				|  |  | -              n_n_dB0 += dB0[i*9+2][j] * normal[i*COORD_DIM+2][j] * normal[i*COORD_DIM+0][j];
 | 
	
		
			
				|  |  | +              n_n_dB0 -= dB0[i*9+0][j] * normal[i*COORD_DIM+0][j] * normal[i*COORD_DIM+0][j];
 | 
	
		
			
				|  |  | +              n_n_dB0 -= dB0[i*9+1][j] * normal[i*COORD_DIM+1][j] * normal[i*COORD_DIM+0][j];
 | 
	
		
			
				|  |  | +              n_n_dB0 -= dB0[i*9+2][j] * normal[i*COORD_DIM+2][j] * normal[i*COORD_DIM+0][j];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -              n_n_dB0 += dB0[i*9+3][j] * normal[i*COORD_DIM+0][j] * normal[i*COORD_DIM+1][j];
 | 
	
		
			
				|  |  | -              n_n_dB0 += dB0[i*9+4][j] * normal[i*COORD_DIM+1][j] * normal[i*COORD_DIM+1][j];
 | 
	
		
			
				|  |  | -              n_n_dB0 += dB0[i*9+5][j] * normal[i*COORD_DIM+2][j] * normal[i*COORD_DIM+1][j];
 | 
	
		
			
				|  |  | +              n_n_dB0 -= dB0[i*9+3][j] * normal[i*COORD_DIM+0][j] * normal[i*COORD_DIM+1][j];
 | 
	
		
			
				|  |  | +              n_n_dB0 -= dB0[i*9+4][j] * normal[i*COORD_DIM+1][j] * normal[i*COORD_DIM+1][j];
 | 
	
		
			
				|  |  | +              n_n_dB0 -= dB0[i*9+5][j] * normal[i*COORD_DIM+2][j] * normal[i*COORD_DIM+1][j];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -              n_n_dB0 += dB0[i*9+6][j] * normal[i*COORD_DIM+0][j] * normal[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  | -              n_n_dB0 += dB0[i*9+7][j] * normal[i*COORD_DIM+1][j] * normal[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  | -              n_n_dB0 += dB0[i*9+8][j] * normal[i*COORD_DIM+2][j] * normal[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  | +              n_n_dB0 -= dB0[i*9+6][j] * normal[i*COORD_DIM+0][j] * normal[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  | +              n_n_dB0 -= dB0[i*9+7][j] * normal[i*COORD_DIM+1][j] * normal[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  | +              n_n_dB0 -= dB0[i*9+8][j] * normal[i*COORD_DIM+2][j] * normal[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                dAdnu[i][j] = u[i*Nnodes+j] * n_n_dB0;
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -3844,17 +3850,17 @@ template <class Real, Integer ORDER=10> class Stellarator {
 | 
	
		
			
				|  |  |              for (Long i = 0; i < Nelem; i++) {
 | 
	
		
			
				|  |  |                for (Long j = 0; j < Nnodes; j++) {
 | 
	
		
			
				|  |  |                  Real dphi_dnu_ = 0;
 | 
	
		
			
				|  |  | -                dphi_dnu_ += nxGv[i*COORD_DIM+0][j] * gradB[(i*COORD_DIM+0)*COORD_DIM+0][j] * normal[i*COORD_DIM+0][j];
 | 
	
		
			
				|  |  | -                dphi_dnu_ += nxGv[i*COORD_DIM+1][j] * gradB[(i*COORD_DIM+0)*COORD_DIM+1][j] * normal[i*COORD_DIM+0][j];
 | 
	
		
			
				|  |  | -                dphi_dnu_ += nxGv[i*COORD_DIM+2][j] * gradB[(i*COORD_DIM+0)*COORD_DIM+2][j] * normal[i*COORD_DIM+0][j];
 | 
	
		
			
				|  |  | +                dphi_dnu_ += -nxGv[i*COORD_DIM+0][j] * gradB[(i*COORD_DIM+0)*COORD_DIM+0][j] * normal[i*COORD_DIM+0][j];
 | 
	
		
			
				|  |  | +                dphi_dnu_ += -nxGv[i*COORD_DIM+1][j] * gradB[(i*COORD_DIM+0)*COORD_DIM+1][j] * normal[i*COORD_DIM+0][j];
 | 
	
		
			
				|  |  | +                dphi_dnu_ += -nxGv[i*COORD_DIM+2][j] * gradB[(i*COORD_DIM+0)*COORD_DIM+2][j] * normal[i*COORD_DIM+0][j];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                dphi_dnu_ += nxGv[i*COORD_DIM+0][j] * gradB[(i*COORD_DIM+1)*COORD_DIM+0][j] * normal[i*COORD_DIM+1][j];
 | 
	
		
			
				|  |  | -                dphi_dnu_ += nxGv[i*COORD_DIM+1][j] * gradB[(i*COORD_DIM+1)*COORD_DIM+1][j] * normal[i*COORD_DIM+1][j];
 | 
	
		
			
				|  |  | -                dphi_dnu_ += nxGv[i*COORD_DIM+2][j] * gradB[(i*COORD_DIM+1)*COORD_DIM+2][j] * normal[i*COORD_DIM+1][j];
 | 
	
		
			
				|  |  | +                dphi_dnu_ += -nxGv[i*COORD_DIM+0][j] * gradB[(i*COORD_DIM+1)*COORD_DIM+0][j] * normal[i*COORD_DIM+1][j];
 | 
	
		
			
				|  |  | +                dphi_dnu_ += -nxGv[i*COORD_DIM+1][j] * gradB[(i*COORD_DIM+1)*COORD_DIM+1][j] * normal[i*COORD_DIM+1][j];
 | 
	
		
			
				|  |  | +                dphi_dnu_ += -nxGv[i*COORD_DIM+2][j] * gradB[(i*COORD_DIM+1)*COORD_DIM+2][j] * normal[i*COORD_DIM+1][j];
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                dphi_dnu_ += nxGv[i*COORD_DIM+0][j] * gradB[(i*COORD_DIM+2)*COORD_DIM+0][j] * normal[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  | -                dphi_dnu_ += nxGv[i*COORD_DIM+1][j] * gradB[(i*COORD_DIM+2)*COORD_DIM+1][j] * normal[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  | -                dphi_dnu_ += nxGv[i*COORD_DIM+2][j] * gradB[(i*COORD_DIM+2)*COORD_DIM+2][j] * normal[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  | +                dphi_dnu_ += -nxGv[i*COORD_DIM+0][j] * gradB[(i*COORD_DIM+2)*COORD_DIM+0][j] * normal[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  | +                dphi_dnu_ += -nxGv[i*COORD_DIM+1][j] * gradB[(i*COORD_DIM+2)*COORD_DIM+1][j] * normal[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  | +                dphi_dnu_ += -nxGv[i*COORD_DIM+2][j] * gradB[(i*COORD_DIM+2)*COORD_DIM+2][j] * normal[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  |                  dphi_dnu[i][j] = dphi_dnu_;
 | 
	
		
			
				|  |  |                }
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -4294,7 +4300,7 @@ template <class Real, Integer ORDER=10> class Stellarator {
 | 
	
		
			
				|  |  |            dg_dnu = f;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        auto compute_g = [&compute_gvec,&sigma,&alpha,&S,&area_elem,&normal,&compute_norm_area_elem,&compute_invA,&compute_half_n_plus_dG,&compute_B0,&compute_inner_prod,&comm] (const Vector<ElemBasis>& nu, Real eps) {
 | 
	
		
			
				|  |  | +        auto compute_g = [&compute_gvec,&sigma,&alpha,&S,&area_elem,&normal,&Jt,&Jp,&compute_harmonic_vector_potentials,&compute_norm_area_elem,&compute_invA,&compute_half_n_plus_dG,&compute_B0,&compute_inner_prod,&comm] (const Vector<ElemBasis>& nu, Real eps) {
 | 
	
		
			
				|  |  |            const Long Nelem = S.GetElemList().NElem();
 | 
	
		
			
				|  |  |            const Long Nnodes = ElemBasis::Size();
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -4309,7 +4315,9 @@ template <class Real, Integer ORDER=10> class Stellarator {
 | 
	
		
			
				|  |  |                S.Elem(i,2)[j] += eps*nu[i][j] * normal[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  | +          compute_harmonic_vector_potentials(Jt, Jp);
 | 
	
		
			
				|  |  |            compute_norm_area_elem(S.GetElemList(), normal, area_elem);
 | 
	
		
			
				|  |  | +          S.quadrature_BS  .template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.BiotSavart  , order_singular, order_direct, -1.0, comm, -0.01 * pow<-2,Real>(ORDER));
 | 
	
		
			
				|  |  |            S.quadrature_FxU .template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.Laplace_FxU , order_singular, order_direct, -1.0, comm);
 | 
	
		
			
				|  |  |            S.quadrature_DxU .template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.Laplace_DxU , order_singular, order_direct, -1.0, comm);
 | 
	
		
			
				|  |  |            S.quadrature_FxdU.template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.Laplace_FxdU, order_singular, order_direct, -1.0, comm);
 | 
	
	
		
			
				|  | @@ -4328,7 +4336,9 @@ template <class Real, Integer ORDER=10> class Stellarator {
 | 
	
		
			
				|  |  |                S.Elem(i,2)[j] = X_orig[i*COORD_DIM+2][j];
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  | +          compute_harmonic_vector_potentials(Jt, Jp);
 | 
	
		
			
				|  |  |            compute_norm_area_elem(S.GetElemList(), normal, area_elem);
 | 
	
		
			
				|  |  | +          S.quadrature_BS  .template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.BiotSavart  , order_singular, order_direct, -1.0, comm, -0.01 * pow<-2,Real>(ORDER));
 | 
	
		
			
				|  |  |            S.quadrature_FxU .template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.Laplace_FxU , order_singular, order_direct, -1.0, comm);
 | 
	
		
			
				|  |  |            S.quadrature_DxU .template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.Laplace_DxU , order_singular, order_direct, -1.0, comm);
 | 
	
		
			
				|  |  |            S.quadrature_FxdU.template Setup<ElemBasis, ElemBasis>(S.GetElemList(), S.Laplace_FxdU, order_singular, order_direct, -1.0, comm);
 | 
	
	
		
			
				|  | @@ -4451,20 +4461,21 @@ template <class Real, Integer ORDER=10> class Stellarator {
 | 
	
		
			
				|  |  |        Y = R * sctl::sin(theta);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    GenericKernel<BiotSavart3D  > BiotSavart  ;
 | 
	
		
			
				|  |  | -    GenericKernel<Laplace3D_FxU > Laplace_FxU ;
 | 
	
		
			
				|  |  | -    GenericKernel<Laplace3D_DxU > Laplace_DxU ;
 | 
	
		
			
				|  |  | -    GenericKernel<Laplace3D_FxdU> Laplace_FxdU;
 | 
	
		
			
				|  |  | -    GenericKernel<Laplace3D_dUxF> Laplace_dUxF;
 | 
	
		
			
				|  |  | -    GenericKernel<Laplace3D_Fxd2U> Laplace_Fxd2U;
 | 
	
		
			
				|  |  | -    GenericKernel<Laplace3D_dUxD> Laplace_dUxD;
 | 
	
		
			
				|  |  | -    GenericKernel<Laplace3D_DxdU> Laplace_DxdU;
 | 
	
		
			
				|  |  | +    GenericKernel<BiotSavart3D>     BiotSavart ;
 | 
	
		
			
				|  |  | +    GenericKernel<BiotSavartGrad3D> BiotSavartGrad;
 | 
	
		
			
				|  |  | +    GenericKernel<Laplace3D_FxU >   Laplace_FxU ;
 | 
	
		
			
				|  |  | +    GenericKernel<Laplace3D_DxU >   Laplace_DxU ;
 | 
	
		
			
				|  |  | +    GenericKernel<Laplace3D_FxdU>   Laplace_FxdU;
 | 
	
		
			
				|  |  | +    GenericKernel<Laplace3D_dUxF>   Laplace_dUxF;
 | 
	
		
			
				|  |  | +    GenericKernel<Laplace3D_dUxD>   Laplace_dUxD;
 | 
	
		
			
				|  |  | +    GenericKernel<Laplace3D_Fxd2U>  Laplace_Fxd2U;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    Quadrature<Real> quadrature_BS  ;
 | 
	
		
			
				|  |  | +    Quadrature<Real> quadrature_dBS ;
 | 
	
		
			
				|  |  |      Quadrature<Real> quadrature_FxU ;
 | 
	
		
			
				|  |  |      Quadrature<Real> quadrature_DxU ;
 | 
	
		
			
				|  |  |      Quadrature<Real> quadrature_FxdU;
 | 
	
		
			
				|  |  |      Quadrature<Real> quadrature_dUxF;
 | 
	
		
			
				|  |  | -    Quadrature<Real> quadrature_Fxd2U;
 | 
	
		
			
				|  |  | -    Quadrature<Real> quadrature_dUxD;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      ElemLst elements;
 | 
	
		
			
				|  |  |      Vector<Long> NtNp_;
 |