82    type(json_file), 
intent(inout) :: json
 
   83    integer, 
intent(in) :: size
 
   86    type(json_core) :: core
 
   88    type(json_value), 
pointer :: source_object, source_pointer
 
   90    character(len=:), 
allocatable :: buffer
 
   92    type(json_file) :: source_subdict
 
   93    character(len=:), 
allocatable :: type_name
 
   94    character(len=:), 
allocatable :: type_string
 
   96    character(len=:), 
allocatable :: str_read
 
   97    integer :: i, n_zones, i_internal, i_external
 
   98    logical :: found, invert
 
  100    call json_get(json, 
"name", str_read)
 
  102    call this%init_base(
size, trim(str_read), invert)
 
  104    call json%get_core(core)
 
  105    call json%get(
'subsets', source_object, found)
 
  107    if (.not. found) 
call neko_error(
"No subsets found")
 
  109    this%n_zones = core%count(source_object)
 
  112    if (this%n_zones .gt. 0) 
then 
  113       allocate(this%zones(this%n_zones))
 
  118    do i = 1, this%n_zones
 
  120       call core%get_child(source_object, i, source_pointer, found)
 
  121       call core%print_to_string(source_pointer, buffer)
 
  122       call source_subdict%load_from_string(buffer)
 
  124       if (.not. source_subdict%valid_path(
"geometry")) 
then 
  125          this%n_external_zones = this%n_external_zones + 1
 
  129    this%n_internal_zones = this%n_zones - this%n_external_zones
 
  130    if (this%n_external_zones .gt. 0) &
 
  131         allocate(this%names(this%n_external_zones))
 
  132    if (this%n_internal_zones .gt. 0) &
 
  133         allocate(this%internal_zones(this%n_internal_zones))
 
  140    do i = 1, this%n_zones
 
  143       call core%get_child(source_object, i, source_pointer, found)
 
  144       call core%print_to_string(source_pointer, buffer)
 
  145       call source_subdict%load_from_string(buffer)
 
  147       if (source_subdict%valid_path(
"geometry")) 
then 
  148          call point_zone_factory(this%internal_zones(i_internal)%pz, &
 
  151               this%internal_zones(i_internal)%pz)
 
  152          i_internal = i_internal + 1
 
  154          call json_get(source_subdict, 
"name", type_name)
 
  155          this%names(i_external) = trim(type_name)
 
  156          i_external = i_external + 1
 
  162    call json_get(json, 
"operator", this%operator)
 
  163    select case (trim(this%operator))
 
  168       call neko_error(
"Unknown operator " // trim(this%operator))
 
 
  222    real(kind=
rp), 
intent(in) :: x
 
  223    real(kind=
rp), 
intent(in) :: y
 
  224    real(kind=
rp), 
intent(in) :: z
 
  225    integer, 
intent(in) :: j
 
  226    integer, 
intent(in) :: k
 
  227    integer, 
intent(in) :: l
 
  228    integer, 
intent(in) :: e
 
  233    is_inside = this%zones(1)%pz%criterion(x, &
 
  234               y, z, j, k, l, e) .neqv. this%zones(1)%pz%invert
 
  236    do i = 2, this%n_zones
 
  237       select case (trim(this%operator))
 
  239          is_inside = is_inside .or. (this%zones(i)%pz%criterion(x, &
 
  240               y, z, j, k, l, e) .neqv. this%zones(i)%pz%invert)
 
  243          is_inside = is_inside .and. (this%zones(i)%pz%criterion(x, &
 
  244               y, z, j, k, l, e) .neqv. this%zones(i)%pz%invert)
 
  247          is_inside = is_inside .neqv. (this%zones(i)%pz%criterion(x, &
 
  248               y, z, j, k, l, e).neqv. this%zones(i)%pz%invert)
 
 
pure logical function combine_point_zone_criterion(this, x, y, z, j, k, l, e)
Defines the criterion of selection of a GLL point in the combined point zone.
 
character(:) function, allocatable, public concat_string_array(array, sep, prepend)
Concatenate an array of strings into one string with array items separated by spaces.