FO_init Subroutine

public subroutine FO_init(params, F, spp, output, step)

Calls get_fields in korc_fields.

Arguments

Type IntentOptional AttributesName
type(KORC_PARAMS), intent(in) :: params

Core KORC simulation parameters.

type(FIELDS), intent(in) :: F

An instance of the KORC derived type FIELDS.

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.

logical, intent(in) :: output
logical, intent(in) :: step

Contents

Source Code


Source Code

  subroutine FO_init(params,F,spp,output,step)
    TYPE(KORC_PARAMS), INTENT(IN)                              :: params
    !! Core KORC simulation parameters.
    TYPE(FIELDS), INTENT(IN)                                   :: F
    !! An instance of the KORC derived type FIELDS.
    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)                                      :: dt
    !! Time step used in the leapfrog step (\(\Delta t\)).
    REAL(rp)                                                   :: Prad
    !! Total radiated power of each particle.

    REAL(rp)                                  :: Bmag1
    !! Magnitude of the magnetic field seen by each particle .
    REAL(rp)                                                   :: v
    !! Speed of each particle.
    REAL(rp)                                                   :: vpar
    !! Parallel velocity \(v_\parallel = \mathbf{v}\cdot \hat{b}\).
    REAL(rp)                                                   :: vperp
    !! Perpendicular velocity \(v_\parallel = |\mathbf{v} - (\mathbf{v}\cdot
    !! \hat{b})\hat{b}|\).
    REAL(rp)                                                   :: tmp
    !! Temporary variable used for various computations.
    REAL(rp)                                                   :: a
    !! This variable is used to simplify notation in the code, and
    !! is given by \(a=q\Delta t/m\),

    REAL(rp), DIMENSION(3)                       :: Frad
    !! Synchrotron radiation reaction force of each particle.
    REAL(rp), DIMENSION(3)                       :: vec
    !! Auxiliary vector used in various computations.
    REAL(rp), DIMENSION(3)                       :: b_unit
    !! Unitary vector pointing along the local magnetic field \(\hat{b}\).
    INTEGER                                      :: ii
    !! Species iterator.
    INTEGER                                      :: pp
    !! Particles iterator.
    INTEGER                                      :: cc
    !! Chunk iterator.

    LOGICAL,intent(in) :: output
    LOGICAL,intent(in) :: step   

    REAL(rp),DIMENSION(8) :: X_X,X_Y,X_Z
    REAL(rp),DIMENSION(8) :: Y_R,Y_PHI,Y_Z
    REAL(rp),DIMENSION(8) :: B_X,B_Y,B_Z
    REAL(rp),DIMENSION(8) :: E_X,E_Y,E_Z
    REAL(rp),DIMENSION(8) :: PSIp
    INTEGER(is) ,DIMENSION(8) :: flag_cache

    

    do ii = 1_idef,params%num_species

       if(output) then

          !$OMP PARALLEL DO default(none) &
          !$OMP& shared(params,ii,spp,F) &
          !$OMP& PRIVATE(pp,cc,X_X,X_Y,X_Z,B_X,B_Y,B_Z, &
          !$OMP& E_X,E_Y,E_Z,Y_R,Y_PHI,Y_Z,flag_cache,PSIp)
          do pp=1_idef,spp(ii)%ppp,8

             !$OMP SIMD
             do cc=1_idef,8_idef
                X_X(cc)=spp(ii)%vars%X(pp-1+cc,1)
                X_Y(cc)=spp(ii)%vars%X(pp-1+cc,2)
                X_Z(cc)=spp(ii)%vars%X(pp-1+cc,3)

                flag_cache(cc)=spp(ii)%vars%flag(pp-1+cc)
             end do
             !$OMP END SIMD


             call cart_to_cyl_p(X_X,X_Y,X_Z,Y_R,Y_PHI,Y_Z)

             if (params%orbit_model(3:5).eq.'new') then
                call interp_FOfields_p(F,Y_R,Y_PHI,Y_Z,B_X,B_Y,B_Z, &
                     E_X,E_Y,E_Z,PSIp,flag_cache)
             else if (params%orbit_model(3:5).eq.'old') then
                call interp_FOfields1_p(F,Y_R,Y_PHI,Y_Z,B_X,B_Y,B_Z, &
                     E_X,E_Y,E_Z,PSIp,flag_cache)
             end if

             !$OMP SIMD
             do cc=1_idef,8_idef
                spp(ii)%vars%B(pp-1+cc,1) = B_X(cc)
                spp(ii)%vars%B(pp-1+cc,2) = B_Y(cc)
                spp(ii)%vars%B(pp-1+cc,3) = B_Z(cc)

                spp(ii)%vars%E(pp-1+cc,1) = E_X(cc)
                spp(ii)%vars%E(pp-1+cc,2) = E_Y(cc)
                spp(ii)%vars%E(pp-1+cc,3) = E_Z(cc)

                spp(ii)%vars%PSI_P(pp-1+cc) = PSIp(cc)
             end do
             !$OMP END SIMD
             
          end do
          !$OMP END PARALLEL DO                         

          !! Calls [[get_fields]] in [[korc_fields]].
          ! Interpolates fields at local particles' position and keeps in
          ! spp%vars. Fields in (R,\(\phi\),Z) coordinates.

!          write(6,'("korc_ppusher")')
!          write(6,'("B_X: ",E17.10)') spp(ii)%vars%B(:,1)
!          write(6,'("B_Z: ",E17.10)') spp(ii)%vars%B(:,2)
!          write(6,'("B_Y: ",E17.10)') spp(ii)%vars%B(:,3)
          
          !$OMP PARALLEL DO DEFAULT(none) SHARED(ii,spp) &
          !$OMP& FIRSTPRIVATE(E0) &
          !$OMP& PRIVATE(pp,b_unit,Bmag1,vpar,v,vperp,vec,tmp)
          do pp=1_idef,spp(ii)%ppp

             Bmag1 = SQRT(DOT_PRODUCT(spp(ii)%vars%B(pp,:), &
                  spp(ii)%vars%B(pp,:)))

             ! Parallel unit vector
             b_unit = spp(ii)%vars%B(pp,:)/Bmag1

             v = SQRT(DOT_PRODUCT(spp(ii)%vars%V(pp,:),spp(ii)%vars%V(pp,:)))
             if (v.GT.korc_zero) then
                ! Parallel and perpendicular components of velocity
                vpar = DOT_PRODUCT(spp(ii)%vars%V(pp,:), b_unit)
                vperp =  DOT_PRODUCT(spp(ii)%vars%V(pp,:), &
                     spp(ii)%vars%V(pp,:)) &
                     - vpar**2
                if ( vperp .GE. korc_zero ) then
                   vperp = SQRT( vperp )
                else
                   vperp = 0.0_rp
                end if

                ! Pitch angle
                spp(ii)%vars%eta(pp) = 180.0_rp*MODULO(ATAN2(vperp,vpar), &
                     2.0_rp*C_PI)/C_PI

                ! Magnetic moment
                spp(ii)%vars%mu(pp) = 0.5_rp*spp(ii)%m* &
                     spp(ii)%vars%g(pp)**2*vperp**2/Bmag1
                ! See Northrop's book (The adiabatic motion of charged
                ! particles)

                ! Radiated power
                tmp = spp(ii)%q**4/(6.0_rp*C_PI*E0*spp(ii)%m**2)
                vec = spp(ii)%vars%E(pp,:) + cross(spp(ii)%vars%V(pp,:), &
                     spp(ii)%vars%B(pp,:))

                spp(ii)%vars%Prad(pp) = tmp*( DOT_PRODUCT(spp(ii)% &
                     vars%E(pp,:), &
                     spp(ii)%vars%E(pp,:)) + &
                     DOT_PRODUCT(cross(spp(ii)%vars%V(pp,:), &
                     spp(ii)%vars%B(pp,:)),spp(ii)%vars%E(pp,:))+ &
                     spp(ii)%vars%g(pp)**2* &
                     (DOT_PRODUCT(spp(ii)%vars%E(pp,:), &
                     spp(ii)%vars%V(pp,:))**2 - DOT_PRODUCT(vec,vec)) )

                ! Input power due to electric field
                spp(ii)%vars%Pin(pp) = spp(ii)%q*DOT_PRODUCT( &
                     spp(ii)%vars%E(pp,:),spp(ii)%vars%V(pp,:))
             else
                spp(ii)%vars%eta(pp) = 0.0_rp
                spp(ii)%vars%mu(pp) = 0.0_rp
                spp(ii)%vars%Prad(pp) = 0.0_rp
                spp(ii)%vars%Pin(pp) = 0.0_rp
             end if


          end do ! loop over particles on an mpi process
          !$OMP END PARALLEL DO

       end if !(if output)

       if(step.and.(.not.params%FokPlan)) then
          dt=0.5_rp*params%dt
          
          !$OMP PARALLEL DO FIRSTPRIVATE(dt) PRIVATE(pp,cc) &
          !$OMP& SHARED(ii,spp,params)
          do pp=1_idef,spp(ii)%ppp,8

             !$OMP SIMD
             do cc=1_idef,8
                spp(ii)%vars%X(pp-1+cc,1) = spp(ii)%vars%X(pp-1+cc,1) + &
                     dt*spp(ii)%vars%V(pp-1+cc,1)
                spp(ii)%vars%X(pp-1+cc,2) = spp(ii)%vars%X(pp-1+cc,2) + &
                     dt*spp(ii)%vars%V(pp-1+cc,2)
                spp(ii)%vars%X(pp-1+cc,3) = spp(ii)%vars%X(pp-1+cc,3) + &
                     dt*spp(ii)%vars%V(pp-1+cc,3)
             end do
             !$OMP END SIMD
             
          end do
          !$OMP END PARALLEL DO

       end if !(if step)

    end do ! over species

  end subroutine FO_init