Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(KORC_PARAMS), | intent(inout) | :: | params | Core KORC simulation parameters. |
||
type(FIELDS), | intent(inout) | :: | F | An instance of the KORC derived type FIELDS. |
||
type(PROFILES), | intent(in) | :: | P | An instance of the KORC derived type PROFILES. |
||
type(SPECIES), | intent(inout), | DIMENSION(:), ALLOCATABLE | :: | spp | An instance of the derived type SPECIES containing all the parameters and simulation variables of the different species in the simulation. |
subroutine adv_GCeqn_top(params,F,P,spp)
TYPE(KORC_PARAMS), INTENT(INOUT) :: params
!! Core KORC simulation parameters.
TYPE(FIELDS), INTENT(INOUT) :: F
!! An instance of the KORC derived type FIELDS.
TYPE(PROFILES), INTENT(IN) :: P
!! An instance of the KORC derived type PROFILES.
TYPE(SPECIES), DIMENSION(:), ALLOCATABLE, INTENT(INOUT) :: spp
!! An instance of the derived type SPECIES containing all the parameters
!! and simulation variables of the different species in the simulation.
REAL(rp), DIMENSION(8) :: Bmag
REAL(rp),DIMENSION(8) :: Y_R,Y_PHI,Y_Z
REAL(rp),DIMENSION(8) :: B_R,B_PHI,B_Z,E_PHI
REAL(rp),DIMENSION(8) :: PSIp
REAL(rp),DIMENSION(8) :: V_PLL,V_MU
REAL(rp) :: B0,EF0,R0,q0,lam,ar,m_cache,q_cache,ne0,Te0,Zeff0
INTEGER(is),DIMENSION(8) :: flag_cache
LOGICAL :: ss_collisions
!! Logical variable that indicates if collisions are included in
!! the simulation.
INTEGER :: ii
!! Species iterator.
INTEGER :: pp
!! Particles iterator.
INTEGER :: cc
!! Chunk iterator.
INTEGER(ip) :: tt
INTEGER(ip) :: ttt
!! time iterator.
real(rp),dimension(F%dim_1D) :: Vden,Vdenave,VdenOMP
do ii = 1_idef,params%num_species
q_cache=spp(ii)%q
m_cache=spp(ii)%m
do ttt=1_ip,params%t_it_SC
VdenOMP=0._rp
!$OMP PARALLEL DO default(none) &
!$OMP& FIRSTPRIVATE(E0,q_cache,m_cache) &
!$OMP& shared(F,P,params,ii,spp) &
!$OMP& PRIVATE(pp,tt,ttt,Bmag,cc,Y_R,Y_PHI,Y_Z,V_PLL,V_MU, &
!$OMP& flag_cache,B_R,B_PHI,B_Z,E_PHI,PSIp, &
!$OMP& Vden,Vdenave) &
!$OMP& REDUCTION(+:VdenOMP)
do pp=1_idef,spp(ii)%ppp,8
!$OMP SIMD
do cc=1_idef,8_idef
Y_R(cc)=spp(ii)%vars%Y(pp-1+cc,1)
Y_PHI(cc)=spp(ii)%vars%Y(pp-1+cc,2)
Y_Z(cc)=spp(ii)%vars%Y(pp-1+cc,3)
V_PLL(cc)=spp(ii)%vars%V(pp-1+cc,1)
V_MU(cc)=spp(ii)%vars%V(pp-1+cc,2)
PSIp(cc)=spp(ii)%vars%PSI_p(pp-1+cc)
flag_cache(cc)=spp(ii)%vars%flag(pp-1+cc)
end do
!$OMP END SIMD
if (.not.params%FokPlan) then
Vdenave=0._rp
do tt=1_ip,params%t_skip
! write(6,*) params%mpi_params%rank,'Y_R',Y_R
call advance_GCeqn_vars(spp(ii)%vars,pp, &
tt+params%t_skip*(ttt-1),params, &
Y_R,Y_PHI, Y_Z,V_PLL,V_MU,flag_cache,q_cache,m_cache, &
B_R,B_PHI,B_Z,F,P,PSIp,E_PHI)
! write(6,*) params%mpi_params%rank,'Y_R',Y_R
if (params%SC_E) then
call calculate_SC_p(params,F,B_R,B_PHI,B_Z,Y_R,Y_Z, &
V_PLL,V_MU,m_cache,flag_cache,Vden)
Vdenave=(Vdenave*REAL(tt-1_ip)+Vden)/REAL(tt)
end if
end do !timestep iterator
VdenOMP=VdenOMP+Vdenave
!$OMP SIMD
do cc=1_idef,8_idef
spp(ii)%vars%Y(pp-1+cc,1)=Y_R(cc)
spp(ii)%vars%Y(pp-1+cc,2)=Y_PHI(cc)
spp(ii)%vars%Y(pp-1+cc,3)=Y_Z(cc)
spp(ii)%vars%V(pp-1+cc,1)=V_PLL(cc)
spp(ii)%vars%V(pp-1+cc,2)=V_MU(cc)
spp(ii)%vars%flag(pp-1+cc)=flag_cache(cc)
spp(ii)%vars%B(pp-1+cc,1) = B_R(cc)
spp(ii)%vars%B(pp-1+cc,2) = B_PHI(cc)
spp(ii)%vars%B(pp-1+cc,3) = B_Z(cc)
spp(ii)%vars%PSI_P(pp-1+cc) = PSIp(cc)
spp(ii)%vars%E(pp-1+cc,2) = E_PHI(cc)
end do
!$OMP END SIMD
else
call advance_FPeqn_vars(params,Y_R,Y_PHI, &
Y_Z,V_PLL,V_MU,flag_cache,m_cache, &
F,P,PSIp)
!$OMP SIMD
do cc=1_idef,8_idef
spp(ii)%vars%V(pp-1+cc,1)=V_PLL(cc)
spp(ii)%vars%V(pp-1+cc,2)=V_MU(cc)
spp(ii)%vars%flag(pp-1+cc)=flag_cache(cc)
end do
!$OMP END SIMD
end if
call analytical_fields_Bmag_p(F,Y_R,Y_PHI,Y_Z, &
Bmag,E_PHI)
!$OMP SIMD
do cc=1_idef,8_idef
spp(ii)%vars%g(pp-1+cc)=sqrt(1+V_PLL(cc)**2+ &
2*V_MU(cc)*Bmag(cc)*m_cache)
spp(ii)%vars%eta(pp-1+cc) = rad2deg(atan2(sqrt(2*m_cache* &
Bmag(cc)*spp(ii)%vars%V(pp-1+cc,2)), &
spp(ii)%vars%V(pp-1+cc,1)))
end do
!$OMP END SIMD
end do !particle chunk iterator
!$OMP END PARALLEL DO
if (params%SC_E) then
call calculate_SC_E1D(params,F,VdenOMP)
end if
end do
end do !species iterator
end subroutine adv_GCeqn_top