151 class(*),
target,
intent(in) :: data
152 real(kind=
dp),
intent(in),
optional :: t
153 real(kind=
dp) :: time
154 character(len=5) :: id_str
155 character(len=1024) :: fname
156 integer :: ierr, suffix_pos, optional_fields
157 type(
field_t),
pointer :: u, v, w, p, s
158 type(
field_t),
pointer :: wm_x => null()
159 type(
field_t),
pointer :: wm_y => null()
160 type(
field_t),
pointer :: wm_z => null()
161 type(
field_t),
pointer :: abx1, abx2
162 type(
field_t),
pointer :: aby1, aby2
163 type(
field_t),
pointer :: abz1, abz2
164 type(
field_t),
pointer :: abs1, abs2
172 real(kind=
rp),
pointer :: msh_x(:) => null()
173 real(kind=
rp),
pointer :: msh_y(:) => null()
174 real(kind=
rp),
pointer :: msh_z(:) => null()
175 real(kind=
rp),
pointer :: blag(:) => null()
176 real(kind=
rp),
pointer :: blaglag(:) => null()
177 real(kind=
rp),
pointer :: pivot_pos(:) => null()
178 real(kind=
rp),
pointer :: pivot_vel_lag(:) => null()
179 real(kind=
rp),
pointer :: basis_pos(:) => null()
180 real(kind=
rp),
pointer :: basis_vel_lag(:) => null()
181 real(kind=
dp),
pointer :: dtlag(:), tlag(:)
182 type(
mesh_t),
pointer :: msh
183 type(mpi_status) :: status
185 integer (kind=MPI_OFFSET_KIND) :: mpi_offset, byte_offset
186 integer(kind=i8) :: n_glb_dofs, dof_offset
187 logical :: write_lag, write_scalar, write_dtlag
189 logical :: write_scalarlag, write_abvel
202 if (data%scalar_payload_count() .gt. 1)
then
203 call neko_error(
"The legacy .chkp format supports at most one " // &
204 "scalar; use HDF5 checkpointing for multiple scalars")
208 if ( .not.
associated(view%u) .or. &
209 .not.
associated(view%v) .or. &
210 .not.
associated(view%w) .or. &
211 .not.
associated(view%p) )
then
223 if (
associated(view%ulag))
then
228 optional_fields = optional_fields + 1
233 if (
associated(view%s))
then
235 write_scalar = .true.
236 optional_fields = optional_fields + 2
238 write_scalar = .false.
241 if (
associated(view%tlag))
then
245 optional_fields = optional_fields + 4
247 write_dtlag = .false.
250 write_abvel = .false.
251 if (
associated(view%abx1))
then
258 optional_fields = optional_fields + 8
262 write_scalarlag = .false.
263 if (
associated(view%abs1))
then
267 optional_fields = optional_fields + 16
268 write_scalarlag = .true.
272 if (
associated(view%wm_x))
then
279 wm_x_lag => view%wm_x_lag
280 wm_y_lag => view%wm_y_lag
281 wm_z_lag => view%wm_z_lag
283 blaglag => view%Blaglag
284 pivot_pos => view%pivot_pos
285 pivot_vel_lag => view%pivot_vel_lag
286 basis_pos => view%basis_pos
287 basis_vel_lag => view%basis_vel_lag
288 optional_fields = optional_fields + 32
296 dof_offset = int(msh%offset_el,
i8) * int(u%Xh%lx * u%Xh%ly * u%Xh%lz,
i8)
297 n_glb_dofs = int(u%Xh%lx * u%Xh%ly * u%Xh%lz,
i8) * int(msh%glb_nelv,
i8)
300 if (.not. this%overwrite)
call this%increment_counter()
301 fname = trim(this%get_fname())
303 call mpi_file_open(
neko_comm, trim(fname), &
304 mpi_mode_wronly + mpi_mode_create, mpi_info_null, fh, ierr)
305 call mpi_file_write_all(fh, msh%glb_nelv, 1, mpi_integer, status, ierr)
306 call mpi_file_write_all(fh, msh%gdim, 1, mpi_integer, status, ierr)
307 call mpi_file_write_all(fh, u%Xh%lx, 1, mpi_integer, status, ierr)
308 call mpi_file_write_all(fh, optional_fields, 1, mpi_integer, status, ierr)
309 call mpi_file_write_all(fh, time, 1, mpi_double_precision, status, ierr)
318 byte_offset = byte_offset + &
320 call mpi_file_write_at_all(fh, byte_offset,u%x, u%dof%size(), &
324 mpi_offset = mpi_offset +&
327 byte_offset = mpi_offset + &
329 call mpi_file_write_at_all(fh, byte_offset, v%x, v%dof%size(), &
333 byte_offset = mpi_offset + &
335 call mpi_file_write_at_all(fh, byte_offset, w%x, w%dof%size(), &
339 byte_offset = mpi_offset + &
341 call mpi_file_write_at_all(fh, byte_offset, p%x, p%dof%size(), &
351 do i = 1, ulag%size()
352 byte_offset = mpi_offset + &
357 associate(x => ulag%lf(i)%x)
358 call mpi_file_write_at_all(fh, byte_offset, x, &
364 do i = 1, vlag%size()
365 byte_offset = mpi_offset + &
370 associate(x => vlag%lf(i)%x)
371 call mpi_file_write_at_all(fh, byte_offset, x, &
374 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
377 do i = 1, wlag%size()
378 byte_offset = mpi_offset + &
379 dof_offset * int(mpi_real_prec_size, i8)
383 associate(x => wlag%lf(i)%x)
384 call mpi_file_write_at_all(fh, byte_offset, x, &
385 wlag%lf(i)%dof%size(), mpi_real_precision, status, ierr)
387 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
392 if (write_scalar)
then
393 byte_offset = mpi_offset + &
394 dof_offset * int(mpi_real_prec_size, i8)
395 call mpi_file_write_at_all(fh, byte_offset, s%x, p%dof%size(), &
396 mpi_real_precision, status, ierr)
397 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
400 if (write_dtlag)
then
401 call mpi_file_write_at_all(fh, mpi_offset, tlag, 10, &
402 mpi_double_precision, status, ierr)
403 mpi_offset = mpi_offset + 10_i8 * int(mpi_double_precision_size, i8)
404 call mpi_file_write_at_all(fh, mpi_offset, dtlag, 10, &
405 mpi_double_precision, status, ierr)
406 mpi_offset = mpi_offset + 10_i8 * int(mpi_double_precision_size, i8)
409 if (write_abvel)
then
410 byte_offset = mpi_offset + &
411 dof_offset * int(mpi_real_prec_size, i8)
412 call mpi_file_write_at_all(fh, byte_offset, abx1%x, abx1%dof%size(), &
413 mpi_real_precision, status, ierr)
414 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
415 byte_offset = mpi_offset + &
416 dof_offset * int(mpi_real_prec_size, i8)
417 call mpi_file_write_at_all(fh, byte_offset, abx2%x, abx1%dof%size(), &
418 mpi_real_precision, status, ierr)
419 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
420 byte_offset = mpi_offset + &
421 dof_offset * int(mpi_real_prec_size, i8)
422 call mpi_file_write_at_all(fh, byte_offset, aby1%x, abx1%dof%size(), &
423 mpi_real_precision, status, ierr)
424 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, aby2%x, abx1%dof%size(), &
428 mpi_real_precision, status, ierr)
429 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
430 byte_offset = mpi_offset + &
431 dof_offset * int(mpi_real_prec_size, i8)
432 call mpi_file_write_at_all(fh, byte_offset, abz1%x, abx1%dof%size(), &
433 mpi_real_precision, status, ierr)
434 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
435 byte_offset = mpi_offset + &
436 dof_offset * int(mpi_real_prec_size, i8)
437 call mpi_file_write_at_all(fh, byte_offset, abz2%x, abx1%dof%size(), &
438 mpi_real_precision, status, ierr)
439 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
442 if (write_scalarlag)
then
443 do i = 1, slag%size()
444 byte_offset = mpi_offset + &
445 dof_offset * int(mpi_real_prec_size, i8)
449 associate(x => slag%lf(i)%x)
450 call mpi_file_write_at_all(fh, byte_offset, x, &
451 slag%lf(i)%dof%size(), mpi_real_precision, status, ierr)
453 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
456 byte_offset = mpi_offset + &
457 dof_offset * int(mpi_real_prec_size, i8)
458 call mpi_file_write_at_all(fh, byte_offset, abs1%x, abx1%dof%size(), &
459 mpi_real_precision, status, ierr)
460 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
461 byte_offset = mpi_offset + &
462 dof_offset * int(mpi_real_prec_size, i8)
463 call mpi_file_write_at_all(fh, byte_offset, abs2%x, abx1%dof%size(), &
464 mpi_real_precision, status, ierr)
465 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
469 byte_offset = mpi_offset + &
470 dof_offset * int(mpi_real_prec_size, i8)
471 call mpi_file_write_at_all(fh, byte_offset, msh_x,
size(msh_x), &
472 mpi_real_precision, status, ierr)
473 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
475 byte_offset = mpi_offset + &
476 dof_offset * int(mpi_real_prec_size, i8)
477 call mpi_file_write_at_all(fh, byte_offset, msh_y,
size(msh_y), &
478 mpi_real_precision, status, ierr)
479 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
481 byte_offset = mpi_offset + &
482 dof_offset * int(mpi_real_prec_size, i8)
483 call mpi_file_write_at_all(fh, byte_offset, msh_z,
size(msh_z), &
484 mpi_real_precision, status, ierr)
485 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
487 byte_offset = mpi_offset + &
488 dof_offset * int(mpi_real_prec_size, i8)
489 call mpi_file_write_at_all(fh, byte_offset, wm_x%x, wm_x%dof%size(), &
490 mpi_real_precision, status, ierr)
491 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
493 byte_offset = mpi_offset + &
494 dof_offset * int(mpi_real_prec_size, i8)
495 call mpi_file_write_at_all(fh, byte_offset, wm_y%x, wm_y%dof%size(), &
496 mpi_real_precision, status, ierr)
497 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
499 byte_offset = mpi_offset + &
500 dof_offset * int(mpi_real_prec_size, i8)
501 call mpi_file_write_at_all(fh, byte_offset, wm_z%x, wm_z%dof%size(), &
502 mpi_real_precision, status, ierr)
503 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
505 do i = 1, wm_x_lag%size()
506 byte_offset = mpi_offset + &
507 dof_offset * int(mpi_real_prec_size, i8)
511 associate(x => wm_x_lag%lf(i)%x)
512 call mpi_file_write_at_all(fh, byte_offset, x, &
513 wm_x_lag%lf(i)%dof%size(), mpi_real_precision, status, ierr)
515 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
518 do i = 1, wm_y_lag%size()
519 byte_offset = mpi_offset + &
520 dof_offset * int(mpi_real_prec_size, i8)
524 associate(x => wm_y_lag%lf(i)%x)
525 call mpi_file_write_at_all(fh, byte_offset, x, &
526 wm_y_lag%lf(i)%dof%size(), mpi_real_precision, status, ierr)
528 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
531 do i = 1, wm_z_lag%size()
532 byte_offset = mpi_offset + &
533 dof_offset * int(mpi_real_prec_size, i8)
537 associate(x => wm_z_lag%lf(i)%x)
538 call mpi_file_write_at_all(fh, byte_offset, x, &
539 wm_z_lag%lf(i)%dof%size(), mpi_real_precision, status, ierr)
541 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
544 byte_offset = mpi_offset + &
545 dof_offset * int(mpi_real_prec_size, i8)
546 call mpi_file_write_at_all(fh, byte_offset, blag,
size(blag), &
547 mpi_real_precision, status, ierr)
548 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
550 byte_offset = mpi_offset + &
551 dof_offset * int(mpi_real_prec_size, i8)
552 call mpi_file_write_at_all(fh, byte_offset, blaglag,
size(blaglag), &
553 mpi_real_precision, status, ierr)
554 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
556 call mpi_file_write_at_all(fh, mpi_offset, pivot_pos,
size(pivot_pos), &
557 mpi_real_precision, status, ierr)
558 mpi_offset = mpi_offset + &
559 int(
size(pivot_pos), i8) * int(mpi_real_prec_size, i8)
560 call mpi_file_write_at_all(fh, mpi_offset, pivot_vel_lag, &
561 size(pivot_vel_lag), mpi_real_precision, status, ierr)
562 mpi_offset = mpi_offset + &
563 int(
size(pivot_vel_lag), i8) * int(mpi_real_prec_size, i8)
564 call mpi_file_write_at_all(fh, mpi_offset, basis_pos, &
565 size(basis_pos), mpi_real_precision, status, ierr)
566 mpi_offset = mpi_offset + &
567 int(
size(basis_pos), i8) * int(mpi_real_prec_size, i8)
568 call mpi_file_write_at_all(fh, mpi_offset, basis_vel_lag, &
569 size(basis_vel_lag), mpi_real_precision, status, ierr)
570 mpi_offset = mpi_offset + &
571 int(
size(basis_vel_lag), i8) * int(mpi_real_prec_size, i8)
574 call mpi_file_close(fh, ierr)
576 if (ierr .ne. mpi_success)
then
577 call neko_error(
'Error writing checkpoint file ' // trim(fname))
586 class(*),
target,
intent(inout) :: data
587 type(chkp_t),
pointer :: chkp
588 character(len=5) :: id_str
589 character(len=1024) :: fname
590 integer :: ierr, suffix_pos
591 type(field_t),
pointer :: u, v, w, p, s
592 type(field_t),
pointer :: wm_x => null()
593 type(field_t),
pointer :: wm_y => null()
594 type(field_t),
pointer :: wm_z => null()
595 type(field_series_t),
pointer :: ulag => null()
596 type(field_series_t),
pointer :: vlag => null()
597 type(field_series_t),
pointer :: wlag => null()
598 type(field_series_t),
pointer :: wm_x_lag => null()
599 type(field_series_t),
pointer :: wm_y_lag => null()
600 type(field_series_t),
pointer :: wm_z_lag => null()
601 type(field_series_t),
pointer :: slag => null()
602 type(mesh_t),
pointer :: msh
603 type(mpi_status) :: status
605 type(field_t),
pointer :: abx1, abx2
606 type(field_t),
pointer :: aby1, aby2
607 type(field_t),
pointer :: abz1, abz2
608 type(field_t),
pointer :: abs1, abs2
609 real(kind=rp),
pointer :: blag(:) => null()
610 real(kind=rp),
pointer :: blaglag(:) => null()
611 real(kind=rp),
pointer :: msh_x(:) => null()
612 real(kind=rp),
pointer :: msh_y(:) => null()
613 real(kind=rp),
pointer :: msh_z(:) => null()
614 real(kind=rp),
pointer :: pivot_pos(:) => null()
615 real(kind=rp),
pointer :: pivot_vel_lag(:) => null()
616 real(kind=rp),
pointer :: basis_pos(:) => null()
617 real(kind=rp),
pointer :: basis_vel_lag(:) => null()
618 real(kind=rp),
allocatable :: x_coord(:,:,:,:)
619 real(kind=rp),
allocatable :: y_coord(:,:,:,:)
620 real(kind=rp),
allocatable :: z_coord(:,:,:,:)
621 real(kind=dp),
pointer :: dtlag(:), tlag(:)
622 integer (kind=MPI_OFFSET_KIND) :: mpi_offset, byte_offset
623 integer(kind=i8) :: n_glb_dofs, dof_offset
624 integer :: glb_nelv, gdim, lx, have_lag, have_scalar, nel
625 integer :: optional_fields, have_dtlag
626 integer :: have_abvel, have_scalarlag
628 logical :: read_lag, read_scalar, read_dtlag, read_abvel, read_scalarlag
631 real(kind=rp) :: center_x, center_y, center_z
633 type(dofmap_t) :: dof
636 call this%check_exists()
641 if (data%scalar_payload_count() .gt. 1)
then
642 call neko_error(
"The legacy .chkp format supports at most one " // &
643 "scalar; use HDF5 checkpointing for multiple scalars")
647 if ( .not.
associated(view%u) .or. &
648 .not.
associated(view%v) .or. &
649 .not.
associated(view%w) .or. &
650 .not.
associated(view%p) )
then
651 call neko_error(
'Checkpoint not initialized')
658 this%chkp_Xh => data%previous_Xh
660 if (
allocated(data%previous_mesh%elements))
then
661 msh => data%previous_mesh
662 this%mesh2mesh = .true.
663 tol = data%mesh2mesh_tol
666 this%mesh2mesh = .false.
669 if (
associated(view%ulag))
then
678 if (
associated(view%s))
then
682 read_scalar = .false.
684 if (
associated(view%dtlag))
then
692 if (
associated(view%abx1))
then
701 read_scalarlag = .false.
702 if (
associated(view%abs1))
then
706 read_scalarlag = .true.
710 if (
associated(view%wm_x))
then
717 wm_x_lag => view%wm_x_lag
718 wm_y_lag => view%wm_y_lag
719 wm_z_lag => view%wm_z_lag
721 blaglag => view%Blaglag
722 pivot_pos => view%pivot_pos
723 pivot_vel_lag => view%pivot_vel_lag
724 basis_pos => view%basis_pos
725 basis_vel_lag => view%basis_vel_lag
732 call neko_error(
'Invalid data')
735 fname = trim(this%get_fname())
736 call neko_log%message(
"Reading checkpoint from file: " // trim(fname), &
738 call mpi_file_open(neko_comm, trim(fname), &
739 mpi_mode_rdonly, mpi_info_null, fh, ierr)
740 call mpi_file_read_all(fh, glb_nelv, 1, mpi_integer, status, ierr)
741 call mpi_file_read_all(fh, gdim, 1, mpi_integer, status, ierr)
742 call mpi_file_read_all(fh, lx, 1, mpi_integer, status, ierr)
743 call mpi_file_read_all(fh, optional_fields, 1, mpi_integer, status, ierr)
744 call mpi_file_read_all(fh, chkp%t, 1, mpi_double_precision, status, ierr)
746 have_lag = mod(optional_fields,2)/1
747 have_scalar = mod(optional_fields,4)/2
748 have_dtlag = mod(optional_fields,8)/4
749 have_abvel = mod(optional_fields,16)/8
750 have_scalarlag = mod(optional_fields,32)/16
751 have_ale = mod(optional_fields,64)/32
753 if ( ( glb_nelv .ne. msh%glb_nelv ) .or. &
754 ( gdim .ne. msh%gdim) .or. &
755 ( (have_lag .eq. 0) .and. (read_lag) ) .or. &
756 ( (have_scalar .eq. 0) .and. (read_scalar) ) .or. &
757 ( (have_ale .eq. 0) .and. (read_ale) ) )
then
758 call neko_error(
'Checkpoint does not match case')
762 if (gdim .eq. 3)
then
763 call this%chkp_Xh%init(gll, lx, lx, lx)
765 call this%chkp_Xh%init(gll, lx, lx)
767 if (this%mesh2mesh)
then
769 call neko_error(
'ALE does not yet support mesh2mesh ' // &
770 'interpolation for restart!')
772 call dof%init(msh, this%chkp_Xh)
773 call this%global_interp%init(dof, neko_comm, tol = tol)
774 call this%global_interp%find_points(u%dof%x%x, u%dof%y%x, u%dof%z%x, &
777 call this%space_interp%init(this%sim_Xh, this%chkp_Xh)
779 dof_offset = int(msh%offset_el, i8) * int(this%chkp_Xh%lxyz, i8)
780 n_glb_dofs = int(this%chkp_Xh%lxyz, i8) * int(msh%glb_nelv, i8)
786 byte_offset = 4_i8 * int(mpi_integer_size, i8) + &
787 int(mpi_double_precision_size, i8)
788 byte_offset = byte_offset + &
789 dof_offset * int(mpi_real_prec_size, i8)
790 call this%read_field(fh, byte_offset, u%x, nel)
791 mpi_offset = 4_i8 * int(mpi_integer_size, i8) + &
792 int(mpi_double_precision_size, i8)
793 mpi_offset = mpi_offset +&
794 n_glb_dofs * int(mpi_real_prec_size, i8)
796 byte_offset = mpi_offset + &
797 dof_offset * int(mpi_real_prec_size, i8)
798 call this%read_field(fh, byte_offset, v%x, nel)
799 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
801 byte_offset = mpi_offset + &
802 dof_offset * int(mpi_real_prec_size, i8)
803 call this%read_field(fh, byte_offset, w%x, nel)
804 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
806 byte_offset = mpi_offset + &
807 dof_offset * int(mpi_real_prec_size, i8)
808 call this%read_field(fh, byte_offset, p%x, nel)
809 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
816 do i = 1, ulag%size()
817 byte_offset = mpi_offset + &
818 dof_offset * int(mpi_real_prec_size, i8)
819 call this%read_field(fh, byte_offset, ulag%lf(i)%x, nel)
820 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
823 do i = 1, vlag%size()
824 byte_offset = mpi_offset + &
825 dof_offset * int(mpi_real_prec_size, i8)
826 call this%read_field(fh, byte_offset, vlag%lf(i)%x, nel)
827 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
830 do i = 1, wlag%size()
831 byte_offset = mpi_offset + &
832 dof_offset * int(mpi_real_prec_size, i8)
833 call this%read_field(fh, byte_offset, wlag%lf(i)%x, nel)
834 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
838 if (read_scalar)
then
839 byte_offset = mpi_offset + &
840 dof_offset * int(mpi_real_prec_size, i8)
841 call this%read_field(fh, byte_offset, s%x, nel)
842 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
845 if (read_dtlag .and. have_dtlag .eq. 1)
then
846 call mpi_file_read_at_all(fh, mpi_offset, tlag, 10, &
847 mpi_double_precision, status, ierr)
848 mpi_offset = mpi_offset + 10_i8 * int(mpi_double_precision_size, i8)
849 call mpi_file_read_at_all(fh, mpi_offset, dtlag, 10, &
850 mpi_double_precision, status, ierr)
851 mpi_offset = mpi_offset + 10_i8 * int(mpi_double_precision_size, i8)
854 if (read_abvel .and. have_abvel .eq. 1)
then
855 byte_offset = mpi_offset + &
856 dof_offset * int(mpi_real_prec_size, i8)
857 call this%read_field(fh, byte_offset, abx1%x, nel)
858 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
859 byte_offset = mpi_offset + &
860 dof_offset * int(mpi_real_prec_size, i8)
861 call this%read_field(fh, byte_offset, abx2%x, nel)
862 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
863 byte_offset = mpi_offset + &
864 dof_offset * int(mpi_real_prec_size, i8)
865 call this%read_field(fh, byte_offset, aby1%x, nel)
866 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
867 byte_offset = mpi_offset + &
868 dof_offset * int(mpi_real_prec_size, i8)
869 call this%read_field(fh, byte_offset, aby2%x, nel)
870 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
871 byte_offset = mpi_offset + &
872 dof_offset * int(mpi_real_prec_size, i8)
873 call this%read_field(fh, byte_offset, abz1%x, nel)
874 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
875 byte_offset = mpi_offset + &
876 dof_offset * int(mpi_real_prec_size, i8)
877 call this%read_field(fh, byte_offset, abz2%x, nel)
878 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
880 if (read_scalarlag .and. have_scalarlag .eq. 1)
then
881 do i = 1, slag%size()
882 byte_offset = mpi_offset + &
883 dof_offset * int(mpi_real_prec_size, i8)
884 call this%read_field(fh, byte_offset, slag%lf(i)%x, nel)
885 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
887 byte_offset = mpi_offset + &
888 dof_offset * int(mpi_real_prec_size, i8)
889 call this%read_field(fh, byte_offset, abs1%x, nel)
890 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
891 byte_offset = mpi_offset + &
892 dof_offset * int(mpi_real_prec_size, i8)
893 call this%read_field(fh, byte_offset, abs2%x, nel)
894 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
897 if (read_ale .and. have_ale .eq. 1)
then
899 byte_offset = mpi_offset + &
900 dof_offset * int(mpi_real_prec_size, i8)
901 call this%read_field(fh, byte_offset, msh_x, nel)
902 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
904 byte_offset = mpi_offset + &
905 dof_offset * int(mpi_real_prec_size, i8)
906 call this%read_field(fh, byte_offset, msh_y, nel)
907 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
909 byte_offset = mpi_offset + &
910 dof_offset * int(mpi_real_prec_size, i8)
911 call this%read_field(fh, byte_offset, msh_z, nel)
912 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
914 byte_offset = mpi_offset + &
915 dof_offset * int(mpi_real_prec_size, i8)
916 call this%read_field(fh, byte_offset, wm_x%x, nel)
917 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
919 byte_offset = mpi_offset + &
920 dof_offset * int(mpi_real_prec_size, i8)
921 call this%read_field(fh, byte_offset, wm_y%x, nel)
922 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
924 byte_offset = mpi_offset + &
925 dof_offset * int(mpi_real_prec_size, i8)
926 call this%read_field(fh, byte_offset, wm_z%x, nel)
927 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
929 do i = 1, wm_x_lag%size()
930 byte_offset = mpi_offset + &
931 dof_offset * int(mpi_real_prec_size, i8)
932 call this%read_field(fh, byte_offset, wm_x_lag%lf(i)%x, nel)
933 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
935 do i = 1, wm_y_lag%size()
936 byte_offset = mpi_offset + &
937 dof_offset * int(mpi_real_prec_size, i8)
938 call this%read_field(fh, byte_offset, wm_y_lag%lf(i)%x, nel)
939 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
941 do i = 1, wm_z_lag%size()
942 byte_offset = mpi_offset + &
943 dof_offset * int(mpi_real_prec_size, i8)
944 call this%read_field(fh, byte_offset, wm_z_lag%lf(i)%x, nel)
945 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
947 byte_offset = mpi_offset + &
948 dof_offset * int(mpi_real_prec_size, i8)
949 call this%read_field(fh, byte_offset, blag, nel)
950 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
952 byte_offset = mpi_offset + &
953 dof_offset * int(mpi_real_prec_size, i8)
954 call this%read_field(fh, byte_offset, blaglag, nel)
955 mpi_offset = mpi_offset + n_glb_dofs * int(mpi_real_prec_size, i8)
957 call mpi_file_read_at_all(fh, mpi_offset, pivot_pos, &
958 size(pivot_pos), mpi_real_precision, status, ierr)
959 mpi_offset = mpi_offset + int(
size(pivot_pos), i8) &
960 * int(mpi_real_prec_size, i8)
962 call mpi_file_read_at_all(fh, mpi_offset, pivot_vel_lag, &
963 size(pivot_vel_lag), mpi_real_precision, status, ierr)
964 mpi_offset = mpi_offset + int(
size(pivot_vel_lag), i8) &
965 * int(mpi_real_prec_size, i8)
967 call mpi_file_read_at_all(fh, mpi_offset, basis_pos, &
968 size(basis_pos), mpi_real_precision, status, ierr)
969 mpi_offset = mpi_offset + &
970 int(
size(basis_pos), i8) * int(mpi_real_prec_size, i8)
972 call mpi_file_read_at_all(fh, mpi_offset, basis_vel_lag, &
973 size(basis_vel_lag), mpi_real_precision, status, ierr)
974 mpi_offset = mpi_offset + &
975 int(
size(basis_vel_lag), i8) * int(mpi_real_prec_size, i8)
979 call mpi_file_close(fh, ierr)
981 if (ierr .ne. mpi_success)
then
982 call neko_error(
'Error reading checkpoint file ' // trim(fname))
985 call this%global_interp%free()
986 call this%space_interp%free()