diff --git a/src/moments_eq_rhs.F90 b/src/moments_eq_rhs.F90 index 29e39214be9b1c7f300ec3862fc2581b14127b3a..e4b95996ac3575f8670fc8a47f5c34a64640f3ee 100644 --- a/src/moments_eq_rhs.F90 +++ b/src/moments_eq_rhs.F90 @@ -6,153 +6,154 @@ SUBROUTINE moments_eq_rhs USE fields USE fourier_grid USE model - - use prec_const + USE prec_const IMPLICIT NONE INTEGER :: ip,ij, ikr,ikz ! loops indices REAL(dp) :: ip_dp, ij_dp - REAL(dp) :: kr, kz, kperp2 - REAL(dp) :: taue_qe_etaB, taui_qi_etaB - REAL(dp) :: kernelj, kerneljp1, kerneljm1, b_e2, b_i2 ! Kernel functions and variable - REAL(dp) :: factj, xb_e2, xb_i2 ! Auxiliary variables - REAL(dp) :: xNapj, xNapp2j, xNapm2j, xNapjp1, xNapjm1 ! factors depending on the pj loop - REAL(dp) :: xphij, xphijp1, xphijm1, xColl + REAL(dp) :: kr, kz, kperp2 + REAL(dp) :: taue_qe_etaB, taui_qi_etaB + REAL(dp) :: kernelj, kerneljp1, kerneljm1, b_e2, b_i2 ! Kernel functions and variable + REAL(dp) :: factj, sigmae2_taue_o2, sigmai2_taui_o2 ! Auxiliary variables + REAL(dp) :: xNapj, xNapp2j, xNapm2j, xNapjp1, xNapjm1 ! factors depending on the pj loop + REAL(dp) :: xphij, xphijp1, xphijm1, xColl COMPLEX(dp) :: TNapj, TNapp2j, TNapm2j, TNapjp1, TNapjm1, Tphi COMPLEX(dp) :: TColl, TColl20, TColl01, TColl10 ! terms of the rhs !Precompute species dependant factors - taue_qe_etaB = tau_e/q_e * eta_B - xb_e2 = sigma_e**2 * tau_e!/2.0 ! species dependant factor of the Kernel, squared - taui_qi_etaB = tau_i/q_i * eta_B - xb_i2 = sigma_i**2 * tau_i!/2.0 ! species dependant factor of the Kernel, squared + taue_qe_etaB = tau_e/q_e * eta_B ! factor of the magnetic moment coupling + taui_qi_etaB = tau_i/q_i * eta_B + sigmae2_taue_o2 = sigma_e**2 * tau_e/2.0 ! factor of the Kernel argument + sigmai2_taui_o2 = sigma_i**2 * tau_i/2.0 !!!!!!!!! Electrons moments RHS !!!!!!!!! - Tphi = 0 ! electrostatic potential term ploope : DO ip = ips_e, ipe_e ! This loop is from 1 to pmaxe+1 - ip_dp = REAL(ip-1.,dp) ! REAL index is one minus the loop index (0 to pmax) + ip_dp = REAL(ip-1,dp) ! REAL index is one minus the loop index (0 to pmax) ! N_e^{p+2,j} multiplicator - IF (ip+2 .LE. ipe_e) THEN + IF (ip+2 .LE. pmaxe+1) THEN xNapp2j = -taue_qe_etaB * SQRT((ip_dp + 1.) * (ip_dp + 2.)) ELSE xNapp2j = 0. ENDIF ! N_e^{p-2,j} multiplicator - IF (ip-2 .GE. ips_e) THEN + IF (ip-2 .GE. 1) THEN xNapm2j = -taue_qe_etaB * SQRT(ip_dp*(ip_dp - 1.)) ELSE xNapm2j = 0. ENDIF + factj = 1.0 ! Start of the recursive factorial + jloope : DO ij = ijs_e, ije_e ! This loop is from 1 to jmaxe+1 - ij_dp = REAL(ij-1.,dp) ! REAL index is one minus the loop index (0 to jmax) + ij_dp = REAL(ij-1,dp) ! REAL index is one minus the loop index (0 to jmax) + + IF (ij_dp .GT. 0) THEN + factj = factj * ij_dp; ! Recursive factorial + ENDIF ! N_e^{p,j+1} multiplicator - IF (ij+1 .LE. ije_e) THEN + IF (ij+1 .LE. jmaxe+1) THEN xNapjp1 = taue_qe_etaB * (ij_dp + 1.) ELSE xNapjp1 = 0. ENDIF ! N_e^{p,j-1} multiplicator - IF (ij-1 .GE. ijs_e) THEN + IF (ij-1 .GE. 1) THEN xNapjm1 = taue_qe_etaB * ij_dp ELSE xNapjm1 = 0. ENDIF ! N_e^{pj} multiplicator - xNapj = -taue_qe_etaB * 2.*(ip_dp + ij_dp + 1.) + xNapj = -taue_qe_etaB * 2.*(ip_dp + ij_dp + 1.) ! Collision operator (DK Lenard-Bernstein basis) xColl = ip_dp + 2.*ij_dp - ! ... adding Dougherty terms - IF ( (ip .EQ. 1) .AND. (ij .EQ. 2) ) THEN ! kronecker p0 * j1 - TColl01 = 2.0/3.0*(SQRT2*moments_e(3,1,ikr,ikz,updatetlevel)& - - 2.0*moments_e(1,2,ikr,ikz,updatetlevel)) - TColl20 = 0.0; TColl10 = 0.0; - ELSEIF ( (ip .EQ. 3) .AND. (ij .EQ. 1) ) THEN ! kronecker p2 * j0 - TColl20 = -SQRT2/3.0*(SQRT2*moments_e(3,1,ikr,ikz,updatetlevel)& - - 2.0*moments_e(1,2,ikr,ikz,updatetlevel)) - TColl10 = 0.0; TColl01 = 0.0; - ELSEIF ( (ip .EQ. 2) .AND. (ij .EQ. 1) ) THEN ! kronecker p1 * j0 - TColl10 = moments_e(2,1,ikr,ikz,updatetlevel) - TColl20 = 0.0; TColl01 = 0.0; - ELSE - TColl10 = 0.0; TColl20 = 0.0; TColl01 = 0.0; - ENDIF ! phi multiplicator for different kernel numbers IF (ip .EQ. 1) THEN !(kronecker delta_p^0) xphij = (eta_n + 2.*ij_dp*eta_T - 2.*eta_B*(ij_dp+1.) ) xphijp1 = -(eta_T - eta_B)*(ij_dp+1.) xphijm1 = -(eta_T - eta_B)* ij_dp - factj = REAL(Factorial(ij-1),dp) ELSE IF (ip .EQ. 3) THEN !(kronecker delta_p^2) xphij = (eta_T/SQRT2 - SQRT2*eta_B) - factj = REAL(Factorial(ij-1),dp) + xphijp1 = 0.; xphijm1 = 0. ELSE xphij = 0.; xphijp1 = 0.; xphijm1 = 0. - factj = 1 ENDIF - !write(*,*) '(ip,ij) = (', ip,',', ij,')' - ! Loop on kspace krloope : DO ikr = ikrs,ikre kzloope : DO ikz = ikzs,ikze kr = krarray(ikr) ! Poloidal wavevector kz = kzarray(ikz) ! Toroidal wavevector kperp2 = kr**2 + kz**2 ! perpendicular wavevector - b_e2 = kperp2 * xb_e2 ! Bessel argument + b_e2 = kperp2 * sigmae2_taue_o2 ! Bessel argument !! Compute moments and mixing terms ! term propto N_e^{p,j} TNapj = moments_e(ip,ij,ikr,ikz,updatetlevel) * xNapj ! term propto N_e^{p+2,j} - IF (ip+2 .LE. ipe_e) THEN + IF (ip+2 .LE. pmaxe+1) THEN TNapp2j = moments_e(ip+2,ij,ikr,ikz,updatetlevel) * xNapp2j ELSE TNapp2j = 0. ENDIF ! term propto N_e^{p-2,j} - IF (ip-2 .GE. ips_e) THEN + IF (ip-2 .GE. 1) THEN TNapm2j = moments_e(ip-2,ij,ikr,ikz,updatetlevel) * xNapm2j ELSE TNapm2j = 0. ENDIF ! xterm propto N_e^{p,j+1} - IF (ij+1 .LE. ije_e) THEN + IF (ij+1 .LE. jmaxe+1) THEN TNapjp1 = moments_e(ip,ij+1,ikr,ikz,updatetlevel) * xNapjp1 ELSE TNapjp1 = 0. ENDIF ! term propto N_e^{p,j-1} - IF (ij-1 .GE. ijs_e) THEN + IF (ij-1 .GE. 1) THEN TNapjm1 = moments_e(ip,ij-1,ikr,ikz,updatetlevel) * xNapjm1 ELSE TNapjm1 = 0. ENDIF - ! Collision term completed (DK Dougherty) + ! Dougherty Collision terms + IF ( (ip .EQ. 1) .AND. (ij .EQ. 2) .AND. (pmaxe .GE. 2) ) THEN ! kronecker p0 * j1 + TColl01 = 2.0/3.0*(SQRT2*moments_e(3,1,ikr,ikz,updatetlevel)& + - 2.0*moments_e(1,2,ikr,ikz,updatetlevel)) + TColl20 = 0.0; TColl10 = 0.0; + ELSEIF ( (ip .EQ. 3) .AND. (ij .EQ. 1) .AND. (jmaxe .GE. 1)) THEN ! kronecker p2 * j0 + TColl20 = -SQRT2/3.0*(SQRT2*moments_e(3,1,ikr,ikz,updatetlevel)& + - 2.0*moments_e(1,2,ikr,ikz,updatetlevel)) + TColl10 = 0.0; TColl01 = 0.0; + ELSEIF ( (ip .EQ. 2) .AND. (ij .EQ. 1) ) THEN ! kronecker p1 * j0 + TColl10 = moments_e(2,1,ikr,ikz,updatetlevel) + TColl20 = 0.0; TColl01 = 0.0; + ELSE + TColl10 = 0.0; TColl20 = 0.0; TColl01 = 0.0; + ENDIF + ! Total collisional term TColl = -nu * (xColl * moments_e(ip,ij,ikr,ikz,updatetlevel) & - + TColl01 + TColl10 + TColl20) + + TColl01 + TColl10 + TColl20) !! Electrical potential term - Tphi = 0 - IF ( (ip .eq. 1) .or. (ip .eq. 3) ) THEN ! 0 otherwise (krokecker delta_p^0) + IF ( (ip .EQ. 1) .OR. (ip .EQ. 3) ) THEN ! kronecker delta_p^0, delta_p^2 kernelj = b_e2**(ij-1) * exp(-b_e2)/factj kerneljp1 = kernelj * b_e2 /(ij_dp + 1.) kerneljm1 = kernelj * ij_dp / b_e2 - Tphi = (xphij*Kernelj + xphijp1*Kerneljp1 + xphijm1*Kerneljm1) * phi(ikr,ikz) + Tphi = (xphij*kernelj + xphijp1*kerneljp1 + xphijm1*kerneljm1) * phi(ikr,ikz) + ELSE + Tphi = 0 ENDIF ! Sum of all precomputed terms moments_rhs_e(ip,ij,ikr,ikz,updatetlevel) = & imagu * kz * (TNapj + TNapp2j + TNapm2j + TNapjp1 + TNapjm1 + Tphi) + TColl - + END DO kzloope END DO krloope @@ -160,37 +161,41 @@ SUBROUTINE moments_eq_rhs END DO ploope !!!!!!!!! Ions moments RHS !!!!!!!!! - Tphi = 0 ! electrostatic potential term - ploopi : DO ip = ips_i, ipe_i - ip_dp = REAL(ip-1.,dp) + ip_dp = REAL(ip-1,dp) ! x N_i^{p+2,j} - IF (ip+2 .LE. ipe_i) THEN + IF (ip+2 .LE. pmaxi+1) THEN xNapp2j = -taui_qi_etaB * SQRT((ip_dp + 1.) * (ip_dp + 2.)) ELSE xNapp2j = 0. ENDIF ! x N_i^{p-2,j} - IF (ip-2 .GE. ips_i) THEN + IF (ip-2 .GE. 1) THEN xNapm2j = -taui_qi_etaB * SQRT(ip_dp * (ip_dp - 1.)) ELSE xNapm2j = 0. ENDIF + factj = 1.0 ! Start of the recursive factorial + jloopi : DO ij = ijs_i, ije_i - ij_dp = REAL(ij-1.,dp) + ij_dp = REAL(ij-1,dp) + + IF (ij_dp .GT. 0) THEN + factj = factj * ij_dp; ! Recursive factorial + ENDIF ! x N_i^{p,j+1} - IF (ij+1 .LE. ije_i) THEN + IF (ij+1 .LE. jmaxi+1) THEN xNapjp1 = taui_qi_etaB * (ij_dp + 1.) ELSE xNapjp1 = 0. ENDIF ! x N_i^{p,j-1} - IF (ij-1 .GE. ijs_i) THEN + IF (ij-1 .GE. 1) THEN xNapjm1 = taui_qi_etaB * ij_dp ELSE xNapjm1 = 0. @@ -199,38 +204,19 @@ SUBROUTINE moments_eq_rhs ! x N_i^{pj} xNapj = -taui_qi_etaB * 2.*(ip_dp + ij_dp + 1.) - ! Collision term completed (DK Dougherty) - TColl = -nu * (xColl * moments_i(ip,ij,ikr,ikz,updatetlevel) & - + TColl01 + TColl10 + TColl20) - - ! ... adding Dougherty terms - IF ( (ip .EQ. 1) .AND. (ij .EQ. 2) ) THEN ! kronecker p0 * j1 - TColl01 = 2.0/3.0*(SQRT2*moments_i(3,1,ikr,ikz,updatetlevel)& - - 2.0*moments_i(1,2,ikr,ikz,updatetlevel)) - TColl20 = 0.0; TColl10 = 0.0; - ELSEIF ( (ip .EQ. 3) .AND. (ij .EQ. 1) ) THEN ! kronecker p2 * j0 - TColl20 = -SQRT2/3.0*(SQRT2*moments_i(3,1,ikr,ikz,updatetlevel)& - - 2.0*moments_i(1,2,ikr,ikz,updatetlevel)) - TColl10 = 0.0; TColl01 = 0.0; - ELSEIF ( (ip .EQ. 2) .AND. (ij .EQ. 1) ) THEN ! kronecker p1 * j0 - TColl10 = moments_i(2,1,ikr,ikz,updatetlevel) - TColl20 = 0.0; TColl01 = 0.0; - ELSE - TColl10 = 0.0; TColl20 = 0.0; TColl01 = 0.0; - ENDIF + ! Collision operator (DK Lenard-Bernstein basis) + xColl = ip_dp + 2.*ij_dp ! x phi IF (ip .EQ. 1) THEN !(krokecker delta_p^0) xphij = (eta_n + 2.*ij_dp*eta_T - 2.*eta_B*(ij_dp+1.) ) xphijp1 = -(eta_T - eta_B)*(ij_dp+1.) xphijm1 = -(eta_T - eta_B)* ij_dp - factj = REAL(Factorial(ij-1),dp) ELSE IF (ip .EQ. 3) THEN !(krokecker delta_p^2) xphij = (eta_T/SQRT2 - SQRT2*eta_B) - factj = REAL(Factorial(ij-1),dp) + xphijp1 = 0.; xphijm1 = 0. ELSE xphij = 0.; xphijp1 = 0.; xphijm1 = 0. - factj = 1. ENDIF ! Loop on kspace @@ -239,52 +225,68 @@ SUBROUTINE moments_eq_rhs kr = krarray(ikr) ! Poloidal wavevector kz = kzarray(ikz) ! Toroidal wavevector kperp2 = kr**2 + kz**2 ! perpendicular wavevector - b_i2 = kperp2 * xb_i2 ! Bessel argument + b_i2 = kperp2 * sigmai2_taui_o2 ! Bessel argument !! Compute moments and mixing terms ! term propto N_i^{p,j} TNapj = moments_i(ip,ij,ikr,ikz,updatetlevel) * xNapj ! term propto N_i^{p+2,j} - IF (ip+2 .LE. ipe_i) THEN + IF (ip+2 .LE. pmaxi+1) THEN TNapp2j = moments_i(ip+2,ij,ikr,ikz,updatetlevel) * xNapp2j ELSE TNapp2j = 0. ENDIF ! term propto N_i^{p-2,j} - IF (ip-2 .GE. ips_i) THEN + IF (ip-2 .GE. 1) THEN TNapm2j = moments_i(ip-2,ij,ikr,ikz,updatetlevel) * xNapm2j ELSE TNapm2j = 0. ENDIF ! xterm propto N_i^{p,j+1} - IF (ij+1 .LE. ije_i) THEN + IF (ij+1 .LE. jmaxi+1) THEN TNapjp1 = moments_i(ip,ij+1,ikr,ikz,updatetlevel) * xNapjp1 ELSE TNapjp1 = 0. ENDIF ! term propto N_i^{p,j-1} - IF (ij-1 .GE. ijs_i) THEN + IF (ij-1 .GE. 1) THEN TNapjm1 = moments_i(ip,ij-1,ikr,ikz,updatetlevel) * xNapjm1 ELSE TNapjm1 = 0. ENDIF - ! Collision term completed (Dougherty) - TColl = -nu* (xColl * moments_i(ip,ij,ikr,ikz,updatetlevel)) + ! Dougherty Collision terms + IF ( (ip .EQ. 1) .AND. (ij .EQ. 2) .AND. (pmaxi .GE. 2)) THEN ! kronecker p0 * j1 + TColl01 = 2.0/3.0*(SQRT2*moments_i(3,1,ikr,ikz,updatetlevel)& + - 2.0*moments_i(1,2,ikr,ikz,updatetlevel)) + TColl20 = 0.0; TColl10 = 0.0; + ELSEIF ( (ip .EQ. 3) .AND. (ij .EQ. 1) .AND. (jmaxi .GE. 1)) THEN ! kronecker p2 * j0 + TColl20 = -SQRT2/3.0*(SQRT2*moments_i(3,1,ikr,ikz,updatetlevel)& + - 2.0*moments_i(1,2,ikr,ikz,updatetlevel)) + TColl10 = 0.0; TColl01 = 0.0; + ELSEIF ( (ip .EQ. 2) .AND. (ij .EQ. 1) ) THEN ! kronecker p1 * j0 + TColl10 = moments_i(2,1,ikr,ikz,updatetlevel) + TColl20 = 0.0; TColl01 = 0.0; + ELSE + TColl10 = 0.0; TColl20 = 0.0; TColl01 = 0.0; + ENDIF + ! Total collisional term + TColl = -nu * (xColl * moments_e(ip,ij,ikr,ikz,updatetlevel) & + + TColl01 + TColl10 + TColl20) !! Electrical potential term - Tphi = 0 - IF ( (ip .eq. 1) .or. (ip .eq. 3) ) THEN ! 0 otherwise (krokecker delta_p^0, delta_p^2) + IF ( (ip .eq. 1) .or. (ip .eq. 3) ) THEN ! kronecker delta_p^0, delta_p^2 kernelj = b_i2**(ij-1) * exp(-b_i2)/factj kerneljp1 = kernelj * b_i2 /(ij_dp + 1.) kerneljm1 = kernelj * ij_dp / b_i2 - Tphi = (xphij*Kernelj + xphijp1*Kerneljp1 + xphijm1*Kerneljm1) * phi(ikr,ikz) + Tphi = (xphij*kernelj + xphijp1*kerneljp1 + xphijm1*kerneljm1) * phi(ikr,ikz) + ELSE + Tphi = 0 ENDIF - ! Sum of all precomputed terms moments_rhs_i(ip,ij,ikr,ikz,updatetlevel) = & imagu * kz * (TNapj + TNapp2j + TNapm2j + TNapjp1 + TNapjm1 + Tphi) + TColl - + END DO kzloopi END DO krloopi diff --git a/src/poisson.F90 b/src/poisson.F90 index 1819af6fe1338202ced63129a2a8c8a2f12897b5..b3b5d68422bdf06be70d62eeacfc3442a2e7b767 100644 --- a/src/poisson.F90 +++ b/src/poisson.F90 @@ -13,82 +13,74 @@ SUBROUTINE poisson INTEGER :: ikr,ikz, ini,ine, i0j REAL(dp) :: ini_dp, ine_dp REAL(dp) :: kr, kz, kperp2 - REAL(dp) :: Kn, Kn2 ! sub kernel factor for recursive build + REAL(dp) :: Kne, Kni ! sub kernel factor for recursive build REAL(dp) :: b_e2, b_i2, alphaD REAL(dp) :: sigmae2_taue_o2, sigmai2_taui_o2, qe2_taue, qi2_taui ! To avoid redondant computation - COMPLEX(dp) :: gammaD, gammaphi - COMPLEX(dp) :: sum_kernel2_e, sum_kernel2_i ! Store to compute sum Kn^2 - COMPLEX(dp) :: sum_kernel_mom_e, sum_kernel_mom_i ! Store to compute sum Kn*Napn - + REAL(dp) :: sum_kernel2_e, sum_kernel2_i ! Store sum Kn^2 + COMPLEX(dp) :: sum_kernel_mom_e, sum_kernel_mom_i ! Store sum Kn*Napn + REAL(dp) :: gammaD + COMPLEX(dp) :: gammaD_phi + !Precompute species dependant factors - sigmae2_taue_o2 = sigma_e**2 * tau_e/2. + sigmae2_taue_o2 = sigma_e**2 * tau_e/2. ! factor of the Kernel argument sigmai2_taui_o2 = sigma_i**2 * tau_i/2. - qe2_taue = (q_e**2)/tau_e + qe2_taue = (q_e**2)/tau_e ! factor of the gammaD sum qi2_taui = (q_i**2)/tau_i DO ikr=ikrs,ikre DO ikz=ikzs,ikze - kr = krarray(ikr) - kz = kzarray(ikz) + kr = krarray(ikr) + kz = kzarray(ikz) kperp2 = kr**2 + kz**2 !! Electrons sum(Kernel * Ne0n) (skm) and sum(Kernel**2) (sk2) b_e2 = kperp2 * sigmae2_taue_o2 ! non dim kernel argument (kperp2 sigma_a sqrt(2 tau_a)) ! Initialization for n = 0 (ine = 1) - Kn = 1. - Kn2 = 1. - sum_kernel_mom_e = moments_e(1,1,ikr,ikz,updatetlevel) - sum_kernel2_e = Kn2 + Kne = exp(-b_e2) + sum_kernel_mom_e = Kne*moments_e(1, 1, ikr, ikz, updatetlevel) + sum_kernel2_e = Kne**2 ! loop over n only if the max polynomial degree is 1 or more if (jmaxe .GT. 0) then - DO ine=1,jmaxe+1 ! ine = n+1 + DO ine=2,jmaxe+1 ! ine = n+1 ine_dp = REAL(ine-1,dp) - Kn = Kn * b_e2/(ine_dp+1) ! We update iteratively the kernel functions (to spare factorial computations) - Kn2 = Kn2 *(b_e2/(ine_dp+1))**2 ! the exp term is still missing but does not depend on ine ... + Kne = Kne * b_e2/ine_dp ! We update iteratively the kernel functions (to spare factorial computations) - sum_kernel_mom_e = sum_kernel_mom_e + Kn * moments_e(1,ine,ikr,ikz,updatetlevel) - sum_kernel2_e = sum_kernel2_e + Kn2 ! ... sum recursively ... + sum_kernel_mom_e = sum_kernel_mom_e + Kne * moments_e(1, ine, ikr, ikz, updatetlevel) + sum_kernel2_e = sum_kernel2_e + Kne**2 ! ... sum recursively ... END DO endif - sum_kernel_mom_e = sum_kernel_mom_e * exp(-b_e2) ! ... multiply the final sum with the missing exponential term - sum_kernel2_e = sum_kernel2_e * exp(-2.*b_e2) ! and its squared using exp(x)^2 = exp(2x). !! Ions sum(Kernel * Ni0n) (skm) and sum(Kernel**2) (sk2) b_i2 = kperp2 * sigmai2_taui_o2 ! Initialization for n = 0 (ini = 1) - Kn = 1. - Kn2 = 1. - sum_kernel_mom_i = moments_i(1, 1, ikr, ikz, updatetlevel) - sum_kernel2_i = Kn2 + Kni = exp(-b_i2) + sum_kernel_mom_i = Kni*moments_i(1, 1, ikr, ikz, updatetlevel) + sum_kernel2_i = Kni**2 ! loop over n only if the max polynomial degree is 1 or more if (jmaxi .GT. 0) then - DO ini=1,jmaxi+1 + DO ini=2,jmaxi+1 ini_dp = REAL(ini-1,dp) ! Real index (0 to jmax) - Kn = Kn * b_i2/(ini_dp+1) ! We update iteratively the kernel functions this time for ions ... - Kn2 = Kn2 *(b_i2/(ini_dp+1.))**2 + Kni = Kni * b_i2/ini_dp ! We update iteratively the kernel functions this time for ions ... - sum_kernel_mom_i = sum_kernel_mom_i + Kn * moments_i(1,ini,ikr,ikz,updatetlevel) - sum_kernel2_i = sum_kernel2_i + Kn2 ! ... sum recursively ... + sum_kernel_mom_i = sum_kernel_mom_i + Kni * moments_i(1, ini, ikr, ikz, updatetlevel) + sum_kernel2_i = sum_kernel2_i + Kni**2 ! ... sum recursively ... END DO endif - sum_kernel_mom_i = sum_kernel_mom_i * exp(-b_i2) ! ... multiply the final sum with the missing exponential term. - sum_kernel2_i = sum_kernel2_i * exp(-2.*b_i2) !!! Assembling the poisson equation - alphaD = kperp2 * lambdaD**2. + alphaD = kperp2 * lambdaD**2 gammaD = alphaD + qe2_taue * (1. - sum_kernel2_e) & + qi2_taui * (1. - sum_kernel2_i) - - gammaphi = q_e * sum_kernel_mom_e + q_i * sum_kernel_mom_i ! gamma_D * phi term + gammaD_phi = q_e * sum_kernel_mom_e + q_i * sum_kernel_mom_i ! gamma_D * phi term - phi(ikr, ikz) = gammaphi/gammaD - + phi(ikr, ikz) = gammaD_phi/gammaD + END DO END DO