84 class(*),
target,
intent(in) :: data
85 real(kind=
rp),
intent(in),
optional :: t
87 character(len=5) :: id_str
88 character(len=1024) :: fname
89 integer :: ierr, suffix_pos, optional_fields
90 type(
field_t),
pointer :: u, v, w, p, s
91 type(
field_t),
pointer :: wm_x => null()
92 type(
field_t),
pointer :: wm_y => null()
93 type(
field_t),
pointer :: wm_z => null()
94 type(
field_t),
pointer :: abx1, abx2
95 type(
field_t),
pointer :: aby1, aby2
96 type(
field_t),
pointer :: abz1, abz2
97 type(
field_t),
pointer :: abs1, abs2
105 real(kind=
rp),
pointer :: msh_x(:,:,:,:) => null()
106 real(kind=
rp),
pointer :: msh_y(:,:,:,:) => null()
107 real(kind=
rp),
pointer :: msh_z(:,:,:,:) => null()
108 real(kind=
rp),
pointer :: blag(:,:,:,:) => null()
109 real(kind=
rp),
pointer :: blaglag(:,:,:,:) => null()
110 real(kind=
rp),
pointer :: pivot_pos(:) => null()
111 real(kind=
rp),
pointer :: pivot_vel_lag(:,:) => null()
112 real(kind=
rp),
pointer :: basis_pos(:) => null()
113 real(kind=
rp),
pointer :: basis_vel_lag(:,:) => null()
114 real(kind=
rp),
pointer :: dtlag(:), tlag(:)
115 type(
mesh_t),
pointer :: msh
116 type(mpi_status) :: status
118 integer (kind=MPI_OFFSET_KIND) :: mpi_offset, byte_offset
119 integer(kind=i8) :: n_glb_dofs, dof_offset
120 logical :: write_lag, write_scalar, write_dtlag
122 logical :: write_scalarlag, write_abvel
134 if ( .not.
associated(data%u) .or. &
135 .not.
associated(data%v) .or. &
136 .not.
associated(data%w) .or. &
137 .not.
associated(data%p) )
then
149 if (
associated(data%ulag))
then
154 optional_fields = optional_fields + 1
159 if (
associated(data%s))
then
161 write_scalar = .true.
162 optional_fields = optional_fields + 2
164 write_scalar = .false.
167 if (
associated(data%tlag))
then
171 optional_fields = optional_fields + 4
173 write_dtlag = .false.
176 write_abvel = .false.
177 if (
associated(data%abx1))
then
184 optional_fields = optional_fields + 8
188 write_scalarlag = .false.
189 if (
associated(data%abs1))
then
193 optional_fields = optional_fields + 16
194 write_scalarlag = .true.
198 if (
associated(data%wm_x))
then
205 wm_x_lag => data%wm_x_lag
206 wm_y_lag => data%wm_y_lag
207 wm_z_lag => data%wm_z_lag
209 blaglag => data%Blaglag
210 pivot_pos => data%pivot_pos
211 pivot_vel_lag => data%pivot_vel_lag
212 basis_pos => data%basis_pos
213 basis_vel_lag => data%basis_vel_lag
214 optional_fields = optional_fields + 32
222 dof_offset = int(msh%offset_el,
i8) * int(u%Xh%lx * u%Xh%ly * u%Xh%lz,
i8)
223 n_glb_dofs = int(u%Xh%lx * u%Xh%ly * u%Xh%lz,
i8) * int(msh%glb_nelv,
i8)
226 if (.not. this%overwrite)
call this%increment_counter()
227 fname = trim(this%get_fname())
229 call mpi_file_open(
neko_comm, trim(fname), &
230 mpi_mode_wronly + mpi_mode_create, mpi_info_null, fh, ierr)
231 call mpi_file_write_all(fh, msh%glb_nelv, 1, mpi_integer, status, ierr)
232 call mpi_file_write_all(fh, msh%gdim, 1, mpi_integer, status, ierr)
233 call mpi_file_write_all(fh, u%Xh%lx, 1, mpi_integer, status, ierr)
234 call mpi_file_write_all(fh, optional_fields, 1, mpi_integer, status, ierr)
235 call mpi_file_write_all(fh, time, 1, mpi_double_precision, status, ierr)
244 byte_offset = byte_offset + &
246 call mpi_file_write_at_all(fh, byte_offset,u%x, u%dof%size(), &
250 mpi_offset = mpi_offset +&
253 byte_offset = mpi_offset + &
255 call mpi_file_write_at_all(fh, byte_offset, v%x, v%dof%size(), &
259 byte_offset = mpi_offset + &
261 call mpi_file_write_at_all(fh, byte_offset, w%x, w%dof%size(), &
265 byte_offset = mpi_offset + &
267 call mpi_file_write_at_all(fh, byte_offset, p%x, p%dof%size(), &
277 do i = 1, ulag%size()
278 byte_offset = mpi_offset + &
283 associate(x => ulag%lf(i)%x)
284 call mpi_file_write_at_all(fh, byte_offset, x, &
290 do i = 1, vlag%size()
291 byte_offset = mpi_offset + &
296 associate(x => vlag%lf(i)%x)
297 call mpi_file_write_at_all(fh, byte_offset, x, &
300 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
303 do i = 1, wlag%size()
304 byte_offset = mpi_offset + &
305 dof_offset * int(mpi_real_prec_size, i8)
309 associate(x => wlag%lf(i)%x)
310 call mpi_file_write_at_all(fh, byte_offset, x, &
311 wlag%lf(i)%dof%size(), mpi_real_precision, status, ierr)
313 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
318 if (write_scalar)
then
319 byte_offset = mpi_offset + &
320 dof_offset * int(mpi_real_prec_size, i8)
321 call mpi_file_write_at_all(fh, byte_offset, s%x, p%dof%size(), &
322 mpi_real_precision, status, ierr)
323 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
326 if (write_dtlag)
then
327 call mpi_file_write_at_all(fh, mpi_offset, tlag, 10, &
328 mpi_real_precision, status, ierr)
329 mpi_offset = mpi_offset + 10_i8 * int(mpi_real_prec_size, i8)
330 call mpi_file_write_at_all(fh, mpi_offset, dtlag, 10, &
331 mpi_real_precision, status, ierr)
332 mpi_offset = mpi_offset + 10_i8 * int(mpi_real_prec_size, i8)
335 if (write_abvel)
then
336 byte_offset = mpi_offset + &
337 dof_offset * int(mpi_real_prec_size, i8)
338 call mpi_file_write_at_all(fh, byte_offset, abx1%x, abx1%dof%size(), &
339 mpi_real_precision, status, ierr)
340 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
341 byte_offset = mpi_offset + &
342 dof_offset * int(mpi_real_prec_size, i8)
343 call mpi_file_write_at_all(fh, byte_offset, abx2%x, abx1%dof%size(), &
344 mpi_real_precision, status, ierr)
345 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
346 byte_offset = mpi_offset + &
347 dof_offset * int(mpi_real_prec_size, i8)
348 call mpi_file_write_at_all(fh, byte_offset, aby1%x, abx1%dof%size(), &
349 mpi_real_precision, status, ierr)
350 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
351 byte_offset = mpi_offset + &
352 dof_offset * int(mpi_real_prec_size, i8)
353 call mpi_file_write_at_all(fh, byte_offset, aby2%x, abx1%dof%size(), &
354 mpi_real_precision, status, ierr)
355 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
356 byte_offset = mpi_offset + &
357 dof_offset * int(mpi_real_prec_size, i8)
358 call mpi_file_write_at_all(fh, byte_offset, abz1%x, abx1%dof%size(), &
359 mpi_real_precision, status, ierr)
360 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
361 byte_offset = mpi_offset + &
362 dof_offset * int(mpi_real_prec_size, i8)
363 call mpi_file_write_at_all(fh, byte_offset, abz2%x, abx1%dof%size(), &
364 mpi_real_precision, status, ierr)
365 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
368 if (write_scalarlag)
then
369 do i = 1, slag%size()
370 byte_offset = mpi_offset + &
371 dof_offset * int(mpi_real_prec_size, i8)
375 associate(x => slag%lf(i)%x)
376 call mpi_file_write_at_all(fh, byte_offset, x, &
377 slag%lf(i)%dof%size(), mpi_real_precision, status, ierr)
379 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
382 byte_offset = mpi_offset + &
383 dof_offset * int(mpi_real_prec_size, i8)
384 call mpi_file_write_at_all(fh, byte_offset, abs1%x, abx1%dof%size(), &
385 mpi_real_precision, status, ierr)
386 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
387 byte_offset = mpi_offset + &
388 dof_offset * int(mpi_real_prec_size, i8)
389 call mpi_file_write_at_all(fh, byte_offset, abs2%x, abx1%dof%size(), &
390 mpi_real_precision, status, ierr)
391 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
395 byte_offset = mpi_offset + &
396 dof_offset * int(mpi_real_prec_size, i8)
397 call mpi_file_write_at_all(fh, byte_offset, msh_x,
size(msh_x), &
398 mpi_real_precision, status, ierr)
399 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
401 byte_offset = mpi_offset + &
402 dof_offset * int(mpi_real_prec_size, i8)
403 call mpi_file_write_at_all(fh, byte_offset, msh_y,
size(msh_y), &
404 mpi_real_precision, status, ierr)
405 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
407 byte_offset = mpi_offset + &
408 dof_offset * int(mpi_real_prec_size, i8)
409 call mpi_file_write_at_all(fh, byte_offset, msh_z,
size(msh_z), &
410 mpi_real_precision, status, ierr)
411 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
413 byte_offset = mpi_offset + &
414 dof_offset * int(mpi_real_prec_size, i8)
415 call mpi_file_write_at_all(fh, byte_offset, wm_x%x, wm_x%dof%size(), &
416 mpi_real_precision, status, ierr)
417 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
419 byte_offset = mpi_offset + &
420 dof_offset * int(mpi_real_prec_size, i8)
421 call mpi_file_write_at_all(fh, byte_offset, wm_y%x, wm_y%dof%size(), &
422 mpi_real_precision, status, ierr)
423 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
425 byte_offset = mpi_offset + &
426 dof_offset * int(mpi_real_prec_size, i8)
427 call mpi_file_write_at_all(fh, byte_offset, wm_z%x, wm_z%dof%size(), &
428 mpi_real_precision, status, ierr)
429 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
431 do i = 1, wm_x_lag%size()
432 byte_offset = mpi_offset + &
433 dof_offset * int(mpi_real_prec_size, i8)
437 associate(x => wm_x_lag%lf(i)%x)
438 call mpi_file_write_at_all(fh, byte_offset, x, &
439 wm_x_lag%lf(i)%dof%size(), mpi_real_precision, status, ierr)
441 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
444 do i = 1, wm_y_lag%size()
445 byte_offset = mpi_offset + &
446 dof_offset * int(mpi_real_prec_size, i8)
450 associate(x => wm_y_lag%lf(i)%x)
451 call mpi_file_write_at_all(fh, byte_offset, x, &
452 wm_y_lag%lf(i)%dof%size(), mpi_real_precision, status, ierr)
454 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
457 do i = 1, wm_z_lag%size()
458 byte_offset = mpi_offset + &
459 dof_offset * int(mpi_real_prec_size, i8)
463 associate(x => wm_z_lag%lf(i)%x)
464 call mpi_file_write_at_all(fh, byte_offset, x, &
465 wm_z_lag%lf(i)%dof%size(), mpi_real_precision, status, ierr)
467 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
470 byte_offset = mpi_offset + &
471 dof_offset * int(mpi_real_prec_size, i8)
472 call mpi_file_write_at_all(fh, byte_offset, blag,
size(blag), &
473 mpi_real_precision, status, ierr)
474 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
476 byte_offset = mpi_offset + &
477 dof_offset * int(mpi_real_prec_size, i8)
478 call mpi_file_write_at_all(fh, byte_offset, blaglag,
size(blaglag), &
479 mpi_real_precision, status, ierr)
480 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
482 call mpi_file_write_at_all(fh, mpi_offset, pivot_pos,
size(pivot_pos), &
483 mpi_real_precision, status, ierr)
484 mpi_offset = mpi_offset + &
485 int(
size(pivot_pos), i8) * int(mpi_real_prec_size, i8)
486 call mpi_file_write_at_all(fh, mpi_offset, pivot_vel_lag, &
487 size(pivot_vel_lag), mpi_real_precision, status, ierr)
488 mpi_offset = mpi_offset + &
489 int(
size(pivot_vel_lag), i8) * int(mpi_real_prec_size, i8)
490 call mpi_file_write_at_all(fh, mpi_offset, basis_pos, &
491 size(basis_pos), mpi_real_precision, status, ierr)
492 mpi_offset = mpi_offset + &
493 int(
size(basis_pos), i8) * int(mpi_real_prec_size, i8)
494 call mpi_file_write_at_all(fh, mpi_offset, basis_vel_lag, &
495 size(basis_vel_lag), mpi_real_precision, status, ierr)
496 mpi_offset = mpi_offset + &
497 int(
size(basis_vel_lag), i8) * int(mpi_real_prec_size, i8)
500 call mpi_file_close(fh, ierr)
502 if (ierr .ne. mpi_success)
then
503 call neko_error(
'Error writing checkpoint file ' // trim(fname))
511 class(*),
target,
intent(inout) :: data
512 type(chkp_t),
pointer :: chkp
513 character(len=5) :: id_str
514 character(len=1024) :: fname
515 integer :: ierr, suffix_pos
516 type(field_t),
pointer :: u, v, w, p, s
517 type(field_t),
pointer :: wm_x => null()
518 type(field_t),
pointer :: wm_y => null()
519 type(field_t),
pointer :: wm_z => null()
520 type(field_series_t),
pointer :: ulag => null()
521 type(field_series_t),
pointer :: vlag => null()
522 type(field_series_t),
pointer :: wlag => null()
523 type(field_series_t),
pointer :: wm_x_lag => null()
524 type(field_series_t),
pointer :: wm_y_lag => null()
525 type(field_series_t),
pointer :: wm_z_lag => null()
526 type(field_series_t),
pointer :: slag => null()
527 type(mesh_t),
pointer :: msh
528 type(mpi_status) :: status
530 type(field_t),
pointer :: abx1, abx2
531 type(field_t),
pointer :: aby1, aby2
532 type(field_t),
pointer :: abz1, abz2
533 type(field_t),
pointer :: abs1, abs2
534 real(kind=rp),
pointer :: blag(:,:,:,:) => null()
535 real(kind=rp),
pointer :: blaglag(:,:,:,:) => null()
536 real(kind=rp),
pointer :: msh_x(:,:,:,:) => null()
537 real(kind=rp),
pointer :: msh_y(:,:,:,:) => null()
538 real(kind=rp),
pointer :: msh_z(:,:,:,:) => null()
539 real(kind=rp),
pointer :: pivot_pos(:) => null()
540 real(kind=rp),
pointer :: pivot_vel_lag(:,:) => null()
541 real(kind=rp),
pointer :: basis_pos(:) => null()
542 real(kind=rp),
pointer :: basis_vel_lag(:,:) => null()
543 real(kind=rp),
allocatable :: x_coord(:,:,:,:)
544 real(kind=rp),
allocatable :: y_coord(:,:,:,:)
545 real(kind=rp),
allocatable :: z_coord(:,:,:,:)
546 real(kind=rp),
pointer :: dtlag(:), tlag(:)
547 integer (kind=MPI_OFFSET_KIND) :: mpi_offset, byte_offset
548 integer(kind=i8) :: n_glb_dofs, dof_offset
549 integer :: glb_nelv, gdim, lx, have_lag, have_scalar, nel
550 integer :: optional_fields, have_dtlag
551 integer :: have_abvel, have_scalarlag
553 logical :: read_lag, read_scalar, read_dtlag, read_abvel, read_scalarlag
556 real(kind=rp) :: center_x, center_y, center_z
558 type(dofmap_t) :: dof
560 call this%check_exists()
565 if ( .not.
associated(data%u) .or. &
566 .not.
associated(data%v) .or. &
567 .not.
associated(data%w) .or. &
568 .not.
associated(data%p) )
then
569 call neko_error(
'Checkpoint not initialized')
576 this%chkp_Xh => data%previous_Xh
578 if (
allocated(data%previous_mesh%elements))
then
579 msh => data%previous_mesh
580 this%mesh2mesh = .true.
581 tol = data%mesh2mesh_tol
584 this%mesh2mesh = .false.
587 if (
associated(data%ulag))
then
596 if (
associated(data%s))
then
600 read_scalar = .false.
602 if (
associated(data%dtlag))
then
610 if (
associated(data%abx1))
then
619 read_scalarlag = .false.
620 if (
associated(data%abs1))
then
624 read_scalarlag = .true.
628 if (
associated(data%wm_x))
then
635 wm_x_lag => data%wm_x_lag
636 wm_y_lag => data%wm_y_lag
637 wm_z_lag => data%wm_z_lag
639 blaglag => data%Blaglag
640 pivot_pos => data%pivot_pos
641 pivot_vel_lag => data%pivot_vel_lag
642 basis_pos => data%basis_pos
643 basis_vel_lag => data%basis_vel_lag
650 call neko_error(
'Invalid data')
653 fname = trim(this%get_fname())
654 call neko_log%message(
"Reading checkpoint from file: " // trim(fname), &
656 call mpi_file_open(neko_comm, trim(fname), &
657 mpi_mode_rdonly, mpi_info_null, fh, ierr)
658 call mpi_file_read_all(fh, glb_nelv, 1, mpi_integer, status, ierr)
659 call mpi_file_read_all(fh, gdim, 1, mpi_integer, status, ierr)
660 call mpi_file_read_all(fh, lx, 1, mpi_integer, status, ierr)
661 call mpi_file_read_all(fh, optional_fields, 1, mpi_integer, status, ierr)
662 call mpi_file_read_all(fh, chkp%t, 1, mpi_double_precision, status, ierr)
664 have_lag = mod(optional_fields,2)/1
665 have_scalar = mod(optional_fields,4)/2
666 have_dtlag = mod(optional_fields,8)/4
667 have_abvel = mod(optional_fields,16)/8
668 have_scalarlag = mod(optional_fields,32)/16
669 have_ale = mod(optional_fields,64)/32
671 if ( ( glb_nelv .ne. msh%glb_nelv ) .or. &
672 ( gdim .ne. msh%gdim) .or. &
673 ( (have_lag .eq. 0) .and. (read_lag) ) .or. &
674 ( (have_scalar .eq. 0) .and. (read_scalar) ) )
then
675 call neko_error(
'Checkpoint does not match case')
679 if (gdim .eq. 3)
then
680 call this%chkp_Xh%init(gll, lx, lx, lx)
682 call this%chkp_Xh%init(gll, lx, lx)
684 if (this%mesh2mesh)
then
686 call neko_error(
'ALE does not yet support mesh2mesh ' // &
687 'interpolation for restart!')
689 call dof%init(msh, this%chkp_Xh)
690 call this%global_interp%init(dof, neko_comm, tol = tol)
691 call this%global_interp%find_points(u%dof%x, u%dof%y, u%dof%z, &
694 call this%space_interp%init(this%sim_Xh, this%chkp_Xh)
696 dof_offset = int(msh%offset_el, i8) * int(this%chkp_Xh%lxyz, i8)
697 n_glb_dofs = int(this%chkp_Xh%lxyz, i8) * int(msh%glb_nelv, i8)
703 byte_offset = 4_i8 * int(mpi_integer_size, i8) + &
704 int(mpi_double_precision_size, i8)
705 byte_offset = byte_offset + &
706 dof_offset * int(mpi_real_prec_size, i8)
707 call this%read_field(fh, byte_offset, u%x, nel)
708 mpi_offset = 4_i8 * int(mpi_integer_size, i8) + &
709 int(mpi_double_precision_size, i8)
710 mpi_offset = mpi_offset +&
711 n_glb_dofs * int(mpi_real_prec_size, i8)
713 byte_offset = mpi_offset + &
714 dof_offset * int(mpi_real_prec_size, i8)
715 call this%read_field(fh, byte_offset, v%x, nel)
716 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
718 byte_offset = mpi_offset + &
719 dof_offset * int(mpi_real_prec_size, i8)
720 call this%read_field(fh, byte_offset, w%x, nel)
721 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
723 byte_offset = mpi_offset + &
724 dof_offset * int(mpi_real_prec_size, i8)
725 call this%read_field(fh, byte_offset, p%x, nel)
726 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
733 do i = 1, ulag%size()
734 byte_offset = mpi_offset + &
735 dof_offset * int(mpi_real_prec_size, i8)
736 call this%read_field(fh, byte_offset, ulag%lf(i)%x, nel)
737 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
740 do i = 1, vlag%size()
741 byte_offset = mpi_offset + &
742 dof_offset * int(mpi_real_prec_size, i8)
743 call this%read_field(fh, byte_offset, vlag%lf(i)%x, nel)
744 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
747 do i = 1, wlag%size()
748 byte_offset = mpi_offset + &
749 dof_offset * int(mpi_real_prec_size, i8)
750 call this%read_field(fh, byte_offset, wlag%lf(i)%x, nel)
751 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
755 if (read_scalar)
then
756 byte_offset = mpi_offset + &
757 dof_offset * int(mpi_real_prec_size, i8)
758 call this%read_field(fh, byte_offset, s%x, nel)
759 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
762 if (read_dtlag .and. have_dtlag .eq. 1)
then
763 call mpi_file_read_at_all(fh, mpi_offset, tlag, 10, &
764 mpi_real_precision, status, ierr)
765 mpi_offset = mpi_offset + 10_i8 * int(mpi_real_prec_size, i8)
766 call mpi_file_read_at_all(fh, mpi_offset, dtlag, 10, &
767 mpi_real_precision, status, ierr)
768 mpi_offset = mpi_offset + 10_i8 * int(mpi_real_prec_size, i8)
771 if (read_abvel .and. have_abvel .eq. 1)
then
772 byte_offset = mpi_offset + &
773 dof_offset * int(mpi_real_prec_size, i8)
774 call this%read_field(fh, byte_offset, abx1%x, nel)
775 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
776 byte_offset = mpi_offset + &
777 dof_offset * int(mpi_real_prec_size, i8)
778 call this%read_field(fh, byte_offset, abx2%x, nel)
779 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
780 byte_offset = mpi_offset + &
781 dof_offset * int(mpi_real_prec_size, i8)
782 call this%read_field(fh, byte_offset, aby1%x, nel)
783 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
784 byte_offset = mpi_offset + &
785 dof_offset * int(mpi_real_prec_size, i8)
786 call this%read_field(fh, byte_offset, aby2%x, nel)
787 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
788 byte_offset = mpi_offset + &
789 dof_offset * int(mpi_real_prec_size, i8)
790 call this%read_field(fh, byte_offset, abz1%x, nel)
791 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
792 byte_offset = mpi_offset + &
793 dof_offset * int(mpi_real_prec_size, i8)
794 call this%read_field(fh, byte_offset, abz2%x, nel)
795 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
797 if (read_scalarlag .and. have_scalarlag .eq. 1)
then
798 do i = 1, slag%size()
799 byte_offset = mpi_offset + &
800 dof_offset * int(mpi_real_prec_size, i8)
801 call this%read_field(fh, byte_offset, slag%lf(i)%x, nel)
802 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
804 byte_offset = mpi_offset + &
805 dof_offset * int(mpi_real_prec_size, i8)
806 call this%read_field(fh, byte_offset, abs1%x, nel)
807 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
808 byte_offset = mpi_offset + &
809 dof_offset * int(mpi_real_prec_size, i8)
810 call this%read_field(fh, byte_offset, abs2%x, nel)
811 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
814 if (read_ale .and. have_ale .eq. 1)
then
816 byte_offset = mpi_offset + &
817 dof_offset * int(mpi_real_prec_size, i8)
818 call this%read_field(fh, byte_offset, msh_x, nel)
819 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
821 byte_offset = mpi_offset + &
822 dof_offset * int(mpi_real_prec_size, i8)
823 call this%read_field(fh, byte_offset, msh_y, nel)
824 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
826 byte_offset = mpi_offset + &
827 dof_offset * int(mpi_real_prec_size, i8)
828 call this%read_field(fh, byte_offset, msh_z, nel)
829 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
831 byte_offset = mpi_offset + &
832 dof_offset * int(mpi_real_prec_size, i8)
833 call this%read_field(fh, byte_offset, wm_x%x, nel)
834 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
836 byte_offset = mpi_offset + &
837 dof_offset * int(mpi_real_prec_size, i8)
838 call this%read_field(fh, byte_offset, wm_y%x, nel)
839 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
841 byte_offset = mpi_offset + &
842 dof_offset * int(mpi_real_prec_size, i8)
843 call this%read_field(fh, byte_offset, wm_z%x, nel)
844 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
846 do i = 1, wm_x_lag%size()
847 byte_offset = mpi_offset + &
848 dof_offset * int(mpi_real_prec_size, i8)
849 call this%read_field(fh, byte_offset, wm_x_lag%lf(i)%x, nel)
850 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
852 do i = 1, wm_y_lag%size()
853 byte_offset = mpi_offset + &
854 dof_offset * int(mpi_real_prec_size, i8)
855 call this%read_field(fh, byte_offset, wm_y_lag%lf(i)%x, nel)
856 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
858 do i = 1, wm_z_lag%size()
859 byte_offset = mpi_offset + &
860 dof_offset * int(mpi_real_prec_size, i8)
861 call this%read_field(fh, byte_offset, wm_z_lag%lf(i)%x, nel)
862 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
864 byte_offset = mpi_offset + &
865 dof_offset * int(mpi_real_prec_size, i8)
866 call this%read_field(fh, byte_offset, blag, nel)
867 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
869 byte_offset = mpi_offset + &
870 dof_offset * int(mpi_real_prec_size, i8)
871 call this%read_field(fh, byte_offset, blaglag, nel)
872 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
874 call mpi_file_read_at_all(fh, mpi_offset, pivot_pos, &
875 size(pivot_pos), mpi_real_precision, status, ierr)
876 mpi_offset = mpi_offset + int(
size(pivot_pos), i8) &
877 * int(mpi_real_prec_size, i8)
879 call mpi_file_read_at_all(fh, mpi_offset, pivot_vel_lag, &
880 size(pivot_vel_lag), mpi_real_precision, status, ierr)
881 mpi_offset = mpi_offset + int(
size(pivot_vel_lag), i8) &
882 * int(mpi_real_prec_size, i8)
884 call mpi_file_read_at_all(fh, mpi_offset, basis_pos, &
885 size(basis_pos), mpi_real_precision, status, ierr)
886 mpi_offset = mpi_offset + &
887 int(
size(basis_pos), i8) * int(mpi_real_prec_size, i8)
889 call mpi_file_read_at_all(fh, mpi_offset, basis_vel_lag, &
890 size(basis_vel_lag), mpi_real_precision, status, ierr)
891 mpi_offset = mpi_offset + &
892 int(
size(basis_vel_lag), i8) * int(mpi_real_prec_size, i8)
896 call mpi_file_close(fh, ierr)
898 if (ierr .ne. mpi_success)
then
899 call neko_error(
'Error reading checkpoint file ' // trim(fname))
902 call this%global_interp%free()
903 call this%space_interp%free()