adv_FOfio_top Subroutine

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

Arguments

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

Core KORC simulation parameters.

type(FIELDS), intent(in) :: 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.


Calls

proc~~adv_fofio_top~~CallsGraph proc~adv_fofio_top adv_FOfio_top proc~get_fio_vector_potential_p get_fio_vector_potential_p proc~adv_fofio_top->proc~get_fio_vector_potential_p proc~get_fio_foelectric_fields_p get_fio_FOelectric_fields_p proc~adv_fofio_top->proc~get_fio_foelectric_fields_p proc~advance_fofio_vars advance_FOfio_vars proc~adv_fofio_top->proc~advance_fofio_vars proc~get_fio_fomagnetic_fields_p get_fio_FOmagnetic_fields_p proc~adv_fofio_top->proc~get_fio_fomagnetic_fields_p proc~advance_fp3dinterp_vars advance_FP3Dinterp_vars proc~adv_fofio_top->proc~advance_fp3dinterp_vars cart_to_cyl_p cart_to_cyl_p proc~adv_fofio_top->cart_to_cyl_p interface~fio_eval_field fio_eval_field proc~get_fio_vector_potential_p->interface~fio_eval_field proc~get_fio_foelectric_fields_p->interface~fio_eval_field proc~radiation_force_p radiation_force_p proc~advance_fofio_vars->proc~radiation_force_p proc~include_coulombcollisions_fofio_p include_CoulombCollisions_FOfio_p proc~advance_fofio_vars->proc~include_coulombcollisions_fofio_p proc~get_fio_fomagnetic_fields_p->interface~fio_eval_field proc~include_coulombcollisions_fo_p include_CoulombCollisions_FO_p proc~advance_fp3dinterp_vars->proc~include_coulombcollisions_fo_p proc~include_coulombcollisions_fo_p->cart_to_cyl_p proc~unitvectors_p unitVectors_p proc~include_coulombcollisions_fo_p->proc~unitvectors_p proc~ca_sd CA_SD proc~include_coulombcollisions_fo_p->proc~ca_sd proc~dca_sd dCA_SD proc~include_coulombcollisions_fo_p->proc~dca_sd proc~interp_focollision_p interp_FOcollision_p proc~include_coulombcollisions_fo_p->proc~interp_focollision_p proc~get_random get_random proc~include_coulombcollisions_fo_p->proc~get_random proc~cf_sd CF_SD proc~include_coulombcollisions_fo_p->proc~cf_sd proc~cb_ei_sd CB_ei_SD proc~include_coulombcollisions_fo_p->proc~cb_ei_sd proc~cb_ee_sd CB_ee_SD proc~include_coulombcollisions_fo_p->proc~cb_ee_sd proc~analytical_profiles_p analytical_profiles_p proc~include_coulombcollisions_fo_p->proc~analytical_profiles_p proc~include_coulombcollisions_fofio_p->cart_to_cyl_p proc~include_coulombcollisions_fofio_p->proc~unitvectors_p proc~get_fio_ion_p get_fio_ion_p proc~include_coulombcollisions_fofio_p->proc~get_fio_ion_p proc~include_coulombcollisions_fofio_p->proc~ca_sd proc~include_coulombcollisions_fofio_p->proc~dca_sd proc~include_coulombcollisions_fofio_p->proc~get_random proc~include_coulombcollisions_fofio_p->proc~cf_sd proc~include_coulombcollisions_fofio_p->proc~cb_ei_sd proc~get_fio_profile_p get_fio_profile_p proc~include_coulombcollisions_fofio_p->proc~get_fio_profile_p proc~include_coulombcollisions_fofio_p->proc~cb_ee_sd proc~get_fio_ion_p->interface~fio_eval_field proc~psi psi proc~ca_sd->proc~psi proc~vte VTe proc~ca_sd->proc~vte proc~gammacee Gammacee proc~ca_sd->proc~gammacee proc~dca_sd->proc~psi proc~dca_sd->proc~vte proc~dca_sd->proc~gammacee ezspline_error ezspline_error proc~interp_focollision_p->ezspline_error ezspline_interp ezspline_interp proc~interp_focollision_p->ezspline_interp proc~check_if_in_profiles_domain_p check_if_in_profiles_domain_p proc~interp_focollision_p->proc~check_if_in_profiles_domain_p omp_get_thread_num omp_get_thread_num proc~get_random->omp_get_thread_num interface~random_get_number random_get_number proc~get_random->interface~random_get_number proc~cf_sd->proc~psi proc~cf_sd->proc~vte proc~cf_sd->proc~gammacee proc~clogee CLogee proc~cf_sd->proc~clogee proc~h_j h_j proc~cf_sd->proc~h_j proc~cb_ei_sd->proc~vte proc~clogei CLogei proc~cb_ei_sd->proc~clogei proc~g_j g_j proc~cb_ei_sd->proc~g_j proc~cb_ei_sd->proc~gammacee proc~cb_ei_sd->proc~clogee proc~get_fio_profile_p->interface~fio_eval_field proc~cb_ee_sd->proc~psi proc~cb_ee_sd->proc~vte proc~cb_ee_sd->proc~gammacee proc~delta delta proc~cb_ee_sd->proc~delta proc~clogei->proc~vte proc~clog0 CLog0 proc~clogei->proc~clog0 proc~gammacee->proc~clogee proc~clogee->proc~vte proc~clogee->proc~clog0 proc~delta->proc~vte

Called by

proc~~adv_fofio_top~~CalledByGraph proc~adv_fofio_top adv_FOfio_top program~main main program~main->proc~adv_fofio_top

Contents

Source Code


Source Code

  subroutine adv_FOfio_top(params,F,P,spp)  
    TYPE(KORC_PARAMS), INTENT(INOUT)                           :: params
    !! Core KORC simulation parameters.
    TYPE(FIELDS), INTENT(IN)                                   :: 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(params%pchunk)               :: Bmag
    REAL(rp), DIMENSION(params%pchunk)               :: b_unit_X,b_unit_Y,b_unit_Z
    REAL(rp), DIMENSION(params%pchunk)               :: v,vpar,vperp
    REAL(rp), DIMENSION(params%pchunk)               :: tmp
    REAL(rp), DIMENSION(params%pchunk)               :: g
    REAL(rp), DIMENSION(params%pchunk)               :: cross_X,cross_Y,cross_Z
    REAL(rp), DIMENSION(params%pchunk)               :: vec_X,vec_Y,vec_Z
    REAL(rp),DIMENSION(params%pchunk) :: X_X,X_Y,X_Z
    REAL(rp),DIMENSION(params%pchunk) :: Y_R,Y_PHI,Y_Z
    REAL(rp),DIMENSION(params%pchunk) :: V_X,V_Y,V_Z
    REAL(rp),DIMENSION(params%pchunk) :: B_X,B_Y,B_Z
    REAL(rp),DIMENSION(params%pchunk) :: E_X,E_Y,E_Z
    REAL(rp),DIMENSION(params%pchunk) :: PSIp
    TYPE(C_PTR),DIMENSION(params%pchunk) :: hint
    INTEGER(is),DIMENSION(params%pchunk) :: flagCon,flagCol
    REAL(rp) :: a,m_cache,q_cache    
    INTEGER                                                    :: ii
    !! Species iterator.
    INTEGER                                                    :: pp,pchunk
    !! Particles iterator.
    INTEGER                                                    :: cc
    !! Chunk iterator.
    INTEGER(ip)                                                    :: tt
    !! time iterator.


    do ii = 1_idef,params%num_species      

       pchunk=params%pchunk
       m_cache=spp(ii)%m
       q_cache=spp(ii)%q
       a = params%dt


       !$OMP PARALLEL DO default(none) &
       !$OMP& FIRSTPRIVATE(a,m_cache,q_cache,E0,pchunk) &
       !$OMP& shared(params,ii,spp,P,F) &
       !$OMP& PRIVATE(pp,tt,Bmag,cc,X_X,X_Y,X_Z,V_X,V_Y,V_Z,B_X,B_Y,B_Z, &
       !$OMP& E_X,E_Y,E_Z,b_unit_X,b_unit_Y,b_unit_Z,v,vpar,vperp,tmp, &
       !$OMP& cross_X,cross_Y,cross_Z,vec_X,vec_Y,vec_Z,g, &
       !$OMP& Y_R,Y_PHI,Y_Z,flagCon,flagCol,PSIp,hint)
       do pp=1_idef,spp(ii)%ppp,pchunk

          !$OMP SIMD
          do cc=1_idef,pchunk
             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)

             Y_R(cc)=0._rp
             Y_PHI(cc)=0._rp
             Y_Z(cc)=0._rp

             V_X(cc)=spp(ii)%vars%V(pp-1+cc,1)
             V_Y(cc)=spp(ii)%vars%V(pp-1+cc,2)
             V_Z(cc)=spp(ii)%vars%V(pp-1+cc,3)

             B_X(cc)=spp(ii)%vars%B(pp-1+cc,1)
             B_Y(cc)=spp(ii)%vars%B(pp-1+cc,2)
             B_Z(cc)=spp(ii)%vars%B(pp-1+cc,3)

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

             PSIp(cc)=spp(ii)%vars%PSI_P(pp-1+cc)

             hint(cc)=spp(ii)%vars%hint(pp-1+cc)

             g(cc)=spp(ii)%vars%g(pp-1+cc)

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

          !write(output_unit_write,*) 'Yin: ',Y_R,Y_PHI,Y_Z
          !write(output_unit_write,*) 'Bin: ',B_X,B_Y,B_Z


          if (.not.params%FokPlan) then
             do tt=1_ip,params%t_skip

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

                call get_fio_FOmagnetic_fields_p(params,F,Y_R,Y_PHI,Y_Z, &
                     B_X,B_Y,B_Z,flagCon,hint)
                if (F%FIO_E .ge. 0) then
                   call get_fio_FOelectric_fields_p(params,F, &
                        Y_R,Y_PHI,Y_Z,E_X,E_Y,E_Z,flagCon,hint)
                end if
                if (F%FIO_A .ge. 0) then
                   call get_fio_vector_potential_p(params,F,Y_R,Y_PHI,Y_Z, &
                        PSIp,flagCon,hint)
                end if

                call advance_FOfio_vars(tt,a,q_cache,m_cache,params, &
                     X_X,X_Y,X_Z,V_X,V_Y,V_Z,B_X,B_Y,B_Z,E_X,E_Y,E_Z, &
                     g,flagCon,flagCol,P,F,PSIp,hint)

             end do !timestep iterator

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

             if (F%FIO_A .ge. 0) then
                call get_fio_vector_potential_p(params,F,Y_R,Y_PHI,Y_Z, &
                     PSIp,flagCon,hint)
             endif
                
             !write(output_unit_write,*) 'Yout: ',Y_R,Y_PHI,Y_Z
             !write(output_unit_write,*) 'Bout: ',B_X,B_Y,B_Z



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

                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_X(cc)
                spp(ii)%vars%V(pp-1+cc,2)=V_Y(cc)
                spp(ii)%vars%V(pp-1+cc,3)=V_Z(cc)

                spp(ii)%vars%g(pp-1+cc) = g(cc)
                spp(ii)%vars%flagCon(pp-1+cc) = flagCon(cc)
                spp(ii)%vars%flagCol(pp-1+cc) = flagCol(cc)

                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)

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

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

                E_X(cc)=spp(ii)%vars%E(pp-1+cc,1)
                E_Y(cc)=spp(ii)%vars%E(pp-1+cc,2)
                E_Z(cc)=spp(ii)%vars%E(pp-1+cc,3)
             end do
             !$OMP END SIMD

             call advance_FP3Dinterp_vars(params,X_X,X_Y,X_Z,V_X,V_Y,V_Z, &
                  g,m_cache,B_X,B_Y,B_Z,E_X,E_Y,E_Z,flagCon,flagCol,P,F,PSIp)

             !$OMP SIMD
             do cc=1_idef,pchunk

                spp(ii)%vars%V(pp-1+cc,1)=V_X(cc)
                spp(ii)%vars%V(pp-1+cc,2)=V_Y(cc)
                spp(ii)%vars%V(pp-1+cc,3)=V_Z(cc)

                spp(ii)%vars%g(pp-1+cc) = g(cc)
                spp(ii)%vars%flagCol(pp-1+cc) = flagCol(cc)

             end do
             !$OMP END SIMD
          end if

          !$OMP SIMD
          !          !$OMP& aligned(Bmag,B_X,B_Y,B_Z, &
          !          !$OMP& b_unit_X,b_unit_Y,b_unit_Z,v,V_X,V_Y,V_Z,vpar, &
          !          !$OMP& vperp,tmp,cross_X,cross_Y,cross_Z, &
          !          !$OMP& vec_X,vec_Y,vec_Z,E_X,E_Y,E_Z)
          do cc=1_idef,pchunk
             !Derived output data
             Bmag(cc) = SQRT(B_X(cc)*B_X(cc)+B_Y(cc)*B_Y(cc)+B_Z(cc)*B_Z(cc))

             ! Parallel unit vector
             b_unit_X(cc) = B_X(cc)/Bmag(cc)
             b_unit_Y(cc) = B_Y(cc)/Bmag(cc)
             b_unit_Z(cc) = B_Z(cc)/Bmag(cc)

             v(cc) = SQRT(V_X(cc)*V_X(cc)+V_Y(cc)*V_Y(cc)+V_Z(cc)*V_Z(cc))
             if (v(cc).GT.korc_zero) then
                ! Parallel and perpendicular components of velocity
                vpar(cc) = (V_X(cc)*b_unit_X(cc)+V_Y(cc)*b_unit_Y(cc)+ &
                     V_Z(cc)*b_unit_Z(cc))

                vperp(cc) =  v(cc)**2 - vpar(cc)**2
                if ( vperp(cc) .GE. korc_zero ) then
                   vperp(cc) = SQRT( vperp(cc) )
                else
                   vperp(cc) = 0.0_rp
                end if

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

                ! Magnetic moment
                spp(ii)%vars%mu(pp-1+cc) = 0.5_rp*m_cache* &
                     g(cc)**2*vperp(cc)**2/Bmag(cc)
                ! See Northrop's book (The adiabatic motion of charged
                ! particles)

                ! Radiated power
                tmp(cc) = q_cache**4/(6.0_rp*C_PI*E0*m_cache**2)

                cross_X(cc) = V_Y(cc)*B_Z(cc)-V_Z(cc)*B_Y(cc)
                cross_Y(cc) = V_Z(cc)*B_X(cc)-V_X(cc)*B_Z(cc)
                cross_Z(cc) = V_X(cc)*B_Y(cc)-V_Y(cc)*B_X(cc)

                vec_X(cc) = E_X(cc) + cross_X(cc)
                vec_Y(cc) = E_Y(cc) + cross_Y(cc)
                vec_Z(cc) = E_Z(cc) + cross_Z(cc)

                spp(ii)%vars%Prad(pp-1+cc) = tmp(cc)* &
                     ( E_X(cc)*E_X(cc)+E_Y(cc)*E_Y(cc)+E_Z(cc)*E_Z(cc) + &
                     cross_X(cc)*E_X(cc)+cross_Y(cc)*E_Y(cc)+ &
                     cross_Z(cc)*E_Z(cc) + g(cc)**2* &
                     ((E_X(cc)*V_X(cc)+E_Y(cc)*V_Y(cc)+E_Z(cc)*V_Z(cc))**2 &
                     - vec_X(cc)*vec_X(cc)+vec_Y(cc)*vec_Y(cc)+ &
                     vec_Z(cc)*vec_Z(cc)) )

                ! Input power due to electric field
                spp(ii)%vars%Pin(pp-1+cc) = q_cache*(E_X(cc)*V_X(cc)+ &
                     E_Y(cc)*V_Y(cc)+E_Z(cc)*V_Z(cc))
             else
                spp(ii)%vars%eta(pp-1+cc) = 0.0_rp
                spp(ii)%vars%mu(pp-1+cc) = 0.0_rp
                spp(ii)%vars%Prad(pp-1+cc) = 0.0_rp
                spp(ii)%vars%Pin(pp-1+cc) = 0.0_rp
             end if

          end do
          !$OMP END SIMD


       end do !particle chunk iterator
       !$OMP END PARALLEL DO

    end do !species iterator

  end subroutine adv_FOfio_top