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 = 1,
size(this%mapping_cascade)
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.