From 0bc911b95ae83c180e4db28a400c07d3ff1d8ca1 Mon Sep 17 00:00:00 2001 From: Antoine Cyril David Hoffmann <ahoffman@spcpc606.epfl.ch> Date: Wed, 27 Oct 2021 15:31:22 +0200 Subject: [PATCH] Added non adiabatic moments fields to simplify writing --- src/memory.F90 | 7 +- src/moments_eq_rhs.F90 | 152 +++++++++++++++++++---------------------- src/processing_mod.F90 | 4 +- 3 files changed, 75 insertions(+), 88 deletions(-) diff --git a/src/memory.F90 b/src/memory.F90 index 2d1dee0a..e6dc6a2a 100644 --- a/src/memory.F90 +++ b/src/memory.F90 @@ -41,8 +41,8 @@ SUBROUTINE memory CALL allocate_array( moments_rhs_i, ips_i,ipe_i, ijs_i,ije_i, ikxs,ikxe, ikys,ikye, izs,ize, 1,ntimelevel ) ! Non linear terms and dnjs table - CALL allocate_array( nadiab_moments_e, ips_e,ipe_e, ijs_e,ije_e, ikxs,ikxe, ikys,ikye, izs,ize) - CALL allocate_array( nadiab_moments_i, ips_i,ipe_i, ijs_i,ije_i, ikxs,ikxe, ikys,ikye, izs,ize) + CALL allocate_array( nadiab_moments_e, ipsg_e,ipeg_e, ijsg_e,ijeg_e, ikxs,ikxe, ikys,ikye, izs,ize) + CALL allocate_array( nadiab_moments_i, ipsg_i,ipeg_i, ijsg_i,ijeg_i, ikxs,ikxe, ikys,ikye, izs,ize) ! Collision term CALL allocate_array( TColl_e, ips_e,ipe_e, ijs_e,ije_e , ikxs,ikxe, ikys,ikye, izs,ize) @@ -90,7 +90,8 @@ SUBROUTINE memory CALL allocate_array( xphijm1, ips_i,ipe_i, ijs_i,ije_i) ! Curvature and geometry - CALL allocate_array( Ckxky, ikxs,ikxe, ikys,ikye, izs,ize) + CALL allocate_array( Ckxky, ikxs,ikxe, ikys,ikye, izs,ize) + CALL allocate_array( kparray, ikxs,ikxe, ikys,ikye, izs,ize) CALL allocate_array(Jacobian,izs,ize) CALL allocate_array(gxx, izs,ize) CALL allocate_array(gxy, izs,ize) diff --git a/src/moments_eq_rhs.F90 b/src/moments_eq_rhs.F90 index 0dd19cb0..1660a184 100644 --- a/src/moments_eq_rhs.F90 +++ b/src/moments_eq_rhs.F90 @@ -25,7 +25,7 @@ SUBROUTINE moments_eq_rhs_e COMPLEX(dp) :: TColl ! terms of the rhs COMPLEX(dp) :: i_ky REAL(dp) :: delta_p0, delta_p1, delta_p2 - INTEGER :: izprev,iznext ! indices of previous and next z slice + INTEGER :: izm2, izm1, izp1, izp2 ! indices for centered FDF ddz ! Measuring execution time CALL cpu_time(t0_rhs) @@ -39,60 +39,55 @@ SUBROUTINE moments_eq_rhs_e jloope : DO ij = ijs_e, ije_e ! loop over Laguerre degree indices j_int = jarray_e(ij) - GF_CLOSURE_e : IF( (CLOS .EQ. 1) .AND. (p_int+2*j_int .GT. Dmaxe) ) THEN - !skip - ELSE ! Loop on kspace zloope : DO iz = izs,ize - ! Periodic BC for parallel centered finite differences - iznext = iz+1; izprev = iz-1; - IF(iz .EQ. 1) izprev = Nz - IF(iz .EQ. Nz) iznext = 1 - + ! Obtain the index with an array that accounts for boundary conditions + ! e.g. : 4 stencil with periodic BC, izarray(Nz+2) = 2, izarray(-1) = Nz-1 + izp1 = izarray(iz+1); izp2 = izarray(iz+2); + izm1 = izarray(iz-1); izm2 = izarray(iz-2); + ! kxloope : DO ikx = ikxs,ikxe kx = kxarray(ikx) ! radial wavevector kyloope : DO iky = ikys,ikye ky = kyarray(iky) ! toroidal wavevector i_ky = imagu * ky ! toroidal derivative IF (Nky .EQ. 1) i_ky = imagu * kxarray(ikx) ! If 1D simulation we put kx as ky - kperp2= gxx(iz)*kx**2 + 2._dp*gxy(iz)*kx*ky + gyy(iz)*ky**2 + ! kperp2= gxx(iz)*kx**2 + 2._dp*gxy(iz)*kx*ky + gyy(iz)*ky**2 + kperp2= kparray(ikx,iky,iz)**2 !! Compute moments mixing terms ! Perpendicular dynamic ! term propto n_e^{p,j} - Tnepj = xnepj(ip,ij) * (moments_e(ip,ij,ikx,iky,iz,updatetlevel) & - +kernel_e(ij,ikx,iky,iz)*qe_taue*phi(ikx,iky,iz)*delta_p0) + Tnepj = xnepj(ip,ij)* nadiab_moments_e(ip,ij,ikx,iky,iz) ! term propto n_e^{p+2,j} - Tnepp2j = xnepp2j(ip) * moments_e(ip+(2/deltape),ij,ikx,iky,iz,updatetlevel) + Tnepp2j = xnepp2j(ip) * nadiab_moments_e(ip+pp2,ij,ikx,iky,iz) ! term propto n_e^{p-2,j} - Tnepm2j = xnepm2j(ip) * (moments_e(ip-(2/deltape),ij,ikx,iky,iz,updatetlevel) & - +kernel_e(ij,ikx,iky,iz)*qe_taue*phi(ikx,iky,iz)*delta_p2) + Tnepm2j = xnepm2j(ip) * nadiab_moments_e(ip-pp2,ij,ikx,iky,iz) ! term propto n_e^{p,j+1} - Tnepjp1 = xnepjp1(ij) * (moments_e(ip,ij+1,ikx,iky,iz,updatetlevel) & - +kernel_e(ij+1,ikx,iky,iz)*qe_taue*phi(ikx,iky,iz)*delta_p0) + Tnepjp1 = xnepjp1(ij) * nadiab_moments_e(ip,ij+1,ikx,iky,iz) ! term propto n_e^{p,j-1} - Tnepjm1 = xnepjm1(ij) * (moments_e(ip,ij-1,ikx,iky,iz,updatetlevel) & - +kernel_e(ij-1,ikx,iky,iz)*qe_taue*phi(ikx,iky,iz)*delta_p0) + Tnepjm1 = xnepjm1(ij) * nadiab_moments_e(ip,ij-1,ikx,iky,iz) ! Parallel dynamic - ! term propto centered FDF dz(n_a) + ! ddz derivative for Landau damping term Tpare = xnepp1j(ip) * & - (moments_e(ip+1,ij,ikx,iky,iznext,updatetlevel)& - -moments_e(ip+1,ij,ikx,iky,izprev,updatetlevel)) & - +xnepm1j(ip) * & - (moments_e(ip-1,ij,ikx,iky,iznext,updatetlevel)+kernel_e(ij,ikx,iky,iz)*qe_taue*phi(ikx,iky,iznext)*delta_p1& - -moments_e(ip-1,ij,ikx,iky,izprev,updatetlevel)-kernel_e(ij,ikx,iky,iz)*qe_taue*phi(ikx,iky,izprev)*delta_p1) - + ( onetwelfth*nadiab_moments_e(ip+1,ij,ikx,iky,izm2)& + - twothird*nadiab_moments_e(ip+1,ij,ikx,iky,izm1)& + + twothird*nadiab_moments_e(ip+1,ij,ikx,iky,izp1)& + -onetwelfth*nadiab_moments_e(ip+1,ij,ikx,iky,izp2))& + +xnepm1j(ip) * & + ( onetwelfth*nadiab_moments_e(ip-1,ij,ikx,iky,izm2)& + - twothird*nadiab_moments_e(ip-1,ij,ikx,iky,izm1)& + + twothird*nadiab_moments_e(ip-1,ij,ikx,iky,izp1)& + -onetwelfth*nadiab_moments_e(ip-1,ij,ikx,iky,izp2)) ! Mirror terms - Tnepp1j = ynepp1j(ip,ij) * moments_e(ip+1, ij,ikx,iky,iz,updatetlevel) - Tnepp1jm1 = ynepp1jm1(ip,ij) * moments_e(ip+1,ij-1,ikx,iky,iz,updatetlevel) - Tnepm1j = ynepm1j(ip,ij) * (moments_e(ip-1, ij,ikx,iky,iz,updatetlevel) & - +kernel_e(ij,ikx,iky,iz)*qe_taue*phi(ikx,iky,iz)*delta_p1) - Tnepm1jm1 = ynepm1jm1(ip,ij) * (moments_e(ip-1,ij-1,ikx,iky,iz,updatetlevel) & - +kernel_e(ij-1,ikx,iky,iz)*qe_taue*phi(ikx,iky,iz)*delta_p1) - - UNepm1j = zNepm1j(ip,ij) * moments_e(ip+1, ij,ikx,iky,iz,updatetlevel) - UNepm1jp1 = zNepm1jp1(ip,ij) * moments_e(ip-1,ij+1,ikx,iky,iz,updatetlevel) - UNepm1jm1 = zNepm1jm1(ip,ij) * moments_e(ip-1,ij-1,ikx,iky,iz,updatetlevel) + Tnepp1j = ynepp1j(ip,ij) * nadiab_moments_e(ip+1,ij ,ikx,iky,iz) + Tnepp1jm1 = ynepp1jm1(ip,ij) * nadiab_moments_e(ip+1,ij-1,ikx,iky,iz) + Tnepm1j = ynepm1j(ip,ij) * nadiab_moments_e(ip-1,ij ,ikx,iky,iz) + Tnepm1jm1 = ynepm1jm1(ip,ij) * nadiab_moments_e(ip-1,ij-1,ikx,iky,iz) + ! Trapping terms + UNepm1j = zNepm1j(ip,ij) * nadiab_moments_e(ip-1,ij ,ikx,iky,iz) + UNepm1jp1 = zNepm1jp1(ip,ij) * nadiab_moments_e(ip-1,ij+1,ikx,iky,iz) + UNepm1jm1 = zNepm1jm1(ip,ij) * nadiab_moments_e(ip-1,ij-1,ikx,iky,iz) Tmir = Tnepp1j + Tnepp1jm1 + Tnepm1j + Tnepm1jm1 + UNepm1j + UNepm1jp1 + UNepm1jm1 @@ -117,9 +112,9 @@ SUBROUTINE moments_eq_rhs_e !! Sum of all linear terms (the sign is inverted to match RHS) moments_rhs_e(ip,ij,ikx,iky,iz,updatetlevel) = & ! Perpendicular magnetic gradient/curvature effects - - imagu*Ckxky(ikx,iky,iz) * (Tnepj + Tnepp2j + Tnepm2j + Tnepjp1 + Tnepjm1)& + - imagu*Ckxky(ikx,iky,iz)*hatR(iz)* (Tnepj + Tnepp2j + Tnepm2j + Tnepjp1 + Tnepjm1)& ! Parallel coupling (Landau Damping) - - Tpare/2._dp/deltaz*gradz_coeff(iz) & + - Tpare*inv_deltaz*gradz_coeff(iz) & ! Mirror term (parallel magnetic gradient) - gradzB(iz)* Tmir *gradz_coeff(iz) & ! Drives (density + temperature gradients) @@ -132,7 +127,7 @@ SUBROUTINE moments_eq_rhs_e + TColl !! Adding non linearity - IF ( NON_LIN .AND. (NL_CLOS .GT. -3)) THEN + IF ( NON_LIN ) THEN moments_rhs_e(ip,ij,ikx,iky,iz,updatetlevel) = & moments_rhs_e(ip,ij,ikx,iky,iz,updatetlevel) - Sepj(ip,ij,ikx,iky,iz) ENDIF @@ -140,8 +135,6 @@ SUBROUTINE moments_eq_rhs_e END DO kyloope END DO kxloope END DO zloope - - ENDIF GF_CLOSURE_e END DO jloope END DO ploope @@ -176,7 +169,7 @@ SUBROUTINE moments_eq_rhs_i COMPLEX(dp) :: TColl ! terms of the rhs COMPLEX(dp) :: i_ky REAL(dp) :: delta_p0, delta_p1, delta_p2 - INTEGER :: izprev,iznext ! indices of previous and next z slice + INTEGER :: izm2, izm1, izp1, izp2 ! indices for centered FDF ddz ! Measuring execution time CALL cpu_time(t0_rhs) @@ -191,60 +184,55 @@ SUBROUTINE moments_eq_rhs_i jloopi : DO ij = ijs_i, ije_i ! This loop is from 1 to jmaxi+1 j_int = jarray_i(ij) - GF_CLOSURE_i : IF( (CLOS .EQ. 1) .AND. (p_int+2*j_int .GT. Dmaxe) ) THEN - !skip - ELSE ! Loop on kspace zloopi : DO iz = izs,ize - ! Periodic BC for first order derivative - iznext = iz+1; izprev = iz-1; - IF(iz .EQ. 1) izprev = Nz - IF(iz .EQ. Nz) iznext = 1 - + ! Obtain the index with an array that accounts for boundary conditions + ! e.g. : 4 stencil with periodic BC, izarray(Nz+2) = 2, izarray(-1) = Nz-1 + izp1 = izarray(iz+1); izp2 = izarray(iz+2); + izm1 = izarray(iz-1); izm2 = izarray(iz-2); + ! kxloopi : DO ikx = ikxs,ikxe kx = kxarray(ikx) ! radial wavevector kyloopi : DO iky = ikys,ikye ky = kyarray(iky) ! toroidal wavevector i_ky = imagu * ky ! toroidal derivative IF (Nky .EQ. 1) i_ky = imagu * kxarray(ikx) ! If 1D simulation we put kx as ky - kperp2= gxx(iz)*kx**2 + 2._dp*gxy(iz)*kx*ky + gyy(iz)*ky**2 + ! kperp2= gxx(iz)*kx**2 + 2._dp*gxy(iz)*kx*ky + gyy(iz)*ky**2 + kperp2= kparray(ikx,iky,iz)**2 !! Compute moments mixing terms ! Perpendicular dynamic ! term propto n_i^{p,j} - Tnipj = xnipj(ip,ij) * (moments_i(ip,ij,ikx,iky,iz,updatetlevel) & - +kernel_i(ij,ikx,iky,iz)*qi_taui*phi(ikx,iky,iz)*delta_p0) + Tnipj = xnipj(ip,ij) * nadiab_moments_i(ip,ij,ikx,iky,iz) ! term propto n_i^{p+2,j} - Tnipp2j = xnipp2j(ip) * moments_i(ip+(2/deltapi),ij,ikx,iky,iz,updatetlevel) + Tnipp2j = xnipp2j(ip) * nadiab_moments_i(ip+pp2,ij,ikx,iky,iz) ! term propto n_i^{p-2,j} - Tnipm2j = xnipm2j(ip) * (moments_i(ip-(2/deltapi),ij,ikx,iky,iz,updatetlevel) & - +kernel_i(ij,ikx,iky,iz)*qi_taui*phi(ikx,iky,iz)*delta_p2) + Tnipm2j = xnipm2j(ip) * nadiab_moments_i(ip-pp2,ij,ikx,iky,iz) ! term propto n_e^{p,j+1} - Tnipjp1 = xnipjp1(ij) * (moments_i(ip,ij+1,ikx,iky,iz,updatetlevel) & - +kernel_i(ij+1,ikx,iky,iz)*qi_taui*phi(ikx,iky,iz)*delta_p0) + Tnipjp1 = xnipjp1(ij) * nadiab_moments_i(ip,ij+1,ikx,iky,iz) ! term propto n_e^{p,j-1} - Tnipjm1 = xnipjm1(ij) * (moments_i(ip,ij-1,ikx,iky,iz,updatetlevel) & - +kernel_i(ij-1,ikx,iky,iz)*qi_taui*phi(ikx,iky,iz)*delta_p0) + Tnipjm1 = xnipjm1(ij) * nadiab_moments_i(ip,ij-1,ikx,iky,iz) ! Parallel dynamic ! term propto N_i^{p,j+1}, centered FDF Tpari = xnipp1j(ip) * & - (moments_i(ip+1,ij,ikx,iky,iznext,updatetlevel)& - -moments_i(ip+1,ij,ikx,iky,izprev,updatetlevel)) & - +xnipm1j(ip) * & - (moments_i(ip-1,ij,ikx,iky,iznext,updatetlevel)+qi_taui*kernel_i(ij,ikx,iky,iz)*phi(ikx,iky,iznext)*delta_p1& - -moments_i(ip-1,ij,ikx,iky,izprev,updatetlevel)-qi_taui*kernel_i(ij,ikx,iky,iz)*phi(ikx,iky,izprev)*delta_p1) - + ( onetwelfth*nadiab_moments_i(ip+1,ij,ikx,iky,izm2)& + - twothird*nadiab_moments_i(ip+1,ij,ikx,iky,izm1)& + + twothird*nadiab_moments_i(ip+1,ij,ikx,iky,izp1)& + -onetwelfth*nadiab_moments_i(ip+1,ij,ikx,iky,izp2))& + +xnipm1j(ip) * & + ( onetwelfth*nadiab_moments_i(ip-1,ij,ikx,iky,izm2)& + - twothird*nadiab_moments_i(ip-1,ij,ikx,iky,izm1)& + + twothird*nadiab_moments_i(ip-1,ij,ikx,iky,izp1)& + -onetwelfth*nadiab_moments_i(ip-1,ij,ikx,iky,izp2)) ! Mirror terms - Tnipp1j = ynipp1j(ip,ij) * moments_i(ip+1, ij,ikx,iky,iz,updatetlevel) - Tnipp1jm1 = ynipp1jm1(ip,ij) * moments_i(ip+1,ij-1,ikx,iky,iz,updatetlevel) - Tnipm1j = ynipm1j(ip,ij) * (moments_i(ip-1, ij,ikx,iky,iz,updatetlevel) & - +kernel_i(ij,ikx,iky,iz)*qi_taui*phi(ikx,iky,iz)*delta_p1) - Tnipm1jm1 = ynipm1jm1(ip,ij) * (moments_i(ip-1,ij-1,ikx,iky,iz,updatetlevel) & - +kernel_i(ij-1,ikx,iky,iz)*qi_taui*phi(ikx,iky,iz)*delta_p1) - - Unipm1j = znipm1j(ip,ij) * moments_i(ip+1,ij,ikx,iky,iz,updatetlevel) - Unipm1jp1 = znipm1jp1(ip,ij) * moments_i(ip-1,ij+1,ikx,iky,iz,updatetlevel) - Unipm1jm1 = znipm1jm1(ip,ij) * moments_i(ip-1,ij-1,ikx,iky,iz,updatetlevel) + Tnipp1j = ynipp1j(ip,ij) * nadiab_moments_i(ip+1,ij ,ikx,iky,iz) + Tnipp1jm1 = ynipp1jm1(ip,ij) * nadiab_moments_i(ip+1,ij-1,ikx,iky,iz) + Tnipm1j = ynipm1j(ip,ij) * nadiab_moments_i(ip-1,ij ,ikx,iky,iz) + Tnipm1jm1 = ynipm1jm1(ip,ij) * nadiab_moments_i(ip-1,ij-1,ikx,iky,iz) + ! Trapping terms + Unipm1j = znipm1j(ip,ij) * nadiab_moments_i(ip-1,ij ,ikx,iky,iz) + Unipm1jp1 = znipm1jp1(ip,ij) * nadiab_moments_i(ip-1,ij+1,ikx,iky,iz) + Unipm1jm1 = znipm1jm1(ip,ij) * nadiab_moments_i(ip-1,ij-1,ikx,iky,iz) Tmir = Tnipp1j + Tnipp1jm1 + Tnipm1j + Tnipm1jm1 + UNipm1j + UNipm1jp1 + UNipm1jm1 @@ -267,13 +255,13 @@ SUBROUTINE moments_eq_rhs_i ENDIF !! Sum of all linear terms (the sign is inverted to match RHS) - moments_rhs_e(ip,ij,ikx,iky,iz,updatetlevel) = & + moments_rhs_i(ip,ij,ikx,iky,iz,updatetlevel) = & ! Perpendicular magnetic gradient/curvature effects - - imagu*Ckxky(ikx,iky,iz) * (Tnipj + Tnipp2j + Tnipm2j + Tnipjp1 + Tnipjm1)& + - imagu*Ckxky(ikx,iky,iz)*hatR(iz)*(Tnipj + Tnipp2j + Tnipm2j + Tnipjp1 + Tnipjm1)& ! Parallel coupling (Landau Damping) - - Tpari/2._dp/deltaz*gradz_coeff(iz) & + - Tpari*inv_deltaz*gradz_coeff(iz) & ! Mirror term (parallel magnetic gradient) - - gradzB(iz)* Tmir *gradz_coeff(iz) & + - gradzB(iz)*Tmir*gradz_coeff(iz) & ! Drives (density + temperature gradients) - i_ky * Tphi & ! Electrostatic background gradients @@ -284,7 +272,7 @@ SUBROUTINE moments_eq_rhs_i + TColl !! Adding non linearity - IF ( NON_LIN .AND. (NL_CLOS .GT. -3)) THEN + IF ( NON_LIN ) THEN moments_rhs_i(ip,ij,ikx,iky,iz,updatetlevel) = & moments_rhs_i(ip,ij,ikx,iky,iz,updatetlevel) - Sipj(ip,ij,ikx,iky,iz) ENDIF @@ -292,8 +280,6 @@ SUBROUTINE moments_eq_rhs_i END DO kyloopi END DO kxloopi END DO zloopi - - ENDIF GF_CLOSURE_i END DO jloopi END DO ploopi diff --git a/src/processing_mod.F90 b/src/processing_mod.F90 index 73583aa4..768cc943 100644 --- a/src/processing_mod.F90 +++ b/src/processing_mod.F90 @@ -143,7 +143,7 @@ SUBROUTINE compute_nadiab_moments DO ij=ijsg_e,ijeg_e nadiab_moments_e(ip,ij,ikxs:ikxe,ikys:ikye,izs:ize)& = moments_e(ip,ij,ikxs:ikxe,ikys:ikye,izs:ize,updatetlevel) & - + qe_taue*kernel_e(ij,ikxs:ikxe,ikys:ikye,izs:ize)*phi(ikx,iky,iz) + + qe_taue*kernel_e(ij,ikxs:ikxe,ikys:ikye,izs:ize)*phi(ikxs:ikxe,ikys:ikye,izs:ize) ENDDO ELSE nadiab_moments_e(ip,ijsg_e:ijeg_e,ikxs:ikxe,ikys:ikye,izs:ize) & @@ -156,7 +156,7 @@ SUBROUTINE compute_nadiab_moments DO ij=ijsg_i,ijeg_i nadiab_moments_i(ip,ij,ikxs:ikxe,ikys:ikye,izs:ize)& = moments_i(ip,ij,ikxs:ikxe,ikys:ikye,izs:ize,updatetlevel) & - + qi_taui*kernel_i(ij,ikxs:ikxe,ikys:ikye,izs:ize)*phi(ikx,iky,iz) + + qi_taui*kernel_i(ij,ikxs:ikxe,ikys:ikye,izs:ize)*phi(ikxs:ikxe,ikys:ikye,izs:ize) ENDDO ELSE nadiab_moments_i(ip,ijsg_i:ijeg_i,ikxs:ikxe,ikys:ikye,izs:ize) & -- GitLab