50 use mpi_f08,
only : mpi_info_null, mpi_allreduce, mpi_allgather, &
51 mpi_in_place, mpi_integer, mpi_sum, mpi_max, mpi_comm_size, mpi_exscan, &
52 mpi_barrier, mpi_integer8, mpi_scan
64 integer(hid_t) :: file_id = -1_hid_t
65 integer(hid_t) :: active_group_id = -1_hid_t
66 integer(hid_t) :: plist_id = -1_hid_t
68 character(len=1) :: mode
69 integer :: precision = -1
87 procedure, pass(this) :: write_int_attribute => &
105 character(len=1024) :: fname
106 character(len=5) :: id_str
107 integer :: counter, suffix_pos
109 if (this%overwrite)
then
110 fname = this%get_fname()
112 counter = this%get_counter()
113 if (counter .eq. -1)
then
114 counter = this%get_start_counter()
116 counter = counter + 1
119 fname = this%get_base_fname()
121 write(id_str,
'(i5.5)') counter
122 fname = trim(fname(1:suffix_pos-1)) // id_str // fname(suffix_pos:)
130 logical,
intent(in) :: overwrite
131 this%overwrite = overwrite
137 character(len=1024) :: base_fname
138 character(len=1024) :: fname
139 character(len=1024) :: path, name, suffix
141 fname = trim(this%get_base_fname())
149 base_fname = trim(fname)
156 integer,
intent(in) :: precision
157 this%precision = precision
170 class(*),
target,
intent(in) :: data
171 real(kind=
rp),
intent(in),
optional :: t
172 type(
mesh_t),
pointer :: msh
176 real(kind=
rp),
pointer :: dtlag(:)
177 real(kind=
rp),
pointer :: tlag(:)
178 integer :: ierr, info, drank, i, j
179 integer(hid_t) :: plist_id, file_id, dset_id, grp_id, attr_id
180 integer(hid_t) :: filespace, memspace
181 integer(hid_t) :: H5T_NEKO_REAL
182 integer(hsize_t),
dimension(1) :: ddim, dcount, doffset
183 integer :: suffix_pos
184 character(len=5) :: id_str
185 character(len=1024) :: fname
187 call hdf5_file_determine_data(
data, msh, dof, fp, fsp, dtlag, tlag)
189 if (.not. this%overwrite)
call this%increment_counter()
190 fname = trim(this%get_fname())
194 call hdf5_file_determine_real(h5t_neko_real)
196 call h5pcreate_f(h5p_file_access_f, plist_id, ierr)
197 info = mpi_info_null%mpi_val
198 call h5pset_fapl_mpio_f(plist_id,
neko_comm%mpi_val, info, ierr)
200 call h5fcreate_f(fname, h5f_acc_trunc_f, &
201 file_id, ierr, access_prp = plist_id)
203 call h5pcreate_f(h5p_dataset_xfer_f, plist_id, ierr)
204 call h5pset_dxpl_mpio_f(plist_id, h5fd_mpio_collective_f, ierr)
206 call h5screate_f(h5s_scalar_f, filespace, ierr)
210 call h5acreate_f(file_id,
"Time", h5t_neko_real, filespace, attr_id, &
211 ierr, h5p_default_f, h5p_default_f)
212 call h5awrite_f(attr_id, h5t_neko_real, t, ddim, ierr)
213 call h5aclose_f(attr_id, ierr)
216 if (
associated(dof))
then
217 call h5acreate_f(file_id,
"Lx", h5t_native_integer, filespace, attr_id, &
218 ierr, h5p_default_f, h5p_default_f)
219 call h5awrite_f(attr_id, h5t_native_integer, dof%Xh%lx, ddim, ierr)
220 call h5aclose_f(attr_id, ierr)
223 if (
associated(msh))
then
224 call h5gcreate_f(file_id,
"Mesh", grp_id, ierr, &
225 lcpl_id = h5p_default_f, gcpl_id = h5p_default_f, &
226 gapl_id = h5p_default_f)
228 call h5acreate_f(grp_id,
"Elements", h5t_native_integer, filespace, &
229 attr_id, ierr, h5p_default_f, h5p_default_f)
230 call h5awrite_f(attr_id, h5t_native_integer, msh%glb_nelv, ddim, ierr)
231 call h5aclose_f(attr_id, ierr)
233 call h5acreate_f(grp_id,
"Dimension", h5t_native_integer, filespace, &
234 attr_id, ierr, h5p_default_f, h5p_default_f)
235 call h5awrite_f(attr_id, h5t_native_integer, msh%gdim, ddim, ierr)
236 call h5aclose_f(attr_id, ierr)
238 call h5gclose_f(grp_id, ierr)
242 call h5sclose_f(filespace, ierr)
247 if (
associated(tlag) .and.
associated(dtlag))
then
248 call h5gcreate_f(file_id,
"Restart", grp_id, ierr, &
249 lcpl_id = h5p_default_f, gcpl_id = h5p_default_f, &
250 gapl_id = h5p_default_f)
261 call h5screate_simple_f(drank, ddim, filespace, ierr)
263 call h5dcreate_f(grp_id,
'tlag', h5t_neko_real, &
264 filespace, dset_id, ierr)
265 call h5dget_space_f(dset_id, filespace, ierr)
266 call h5sselect_hyperslab_f (filespace, h5s_select_set_f, &
267 doffset, dcount, ierr)
268 call h5dwrite_f(dset_id, h5t_neko_real, tlag, &
269 ddim, ierr, xfer_prp = plist_id)
270 call h5dclose_f(dset_id, ierr)
272 call h5dcreate_f(grp_id,
'dtlag', h5t_neko_real, &
273 filespace, dset_id, ierr)
274 call h5dget_space_f(dset_id, filespace, ierr)
275 call h5sselect_hyperslab_f (filespace, h5s_select_set_f, &
276 doffset, dcount, ierr)
277 call h5dwrite_f(dset_id, h5t_neko_real, dtlag, &
278 ddim, ierr, xfer_prp = plist_id)
279 call h5dclose_f(dset_id, ierr)
281 call h5sclose_f(filespace, ierr)
282 call h5gclose_f(grp_id, ierr)
290 if (
allocated(fp) .or.
allocated(fsp))
then
291 call h5gcreate_f(file_id,
"Fields", grp_id, ierr, &
292 lcpl_id = h5p_default_f, gcpl_id = h5p_default_f, &
293 gapl_id = h5p_default_f)
295 dcount(1) = int(dof%size(), 8)
296 doffset(1) = int(msh%offset_el, 8) * int((dof%Xh%lx**3),8)
297 ddim = int(dof%size(), 8)
299 call mpi_allreduce(mpi_in_place, ddim(1), 1, &
302 call h5screate_simple_f(drank, ddim, filespace, ierr)
303 call h5screate_simple_f(drank, dcount, memspace, ierr)
306 if (
allocated(fp))
then
308 call h5dcreate_f(grp_id, fp(i)%ptr%name, h5t_neko_real, &
309 filespace, dset_id, ierr)
310 call h5dget_space_f(dset_id, filespace, ierr)
311 call h5sselect_hyperslab_f(filespace, h5s_select_set_f, &
312 doffset, dcount, ierr)
313 call h5dwrite_f(dset_id, h5t_neko_real, &
314 fp(i)%ptr%x(1,1,1,1), &
315 ddim, ierr, file_space_id = filespace, &
316 mem_space_id = memspace, xfer_prp = plist_id)
317 call h5dclose_f(dset_id, ierr)
322 if (
allocated(fsp))
then
324 do j = 1, fsp(i)%ptr%size()
325 call h5dcreate_f(grp_id, fsp(i)%ptr%lf(j)%name, &
326 h5t_neko_real, filespace, dset_id, ierr)
327 call h5dget_space_f(dset_id, filespace, ierr)
328 call h5sselect_hyperslab_f(filespace, h5s_select_set_f, &
329 doffset, dcount, ierr)
330 call h5dwrite_f(dset_id, h5t_neko_real, &
331 fsp(i)%ptr%lf(j)%x(1,1,1,1), &
332 ddim, ierr, file_space_id = filespace, &
333 mem_space_id = memspace, xfer_prp = plist_id)
334 call h5dclose_f(dset_id, ierr)
340 call h5gclose_f(grp_id, ierr)
341 call h5sclose_f(filespace, ierr)
342 call h5sclose_f(memspace, ierr)
345 call h5pclose_f(plist_id, ierr)
346 call h5fclose_f(file_id, ierr)
354 class(*),
target,
intent(inout) :: data
355 integer(hid_t) :: plist_id, file_id, dset_id, grp_id, attr_id
356 integer(hid_t) :: filespace, memspace
357 integer(hid_t) :: H5T_NEKO_REAL
358 integer(hsize_t),
dimension(1) :: ddim, dcount, doffset
359 integer :: i,j, ierr, info, glb_nelv, gdim, lx, drank
360 type(
mesh_t),
pointer :: msh
364 real(kind=
rp),
pointer :: dtlag(:)
365 real(kind=
rp),
pointer :: tlag(:)
367 character(len=1024) :: fname
369 fname = trim(this%get_fname())
373 call hdf5_file_determine_data(
data, msh, dof, fp, fsp, dtlag, tlag)
374 call hdf5_file_determine_real(h5t_neko_real)
376 call h5pcreate_f(h5p_file_access_f, plist_id, ierr)
377 info = mpi_info_null%mpi_val
378 call h5pset_fapl_mpio_f(plist_id,
neko_comm%mpi_val, info, ierr)
380 call h5fopen_f(fname, h5f_acc_rdonly_f, &
381 file_id, ierr, access_prp = plist_id)
383 call h5pcreate_f(h5p_dataset_xfer_f, plist_id, ierr)
384 call h5pset_dxpl_mpio_f(plist_id, h5fd_mpio_collective_f, ierr)
387 call h5aopen_name_f(file_id,
'Time', attr_id, ierr)
388 call h5aread_f(attr_id, h5t_neko_real, t, ddim, ierr)
389 call h5aclose_f(attr_id, ierr)
396 call h5aopen_name_f(file_id,
'Lx', attr_id, ierr)
397 call h5aread_f(attr_id, h5t_native_integer, lx, ddim, ierr)
398 call h5aclose_f(attr_id, ierr)
400 call h5gopen_f(file_id,
'Mesh', grp_id, ierr, gapl_id = h5p_default_f)
402 call h5aopen_name_f(grp_id,
'Elements', attr_id, ierr)
403 call h5aread_f(attr_id, h5t_native_integer, glb_nelv, ddim, ierr)
404 call h5aclose_f(attr_id, ierr)
406 call h5aopen_name_f(grp_id,
'Dimension', attr_id, ierr)
407 call h5aread_f(attr_id, h5t_native_integer, gdim, ddim, ierr)
408 call h5aclose_f(attr_id, ierr)
409 call h5gclose_f(grp_id, ierr)
412 if (
associated(tlag) .and.
associated(dtlag))
then
422 call h5gopen_f(file_id,
'Restart', grp_id, ierr, &
423 gapl_id = h5p_default_f)
424 call h5dopen_f(grp_id,
'tlag', dset_id, ierr)
425 call h5dget_space_f(dset_id, filespace, ierr)
426 call h5sselect_hyperslab_f (filespace, h5s_select_set_f, &
427 doffset, dcount, ierr)
428 call h5dread_f(dset_id, h5t_neko_real, tlag, ddim, ierr, &
430 call h5dclose_f(dset_id, ierr)
431 call h5sclose_f(filespace, ierr)
433 call h5dopen_f(grp_id,
'dtlag', dset_id, ierr)
434 call h5dget_space_f(dset_id, filespace, ierr)
435 call h5sselect_hyperslab_f (filespace, h5s_select_set_f, &
436 doffset, dcount, ierr)
437 call h5dread_f(dset_id, h5t_neko_real, dtlag, ddim, ierr, &
439 call h5dclose_f(dset_id, ierr)
440 call h5sclose_f(filespace, ierr)
442 call h5gclose_f(grp_id, ierr)
445 if (
allocated(fp) .or.
allocated(fsp))
then
446 call h5gopen_f(file_id,
'Fields', grp_id, ierr, gapl_id = h5p_default_f)
448 dcount(1) = int(dof%size(), 8)
449 doffset(1) = int(msh%offset_el, 8) * int((dof%Xh%lx**3),8)
450 ddim = int(dof%size(), 8)
453 dcount(1) = int(dof%size(), 8)
454 doffset(1) = int(msh%offset_el, 8) * int((dof%Xh%lx**3),8)
455 ddim = int(dof%size(), 8)
457 call mpi_allreduce(mpi_in_place, ddim(1), 1, &
460 call h5screate_simple_f(drank, dcount, memspace, ierr)
462 if (
allocated(fp))
then
464 call h5dopen_f(grp_id, fp(i)%ptr%name, dset_id, ierr)
465 call h5dget_space_f(dset_id, filespace, ierr)
466 call h5sselect_hyperslab_f (filespace, h5s_select_set_f, &
467 doffset, dcount, ierr)
468 call h5dread_f(dset_id, h5t_neko_real, &
469 fp(i)%ptr%x(1,1,1,1), &
470 ddim, ierr, file_space_id = filespace, &
471 mem_space_id = memspace, xfer_prp = plist_id)
472 call h5dclose_f(dset_id, ierr)
473 call h5sclose_f(filespace, ierr)
477 if (
allocated(fsp))
then
479 do j = 1, fsp(i)%ptr%size()
480 call h5dopen_f(grp_id, fsp(i)%ptr%lf(j)%name, dset_id, ierr)
481 call h5dget_space_f(dset_id, filespace, ierr)
482 call h5sselect_hyperslab_f (filespace, h5s_select_set_f, &
483 doffset, dcount, ierr)
484 call h5dread_f(dset_id, h5t_neko_real, &
485 fsp(i)%ptr%lf(j)%x(1,1,1,1), &
486 ddim, ierr, file_space_id = filespace, &
487 mem_space_id = memspace, xfer_prp = plist_id)
488 call h5dclose_f(dset_id, ierr)
489 call h5sclose_f(filespace, ierr)
493 call h5sclose_f(memspace, ierr)
494 call h5gclose_f(grp_id, ierr)
497 call h5pclose_f(plist_id, ierr)
498 call h5fclose_f(file_id, ierr)
504 subroutine hdf5_file_determine_data(data, msh, dof, fp, fsp, dtlag, tlag)
505 class(*),
target,
intent(in) :: data
506 type(
mesh_t),
pointer,
intent(inout) :: msh
507 type(
dofmap_t),
pointer,
intent(inout) :: dof
508 type(
field_ptr_t),
allocatable,
intent(inout) :: fp(:)
510 real(kind=
rp),
pointer,
intent(inout) :: dtlag(:)
511 real(kind=
rp),
pointer,
intent(inout) :: tlag(:)
512 integer :: i, j, fp_size, fp_cur, fsp_size, fsp_cur, scalar_count, ab_count
513 character(len=32) :: scalar_name
520 allocate(fp(fp_size))
528 if (data%size() .gt. 0)
then
529 allocate(fp(data%size()))
534 do i = 1, data%size()
535 fp(i)%ptr => data%items(i)%ptr
546 if ( .not.
associated(data%u) .or. &
547 .not.
associated(data%v) .or. &
548 .not.
associated(data%w) .or. &
549 .not.
associated(data%p) )
then
555 if (
allocated(data%scalar_lags%items) .and. &
556 data%scalar_lags%size() > 0)
then
557 scalar_count = data%scalar_lags%size()
558 else if (
associated(data%s))
then
564 if (scalar_count .gt. 1)
then
565 fp_size = fp_size + scalar_count
568 fp_size = fp_size + (scalar_count * 2)
569 else if (
associated(data%s))
then
571 fp_size = fp_size + 1
572 if (
associated(data%abs1))
then
573 fp_size = fp_size + 2
577 if (
associated(data%abx1))
then
578 fp_size = fp_size + 6
581 allocate(fp(fp_size))
584 if (
associated(data%ulag))
then
585 fsp_size = fsp_size + 3
588 if (scalar_count .gt. 1)
then
589 if (
allocated(data%scalar_lags%items))
then
590 fsp_size = fsp_size + data%scalar_lags%size()
592 else if (
associated(data%slag))
then
593 fsp_size = fsp_size + 1
596 if (fsp_size .gt. 0)
then
597 allocate(fsp(fsp_size))
611 if (scalar_count .gt. 1)
then
614 do i = 1, scalar_count
615 slag => data%scalar_lags%get(i)
616 fp(fp_cur)%ptr => slag%f
621 do i = 1, scalar_count
622 fp(fp_cur)%ptr => data%scalar_abx1(i)%ptr
624 fp(fp_cur)%ptr => data%scalar_abx2(i)%ptr
627 else if (
associated(data%s))
then
629 fp(fp_cur)%ptr => data%s
632 if (
associated(data%abs1))
then
633 fp(fp_cur)%ptr => data%abs1
634 fp(fp_cur+1)%ptr => data%abs2
639 if (
associated(data%abx1))
then
640 fp(fp_cur)%ptr => data%abx1
641 fp(fp_cur+1)%ptr => data%abx2
642 fp(fp_cur+2)%ptr => data%aby1
643 fp(fp_cur+3)%ptr => data%aby2
644 fp(fp_cur+4)%ptr => data%abz1
645 fp(fp_cur+5)%ptr => data%abz2
649 if (
associated(data%ulag))
then
650 fsp(fsp_cur)%ptr => data%ulag
651 fsp(fsp_cur+1)%ptr => data%vlag
652 fsp(fsp_cur+2)%ptr => data%wlag
653 fsp_cur = fsp_cur + 3
657 if (scalar_count .gt. 1)
then
658 if (
allocated(data%scalar_lags%items))
then
659 do j = 1, data%scalar_lags%size()
660 fsp(fsp_cur)%ptr => data%scalar_lags%get(j)
661 fsp_cur = fsp_cur + 1
664 else if (
associated(data%slag))
then
665 fsp(fsp_cur)%ptr => data%slag
666 fsp_cur = fsp_cur + 1
669 if (
associated(data%tlag))
then
678 end subroutine hdf5_file_determine_data
683 subroutine hdf5_file_determine_real(H5T_NEKO_REAL)
684 integer(hid_t),
intent(inout) :: H5T_NEKO_REAL
687 h5t_neko_real = h5t_native_double
689 h5t_neko_real = h5t_native_real
691 call neko_error(
"Unsupported real type")
693 end subroutine hdf5_file_determine_real
702 character(len=1),
intent(in) :: mode
703 integer :: ierr, mpi_info, mpi_comm, i, n_fields, counter
704 logical :: file_exists
705 character(len=1024) :: fname
706 character(len=LOG_SIZE) :: log_buf
712 if (this%precision .gt. rp)
then
714 call neko_warning(
'Requested precision is higher than working precision')
715 else if (this%precision .eq. -1)
then
720 counter = this%get_counter() - this%get_start_counter()
725 mpi_info = mpi_info_null%mpi_val
726 mpi_comm = neko_comm%mpi_val
727 call h5pcreate_f(h5p_file_access_f, this%plist_id, ierr)
728 call h5pset_fapl_mpio_f(this%plist_id, mpi_comm, mpi_info, ierr)
731 inquire(
file = fname, exist = file_exists)
732 if (file_exists)
then
733 call h5fopen_f(fname, h5f_acc_rdwr_f, this%file_id, ierr, &
734 access_prp = this%plist_id)
736 call h5fcreate_f(fname, h5f_acc_trunc_f, &
737 this%file_id, ierr, access_prp = this%plist_id)
741 call this%set_active_group()
743 write (log_buf, *)
"Opened HDF5 file: ", trim(fname),
" with counter: ", &
745 call neko_log%message(log_buf, lvl = neko_log_debug)
754 if (this%active_group_id .ne. -1_hid_t .and. &
755 this%active_group_id .ne. this%file_id)
then
756 call h5gclose_f(this%active_group_id, ierr)
758 this%active_group_id = -1_hid_t
760 call h5pclose_f(this%plist_id, ierr)
761 this%plist_id = -1_hid_t
762 call h5fclose_f(this%file_id, ierr)
763 this%file_id = -1_hid_t
766 call neko_log%message(
"Closed HDF5 file: " // trim(this%get_fname()), &
767 lvl = neko_log_debug)
777 character(len=*),
intent(in),
optional :: group_name_path
778 character(len=1000),
allocatable :: group_name(:)
780 integer(hid_t) :: current_id, group_id
781 integer :: ierr, i, j, num_groups, name_len, group_loc
782 logical :: group_exists
786 if (this%active_group_id .ne. -1_hid_t .and. this%active_group_id .ne. &
788 call h5gclose_f(this%active_group_id, ierr)
790 this%active_group_id = -1_hid_t
793 current_id = this%file_id
795 if (.not.
present(group_name_path))
then
796 this%active_group_id = current_id
801 name_len = len(trim(group_name_path))
805 if (group_name_path .eq.
"/")
then
806 num_groups = num_groups + 1
811 allocate(group_name(num_groups))
815 if (group_name_path .eq.
"/")
then
816 group_name(group_loc) = group_name_path(j:i-1)
817 group_loc = group_loc + 1
821 if (j .ne. name_len)
then
822 group_name(group_loc) = group_name_path(j:name_len)
827 call h5lexists_f(current_id, trim(group_name(i)), group_exists, ierr)
830 if (group_exists)
then
831 call h5gopen_f(current_id, trim(group_name(i)), group_id, ierr)
833 if (this%mode ==
"r")
then
834 call neko_error(
"Group " // trim(group_name(i)) // &
837 call h5gcreate_f(current_id, trim(group_name(i)), group_id, ierr)
842 call h5gclose_f(current_id, ierr)
845 current_id = group_id
848 this%active_group_id = current_id
854 class(*),
intent(inout) :: data
856 select type (d => data)
858 call this%write_vector(d)
860 call this%write_matrix(d)
862 call this%write_field(d)
864 call neko_error(
"write_dataset not implemented for this data type")
870 character(len=*),
intent(in) :: data_name
871 class(*),
intent(inout) :: data
872 character(len=*),
intent(in),
optional :: strategy
874 select type (d => data)
876 call this%read_vector(data_name, d, strategy)
878 call this%read_matrix(data_name, d, strategy)
880 call neko_error(
"Reading a field_t is not supported yet")
882 call neko_error(
"read_dataset not implemented for this data type")
888 character(len=*),
intent(in) :: data_name
889 class(*),
intent(inout) :: data
891 select type (d => data)
893 call this%write_int_attribute(data_name, d)
894 type is (
real(kind=rp))
895 call this%write_rp_attribute(data_name, d)
897 call neko_error(
"write_attribute not implemented for this data type")
903 character(len=*),
intent(in) :: data_name
904 class(*),
intent(inout) :: data
905 logical,
intent(inout) :: exist
907 select type (d => data)
909 call this%read_int_attribute(data_name, d, exist)
910 type is (
real(kind=rp))
911 call this%read_rp_attribute(data_name, d, exist)
913 call neko_error(
"read_attribute not implemented for this data type")
920 type(vector_t),
intent(inout) :: vec
921 integer :: ierr, counts, offset, total_count, dset_rank, max_count
922 integer(hsize_t) :: append_offset
923 integer(hid_t) :: precision_hdf
924 integer(hid_t) :: xf_id, filespace, dset_id, memspace, dcpl_id
925 integer(hsize_t),
dimension(1) :: dcount, doffset
926 integer(hsize_t),
dimension(1) :: ddims, ddims_max, chunkdims
927 integer(hsize_t),
dimension(1) :: tempddims, tempmaxddims
928 logical :: dset_exists
929 real(kind=sp),
allocatable :: write_buffer_sp(:)
930 real(kind=dp),
allocatable :: write_buffer_dp(:)
936 append_offset = 0_hsize_t
940 call mpi_scan(counts, offset, 1, mpi_integer, &
941 mpi_sum, neko_comm, ierr)
942 offset = offset - counts
943 call mpi_allreduce(counts, total_count, 1, mpi_integer, &
944 mpi_sum, neko_comm, ierr)
945 call mpi_allreduce(counts, max_count, 1, mpi_integer, &
946 mpi_max, neko_comm, ierr)
951 call h5pcreate_f(h5p_dataset_xfer_f, xf_id, ierr)
952 call h5pset_dxpl_mpio_f(xf_id, h5fd_mpio_collective_f, ierr)
953 precision_hdf = h5kind_to_type(this%precision, h5_real_kind)
959 ddims = [int(total_count, hsize_t)]
962 chunkdims = [
max(int(max_count, hsize_t), 1_hsize_t)]
963 ddims_max = [h5s_unlimited_f]
964 call h5lexists_f(this%active_group_id, trim(vec%name), dset_exists, ierr)
965 if (dset_exists)
then
966 if (this%overwrite)
then
968 call h5dopen_f(this%active_group_id, trim(vec%name), dset_id, ierr)
971 call h5dopen_f(this%active_group_id, trim(vec%name), dset_id, ierr)
973 call h5dget_space_f(dset_id, filespace, ierr)
975 call h5sget_simple_extent_dims_f(filespace, tempddims, tempmaxddims, &
978 call h5sclose_f(filespace, ierr)
980 ddims(1) = ddims(1) + tempddims(1)
981 append_offset = tempddims(1)
983 call h5dset_extent_f(dset_id, ddims, ierr)
987 call h5screate_simple_f(dset_rank, ddims, filespace, ierr, ddims_max)
989 call h5pcreate_f(h5p_dataset_create_f, dcpl_id, ierr)
990 call h5pset_chunk_f(dcpl_id, dset_rank, chunkdims, ierr)
992 call h5dcreate_f(this%active_group_id, trim(vec%name), precision_hdf, &
993 filespace, dset_id, ierr, dcpl_id = dcpl_id)
995 call h5sclose_f(filespace, ierr)
996 call h5pclose_f(dcpl_id, ierr)
1002 dcount = [int(counts, hsize_t)]
1005 doffset = [int(offset, hsize_t) + append_offset]
1007 call h5dget_space_f(dset_id, filespace, ierr)
1009 call h5sselect_hyperslab_f(filespace, h5s_select_set_f, doffset, dcount, &
1012 call h5screate_simple_f(dset_rank, dcount, memspace, ierr)
1018 if (this%precision == sp)
then
1019 allocate(write_buffer_sp(vec%size()))
1020 if (vec%size() > 0) write_buffer_sp =
real(vec%x, kind=sp)
1022 call h5dwrite_f(dset_id, precision_hdf, write_buffer_sp, dcount, ierr, &
1023 file_space_id = filespace, mem_space_id = memspace, &
1025 deallocate(write_buffer_sp)
1026 else if (this%precision == dp)
then
1027 allocate(write_buffer_dp(vec%size()))
1028 if (vec%size() > 0) write_buffer_dp =
real(vec%x, kind=dp)
1030 call h5dwrite_f(dset_id, precision_hdf, write_buffer_dp, dcount, ierr, &
1031 file_space_id = filespace, mem_space_id = memspace, &
1033 deallocate(write_buffer_dp)
1035 call neko_error(
"Unsupported precision")
1041 call h5pclose_f(xf_id, ierr)
1042 call h5sclose_f(memspace, ierr)
1043 call h5sclose_f(filespace, ierr)
1044 call h5dclose_f(dset_id, ierr)
1050 type(matrix_t),
intent(inout) :: mat
1051 integer :: ierr, counts, offset, total_count, dset_rank, strides, max_count
1052 integer(hsize_t) :: append_offset
1053 integer(hid_t) :: precision_hdf
1054 integer(hid_t) :: xf_id, filespace, dset_id, memspace, dcpl_id
1055 integer(hsize_t),
dimension(2) :: dcount, doffset
1056 integer(hsize_t),
dimension(2) :: ddims, ddims_max, chunkdims
1057 integer(hsize_t),
dimension(2) :: tempddims, tempmaxddims
1058 logical :: dset_exists
1059 real(kind=sp),
allocatable :: write_buffer_sp(:,:)
1060 real(kind=dp),
allocatable :: write_buffer_dp(:,:)
1065 strides = mat%get_nrows()
1066 counts = mat%get_ncols()
1067 append_offset = 0_hsize_t
1071 call mpi_scan(counts, offset, 1, mpi_integer, &
1072 mpi_sum, neko_comm, ierr)
1073 offset = offset - counts
1074 call mpi_allreduce(counts, total_count, 1, mpi_integer, &
1075 mpi_sum, neko_comm, ierr)
1076 call mpi_allreduce(counts, max_count, 1, mpi_integer, &
1077 mpi_max, neko_comm, ierr)
1082 call h5pcreate_f(h5p_dataset_xfer_f, xf_id, ierr)
1083 call h5pset_dxpl_mpio_f(xf_id, h5fd_mpio_collective_f, ierr)
1084 precision_hdf = h5kind_to_type(this%precision, h5_real_kind)
1091 ddims = [int(strides, hsize_t), int(total_count, hsize_t)]
1092 chunkdims = [int(strides, hsize_t),
max(int(max_count, hsize_t), 1_hsize_t)]
1093 ddims_max = [int(strides, hsize_t), h5s_unlimited_f]
1094 call h5lexists_f(this%active_group_id, trim(mat%name), dset_exists, ierr)
1095 if (dset_exists)
then
1096 if (this%overwrite)
then
1098 if (pe_rank .eq. 0)
then
1099 call neko_warning(
"Dataset " // trim(mat%name) // &
1100 " already exists and wil be overwritten")
1103 call h5dopen_f(this%active_group_id, trim(mat%name), dset_id, ierr)
1105 call h5dopen_f(this%active_group_id, trim(mat%name), dset_id, ierr)
1106 call h5dget_space_f(dset_id, filespace, ierr)
1107 call h5sget_simple_extent_dims_f(filespace, tempddims, tempmaxddims, &
1109 call h5sclose_f(filespace, ierr)
1110 ddims(2) = ddims(2) + tempddims(2)
1111 append_offset = tempddims(2)
1112 call h5dset_extent_f(dset_id, ddims, ierr)
1116 call h5screate_simple_f(dset_rank, ddims, filespace, ierr, ddims_max)
1117 call h5pcreate_f(h5p_dataset_create_f, dcpl_id, ierr)
1118 call h5pset_chunk_f(dcpl_id, dset_rank, chunkdims, ierr)
1120 call h5dcreate_f(this%active_group_id, trim(mat%name), precision_hdf, &
1121 filespace, dset_id, ierr, dcpl_id = dcpl_id)
1122 call h5sclose_f(filespace, ierr)
1123 call h5pclose_f(dcpl_id, ierr)
1130 dcount = [int(strides, hsize_t), int(counts, hsize_t)]
1132 doffset = [0_hsize_t, int(offset, hsize_t) + append_offset]
1134 call h5dget_space_f(dset_id, filespace, ierr)
1136 call h5sselect_hyperslab_f(filespace, h5s_select_set_f, doffset, dcount, &
1139 call h5screate_simple_f(dset_rank, dcount, memspace, ierr)
1144 if (this%precision == sp)
then
1145 allocate(write_buffer_sp(mat%get_nrows(), mat%get_ncols()))
1146 if (mat%size() > 0) write_buffer_sp =
real(mat%x, kind=sp)
1148 call h5dwrite_f(dset_id, precision_hdf, write_buffer_sp, dcount, ierr, &
1149 file_space_id = filespace, mem_space_id = memspace, &
1151 deallocate(write_buffer_sp)
1152 else if (this%precision == dp)
then
1153 allocate(write_buffer_dp(mat%get_nrows(), mat%get_ncols()))
1154 if (mat%size() > 0) write_buffer_dp =
real(mat%x, kind=dp)
1156 call h5dwrite_f(dset_id, precision_hdf, write_buffer_dp, dcount, ierr, &
1157 file_space_id = filespace, mem_space_id = memspace, &
1159 deallocate(write_buffer_dp)
1161 call neko_error(
"Unsupported precision")
1167 call h5pclose_f(xf_id, ierr)
1168 call h5sclose_f(memspace, ierr)
1169 call h5sclose_f(filespace, ierr)
1170 call h5dclose_f(dset_id, ierr)
1176 type(field_t),
intent(inout) :: field
1177 integer :: ierr, counts, offset, total_count, dset_rank, max_count
1178 integer :: stride_ax_1, stride_ax_2, stride_ax_3
1179 integer(hsize_t) :: append_offset
1180 integer(hid_t) :: precision_hdf
1181 integer(hid_t) :: xf_id, filespace, dset_id, memspace, dcpl_id
1182 integer(hsize_t),
dimension(4) :: dcount, doffset
1183 integer(hsize_t),
dimension(4) :: ddims, ddims_max, chunkdims
1184 integer(hsize_t),
dimension(4) :: tempddims, tempmaxddims
1185 logical :: dset_exists
1186 real(kind=sp),
allocatable :: write_buffer_sp(:,:,:,:)
1187 real(kind=dp),
allocatable :: write_buffer_dp(:,:,:,:)
1192 stride_ax_1 =
field%Xh%lx
1193 stride_ax_2 =
field%Xh%ly
1194 stride_ax_3 =
field%Xh%lz
1195 counts =
field%msh%nelv
1196 append_offset = 0_hsize_t
1197 total_count =
field%msh%glb_nelv
1199 offset =
field%msh%offset_el
1200 call mpi_allreduce(counts, max_count, 1, mpi_integer, &
1201 mpi_max, neko_comm, ierr)
1206 call h5pcreate_f(h5p_dataset_xfer_f, xf_id, ierr)
1207 call h5pset_dxpl_mpio_f(xf_id, h5fd_mpio_collective_f, ierr)
1208 precision_hdf = h5kind_to_type(this%precision, h5_real_kind)
1214 ddims = [int(stride_ax_1, hsize_t), &
1215 int(stride_ax_2, hsize_t), &
1216 int(stride_ax_3, hsize_t), &
1217 int(total_count, hsize_t)]
1218 chunkdims = [int(stride_ax_1, hsize_t), &
1219 int(stride_ax_2, hsize_t), &
1220 int(stride_ax_3, hsize_t), &
1221 max(int(max_count, hsize_t), 1_hsize_t)]
1222 ddims_max = [int(stride_ax_1, hsize_t), &
1223 int(stride_ax_2, hsize_t), &
1224 int(stride_ax_3, hsize_t), &
1226 call h5lexists_f(this%active_group_id, trim(
field%name), dset_exists, ierr)
1227 if (dset_exists)
then
1228 if (this%overwrite)
then
1230 if (pe_rank .eq. 0)
then
1231 call neko_warning(
"Overwriting dataset: " // trim(
field%name))
1233 call h5dopen_f(this%active_group_id, trim(
field%name), dset_id, ierr)
1235 call h5dopen_f(this%active_group_id, trim(
field%name), dset_id, ierr)
1236 call h5dget_space_f(dset_id, filespace, ierr)
1237 call h5sget_simple_extent_dims_f(filespace, tempddims, tempmaxddims, &
1239 call h5sclose_f(filespace, ierr)
1240 ddims(4) = ddims(4) + tempddims(4)
1241 append_offset = tempddims(4)
1242 call h5dset_extent_f(dset_id, ddims, ierr)
1246 call h5screate_simple_f(dset_rank, ddims, filespace, ierr, ddims_max)
1247 call h5pcreate_f(h5p_dataset_create_f, dcpl_id, ierr)
1248 call h5pset_chunk_f(dcpl_id, dset_rank, chunkdims, ierr)
1250 call h5dcreate_f(this%active_group_id, trim(
field%name), precision_hdf, &
1251 filespace, dset_id, ierr, dcpl_id = dcpl_id)
1252 call h5sclose_f(filespace, ierr)
1253 call h5pclose_f(dcpl_id, ierr)
1259 dcount = [int(stride_ax_1, hsize_t), &
1260 int(stride_ax_2, hsize_t), &
1261 int(stride_ax_3, hsize_t), &
1262 int(counts, hsize_t)]
1263 doffset = [0_hsize_t, 0_hsize_t, 0_hsize_t, &
1264 int(offset, hsize_t) + append_offset]
1266 call h5dget_space_f(dset_id, filespace, ierr)
1268 call h5sselect_hyperslab_f(filespace, h5s_select_set_f, doffset, dcount, &
1271 call h5screate_simple_f(dset_rank, dcount, memspace, ierr)
1276 if (this%precision == sp)
then
1281 call h5dwrite_f(dset_id, precision_hdf, write_buffer_sp, dcount, ierr, &
1282 file_space_id = filespace, mem_space_id = memspace, &
1284 deallocate(write_buffer_sp)
1285 else if (this%precision == dp)
then
1290 call h5dwrite_f(dset_id, precision_hdf, write_buffer_dp, dcount, ierr, &
1291 file_space_id = filespace, mem_space_id = memspace, &
1293 deallocate(write_buffer_dp)
1295 call neko_error(
"Unsupported precision")
1301 call h5pclose_f(xf_id, ierr)
1302 call h5sclose_f(memspace, ierr)
1303 call h5sclose_f(filespace, ierr)
1304 call h5dclose_f(dset_id, ierr)
1311 character(len=*),
intent(in) :: data_name
1312 type(vector_t),
intent(inout) :: vec
1313 character(len=*),
intent(in),
optional :: strategy
1314 character(len=1000) :: strategy_
1315 integer :: ierr, counts, offset, total_count, dset_rank
1316 integer(hid_t) :: precision_hdf
1317 integer(hid_t) :: xf_id, filespace, dset_id, memspace
1318 integer(hsize_t),
dimension(1) :: dcount, doffset
1319 integer(hsize_t),
dimension(1) :: tempddims, tempmaxddims
1321 logical :: dset_exists
1322 type(linear_dist_t) :: dist
1325 if (
present(strategy))
then
1326 if (trim(strategy) .eq.
"linear" .or. &
1327 trim(strategy) .eq.
"rank_0")
then
1328 strategy_ = strategy
1330 call neko_error(
"Unsupported strategy: " // trim(strategy))
1333 strategy_ =
"linear"
1342 call h5pcreate_f(h5p_dataset_xfer_f, xf_id, ierr)
1343 call h5pset_dxpl_mpio_f(xf_id, h5fd_mpio_collective_f, ierr)
1344 precision_hdf = h5kind_to_type(rp, h5_real_kind)
1349 call h5lexists_f(this%active_group_id, trim(data_name), dset_exists, ierr)
1350 if (dset_exists)
then
1352 call h5dopen_f(this%active_group_id, trim(data_name), dset_id, ierr)
1354 call h5dget_space_f(dset_id, filespace, ierr)
1355 call h5sget_simple_extent_ndims_f(filespace, temprank, ierr)
1356 if (temprank .ne. 1)
then
1357 call neko_error(
"Dataset " // trim(data_name) // &
1358 " is not a rank 1 vector in file " // trim(
file_get_fname(this)))
1361 call h5sget_simple_extent_dims_f(filespace, tempddims, tempmaxddims, &
1363 call h5sclose_f(filespace, ierr)
1365 call neko_error(
"Dataset " // trim(data_name) // &
1366 " does not exist in current group " // trim(
file_get_fname(this)))
1372 total_count = int(tempddims(1))
1373 if (strategy_ .eq.
"linear")
then
1374 dist = linear_dist_t(total_count, pe_rank, pe_size, neko_comm)
1375 counts = dist%num_local()
1377 else if (strategy_ .eq.
"rank_0")
then
1378 if (pe_rank .eq. 0)
then
1379 counts = total_count
1385 call mpi_exscan(counts, offset, 1, mpi_integer, &
1386 mpi_sum, neko_comm, ierr)
1392 dcount = [int(counts, hsize_t)]
1393 doffset = [int(offset, hsize_t)]
1395 call h5dget_space_f(dset_id, filespace, ierr)
1397 call h5sselect_hyperslab_f(filespace, h5s_select_set_f, doffset, dcount, &
1400 call h5screate_simple_f(dset_rank, dcount, memspace, ierr)
1405 call vec%init(counts, trim(data_name))
1406 call h5dread_f(dset_id, precision_hdf, vec%x, dcount, ierr, &
1407 file_space_id = filespace, mem_space_id = memspace, &
1413 call h5pclose_f(xf_id, ierr)
1414 call h5sclose_f(memspace, ierr)
1415 call h5sclose_f(filespace, ierr)
1416 call h5dclose_f(dset_id, ierr)
1423 character(len=*),
intent(in) :: data_name
1424 type(matrix_t),
intent(inout) :: mat
1425 character(len=*),
intent(in),
optional :: strategy
1426 character(len=1000) :: strategy_
1427 integer :: ierr, counts, offset, total_count, dset_rank
1428 integer(hid_t) :: precision_hdf
1429 integer(hid_t) :: xf_id, filespace, dset_id, memspace
1430 integer(hsize_t),
dimension(2) :: dcount, doffset
1431 integer(hsize_t),
dimension(2) :: tempddims, tempmaxddims
1433 logical :: dset_exists
1434 type(linear_dist_t) :: dist
1437 if (
present(strategy))
then
1438 if (trim(strategy) .eq.
"linear" .or. &
1439 trim(strategy) .eq.
"rank_0")
then
1440 strategy_ = strategy
1442 call neko_error(
"Unsupported strategy: " // trim(strategy))
1445 strategy_ =
"linear"
1454 call h5pcreate_f(h5p_dataset_xfer_f, xf_id, ierr)
1455 call h5pset_dxpl_mpio_f(xf_id, h5fd_mpio_collective_f, ierr)
1456 precision_hdf = h5kind_to_type(rp, h5_real_kind)
1461 call h5lexists_f(this%active_group_id, trim(data_name), dset_exists, ierr)
1462 if (dset_exists)
then
1464 call h5dopen_f(this%active_group_id, trim(data_name), dset_id, ierr)
1466 call h5dget_space_f(dset_id, filespace, ierr)
1467 call h5sget_simple_extent_ndims_f(filespace, temprank, ierr)
1468 if (temprank .ne. 2)
then
1469 call neko_error(
"Dataset " // trim(data_name) // &
1470 " is not a rank 2 matrix in file " // trim(
file_get_fname(this)))
1473 call h5sget_simple_extent_dims_f(filespace, tempddims, tempmaxddims, &
1475 call h5sclose_f(filespace, ierr)
1477 call neko_error(
"Dataset " // trim(data_name) &
1478 //
" does not exist in current group " // &
1485 total_count = int(tempddims(2))
1486 if (strategy_ .eq.
"linear")
then
1487 dist = linear_dist_t(total_count, pe_rank, pe_size, neko_comm)
1488 counts = dist%num_local()
1490 else if (strategy_ .eq.
"rank_0")
then
1491 if (pe_rank .eq. 0)
then
1492 counts = total_count
1498 call mpi_scan(counts, offset, 1, mpi_integer, &
1499 mpi_sum, neko_comm, ierr)
1500 offset = offset - counts
1506 dcount = [int(tempddims(1), hsize_t), int(counts, hsize_t)]
1507 doffset = [0_hsize_t, int(offset, hsize_t)]
1509 call h5dget_space_f(dset_id, filespace, ierr)
1511 call h5sselect_hyperslab_f(filespace, h5s_select_set_f, doffset, dcount, &
1514 call h5screate_simple_f(dset_rank, dcount, memspace, ierr)
1519 call mat%init(int(tempddims(1)), counts, trim(data_name))
1520 call h5dread_f(dset_id, precision_hdf, mat%x, dcount, ierr, &
1521 file_space_id = filespace, mem_space_id = memspace, &
1527 call h5pclose_f(xf_id, ierr)
1528 call h5sclose_f(memspace, ierr)
1529 call h5sclose_f(filespace, ierr)
1530 call h5dclose_f(dset_id, ierr)
1538 character(len=*),
intent(in) :: attr_name
1539 integer,
intent(in) :: attr
1541 integer(hid_t) :: filespace, attr_id
1542 integer(hsize_t),
dimension(1) :: dcount
1543 logical :: attr_exists
1548 dcount = [int(1, hsize_t)]
1549 call h5aexists_f(this%active_group_id, trim(attr_name), attr_exists, ierr)
1550 if (attr_exists)
then
1552 call h5aopen_f(this%active_group_id, trim(attr_name), attr_id, ierr)
1555 call h5screate_f(h5s_scalar_f, filespace, ierr)
1557 call h5acreate_f(this%active_group_id, trim(attr_name), &
1558 h5t_native_integer, &
1559 filespace, attr_id, ierr, h5p_default_f, h5p_default_f)
1560 call h5sclose_f(filespace, ierr)
1566 call h5awrite_f(attr_id, h5t_native_integer, attr, dcount, ierr)
1571 call h5aclose_f(attr_id, ierr)
1578 character(len=*),
intent(in) :: attr_name
1579 real(kind=rp),
intent(in) :: attr
1581 integer(hid_t) :: precision_hdf
1582 integer(hid_t) :: filespace, attr_id
1583 integer(hsize_t),
dimension(1) :: dcount
1584 logical :: attr_exists
1587 precision_hdf = h5kind_to_type(rp, h5_real_kind)
1592 dcount = [int(1, hsize_t)]
1593 call h5aexists_f(this%active_group_id, trim(attr_name), attr_exists, ierr)
1594 if (attr_exists)
then
1596 call h5aopen_f(this%active_group_id, trim(attr_name), attr_id, ierr)
1599 call h5screate_f(h5s_scalar_f, filespace, ierr)
1601 call h5acreate_f(this%active_group_id, trim(attr_name), precision_hdf, &
1602 filespace, attr_id, ierr, h5p_default_f, h5p_default_f)
1603 call h5sclose_f(filespace, ierr)
1609 call h5awrite_f(attr_id, precision_hdf, attr, dcount, ierr)
1614 call h5aclose_f(attr_id, ierr)
1621 character(len=*),
intent(in) :: attr_name
1622 integer,
intent(inout) :: attr
1623 logical,
intent(inout) :: attr_exists
1625 integer(hid_t) :: filespace, attr_id
1626 integer(hsize_t),
dimension(1) :: dcount
1631 dcount = [int(1, hsize_t)]
1632 call h5aexists_f(this%active_group_id, trim(attr_name), attr_exists, ierr)
1633 if (attr_exists)
then
1635 call h5aopen_f(this%active_group_id, trim(attr_name), attr_id, ierr)
1643 call h5aread_f(attr_id, h5t_native_integer, attr, dcount, ierr)
1648 call h5aclose_f(attr_id, ierr)
1655 character(len=*),
intent(in) :: attr_name
1656 real(kind=rp),
intent(inout) :: attr
1657 logical,
intent(inout) :: attr_exists
1659 integer(hid_t) :: precision_hdf
1660 integer(hid_t) :: filespace, attr_id
1661 integer(hsize_t),
dimension(1) :: dcount
1664 precision_hdf = h5kind_to_type(rp, h5_real_kind)
1669 dcount = [int(1, hsize_t)]
1670 call h5aexists_f(this%active_group_id, trim(attr_name), attr_exists, ierr)
1671 if (attr_exists)
then
1673 call h5aopen_f(this%active_group_id, trim(attr_name), attr_id, ierr)
1681 call h5aread_f(attr_id, precision_hdf, attr, dcount, ierr)
1686 call h5aclose_f(attr_id, ierr)
1695 character(len=1),
intent(in) :: mode
1696 call neko_error(
'Neko needs to be built with HDF5 support')
1702 call neko_error(
'Neko needs to be built with HDF5 support')
1708 character(len=*),
intent(in),
optional :: group_name_path
1709 call neko_error(
'Neko needs to be built with HDF5 support')
1715 class(*),
target,
intent(in) :: data
1716 real(kind=rp),
intent(in),
optional :: t
1717 call neko_error(
'Neko needs to be built with HDF5 support')
1723 class(*),
target,
intent(inout) :: data
1724 call neko_error(
'Neko needs to be built with HDF5 support')
1729 class(*),
intent(inout) :: data
1730 call neko_error(
'Neko needs to be built with HDF5 support')
1735 character(len=*),
intent(in) :: data_name
1736 class(*),
intent(inout) :: data
1737 character(len=*),
intent(in),
optional :: strategy
1738 call neko_error(
'Neko needs to be built with HDF5 support')
1743 character(len=*),
intent(in) :: data_name
1744 class(*),
intent(inout) :: data
1745 call neko_error(
'Neko needs to be built with HDF5 support')
1750 character(len=*),
intent(in) :: data_name
1751 class(*),
intent(inout) :: data
1752 logical,
intent(inout) :: exist
1753 call neko_error(
'Neko needs to be built with HDF5 support')
1758 type(vector_t),
intent(inout) :: vec
1759 call neko_error(
'Neko needs to be built with HDF5 support')
1764 type(matrix_t),
intent(inout) :: mat
1765 call neko_error(
'Neko needs to be built with HDF5 support')
1770 type(field_t),
intent(inout) :: fld
1771 call neko_error(
'Neko needs to be built with HDF5 support')
1776 character(len=*),
intent(in) :: data_name
1777 type(vector_t),
intent(inout) :: vec
1778 character(len=*),
intent(in),
optional :: strategy
1779 call neko_error(
'Neko needs to be built with HDF5 support')
1784 character(len=*),
intent(in) :: data_name
1785 type(matrix_t),
intent(inout) :: mat
1786 character(len=*),
intent(in),
optional :: strategy
1787 call neko_error(
'Neko needs to be built with HDF5 support')
1792 character(len=*),
intent(in) :: attr_name
1793 integer,
intent(in) :: attr
1794 call neko_error(
'Neko needs to be built with HDF5 support')
1799 character(len=*),
intent(in) :: attr_name
1800 real(kind=rp),
intent(in) :: attr
1801 call neko_error(
'Neko needs to be built with HDF5 support')
1806 character(len=*),
intent(in) :: attr_name
1807 integer,
intent(inout) :: attr
1808 logical,
intent(inout) :: attr_exists
1809 call neko_error(
'Neko needs to be built with HDF5 support')
1814 character(len=*),
intent(in) :: attr_name
1815 real(kind=rp),
intent(inout) :: attr
1816 logical,
intent(inout) :: attr_exists
1817 call neko_error(
'Neko needs to be built with HDF5 support')
integer, public pe_size
MPI size of communicator.
integer, public pe_rank
MPI rank.
type(mpi_comm), public neko_comm
MPI communicator.
Defines practical data distributions.
Defines a mapping of the degrees of freedom.
Contains the field_serties_t type.
Module for file I/O operations.
subroutine hdf5_file_open(this, mode)
Open a HDF5 file in a given mode.
character(len=1024) function file_get_fname(this)
Return the file name with the start counter.
subroutine hdf5_file_write_field(this, fld)
subroutine hdf5_file_read(this, data)
Read data in HDF5 format.
subroutine hdf5_file_write(this, data, t)
Write data in HDF5 format.
subroutine hdf5_file_read_dataset(this, data_name, data, strategy)
subroutine hdf5_file_write_int_attribute(this, attr_name, attr)
subroutine hdf5_file_write_attribute(this, data_name, data)
subroutine hdf5_file_read_vector(this, data_name, vec, strategy)
subroutine hdf5_file_write_vector(this, vec)
subroutine hdf5_file_read_matrix(this, data_name, mat, strategy)
subroutine hdf5_file_read_int_attribute(this, attr_name, attr, attr_exists)
subroutine hdf5_file_write_rp_attribute(this, attr_name, attr)
subroutine hdf5_file_set_precision(this, precision)
Set the precision for the output (single or double)
character(len=1024) function hdf5_file_get_next_output_fname(this)
Get the physical file name generated by the next write.
subroutine hdf5_file_read_rp_attribute(this, attr_name, attr, attr_exists)
subroutine hdf5_file_read_attribute(this, data_name, data, exist)
subroutine hdf5_file_close(this)
Close the file.
subroutine hdf5_file_set_group(this, group_name_path)
Set the active group for HDF5 files.
subroutine hdf5_file_write_matrix(this, mat)
subroutine hdf5_file_write_dataset(this, data)
subroutine hdf5_file_set_overwrite(this, overwrite)
Set the overwrite flag for HDF5 files.
integer, parameter, public neko_log_debug
Debug log level.
type(log_t), public neko_log
Global log stream.
integer, parameter, public log_size
integer, parameter, public dp
integer, parameter, public sp
integer, parameter, public rp
Global precision used in computations.
subroutine, public filename_split(fname, path, name, suffix)
Extract file name components.
subroutine, public neko_warning(warning_msg)
Reports a warning to standard output.
pure integer function, public filename_suffix_pos(fname)
Find position (in the string) of a filename's suffix.
Load-balanced linear distribution .
field_ptr_t, To easily obtain a pointer to a field
field_list_t, To be able to group fields together
A wrapper for a pointer to a field_series_t.
Stores a series (sequence) of fields, logically connected to a base field, and arranged according to ...
Interface for HDF5 files.