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 implicit none
46 private
47
49 type, public, extends(mapping_t) :: linear_mapping_t
51 real(kind=rp) :: f_min
53 real(kind=rp) :: f_max
54
55 contains
57 procedure, pass(this) :: init => linear_mapping_init_from_json
59 procedure, pass(this) :: init_from_attributes => &
60 linear_mapping_init_from_attributes
62 procedure, pass(this) :: free => linear_mapping_free
64 procedure, pass(this) :: forward_mapping => linear_forward_mapping
66 procedure, pass(this) :: backward_mapping => &
67 linear_backward_mapping
68 end type linear_mapping_t
69
70contains
71
73 subroutine linear_mapping_init_from_json(this, json, coef)
74 class(linear_mapping_t), intent(inout) :: this
75 type(json_file), intent(inout) :: json
76 type(coef_t), intent(inout) :: coef
77 real(kind=rp) :: f_min, f_max
78
79 call json_get_or_default(json, 'f_min', f_min, 0.0_rp)
80 call json_get(json, 'f_max', f_max)
81
82 call this%init_base(json, coef)
83 call linear_mapping_init_from_attributes(this, coef, f_min, f_max)
84
86
88 subroutine linear_mapping_init_from_attributes(this, coef, f_min, f_max)
89 class(linear_mapping_t), intent(inout) :: this
90 type(coef_t), intent(inout) :: coef
91 real(kind=rp), intent(in) :: f_min, f_max
92
93 this%f_min = f_min
94 this%f_max = f_max
95
96 end subroutine linear_mapping_init_from_attributes
97
99 subroutine linear_mapping_free(this)
100 class(linear_mapping_t), intent(inout) :: this
101
102 call this%free_base()
103
104 end subroutine linear_mapping_free
105
110 subroutine linear_forward_mapping(this, X_out, X_in)
111 class(linear_mapping_t), intent(inout) :: this
112 type(field_t), intent(in) :: X_in
113 type(field_t), intent(inout) :: X_out
114
115 ! x_out = f_min + (f_max - f_min) * x_in
116 call field_copy(x_out, x_in)
117 call field_cmult(x_out, this%f_max - this%f_min)
118 call field_cadd(x_out, this%f_min)
119
120 end subroutine linear_forward_mapping
121
122
128 subroutine linear_backward_mapping(this, sens_out, sens_in, X_in)
129 class(linear_mapping_t), intent(inout) :: this
130 type(field_t), intent(in) :: X_in
131 type(field_t), intent(in) :: sens_in
132 type(field_t), intent(inout) :: sens_out
133
134 ! df/dx_in = df/dx_out * dx_out/dx_in
135
136 ! dx_out/dx_in = (f_max - f_min)
137
138 call field_copy(sens_out, sens_in)
139 call field_cmult(sens_out, this%f_max - this%f_min)
140
141 end subroutine linear_backward_mapping
142
143end module linear_mapping
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