38 use flow_profile,
only : blasius_profile, blasius_linear, blasius_cubic, &
65 type(field_t),
intent(inout) :: u_adj
66 type(field_t),
intent(inout) :: v_adj
67 type(field_t),
intent(inout) :: w_adj
68 type(field_t),
intent(inout) :: p_adj
69 type(coef_t),
intent(in) :: coef
70 type(gs_t),
intent(inout) :: gs
71 character(len=*) :: type
72 type(json_file),
intent(inout) :: params
73 real(kind=rp) :: delta
74 real(kind=rp),
allocatable :: uinf(:)
75 real(kind=rp),
allocatable :: zone_value(:)
76 character(len=:),
allocatable :: blasius_approximation
77 character(len=:),
allocatable :: zone_name
79 character(len=:),
allocatable :: type_
80 call json_get(params,
'type', type_)
82 if (trim(type_) .eq.
'uniform')
then
83 call json_get(params,
'value', uinf)
85 else if (trim(type_) .eq.
'blasius')
then
86 call json_get(params,
'blasius.delta', delta)
87 call json_get(params,
'blasius.approximation', &
88 blasius_approximation)
89 call json_get(params,
'blasius.freestream_velocity', uinf)
91 blasius_approximation)
92 else if (trim(type_) .eq.
'point_zone')
then
93 call json_get(params,
'base_value', uinf)
94 call json_get(params,
'zone_name', &
96 call json_get(params,
'zone_value', &
99 zone_name, zone_value)
101 call neko_error(
'Invalid initial condition')
111 type(field_t),
intent(inout) :: u_adj
112 type(field_t),
intent(inout) :: v_adj
113 type(field_t),
intent(inout) :: w_adj
114 type(field_t),
intent(inout) :: p_adj
115 type(coef_t),
intent(in) :: coef
116 type(gs_t),
intent(inout) :: gs
117 procedure(useric) :: usr_ic
118 type(json_file),
intent(inout) :: params
120 call usr_ic(u_adj, v_adj, w_adj, p_adj, params)
127 type(field_t),
intent(inout) :: u_adj
128 type(field_t),
intent(inout) :: v_adj
129 type(field_t),
intent(inout) :: w_adj
130 type(field_t),
intent(inout) :: p_adj
131 type(coef_t),
intent(in) :: coef
132 type(gs_t),
intent(inout) :: gs
137 if (neko_bcknd_device .eq. 1)
then
138 call device_memcpy(u_adj%x, u_adj%x_d, n, &
139 host_to_device, sync = .false.)
140 call device_memcpy(v_adj%x, v_adj%x_d, n, &
141 host_to_device, sync = .false.)
142 call device_memcpy(w_adj%x, w_adj%x_d, n, &
143 host_to_device, sync = .false.)
147 call gs%op(u_adj%x, u_adj%dof%size(), gs_op_add)
148 call gs%op(v_adj%x, v_adj%dof%size(), gs_op_add)
149 call gs%op(w_adj%x, w_adj%dof%size(), gs_op_add)
151 if (neko_bcknd_device .eq. 1)
then
152 call device_col2(u_adj%x_d, coef%mult_d, u_adj%dof%size())
153 call device_col2(v_adj%x_d, coef%mult_d, v_adj%dof%size())
154 call device_col2(w_adj%x_d, coef%mult_d, w_adj%dof%size())
156 call col2(u_adj%x, coef%mult, u_adj%dof%size())
157 call col2(v_adj%x, coef%mult, v_adj%dof%size())
158 call col2(w_adj%x, coef%mult, w_adj%dof%size())
165 type(field_t),
intent(inout) :: u_adj
166 type(field_t),
intent(inout) :: v_adj
167 type(field_t),
intent(inout) :: w_adj
168 real(kind=rp),
intent(in) :: uinf(3)
175 if (neko_bcknd_device .eq. 1)
then
176 call device_cfill(u_adj%x_d, uinf(1), n)
177 call device_cfill(v_adj%x_d, uinf(2), n)
178 call device_cfill(w_adj%x_d, uinf(3), n)
180 call cfill(u_adj%x, uinf(1), n)
181 call cfill(v_adj%x, uinf(2), n)
182 call cfill(w_adj%x, uinf(3), n)
191 type(field_t),
intent(inout) :: u_adj
192 type(field_t),
intent(inout) :: v_adj
193 type(field_t),
intent(inout) :: w_adj
194 real(kind=rp),
intent(in) :: delta
195 real(kind=rp),
intent(in) :: uinf(3)
196 character(len=*),
intent(in) :: type
197 procedure(blasius_profile),
pointer :: bla => null()
200 select case (trim(type))
202 bla => blasius_linear
204 bla => blasius_quadratic
208 bla => blasius_quartic
212 call neko_error(
'Invalid Blasius approximation')
215 if ((uinf(1) .gt. 0.0_rp) .and. (uinf(2) .le. 0.0_rp) &
216 .and. (uinf(3) .le. 0.0_rp))
then
217 do i = 1, u_adj%dof%size()
218 u_adj%x(i,1,1,1) = bla(u_adj%dof%z(i,1,1,1), delta, uinf(1))
219 v_adj%x(i,1,1,1) = 0.0_rp
220 w_adj%x(i,1,1,1) = 0.0_rp
222 else if ((uinf(1) .le. 0.0_rp) .and. (uinf(2) .gt. 0.0_rp) &
223 .and. (uinf(3) .le. 0.0_rp))
then
224 do i = 1, u_adj%dof%size()
225 u_adj%x(i,1,1,1) = 0.0_rp
226 v_adj%x(i,1,1,1) = bla(u_adj%dof%x(i,1,1,1), delta, uinf(2))
227 w_adj%x(i,1,1,1) = 0.0_rp
229 else if ((uinf(1) .le. 0.0_rp) .and. (uinf(2) .le. 0.0_rp) &
230 .and. (uinf(3) .gt. 0.0_rp))
then
231 do i = 1, u_adj%dof%size()
232 u_adj%x(i,1,1,1) = 0.0_rp
233 v_adj%x(i,1,1,1) = 0.0_rp
234 w_adj%x(i,1,1,1) = bla(u_adj%dof%y(i,1,1,1), delta, uinf(3))
250 zone_name, zone_value)
251 type(field_t),
intent(inout) :: u_adj
252 type(field_t),
intent(inout) :: v_adj
253 type(field_t),
intent(inout) :: w_adj
254 real(kind=rp),
intent(in),
dimension(3) :: base_value
255 character(len=*),
intent(in) :: zone_name
256 real(kind=rp),
intent(in) :: zone_value(:)
259 class(point_zone_t),
pointer :: zone
263 size = u_adj%dof%size()
265 zone => neko_point_zone_registry%get_point_zone(trim(zone_name))
267 if (neko_bcknd_device .eq. 1)
then
268 call device_cfill_mask(u_adj%x_d, zone_value(1),
size, &
269 zone%mask_d, zone%size)
270 call device_cfill_mask(v_adj%x_d, zone_value(2),
size, &
271 zone%mask_d, zone%size)
272 call device_cfill_mask(w_adj%x_d, zone_value(3),
size, &
273 zone%mask_d, zone%size)
275 call cfill_mask(u_adj%x, zone_value(1),
size, zone%mask, zone%size)
276 call cfill_mask(v_adj%x, zone_value(2),
size, zone%mask, zone%size)
277 call cfill_mask(w_adj%x, zone_value(3),
size, zone%mask, zone%size)
subroutine set_adjoint_fluid_ic_int(u_adj, v_adj, w_adj, p_adj, coef, gs, type, params)
Set initial flow condition (builtin)
subroutine set_adjoint_fluid_ic_usr(u_adj, v_adj, w_adj, p_adj, coef, gs, usr_ic, params)
Set intial flow condition (user defined)
subroutine set_adjoint_fluid_ic_point_zone(u_adj, v_adj, w_adj, base_value, zone_name, zone_value)
Set the initial condition of the flow based on a point zone.