sGrid_find_elem Function

private function sGrid_find_elem(sf, x) result(iElem)

find grid cell for certain position

Type Bound

t_sGrid

Arguments

Type IntentOptional Attributes Name
class(t_sGrid), intent(in) :: sf

self

real(kind=wp), intent(in) :: x

Return Value integer


Called by

proc~~sgrid_find_elem~~CalledByGraph proc~sgrid_find_elem t_sGrid%sGrid_find_elem proc~sbase_eval t_sBase%sBase_eval proc~sbase_eval->proc~sgrid_find_elem proc~sgrid_test sGrid_test proc~sgrid_test->proc~sgrid_find_elem proc~sgrid_init t_sGrid%sGrid_init proc~sgrid_test->proc~sgrid_init proc~sbase_evaldof2d_s t_sBase%sBase_evalDOF2D_s proc~sbase_evaldof2d_s->proc~sbase_eval proc~sbase_evaldof_s t_sBase%sBase_evalDOF_s proc~sbase_evaldof_s->proc~sbase_eval proc~sbase_test sBase_test proc~sbase_test->proc~sbase_eval proc~sbase_test->proc~sbase_evaldof_s proc~sbase_new sBase_new proc~sbase_test->proc~sbase_new proc~sgrid_init->proc~sgrid_test proc~base_evaldof_x t_base%base_evalDOF_x proc~base_evaldof_x->proc~sbase_evaldof_s proc~buildtransform_sfl t_transform_sfl%BuildTransform_SFL proc~buildtransform_sfl->proc~sbase_evaldof2d_s proc~get_boozer_sinterp t_sfl_boozer%Get_Boozer_sinterp proc~buildtransform_sfl->proc~get_boozer_sinterp proc~transform_angles_3d Transform_Angles_3d proc~buildtransform_sfl->proc~transform_angles_3d proc~transform_angles_sinterp Transform_Angles_sinterp proc~buildtransform_sfl->proc~transform_angles_sinterp proc~eval_prof_r eval_prof_r proc~eval_prof_r->proc~sbase_evaldof_s proc~evaluate_base_list_stz_all evaluate_base_list_stz_all proc~evaluate_base_list_stz_all->proc~sbase_evaldof2d_s proc~evaluate_base_list_tz evaluate_base_list_tz proc~evaluate_base_list_tz->proc~sbase_evaldof2d_s proc~evaluate_base_list_tz_all evaluate_base_list_tz_all proc~evaluate_base_list_tz_all->proc~sbase_evaldof2d_s proc~evaluate_base_tens evaluate_base_tens proc~evaluate_base_tens->proc~sbase_evaldof2d_s proc~evaluate_base_tens_all evaluate_base_tens_all proc~evaluate_base_tens_all->proc~sbase_evaldof2d_s proc~find_pest_angles_2d find_pest_angles_2D proc~find_pest_angles_2d->proc~sbase_evaldof2d_s proc~get_boozer_sinterp->proc~sbase_evaldof2d_s proc~get_field Get_Field proc~get_field->proc~sbase_evaldof2d_s proc~get_field->proc~sbase_evaldof_s proc~gvec_to_jorek_prepare gvec_to_jorek_prepare proc~gvec_to_jorek_prepare->proc~sbase_evaldof2d_s proc~gvec_to_jorek_prepare->proc~sbase_evaldof_s proc~gvec_to_jorek_prepare->proc~get_field proc~initmhd3d t_functional_mhd3d%InitMHD3D proc~initmhd3d->proc~sgrid_init proc~base_new Base_new proc~initmhd3d->proc~base_new proc~lambda_solve Lambda_solve proc~lambda_solve->proc~sbase_evaldof_s proc~readstatefilefromascii ReadStateFileFromASCII proc~readstatefilefromascii->proc~sbase_evaldof_s proc~readstatefilefromascii->proc~sgrid_init proc~readstatefilefromascii->proc~sbase_new proc~readstatefilefromascii->proc~base_new proc~sbase_init t_sBase%sBase_init proc~sbase_init->proc~sbase_test proc~sgrid_copy t_sGrid%sGrid_copy proc~sgrid_copy->proc~sgrid_init proc~transform_angles_3d->proc~sbase_evaldof2d_s proc~transform_angles_sinterp->proc~sbase_evaldof2d_s interface~readstate ReadState interface~readstate->proc~readstatefilefromascii proc~eval_iota_r eval_iota_r proc~eval_iota_r->proc~eval_prof_r proc~eval_phi_r eval_phi_r proc~eval_phi_r->proc~eval_prof_r proc~eval_phiprime_r eval_phiPrime_r proc~eval_phiprime_r->proc~eval_prof_r proc~eval_pres_r eval_pres_r proc~eval_pres_r->proc~eval_prof_r proc~get_boozer get_boozer proc~get_boozer->proc~get_boozer_sinterp proc~init Init proc~init->proc~initmhd3d proc~init_la_from_solution Init_LA_from_Solution proc~init_la_from_solution->proc~lambda_solve proc~rungvec rungvec proc~rungvec->proc~initmhd3d proc~initsolutionmhd3d t_functional_mhd3d%InitSolutionMHD3D proc~rungvec->proc~initsolutionmhd3d proc~sbase_copy t_sBase%sBase_copy proc~sbase_copy->proc~sbase_init proc~sbase_new->proc~sbase_init proc~transform_sfl_new transform_sfl_new proc~transform_sfl_new->proc~sgrid_copy proc~transform_sfl_init t_transform_sfl%transform_SFL_init proc~transform_sfl_new->proc~transform_sfl_init program~gvec_post GVEC_POST program~gvec_post->proc~initmhd3d proc~base_copy t_base%base_copy proc~base_copy->proc~sbase_copy proc~base_new->proc~sbase_new proc~init_gvec_to_jorek init_gvec_to_jorek proc~init_gvec_to_jorek->interface~readstate proc~init_base Init_Base proc~init_gvec_to_jorek->proc~init_base proc~initsolutionmhd3d->proc~init_la_from_solution proc~restartfromstate RestartFromState proc~restartfromstate->interface~readstate proc~start_rungvec start_rungvec proc~start_rungvec->proc~rungvec program~gvec GVEC program~gvec->proc~rungvec proc~init_base->proc~base_new proc~initsolution InitSolution proc~initsolution->proc~initsolutionmhd3d proc~transform_sfl_init->proc~base_new

Source Code

FUNCTION sGrid_find_elem( sf , x) RESULT(iElem)
! MODULES
IMPLICIT NONE
!-----------------------------------------------------------------------------------------------------------------------------------
! INPUT VARIABLES
  CLASS(t_sgrid), INTENT(IN   ) :: sf !! self
  REAL(wp)      , INTENT(IN   ) :: x
!-----------------------------------------------------------------------------------------------------------------------------------
! OUTPUT VARIABLES
  INTEGER                       :: iElem
!-----------------------------------------------------------------------------------------------------------------------------------
! LOCAL VARIABLES
  INTEGER  :: low,high
  REAL(wp) :: xloc
!===================================================================================================================================
  iElem=1
  xloc=MIN(1.0_wp,MAX(0.0_wp,x))
  IF(xloc.LT.(sf%sp(0)+sf%ds(1))) THEN
    iElem=1
    RETURN
  END IF
  IF(xloc.GE.(sf%sp(sf%nElems)-sf%ds(sf%nElems))) THEN
    iElem=sf%nElems
    RETURN
  END IF

  SELECT CASE(sf%grid_type)
  CASE(GRID_TYPE_UNIFORM)
    iElem=CEILING(xloc*sf%nElems)
    RETURN
  CASE(GRID_TYPE_S2)   !finer at the center
    iElem=CEILING(SQRT(xloc)*sf%nElems)
    RETURN
  CASE(GRID_TYPE_SQRT_S) !finer at the edge
    iElem=CEILING((xloc**2)*sf%nElems)
    RETURN
  END SELECT

  !not efficient, bisection of sp  array is better!!
  !DO jElem=2,sf%nElems
  !  IF((xloc.GE.sf%sp(iElem-1)).AND.(xloc.LT.sf%sp(jElem)))THEN
  !    iElem=jElem
  !    EXIT
  !  END IF
  !END DO

  !bisection
  low   = 1
  high  = sf%nElems-1
  iElem = (low + high) / 2 +1
  DO WHILE ( (xloc .LT.  sf%sp(iElem-1)) .OR. (xloc .GE. sf%sp(iElem)) )
     IF (xloc .LT. sf%sp(iElem-1)) THEN
       high = iElem-1
     ELSE
       low  = iElem
     END IF
     iElem = (low + high) / 2+1
  END DO



END FUNCTION sGrid_find_elem