36  use neko_config, 
only: neko_bcknd_device
 
   37  use num_types, 
only: rp
 
   40  use field, 
only: field_t
 
   41  use field_list, 
only: field_list_t
 
   42  use json_utils, 
only: json_get, json_extract_item, json_get_or_default
 
   43  use json_module, 
only: json_file
 
   44  use coefs, 
only: coef_t
 
   45  use user_intf, 
only: user_t
 
   46  use field_math, 
only: field_rzero, field_copy
 
   48  use device_math, 
only: device_col2
 
   49  use scratch_registry, 
only: neko_scratch_registry
 
   50  use utils, 
only: neko_warning
 
   66     type(field_list_t) :: rhs_fields
 
   68     type(coef_t), 
pointer :: coef
 
   72     procedure, pass(this) :: init_base => mapping_handler_init_base
 
   74     procedure, pass(this) :: free => mapping_handler_free
 
   76     procedure, pass(this) :: apply_forward => mapping_handler_apply_forward
 
   79     procedure, pass(this) :: apply_backward => mapping_handler_apply_backward
 
   81     generic :: add => add_mapping, add_json_mappings
 
   83     procedure, pass(this) :: add_mapping => &
 
   84          mapping_handler_add_mapping
 
   86     procedure, pass(this) :: add_json_mappings => &
 
   87          mapping_handler_add_json_mappings
 
 
   93  subroutine mapping_handler_init_base(this, coef)
 
   95    type(coef_t), 
target, 
intent(in) :: coef
 
 
  101  end subroutine mapping_handler_init_base
 
  105  subroutine mapping_handler_free(this)
 
  109    if (
allocated(this%mapping_cascade)) 
then 
  110       do i = 1, 
size(this%mapping_cascade)
 
  111          call this%mapping_cascade(i)%free()
 
  113       deallocate(this%mapping_cascade)
 
  116  end subroutine mapping_handler_free
 
  122  subroutine mapping_handler_apply_forward(this, X_out, X_in)
 
  124    type(field_t), 
intent(in) :: X_in
 
  125    type(field_t), 
intent(inout) :: X_out
 
  127    type(field_t), 
pointer :: tmp_fld_in, tmp_fld_out
 
  128    integer :: temp_indices(2)
 
  130    call neko_scratch_registry%request_field(tmp_fld_in, temp_indices(1))
 
  131    call neko_scratch_registry%request_field(tmp_fld_out, temp_indices(2))
 
  135    call field_copy(tmp_fld_out, x_in)
 
  138    if (
allocated(this%mapping_cascade)) 
then 
  139       do i = 1, 
size(this%mapping_cascade)
 
  141          call field_copy(tmp_fld_in, tmp_fld_out)
 
  143          call this%mapping_cascade(i)%mapping%apply_forward(tmp_fld_out, &
 
  151    call field_copy(x_out, tmp_fld_out)
 
  154    call neko_scratch_registry%relinquish_field(temp_indices)
 
  156  end subroutine mapping_handler_apply_forward
 
  164  subroutine mapping_handler_apply_backward(this, sens_out, sens_in)
 
  166    type(field_t), 
intent(inout) :: sens_out
 
  167    type(field_t), 
intent(in) :: sens_in
 
  169    type(field_t), 
pointer :: tmp_fld_in, tmp_fld_out
 
  170    integer :: temp_indices(2)
 
  172    call neko_scratch_registry%request_field(tmp_fld_in, temp_indices(1))
 
  173    call neko_scratch_registry%request_field(tmp_fld_out, temp_indices(2))
 
  177    call field_copy(tmp_fld_out, sens_in)
 
  180    if (
allocated(this%mapping_cascade)) 
then 
  181       do i = 
size(this%mapping_cascade), 1, -1
 
  183          call field_copy(tmp_fld_in, tmp_fld_out)
 
  188          call this%mapping_cascade(i)%mapping%apply_backward(tmp_fld_out, &
 
  196    call field_copy(sens_out, tmp_fld_out)
 
  199    call neko_scratch_registry%relinquish_field(temp_indices)
 
  202  end subroutine mapping_handler_apply_backward
 
  205  subroutine mapping_handler_add_json_mappings(this, json, name)
 
  207    type(json_file), 
intent(inout) :: json
 
  208    character(len=*), 
intent(in) :: name
 
  213    type(json_file) :: mapping_subdict
 
  214    integer :: n_mappings, i, i0
 
  216    if (json%valid_path(name)) 
then 
  218       call json%info(name, n_children = n_mappings)
 
  220       if (
allocated(this%mapping_cascade)) 
then 
  221          i0 = 
size(this%mapping_cascade)
 
  222          call move_alloc(this%mapping_cascade, temp)
 
  223          allocate(this%mapping_cascade(i0 + n_mappings))
 
  224          if (
allocated(temp)) 
then 
  226                call move_alloc(temp(i)%mapping, &
 
  227                     this%mapping_cascade(i)%mapping)
 
  232          allocate(this%mapping_cascade(n_mappings))
 
  237          call json_extract_item(json, name, i, mapping_subdict)
 
  239               mapping_subdict, this%coef)
 
  243       call neko_warning(
"No mappings selected")
 
  246  end subroutine mapping_handler_add_json_mappings
 
  251  subroutine mapping_handler_add_mapping(this, mapping)
 
  256    integer :: n_mappings, i
 
  258    if (
allocated(this%mapping_cascade)) 
then 
  259       n_mappings = 
size(this%mapping_cascade)
 
  264    call move_alloc(this%mapping_cascade, temp)
 
  265    allocate(this%mapping_cascade(n_mappings + 1))
 
  267    if (
allocated(temp)) 
then 
  269          call move_alloc(temp(i)%mapping, this%mapping_cascade(i)%mapping)
 
  273    this%mapping_cascade(n_mappings + 1)%mapping = 
mapping 
  275  end subroutine mapping_handler_add_mapping
 
mapping factory. Both constructs and initializes the object.
 
Implements the mapping_handler_t type.
 
Mappings to be applied to a scalar field.
 
Base abstract class for mapping.
 
A helper type that is needed to have an array of polymorphic objects.
 
Abstract class for handling mapping_cascade.