37 use num_types,
only: rp
39 use json_module,
only: json_file
40 use field,
only: field_t
41 use coefs,
only: coef_t
42 use neko_config,
only: neko_bcknd_device
43 use device_ramp_mapping,
only: device_convex_down_ramp_mapping_apply, &
44 device_convex_down_ramp_mapping_apply_backward, &
45 device_convex_up_ramp_mapping_apply, &
46 device_convex_up_ramp_mapping_apply_backward
51 use json_utils,
only: json_get, json_get_or_default
52 use logger,
only: neko_log
86 real(kind=rp) :: f_min
88 real(kind=rp) :: f_max
99 procedure, pass(this) :: init_from_attributes => &
100 ramp_mapping_init_from_attributes
102 procedure, pass(this) :: free => ramp_mapping_free
104 procedure, pass(this) :: forward_mapping => ramp_forward_mapping
106 procedure, pass(this) :: backward_mapping => ramp_backward_mapping
114 type(json_file),
intent(inout) :: json
115 type(coef_t),
intent(inout) :: coef
116 real(kind=rp) :: f_min, f_max, q
119 call json_get_or_default(json,
'f_min', f_min, 0.0_rp)
120 call json_get(json,
'f_max', f_max)
121 call json_get_or_default(json,
'q', q, 1.0_rp)
122 call json_get_or_default(json,
'convex_up', convex_up, .false.)
124 call this%init_base(json, coef)
125 call this%init_from_attributes(coef, f_min, f_max, q, &
131 subroutine ramp_mapping_init_from_attributes(this, coef, f_min, f_max, q, &
134 type(coef_t),
intent(inout) :: coef
135 real(kind=rp),
intent(in) :: f_min, f_max, q
136 logical,
intent(in) :: convex_up
137 character(len=256) :: msg
142 this%convex_up = convex_up
144 call neko_log%section(
'RAMP Mapping')
145 write(msg,
'(A,F8.4)')
' f_min: ', this%f_min
146 call neko_log%message(msg)
147 write(msg,
'(A,F8.4)')
' f_max: ', this%f_max
148 call neko_log%message(msg)
149 write(msg,
'(A,F8.4)')
' q: ', this%q
150 call neko_log%message(msg)
151 if (this%convex_up .eqv. .true.)
then
152 call neko_log%message(
' convexity: up (Borrvall & Peterson)')
154 call neko_log%message(
' convexity: down (standard RAMP)')
156 call neko_log%end_section()
158 end subroutine ramp_mapping_init_from_attributes
161 subroutine ramp_mapping_free(this)
164 call this%free_base()
166 end subroutine ramp_mapping_free
172 subroutine ramp_forward_mapping(this, X_out, X_in)
174 type(field_t),
intent(in) :: X_in
175 type(field_t),
intent(inout) :: X_out
177 if (this%convex_up .eqv. .true.)
then
178 call convex_up_ramp_mapping_apply(this%f_min, this%f_max, &
181 call convex_down_ramp_mapping_apply(this%f_min, this%f_max, &
185 end subroutine ramp_forward_mapping
193 subroutine ramp_backward_mapping(this, sens_out, sens_in, X_in)
195 type(field_t),
intent(in) :: X_in
196 type(field_t),
intent(in) :: sens_in
197 type(field_t),
intent(inout) :: sens_out
199 if (this%convex_up .eqv. .true.)
then
200 call convex_up_ramp_mapping_apply_backward(this%f_min, this%f_max, &
201 this%q, sens_out, sens_in, x_in)
203 call convex_down_ramp_mapping_apply_backward(this%f_min, this%f_max, &
204 this%q, sens_out, sens_in, x_in)
207 end subroutine ramp_backward_mapping
215 subroutine convex_down_ramp_mapping_apply(f_min, f_max, q, X_out, X_in)
216 real(kind=rp),
intent(in) :: q, f_min, f_max
217 type(field_t),
intent(in) :: x_in
218 type(field_t),
intent(inout) :: X_out
224 if (neko_bcknd_device .eq. 1)
then
225 call device_convex_down_ramp_mapping_apply(f_min, f_max, q, &
226 x_out%x_d, x_in%x_d, n)
232 end subroutine convex_down_ramp_mapping_apply
242 subroutine convex_down_ramp_mapping_apply_backward(f_min, f_max, q, &
243 sens_out, sens_in, X_in)
244 real(kind=rp),
intent(in) :: f_min, f_max, q
245 type(field_t),
intent(in) :: x_in
246 type(field_t),
intent(in) :: sens_in
247 type(field_t),
intent(inout) :: sens_out
256 if (neko_bcknd_device .eq. 1)
then
257 call device_convex_down_ramp_mapping_apply_backward(f_min, f_max, q, &
258 sens_out%x_d, sens_in%x_d, x_in%x_d, n)
261 sens_out%x, sens_in%x, x_in%x, n)
264 end subroutine convex_down_ramp_mapping_apply_backward
272 subroutine convex_up_ramp_mapping_apply(f_min, f_max, q, X_out, X_in)
273 real(kind=rp),
intent(in) :: f_min, f_max, q
274 type(field_t),
intent(in) :: x_in
275 type(field_t),
intent(inout) :: X_out
282 if (neko_bcknd_device .eq. 1)
then
283 call device_convex_up_ramp_mapping_apply(f_min, f_max, q, &
284 x_out%x_d, x_in%x_d, n)
291 end subroutine convex_up_ramp_mapping_apply
301 subroutine convex_up_ramp_mapping_apply_backward(f_min, f_max, q, &
302 sens_out, sens_in, X_in)
303 real(kind=rp),
intent(in) :: f_min, f_max, q
304 type(field_t),
intent(in) :: x_in
305 type(field_t),
intent(in) :: sens_in
306 type(field_t),
intent(inout) :: sens_out
315 if (neko_bcknd_device .eq. 1)
then
316 call device_convex_up_ramp_mapping_apply_backward(f_min, f_max, q, &
317 sens_out%x_d, sens_in%x_d, x_in%x_d, n)
320 sens_out%x, sens_in%x, x_in%x, n)
323 end subroutine convex_up_ramp_mapping_apply_backward
Mappings to be applied to a scalar field.
CPU backend for RAMP mapping operations.
subroutine, public convex_down_ramp_mapping_apply_backward_cpu(f_min, f_max, q, sens_out, sens_in, x_in, n)
Apply convex-down RAMP chain rule on CPU.
subroutine, public convex_up_ramp_mapping_apply_backward_cpu(f_min, f_max, q, sens_out, sens_in, x_in, n)
Apply convex-up RAMP chain rule on CPU.
subroutine, public convex_up_ramp_mapping_apply_cpu(f_min, f_max, q, x_out, x_in, n)
Apply convex-up RAMP forward mapping on CPU.
subroutine, public convex_down_ramp_mapping_apply_cpu(f_min, f_max, q, x_out, x_in, n)
Apply convex-down RAMP forward mapping on CPU.
A RAMP mapping of coefficients.
subroutine ramp_mapping_init_from_json(this, json, coef)
Constructor from json.
Base abstract class for mapping.
A RAMP mapping of coefficients This is the standard RAMP described in https://doi....