adv_GCeqn_top Subroutine

public subroutine adv_GCeqn_top(params, F, P, spp)

Arguments

Type IntentOptional AttributesName
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.


Contents

Source Code


Source Code

  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