From 6bcce5b8c289bbdd39278e9612788be86185f4b3 Mon Sep 17 00:00:00 2001 From: Antoine Cyril David Hoffmann <ahoffman@spcpc606.epfl.ch> Date: Wed, 27 Oct 2021 15:33:16 +0200 Subject: [PATCH] simplification and verification --- src/collision_mod.F90 | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/src/collision_mod.F90 b/src/collision_mod.F90 index eaa0b706..4a0a2911 100644 --- a/src/collision_mod.F90 +++ b/src/collision_mod.F90 @@ -68,9 +68,9 @@ CONTAINS SUBROUTINE DoughertyGK_e(ip_,ij_,ikx_,iky_,iz_,TColl_) USE fields, ONLY: moments_e, phi USE grid, ONLY: parray_e, jarray_e, kxarray, kyarray, Jmaxe, ip0_e, ip1_e, ip2_e - USE array, ONLY: kernel_e + USE array, ONLY: kernel_e, kparray USE basic - USE model, ONLY: sigmae2_taue_o2, qe_taue, nu_ee + USE model, ONLY: sigmae2_taue_o2, qe_taue, nu_ee, sqrt_sigmae2_taue_o2 USE time_integration, ONLY : updatetlevel IMPLICIT NONE INTEGER, INTENT(IN) :: ip_,ij_,ikx_,iky_,iz_ @@ -78,15 +78,16 @@ CONTAINS COMPLEX(dp) :: n_,upar_,uperp_,Tpar_, Tperp_, T_ COMPLEX(dp) :: nadiab_moment_0j - REAL(dp) :: Knp0, Knp1, Knm1 + REAL(dp) :: Knp0, Knp1, Knm1, kp INTEGER :: in_ REAL(dp) :: n_dp, j_dp, p_dp, be_, be_2 !** Auxiliary variables ** p_dp = REAL(parray_e(ip_),dp) j_dp = REAL(jarray_e(ij_),dp) - be_2 = (kxarray(ikx_)**2 + kyarray(iky_)**2) * sigmae2_taue_o2 ! this is (be/2)^2 - be_ = 2_dp*SQRT(be_2) ! this is be + kp = kparray(ikx_,iky_,iz_) + be_2 = kp**2 * sigmae2_taue_o2 ! this is (be/2)^2 + be_ = 2_dp*kp * sqrt_sigmae2_taue_o2 ! this is be !** Assembling collison operator ** ! Velocity-space diffusion (similar to Lenard Bernstein) @@ -173,9 +174,9 @@ CONTAINS SUBROUTINE DoughertyGK_i(ip_,ij_,ikx_,iky_,iz_,TColl_) USE fields, ONLY: moments_i, phi USE grid, ONLY: parray_i, jarray_i, kxarray, kyarray, Jmaxi, ip0_i, ip1_i, ip2_i - USE array, ONLY: kernel_i + USE array, ONLY: kernel_i, kparray USE basic - USE model, ONLY: sigmai2_taui_o2, qi_taui, nu_i + USE model, ONLY: sigmai2_taui_o2, qi_taui, nu_i, sqrt_sigmai2_taui_o2 USE time_integration, ONLY : updatetlevel IMPLICIT NONE INTEGER, INTENT(IN) :: ip_,ij_,ikx_,iky_,iz_ @@ -184,15 +185,16 @@ CONTAINS COMPLEX(dp) :: n_,upar_,uperp_,Tpar_, Tperp_, T_ COMPLEX(dp) :: bi_, bi_2 COMPLEX(dp) :: nadiab_moment_0j - REAL(dp) :: Knp0, Knp1, Knm1 + REAL(dp) :: Knp0, Knp1, Knm1, kp INTEGER :: in_ REAL(dp) :: n_dp, j_dp, p_dp !** Auxiliary variables ** p_dp = REAL(parray_i(ip_),dp) j_dp = REAL(jarray_i(ij_),dp) - bi_2 = (kxarray(ikx_)**2 + kyarray(iky_)**2) * sigmai2_taui_o2 ! this is (bi/2)^2 - bi_ = 2_dp*SQRT(bi_2) ! this is be + kp = kparray(ikx_,iky_,iz_) + bi_2 = kp**2 *sigmai2_taui_o2 ! this is (bi/2)^2 + bi_ = 2_dp*kp*sqrt_sigmai2_taui_o2 ! this is bi !** Assembling collison operator ** ! Velocity-space diffusion (similar to Lenard Bernstein) @@ -310,11 +312,11 @@ CONTAINS ENDDO IF (num_procs_p .GT. 1) THEN ! Sum up all the sub collision terms on root 0 - CALL MPI_REDUCE(local_sum_e, buffer_e, total_np_e, MPI_DOUBLE_COMPLEX, MPI_SUM, 0, comm_p, ierr) + CALL MPI_REDUCE(local_sum_e, buffer_e, total_np_e, MPI_DOUBLE_COMPLEX, MPI_SUM, 1003, comm_p, ierr) ! distribute the sum over the process among p CALL MPI_SCATTERV(buffer_e, counts_np_e, displs_np_e, MPI_DOUBLE_COMPLEX,& TColl_distr_e, local_np_e, MPI_DOUBLE_COMPLEX,& - 0, comm_p, ierr) + 1003, comm_p, ierr) ELSE TColl_distr_e = local_sum_e ENDIF @@ -331,12 +333,12 @@ CONTAINS ENDDO IF (num_procs_p .GT. 1) THEN ! Reduce the local_sums to root = 0 - CALL MPI_REDUCE(local_sum_i, buffer_i, total_np_i, MPI_DOUBLE_COMPLEX, MPI_SUM, 0, comm_p, ierr) + CALL MPI_REDUCE(local_sum_i, buffer_i, total_np_i, MPI_DOUBLE_COMPLEX, MPI_SUM, 1004, comm_p, ierr) ! buffer contains the entire collision term along p, we scatter it between ! the other processes (use of scatterv since Pmax/Np is not an integer) CALL MPI_SCATTERV(buffer_i, counts_np_i, displs_np_i, MPI_DOUBLE_COMPLEX,& TColl_distr_i, local_np_i, MPI_DOUBLE_COMPLEX, & - 0, comm_p, ierr) + 1004, comm_p, ierr) ELSE TColl_distr_i = local_sum_i ENDIF @@ -491,7 +493,8 @@ CONTAINS REAL(dp), DIMENSION(:), ALLOCATABLE :: kp_grid_mat ! kperp grid of the matrices INTEGER :: ikp_next, ikp_prev, nkp_mat, ikp_mat - REAL(dp) :: kp_next, kp_prev, kperp_sim, kperp_mat, zerotoone, be_2, bi_2 + REAL(dp) :: kp_max + REAL(dp) :: kp_next, kp_prev, kperp_sim, kperp_mat, zerotoone, be_2, bi_2 CHARACTER(len=128) :: var_name, kperp_string, ikp_string @@ -527,8 +530,11 @@ CONTAINS CALL getsize(fid, '/coordkperp', nkp_mat) ! Get the dimension kperp grid of the matrices CALL allocate_array(kp_grid_mat, 1,nkp_mat) CALL getarr(fid, '/coordkperp', kp_grid_mat) - IF (NON_LIN) THEN ! check that we have enough kperps mat - IF ( (kp_grid_mat(nkp_mat) .LT. two_third_kpmax) .AND. (my_id .EQ. 0)) WRITE(*,*) '!! Matrix kperp grid too small !!' + + ! check that we have enough kperps mat + kp_max = SQRT(MAXVAL(kxarray)**2+MAXVAL(kyarray)**2) + IF (NON_LIN) THEN + IF ( (kp_grid_mat(nkp_mat) .LT. 2./3.*kp_max) .AND. (my_id .EQ. 0)) WRITE(*,*) '!! Matrix kperp grid too small !!' ELSE IF ( (kp_grid_mat(nkp_mat) .LT. kp_max) .AND. (my_id .EQ. 0)) WRITE(*,*) '!! Matrix kperp grid too small !!' ENDIF -- GitLab