Neko-TOP
A portable framework for high-order spectral element flow toplogy optimization.
Loading...
Searching...
No Matches
linear_mapping.f90
Go to the documentation of this file.
1
34!
37 use num_types, only: rp
38 use field_math, only: field_copy, field_cmult, field_cadd
39 use mapping, only: mapping_t
40 use num_types, only: rp
41 use json_module, only: json_file
42 use field, only: field_t
43 use coefs, only: coef_t
44 use json_utils, only: json_get, json_get_or_default
45 use continuation_scheduler, only: nekotop_continuation
46 implicit none
47 private
48
50 type, public, extends(mapping_t) :: linear_mapping_t
52 real(kind=rp) :: f_min
54 real(kind=rp) :: f_max
55
56 contains
58 procedure, pass(this) :: init => linear_mapping_init_from_json
60 procedure, pass(this) :: init_from_attributes => &
61 linear_mapping_init_from_attributes
63 procedure, pass(this) :: free => linear_mapping_free
65 procedure, pass(this) :: forward_mapping => linear_forward_mapping
67 procedure, pass(this) :: backward_mapping => &
68 linear_backward_mapping
69 end type linear_mapping_t
70
71contains
72
74 subroutine linear_mapping_init_from_json(this, json, coef)
75 class(linear_mapping_t), intent(inout) :: this
76 type(json_file), intent(inout) :: json
77 type(coef_t), intent(inout) :: coef
78 real(kind=rp) :: f_min, f_max
79
80 call json_get_or_default(json, 'f_min', f_min, 0.0_rp)
81 call nekotop_continuation%json_get_or_register(json, 'f_max', this%f_max, &
82 f_max)
83
84 call this%init_base(json, coef, "linear_mapping")
85 call linear_mapping_init_from_attributes(this, coef, f_min, f_max)
86
88
90 subroutine linear_mapping_init_from_attributes(this, coef, f_min, f_max)
91 class(linear_mapping_t), intent(inout) :: this
92 type(coef_t), intent(inout) :: coef
93 real(kind=rp), intent(in) :: f_min, f_max
94
95 this%f_min = f_min
96 this%f_max = f_max
97
98 end subroutine linear_mapping_init_from_attributes
99
101 subroutine linear_mapping_free(this)
102 class(linear_mapping_t), intent(inout) :: this
103
104 call this%free_base()
105
106 end subroutine linear_mapping_free
107
112 subroutine linear_forward_mapping(this, X_out, X_in)
113 class(linear_mapping_t), intent(inout) :: this
114 type(field_t), intent(in) :: X_in
115 type(field_t), intent(inout) :: X_out
116
117 ! x_out = f_min + (f_max - f_min) * x_in
118 call field_copy(x_out, x_in)
119 call field_cmult(x_out, this%f_max - this%f_min)
120 call field_cadd(x_out, this%f_min)
121
122 end subroutine linear_forward_mapping
123
124
130 subroutine linear_backward_mapping(this, sens_out, sens_in, X_in)
131 class(linear_mapping_t), intent(inout) :: this
132 type(field_t), intent(in) :: X_in
133 type(field_t), intent(in) :: sens_in
134 type(field_t), intent(inout) :: sens_out
135
136 ! df/dx_in = df/dx_out * dx_out/dx_in
137
138 ! dx_out/dx_in = (f_max - f_min)
139
140 call field_copy(sens_out, sens_in)
141 call field_cmult(sens_out, this%f_max - this%f_min)
142
143 end subroutine linear_backward_mapping
144
145end module linear_mapping
Continuation scheduler for the optimization loop.
A linear mapping of coefficients.
subroutine linear_mapping_init_from_json(this, json, coef)
Constructor from json.
Mappings to be applied to a scalar field.
Definition mapping.f90:36
A linear mapping of coefficients $f(x) = f_{min} + (f_{max} - f_{min}) x$.
Base abstract class for mapping.
Definition mapping.f90:46