module geometry ! computes geometrical quantities ! Adapted from B.J.Frei MOLIX code (2021) use prec_const use model use grid use array use fields use basic implicit none public contains subroutine eval_magnetic_geometry ! evalute metrix, elements, jacobian and gradient implicit none ! IF( my_id .eq. 0 ) WRITE(*,*) 'circular geometry' ! circular model call eval_circular_geometry ! END SUBROUTINE eval_magnetic_geometry ! !-------------------------------------------------------------------------------- ! subroutine eval_circular_geometry ! evaluate circular geometry model ! Ref: Lapilonne et al., PoP, 2009 implicit none REAL(dp) :: z, kx, ky zloop: DO iz = izs,ize z = zarray(iz) ! Metric elements gxx(iz) = 1._dp gxy(iz) = shear*z -eps*SIN(z) gyy(iz) = 1._dp +(shear*z)**2 -2._dp*eps*COS(z) -2._dp*shear*eps*z*SIN(z) ! Relative strengh of radius hatR(iz) = 1._dp + eps*cos(z) hatB(iz) = SQRT(gxx(iz)*gyy(iz) - gxy(iz)**2) ! Jacobian Jacobian(iz) = q0*hatR(iz)**2 ! Derivative of the magnetic field strenght gradxB(iz) = -(COS(z) + eps*SIN(z)**2)/hatB(iz)/hatB(iz) gradzB(iz) = eps*SIN(z) ! coefficient in the front of parallel derivative gradz_coeff(iz) = 1._dp / Jacobian(iz) / hatB(iz) ! Curvature operator DO iky = ikys, ikye ky = kyarray(iky) DO ikx= ikxs, ikxe kx = kxarray(ikx) Ckxky(ikx,iky,iz) = -SIN(z)*kx -(COS(z)+shear*z*SIN(z))*ky ENDDO ENDDO IF (Nky .EQ. 1) THEN ! linear 1D run we switch kx and ky for parallel opt DO iky = ikys, ikye ky = kyarray(iky) DO ikx= ikxs, ikxe kx = kxarray(ikx) Ckxky(ikx,iky,iz) = -SIN(z)*ky -(COS(z)+shear*z*SIN(z))*kx ENDDO ENDDO ENDIF ENDDO zloop 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