From 757a1a4ae5b671e4f117a212221061c4676a95ef Mon Sep 17 00:00:00 2001 From: Antoine Hoffmann <antoine-hoffmann@hotmail.com> Date: Tue, 19 Oct 2021 14:01:21 +0200 Subject: [PATCH] Correction of 3D geometry --- src/geometry_mod.F90 | 74 +++++++++++++++++++++++++++++++++++++++--- src/moments_eq_rhs.F90 | 4 +-- src/numerics_mod.F90 | 8 ++--- 3 files changed, 76 insertions(+), 10 deletions(-) diff --git a/src/geometry_mod.F90 b/src/geometry_mod.F90 index 4703bf1c..58b4e53c 100644 --- a/src/geometry_mod.F90 +++ b/src/geometry_mod.F90 @@ -18,15 +18,15 @@ contains ! evalute metrix, elements, jacobian and gradient implicit none ! - IF( my_id .eq. 0 ) WRITE(*,*) 's-alpha geometry' + IF( my_id .eq. 0 ) WRITE(*,*) 'circular geometry' ! circular model - call eval_s_alpha_geometry + call eval_circular_geometry ! END SUBROUTINE eval_magnetic_geometry ! !-------------------------------------------------------------------------------- ! - subroutine eval_s_alpha_geometry + subroutine eval_circular_geometry ! evaluate circular geometry model ! Ref: Lapilonne et al., PoP, 2009 @@ -73,6 +73,72 @@ contains ENDDO ENDIF ENDDO zloop - END SUBROUTINE eval_s_alpha_geometry + END SUBROUTINE eval_circular_geometry + ! + !-------------------------------------------------------------------------------- + ! UNUSED + subroutine eval_salpha_geometry + ! evaluate s-alpha geometry model + implicit none + REAL(dp) :: z, kx, ky + + zloop: DO iz = izs,ize + z = zarray(iz) + gxx(iz) = 1._dp + gxy(iz) = shear*z + gyy(iz) = 1._dp + (shear*z)**2 + gyz(iz) = 1._dp/eps + gxz(iz) = 0._dp + + ! Relative strengh of radius + hatR(iz) = 1._dp + eps*cos(z) + + ! Jacobian + Jacobian(iz) = q0*hatR(iz) + + ! Relative strengh of modulus of B + hatB(iz) = 1._dp / hatR( iz) + + ! Derivative of the magnetic field strenght + gradxB(iz) = - cos( z) / hatR(iz) + gradzB(iz) = eps * sin(z) + + ! Gemoetrical coefficients for the curvature operator + ! Note: Gamma2 and Gamma3 are obtained directly form Gamma1 in the expression of the curvature operator implemented here + ! + Gamma1(iz) = gxy(iz) * gxy(iz) - gxx(iz) * gyy(iz) + Gamma2(iz) = gxz(iz) * gxy(iz) - gxx(iz) * gyz(iz) + Gamma3(iz) = gxz(iz) * gyy(iz) - gxy(iz) * gyz(iz) + + ! Curvature operator + DO iky = ikys, ikye + ky = kyarray(iky) + DO ikx= ikxl, ikxr + kx = kxarray(ikx,iky) + Cxy(ikx, iky, iz) = (-sin(z)*kx - (cos(z) + shear* z* sin(z))*ky) * hatB(iz) ! .. multiply by hatB to cancel the 1/ hatB factor in moments_eqs_rhs.f90 routine + ENDDO + ENDDO + + ! coefficient in the front of parallel derivative + gradz_coeff(iz) = 1._dp / Jacobian(iz) / hatB(iz) + ENDDO + ! Evaluate perpendicular wavenumber + ! k_\perp^2 = g^{xx} k_x^2 + 2 g^{xy}k_x k_y + k_y^2 g^{yy} + ! normalized to rhos_ + DO iky = ikys, ikye + ky = kyarray(iky) + DO ikx = ikxl, ikxr + kx = kxarray(ikx,iky) + kperp_array(ikx, iky, iz) = sqrt( gxx(iz)*kx**2 + 2._dp* gxy(iz) * kx*ky + gyy(iz)* ky**2) !! / hatB( iz) ! there is a factor 1/B from the normalization; important to match GENE + ENDDO + ENDDO + ENDDO zloop + ! + IF( me .eq. 0 ) PRINT*, 'max kperp = ', maxval( kperp_array) + + END SUBROUTINE eval_salpha_geometry + ! + !-------------------------------------------------------------------------------- + ! end module geometry diff --git a/src/moments_eq_rhs.F90 b/src/moments_eq_rhs.F90 index ce74ae12..60699448 100644 --- a/src/moments_eq_rhs.F90 +++ b/src/moments_eq_rhs.F90 @@ -55,7 +55,7 @@ SUBROUTINE moments_eq_rhs_e 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= 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 !! Compute moments mixing terms ! Perpendicular dynamic @@ -199,7 +199,7 @@ SUBROUTINE moments_eq_rhs_i 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= 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 !! Compute moments mixing terms ! Perpendicular dynamic diff --git a/src/numerics_mod.F90 b/src/numerics_mod.F90 index e8f1b486..fbbaf93a 100644 --- a/src/numerics_mod.F90 +++ b/src/numerics_mod.F90 @@ -82,7 +82,7 @@ SUBROUTINE evaluate_kernels DO iky = ikys,ikye ky = kyarray(iky) DO iz = izs,ize - kperp2= 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 be_2 = kperp2 * sigmae2_taue_o2 kernel_e(ij, ikx, iky,iz) = be_2**j_int * exp(-be_2)/factj ENDDO @@ -95,7 +95,7 @@ SUBROUTINE evaluate_kernels DO iky = ikys,ikye ky = kyarray(iky) DO iz = izs,ize - kperp2= 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 be_2 = kperp2 * sigmae2_taue_o2 ! Kernel ghost + 1 with Kj+1 = y/(j+1) Kj (/!\ ij = j+1) kernel_e(ijeg_e,ikx,iky,iz) = be_2/(real(ijeg_e-1,dp))*kernel_e(ije_e,ikx,iky,iz) @@ -127,7 +127,7 @@ SUBROUTINE evaluate_kernels DO iky = ikys,ikye ky = kyarray(iky) DO iz = izs,ize - kperp2= 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 bi_2 = kperp2 * sigmai2_taui_o2 kernel_i(ij, ikx, iky,iz) = bi_2**j_int * exp(-bi_2)/factj ENDDO @@ -140,7 +140,7 @@ SUBROUTINE evaluate_kernels DO iky = ikys,ikye ky = kyarray(iky) DO iz = izs,ize - kperp2= 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 bi_2 = kperp2 * sigmai2_taui_o2 ! Kernel ghost + 1 with Kj+1 = y/(j+1) Kj kernel_i(ijeg_i,ikx,iky,iz) = bi_2/(real(ijeg_i-1,dp))*kernel_i(ije_i,ikx,iky,iz) -- GitLab