check_if_in_fields_domain_p Subroutine

private subroutine check_if_in_fields_domain_p(pchunk, F, Y_R, Y_PHI, Y_Z, flag)

External fields and interpolants can have different spatial domains where they are defined. Therefore, it is necessary to check if a given particle has left these spatial domains to stop following it, otherwise this will cause an error in the simulation.

Arguments

Type IntentOptional AttributesName
integer, intent(in) :: pchunk
type(FIELDS), intent(in) :: F
real(kind=rp), intent(in), DIMENSION(pchunk):: Y_R
real(kind=rp), intent(in), DIMENSION(pchunk):: Y_PHI
real(kind=rp), intent(in), DIMENSION(pchunk):: Y_Z
integer(kind=is), intent(inout), DIMENSION(pchunk):: flag

Flag that determines whether particles are followed in the simulation (flag=1), or not (flag=0).


Called by

proc~~check_if_in_fields_domain_p~~CalledByGraph proc~check_if_in_fields_domain_p check_if_in_fields_domain_p proc~calculate_3dbdbfields1_p calculate_3DBdBfields1_p proc~calculate_3dbdbfields1_p->proc~check_if_in_fields_domain_p proc~calculate_3dbdbfields_p calculate_3DBdBfields_p proc~calculate_3dbdbfields_p->proc~check_if_in_fields_domain_p proc~calculate_gcfieldswe_p calculate_GCfieldswE_p proc~calculate_gcfieldswe_p->proc~check_if_in_fields_domain_p proc~calculate_gcfields_p_fs calculate_GCfields_p_FS proc~calculate_gcfields_p_fs->proc~check_if_in_fields_domain_p proc~interp_fofields_p interp_FOfields_p proc~interp_fofields_p->proc~check_if_in_fields_domain_p proc~interp_fofields1_p interp_FOfields1_p proc~interp_fofields1_p->proc~check_if_in_fields_domain_p proc~interp_fofields_aorsa_p interp_FOfields_aorsa_p proc~interp_fofields_aorsa_p->proc~check_if_in_fields_domain_p proc~interp_fields_3d_p interp_fields_3D_p proc~interp_fields_3d_p->proc~check_if_in_fields_domain_p proc~calculate_gcfields_p calculate_GCfields_p proc~calculate_gcfields_p->proc~check_if_in_fields_domain_p proc~calculate_gcfields_2x1t_p calculate_GCfields_2x1t_p proc~calculate_gcfields_2x1t_p->proc~check_if_in_fields_domain_p proc~interp_fo3dfields_p interp_FO3Dfields_p proc~interp_fo3dfields_p->proc~check_if_in_fields_domain_p proc~calculate_2dbdbfields_p calculate_2DBdBfields_p proc~calculate_2dbdbfields_p->proc~check_if_in_fields_domain_p proc~interp_fofields_mars_p interp_FOfields_mars_p proc~interp_fofields_mars_p->proc~check_if_in_fields_domain_p proc~interp_fields_p interp_fields_p proc~interp_fields_p->proc~check_if_in_fields_domain_p proc~advance_gcinterp_psiwe_vars advance_GCinterp_psiwE_vars proc~advance_gcinterp_psiwe_vars->proc~calculate_gcfieldswe_p proc~adv_fointerp_top adv_FOinterp_top proc~adv_fointerp_top->proc~interp_fofields_p proc~adv_fointerp_top->proc~interp_fofields1_p proc~adv_fointerp_top->proc~interp_fo3dfields_p proc~adv_gcinterp_psi_top adv_GCinterp_psi_top proc~adv_gcinterp_psi_top->proc~calculate_gcfields_p proc~include_coulombcollisions_gc_p include_CoulombCollisions_GC_p proc~adv_gcinterp_psi_top->proc~include_coulombcollisions_gc_p proc~advance_fpinterp_vars advance_FPinterp_vars proc~adv_gcinterp_psi_top->proc~advance_fpinterp_vars proc~adv_fointerp_mars_top adv_FOinterp_mars_top proc~adv_fointerp_mars_top->proc~interp_fofields_mars_p proc~adv_gcinterp_psi2x1t_top adv_GCinterp_psi2x1t_top proc~adv_gcinterp_psi2x1t_top->proc~calculate_gcfields_2x1t_p proc~adv_gcinterp_psi2x1t_top->proc~advance_fpinterp_vars proc~include_coulombcollisions_gc_p->proc~calculate_gcfieldswe_p proc~include_coulombcollisions_gc_p->proc~calculate_gcfields_p_fs proc~include_coulombcollisions_gc_p->proc~interp_fields_3d_p proc~include_coulombcollisions_gc_p->proc~calculate_gcfields_p proc~include_coulombcollisions_gc_p->proc~calculate_gcfields_2x1t_p proc~include_coulombcollisions_gc_p->proc~calculate_2dbdbfields_p proc~include_coulombcollisions_gc_p->proc~interp_fields_p proc~adv_gcinterp_psiwe_top adv_GCinterp_psiwE_top proc~adv_gcinterp_psiwe_top->proc~calculate_gcfields_p proc~adv_gcinterp_psiwe_top->proc~include_coulombcollisions_gc_p proc~advance_gcinterp_3dbdb1_vars advance_GCinterp_3DBdB1_vars proc~advance_gcinterp_3dbdb1_vars->proc~calculate_3dbdbfields1_p proc~advance_gcinterp_3dbdb1_vars->proc~include_coulombcollisions_gc_p proc~include_coulombcollisionsla_gc_p include_CoulombCollisionsLA_GC_p proc~include_coulombcollisionsla_gc_p->proc~calculate_gcfieldswe_p proc~include_coulombcollisionsla_gc_p->proc~calculate_gcfields_p_fs proc~include_coulombcollisionsla_gc_p->proc~interp_fields_3d_p proc~include_coulombcollisionsla_gc_p->proc~calculate_gcfields_p proc~include_coulombcollisionsla_gc_p->proc~calculate_gcfields_2x1t_p proc~include_coulombcollisionsla_gc_p->proc~calculate_2dbdbfields_p proc~include_coulombcollisionsla_gc_p->proc~interp_fields_p proc~adv_fointerp_aorsa_top adv_FOinterp_aorsa_top proc~adv_fointerp_aorsa_top->proc~interp_fofields_aorsa_p proc~fo_init FO_init proc~fo_init->proc~interp_fofields_p proc~fo_init->proc~interp_fofields1_p proc~fo_init->proc~interp_fofields_aorsa_p proc~fo_init->proc~interp_fo3dfields_p proc~fo_init->proc~interp_fofields_mars_p proc~advance_gcinterp_psi_vars_fs advance_GCinterp_psi_vars_FS proc~advance_gcinterp_psi_vars_fs->proc~calculate_gcfields_p_fs proc~advance_gcinterp_psi_vars_fs->proc~include_coulombcollisions_gc_p proc~advance_gcinterp_psi_vars advance_GCinterp_psi_vars proc~advance_gcinterp_psi_vars->proc~calculate_gcfields_p proc~advance_gcinterp_b2d_vars advance_GCinterp_B2D_vars proc~advance_gcinterp_b2d_vars->proc~interp_fields_p proc~advance_gcinterp_b2d_vars->proc~include_coulombcollisions_gc_p proc~advance_gcinterp_psi2x1t_vars advance_GCinterp_psi2x1t_vars proc~advance_gcinterp_psi2x1t_vars->proc~calculate_gcfields_2x1t_p proc~advance_gcinterp_psi2x1t_vars->proc~include_coulombcollisions_gc_p proc~advance_gcinterp_2dbdb_vars advance_GCinterp_2DBdB_vars proc~advance_gcinterp_2dbdb_vars->proc~calculate_2dbdbfields_p proc~advance_gcinterp_2dbdb_vars->proc~include_coulombcollisions_gc_p proc~advance_gcinterp_b_vars advance_GCinterp_B_vars proc~advance_gcinterp_b_vars->proc~interp_fields_3d_p proc~advance_gcinterp_b_vars->proc~include_coulombcollisions_gc_p proc~advance_gcinterp_3dbdb_vars advance_GCinterp_3DBdB_vars proc~advance_gcinterp_3dbdb_vars->proc~calculate_3dbdbfields_p proc~advance_gcinterp_3dbdb_vars->proc~include_coulombcollisions_gc_p proc~advance_fpeqn_vars advance_FPeqn_vars proc~advance_fpeqn_vars->proc~include_coulombcollisions_gc_p program~main main program~main->proc~adv_fointerp_top program~main->proc~adv_gcinterp_psi_top program~main->proc~adv_fointerp_mars_top program~main->proc~adv_gcinterp_psi2x1t_top program~main->proc~adv_gcinterp_psiwe_top program~main->proc~adv_fointerp_aorsa_top program~main->proc~fo_init proc~adv_gceqn_top adv_GCeqn_top program~main->proc~adv_gceqn_top proc~adv_gcinterp_psi_top_fs adv_GCinterp_psi_top_FS program~main->proc~adv_gcinterp_psi_top_fs proc~adv_gcinterp_b_top adv_GCinterp_B_top program~main->proc~adv_gcinterp_b_top proc~adv_gcinterp_3dbdb_top adv_GCinterp_3DBdB_top program~main->proc~adv_gcinterp_3dbdb_top proc~adv_gcinterp_3dbdb1_top adv_GCinterp_3DBdB1_top program~main->proc~adv_gcinterp_3dbdb1_top proc~adv_gcinterp_2dbdb_top adv_GCinterp_2DBdB_top program~main->proc~adv_gcinterp_2dbdb_top proc~adv_gcinterp_b2d_top adv_GCinterp_B2D_top program~main->proc~adv_gcinterp_b2d_top proc~advance_fpinterp_vars->proc~include_coulombcollisions_gc_p proc~adv_gceqn_top->proc~include_coulombcollisions_gc_p proc~adv_gcinterp_psi_top_fs->proc~advance_fpinterp_vars proc~adv_gcinterp_b_top->proc~advance_fpinterp_vars proc~adv_gcinterp_3dbdb_top->proc~advance_fpinterp_vars proc~adv_gcinterp_3dbdb1_top->proc~advance_fpinterp_vars proc~adv_gcinterp_2dbdb_top->proc~advance_fpinterp_vars proc~adv_gcinterp_b2d_top->proc~advance_fpinterp_vars

Contents


Source Code

  subroutine check_if_in_fields_domain_p(pchunk,F,Y_R,Y_PHI,Y_Z,flag)
    !! @note Subrotuine that checks if particles in the simulation are within
    !! the spatial domain where interpolants and fields are known. @endnote
    !! External fields and interpolants can have different spatial domains where
    !! they are defined. Therefore, it is necessary to
    !! check if a given particle has left these spatial domains to
    !! stop following it, otherwise this will cause an error in the simulation.
    INTEGER, INTENT(IN)  :: pchunk
    TYPE(FIELDS), INTENT(IN)                                   :: F
    REAL(rp), DIMENSION(pchunk),  INTENT(IN)      :: Y_R,Y_PHI,Y_Z    
    INTEGER(is), DIMENSION(pchunk), INTENT(INOUT)  :: flag
    !! Flag that determines whether particles are followed in the
    !! simulation (flag=1), or not (flag=0).
    INTEGER                                                :: IR
    !! Variable used to localize the grid cell in the \((R,\phi,Z)\)
    !! or \((R,Z)\) grid containing the fields data that corresponds
    !! to the radial position of the particles.
    INTEGER                                                :: IPHI
    !! Variable used to localize the grid cell in the \((R,\phi,Z)\)
    !! or \((R,Z)\) grid containing the fields data that corresponds
    !! to the azimuthal position of the particles.
    INTEGER                                                :: IZ
    !! Variable used to localize the grid cell in the \((R,\phi,Z)\)
    !! or \((R,Z)\) grid containing the fields data that corresponds
    !! to the vertical position of the particles.
    INTEGER(ip)                                            :: pp
    !! Particle iterator.
    INTEGER(ip)                                            :: ss
    !! Species iterator.
    REAL(rp) :: Rwall

    
!    write(output_unit_write,'("YR:",E17.10)') Y_R
!    write(output_unit_write,'("YPHI:",E17.10)') Y_PHI
!    write(output_unit_write,'("YZ:",E17.10)') Y_Z

!    write(output_unit_write,'("Ro:",E17.10)') fields_domain%Ro
!    write(output_unit_write,'("Zo:",E17.10)') fields_domain%Zo
!    write(output_unit_write,'("DR:",E17.10)') fields_domain%DR
    !    write(output_unit_write,'("DZ:",E17.10)') fields_domain%DZ
!    write(output_unit_write,'("DT:",E17.10)') fields_domain%DT


    
    if (ALLOCATED(fields_domain%FLAG3D)) then
       if (F%Dim2x1t) then
          !$OMP SIMD
          !       !$OMP&  aligned(IR,IPHI,IZ)
          do pp=1_idef,pchunk

             IR = INT(FLOOR((Y_R(pp)  - fields_domain%Ro + &
                  0.5_rp*fields_domain%DR)/fields_domain%DR) + 1.0_rp,idef)

             IZ = INT(FLOOR((Y_Z(pp)  + ABS(fields_domain%Zo) + &
                  0.5_rp*fields_domain%DZ)/fields_domain%DZ) + 1.0_rp,idef)

!             write(output_unit_write,'("IR: ",I16)') IR
!             write(output_unit_write,'("IPHI: ",I16)') IPHI
!             write(output_unit_write,'("IZ: ",I16)') IZ
             
             if ((fields_domain%FLAG3D(IR,1,IZ).NE.1_is).OR. &
                  ((IR.GT.bfield_2X1T%NR).OR.(IZ.GT.bfield_2X1T%NZ))) then
                if (F%Analytic_IWL.eq.'NONE') then
                   flag(pp) = 0_is
                else if (F%Analytic_IWL.eq.'D3D') then
                   if ((IR.lt.floor(bfield_2d%NR/6._rp)).and. &
                        (IZ.gt.floor(bfield_2d%NZ/5._rp)).and. &
                        (IZ.lt.floor(4._rp*bfield_2d%NZ/5._rp))) then

                      Rwall=F%circumradius*cos(C_PI/F%ntiles)/ &
                           (cos((mod(Y_PHI(pp),2*C_PI/F%ntiles))-C_PI/F%ntiles))
                      if (Y_R(pp).lt.Rwall) flag(pp) = 0_is

                   else
                      flag(pp) = 0_is
                   endif
                endif

                !write(output_unit_write,'("YR:",E17.10)') Y_R(pp)
                !write(output_unit_write,'("YPHI:",E17.10)') Y_PHI(pp)
                !write(output_unit_write,'("YZ:",E17.10)') Y_Z(pp)

                !write(output_unit_write,'("IR: ",I16)') IR
                !write(output_unit_write,'("IPHI: ",I16)') IPHI
                !write(output_unit_write,'("IZ: ",I16)') IZ

                !call KORC_ABORT()

             end if

             !write(output_unit_write,'("IPHI: ",I16)') IPHI
             !write(output_unit_write,'("flag: ",I16)') flag(pp)


          end do
          !$OMP END SIMD
       else
          !$OMP SIMD
          !       !$OMP&  aligned(IR,IPHI,IZ)
          do pp=1_idef,pchunk

             IR = INT(FLOOR((Y_R(pp)  - fields_domain%Ro + &
                  0.5_rp*fields_domain%DR)/fields_domain%DR) + 1.0_rp,idef)
             IPHI = INT(FLOOR((Y_PHI(pp)  + 0.5_rp*fields_domain%DPHI)/ &
                  fields_domain%DPHI) + 1.0_rp,idef)
             IZ = INT(FLOOR((Y_Z(pp)  + ABS(fields_domain%Zo) + &
                  0.5_rp*fields_domain%DZ)/fields_domain%DZ) + 1.0_rp,idef)

             if ((fields_domain%FLAG3D(IR,IPHI,IZ).NE.1_is).OR. &
                  ((IR.GT.bfield_3d%NR).OR.(IZ.GT.bfield_3d%NZ))) then
                flag(pp) = 0_is

                !write(output_unit_write,'("YR:",E17.10)') Y_R
                !write(output_unit_write,'("YPHI:",E17.10)') Y_PHI
                !write(output_unit_write,'("YZ:",E17.10)') Y_Z

                !write(output_unit_write,'("IR: ",I16)') IR
                !write(output_unit_write,'("IPHI: ",I16)') IPHI
                !write(output_unit_write,'("IZ: ",I16)') IZ

                !call KORC_ABORT()

             end if

             !write(output_unit_write,'("IPHI: ",I16)') IPHI
             !write(output_unit_write,'("flag: ",I16)') flag(pp)


          end do
          !$OMP END SIMD
       end if
    else if (ALLOCATED(fields_domain%FLAG2D)) then
       !$OMP SIMD
!       !$OMP& aligned(IR,IZ)
       do pp=1_idef,pchunk

          !write(output_unit_write,*) Y_R(pp),Y_Z(pp),fields_domain%Ro,fields_domain%DR,fields_domain%Zo,fields_domain%DZ
          
          IR = INT(FLOOR((Y_R(pp)  - fields_domain%Ro + &
               0.5_rp*fields_domain%DR)/fields_domain%DR) + 1.0_rp,idef)
          IZ = INT(FLOOR((Y_Z(pp)  + ABS(fields_domain%Zo) + &
               0.5_rp*fields_domain%DZ)/fields_domain%DZ) + 1.0_rp,idef)

!          write(output_unit_write,*) pp

!          write(output_unit_write,'("Size of fields_domain R: ",I16)') &
!               size(fields_domain%FLAG2D,1)
!          write(output_unit_write,'("Size of fields_domain Z: ",I16)') &
!               size(fields_domain%FLAG2D,2)   
          
!          if ((IR.lt.0).or.(IZ.lt.0)) then
!             write(output_unit_write,'("YR:",E17.10)') Y_R(pp)
!             write(output_unit_write,'("YZ:",E17.10)') Y_Z(pp)
!             write(output_unit_write,'("IR: ",I16)') IR
!             write(output_unit_write,'("IZ: ",I16)') IZ
!          end if

#if DBG_CHECK    
          if ((IR.lt.1).or.(IZ.lt.1).or.(IR.GT. &
               bfield_2d%NR).OR.(IZ.GT.bfield_2d%NZ)) then
          
             !write(6,'("YR:",E17.10)') Y_R(pp)
             !write(6,'("YZ:",E17.10)') Y_Z(pp)
             !write(6,'("IR: ",I16)') IR
             !write(6,'("IZ: ",I16)') IZ
             !write(6,*) 'NR',bfield_2d%NR
             !write(6,*) 'NZ',bfield_2d%NZ
             !write(6,*) 'FLAG',fields_domain%FLAG2D(IR,IZ)
             !call KORC_ABORT(23)
          end if
#endif
          
          if ((IR.lt.1).or.(IZ.lt.1).or. &
               (IR.GT.bfield_2d%NR).OR.(IZ.GT.bfield_2d%NZ).or. &
               (fields_domain%FLAG2D(IR,IZ).NE.1_is)) then
             if (F%Analytic_IWL.eq.'NONE') then
                flag(pp) = 0_is
             else if (F%Analytic_IWL.eq.'D3D') then
                if ((IR.lt.floor(bfield_2d%NR/6._rp)).and. &
                     (IZ.gt.floor(bfield_2d%NZ/5._rp)).and. &
                     (IZ.lt.floor(4._rp*bfield_2d%NZ/5._rp))) then

                   Rwall=F%circumradius*cos(C_PI/F%ntiles)/ &
                        (cos((mod(Y_PHI(pp),2*C_PI/F%ntiles))-C_PI/F%ntiles))
                   if (Y_R(pp).lt.Rwall) flag(pp) = 0_is

                else
                   flag(pp) = 0_is
                endif
             endif

!             write(output_unit_write,'("Shit''s fucked.")')
          end if
       end do      
       !$OMP END SIMD
!       write(output_unit_write,'("Shit''s not fucked.")')
    end if
  end subroutine check_if_in_fields_domain_p