Neko 1.99.3
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
ale_routines_cpu.f90
Go to the documentation of this file.
1! Copyright (c) 2025-2026 The Neko Authors
2! All rights reserved.
3!
4! Redistribution and use in source and binary forms, with or without
5! modification, are permitted provided that the following conditions
6! are met:
7!
8! * Redistributions of source code must retain the above copyright
9! notice, this list of conditions and the following disclaimer.
10!
11! * Redistributions in binary form must reproduce the above
12! copyright notice, this list of conditions and the following
13! disclaimer in the documentation and/or other materials provided
14! with the distribution.
15!
16! * Neither the name of the authors nor the names of its
17! contributors may be used to endorse or promote products derived
18! from this software without specific prior written permission.
19!
20! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21! "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22! LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23! FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24! COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25! INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26! BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27! LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28! CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29! LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
30! ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31! POSSIBILITY OF SUCH DAMAGE.
32!
33! Routines for expensive ALE calculations on CPU
35 use num_types, only : rp
36 use field, only : field_t
37 use coefs, only : coef_t
38 use math, only : cfill, glimax, rzero
40 use time_state, only : time_state_t
42 use utils, only : neko_error
43 use comm, only : neko_comm
45 use mesh, only : mesh_t
46 use gather_scatter, only : gs_op_min
47 use mpi_f08, only : mpi_wtime, mpi_barrier
48 use logger, only : neko_log
50 implicit none
51 private
52
55 public :: update_ale_mesh_cpu
56
57contains
58
60 subroutine compute_stiffness_ale_cpu(coef, params)
61 type(coef_t), intent(inout) :: coef
62 type(ale_config_t), intent(in) :: params
63 integer :: i, n, b, ierr
64 integer, allocatable :: cheap_map(:)
65 integer :: n_cheap, map_idx
66 real(kind=rp) :: x, y, z
67 real(kind=rp) :: raw_dist, body_stiff_val, max_added_stiff
68 real(kind=rp) :: cx, cy, cz
69 real(kind=rp) :: arg, decay, gain, norm_dist
70 real(kind=rp) :: sample_start_time, sample_end_time, sample_time
71 real(kind=rp), allocatable :: dist_fields(:,:)
72 character(len=128) :: log_buf
73
74 n = coef%dof%size()
75
76 ! Check how many bodies need cheap_dist and create Map
77 allocate(cheap_map(params%nbodies))
78 cheap_map = 0
79 n_cheap = 0
80
81 do b = 1, params%nbodies
82 if (trim(params%bodies(b)%stiff_geom%type) == 'cheap_dist') then
83 n_cheap = n_cheap + 1
84 cheap_map(b) = n_cheap
85 end if
86 end do
87
88 ! Allocate and Compute cheap_dist only for required bodies
89 if (n_cheap > 0) then
90 allocate(dist_fields(n, n_cheap))
91 dist_fields = huge(0.0_rp)
92
93 do b = 1, params%nbodies
94 map_idx = cheap_map(b)
95 if (map_idx > 0) then
96 call neko_log%message(' ')
97 call neko_log%message(" Start: cheap dist calculation " // &
98 "for body '" // trim(params%bodies(b)%name) // "'")
99 call mpi_barrier(neko_comm, ierr)
100 sample_start_time = mpi_wtime()
101
102 ! Compute into the specific slot for this body
103
104 ! Nek5000 algorithm
105 ! call compute_cheap_dist_cpu(dist_fields(:, map_idx), coef, &
106 ! coef%msh, params%bodies(b)%zone_indices)
107
108 call compute_cheap_dist_v2_cpu(dist_fields(:, map_idx), coef, &
109 coef%msh, params%bodies(b)%zone_indices)
110
111 call mpi_barrier(neko_comm, ierr)
112 sample_end_time = mpi_wtime()
113 sample_time = sample_end_time - sample_start_time
114
115 write(log_buf, '(A, A, A, ES11.4, A)') " cheap dist for '", &
116 trim(params%bodies(b)%name), "' took ", sample_time, " (s)"
117 call neko_log%message(log_buf)
118 end if
119 end do
120 end if
121 call neko_log%message(' ')
122
123 ! Build stiffness field
124 select case (trim(params%stiffness_type))
125 case ('built-in')
126
127 do concurrent(i = 1:n)
128 x = coef%dof%x(i, 1, 1, 1)
129 y = coef%dof%y(i, 1, 1, 1)
130 z = coef%dof%z(i, 1, 1, 1)
131
132 max_added_stiff = 0.0_rp
133
134 ! Loop over bodies, calculate local contribution
135 do b = 1, params%nbodies
136 gain = params%bodies(b)%stiff_geom%gain
137 if (trim(params%bodies(b)%stiff_geom%type) == 'cheap_dist') then
138 decay = params%bodies(b)%stiff_geom%stiff_dist
139 else
140 decay = params%bodies(b)%stiff_geom%radius
141 end if
142
143 ! Geometry Center
144 cx = params%bodies(b)%stiff_geom%center(1)
145 cy = params%bodies(b)%stiff_geom%center(2)
146 cz = params%bodies(b)%stiff_geom%center(3)
147
148 raw_dist = huge(0.0_rp)
149
150 ! Calculate Distance
151 select case (trim(params%bodies(b)%stiff_geom%type))
152 case ('sphere')
153
154 raw_dist = sqrt((x - cx)**2 + (y - cy)**2 + (z - cz)**2)
155
156 case ('cylinder')
157
158 ! Distance to Z-axis centered at (cx, cy)
159 raw_dist = sqrt((x - cx)**2 + (y - cy)**2)
160
161 case ('box')
162
163 ! ToDO
164
165 case ('cheap_dist')
166
167 map_idx = cheap_map(b)
168 if (map_idx > 0) then
169 raw_dist = dist_fields(i, map_idx)
170 end if
171
172 end select
173
174 ! Apply Profile
175 body_stiff_val = 0.0_rp
176 select case (trim(params%bodies(b)%stiff_geom%decay_profile))
177 case ('gaussian')
178
179 ! exp( -(r/decay)^2 )
180 arg = -(raw_dist**2) / (decay**2)
181 arg = arg * params%bodies(b)%stiff_geom%cutoff_coef
182 body_stiff_val = gain * exp(arg)
183
184 case ('tanh')
185
186 ! Tanh profile
187 norm_dist = (raw_dist / decay)
188 norm_dist = norm_dist * &
189 params%bodies(b)%stiff_geom%cutoff_coef
190 body_stiff_val = gain * (1.0_rp - tanh(norm_dist))
191
192 end select
193
194 if (body_stiff_val > max_added_stiff) then
195 max_added_stiff = body_stiff_val
196 end if
197
198 end do
199
200 coef%h1(i, 1, 1, 1) = 1.0_rp + max_added_stiff
201 coef%h2(i, 1, 1, 1) = 0.0_rp
202 end do
203
204 case default
205 call neko_error("ALE Manager: Unknown stiffness type")
206 end select
207
208 coef%ifh2 = .false.
209 if (allocated(dist_fields)) deallocate(dist_fields)
210 if (allocated(cheap_map)) deallocate(cheap_map)
211 end subroutine compute_stiffness_ale_cpu
212
214 subroutine compute_cheap_dist_cpu(d, coef, msh, zone_indices)
215 real(kind=rp), intent(inout), target :: d(:)
216 type(coef_t), intent(in) :: coef
217 type(mesh_t), intent(in) :: msh
218 type(zero_dirichlet_t) :: bc_wall
219 integer, intent(in) :: zone_indices(:)
220 real(kind=rp), pointer :: d4(:, :, :, :)
221 integer :: i, j, k, e, n
222 integer :: ipass, nchange, max_pass
223 integer :: ii, jj, kk, i0, i1, j0, j1, k0, k1
224 integer :: lx, ly, lz, nel, z_idx
225 integer :: m, idx
226 real(kind=rp) :: dtmp, x1, y1, z1, x2, y2, z2
227 integer :: change_vec(1)
228 logical :: done
229
230 lx = coef%dof%Xh%lx
231 ly = coef%dof%Xh%ly
232 lz = coef%dof%Xh%lz
233 nel = msh%nelv
234 n = size(d)
235 d4(1:lx, 1:ly, 1:lz, 1:nel) => d
236 max_pass = 10000
237
238 !d = huge(0.0_rp)
239 call cfill(d, huge(0.0_rp), n)
240
241 if (size(zone_indices) > 0) then
242 call bc_wall%init_from_components(coef)
243 do k = 1, size(zone_indices)
244 z_idx = zone_indices(k)
245 call bc_wall%mark_zone(msh%labeled_zones(z_idx))
246 end do
247 call bc_wall%finalize()
248 m = bc_wall%msk(0)
249 do i = 1, m
250 idx = bc_wall%msk(i)
251 d(idx) = 0.0_rp
252 end do
253 call bc_wall%free()
254 end if
255
256 ipass = 1
257 done = .false.
258 do while (ipass <= max_pass .and. .not. done)
259 nchange = 0
260 do e = 1, nel
261 do k = 1, lz
262 do j = 1, ly
263 do i = 1, lx
264 x1 = coef%dof%x(i, j, k, e)
265 y1 = coef%dof%y(i, j, k, e)
266 z1 = coef%dof%z(i, j, k, e)
267 i0 = max(1, i - 1)
268 i1 = min(lx, i + 1)
269 j0 = max(1, j - 1)
270 j1 = min(ly, j + 1)
271 k0 = max(1, k - 1)
272 k1 = min(lz, k + 1)
273 do kk = k0, k1
274 do jj = j0, j1
275 do ii = i0, i1
276 if (ii == i .and. jj == j .and. kk == k) cycle
277 x2 = coef%dof%x(ii, jj, kk, e)
278 y2 = coef%dof%y(ii, jj, kk, e)
279 z2 = coef%dof%z(ii, jj, kk, e)
280 dtmp = d4(ii, jj, kk, e) + &
281 sqrt((x1 - x2)**2 + &
282 (y1 - y2)**2 + (z1 - z2)**2)
283 if (dtmp < d4(i, j, k, e)) then
284 d4(i, j, k, e) = dtmp
285 nchange = nchange + 1
286 end if
287 end do
288 end do
289 end do
290 end do
291 end do
292 end do
293 end do
294 call coef%gs_h%gs_op_vector(d, n, gs_op_min)
295 change_vec(1) = nchange
296 if (glimax(change_vec, 1) == 0) done = .true.
297 ipass = ipass + 1
298 end do
299 end subroutine compute_cheap_dist_cpu
300
304 subroutine compute_cheap_dist_v2_cpu(d, coef, msh, zone_indices)
305 real(kind=rp), intent(inout), target :: d(:)
306 type(coef_t), intent(in) :: coef
307 type(mesh_t), intent(in) :: msh
308 type(zero_dirichlet_t) :: bc_wall
309 integer, intent(in) :: zone_indices(:)
310 real(kind=rp), pointer :: d4(:, :, :, :)
311 integer :: i, j, k, e, n
312 integer :: ipass, nchange, max_pass
313 integer :: ii, jj, kk, i0, i1, j0, j1, k0, k1
314 integer :: lx, ly, lz, nel, z_idx
315 integer :: m, idx, iter, local_iters
316 real(kind=rp) :: dtmp, x1, y1, z1, x2, y2, z2
317 integer :: change_vec(1)
318 logical :: done, changed_local, element_changed_ever
319 character(len=128) :: log_buf
320
321 lx = coef%dof%Xh%lx
322 ly = coef%dof%Xh%ly
323 lz = coef%dof%Xh%lz
324 nel = msh%nelv
325 n = size(d)
326 d4(1:lx, 1:ly, 1:lz, 1:nel) => d
327 max_pass = 10000
328
329! Limit for worst case scenario such that all nodes can propagate
330! their values across the element before triggering an MPI call.
331 local_iters = lx + ly + lz
332
333 call cfill(d, huge(0.0_rp), n)
334
335 if (size(zone_indices) > 0) then
336 call bc_wall%init_from_components(coef)
337 do k = 1, size(zone_indices)
338 z_idx = zone_indices(k)
339 call bc_wall%mark_zone(msh%labeled_zones(z_idx))
340 end do
341 call bc_wall%finalize()
342 m = bc_wall%msk(0)
343 do i = 1, m
344 idx = bc_wall%msk(i)
345 d(idx) = 0.0_rp
346 end do
347 call bc_wall%free()
348 end if
349
350 ipass = 1
351 done = .false.
352 do while (ipass <= max_pass .and. .not. done)
353 nchange = 0
354
355 do e = 1, nel
356 iter = 1
357 element_changed_ever = .false.
358 changed_local = .true.
359 do while (changed_local .and. iter <= local_iters)
360
361 changed_local = .false.
362 do k = 1, lz
363 do j = 1, ly
364 do i = 1, lx
365 x1 = coef%dof%x(i, j, k, e)
366 y1 = coef%dof%y(i, j, k, e)
367 z1 = coef%dof%z(i, j, k, e)
368 i0 = max(1, i - 1)
369 i1 = min(lx, i + 1)
370 j0 = max(1, j - 1)
371 j1 = min(ly, j + 1)
372 k0 = max(1, k - 1)
373 k1 = min(lz, k + 1)
374 do kk = k0, k1
375 do jj = j0, j1
376 do ii = i0, i1
377 if (ii == i .and. jj == j .and. kk == k) cycle
378
379 x2 = coef%dof%x(ii, jj, kk, e)
380 y2 = coef%dof%y(ii, jj, kk, e)
381 z2 = coef%dof%z(ii, jj, kk, e)
382
383 dtmp = d4(ii, jj, kk, e) + &
384 sqrt((x1 - x2)**2 + &
385 (y1 - y2)**2 + (z1 - z2)**2)
386
387 if (dtmp < d4(i, j, k, e)) then
388 d4(i, j, k, e) = dtmp
389 changed_local = .true.
390 end if
391
392 end do
393 end do
394 end do
395 end do
396 end do
397 end do
398 if (changed_local) element_changed_ever = .true.
399 iter = iter + 1
400 end do
401
402 if (element_changed_ever) nchange = nchange + 1
403 end do
404
405 call coef%gs_h%gs_op_vector(d, n, gs_op_min)
406 change_vec(1) = nchange
407
408 if (glimax(change_vec, 1) == 0) done = .true.
409 ipass = ipass + 1
410 end do
411
412 write(log_buf, '(A, I0, A)') " converged in: ", ipass, " passes"
413 call neko_log%message(log_buf)
414 end subroutine compute_cheap_dist_v2_cpu
415
416
418 subroutine add_kinematics_to_mesh_velocity_cpu(wx, wy, wz, &
419 x_ref, y_ref, z_ref, phi, coef, kinematics, rot_mat, inital_pivot_loc)
420 type(field_t), intent(inout) :: wx, wy, wz
421 type(field_t), intent(in) :: x_ref, y_ref, z_ref
422 type(field_t), intent(in) :: phi
423 type(coef_t), intent(in) :: coef
424 type(body_kinematics_t), intent(in) :: kinematics
425 real(kind=rp), intent(in) :: inital_pivot_loc(3)
426 real(kind=rp), intent(in) :: rot_mat(3,3)
427 integer :: i, n
428 real(kind=rp) :: rx, ry, rz
429 real(kind=rp) :: v_tan_x, v_tan_y, v_tan_z
430 real(kind=rp) :: dx_ref, dy_ref, dz_ref
431 real(kind=rp) :: rx_target, ry_target, rz_target
432 real(kind=rp) :: p_val
433 n = phi%dof%size()
434 associate(x => coef%dof%x, y => coef%dof%y, z => coef%dof%z)
435 do concurrent(i = 1:n)
436 ! for points on the wall (phi=1) we do this to avoid any
437 ! numeric error due to computation of rotation matrix.
438 ! It ensures, the walls are always where they need to be!
439 if ( abs(phi%x(i, 1, 1, 1) - 1.0_rp) < 1e-6_rp ) then
440
441 rx = x(i, 1, 1, 1) - kinematics%center(1)
442 ry = y(i, 1, 1, 1) - kinematics%center(2)
443 rz = z(i, 1, 1, 1) - kinematics%center(3)
444 v_tan_x = kinematics%vel_ang(2) * rz - kinematics%vel_ang(3) * ry
445 v_tan_y = kinematics%vel_ang(3) * rx - kinematics%vel_ang(1) * rz
446 v_tan_z = kinematics%vel_ang(1) * ry - kinematics%vel_ang(2) * rx
447 wx%x(i, 1, 1, 1) = wx%x(i, 1, 1, 1) + &
448 (kinematics%vel_trans(1) + v_tan_x) * phi%x(i, 1, 1, 1)
449 wy%x(i, 1, 1, 1) = wy%x(i, 1, 1, 1) + &
450 (kinematics%vel_trans(2) + v_tan_y) * phi%x(i, 1, 1, 1)
451 wz%x(i, 1, 1, 1) = wz%x(i, 1, 1, 1) + &
452 (kinematics%vel_trans(3) + v_tan_z) * phi%x(i, 1, 1, 1)
453 else
454 ! For other points we do this to avoid the time-dependnent
455 ! drift in some special cases, which happens due to the nature of
456 ! the ODE that we integrate above!
457 dx_ref = x_ref%x(i, 1, 1, 1) - inital_pivot_loc(1)
458 dy_ref = y_ref%x(i, 1, 1, 1) - inital_pivot_loc(2)
459 dz_ref = z_ref%x(i, 1, 1, 1) - inital_pivot_loc(3)
460
461 ! Rotate to find the "ghost" target vector
462 ! Apply the rotation matrix R(t) to the reference vector
463 rx_target = rot_mat(1,1)*dx_ref + rot_mat(1,2)*dy_ref + &
464 rot_mat(1,3)*dz_ref
465 ry_target = rot_mat(2,1)*dx_ref + rot_mat(2,2)*dy_ref + &
466 rot_mat(2,3)*dz_ref
467 rz_target = rot_mat(3,1)*dx_ref + rot_mat(3,2)*dy_ref + &
468 rot_mat(3,3)*dz_ref
469
470 ! Calculate tangential velocity at the ghost target
471 ! v_tan = Omega \corss R_target
472 v_tan_x = kinematics%vel_ang(2) * rz_target - &
473 kinematics%vel_ang(3) * ry_target
474 v_tan_y = kinematics%vel_ang(3) * rx_target - &
475 kinematics%vel_ang(1) * rz_target
476 v_tan_z = kinematics%vel_ang(1) * ry_target - &
477 kinematics%vel_ang(2) * rx_target
478
479 p_val = phi%x(i, 1, 1, 1)
480
481 ! Total Mesh Velocity
482 wx%x(i, 1, 1, 1) = wx%x(i, 1, 1, 1) + &
483 (kinematics%vel_trans(1) + v_tan_x) * p_val
484 wy%x(i, 1, 1, 1) = wy%x(i, 1, 1, 1) + &
485 (kinematics%vel_trans(2) + v_tan_y) * p_val
486 wz%x(i, 1, 1, 1) = wz%x(i, 1, 1, 1) + &
487 (kinematics%vel_trans(3) + v_tan_z) * p_val
488
489 end if
490 end do
491 end associate
493
495 subroutine update_ale_mesh_cpu(c_Xh, wm_x, wm_y, wm_z, wm_x_lag, wm_y_lag, &
496 wm_z_lag, time, nadv, scheme_type)
497 type(coef_t), intent(inout) :: c_xh
498 type(field_t), intent(in) :: wm_x, wm_y, wm_z
499 type(field_series_t), intent(in) :: wm_x_lag, wm_y_lag, wm_z_lag
500 type(time_state_t), intent(in) :: time
501 type(ab_time_scheme_t) :: ab_scheme_obj
502 integer, intent(in) :: nadv
503 integer :: i, j, n
504 character(len=*), intent(in) :: scheme_type
505 real(kind=rp) :: ab_coeffs(4), dt_history(10)
506
507 call rzero(ab_coeffs, 4)
508 if (trim(scheme_type) .eq. 'ab') then
509 dt_history(1) = time%dt
510 dt_history(2) = time%dtlag(1)
511 dt_history(3) = time%dtlag(2)
512 call ab_scheme_obj%compute_coeffs(ab_coeffs, dt_history, nadv)
513 else
514 call neko_error("ALE: Unknown mesh time-integration scheme")
515 end if
516
517 n = c_xh%dof%size()
518
519 do concurrent(i = 1:n)
520 c_xh%dof%x(i, 1, 1, 1) = c_xh%dof%x(i, 1, 1, 1) + &
521 time%dt * ab_coeffs(1) * wm_x%x(i, 1, 1, 1)
522 c_xh%dof%y(i, 1, 1, 1) = c_xh%dof%y(i, 1, 1, 1) + &
523 time%dt * ab_coeffs(1) * wm_y%x(i, 1, 1, 1)
524 c_xh%dof%z(i, 1, 1, 1) = c_xh%dof%z(i, 1, 1, 1) + &
525 time%dt * ab_coeffs(1) * wm_z%x(i, 1, 1, 1)
526
527 do j = 2, nadv
528 c_xh%dof%x(i, 1, 1, 1) = c_xh%dof%x(i, 1, 1, 1) + &
529 time%dt * ab_coeffs(j) * wm_x_lag%lf(j - 1)%x(i, 1, 1, 1)
530 c_xh%dof%y(i, 1, 1, 1) = c_xh%dof%y(i, 1, 1, 1) + &
531 time%dt * ab_coeffs(j) * wm_y_lag%lf(j - 1)%x(i, 1, 1, 1)
532 c_xh%dof%z(i, 1, 1, 1) = c_xh%dof%z(i, 1, 1, 1) + &
533 time%dt * ab_coeffs(j) * wm_z_lag%lf(j - 1)%x(i, 1, 1, 1)
534 end do
535
536 end do
537 end subroutine update_ale_mesh_cpu
538
539end module ale_routines_cpu
Adam-Bashforth scheme for time integration.
Defines data structures and algorithms for configuring, calculating, and time-integrating the rigid-b...
subroutine, public add_kinematics_to_mesh_velocity_cpu(wx, wy, wz, x_ref, y_ref, z_ref, phi, coef, kinematics, rot_mat, inital_pivot_loc)
Adds kinematics to mesh velocity (CPU)
subroutine compute_cheap_dist_cpu(d, coef, msh, zone_indices)
Implementation of cheap_dist in Nek5000 (CPU)
subroutine, public compute_stiffness_ale_cpu(coef, params)
Compute mesh stiffness with per-body gain/decay from stiff_geom.
subroutine compute_cheap_dist_v2_cpu(d, coef, msh, zone_indices)
Compute cheap_dist field by passing distance information throughout an entire local element before do...
subroutine, public update_ale_mesh_cpu(c_xh, wm_x, wm_y, wm_z, wm_x_lag, wm_y_lag, wm_z_lag, time, nadv, scheme_type)
Updates mesh position by integrating mesh velocity in time using AB (CPU)
Coefficients.
Definition coef.f90:34
Definition comm.F90:1
type(mpi_comm), public neko_comm
MPI communicator.
Definition comm.F90:43
Contains the field_serties_t type.
Defines a field.
Definition field.f90:34
Gather-scatter.
Logging routines.
Definition log.f90:34
type(log_t), public neko_log
Global log stream.
Definition log.f90:79
Definition math.f90:60
subroutine, public cfill(a, c, n)
Set all elements to a constant c .
Definition math.f90:488
subroutine, public rzero(a, n)
Zero a real vector.
Definition math.f90:206
integer function, public glimax(a, n)
Max of an integer vector of length n.
Definition math.f90:532
Defines a mesh.
Definition mesh.f90:34
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:12
Module with things related to the simulation time.
Utilities.
Definition utils.f90:35
Defines a zero-valued Dirichlet boundary condition.
Explicit Adam-Bashforth scheme for time integration.
Calculated Kinematics for a body at current time.
Coefficients defined on a given (mesh, ) tuple. Arrays use indices (i,j,k,e): element e,...
Definition coef.f90:62
Stores a series (sequence) of fields, logically connected to a base field, and arranged according to ...
A struct that contains all info about the time, expand as needed.
Zero-valued Dirichlet boundary condition. Used for no-slip walls, but also for various auxillary cond...
#define max(a, b)
Definition tensor.cu:40