46 use,
intrinsic :: iso_c_binding, only : c_associated
56 real(kind=
dp) :: t = 0d0
94 class(
chkp_t),
intent(inout) :: this
103 class(
chkp_t),
intent(inout) :: this
108 if (
allocated(this%payloads))
then
109 do i = 1,
size(this%payloads)
110 if (
associated(this%payloads(i)%ptr))
then
111 call this%payloads(i)%ptr%free()
112 deallocate(this%payloads(i)%ptr)
115 deallocate(this%payloads)
118 call this%previous_mesh%free()
119 call this%previous_Xh%free()
125 class(
chkp_t),
intent(inout) :: this
129 do i = 1, this%payload_count()
130 do j = 1, this%payloads(i)%ptr%field_count()
131 call this%payloads(i)%ptr%fields(j)%ptr%copy_from( &
134 do j = 1, this%payloads(i)%ptr%series_count()
137 do k = 1, this%payloads(i)%ptr%series(j)%ptr%size()
138 call this%payloads(i)%ptr%series(j)%ptr%lf(k)%copy_from( &
143 do j = 1, this%payloads(i)%ptr%array_count()
145 this%payloads(i)%ptr%arrays(j)%ptr%x_d))
then
147 this%payloads(i)%ptr%arrays(j)%ptr%x, &
148 this%payloads(i)%ptr%arrays(j)%ptr%x_d, &
149 size(this%payloads(i)%ptr%arrays(j)%ptr%x), &
153 do j = 1, this%payloads(i)%ptr%mesh_array_count()
155 this%payloads(i)%ptr%mesh_arrays(j)%ptr%x_d))
then
157 this%payloads(i)%ptr%mesh_arrays(j)%ptr%x, &
158 this%payloads(i)%ptr%mesh_arrays(j)%ptr%x_d, &
159 size(this%payloads(i)%ptr%mesh_arrays(j)%ptr%x), &
172 class(
chkp_t),
intent(inout) :: this
175 if (neko_bcknd_device .eq. 1)
then
176 do i = 1, this%payload_count()
177 do j = 1, this%payloads(i)%ptr%field_count()
178 call this%payloads(i)%ptr%fields(j)%ptr%copy_from( &
179 host_to_device, sync = .false.)
181 do j = 1, this%payloads(i)%ptr%series_count()
184 do k = 1, this%payloads(i)%ptr%series(j)%ptr%size()
185 call this%payloads(i)%ptr%series(j)%ptr%lf(k)%copy_from( &
186 host_to_device, sync = .false.)
190 do j = 1, this%payloads(i)%ptr%array_count()
192 this%payloads(i)%ptr%arrays(j)%ptr%x_d))
then
193 call device_memcpy( &
194 this%payloads(i)%ptr%arrays(j)%ptr%x, &
195 this%payloads(i)%ptr%arrays(j)%ptr%x_d, &
196 size(this%payloads(i)%ptr%arrays(j)%ptr%x), &
197 host_to_device, .false.)
200 do j = 1, this%payloads(i)%ptr%mesh_array_count()
202 this%payloads(i)%ptr%mesh_arrays(j)%ptr%x_d))
then
203 call device_memcpy( &
204 this%payloads(i)%ptr%mesh_arrays(j)%ptr%x, &
205 this%payloads(i)%ptr%mesh_arrays(j)%ptr%x_d, &
206 size(this%payloads(i)%ptr%mesh_arrays(j)%ptr%x), &
207 host_to_device, .false.)
219 class(
chkp_t),
intent(in) :: this
223 do i = 1, this%payload_count()
224 if (index(trim(this%payloads(i)%ptr%name),
"scalars/") .eq. 1)
then
235 class(
chkp_t),
intent(inout) :: this
236 character(len=*),
intent(in) :: name
237 type(checkpoint_payload_t),
pointer :: payload
238 type(checkpoint_payload_ptr_t),
allocatable :: tmp(:)
241 do i = 1, this%payload_count()
242 if (trim(this%payloads(i)%ptr%name) .eq. trim(name))
then
243 payload => this%payloads(i)%ptr
248 n = this%payload_count()
250 if (n .gt. 0) tmp(1:n) = this%payloads
251 allocate(tmp(n + 1)%ptr)
252 call tmp(n + 1)%ptr%init(name)
253 call move_alloc(tmp, this%payloads)
254 payload => this%payloads(n + 1)%ptr
262 class(
chkp_t),
intent(in) :: this
263 character(len=*),
intent(in) :: name
264 type(checkpoint_payload_t),
pointer :: payload
268 do i = 1, this%payload_count()
269 if (trim(this%payloads(i)%ptr%name) .eq. trim(name))
then
270 payload => this%payloads(i)%ptr
275 call neko_error(
"Checkpoint payload '" // trim(name) //
"' not found")
282 class(
chkp_t),
intent(in) :: this
285 if (
allocated(this%payloads))
then
286 n =
size(this%payloads)
296 class(
chkp_t),
intent(inout) :: this
297 type(time_state_t),
target,
intent(inout) :: time_state
298 type(checkpoint_payload_t),
pointer :: payload
300 payload => this%add_payload(
"time")
301 call payload%add_array_dp(
"tlag",
time_state%tlag, replicated = .true.)
302 call payload%add_array_dp(
"dtlag",
time_state%dtlag, replicated = .true.)
310 class(
chkp_t),
intent(in) :: this
311 real(kind=dp),
pointer,
intent(out) :: tlag(:), dtlag(:)
312 type(checkpoint_payload_t),
pointer :: payload
313 type(checkpoint_array_t),
pointer :: array
315 payload => this%get_payload(
"time")
316 array => payload%find_array(
"tlag")
318 array => payload%find_array(
"dtlag")
326 class(
chkp_t),
intent(in) :: this
327 real(kind=dp) :: rtime
335 class(
chkp_t),
intent(in) :: this
336 type(time_state_t),
intent(inout) :: time_state
337 real(kind=dp),
pointer :: tlag(:), dtlag(:)
339 call this%get_time_history(tlag, dtlag)
Copy data between host and device (or device and device)
Synchronize a device or stream.
Format-independent checkpoint payloads.
Defines format-independent checkpoint registration and restart state.
pure integer function chkp_payload_count(this)
Return the number of registered checkpoint payloads.
subroutine chkp_sync_host(this)
Synchronise registered checkpoint data from device to host.
subroutine chkp_set_time_state(this, time_state)
Restore a simulation time state from the checkpoint.
subroutine chkp_sync_device(this)
Synchronise registered checkpoint data from host to device.
pure real(kind=dp) function chkp_restart_time(this)
Return the restart time from a loaded checkpoint.
subroutine chkp_free(this)
Release all checkpoint payloads and restart metadata.
pure integer function chkp_scalar_payload_count(this)
Return the number of registered scalar payloads.
subroutine chkp_get_time_history(this, tlag, dtlag)
Return pointers to the simulation time history.
type(checkpoint_payload_t) function, pointer chkp_add_payload(this, name)
Add or return a checkpoint payload.
subroutine chkp_init(this)
Initialize an empty checkpoint.
type(checkpoint_payload_t) function, pointer chkp_get_payload(this, name)
Return a checkpoint payload by name.
subroutine chkp_add_time_state(this, time_state)
Register the simulation time history as a replicated payload.
Device abstraction, common interface for various accelerators.
integer, parameter, public host_to_device
integer, parameter, public device_to_host
type(c_ptr), bind(C), public glb_cmd_queue
Global command queue.
Implements global_interpolation given a dofmap.
real(kind=dp), parameter, public glob_interp_tol
integer, parameter neko_bcknd_device
integer, parameter, public dp
integer, parameter, public rp
Global precision used in computations.
Defines a function space.
Module with things related to the simulation time.
Collection of live simulation data registered for checkpointing.
A named real array and its selection in a global checkpoint dataset.
Pointer wrapper used to keep payload addresses stable as the list grows.
A named collection of live fields to checkpoint together.
The function space for the SEM solution fields.
A struct that contains all info about the time, expand as needed.