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_heaviside_mapping,
only: &
44 device_heaviside_mapping_apply, &
45 device_heaviside_mapping_apply_backward
49 use json_utils,
only: json_get_or_default
50 use utils,
only: neko_error
75 procedure, pass(this) :: init_from_attributes => &
76 heaviside_mapping_init_from_attributes
78 procedure, pass(this) :: free => heaviside_mapping_free
80 procedure, pass(this) :: forward_mapping => heaviside_mapping_forward
82 procedure, pass(this) :: backward_mapping => heaviside_mapping_backward
90 type(json_file),
intent(inout) :: json
91 type(coef_t),
intent(inout) :: coef
92 real(kind=rp) :: eta, beta
94 call json_get_or_default(json,
'eta', eta, 0.5_rp)
96 call nekotop_continuation%json_get_or_register(json,
'beta', this%beta, &
100 call this%init_base(json, coef,
"heaviside_mapping")
101 call this%init_from_attributes(coef, beta, eta)
105 subroutine heaviside_mapping_init_from_attributes(this, coef, beta, eta)
107 type(coef_t),
intent(inout) :: coef
108 real(kind=rp),
intent(in) :: beta
109 real(kind=rp),
intent(in) :: eta
111 if (beta .le. 0.0_rp)
then
112 call neko_error(
'"beta" must be > 0 in heaviside mapping')
115 if (eta .lt. 0.0_rp .or. eta .gt. 1.0_rp)
then
116 call neko_error(
'"eta" must be in [0, 1] in heaviside mapping')
121 end subroutine heaviside_mapping_init_from_attributes
124 subroutine heaviside_mapping_free(this)
127 call this%free_base()
128 end subroutine heaviside_mapping_free
131 subroutine heaviside_mapping_forward(this, X_out, X_in)
133 type(field_t),
intent(in) :: X_in
134 type(field_t),
intent(inout) :: X_out
135 call heaviside_mapping_apply(this%beta, this%eta, x_out, x_in)
136 end subroutine heaviside_mapping_forward
139 subroutine heaviside_mapping_backward(this, sens_out, sens_in, X_in)
141 type(field_t),
intent(in) :: X_in
142 type(field_t),
intent(in) :: sens_in
143 type(field_t),
intent(inout) :: sens_out
144 call heaviside_mapping_apply_backward(this%beta, this%eta, &
145 sens_out, sens_in, x_in)
146 end subroutine heaviside_mapping_backward
153 subroutine heaviside_mapping_apply(beta, eta, X_out, X_in)
154 real(kind=rp),
intent(in) :: beta, eta
155 type(field_t),
intent(in) :: x_in
156 type(field_t),
intent(inout) :: X_out
158 real(kind=rp) :: den, beta_eta
160 beta_eta = beta * eta
161 den = tanh(beta_eta) + tanh(beta * (1.0_rp - eta))
163 if (abs(den) .le. tiny(den))
then
164 call neko_error(
'invalid denominator in heaviside mapping')
168 if (neko_bcknd_device .eq. 1)
then
169 call device_heaviside_mapping_apply(beta, eta, &
170 x_out%x_d, x_in%x_d, n)
175 end subroutine heaviside_mapping_apply
183 subroutine heaviside_mapping_apply_backward(beta, eta, sens_out, sens_in, &
185 real(kind=rp),
intent(in) :: beta, eta
186 type(field_t),
intent(in) :: x_in
187 type(field_t),
intent(in) :: sens_in
188 type(field_t),
intent(inout) :: sens_out
190 real(kind=rp) :: den, beta_eta
192 beta_eta = beta * eta
193 den = tanh(beta_eta) + tanh(beta * (1.0_rp - eta))
195 if (abs(den) .le. tiny(den))
then
196 call neko_error(
'invalid denominator in heaviside mapping')
200 if (neko_bcknd_device .eq. 1)
then
201 call device_heaviside_mapping_apply_backward(beta, eta, &
202 sens_out%x_d, sens_in%x_d, x_in%x_d, n)
205 sens_out%x, sens_in%x, x_in%x, n)
207 end subroutine heaviside_mapping_apply_backward
Continuation scheduler for the optimization loop.
CPU backend for smooth Heaviside mapping operations.
subroutine, public heaviside_mapping_apply_cpu(beta, eta, x_out, x_in, n)
Apply smooth Heaviside mapping on CPU.
subroutine, public heaviside_mapping_apply_backward_cpu(beta, eta, sens_out, sens_in, x_in, n)
Apply smooth Heaviside mapping chain rule on CPU.
Smooth Heaviside mapping.
subroutine heaviside_mapping_init_from_json(this, json, coef)
Constructor from json.
Mappings to be applied to a scalar field.
Smooth Heaviside mapping.
Base abstract class for mapping.