diff --git a/src/collision_mod.F90 b/src/collision_mod.F90 index c82024512f1ef1a9e5741e006f6a3725870b8b60..2d2c5186e0422856c90814b2cdd076979439a40a 100644 --- a/src/collision_mod.F90 +++ b/src/collision_mod.F90 @@ -1,24 +1,121 @@ module collision ! contains the Hermite-Laguerre collision operators. Solved using COSOlver. +USE array +USE basic +USE fields +USE futils +USE grid +USE model +USE prec_const +USE time_integration +USE utility IMPLICIT NONE +PRIVATE +! Set the collision model to use +! (Lenard-Bernstein: 'LB', Dougherty: 'DG', Sugama: 'SG', Lorentz: 'LR', Landau: 'LD') +CHARACTER(len=2),PUBLIC,PROTECTED :: collision_model +LOGICAL, PUBLIC, PROTECTED :: gyrokin_CO =.true. ! activates GK effects on CO +LOGICAL, PUBLIC, PROTECTED :: interspecies =.true. ! activates interpecies collision +CHARACTER(len=128), PUBLIC :: mat_file ! COSOlver matrix file names +LOGICAL, PUBLIC, PROTECTED :: cosolver_coll ! check if cosolver matrices are used + +PUBLIC :: collision_readinputs, coll_outputinputs PUBLIC :: compute_TColl +PUBLIC :: compute_lenard_bernstein, compute_dougherty PUBLIC :: LenardBernstein_e, LenardBernstein_i!, LenardBernstein GK PUBLIC :: DoughertyGK_e, DoughertyGK_i!, Dougherty GK -PUBLIC :: load_COSOlver_mat +PUBLIC :: load_COSOlver_mat, compute_cosolver_coll PUBLIC :: apply_COSOlver_mat_e, apply_COSOlver_mat_i CONTAINS + SUBROUTINE collision_readinputs + ! Read the input parameters + IMPLICIT NONE + NAMELIST /COLLISION_PAR/ collision_model, gyrokin_CO, interspecies, mat_file + READ(lu_in,collision_par) + SELECT CASE(collision_model) + CASE ('LB') ! Lenhard bernstein + cosolver_coll = .false. + interspecies = .false. + CASE ('DG') ! Dougherty + cosolver_coll = .false. + interspecies = .false. + CASE ('SG') ! Sugama + cosolver_coll = .true. + CASE ('LR') ! Lorentz (Pitch angle) + cosolver_coll = .true. + interspecies = .false. + CASE ('LD') ! Landau + cosolver_coll = .true. + END SELECT + + END SUBROUTINE collision_readinputs + + SUBROUTINE coll_outputinputs(fidres, str) + ! Write the input parameters to the results_xx.h5 file + IMPLICIT NONE + INTEGER, INTENT(in) :: fidres + CHARACTER(len=256), INTENT(in) :: str + CHARACTER(len=2) :: gkco = 'dk' + CHARACTER(len=2) :: abco = 'aa' + CHARACTER(len=6) :: coname + + IF (gyrokin_CO) gkco = 'GK' + IF (interspecies) abco = 'ab' + WRITE(coname,'(a2,a2,a2)') collision_model,gkco,abco + + CALL attach(fidres, TRIM(str), "CO", coname) + CALL attach(fidres, TRIM(str), "matfilename", mat_file) + END SUBROUTINE coll_outputinputs + + SUBROUTINE compute_TColl + USE basic + IMPLICIT NONE + ! Execution time start + CALL cpu_time(t0_coll) + + SELECT CASE(collision_model) + CASE ('LB') + CALL compute_lenard_bernstein + CASE ('DG') + CALL compute_dougherty + CASE DEFAULT + CALL compute_cosolver_coll + END SELECT + + ! Execution time end + CALL cpu_time(t1_coll) + tc_coll = tc_coll + (t1_coll - t0_coll) + END SUBROUTINE compute_TColl + + !******************************************************************************! + !! Lenard Bernstein collision operator + !******************************************************************************! + SUBROUTINE compute_lenard_bernstein + IMPLICIT NONE + COMPLEX(dp) :: TColl_ + IF (KIN_E) THEN + DO ip = ips_e,ipe_e;DO ij = ijs_e,ije_e + DO ikx = ikxs, ikxe;DO iky = ikys, ikye; DO iz = izs,ize + CALL LenardBernstein_e(ip,ij,ikx,iky,iz,TColl_) + TColl_e(ip,ij,ikx,iky,iz) = TColl_ + ENDDO;ENDDO;ENDDO + ENDDO;ENDDO + ENDIF + DO ip = ips_i,ipe_i;DO ij = ijs_i,ije_i + DO ikx = ikxs, ikxe;DO iky = ikys, ikye; DO iz = izs,ize + CALL LenardBernstein_i(ip,ij,ikx,iky,iz,TColl_) + TColl_i(ip,ij,ikx,iky,iz) = TColl_ + ENDDO;ENDDO;ENDDO + ENDDO;ENDDO + END SUBROUTINE compute_lenard_bernstein + !******************************************************************************! - !! Lenard Bernstein collision operator for electrons + !! for electrons !******************************************************************************! SUBROUTINE LenardBernstein_e(ip_,ij_,ikx_,iky_,iz_,TColl_) - USE fields, ONLY: moments_e - USE grid, ONLY: parray_e, jarray_e, kxarray, kyarray - USE basic - USE model, ONLY: sigmae2_taue_o2, nu_ee - USE time_integration, ONLY : updatetlevel IMPLICIT NONE INTEGER, INTENT(IN) :: ip_,ij_,ikx_,iky_,iz_ COMPLEX(dp), INTENT(OUT) :: TColl_ @@ -37,7 +134,7 @@ CONTAINS END SUBROUTINE LenardBernstein_e !******************************************************************************! - !! Lenard Bernstein collision operator for electrons + !! for ions !******************************************************************************! SUBROUTINE LenardBernstein_i(ip_,ij_,ikx_,iky_,iz_,TColl_) USE fields, ONLY: moments_i @@ -63,8 +160,27 @@ CONTAINS END SUBROUTINE LenardBernstein_i !******************************************************************************! - !! Doughtery gyrokinetic collision operator for electrons + !! Doughtery collision operator !******************************************************************************! + SUBROUTINE compute_dougherty + IMPLICIT NONE + COMPLEX(dp) :: TColl_ + IF (KIN_E) THEN + DO ip = ips_e,ipe_e;DO ij = ijs_e,ije_e + DO ikx = ikxs, ikxe;DO iky = ikys, ikye; DO iz = izs,ize + CALL DoughertyGK_e(ip,ij,ikx,iky,iz,TColl_) + TColl_e(ip,ij,ikx,iky,iz) = TColl_ + ENDDO;ENDDO;ENDDO + ENDDO;ENDDO + ENDIF + DO ip = ips_i,ipe_i;DO ij = ijs_i,ije_i + DO ikx = ikxs, ikxe;DO iky = ikys, ikye; DO iz = izs,ize + CALL DoughertyGK_i(ip,ij,ikx,iky,iz,TColl_) + TColl_i(ip,ij,ikx,iky,iz) = TColl_ + ENDDO;ENDDO;ENDDO + ENDDO;ENDDO + END SUBROUTINE compute_dougherty + SUBROUTINE DoughertyGK_e(ip_,ij_,ikx_,iky_,iz_,TColl_) USE fields, ONLY: moments_e, phi USE grid, ONLY: parray_e, jarray_e, kxarray, kyarray, kparray, Jmaxe, ip0_e, ip1_e, ip2_e @@ -173,12 +289,6 @@ CONTAINS !! Doughtery gyrokinetic collision operator for ions !******************************************************************************! SUBROUTINE DoughertyGK_i(ip_,ij_,ikx_,iky_,iz_,TColl_) - USE fields, ONLY: moments_i, phi - USE grid, ONLY: parray_i, jarray_i, kxarray, kyarray, kparray, Jmaxi, ip0_i, ip1_i, ip2_i - USE array, ONLY: kernel_i - USE basic - 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_ COMPLEX(dp), INTENT(OUT) :: TColl_ @@ -281,15 +391,7 @@ CONTAINS !******************************************************************************! !! compute the collision terms in a (Np x Nj x Nkx x Nky) matrix all at once !******************************************************************************! - SUBROUTINE compute_TColl - USE fields - USE grid - USE array - USE basic - USE prec_const - USE time_integration - USE model - USE utility + SUBROUTINE compute_cosolver_coll IMPLICIT NONE COMPLEX(dp), DIMENSION(1:total_np_e) :: local_sum_e, buffer_e, total_sum_e COMPLEX(dp), DIMENSION(ips_e:ipe_e) :: TColl_distr_e @@ -297,81 +399,64 @@ CONTAINS COMPLEX(dp), DIMENSION(ips_i:ipe_i) :: TColl_distr_i COMPLEX(dp) :: TColl INTEGER :: ikxs_C, ikxe_C, ikys_C, ikye_C - - ! Execution time start - CALL cpu_time(t0_coll) - - IF (ABS(CO) .GE. 2) THEN !compute only if COSOlver matrices are used - DO ikx = ikxs,ikxe - DO iky = ikys,ikye - DO iz = izs,ize - IF(KIN_E) THEN - ! Electrons - DO ij = 1,Jmaxe+1 - ! Loop over all p to compute sub collision term - DO ip = 1,total_np_e - CALL apply_COSOlver_mat_e(ip,ij,ikx,iky,iz,TColl) - local_sum_e(ip) = TColl - 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) - ! 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) - ELSE - TColl_distr_e = local_sum_e - ENDIF - ! Write in output variable - DO ip = ips_e,ipe_e - TColl_e(ip,ij,ikx,iky,iz) = TColl_distr_e(ip) - ENDDO + DO ikx = ikxs,ikxe + DO iky = ikys,ikye + DO iz = izs,ize + IF(KIN_E) THEN + ! Electrons + DO ij = 1,Jmaxe+1 + ! Loop over all p to compute sub collision term + DO ip = 1,total_np_e + CALL apply_COSOlver_mat_e(ip,ij,ikx,iky,iz,TColl) + local_sum_e(ip) = TColl 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) + ! 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) + ELSE + TColl_distr_e = local_sum_e ENDIF - ! Ions - DO ij = 1,Jmaxi+1 - DO ip = 1,total_np_i - CALL apply_COSOlver_mat_i(ip,ij,ikx,iky,iz,TColl) - local_sum_i(ip) = TColl - 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) - ! 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) - ELSE - TColl_distr_i = local_sum_i - ENDIF - ! Write in output variable - DO ip = ips_i,ipe_i - TColl_i(ip,ij,ikx,iky,iz) = TColl_distr_i(ip) - ENDDO + ! Write in output variable + DO ip = ips_e,ipe_e + TColl_e(ip,ij,ikx,iky,iz) = TColl_distr_e(ip) + ENDDO + ENDDO + ENDIF + ! Ions + DO ij = 1,Jmaxi+1 + DO ip = 1,total_np_i + CALL apply_COSOlver_mat_i(ip,ij,ikx,iky,iz,TColl) + local_sum_i(ip) = TColl + 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) + ! 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) + ELSE + TColl_distr_i = local_sum_i + ENDIF + ! Write in output variable + DO ip = ips_i,ipe_i + TColl_i(ip,ij,ikx,iky,iz) = TColl_distr_i(ip) ENDDO ENDDO ENDDO ENDDO - ENDIF - - ! Execution time end - CALL cpu_time(t1_coll) - tc_coll = tc_coll + (t1_coll - t0_coll) - END SUBROUTINE compute_TColl + ENDDO + END SUBROUTINE compute_cosolver_coll !******************************************************************************! !!!!!!! Compute ion collision term !******************************************************************************! SUBROUTINE apply_COSOlver_mat_e(ip_,ij_,ikx_,iky_,iz_,TColl_) - USE fields, ONLY: moments_e, moments_i - USE grid - USE array - USE basic - USE time_integration, ONLY: updatetlevel - USE utility - USE model, ONLY: CO, nu_e, nu_ee, CLOS IMPLICIT NONE INTEGER, INTENT(IN) :: ip_, ij_ ,ikx_, iky_, iz_ @@ -380,9 +465,9 @@ CONTAINS INTEGER :: ip2,ij2, p_int,j_int, p2_int,j2_int, ikx_C, iky_C p_int = parray_e_full(ip_); j_int = jarray_e_full(ij_); - IF (CO .GT. 0) THEN ! GK operator (k-dependant) + IF (gyrokin_CO) THEN ! GK operator (k-dependant) ikx_C = ikx_; iky_C = iky_ - ELSEIF (CO .LT. 0) THEN ! DK operator (only one mat for every k) + ELSE ! DK operator (only one mat for every k) ikx_C = 1; iky_C = 1 ENDIF @@ -394,7 +479,7 @@ CONTAINS jloopee: DO ij2 = ijs_e,ije_e j2_int = jarray_e(ij2) IF((CLOS .NE. 1) .OR. (p2_int+2*j2_int .LE. dmaxe))& - TColl_ = TColl_ + moments_e(ip2,ij2,ikx_,iky_,iz_,updatetlevel) & + TColl_ = TColl_ + nadiab_moments_e(ip2,ij2,ikx_,iky_,iz_) & *( nu_e * CeipjT(bare(p_int,j_int), bare(p2_int,j2_int),ikx_C, iky_C) & +nu_ee * Ceepj (bare(p_int,j_int), bare(p2_int,j2_int),ikx_C, iky_C)) ENDDO jloopee @@ -406,7 +491,7 @@ CONTAINS jloopei: DO ij2 = ijs_i,ije_i j2_int = jarray_i(ij2) IF((CLOS .NE. 1) .OR. (p2_int+2*j2_int .LE. dmaxi))& - TColl_ = TColl_ + moments_i(ip2,ij2,ikx_,iky_,iz_,updatetlevel) & + TColl_ = TColl_ + nadiab_moments_i(ip2,ij2,ikx_,iky_,iz_) & *(nu_e * CeipjF(bare(p_int,j_int), bari(p2_int,j2_int),ikx_C, iky_C)) END DO jloopei ENDDO ploopei @@ -417,13 +502,6 @@ CONTAINS !!!!!!! Compute ion collision term !******************************************************************************! SUBROUTINE apply_COSOlver_mat_i(ip_,ij_,ikx_,iky_,iz_,TColl_) - USE fields, ONLY : moments_e, moments_i - USE grid - USE array - USE basic - USE time_integration, ONLY : updatetlevel - USE utility - USE model, ONLY: CO, nu_i, nu_ie, CLOS, KIN_E IMPLICIT NONE INTEGER, INTENT(IN) :: ip_, ij_ ,ikx_, iky_, iz_ COMPLEX(dp), INTENT(OUT) :: TColl_ @@ -431,9 +509,9 @@ CONTAINS INTEGER :: ip2,ij2, p_int,j_int, p2_int,j2_int, ikx_C, iky_C p_int = parray_i_full(ip_); j_int = jarray_i_full(ij_); - IF (CO .GT. 0) THEN ! GK operator (k-dependant) + IF (gyrokin_CO) THEN ! GK operator (k-dependant) ikx_C = ikx_; iky_C = iky_ - ELSEIF (CO .LT. 0) THEN ! DK operator (only one mat for every k) + ELSE ! DK operator (only one mat for every k) ikx_C = 1; iky_C = 1 ENDIF @@ -445,10 +523,10 @@ CONTAINS j2_int = jarray_i(ij2) IF((CLOS .NE. 1) .OR. (p2_int+2*j2_int .LE. dmaxi))& ! Ion-ion collision - TColl_ = TColl_ + moments_i(ip2,ij2,ikx_,iky_,iz_,updatetlevel) & + TColl_ = TColl_ + nadiab_moments_i(ip2,ij2,ikx_,iky_,iz_) & * nu_i * Ciipj (bari(p_int,j_int), bari(p2_int,j2_int), ikx_C, iky_C) IF(KIN_E) & ! Ion-electron collision test - TColl_ = TColl_ + moments_i(ip2,ij2,ikx_,iky_,iz_,updatetlevel) & + TColl_ = TColl_ + nadiab_moments_i(ip2,ij2,ikx_,iky_,iz_) & * nu_ie * CiepjT(bari(p_int,j_int), bari(p2_int,j2_int), ikx_C, iky_C) ENDDO jloopii ENDDO ploopii @@ -459,26 +537,17 @@ CONTAINS jloopie: DO ij2 = ijs_e,ije_e j2_int = jarray_e(ij2) IF((CLOS .NE. 1) .OR. (p2_int+2*j2_int .LE. dmaxe))& - TColl_ = TColl_ + moments_e(ip2,ij2,ikx_,iky_,iz_,updatetlevel) & + TColl_ = TColl_ + nadiab_moments_e(ip2,ij2,ikx_,iky_,iz_) & *(nu_ie * CiepjF(bari(p_int,j_int), bare(p2_int,j2_int), ikx_C, iky_C)) ENDDO jloopie ENDDO ploopie ENDIF - END SUBROUTINE apply_COSOlver_mat_i !******************************************************************************! !!!!!!! Load the collision matrix coefficient table from COSOlver results !******************************************************************************! SUBROUTINE load_COSOlver_mat ! Load a sub matrix from iCa files (works for pmaxa,jmaxa<=P_full,J_full) - use futils - use initial_par - USE grid - USE array, ONLY: Ceepj, Ciipj, CeipjF, CeipjT, CiepjF, CiepjT - USE basic - USE time_integration, ONLY : updatetlevel - USE utility - USE model, ONLY: CO, NON_LIN, sigmae2_taue_o2, sigmai2_taui_o2 IMPLICIT NONE ! Indices for row and columns of the COSOlver matrix (4D compressed 2D matrices) INTEGER :: irow_sub, irow_full, icol_sub, icol_full @@ -507,22 +576,21 @@ CONTAINS CHARACTER(len=128) :: var_name, kperp_string, ikp_string - LOGICAL :: CO_AA_ONLY = .false. ! Flag to remove ei ie collision - !! Some terminal info - IF (CO .EQ. 2) THEN - IF (my_id .EQ. 0) WRITE(*,*) '=== Load GK Sugama matrix ===' - ELSEIF(CO .EQ. 3) THEN - IF (my_id .EQ. 0) WRITE(*,*) '=== Load GK pitch angle matrix ===' - ELSEIF(CO .EQ. 4) THEN - IF (my_id .EQ. 0) WRITE(*,*) '=== Load GK Coulomb matrix ===' - ELSEIF(CO .EQ. -2) THEN - IF (my_id .EQ. 0) WRITE(*,*) '=== Load DK Sugama matrix ===' - ELSEIF(CO .EQ. -3) THEN - IF (my_id .EQ. 0) WRITE(*,*) '=== Load DK pitch angle matrix ===' - ELSEIF(CO .EQ. -4) THEN - IF (my_id .EQ. 0) WRITE(*,*) '=== Load DK Coulomb matrix ===' - ENDIF + SELECT CASE (collision_model) + CASE ('SG') + WRITE(*,*) '=== Load Sugama matrix ===' + CASE ('LR') + IF (my_id .EQ. 0) WRITE(*,*) '=== Load Lorentz matrix ===' + CASE ('LD') + IF (my_id .EQ. 0) WRITE(*,*) '=== Load Landau matrix ===' + END SELECT + SELECT CASE (gyrokin_CO) + CASE (.true.) + IF (my_id .EQ. 0) WRITE(*,*) '..gyrokinetic model..' + CASE (.false.) + IF (my_id .EQ. 0) WRITE(*,*) '..driftkinetic model..' + END SELECT ! Opening the compiled cosolver matrices results if(my_id.EQ.0)write(*,*) mat_file @@ -541,16 +609,15 @@ CONTAINS CALL getarr(fid, '/coordkperp', kp_grid_mat) ! check that we have enough kperps mat - WRITE(*,*) kp_max - IF (NON_LIN .GT. 0) THEN + IF (LINEARITY .NE. 'linear') 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 - IF (CO .GT. 0) THEN ! GK operator (k-dependant) + IF (gyrokin_CO) THEN ! GK operator (k-dependant) ikps_C = 1; ikpe_C = nkp_mat - ELSEIF (CO .LT. 0) THEN ! DK operator (only one mat for all k) + ELSE ! DK operator (only one mat for all k) ikps_C = 1; ikpe_C = 1 ENDIF @@ -563,7 +630,7 @@ CONTAINS DO ikp = ikps_C,ikpe_C ! Loop over everz kperp values ! we put zeros if kp>2/3kpmax because thoses frequencies are filtered through AA - IF( (kp_grid_mat(ikp) .GT. two_third_kpmax) .AND. (NON_LIN .GT. 0)) THEN + IF( (kp_grid_mat(ikp) .GT. two_third_kpmax) .AND. (LINEARITY .NE. 'linear')) THEN CiepjT_kp(:,:,ikp) = 0._dp CiepjF_kp(:,:,ikp) = 0._dp CeipjT_kp(:,:,ikp) = 0._dp @@ -572,7 +639,7 @@ CONTAINS Ciipj__kp(:,:,ikp) = 0._dp ELSE ! Kperp value in string format - IF (CO .GT. 0) THEN + IF (gyrokin_CO) THEN write(ikp_string,'(i5.5)') ikp-1 ELSE write(ikp_string,'(i5.5)') 0 @@ -621,7 +688,7 @@ CONTAINS ENDDO DEALLOCATE(Ciipj_full) - IF(abs(CO) .NE. 3) THEN ! Pitch angle is only applied on like-species + IF(interspecies) THEN ! Pitch angle is only applied on like-species !!!!!!!!!!!!!!! E-I matrices !!!!!!!!!!!!!! ! Get test and field e-i collision matrices CALL allocate_array( CeipjT_full, 1,(pdime+1)*(jdime+1), 1,(pdime+1)*(jdime+1)) @@ -692,13 +759,13 @@ CONTAINS ENDDO CALL closef(fid) - IF (CO .GT. 0) THEN ! Interpolation of the kperp matrix values on kx ky grid + IF (gyrokin_CO) THEN ! Interpolation of the kperp matrix values on kx ky grid IF (my_id .EQ. 0 ) WRITE(*,*) '...Interpolation from matrices kperp to simulation kx,ky...' DO ikx = ikxs,ikxe DO iky = ikys,ikye ! Check for nonlinear case if we are in the anti aliased domain or the filtered one kperp_sim = kparray(ikx,iky,1,0) ! current simulation kperp - IF( (NON_LIN .EQ. 0) .OR. (kperp_sim .LT. two_third_kpmax) ) THEN + IF( (LINEARITY .EQ. 'linear') .OR. (kperp_sim .LT. two_third_kpmax) ) THEN ! Find the interval in kp grid mat where kperp_sim is contained ! Loop over the whole kp mat grid to find the smallest kperp that is ! larger than the current kperp_sim (brute force...) @@ -711,20 +778,26 @@ CONTAINS ! interval boundaries ikp_next = ikp_mat !index of k1 (larger than kperp_sim thanks to previous loop) ikp_prev = ikp_mat - 1 !index of k0 (smaller neighbour to interpolate inbetween) - ! write(*,*) kp_grid_mat(ikp_prev), '<', kperp_sim, '<', kp_grid_mat(ikp_next) if ( (kp_grid_mat(ikp_prev) .GT. kperp_sim) .OR. (kp_grid_mat(ikp_next) .LT. kperp_sim) ) THEN - write(*,*) 'Warning, linear interp of collision matrix failed!! ' + ! write(*,*) 'Warning, linear interp of collision matrix failed!! ' + ! write(*,*) kp_grid_mat(ikp_prev), '<', kperp_sim, '<', kp_grid_mat(ikp_next) ENDIF ! 0->1 variable for linear interp, i.e. zero2one = (k-k0)/(k1-k0) zerotoone = (kperp_sim - kp_grid_mat(ikp_prev))/(kp_grid_mat(ikp_next) - kp_grid_mat(ikp_prev)) - ! Linear interpolation between previous and next kperp matrix values Ceepj (:,:,ikx,iky) = (Ceepj__kp(:,:,ikp_next) - Ceepj__kp(:,:,ikp_prev))*zerotoone + Ceepj__kp(:,:,ikp_prev) - CeipjT(:,:,ikx,iky) = (CeipjT_kp(:,:,ikp_next) - CeipjT_kp(:,:,ikp_prev))*zerotoone + CeipjT_kp(:,:,ikp_prev) - CeipjF(:,:,ikx,iky) = (CeipjF_kp(:,:,ikp_next) - CeipjF_kp(:,:,ikp_prev))*zerotoone + CeipjF_kp(:,:,ikp_prev) Ciipj (:,:,ikx,iky) = (Ciipj__kp(:,:,ikp_next) - Ciipj__kp(:,:,ikp_prev))*zerotoone + Ciipj__kp(:,:,ikp_prev) - CiepjT(:,:,ikx,iky) = (CiepjT_kp(:,:,ikp_next) - CiepjT_kp(:,:,ikp_prev))*zerotoone + CiepjT_kp(:,:,ikp_prev) - CiepjF(:,:,ikx,iky) = (CiepjF_kp(:,:,ikp_next) - CiepjF_kp(:,:,ikp_prev))*zerotoone + CiepjF_kp(:,:,ikp_prev) + IF(interspecies) THEN + CeipjT(:,:,ikx,iky) = (CeipjT_kp(:,:,ikp_next) - CeipjT_kp(:,:,ikp_prev))*zerotoone + CeipjT_kp(:,:,ikp_prev) + CeipjF(:,:,ikx,iky) = (CeipjF_kp(:,:,ikp_next) - CeipjF_kp(:,:,ikp_prev))*zerotoone + CeipjF_kp(:,:,ikp_prev) + CiepjT(:,:,ikx,iky) = (CiepjT_kp(:,:,ikp_next) - CiepjT_kp(:,:,ikp_prev))*zerotoone + CiepjT_kp(:,:,ikp_prev) + CiepjF(:,:,ikx,iky) = (CiepjF_kp(:,:,ikp_next) - CiepjF_kp(:,:,ikp_prev))*zerotoone + CiepjF_kp(:,:,ikp_prev) + ELSE + CeipjT(:,:,ikx,iky) = 0._dp + CeipjF(:,:,ikx,iky) = 0._dp + CiepjT(:,:,ikx,iky) = 0._dp + CiepjF(:,:,ikx,iky) = 0._dp + ENDIF ELSE ! Out of anti anti aliased domain Ceepj (:,:,ikx,iky) = 0._dp CeipjT(:,:,ikx,iky) = 0._dp @@ -747,7 +820,7 @@ CONTAINS DEALLOCATE (Ceepj__kp); DEALLOCATE (CeipjT_kp); DEALLOCATE (CeipjF_kp) DEALLOCATE (Ciipj__kp); DEALLOCATE (CiepjT_kp); DEALLOCATE (CiepjF_kp) - IF( CO_AA_ONLY ) THEN + IF( .NOT. interspecies ) THEN CeipjF = 0._dp; CeipjT = 0._dp; CiepjF = 0._dp;