76 real(kind=
rp),
intent(in),
target :: x(:), y(:), z(:)
77 integer,
intent(in) :: nel
78 integer,
intent(in) :: n_boxes
79 real(kind=
dp),
intent(in) :: padding
82 integer :: el_npts, el_x_npts, el_y_npts, el_z_npts
83 real(kind=
rp) :: el_x(xh%lxyz), el_y(xh%lxyz), el_z(xh%lxyz)
86 integer :: htable_data
87 real(kind=
rp) :: center_x, center_y, center_z, r_res
88 integer :: current_size
89 real(kind=
rp) :: time_start, time_end
90 integer :: min_id(3), max_id(3)
91 integer :: lin_idx, lx2
93 real(kind=
rp) :: min_bb_x, max_bb_x
94 real(kind=
rp) :: min_bb_y, max_bb_y
95 real(kind=
rp) :: min_bb_z, max_bb_z
99 if (n_boxes > 0 .and. n_boxes <= 1000)
then
100 allocate(this%el_map(n_boxes**3))
102 call neko_error(
"Cartesian el finder, n_boxes is too large or negative")
105 call this%el_map(i)%init()
109 this%padding = padding
110 this%max_x = maxval(x(1:nel*xh%lxyz))
111 this%min_x = minval(x(1:nel*xh%lxyz))
112 this%max_y = maxval(y(1:nel*xh%lxyz))
113 this%min_y = minval(y(1:nel*xh%lxyz))
114 this%max_z = maxval(z(1:nel*xh%lxyz))
115 this%min_z = minval(z(1:nel*xh%lxyz))
117 center_x = (this%max_x + this%min_x) / 2.0_xp
118 center_y = (this%max_y + this%min_y) / 2.0_xp
119 center_z = (this%max_z + this%min_z) / 2.0_xp
121 this%max_x = this%max_x - center_x
122 this%max_y = this%max_y - center_y
123 this%max_z = this%max_z - center_z
124 this%min_x = this%min_x - center_x
125 this%min_y = this%min_y - center_y
126 this%min_z = this%min_z - center_z
127 this%max_x = this%max_x * (1.0_xp + this%padding) + center_x
128 this%max_y = this%max_y * (1.0_xp + this%padding) + center_y
129 this%max_z = this%max_z * (1.0_xp + this%padding) + center_z
130 this%min_x = this%min_x * (1.0_xp + this%padding) + center_x
131 this%min_y = this%min_y * (1.0_xp + this%padding) + center_y
132 this%min_z = this%min_z * (1.0_xp + this%padding) + center_z
137 this%x_res = (this%max_x - this%min_x) /
real(n_boxes,
xp)
138 this%y_res = (this%max_y - this%min_y) /
real(n_boxes,
xp)
139 this%z_res = (this%max_z - this%min_z) /
real(n_boxes,
xp)
142 this%n_boxes = n_boxes
143 call marked_box%init(nel)
147 call marked_box%clear()
151 if (mod(xh%lx,2) .eq. 0)
then
152 lin_idx =
linear_index(lx2,lx2,lx2, e, xh%lx, xh%lx, xh%lx)
153 center_x = x(lin_idx)
154 center_y = y(lin_idx)
155 center_z = z(lin_idx)
164 center_x = center_x + x(lin_idx)
165 center_y = center_y + y(lin_idx)
166 center_z = center_z + z(lin_idx)
170 center_x = center_x / 8.0_xp
171 center_y = center_y / 8.0_xp
172 center_z = center_z / 8.0_xp
178 el_x = x((e-1)*lxyz+1:e*lxyz) - center_x
179 el_y = y((e-1)*lxyz+1:e*lxyz) - center_y
180 el_z = z((e-1)*lxyz+1:e*lxyz) - center_z
181 el_x = el_x * (1.0_rp + padding) + center_x
182 el_y = el_y * (1.0_rp + padding) + center_y
183 el_z = el_z * (1.0_rp + padding) + center_z
191 max_bb_x = el_x(lin_idx)
192 min_bb_x = el_x(lin_idx)
193 max_bb_y = el_y(lin_idx)
194 min_bb_y = el_y(lin_idx)
195 max_bb_z = el_z(lin_idx)
196 min_bb_z = el_z(lin_idx)
201 1, xh%lx, xh%lx, xh%lx)
202 max_bb_x =
max(max_bb_x, el_x(lin_idx))
203 min_bb_x = min(min_bb_x, el_x(lin_idx))
204 max_bb_y =
max(max_bb_y, el_y(lin_idx))
205 min_bb_y = min(min_bb_y, el_y(lin_idx))
206 max_bb_z =
max(max_bb_z, el_z(lin_idx))
207 min_bb_z = min(min_bb_z, el_z(lin_idx))
213 min_id = this%compute_3idx(min_bb_x, min_bb_y, min_bb_z)
214 max_id = this%compute_3idx(max_bb_x, max_bb_y, max_bb_z)
215 do i2 = min_id(1), max_id(1)
216 do j2 = min_id(2), max_id(2)
217 do k2 = min_id(3), max_id(3)
218 if (
i2 .ge. 1 .and.
i2 .le. this%n_boxes .and. &
219 j2 .ge. 1 .and. j2 .le. this%n_boxes .and. &
220 k2 .ge. 1 .and. k2 .le. this%n_boxes)
then
222 this%n_boxes, this%n_boxes, this%n_boxes)
223 if (marked_box%get(el_idx,htable_data) .ne. 0)
then
224 call marked_box%set(el_idx, htable_data)
225 call this%el_map(el_idx)%push(e)
235 call marked_box%free()