Neko 1.99.5
A portable framework for high-order spectral element flow simulations
Loading...
Searching...
No Matches
checkpoint.f90
Go to the documentation of this file.
1! Copyright (c) 2021, 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!
36 use num_types, only : rp, dp
39 use space, only : space_t, operator(.ne.)
42 use field, only : field_t, field_ptr_t
43 use utils, only : neko_error
44 use mesh, only : mesh_t
45 use math, only : neko_eps
47 use time_state, only : time_state_t
48 use, intrinsic :: iso_c_binding, only : c_ptr, c_null_ptr, c_associated
49 implicit none
50 private
51
52 type, public :: chkp_t
53 type(field_t), pointer :: u => null()
54 type(field_t), pointer :: v => null()
55 type(field_t), pointer :: w => null()
56 type(field_t), pointer :: p => null()
57
58
59 !
60 ! Optional payload
61 !
62 type(field_series_t), pointer :: ulag => null()
63 type(field_series_t), pointer :: vlag => null()
64 type(field_series_t), pointer :: wlag => null()
65
66 real(kind=rp), pointer :: tlag(:) => null()
67 real(kind=rp), pointer :: dtlag(:) => null()
68
70 type(field_t), pointer :: abx1 => null()
71 type(field_t), pointer :: abx2 => null()
72 type(field_t), pointer :: aby1 => null()
73 type(field_t), pointer :: aby2 => null()
74 type(field_t), pointer :: abz1 => null()
75 type(field_t), pointer :: abz2 => null()
76
77 type(field_t), pointer :: s => null()
78 type(field_series_t), pointer :: slag => null()
79 type(field_t), pointer :: abs1 => null()
80 type(field_t), pointer :: abs2 => null()
81
82 type(field_series_list_t) :: scalar_lags
83
85 type(field_ptr_t), allocatable :: scalar_abx1(:)
87 type(field_ptr_t), allocatable :: scalar_abx2(:)
89
90 real(kind=dp) :: t = 0d0
91 type(mesh_t) :: previous_mesh
92 type(space_t) :: previous_xh
93 real(kind=dp) :: mesh2mesh_tol = glob_interp_tol
94
96 type(field_t), pointer :: wm_x => null()
97 type(field_t), pointer :: wm_y => null()
98 type(field_t), pointer :: wm_z => null()
99 type(field_series_t), pointer :: wm_x_lag => null()
100 type(field_series_t), pointer :: wm_y_lag => null()
101 type(field_series_t), pointer :: wm_z_lag => null()
102 real(kind=rp), pointer :: msh_x(:,:,:,:) => null()
103 real(kind=rp), pointer :: msh_y(:,:,:,:) => null()
104 real(kind=rp), pointer :: msh_z(:,:,:,:) => null()
105 type(c_ptr) :: msh_x_d = c_null_ptr
106 type(c_ptr) :: msh_y_d = c_null_ptr
107 type(c_ptr) :: msh_z_d = c_null_ptr
108 real(kind=rp), pointer :: pivot_pos(:) => null()
109 real(kind=rp), pointer :: pivot_vel_lag(:,:) => null()
110 real(kind=rp), pointer :: blag(:,:,:,:) => null()
111 real(kind=rp), pointer :: blaglag(:,:,:,:) => null()
112 type(c_ptr) :: blag_d = c_null_ptr
113 type(c_ptr) :: blaglag_d = c_null_ptr
114 real(kind=rp), pointer :: basis_pos(:) => null()
115 real(kind=rp), pointer :: basis_vel_lag(:,:) => null()
116 contains
117 procedure, pass(this) :: init => chkp_init
118 procedure, pass(this) :: sync_host => chkp_sync_host
119 procedure, pass(this) :: sync_device => chkp_sync_device
120 procedure, pass(this) :: add_fluid => chkp_add_fluid
121 procedure, pass(this) :: add_lag => chkp_add_lag
122 procedure, pass(this) :: add_scalar => chkp_add_scalar
123 procedure, pass(this) :: add_ale => chkp_add_ale
124 procedure, pass(this) :: restart_time => chkp_restart_time
125 procedure, pass(this) :: set_time_state => chkp_set_time_state
126 procedure, pass(this) :: free => chkp_free
127 end type chkp_t
128
129contains
130
132 subroutine chkp_init(this)
133 class(chkp_t), intent(inout) :: this
134
135 ! Make sure the object is clean
136 call this%free()
137
138 end subroutine chkp_init
139
141 subroutine chkp_free(this)
142 class(chkp_t), intent(inout) :: this
143
144 this%t = 0d0
145
146 if (associated(this%u)) nullify(this%u)
147 if (associated(this%v)) nullify(this%v)
148 if (associated(this%w)) nullify(this%w)
149 if (associated(this%p)) nullify(this%p)
150
151 if (associated(this%ulag)) nullify(this%ulag)
152 if (associated(this%vlag)) nullify(this%vlag)
153 if (associated(this%wlag)) nullify(this%wlag)
154
155 if (associated(this%tlag)) nullify(this%tlag)
156 if (associated(this%dtlag)) nullify(this%dtlag)
157
158 ! ALE cleanup
159 if (associated(this%wm_x)) nullify(this%wm_x)
160 if (associated(this%wm_y)) nullify(this%wm_y)
161 if (associated(this%wm_z)) nullify(this%wm_z)
162 if (associated(this%wm_x_lag)) nullify(this%wm_x_lag)
163 if (associated(this%wm_y_lag)) nullify(this%wm_y_lag)
164 if (associated(this%wm_z_lag)) nullify(this%wm_z_lag)
165 if (associated(this%basis_vel_lag)) nullify(this%basis_vel_lag)
166 if (associated(this%msh_x)) nullify(this%msh_x)
167 if (associated(this%msh_y)) nullify(this%msh_y)
168 if (associated(this%msh_z)) nullify(this%msh_z)
169 this%msh_x_d = c_null_ptr
170 this%msh_y_d = c_null_ptr
171 this%msh_z_d = c_null_ptr
172 if (associated(this%pivot_pos)) nullify(this%pivot_pos)
173 if (associated(this%pivot_vel_lag)) nullify(this%pivot_vel_lag)
174 if (associated(this%Blag)) nullify(this%Blag)
175 if (associated(this%Blaglag)) nullify(this%Blaglag)
176 this%Blag_d = c_null_ptr
177 this%Blaglag_d = c_null_ptr
178 if (associated(this%basis_pos)) nullify(this%basis_pos)
179
180 if (associated(this%abx1)) nullify(this%abx1)
181 if (associated(this%abx2)) nullify(this%abx2)
182 if (associated(this%aby1)) nullify(this%aby1)
183 if (associated(this%aby2)) nullify(this%aby2)
184 if (associated(this%abz1)) nullify(this%abz1)
185 if (associated(this%abz2)) nullify(this%abz2)
186
187 if (associated(this%s)) nullify(this%s)
188 if (associated(this%slag)) nullify(this%slag)
189 if (associated(this%abs1)) nullify(this%abs1)
190 if (associated(this%abs2)) nullify(this%abs2)
191
192 call this%scalar_lags%free()
193
194 if (allocated(this%scalar_abx1)) then
195 deallocate(this%scalar_abx1)
196 end if
197
198 if (allocated(this%scalar_abx2)) then
199 deallocate(this%scalar_abx2)
200 end if
201
202 call this%previous_mesh%free()
203 call this%previous_Xh%free()
204
205 end subroutine chkp_free
206
208 subroutine chkp_sync_host(this)
209 class(chkp_t), intent(inout) :: this
210 integer :: i, j
211
212 if (neko_bcknd_device .eq. 1) then
213 associate(u => this%u, v => this%v, w => this%w, &
214 ulag => this%ulag, vlag => this%vlag, wlag => this%wlag, &
215 p => this%p)
216
217 if (associated(this%u) .and. associated(this%v) .and. &
218 associated(this%w) .and. associated(this%p)) then
219 call u%copy_from(device_to_host, sync = .false.)
220 call v%copy_from(device_to_host, sync = .false.)
221 call w%copy_from(device_to_host, sync = .false.)
222 call p%copy_from(device_to_host, sync = .false.)
223 end if
224
225 if (associated(this%ulag) .and. associated(this%vlag) .and. &
226 associated(this%wlag)) then
227 call ulag%lf(1)%copy_from(device_to_host, sync = .false.)
228 call ulag%lf(2)%copy_from(device_to_host, sync = .false.)
229
230 call vlag%lf(1)%copy_from(device_to_host, sync = .false.)
231 call vlag%lf(2)%copy_from(device_to_host, sync = .false.)
232
233 call wlag%lf(1)%copy_from(device_to_host, sync = .false.)
234 call wlag%lf(2)%copy_from(device_to_host, sync = .false.)
235 call this%abx1%copy_from(device_to_host, sync = .false.)
236 call this%abx2%copy_from(device_to_host, sync = .false.)
237 call this%aby1%copy_from(device_to_host, sync = .false.)
238 call this%aby2%copy_from(device_to_host, sync = .false.)
239 call this%abz1%copy_from(device_to_host, sync = .false.)
240 call this%abz2%copy_from(device_to_host, sync = .false.)
241 end if
242
243 if (associated(this%s)) then
244 call this%s%copy_from(device_to_host, sync = .false.)
245 call this%slag%lf(1)%copy_from(device_to_host, sync = .false.)
246 call this%slag%lf(2)%copy_from(device_to_host, sync = .false.)
247 call this%abs1%copy_from(device_to_host, sync = .false.)
248 call this%abs2%copy_from(device_to_host, sync = .false.)
249 end if
250
251 ! ALE field synchronization
252 if (associated(this%wm_x) .and. associated(this%wm_y) .and. &
253 associated(this%wm_z)) then
254 call this%wm_x%copy_from(device_to_host, sync = .false.)
255 call this%wm_y%copy_from(device_to_host, sync = .false.)
256 call this%wm_z%copy_from(device_to_host, sync = .false.)
257
258 if (associated(this%wm_x_lag) .and. associated(this%wm_y_lag) &
259 .and. associated(this%wm_z_lag)) then
260
261 call this%wm_x_lag%lf(1)%copy_from(device_to_host, &
262 sync = .false.)
263 call this%wm_x_lag%lf(2)%copy_from(device_to_host, &
264 sync = .false.)
265
266 call this%wm_y_lag%lf(1)%copy_from(device_to_host, &
267 sync = .false.)
268 call this%wm_y_lag%lf(2)%copy_from(device_to_host, &
269 sync = .false.)
270
271 call this%wm_z_lag%lf(1)%copy_from(device_to_host, &
272 sync = .false.)
273 call this%wm_z_lag%lf(2)%copy_from(device_to_host, &
274 sync = .false.)
275 end if
276
277 if (associated(this%msh_x) .and. c_associated(this%msh_x_d)) then
278 call device_memcpy(this%msh_x, this%msh_x_d, &
279 size(this%msh_x), device_to_host, .false.)
280 call device_memcpy(this%msh_y, this%msh_y_d, &
281 size(this%msh_y), device_to_host, .false.)
282 call device_memcpy(this%msh_z, this%msh_z_d, &
283 size(this%msh_z), device_to_host, .false.)
284 end if
285 if (associated(this%Blag) .and. c_associated(this%Blag_d)) then
286 call device_memcpy(this%Blag, this%Blag_d, size(this%Blag), &
287 device_to_host, .false.)
288 end if
289 if (associated(this%Blaglag) .and. c_associated(this%Blaglag_d)) then
290 call device_memcpy(this%Blaglag, this%Blaglag_d, &
291 size(this%Blaglag), device_to_host, .false.)
292 end if
293 end if
294
295 ! Multi-scalar lag field synchronization
296 do i = 1, this%scalar_lags%size()
297 block
298 type(field_series_t), pointer :: slag
299 integer :: slag_size
300 slag => this%scalar_lags%get(i)
301 slag_size = slag%size()
302 do j = 1, slag_size
303 call slag%lf(j)%copy_from(device_to_host, sync = .false.)
304 end do
305 end block
306 end do
307
308 ! Multi-scalar ABX field synchronization
309 if (allocated(this%scalar_abx1) .and. allocated(this%scalar_abx2)) then
310 do i = 1, size(this%scalar_abx1)
311 call this%scalar_abx1(i)%ptr%copy_from(device_to_host, &
312 sync = .false.)
313 call this%scalar_abx2(i)%ptr%copy_from(device_to_host, &
314 sync = .false.)
315 end do
316 end if
317 end associate
318 call device_sync(glb_cmd_queue)
319 end if
320
321 end subroutine chkp_sync_host
322
324 subroutine chkp_sync_device(this)
325 class(chkp_t), intent(inout) :: this
326 integer :: i, j
327
328 if (neko_bcknd_device .eq. 1) then
329 associate(u => this%u, v => this%v, w => this%w, &
330 ulag => this%ulag, vlag => this%vlag, wlag => this%wlag, &
331 p => this%p)
332
333 if (associated(this%u) .and. associated(this%v) .and. &
334 associated(this%w)) then
335 call u%copy_from(host_to_device, sync = .false.)
336 call v%copy_from(host_to_device, sync = .false.)
337 call w%copy_from(host_to_device, sync = .false.)
338 call p%copy_from(host_to_device, sync = .false.)
339 end if
340
341 if (associated(this%ulag) .and. associated(this%vlag) .and. &
342 associated(this%wlag)) then
343 call ulag%lf(1)%copy_from(host_to_device, sync = .false.)
344 call ulag%lf(2)%copy_from(host_to_device, sync = .false.)
345
346 call vlag%lf(1)%copy_from(host_to_device, sync = .false.)
347 call vlag%lf(2)%copy_from(host_to_device, sync = .false.)
348
349 call wlag%lf(1)%copy_from(host_to_device, sync = .false.)
350 call wlag%lf(2)%copy_from(host_to_device, sync = .false.)
351 end if
352
353 if (associated(this%s)) then
354 call this%s%copy_from(host_to_device, sync = .false.)
355
356 call this%slag%lf(1)%copy_from(host_to_device, sync = .false.)
357 call this%slag%lf(2)%copy_from(host_to_device, sync = .false.)
358 call this%abs1%copy_from(host_to_device, sync = .false.)
359 call this%abs2%copy_from(host_to_device, sync = .false.)
360 end if
361
362 ! ALE field synchronization
363 if (associated(this%wm_x) .and. associated(this%wm_y) .and. &
364 associated(this%wm_z)) then
365
366 call this%wm_x%copy_from(host_to_device, sync = .false.)
367 call this%wm_y%copy_from(host_to_device, sync = .false.)
368 call this%wm_z%copy_from(host_to_device, sync = .false.)
369
370 if (associated(this%wm_x_lag) .and. &
371 associated(this%wm_y_lag) .and. &
372 associated(this%wm_z_lag)) then
373 call this%wm_x_lag%lf(1)%copy_from(host_to_device, &
374 sync = .false.)
375 call this%wm_x_lag%lf(2)%copy_from(host_to_device, &
376 sync = .false.)
377
378 call this%wm_y_lag%lf(1)%copy_from(host_to_device, &
379 sync = .false.)
380 call this%wm_y_lag%lf(2)%copy_from(host_to_device, &
381 sync = .false.)
382
383 call this%wm_z_lag%lf(1)%copy_from(host_to_device, &
384 sync = .false.)
385 call this%wm_z_lag%lf(2)%copy_from(host_to_device, &
386 sync = .false.)
387 end if
388
389 if (associated(this%msh_x) .and. c_associated(this%msh_x_d)) then
390 call device_memcpy(this%msh_x, this%msh_x_d, &
391 size(this%msh_x), host_to_device, .false.)
392 call device_memcpy(this%msh_y, this%msh_y_d, &
393 size(this%msh_y), host_to_device, .false.)
394 call device_memcpy(this%msh_z, this%msh_z_d, &
395 size(this%msh_z), host_to_device, .false.)
396 end if
397
398 if (associated(this%Blag) .and. c_associated(this%Blag_d)) then
399 call device_memcpy(this%Blag, this%Blag_d, size(this%Blag), &
400 host_to_device, .false.)
401 end if
402
403 if (associated(this%Blaglag) .and. &
404 c_associated(this%Blaglag_d)) then
405 call device_memcpy(this%Blaglag, this%Blaglag_d, &
406 size(this%Blaglag), host_to_device, .false.)
407 end if
408 end if
409
410 ! Multi-scalar lag field synchronization
411 if (allocated(this%scalar_lags%items) .and. &
412 this%scalar_lags%size() > 0) then
413 do i = 1, this%scalar_lags%size()
414 block
415 type(field_series_t), pointer :: slag
416 integer :: slag_size, dof_size
417 slag => this%scalar_lags%get(i)
418 slag_size = slag%size()
419 dof_size = slag%f%dof%size()
420 do j = 1, slag_size
421 call slag%lf(j)%copy_from(host_to_device, sync = .false.)
422 end do
423 end block
424 end do
425 end if
426
427 ! Multi-scalar ABX field synchronization
428 if (allocated(this%scalar_abx1) .and. allocated(this%scalar_abx2)) then
429 do i = 1, size(this%scalar_abx1)
430 call this%scalar_abx1(i)%ptr%copy_from(host_to_device, &
431 sync = .false.)
432 call this%scalar_abx2(i)%ptr%copy_from(host_to_device, &
433 sync = .false.)
434 end do
435 end if
436 end associate
437 end if
438
439 end subroutine chkp_sync_device
440
442 subroutine chkp_add_fluid(this, u, v, w, p)
443 class(chkp_t), intent(inout) :: this
444 type(field_t), target :: u
445 type(field_t), target :: v
446 type(field_t), target :: w
447 type(field_t), target :: p
448
449 ! Check that all velocity components are defined on the same
450 ! function space
451 if ( u%Xh .ne. v%Xh .or. &
452 u%Xh .ne. w%Xh ) then
453 call neko_error('Different function spaces for each velocity component')
454 end if
455
456 ! Check that both velocity and pressure is defined on the same mesh
457 if ( u%msh%nelv .ne. p%msh%nelv ) then
458 call neko_error('Velocity and pressure defined on different meshes')
459 end if
460
461 this%u => u
462 this%v => v
463 this%w => w
464 this%p => p
465
466 end subroutine chkp_add_fluid
467
469 subroutine chkp_add_lag(this, ulag, vlag, wlag)
470 class(chkp_t), intent(inout) :: this
471 type(field_series_t), target :: ulag
472 type(field_series_t), target :: vlag
473 type(field_series_t), target :: wlag
474
475 this%ulag => ulag
476 this%vlag => vlag
477 this%wlag => wlag
478
479 end subroutine chkp_add_lag
480
481
482
484 subroutine chkp_add_scalar(this, s, slag, abs1, abs2)
485 class(chkp_t), intent(inout) :: this
486 type(field_t), target, intent(in) :: s
487 type(field_series_t), target, intent(in) :: slag
488 type(field_t), target, intent(in), optional :: abs1, abs2
489
490 this%s => s
491 this%slag => slag
492
493 if (present(abs1)) this%abs1 => abs1
494 if (present(abs2)) this%abs2 => abs2
495
496 end subroutine chkp_add_scalar
497
499 subroutine chkp_add_ale(this, x, y, z, x_d, y_d, z_d, &
500 Blag, Blaglag, Blag_d, Blaglag_d, wm_x, wm_y, wm_z, &
501 wm_x_lag, wm_y_lag, wm_z_lag, pivot_pos, pivot_vel_lag, &
502 basis_pos, basis_vel_lag)
503 class(chkp_t), intent(inout) :: this
504 type(field_t), target, intent(in) :: wm_x, wm_y, wm_z
505 real(kind=rp), intent(in), pointer :: pivot_pos(:), pivot_vel_lag(:,:)
506 type(field_series_t), target, intent(in) :: wm_x_lag, wm_y_lag, wm_z_lag
507 real(kind=rp), intent(in), pointer :: x(:,:,:,:), y(:,:,:,:), z(:,:,:,:)
508 real(kind=rp), pointer, intent(in) :: blag(:,:,:,:), blaglag(:,:,:,:)
509 real(kind=rp), intent(in), pointer :: basis_pos(:)
510 real(kind=rp), intent(in), pointer :: basis_vel_lag(:,:)
511 type(c_ptr), intent(in), value :: x_d, y_d, z_d
512 type(c_ptr), intent(in), value :: Blag_d, Blaglag_d
513
514 this%msh_x => x
515 this%msh_y => y
516 this%msh_z => z
517 this%msh_x_d = x_d
518 this%msh_y_d = y_d
519 this%msh_z_d = z_d
520 this%wm_x => wm_x
521 this%wm_y => wm_y
522 this%wm_z => wm_z
523 this%wm_x_lag => wm_x_lag
524 this%wm_y_lag => wm_y_lag
525 this%wm_z_lag => wm_z_lag
526 this%Blag => blag
527 this%Blaglag => blaglag
528 this%Blag_d = blag_d
529 this%Blaglag_d = blaglag_d
530 this%pivot_pos => pivot_pos
531 this%pivot_vel_lag => pivot_vel_lag
532 this%basis_pos => basis_pos
533 this%basis_vel_lag => basis_vel_lag
534 end subroutine chkp_add_ale
535
537 pure function chkp_restart_time(this) result(rtime)
538 class(chkp_t), intent(in) :: this
539 real(kind=dp) :: rtime
540
541 rtime = this%t
542 end function chkp_restart_time
543
545 subroutine chkp_set_time_state(this, time_state)
546 class(chkp_t), intent(in) :: this
547 type(time_state_t), intent(inout) :: time_state
548
549 time_state%t = this%t
550 time_state%dtlag = this%dtlag
551 time_state%tlag = this%tlag
552 end subroutine chkp_set_time_state
553
554end module checkpoint
Copy data between host and device (or device and device)
Definition device.F90:72
Synchronize a device or stream.
Definition device.F90:114
Defines a checkpoint.
subroutine chkp_sync_host(this)
Synchronize checkpoint with device.
subroutine chkp_set_time_state(this, time_state)
Set time state.
subroutine chkp_sync_device(this)
Synchronize device with checkpoint.
subroutine chkp_add_ale(this, x, y, z, x_d, y_d, z_d, blag, blaglag, blag_d, blaglag_d, wm_x, wm_y, wm_z, wm_x_lag, wm_y_lag, wm_z_lag, pivot_pos, pivot_vel_lag, basis_pos, basis_vel_lag)
Add mesh velocity and other required variables to checkpointing for ALE.
pure real(kind=dp) function chkp_restart_time(this)
Return restart time from a loaded checkpoint.
subroutine chkp_free(this)
Reset checkpoint.
subroutine chkp_add_lag(this, ulag, vlag, wlag)
Add lagged velocity terms.
subroutine chkp_add_fluid(this, u, v, w, p)
Add a fluid to the checkpoint.
subroutine chkp_init(this)
Initialize checkpoint structure with mandatory data.
subroutine chkp_add_scalar(this, s, slag, abs1, abs2)
Add a scalar to checkpointing.
Device abstraction, common interface for various accelerators.
Definition device.F90:34
integer, parameter, public host_to_device
Definition device.F90:48
integer, parameter, public device_to_host
Definition device.F90:48
type(c_ptr), bind(C), public glb_cmd_queue
Global command queue.
Definition device.F90:52
Contains the field_series_list_t type for managing multiple field series.
Contains the field_serties_t type.
Defines a field.
Definition field.f90:34
Implements global_interpolation given a dofmap.
real(kind=dp), parameter, public glob_interp_tol
Definition math.f90:60
real(kind=rp), parameter, public neko_eps
Machine epsilon .
Definition math.f90:70
Defines a mesh.
Definition mesh.f90:34
Build configurations.
integer, parameter neko_bcknd_device
integer, parameter, public dp
Definition num_types.f90:9
integer, parameter, public rp
Global precision used in computations.
Definition num_types.f90:12
Defines a function space.
Definition space.f90:34
Module with things related to the simulation time.
Utilities.
Definition utils.f90:35
field_ptr_t, To easily obtain a pointer to a field
Definition field.f90:83
Stores a series (sequence) of fields, logically connected to a base field, and arranged according to ...
A list of field series pointers, used for managing multiple scalar lag fields.
The function space for the SEM solution fields.
Definition space.f90:63
A struct that contains all info about the time, expand as needed.