From af01eb6adc9200a0c48c4ea0f1c15dea3780a0b6 Mon Sep 17 00:00:00 2001 From: Antoine Cyril David Hoffmann <ahoffman@spcpc606.epfl.ch> Date: Fri, 29 Apr 2022 15:15:12 +0200 Subject: [PATCH] aux array for grad and interp --- src/inital.F90 | 2 +- src/memory.F90 | 6 ++ src/processing_mod.F90 | 184 ++++++++++++++++++++--------------------- 3 files changed, 97 insertions(+), 95 deletions(-) diff --git a/src/inital.F90 b/src/inital.F90 index ac0222c1..ae42fbfb 100644 --- a/src/inital.F90 +++ b/src/inital.F90 @@ -14,7 +14,7 @@ SUBROUTINE inital USE ghosts USE restarts USE numerics, ONLY: play_with_modes, save_EM_ZF_modes - USE processing, ONLY: compute_nadiab_moments, compute_fluid_moments + USE processing, ONLY: compute_fluid_moments USE model, ONLY: KIN_E, LINEARITY USE nonlinear, ONLY: compute_Sapj, nonlinear_init IMPLICIT NONE diff --git a/src/memory.F90 b/src/memory.F90 index 3f51d7aa..a90fec8c 100644 --- a/src/memory.F90 +++ b/src/memory.F90 @@ -31,6 +31,9 @@ SUBROUTINE memory CALL allocate_array( moments_e, ipgs_e,ipge_e, ijgs_e,ijge_e, ikxs,ikxe, ikys,ikye, izgs,izge, 1,ntimelevel ) CALL allocate_array( moments_rhs_e, ips_e,ipe_e, ijs_e,ije_e, ikxs,ikxe, ikys,ikye, izs,ize, 1,ntimelevel ) CALL allocate_array( nadiab_moments_e, ipgs_e,ipge_e, ijgs_e,ijge_e, ikxs,ikxe, ikys,ikye, izgs,izge) + CALL allocate_array( ddz_nepj, ipgs_e,ipge_e, ijgs_e,ijge_e, ikxs,ikxe, ikys,ikye, izgs,izge) + CALL allocate_array( ddz2_Nepj, ipgs_e,ipge_e, ijgs_e,ijge_e, ikxs,ikxe, ikys,ikye, izgs,izge) + CALL allocate_array( interp_nepj, ipgs_e,ipge_e, ijgs_e,ijge_e, ikxs,ikxe, ikys,ikye, izgs,izge) CALL allocate_array( moments_e_ZF, ipgs_e,ipge_e, ijgs_e,ijge_e, ikxs,ikxe, izs,ize) CALL allocate_array( moments_e_EM, ipgs_e,ipge_e, ijgs_e,ijge_e, ikys,ikye, izs,ize) CALL allocate_array( TColl_e, ips_e,ipe_e, ijs_e,ije_e , ikxs,ikxe, ikys,ikye, izs,ize) @@ -63,6 +66,9 @@ SUBROUTINE memory CALL allocate_array( moments_i, ipgs_i,ipge_i, ijgs_i,ijge_i, ikxs,ikxe, ikys,ikye, izgs,izge, 1,ntimelevel ) CALL allocate_array( moments_rhs_i, ips_i,ipe_i, ijs_i,ije_i, ikxs,ikxe, ikys,ikye, izs,ize, 1,ntimelevel ) CALL allocate_array( nadiab_moments_i, ipgs_i,ipge_i, ijgs_i,ijge_i, ikxs,ikxe, ikys,ikye, izgs,izge) + CALL allocate_array( ddz_nipj, ipgs_i,ipge_i, ijgs_i,ijge_i, ikxs,ikxe, ikys,ikye, izgs,izge) + CALL allocate_array( ddz2_Nipj, ipgs_i,ipge_i, ijgs_i,ijge_i, ikxs,ikxe, ikys,ikye, izgs,izge) + CALL allocate_array( interp_nipj, ipgs_i,ipge_i, ijgs_i,ijge_i, ikxs,ikxe, ikys,ikye, izgs,izge) CALL allocate_array( moments_i_ZF, ipgs_i,ipge_i, ijgs_i,ijge_i, ikxs,ikxe, izs,ize) CALL allocate_array( moments_i_EM, ipgs_i,ipge_i, ijgs_i,ijge_i, ikys,ikye, izs,ize) CALL allocate_array( TColl_i, ips_i,ipe_i, ijs_i,ije_i, ikxs,ikxe, ikys,ikye, izs,ize) diff --git a/src/processing_mod.F90 b/src/processing_mod.F90 index 7139fe5c..abcd31db 100644 --- a/src/processing_mod.F90 +++ b/src/processing_mod.F90 @@ -11,7 +11,7 @@ MODULE processing REAL(dp), PUBLIC, PROTECTED :: pflux_ri, gflux_ri REAL(dp), PUBLIC, PROTECTED :: hflux_x - PUBLIC :: compute_nadiab_moments + PUBLIC :: compute_nadiab_moments_z_gradients_and_interp PUBLIC :: compute_density, compute_upar, compute_uperp PUBLIC :: compute_Tpar, compute_Tperp, compute_fluid_moments PUBLIC :: compute_radial_ion_transport, compute_radial_heatflux @@ -160,31 +160,34 @@ SUBROUTINE compute_radial_heatflux ENDIF END SUBROUTINE compute_radial_heatflux -SUBROUTINE compute_nadiab_moments +SUBROUTINE compute_nadiab_moments_z_gradients_and_interp ! evaluate the non-adiabatique ion moments ! ! n_{pi} = N^{pj} + kernel(j) /tau_i phi delta_p0 ! USE fields, ONLY : moments_i, moments_e, phi - USE array, ONLY : kernel_e, kernel_i, nadiab_moments_e, nadiab_moments_i + USE array, ONLY : kernel_e, kernel_i, nadiab_moments_e, nadiab_moments_i, & + ddz_nepj, ddz2_Nepj, interp_nepj,& + ddz_nipj, ddz2_Nipj, interp_nipj USE time_integration, ONLY : updatetlevel USE model, ONLY : qe_taue, qi_taui, KIN_E - implicit none + USE calculus, ONLY : grad_z, grad_z2, interp_z + IMPLICIT NONE + INTEGER :: eo, p_int + CALL cpu_time(t0_process) ! Electron non adiab moments - xloop: DO ikx = ikxs,ikxe - yloop: DO iky = ikys,ikye - zloop: DO iz = izgs,izge + IF(KIN_E) THEN DO ip=ipgs_e,ipge_e IF(parray_e(ip) .EQ. 0) THEN DO ij=ijgs_e,ijge_e - nadiab_moments_e(ip,ij,ikx,iky,iz) = moments_e(ip,ij,ikx,iky,iz,updatetlevel) & - + qe_taue*kernel_e(ij,ikx,iky,iz,0)*phi(ikx,iky,iz) + nadiab_moments_e(ip,ij,:,:,:) = moments_e(ip,ij,:,:,:,updatetlevel) & + + qe_taue*kernel_e(ij,:,:,:,0)*phi(:,:,:) ENDDO ELSE DO ij=ijgs_e,ijge_e - nadiab_moments_e(ip,ij,ikx,iky,iz) = moments_e(ip,ij,ikx,iky,iz,updatetlevel) + nadiab_moments_e(ip,ij,:,:,:) = moments_e(ip,ij,:,:,:,updatetlevel) ENDDO ENDIF ENDDO @@ -193,21 +196,61 @@ SUBROUTINE compute_nadiab_moments DO ip=ipgs_i,ipge_i IF(parray_i(ip) .EQ. 0) THEN DO ij=ijgs_i,ijge_i - nadiab_moments_i(ip,ij,ikx,iky,iz) = moments_i(ip,ij,ikx,iky,iz,updatetlevel) & - + qi_taui*kernel_i(ij,ikx,iky,iz,0)*phi(ikx,iky,iz) + nadiab_moments_i(ip,ij,:,:,:) = moments_i(ip,ij,:,:,:,updatetlevel) & + + qi_taui*kernel_i(ij,:,:,:,0)*phi(:,:,:) ENDDO ELSE DO ij=ijgs_i,ijge_i - nadiab_moments_i(ip,ij,ikx,iky,iz) = moments_i(ip,ij,ikx,iky,iz,updatetlevel) + nadiab_moments_i(ip,ij,:,:,:) = moments_i(ip,ij,:,:,:,updatetlevel) ENDDO ENDIF ENDDO - ENDDO zloop - ENDDO yloop - ENDDO xloop - ! -END SUBROUTINE compute_nadiab_moments +!------------- INTERP AND GRADIENTS ALONG Z ---------------------------------- + + IF (KIN_E) THEN + DO iky = ikys,ikye + DO ikx = ikxs,ikxe + DO ij = ijgs_e,ijge_e + DO ip = ipgs_e,ipge_e + p_int = parray_e(ip) + eo = MODULO(p_int,2) ! Indicates if we are on even or odd z grid + ! Compute z derivatives + CALL grad_z(eo,nadiab_moments_e(ip,ij,ikx,iky,izgs:izge), ddz_nepj(ip,ij,ikx,iky,izs:ize)) + ! Parallel hyperdiffusion + CALL grad_z2(moments_e(ip,ij,ikx,iky,izgs:izge,updatetlevel),ddz2_Nepj(ip,ij,ikx,iky,izs:ize)) + ! Compute even odd grids interpolation + CALL interp_z(eo,nadiab_moments_e(ip,ij,ikx,iky,izgs:izge), interp_nepj(ip,ij,ikx,iky,izs:ize)) + ENDDO + ENDDO + ENDDO + ENDDO + ENDIF + + DO iky = ikys,ikye + DO ikx = ikxs,ikxe + DO ij = ijgs_i,ijge_i + DO ip = ipgs_i,ipge_i + p_int = parray_i(ip) + eo = MODULO(p_int,2) ! Indicates if we are on even or odd z grid + ! Compute z first derivative + CALL grad_z(eo,nadiab_moments_i(ip,ij,ikx,iky,izgs:izge), ddz_nipj(ip,ij,ikx,iky,izs:ize)) + ! Parallel hyperdiffusion + CALL grad_z2(moments_i(ip,ij,ikx,iky,izgs:izge,updatetlevel),ddz2_Nipj(ip,ij,ikx,iky,izs:ize)) + ! Compute even odd grids interpolation + CALL interp_z(eo,nadiab_moments_i(ip,ij,ikx,iky,izgs:izge), interp_nipj(ip,ij,ikx,iky,izs:ize)) + ENDDO + ENDDO + ENDDO + ENDDO + + ! Execution time end + CALL cpu_time(t1_process) + tc_process = tc_process + (t1_process - t0_process) +END SUBROUTINE compute_nadiab_moments_z_gradients_and_interp + +!_____________________________________________________________________________! +!!!!! FLUID MOMENTS COMPUTATIONS !!!!! ! Compute the 2D particle density for electron and ions (sum over Laguerre) SUBROUTINE compute_density USE array, ONLY : dens_e, dens_i, kernel_e, kernel_i, nadiab_moments_e, nadiab_moments_i @@ -217,9 +260,10 @@ SUBROUTINE compute_density IF ( CONTAINS_ip0_e .AND. CONTAINS_ip0_i ) THEN ! Loop to compute dens_i = sum_j kernel_j Ni0j at each k - DO iky = ikys,ikye - DO ikx = ikxs,ikxe - DO iz = izs,ize + DO iz = izs,ize + DO iky = ikys,ikye + DO ikx = ikxs,ikxe + IF(KIN_E) THEN ! electron density dens = 0._dp @@ -251,9 +295,10 @@ SUBROUTINE compute_uperp COMPLEX(dp) :: uperp IF ( CONTAINS_ip0_e .AND. CONTAINS_ip0_i ) THEN - DO iky = ikys,ikye - DO ikx = ikxs,ikxe - DO iz = izs,ize + DO iz = izs,ize + DO iky = ikys,ikye + DO ikx = ikxs,ikxe + IF(KIN_E) THEN ! electron uperp = 0._dp @@ -287,26 +332,26 @@ SUBROUTINE compute_upar COMPLEX(dp) :: upar IF ( CONTAINS_ip1_e .AND. CONTAINS_ip1_i ) THEN + DO iz = izs,ize DO iky = ikys,ikye DO ikx = ikxs,ikxe - DO iz = izs,ize - IF(KIN_E) THEN - ! electron - upar = 0._dp - DO ij = ijs_e, ije_e - upar = upar + kernel_e(ij,ikx,iky,iz,1)*nadiab_moments_e(ip1_e,ij,ikx,iky,iz) - ENDDO - upar_e(ikx,iky,iz) = upar - ENDIF - ! ion - upar = 0._dp - DO ij = ijs_i, ije_i - upar = upar + kernel_i(ij,ikx,iky,iz,1)*nadiab_moments_i(ip1_i,ij,ikx,iky,iz) - ENDDO - upar_i(ikx,iky,iz) = upar + IF(KIN_E) THEN + ! electron + upar = 0._dp + DO ij = ijs_e, ije_e + upar = upar + kernel_e(ij,ikx,iky,iz,1)*nadiab_moments_e(ip1_e,ij,ikx,iky,iz) ENDDO + upar_e(ikx,iky,iz) = upar + ENDIF + ! ion + upar = 0._dp + DO ij = ijs_i, ije_i + upar = upar + kernel_i(ij,ikx,iky,iz,1)*nadiab_moments_i(ip1_i,ij,ikx,iky,iz) + ENDDO + upar_i(ikx,iky,iz) = upar ENDDO ENDDO + ENDDO ELSE IF(KIN_E)& upar_e = 0 @@ -328,9 +373,9 @@ SUBROUTINE compute_tperp IF ( CONTAINS_ip0_e .AND. CONTAINS_ip0_i .AND. & CONTAINS_ip2_e .AND. CONTAINS_ip2_i ) THEN ! Loop to compute T = 1/3*(Tpar + 2Tperp) - DO iky = ikys,ikye - DO ikx = ikxs,ikxe - DO iz = izs,ize + DO iz = izs,ize + DO iky = ikys,ikye + DO ikx = ikxs,ikxe ! electron temperature IF(KIN_E) THEN Tperp = 0._dp @@ -373,9 +418,9 @@ SUBROUTINE compute_Tpar IF ( CONTAINS_ip0_e .AND. CONTAINS_ip0_i .AND. & CONTAINS_ip2_e .AND. CONTAINS_ip2_i ) THEN ! Loop to compute T = 1/3*(Tpar + 2Tperp) - DO iky = ikys,ikye - DO ikx = ikxs,ikxe - DO iz = izs,ize + DO iz = izs,ize + DO iky = ikys,ikye + DO ikx = ikxs,ikxe ! electron temperature IF(KIN_E) THEN Tpar = 0._dp @@ -420,53 +465,4 @@ SUBROUTINE compute_fluid_moments temp_i = (Tpar_i - 2._dp * Tper_i)/3._dp - dens_i END SUBROUTINE compute_fluid_moments -! Compute the 2D particle temperature for electron and ions (sum over Laguerre) -! SUBROUTINE compute_temperature -! USE array, ONLY : temp_e, temp_i, kernel_e, kernel_i, nadiab_moments_e, nadiab_moments_i -! USE model, ONLY : KIN_E -! IMPLICIT NONE -! REAL(dp) :: j_dp -! COMPLEX(dp) :: Tperp, Tpar, dens -! -! IF ( CONTAINS_ip0_e .AND. CONTAINS_ip0_i .AND. & -! CONTAINS_ip2_e .AND. CONTAINS_ip2_i ) THEN -! ! Loop to compute T = 1/3*(Tpar + 2Tperp) -! DO iky = ikys,ikye -! DO ikx = ikxs,ikxe -! DO iz = izs,ize -! ! electron temperature -! IF(KIN_E) THEN -! dens = 0._dp -! Tpar = 0._dp -! Tperp = 0._dp -! DO ij = ijs_e, ije_e -! j_dp = REAL(ij-1,dp) -! temp_e(ikx,iky,iz) = temp_e(ikx,iky,iz) + & -! 2._dp/3._dp * (2._dp*j_dp*kernel_e(ij,ikx,iky,iz,0) - (j_dp+1)*kernel_e(ij+1,ikx,iky,iz,0) - j_dp*kernel_e(ij-1,ikx,iky,iz,0))& -! * (moments_e(ip0_e,ij,ikx,iky,iz,updatetlevel)+q_e/tau_e*kernel_e(ij,ikx,iky,iz,0)*phi(ikx,iky,iz)) & -! + SQRT2/3._dp * kernel_e(ij,ikx,iky,iz,0) * moments_e(ip2_e,ij,ikx,iky,iz,updatetlevel) -! ENDDO -! temp_e(ikx,iky,iz) = (Tpar - 2._dp * Tperp)/3._dp - dens -! ENDIF -! ! ion temperature -! dens = 0._dp -! Tpar = 0._dp -! Tperp = 0._dp -! DO ij = ijs_i, ije_i -! j_dp = REAL(ij-1,dp) -! temp_i(ikx,iky,iz) = temp_i(ikx,iky,iz) + & -! 2._dp/3._dp * (2._dp*j_dp*kernel_i(ij,ikx,iky,iz,0) - (j_dp+1)*kernel_i(ij+1,ikx,iky,iz,0) - j_dp*kernel_i(ij-1,ikx,iky,iz,0))& -! * (moments_i(ip0_i,ij,ikx,iky,iz,updatetlevel)+q_i/tau_i*kernel_i(ij,ikx,iky,iz,0)*phi(ikx,iky,iz)) & -! + SQRT2/3._dp * kernel_i(ij,ikx,iky,iz,0) * moments_i(ip2_i,ij,ikx,iky,iz,updatetlevel) -! ENDDO -! temp_i(ikx,iky,iz) = (Tpar - 2._dp * Tperp)/3._dp - dens -! ENDDO -! ENDDO -! ENDDO -! ENDIF -! IF(KIN_E) CALL manual_3D_bcast(temp_e(ikxs:ikxe,ikys:ikye,izs:ize)) -! CALL manual_3D_bcast(temp_i(ikxs:ikxe,ikys:ikye,izs:ize)) -! END SUBROUTINE compute_temperature - - END MODULE processing -- GitLab