Newer
Older
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
!
END SUBROUTINE eval_magnetic_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)
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
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
END SUBROUTINE eval_circular_geometry
!
!--------------------------------------------------------------------------------
! UNUSED
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
! 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