98 type(json_file),
intent(inout) :: json
99 type(field_list_t),
intent(inout),
target :: fields
100 type(coef_t),
target,
intent(inout) :: coef
101 real(kind=rp) :: start_time, end_time
103 character(len=:),
allocatable :: filter_type
104 real(kind=rp),
dimension(:),
allocatable :: brinkman_limits
105 real(kind=rp) :: brinkman_penalty
107 type(json_value),
pointer :: json_object_list
108 type(json_core) :: core
110 character(len=:),
allocatable :: object_type
111 type(json_file) :: object_settings
116 call json_get_or_default(json,
"start_time", start_time, 0.0_rp)
117 call json_get_or_default(json,
"end_time", end_time, huge(0.0_rp))
120 call json_get(json,
'brinkman.limits', brinkman_limits)
121 call json_get(json,
'brinkman.penalty', brinkman_penalty)
123 if (
size(brinkman_limits) .ne. 2)
then
124 call neko_error(
'brinkman_limits must be a 2 element array of reals')
128 call this%init_base(fields, coef, start_time, end_time)
133 if (neko_field_registry%field_exists(
'brinkman_indicator') &
134 .or. neko_field_registry%field_exists(
'brinkman'))
then
135 call neko_error(
'Brinkman field already exists.')
138 call neko_field_registry%add_field(coef%dof,
'brinkman_indicator')
140 neko_field_registry%get_field_by_name(
'brinkman_indicator')
142 call neko_field_registry%add_field(coef%dof,
'brinkman')
143 this%brinkman => neko_field_registry%get_field_by_name(
'brinkman')
148 call json%get(
'objects', json_object_list)
149 call json%info(
'objects', n_children = n_regions)
150 call json%get_core(core)
153 call json_extract_item(core, json_object_list, i, object_settings)
154 call json_get_or_default(object_settings,
'type', object_type,
'none')
156 select case (object_type)
157 case (
'boundary_mesh')
158 call this%init_boundary_mesh(object_settings)
160 call this%init_point_zone(object_settings)
163 call object_settings%print()
164 call neko_error(
'Brinkman source term objects require a region type')
166 call neko_error(
'Brinkman source term unknown region type')
172 call json_get_or_default(json,
'filter.type', filter_type,
'none')
174 select case (filter_type)
178 call neko_error(
'Brinkman source term unknown filter type')
184 call permeability_field(this%brinkman, this%indicator, &
185 brinkman_limits(1), brinkman_limits(2), brinkman_penalty)
188 if (neko_bcknd_device .eq. 1)
then
189 call device_memcpy(this%brinkman%x, this%brinkman%x_d, &
190 this%brinkman%dof%size(), host_to_device, .true.)
208 real(kind=rp),
intent(in) :: t
209 integer,
intent(in) :: tstep
210 type(field_t),
pointer :: u, v, w, fu, fv, fw
213 n = this%fields%item_size(1)
215 u => neko_field_registry%get_field(
'u')
216 v => neko_field_registry%get_field(
'v')
217 w => neko_field_registry%get_field(
'w')
219 fu => this%fields%get(1)
220 fv => this%fields%get(2)
221 fw => this%fields%get(3)
223 call field_subcol3(fu, u, this%brinkman, n)
224 call field_subcol3(fv, v, this%brinkman, n)
225 call field_subcol3(fw, w, this%brinkman, n)
235 type(json_file),
intent(inout) :: json
238 character(len=:),
allocatable :: mesh_file_name
239 character(len=:),
allocatable :: distance_transform
240 character(len=:),
allocatable :: filter_type
241 character(len=:),
allocatable :: mesh_transform
244 type(file_t) :: mesh_file
245 type(tri_mesh_t) :: boundary_mesh
246 real(kind=rp) :: scalar_r
247 real(kind=dp) :: scalar_d
250 real(kind=dp),
dimension(:),
allocatable :: box_min, box_max
251 logical :: keep_aspect_ratio
252 real(kind=dp),
dimension(3) :: scaling
253 real(kind=dp),
dimension(3) :: translation
254 type(field_t) :: temp_field
255 type(aabb_t) :: mesh_box, target_box
261 call json_get(json,
'name', mesh_file_name)
264 call json_get(json,
'distance_transform.type', distance_transform)
269 mesh_file = file_t(mesh_file_name)
270 call mesh_file%read(boundary_mesh)
272 if (boundary_mesh%nelv .eq. 0)
then
273 call neko_error(
'No elements in the boundary mesh')
279 call json_get_or_default(json,
'mesh_transform.type', &
280 mesh_transform,
'none')
282 select case (mesh_transform)
285 case (
'bounding_box')
286 call json_get(json,
'mesh_transform.box_min', box_min)
287 call json_get(json,
'mesh_transform.box_max', box_max)
288 call json_get_or_default(json,
'mesh_transform.keep_aspect_ratio', &
289 keep_aspect_ratio, .true.)
291 if (
size(box_min) .ne. 3 .or.
size(box_max) .ne. 3)
then
292 call neko_error(
'Case file: mesh_transform. &
293 &box_min and box_max must be 3 element arrays of reals')
296 call target_box%init(box_min, box_max)
298 mesh_box = get_aabb(boundary_mesh)
300 scaling = target_box%get_diagonal() / mesh_box%get_diagonal()
301 if (keep_aspect_ratio)
then
302 scaling = minval(scaling)
305 translation = - scaling * mesh_box%get_min() + target_box%get_min()
307 do idx_p = 1, boundary_mesh%mpts
308 boundary_mesh%points(idx_p)%x = &
309 scaling * boundary_mesh%points(idx_p)%x + translation
313 call neko_error(
'Unknown mesh transform')
324 call temp_field%init(this%indicator%dof)
327 select case (distance_transform)
329 call json_get(json,
'distance_transform.value', scalar_d)
330 scalar_r = real(scalar_d, kind=rp)
332 call signed_distance_field(temp_field, boundary_mesh, scalar_d)
333 call smooth_step_field(temp_field, scalar_r, 0.0_rp)
337 call json_get(json,
'distance_transform.value', scalar_d)
339 call signed_distance_field(temp_field, boundary_mesh, scalar_d)
340 call step_function_field(temp_field, scalar_r, 1.0_rp, 0.0_rp)
343 call neko_error(
'Unknown distance transform')
348 call json_get_or_default(json,
'filter.type', filter_type,
'none')
350 select case (filter_type)
354 call neko_error(
'Unknown filter type')
358 this%indicator%x = max(this%indicator%x, temp_field%x)
365 type(json_file),
intent(inout) :: json
368 character(len=:),
allocatable :: zone_name
369 character(len=:),
allocatable :: filter_type
371 type(field_t) :: temp_field
372 class(point_zone_t),
pointer :: my_point_zone
378 call json_get(json,
'name', zone_name)
379 call json_get_or_default(json,
'filter.type', filter_type,
'none')
383 call temp_field%init(this%indicator%dof)
385 my_point_zone => neko_point_zone_registry%get_point_zone(zone_name)
387 do i = 1, my_point_zone%size
388 temp_field%x(my_point_zone%mask(i), 1, 1, 1) = 1.0_rp
393 select case (filter_type)
397 call neko_error(
'Unknown filter type')
401 this%indicator%x = max(this%indicator%x, temp_field%x)