From 6044cc4e1a0c04b186b1513983ed2a2cc2f10fb5 Mon Sep 17 00:00:00 2001 From: Antoine <antoine.hoffmann@epfl.ch> Date: Fri, 15 Sep 2023 11:42:30 +0200 Subject: [PATCH] correction factor of ExB mgrid: - not working yet --- src/ExB_shear_flow_mod.F90 | 67 ++++++++++++++++++++------------------ src/fourier_mod.F90 | 23 +++++++------ src/nonlinear_mod.F90 | 6 ++-- 3 files changed, 52 insertions(+), 44 deletions(-) diff --git a/src/ExB_shear_flow_mod.F90 b/src/ExB_shear_flow_mod.F90 index 5236d28e..31d3051e 100644 --- a/src/ExB_shear_flow_mod.F90 +++ b/src/ExB_shear_flow_mod.F90 @@ -9,6 +9,7 @@ MODULE ExB_shear_flow REAL(xp), PUBLIC, PROTECTED :: gamma_E = 0._xp ! ExB background shearing rate \gamma_E REAL(xp), PUBLIC, PROTECTED :: t0, inv_t0 = 0._xp ! charact. shear time REAL(xp), DIMENSION(:), ALLOCATABLE, PUBLIC, PROTECTED :: sky_ExB ! shift of the kx modes, kx* = kx + s(ky) + REAL(xp), DIMENSION(:), ALLOCATABLE, PUBLIC, PROTECTED :: dkx_ExB ! correction to obtain the exact kx mode INTEGER, DIMENSION(:), ALLOCATABLE, PUBLIC, PROTECTED :: jump_ExB ! jump to do to shift the kx grids LOGICAL, DIMENSION(:), ALLOCATABLE, PUBLIC, PROTECTED :: shiftnow_ExB ! Indicates if there is a line to shift COMPLEX(xp),DIMENSION(:,:), ALLOCATABLE, PUBLIC, PROTECTED :: ExB_NL_factor! factor for nonlinear term @@ -41,6 +42,10 @@ CONTAINS ALLOCATE(sky_ExB(local_nky)) sky_ExB = 0._xp + ! Setup the kx correction array + ALLOCATE(dkx_ExB(local_nky)) + dkx_ExB = 0._xp + ! Setup the jump array ALLOCATE(jump_ExB(local_nky)) jump_ExB = 0 @@ -59,16 +64,16 @@ CONTAINS ! Update according to the current ExB shear value ! -the grids - ! -the spatial operators + ! -the spatial operators ! -the fields by imposing a shift on kx SUBROUTINE Apply_ExB_shear_flow - USE basic, ONLY: chrono_ExBs, start_chrono, stop_chrono + USE basic, ONLY: time USE grid, ONLY: local_nky, kxarray, update_grids, & total_nkx, deltakx, kx_min, kx_max USE prec_const, ONLY: PI + USE fields, ONLY: moments, phi, psi USE geometry, ONLY: gxx,gxy,inv_hatB2, evaluate_magn_curv USE numerics, ONLY: evaluate_EM_op, evaluate_kernels - USE fields, ONLY: moments, phi, psi IMPLICIT NONE ! local var INTEGER :: iky, ikx, ikx_s, i_, loopstart, loopend, increment @@ -93,7 +98,7 @@ CONTAINS ! -3 -2 -1 0 1 2 3 4 (values in dkx) ! so to go along the array in a monotonic way one must travel as ! 67812345 or 54321678 - DO i_ = loopstart, loopend, increment + DO i_ = loopstart, loopend, increment IF (i_ .LT. total_nkx/2) THEN ! go to the negative kx region ikx = i_ + total_nkx/2 + 1 ELSE ! positive @@ -101,10 +106,9 @@ CONTAINS ENDIF ikx_s = ikx + jump_ExB(iky) ! We test if the shifted modes are still in contained in our resolution - ! IF( (kxarray(iky,ikx)-sky_ExB(iky) .GE. kx_min) .AND. (kxarray(iky,ikx)-sky_ExB(iky) .LE. kx_max) ) THEN - IF ( ((ikx_s .GT. 0 ) .AND. (ikx_s .LE. total_nkx )) .AND. & + IF ( ((ikx_s .GT. 0 ) .AND. (ikx_s .LE. total_nkx )) .AND. & (((ikx .LE. (total_nkx/2+1)) .AND. (ikx_s .LE. (total_nkx/2+1))) .OR. & - ((ikx .GT. (total_nkx/2+1)) .AND. (ikx_s .GT. (total_nkx/2+1)))) ) THEN + ((ikx .GT. (total_nkx/2+1)) .AND. (ikx_s .GT. (total_nkx/2+1)))) ) THEN moments(:,:,:,iky,ikx,:,:) = moments(:,:,:,iky,ikx_s,:,:) phi(iky,ikx,:) = phi(iky,ikx_s,:) psi(iky,ikx,:) = psi(iky,ikx_s,:) @@ -114,18 +118,10 @@ CONTAINS psi(iky,ikx,:) = 0._xp ENDIF ENDDO - ! correct the shift value s(ky) for this row + ! correct the shift value s(ky) for this row sky_ExB(iky) = sky_ExB(iky) - jump_ExB(iky)*deltakx ENDIF ENDDO - ! After shifting and correction, we update the operators and grids - ! update the grids - CALL update_grids(sky_ExB,gxx,gxy,inv_hatB2) - - ! update the EM op., the kernels and the curvature op. - CALL evaluate_kernels - CALL evaluate_EM_op - CALL evaluate_magn_curv ENDIF END SUBROUTINE Apply_ExB_shear_flow @@ -133,15 +129,17 @@ CONTAINS SUBROUTINE Update_ExB_shear_flow USE basic, ONLY: dt, time, chrono_ExBs, start_chrono, stop_chrono USE grid, ONLY: local_nky, local_nky_offset, kyarray, kyarray_full, inv_dkx, xarray, Nx, Ny, & - local_nx, local_nx_offset, deltax, & - ikyarray, inv_ikyarray, deltakx, deltaky + local_nx, local_nx_offset, deltax, kxarray, & + ikyarray, inv_ikyarray, deltakx, deltaky, update_grids + USE geometry, ONLY: gxx,gxy,gyy,inv_hatB2, evaluate_magn_curv + USE numerics, ONLY: evaluate_EM_op, evaluate_kernels IMPLICIT NONE ! local var INTEGER :: iky, ix - REAL(xp):: dtExBshear, ky, kx, J_dp, inv_J, x + REAL(xp):: dt_ExB, ky, kx, J_dp, inv_J, x, dtshift ! do nothing if no ExB IF(ExB) THEN - ! update the ExB shift, jumps and flags + ! reset the ExB shift, jumps and flags shiftnow_ExB = .FALSE. DO iky = 1,local_Nky sky_ExB(iky) = sky_ExB(iky) - kyarray(iky)*gamma_E*dt @@ -153,34 +151,41 @@ CONTAINS ENDDO ! Update the ExB nonlinear factor... - DO iky = 1,local_Nky + DO iky = 1,local_Nky ! WARNING: Local indices ky loop ! for readability - ky = kyarray_full(iky+local_nky_offset) - J_dp = ikyarray(iky+local_nky_offset) - inv_J = inv_ikyarray(iky+local_nky_offset) + J_dp = ikyarray(iky+local_nky_offset) + inv_J = inv_ikyarray(iky+local_nky_offset) ! compute dt factor - dtExBshear = time - t0*inv_J*ANINT(J_dp*time*inv_t0,xp) + dt_ExB = (time - t0*inv_J*ANINT(J_dp*time*inv_t0,xp)) + dkx_ExB(iky) = gamma_E*J_dp*deltaky*dt_ExB DO ix = 1,Nx x = xarray(ix) ! assemble the ExB nonlin factor - ExB_NL_factor(ix,iky) = EXP(-imagu*x*gamma_E*ky*dtExBshear) + ExB_NL_factor(ix,iky) = EXP(imagu*x*dkx_ExB(iky)) ENDDO ENDDO ! ... and the inverse - DO iky = 1,Ny/2+1 + DO iky = 1,Ny/2+1 ! WARNING: Global indices ky loop ! for readability - ky = kyarray_full(iky) J_dp = ikyarray(iky) inv_J = inv_ikyarray(iky) ! compute dt factor - dtExBshear = time - t0*inv_J*ANINT(J_dp*time*inv_t0,xp) - ky = REAL(iky-1,xp)*deltaky + dt_ExB = (time - t0*inv_J*ANINT(J_dp*time*inv_t0,xp)) DO ix = 1,local_nx x = xarray(ix+local_nx_offset) ! assemble the inverse ExB nonlin factor - inv_ExB_NL_factor(iky,ix) = EXP(imagu*x*gamma_E*ky*dtExBshear) + inv_ExB_NL_factor(iky,ix) = EXP(-imagu*x*gamma_E*J_dp*deltaky*dt_ExB) ENDDO ENDDO ENDIF + ! We update the operators and grids + ! update the grids + CALL update_grids(dkx_ExB,gxx,gxy,gyy,inv_hatB2) + !write(42,*), kxarray(5,3) + + ! update the EM op., the kernels and the curvature op. + CALL evaluate_kernels + CALL evaluate_EM_op + CALL evaluate_magn_curv END SUBROUTINE Update_ExB_shear_flow END MODULE ExB_shear_flow \ No newline at end of file diff --git a/src/fourier_mod.F90 b/src/fourier_mod.F90 index a10b713c..d6d1af31 100644 --- a/src/fourier_mod.F90 +++ b/src/fourier_mod.F90 @@ -271,16 +271,16 @@ END SUBROUTINE fft1D_plans !******************************************************************************! !!! Compute the poisson bracket to real space and sum it to the bracket_sum_r ! module variable (convolution theorem) - SUBROUTINE poisson_bracket_and_sum( ky_, kx_, inv_Ny, inv_Nx, AA_y, AA_x,& + SUBROUTINE poisson_bracket_and_sum( ky_array, kx_array, inv_Ny, inv_Nx, AA_y, AA_x,& local_nky, total_nkx, F_, G_,& - ExB, ExB_NL_factor, sum_real_) + ExB, ExB_NL_factor, dkx_ExB, sum_real_) USE parallel, ONLY: my_id, num_procs_ky, comm_ky, rank_ky IMPLICIT NONE INTEGER, INTENT(IN) :: local_nky,total_nkx REAL(xp), INTENT(IN) :: inv_Nx, inv_Ny - REAL(xp), DIMENSION(local_nky), INTENT(IN) :: ky_, AA_y + REAL(xp), DIMENSION(local_nky), INTENT(IN) :: ky_array, AA_y, dkx_ExB REAL(xp), DIMENSION(total_nkx), INTENT(IN) :: AA_x - REAL(xp), DIMENSION(local_nky,total_nkx), INTENT(IN) :: kx_ + REAL(xp), DIMENSION(local_nky,total_nkx), INTENT(IN) :: kx_array COMPLEX(c_xp_c), DIMENSION(local_nky,total_nkx), & INTENT(IN) :: F_, G_ COMPLEX(xp), DIMENSION(total_nkx,local_nky), & @@ -290,16 +290,19 @@ END SUBROUTINE fft1D_plans ! local variables INTEGER :: ikx,iky COMPLEX(xp), DIMENSION(total_nkx,local_nky) :: ikxF, ikyG, ikyF, ikxG + REAL(xp):: kxs, ky ! Build the fields to convolve ! Store df/dx, dg/dy and df/dy, dg/dx - DO ikx = 1,total_nkx DO iky = 1,local_nky - ikxF(ikx,iky) = imagu*kx_(iky,ikx)*F_(iky,ikx)*AA_y(iky)*AA_x(ikx) - ikyG(ikx,iky) = imagu*ky_(iky) *G_(iky,ikx)*AA_y(iky)*AA_x(ikx) - ikyF(ikx,iky) = imagu*ky_(iky) *F_(iky,ikx)*AA_y(iky)*AA_x(ikx) - ikxG(ikx,iky) = imagu*kx_(iky,ikx)*G_(iky,ikx)*AA_y(iky)*AA_x(ikx) - ENDDO + DO ikx = 1,total_nkx + ky = ky_array(iky) + kxs = kx_array(iky,ikx) + ikxF(ikx,iky) = imagu*kxs*F_(iky,ikx)*AA_y(iky)*AA_x(ikx) + ikyG(ikx,iky) = imagu*ky *G_(iky,ikx)*AA_y(iky)*AA_x(ikx) + ikyF(ikx,iky) = imagu*ky *F_(iky,ikx)*AA_y(iky)*AA_x(ikx) + ikxG(ikx,iky) = imagu*kxs*G_(iky,ikx)*AA_y(iky)*AA_x(ikx) + ENDDO ENDDO IF(ExB) THEN ! Apply the ExB shear correction factor exp(ixkySJdT) diff --git a/src/nonlinear_mod.F90 b/src/nonlinear_mod.F90 index 050de507..7eea23f6 100644 --- a/src/nonlinear_mod.F90 +++ b/src/nonlinear_mod.F90 @@ -14,7 +14,7 @@ MODULE nonlinear USE prec_const, ONLY : xp USE species, ONLY : sqrt_tau_o_sigma USE time_integration, ONLY : updatetlevel - USE ExB_shear_flow, ONLY : ExB_NL_factor, inv_ExB_NL_factor, ExB + USE ExB_shear_flow, ONLY : ExB_NL_factor, inv_ExB_NL_factor, ExB, dkx_ExB use, intrinsic :: iso_c_binding IMPLICIT NONE @@ -100,7 +100,7 @@ SUBROUTINE compute_nonlinear ! this function adds its result to bracket_sum_r CALL poisson_bracket_and_sum( kyarray,kxarray,inv_Ny,inv_Nx,AA_y,AA_x,& local_nky,total_nkx,F_cmpx,G_cmpx,& - ExB, ExB_NL_factor, bracket_sum_r) + ExB, ExB_NL_factor, dkx_ExB, bracket_sum_r) !-----------!! ELECTROMAGNETIC CONTRIBUTION -sqrt(tau)/sigma*{Sum_s dnjs [sqrt(p+1)Nap+1s + sqrt(p)Nap-1s], Kernel psi} IF(EM) THEN ! First convolution terms @@ -116,7 +116,7 @@ SUBROUTINE compute_nonlinear ! this function adds its result to bracket_sum_r CALL poisson_bracket_and_sum( kyarray,kxarray,inv_Ny,inv_Nx,AA_y,AA_x,& local_nky,total_nkx,F_cmpx,G_cmpx,& - ExB, ExB_NL_factor,bracket_sum_r) + ExB, ExB_NL_factor, dkx_ExB, bracket_sum_r) ENDIF ENDDO n ! Apply the ExB shearing rate factor before going back to k-space -- GitLab