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
86 procedure, pass(this) :: write_int_attribute => &
104 logical,
intent(in) :: overwrite
105 this%overwrite = overwrite
111 character(len=1024) :: base_fname
112 character(len=1024) :: fname
113 character(len=1024) :: path, name, suffix
115 fname = trim(this%get_base_fname())
123 base_fname = trim(fname)
130 integer,
intent(in) :: precision
131 this%precision = precision
144 class(*),
target,
intent(in) :: data
145 real(kind=
rp),
intent(in),
optional :: t
146 type(
mesh_t),
pointer :: msh
150 real(kind=
rp),
pointer :: dtlag(:)
151 real(kind=
rp),
pointer :: tlag(:)
152 integer :: ierr, info, drank, i, j
153 integer(hid_t) :: plist_id, file_id, dset_id, grp_id, attr_id
154 integer(hid_t) :: filespace, memspace
155 integer(hid_t) :: H5T_NEKO_REAL
156 integer(hsize_t),
dimension(1) :: ddim, dcount, doffset
157 integer :: suffix_pos
158 character(len=5) :: id_str
159 character(len=1024) :: fname
161 call hdf5_file_determine_data(
data, msh, dof, fp, fsp, dtlag, tlag)
163 if (.not. this%overwrite)
call this%increment_counter()
164 fname = trim(this%get_fname())
168 call hdf5_file_determine_real(h5t_neko_real)
170 call h5pcreate_f(h5p_file_access_f, plist_id, ierr)
171 info = mpi_info_null%mpi_val
172 call h5pset_fapl_mpio_f(plist_id,
neko_comm%mpi_val, info, ierr)
174 call h5fcreate_f(fname, h5f_acc_trunc_f, &
175 file_id, ierr, access_prp = plist_id)
177 call h5pcreate_f(h5p_dataset_xfer_f, plist_id, ierr)
178 call h5pset_dxpl_mpio_f(plist_id, h5fd_mpio_collective_f, ierr)
180 call h5screate_f(h5s_scalar_f, filespace, ierr)
184 call h5acreate_f(file_id,
"Time", h5t_neko_real, filespace, attr_id, &
185 ierr, h5p_default_f, h5p_default_f)
186 call h5awrite_f(attr_id, h5t_neko_real, t, ddim, ierr)
187 call h5aclose_f(attr_id, ierr)
190 if (
associated(dof))
then
191 call h5acreate_f(file_id,
"Lx", h5t_native_integer, filespace, attr_id, &
192 ierr, h5p_default_f, h5p_default_f)
193 call h5awrite_f(attr_id, h5t_native_integer, dof%Xh%lx, ddim, ierr)
194 call h5aclose_f(attr_id, ierr)
197 if (
associated(msh))
then
198 call h5gcreate_f(file_id,
"Mesh", grp_id, ierr, &
199 lcpl_id = h5p_default_f, gcpl_id = h5p_default_f, &
200 gapl_id = h5p_default_f)
202 call h5acreate_f(grp_id,
"Elements", h5t_native_integer, filespace, &
203 attr_id, ierr, h5p_default_f, h5p_default_f)
204 call h5awrite_f(attr_id, h5t_native_integer, msh%glb_nelv, ddim, ierr)
205 call h5aclose_f(attr_id, ierr)
207 call h5acreate_f(grp_id,
"Dimension", h5t_native_integer, filespace, &
208 attr_id, ierr, h5p_default_f, h5p_default_f)
209 call h5awrite_f(attr_id, h5t_native_integer, msh%gdim, ddim, ierr)
210 call h5aclose_f(attr_id, ierr)
212 call h5gclose_f(grp_id, ierr)
216 call h5sclose_f(filespace, ierr)
221 if (
associated(tlag) .and.
associated(dtlag))
then
222 call h5gcreate_f(file_id,
"Restart", grp_id, ierr, &
223 lcpl_id = h5p_default_f, gcpl_id = h5p_default_f, &
224 gapl_id = h5p_default_f)
235 call h5screate_simple_f(drank, ddim, filespace, ierr)
237 call h5dcreate_f(grp_id,
'tlag', h5t_neko_real, &
238 filespace, dset_id, ierr)
239 call h5dget_space_f(dset_id, filespace, ierr)
240 call h5sselect_hyperslab_f (filespace, h5s_select_set_f, &
241 doffset, dcount, ierr)
242 call h5dwrite_f(dset_id, h5t_neko_real, tlag, &
243 ddim, ierr, xfer_prp = plist_id)
244 call h5dclose_f(dset_id, ierr)
246 call h5dcreate_f(grp_id,
'dtlag', h5t_neko_real, &
247 filespace, dset_id, ierr)
248 call h5dget_space_f(dset_id, filespace, ierr)
249 call h5sselect_hyperslab_f (filespace, h5s_select_set_f, &
250 doffset, dcount, ierr)
251 call h5dwrite_f(dset_id, h5t_neko_real, dtlag, &
252 ddim, ierr, xfer_prp = plist_id)
253 call h5dclose_f(dset_id, ierr)
255 call h5sclose_f(filespace, ierr)
256 call h5gclose_f(grp_id, ierr)
264 if (
allocated(fp) .or.
allocated(fsp))
then
265 call h5gcreate_f(file_id,
"Fields", grp_id, ierr, &
266 lcpl_id = h5p_default_f, gcpl_id = h5p_default_f, &
267 gapl_id = h5p_default_f)
269 dcount(1) = int(dof%size(), 8)
270 doffset(1) = int(msh%offset_el, 8) * int((dof%Xh%lx**3),8)
271 ddim = int(dof%size(), 8)
273 call mpi_allreduce(mpi_in_place, ddim(1), 1, &
276 call h5screate_simple_f(drank, ddim, filespace, ierr)
277 call h5screate_simple_f(drank, dcount, memspace, ierr)
280 if (
allocated(fp))
then
282 call h5dcreate_f(grp_id, fp(i)%ptr%name, h5t_neko_real, &
283 filespace, dset_id, ierr)
284 call h5dget_space_f(dset_id, filespace, ierr)
285 call h5sselect_hyperslab_f(filespace, h5s_select_set_f, &
286 doffset, dcount, ierr)
287 call h5dwrite_f(dset_id, h5t_neko_real, &
288 fp(i)%ptr%x(1,1,1,1), &
289 ddim, ierr, file_space_id = filespace, &
290 mem_space_id = memspace, xfer_prp = plist_id)
291 call h5dclose_f(dset_id, ierr)
296 if (
allocated(fsp))
then
298 do j = 1, fsp(i)%ptr%size()
299 call h5dcreate_f(grp_id, fsp(i)%ptr%lf(j)%name, &
300 h5t_neko_real, filespace, dset_id, ierr)
301 call h5dget_space_f(dset_id, filespace, ierr)
302 call h5sselect_hyperslab_f(filespace, h5s_select_set_f, &
303 doffset, dcount, ierr)
304 call h5dwrite_f(dset_id, h5t_neko_real, &
305 fsp(i)%ptr%lf(j)%x(1,1,1,1), &
306 ddim, ierr, file_space_id = filespace, &
307 mem_space_id = memspace, xfer_prp = plist_id)
308 call h5dclose_f(dset_id, ierr)
314 call h5gclose_f(grp_id, ierr)
315 call h5sclose_f(filespace, ierr)
316 call h5sclose_f(memspace, ierr)
319 call h5pclose_f(plist_id, ierr)
320 call h5fclose_f(file_id, ierr)
328 class(*),
target,
intent(inout) :: data
329 integer(hid_t) :: plist_id, file_id, dset_id, grp_id, attr_id
330 integer(hid_t) :: filespace, memspace
331 integer(hid_t) :: H5T_NEKO_REAL
332 integer(hsize_t),
dimension(1) :: ddim, dcount, doffset
333 integer :: i,j, ierr, info, glb_nelv, gdim, lx, drank
334 type(
mesh_t),
pointer :: msh
338 real(kind=
rp),
pointer :: dtlag(:)
339 real(kind=
rp),
pointer :: tlag(:)
341 character(len=1024) :: fname
343 fname = trim(this%get_fname())
347 call hdf5_file_determine_data(
data, msh, dof, fp, fsp, dtlag, tlag)
348 call hdf5_file_determine_real(h5t_neko_real)
350 call h5pcreate_f(h5p_file_access_f, plist_id, ierr)
351 info = mpi_info_null%mpi_val
352 call h5pset_fapl_mpio_f(plist_id,
neko_comm%mpi_val, info, ierr)
354 call h5fopen_f(fname, h5f_acc_rdonly_f, &
355 file_id, ierr, access_prp = plist_id)
357 call h5pcreate_f(h5p_dataset_xfer_f, plist_id, ierr)
358 call h5pset_dxpl_mpio_f(plist_id, h5fd_mpio_collective_f, ierr)
361 call h5aopen_name_f(file_id,
'Time', attr_id, ierr)
362 call h5aread_f(attr_id, h5t_neko_real, t, ddim, ierr)
363 call h5aclose_f(attr_id, ierr)
370 call h5aopen_name_f(file_id,
'Lx', attr_id, ierr)
371 call h5aread_f(attr_id, h5t_native_integer, lx, ddim, ierr)
372 call h5aclose_f(attr_id, ierr)
374 call h5gopen_f(file_id,
'Mesh', grp_id, ierr, gapl_id = h5p_default_f)
376 call h5aopen_name_f(grp_id,
'Elements', attr_id, ierr)
377 call h5aread_f(attr_id, h5t_native_integer, glb_nelv, ddim, ierr)
378 call h5aclose_f(attr_id, ierr)
380 call h5aopen_name_f(grp_id,
'Dimension', attr_id, ierr)
381 call h5aread_f(attr_id, h5t_native_integer, gdim, ddim, ierr)
382 call h5aclose_f(attr_id, ierr)
383 call h5gclose_f(grp_id, ierr)
386 if (
associated(tlag) .and.
associated(dtlag))
then
396 call h5gopen_f(file_id,
'Restart', grp_id, ierr, &
397 gapl_id = h5p_default_f)
398 call h5dopen_f(grp_id,
'tlag', dset_id, ierr)
399 call h5dget_space_f(dset_id, filespace, ierr)
400 call h5sselect_hyperslab_f (filespace, h5s_select_set_f, &
401 doffset, dcount, ierr)
402 call h5dread_f(dset_id, h5t_neko_real, tlag, ddim, ierr, &
404 call h5dclose_f(dset_id, ierr)
405 call h5sclose_f(filespace, ierr)
407 call h5dopen_f(grp_id,
'dtlag', dset_id, ierr)
408 call h5dget_space_f(dset_id, filespace, ierr)
409 call h5sselect_hyperslab_f (filespace, h5s_select_set_f, &
410 doffset, dcount, ierr)
411 call h5dread_f(dset_id, h5t_neko_real, dtlag, ddim, ierr, &
413 call h5dclose_f(dset_id, ierr)
414 call h5sclose_f(filespace, ierr)
416 call h5gclose_f(grp_id, ierr)
419 if (
allocated(fp) .or.
allocated(fsp))
then
420 call h5gopen_f(file_id,
'Fields', grp_id, ierr, gapl_id = h5p_default_f)
422 dcount(1) = int(dof%size(), 8)
423 doffset(1) = int(msh%offset_el, 8) * int((dof%Xh%lx**3),8)
424 ddim = int(dof%size(), 8)
427 dcount(1) = int(dof%size(), 8)
428 doffset(1) = int(msh%offset_el, 8) * int((dof%Xh%lx**3),8)
429 ddim = int(dof%size(), 8)
431 call mpi_allreduce(mpi_in_place, ddim(1), 1, &
434 call h5screate_simple_f(drank, dcount, memspace, ierr)
436 if (
allocated(fp))
then
438 call h5dopen_f(grp_id, fp(i)%ptr%name, dset_id, ierr)
439 call h5dget_space_f(dset_id, filespace, ierr)
440 call h5sselect_hyperslab_f (filespace, h5s_select_set_f, &
441 doffset, dcount, ierr)
442 call h5dread_f(dset_id, h5t_neko_real, &
443 fp(i)%ptr%x(1,1,1,1), &
444 ddim, ierr, file_space_id = filespace, &
445 mem_space_id = memspace, xfer_prp = plist_id)
446 call h5dclose_f(dset_id, ierr)
447 call h5sclose_f(filespace, ierr)
451 if (
allocated(fsp))
then
453 do j = 1, fsp(i)%ptr%size()
454 call h5dopen_f(grp_id, fsp(i)%ptr%lf(j)%name, dset_id, ierr)
455 call h5dget_space_f(dset_id, filespace, ierr)
456 call h5sselect_hyperslab_f (filespace, h5s_select_set_f, &
457 doffset, dcount, ierr)
458 call h5dread_f(dset_id, h5t_neko_real, &
459 fsp(i)%ptr%lf(j)%x(1,1,1,1), &
460 ddim, ierr, file_space_id = filespace, &
461 mem_space_id = memspace, xfer_prp = plist_id)
462 call h5dclose_f(dset_id, ierr)
463 call h5sclose_f(filespace, ierr)
467 call h5sclose_f(memspace, ierr)
468 call h5gclose_f(grp_id, ierr)
471 call h5pclose_f(plist_id, ierr)
472 call h5fclose_f(file_id, ierr)
478 subroutine hdf5_file_determine_data(data, msh, dof, fp, fsp, dtlag, tlag)
479 class(*),
target,
intent(in) :: data
480 type(
mesh_t),
pointer,
intent(inout) :: msh
481 type(
dofmap_t),
pointer,
intent(inout) :: dof
482 type(
field_ptr_t),
allocatable,
intent(inout) :: fp(:)
484 real(kind=
rp),
pointer,
intent(inout) :: dtlag(:)
485 real(kind=
rp),
pointer,
intent(inout) :: tlag(:)
486 integer :: i, j, fp_size, fp_cur, fsp_size, fsp_cur, scalar_count, ab_count
487 character(len=32) :: scalar_name
494 allocate(fp(fp_size))
502 if (data%size() .gt. 0)
then
503 allocate(fp(data%size()))
508 do i = 1, data%size()
509 fp(i)%ptr => data%items(i)%ptr
520 if ( .not.
associated(data%u) .or. &
521 .not.
associated(data%v) .or. &
522 .not.
associated(data%w) .or. &
523 .not.
associated(data%p) )
then
529 if (
allocated(data%scalar_lags%items) .and. &
530 data%scalar_lags%size() > 0)
then
531 scalar_count = data%scalar_lags%size()
532 else if (
associated(data%s))
then
538 if (scalar_count .gt. 1)
then
539 fp_size = fp_size + scalar_count
542 fp_size = fp_size + (scalar_count * 2)
543 else if (
associated(data%s))
then
545 fp_size = fp_size + 1
546 if (
associated(data%abs1))
then
547 fp_size = fp_size + 2
551 if (
associated(data%abx1))
then
552 fp_size = fp_size + 6
555 allocate(fp(fp_size))
558 if (
associated(data%ulag))
then
559 fsp_size = fsp_size + 3
562 if (scalar_count .gt. 1)
then
563 if (
allocated(data%scalar_lags%items))
then
564 fsp_size = fsp_size + data%scalar_lags%size()
566 else if (
associated(data%slag))
then
567 fsp_size = fsp_size + 1
570 if (fsp_size .gt. 0)
then
571 allocate(fsp(fsp_size))
585 if (scalar_count .gt. 1)
then
588 do i = 1, scalar_count
589 slag => data%scalar_lags%get(i)
590 fp(fp_cur)%ptr => slag%f
595 do i = 1, scalar_count
596 fp(fp_cur)%ptr => data%scalar_abx1(i)%ptr
598 fp(fp_cur)%ptr => data%scalar_abx2(i)%ptr
601 else if (
associated(data%s))
then
603 fp(fp_cur)%ptr => data%s
606 if (
associated(data%abs1))
then
607 fp(fp_cur)%ptr => data%abs1
608 fp(fp_cur+1)%ptr => data%abs2
613 if (
associated(data%abx1))
then
614 fp(fp_cur)%ptr => data%abx1
615 fp(fp_cur+1)%ptr => data%abx2
616 fp(fp_cur+2)%ptr => data%aby1
617 fp(fp_cur+3)%ptr => data%aby2
618 fp(fp_cur+4)%ptr => data%abz1
619 fp(fp_cur+5)%ptr => data%abz2
623 if (
associated(data%ulag))
then
624 fsp(fsp_cur)%ptr => data%ulag
625 fsp(fsp_cur+1)%ptr => data%vlag
626 fsp(fsp_cur+2)%ptr => data%wlag
627 fsp_cur = fsp_cur + 3
631 if (scalar_count .gt. 1)
then
632 if (
allocated(data%scalar_lags%items))
then
633 do j = 1, data%scalar_lags%size()
634 fsp(fsp_cur)%ptr => data%scalar_lags%get(j)
635 fsp_cur = fsp_cur + 1
638 else if (
associated(data%slag))
then
639 fsp(fsp_cur)%ptr => data%slag
640 fsp_cur = fsp_cur + 1
643 if (
associated(data%tlag))
then
652 end subroutine hdf5_file_determine_data
657 subroutine hdf5_file_determine_real(H5T_NEKO_REAL)
658 integer(hid_t),
intent(inout) :: H5T_NEKO_REAL
661 h5t_neko_real = h5t_native_double
663 h5t_neko_real = h5t_native_real
665 call neko_error(
"Unsupported real type")
667 end subroutine hdf5_file_determine_real
676 character(len=1),
intent(in) :: mode
677 integer :: ierr, mpi_info, mpi_comm, i, n_fields, counter
678 logical :: file_exists
679 character(len=1024) :: fname
680 character(len=LOG_SIZE) :: log_buf
686 if (this%precision .gt. rp)
then
688 call neko_warning(
'Requested precision is higher than working precision')
689 else if (this%precision .eq. -1)
then
694 counter = this%get_counter() - this%get_start_counter()
699 mpi_info = mpi_info_null%mpi_val
700 mpi_comm = neko_comm%mpi_val
701 call h5pcreate_f(h5p_file_access_f, this%plist_id, ierr)
702 call h5pset_fapl_mpio_f(this%plist_id, mpi_comm, mpi_info, ierr)
705 inquire(
file = fname, exist = file_exists)
706 if (file_exists)
then
707 call h5fopen_f(fname, h5f_acc_rdwr_f, this%file_id, ierr, &
708 access_prp = this%plist_id)
710 call h5fcreate_f(fname, h5f_acc_trunc_f, &
711 this%file_id, ierr, access_prp = this%plist_id)
715 call this%set_active_group()
717 write (log_buf, *)
"Opened HDF5 file: ", trim(fname),
" with counter: ", &
719 call neko_log%message(log_buf, lvl = neko_log_debug)
728 if (this%active_group_id .ne. -1_hid_t .and. &
729 this%active_group_id .ne. this%file_id)
then
730 call h5gclose_f(this%active_group_id, ierr)
732 this%active_group_id = -1_hid_t
734 call h5pclose_f(this%plist_id, ierr)
735 this%plist_id = -1_hid_t
736 call h5fclose_f(this%file_id, ierr)
737 this%file_id = -1_hid_t
740 call neko_log%message(
"Closed HDF5 file: " // trim(this%get_fname()), &
741 lvl = neko_log_debug)
751 character(len=*),
intent(in),
optional :: group_name_path
752 character(len=1000),
allocatable :: group_name(:)
754 integer(hid_t) :: current_id, group_id
755 integer :: ierr, i, j, num_groups, name_len, group_loc
756 logical :: group_exists
760 if (this%active_group_id .ne. -1_hid_t .and. this%active_group_id .ne. &
762 call h5gclose_f(this%active_group_id, ierr)
764 this%active_group_id = -1_hid_t
767 current_id = this%file_id
769 if (.not.
present(group_name_path))
then
770 this%active_group_id = current_id
775 name_len = len(trim(group_name_path))
779 if (group_name_path .eq.
"/")
then
780 num_groups = num_groups + 1
785 allocate(group_name(num_groups))
789 if (group_name_path .eq.
"/")
then
790 group_name(group_loc) = group_name_path(j:i-1)
791 group_loc = group_loc + 1
795 if (j .ne. name_len)
then
796 group_name(group_loc) = group_name_path(j:name_len)
801 call h5lexists_f(current_id, trim(group_name(i)), group_exists, ierr)
804 if (group_exists)
then
805 call h5gopen_f(current_id, trim(group_name(i)), group_id, ierr)
807 if (this%mode ==
"r")
then
808 call neko_error(
"Group " // trim(group_name(i)) // &
811 call h5gcreate_f(current_id, trim(group_name(i)), group_id, ierr)
816 call h5gclose_f(current_id, ierr)
819 current_id = group_id
822 this%active_group_id = current_id
828 class(*),
intent(inout) :: data
830 select type (d => data)
832 call this%write_vector(d)
834 call this%write_matrix(d)
836 call this%write_field(d)
838 call neko_error(
"write_dataset not implemented for this data type")
844 character(len=*),
intent(in) :: data_name
845 class(*),
intent(inout) :: data
846 character(len=*),
intent(in),
optional :: strategy
848 select type (d => data)
850 call this%read_vector(data_name, d, strategy)
852 call this%read_matrix(data_name, d, strategy)
854 call neko_error(
"Reading a field_t is not supported yet")
856 call neko_error(
"read_dataset not implemented for this data type")
862 character(len=*),
intent(in) :: data_name
863 class(*),
intent(inout) :: data
865 select type (d => data)
867 call this%write_int_attribute(data_name, d)
868 type is (
real(kind=rp))
869 call this%write_rp_attribute(data_name, d)
871 call neko_error(
"write_attribute not implemented for this data type")
877 character(len=*),
intent(in) :: data_name
878 class(*),
intent(inout) :: data
879 logical,
intent(inout) :: exist
881 select type (d => data)
883 call this%read_int_attribute(data_name, d, exist)
884 type is (
real(kind=rp))
885 call this%read_rp_attribute(data_name, d, exist)
887 call neko_error(
"read_attribute not implemented for this data type")
894 type(vector_t),
intent(inout) :: vec
895 integer :: ierr, counts, offset, total_count, dset_rank, max_count
896 integer(hsize_t) :: append_offset
897 integer(hid_t) :: precision_hdf
898 integer(hid_t) :: xf_id, filespace, dset_id, memspace, dcpl_id
899 integer(hsize_t),
dimension(1) :: dcount, doffset
900 integer(hsize_t),
dimension(1) :: ddims, ddims_max, chunkdims
901 integer(hsize_t),
dimension(1) :: tempddims, tempmaxddims
902 logical :: dset_exists
903 real(kind=sp),
allocatable :: write_buffer_sp(:)
904 real(kind=dp),
allocatable :: write_buffer_dp(:)
910 append_offset = 0_hsize_t
914 call mpi_scan(counts, offset, 1, mpi_integer, &
915 mpi_sum, neko_comm, ierr)
916 offset = offset - counts
917 call mpi_allreduce(counts, total_count, 1, mpi_integer, &
918 mpi_sum, neko_comm, ierr)
919 call mpi_allreduce(counts, max_count, 1, mpi_integer, &
920 mpi_max, neko_comm, ierr)
925 call h5pcreate_f(h5p_dataset_xfer_f, xf_id, ierr)
926 call h5pset_dxpl_mpio_f(xf_id, h5fd_mpio_collective_f, ierr)
927 precision_hdf = h5kind_to_type(this%precision, h5_real_kind)
933 ddims = [int(total_count, hsize_t)]
936 chunkdims = [
max(int(max_count, hsize_t), 1_hsize_t)]
937 ddims_max = [h5s_unlimited_f]
938 call h5lexists_f(this%active_group_id, trim(vec%name), dset_exists, ierr)
939 if (dset_exists)
then
940 if (this%overwrite)
then
942 call h5dopen_f(this%active_group_id, trim(vec%name), dset_id, ierr)
945 call h5dopen_f(this%active_group_id, trim(vec%name), dset_id, ierr)
947 call h5dget_space_f(dset_id, filespace, ierr)
949 call h5sget_simple_extent_dims_f(filespace, tempddims, tempmaxddims, &
952 call h5sclose_f(filespace, ierr)
954 ddims(1) = ddims(1) + tempddims(1)
955 append_offset = tempddims(1)
957 call h5dset_extent_f(dset_id, ddims, ierr)
961 call h5screate_simple_f(dset_rank, ddims, filespace, ierr, ddims_max)
963 call h5pcreate_f(h5p_dataset_create_f, dcpl_id, ierr)
964 call h5pset_chunk_f(dcpl_id, dset_rank, chunkdims, ierr)
966 call h5dcreate_f(this%active_group_id, trim(vec%name), precision_hdf, &
967 filespace, dset_id, ierr, dcpl_id = dcpl_id)
969 call h5sclose_f(filespace, ierr)
970 call h5pclose_f(dcpl_id, ierr)
976 dcount = [int(counts, hsize_t)]
979 doffset = [int(offset, hsize_t) + append_offset]
981 call h5dget_space_f(dset_id, filespace, ierr)
983 call h5sselect_hyperslab_f(filespace, h5s_select_set_f, doffset, dcount, &
986 call h5screate_simple_f(dset_rank, dcount, memspace, ierr)
992 if (this%precision == sp)
then
993 allocate(write_buffer_sp(vec%size()))
994 if (vec%size() > 0) write_buffer_sp =
real(vec%x, kind=sp)
996 call h5dwrite_f(dset_id, precision_hdf, write_buffer_sp, dcount, ierr, &
997 file_space_id = filespace, mem_space_id = memspace, &
999 deallocate(write_buffer_sp)
1000 else if (this%precision == dp)
then
1001 allocate(write_buffer_dp(vec%size()))
1002 if (vec%size() > 0) write_buffer_dp =
real(vec%x, kind=dp)
1004 call h5dwrite_f(dset_id, precision_hdf, write_buffer_dp, dcount, ierr, &
1005 file_space_id = filespace, mem_space_id = memspace, &
1007 deallocate(write_buffer_dp)
1009 call neko_error(
"Unsupported precision")
1015 call h5pclose_f(xf_id, ierr)
1016 call h5sclose_f(memspace, ierr)
1017 call h5sclose_f(filespace, ierr)
1018 call h5dclose_f(dset_id, ierr)
1024 type(matrix_t),
intent(inout) :: mat
1025 integer :: ierr, counts, offset, total_count, dset_rank, strides, max_count
1026 integer(hsize_t) :: append_offset
1027 integer(hid_t) :: precision_hdf
1028 integer(hid_t) :: xf_id, filespace, dset_id, memspace, dcpl_id
1029 integer(hsize_t),
dimension(2) :: dcount, doffset
1030 integer(hsize_t),
dimension(2) :: ddims, ddims_max, chunkdims
1031 integer(hsize_t),
dimension(2) :: tempddims, tempmaxddims
1032 logical :: dset_exists
1033 real(kind=sp),
allocatable :: write_buffer_sp(:,:)
1034 real(kind=dp),
allocatable :: write_buffer_dp(:,:)
1039 strides = mat%get_nrows()
1040 counts = mat%get_ncols()
1041 append_offset = 0_hsize_t
1045 call mpi_scan(counts, offset, 1, mpi_integer, &
1046 mpi_sum, neko_comm, ierr)
1047 offset = offset - counts
1048 call mpi_allreduce(counts, total_count, 1, mpi_integer, &
1049 mpi_sum, neko_comm, ierr)
1050 call mpi_allreduce(counts, max_count, 1, mpi_integer, &
1051 mpi_max, neko_comm, ierr)
1056 call h5pcreate_f(h5p_dataset_xfer_f, xf_id, ierr)
1057 call h5pset_dxpl_mpio_f(xf_id, h5fd_mpio_collective_f, ierr)
1058 precision_hdf = h5kind_to_type(this%precision, h5_real_kind)
1065 ddims = [int(strides, hsize_t), int(total_count, hsize_t)]
1066 chunkdims = [int(strides, hsize_t),
max(int(max_count, hsize_t), 1_hsize_t)]
1067 ddims_max = [int(strides, hsize_t), h5s_unlimited_f]
1068 call h5lexists_f(this%active_group_id, trim(mat%name), dset_exists, ierr)
1069 if (dset_exists)
then
1070 if (this%overwrite)
then
1072 if (pe_rank .eq. 0)
then
1073 call neko_warning(
"Dataset " // trim(mat%name) // &
1074 " already exists and wil be overwritten")
1077 call h5dopen_f(this%active_group_id, trim(mat%name), dset_id, ierr)
1079 call h5dopen_f(this%active_group_id, trim(mat%name), dset_id, ierr)
1080 call h5dget_space_f(dset_id, filespace, ierr)
1081 call h5sget_simple_extent_dims_f(filespace, tempddims, tempmaxddims, &
1083 call h5sclose_f(filespace, ierr)
1084 ddims(2) = ddims(2) + tempddims(2)
1085 append_offset = tempddims(2)
1086 call h5dset_extent_f(dset_id, ddims, ierr)
1090 call h5screate_simple_f(dset_rank, ddims, filespace, ierr, ddims_max)
1091 call h5pcreate_f(h5p_dataset_create_f, dcpl_id, ierr)
1092 call h5pset_chunk_f(dcpl_id, dset_rank, chunkdims, ierr)
1094 call h5dcreate_f(this%active_group_id, trim(mat%name), precision_hdf, &
1095 filespace, dset_id, ierr, dcpl_id = dcpl_id)
1096 call h5sclose_f(filespace, ierr)
1097 call h5pclose_f(dcpl_id, ierr)
1104 dcount = [int(strides, hsize_t), int(counts, hsize_t)]
1106 doffset = [0_hsize_t, int(offset, hsize_t) + append_offset]
1108 call h5dget_space_f(dset_id, filespace, ierr)
1110 call h5sselect_hyperslab_f(filespace, h5s_select_set_f, doffset, dcount, &
1113 call h5screate_simple_f(dset_rank, dcount, memspace, ierr)
1118 if (this%precision == sp)
then
1119 allocate(write_buffer_sp(mat%get_nrows(), mat%get_ncols()))
1120 if (mat%size() > 0) write_buffer_sp =
real(mat%x, kind=sp)
1122 call h5dwrite_f(dset_id, precision_hdf, write_buffer_sp, dcount, ierr, &
1123 file_space_id = filespace, mem_space_id = memspace, &
1125 deallocate(write_buffer_sp)
1126 else if (this%precision == dp)
then
1127 allocate(write_buffer_dp(mat%get_nrows(), mat%get_ncols()))
1128 if (mat%size() > 0) write_buffer_dp =
real(mat%x, kind=dp)
1130 call h5dwrite_f(dset_id, precision_hdf, write_buffer_dp, dcount, ierr, &
1131 file_space_id = filespace, mem_space_id = memspace, &
1133 deallocate(write_buffer_dp)
1135 call neko_error(
"Unsupported precision")
1141 call h5pclose_f(xf_id, ierr)
1142 call h5sclose_f(memspace, ierr)
1143 call h5sclose_f(filespace, ierr)
1144 call h5dclose_f(dset_id, ierr)
1150 type(field_t),
intent(inout) :: field
1151 integer :: ierr, counts, offset, total_count, dset_rank, max_count
1152 integer :: stride_ax_1, stride_ax_2, stride_ax_3
1153 integer(hsize_t) :: append_offset
1154 integer(hid_t) :: precision_hdf
1155 integer(hid_t) :: xf_id, filespace, dset_id, memspace, dcpl_id
1156 integer(hsize_t),
dimension(4) :: dcount, doffset
1157 integer(hsize_t),
dimension(4) :: ddims, ddims_max, chunkdims
1158 integer(hsize_t),
dimension(4) :: tempddims, tempmaxddims
1159 logical :: dset_exists
1160 real(kind=sp),
allocatable :: write_buffer_sp(:,:,:,:)
1161 real(kind=dp),
allocatable :: write_buffer_dp(:,:,:,:)
1166 stride_ax_1 =
field%Xh%lx
1167 stride_ax_2 =
field%Xh%ly
1168 stride_ax_3 =
field%Xh%lz
1169 counts =
field%msh%nelv
1170 append_offset = 0_hsize_t
1171 total_count =
field%msh%glb_nelv
1173 offset =
field%msh%offset_el
1174 call mpi_allreduce(counts, max_count, 1, mpi_integer, &
1175 mpi_max, neko_comm, ierr)
1180 call h5pcreate_f(h5p_dataset_xfer_f, xf_id, ierr)
1181 call h5pset_dxpl_mpio_f(xf_id, h5fd_mpio_collective_f, ierr)
1182 precision_hdf = h5kind_to_type(this%precision, h5_real_kind)
1188 ddims = [int(stride_ax_1, hsize_t), &
1189 int(stride_ax_2, hsize_t), &
1190 int(stride_ax_3, hsize_t), &
1191 int(total_count, hsize_t)]
1192 chunkdims = [int(stride_ax_1, hsize_t), &
1193 int(stride_ax_2, hsize_t), &
1194 int(stride_ax_3, hsize_t), &
1195 max(int(max_count, hsize_t), 1_hsize_t)]
1196 ddims_max = [int(stride_ax_1, hsize_t), &
1197 int(stride_ax_2, hsize_t), &
1198 int(stride_ax_3, hsize_t), &
1200 call h5lexists_f(this%active_group_id, trim(
field%name), dset_exists, ierr)
1201 if (dset_exists)
then
1202 if (this%overwrite)
then
1204 if (pe_rank .eq. 0)
then
1205 call neko_warning(
"Overwriting dataset: " // trim(
field%name))
1207 call h5dopen_f(this%active_group_id, trim(
field%name), dset_id, ierr)
1209 call h5dopen_f(this%active_group_id, trim(
field%name), dset_id, ierr)
1210 call h5dget_space_f(dset_id, filespace, ierr)
1211 call h5sget_simple_extent_dims_f(filespace, tempddims, tempmaxddims, &
1213 call h5sclose_f(filespace, ierr)
1214 ddims(4) = ddims(4) + tempddims(4)
1215 append_offset = tempddims(4)
1216 call h5dset_extent_f(dset_id, ddims, ierr)
1220 call h5screate_simple_f(dset_rank, ddims, filespace, ierr, ddims_max)
1221 call h5pcreate_f(h5p_dataset_create_f, dcpl_id, ierr)
1222 call h5pset_chunk_f(dcpl_id, dset_rank, chunkdims, ierr)
1224 call h5dcreate_f(this%active_group_id, trim(
field%name), precision_hdf, &
1225 filespace, dset_id, ierr, dcpl_id = dcpl_id)
1226 call h5sclose_f(filespace, ierr)
1227 call h5pclose_f(dcpl_id, ierr)
1233 dcount = [int(stride_ax_1, hsize_t), &
1234 int(stride_ax_2, hsize_t), &
1235 int(stride_ax_3, hsize_t), &
1236 int(counts, hsize_t)]
1237 doffset = [0_hsize_t, 0_hsize_t, 0_hsize_t, &
1238 int(offset, hsize_t) + append_offset]
1240 call h5dget_space_f(dset_id, filespace, ierr)
1242 call h5sselect_hyperslab_f(filespace, h5s_select_set_f, doffset, dcount, &
1245 call h5screate_simple_f(dset_rank, dcount, memspace, ierr)
1250 if (this%precision == sp)
then
1255 call h5dwrite_f(dset_id, precision_hdf, write_buffer_sp, dcount, ierr, &
1256 file_space_id = filespace, mem_space_id = memspace, &
1258 deallocate(write_buffer_sp)
1259 else if (this%precision == dp)
then
1264 call h5dwrite_f(dset_id, precision_hdf, write_buffer_dp, dcount, ierr, &
1265 file_space_id = filespace, mem_space_id = memspace, &
1267 deallocate(write_buffer_dp)
1269 call neko_error(
"Unsupported precision")
1275 call h5pclose_f(xf_id, ierr)
1276 call h5sclose_f(memspace, ierr)
1277 call h5sclose_f(filespace, ierr)
1278 call h5dclose_f(dset_id, ierr)
1285 character(len=*),
intent(in) :: data_name
1286 type(vector_t),
intent(inout) :: vec
1287 character(len=*),
intent(in),
optional :: strategy
1288 character(len=1000) :: strategy_
1289 integer :: ierr, counts, offset, total_count, dset_rank
1290 integer(hid_t) :: precision_hdf
1291 integer(hid_t) :: xf_id, filespace, dset_id, memspace
1292 integer(hsize_t),
dimension(1) :: dcount, doffset
1293 integer(hsize_t),
dimension(1) :: tempddims, tempmaxddims
1295 logical :: dset_exists
1296 type(linear_dist_t) :: dist
1299 if (
present(strategy))
then
1300 if (trim(strategy) .eq.
"linear" .or. &
1301 trim(strategy) .eq.
"rank_0")
then
1302 strategy_ = strategy
1304 call neko_error(
"Unsupported strategy: " // trim(strategy))
1307 strategy_ =
"linear"
1316 call h5pcreate_f(h5p_dataset_xfer_f, xf_id, ierr)
1317 call h5pset_dxpl_mpio_f(xf_id, h5fd_mpio_collective_f, ierr)
1318 precision_hdf = h5kind_to_type(rp, h5_real_kind)
1323 call h5lexists_f(this%active_group_id, trim(data_name), dset_exists, ierr)
1324 if (dset_exists)
then
1326 call h5dopen_f(this%active_group_id, trim(data_name), dset_id, ierr)
1328 call h5dget_space_f(dset_id, filespace, ierr)
1329 call h5sget_simple_extent_ndims_f(filespace, temprank, ierr)
1330 if (temprank .ne. 1)
then
1331 call neko_error(
"Dataset " // trim(data_name) // &
1332 " is not a rank 1 vector in file " // trim(
file_get_fname(this)))
1335 call h5sget_simple_extent_dims_f(filespace, tempddims, tempmaxddims, &
1337 call h5sclose_f(filespace, ierr)
1339 call neko_error(
"Dataset " // trim(data_name) // &
1340 " does not exist in current group " // trim(
file_get_fname(this)))
1346 total_count = int(tempddims(1))
1347 if (strategy_ .eq.
"linear")
then
1348 dist = linear_dist_t(total_count, pe_rank, pe_size, neko_comm)
1349 counts = dist%num_local()
1351 else if (strategy_ .eq.
"rank_0")
then
1352 if (pe_rank .eq. 0)
then
1353 counts = total_count
1359 call mpi_exscan(counts, offset, 1, mpi_integer, &
1360 mpi_sum, neko_comm, ierr)
1366 dcount = [int(counts, hsize_t)]
1367 doffset = [int(offset, hsize_t)]
1369 call h5dget_space_f(dset_id, filespace, ierr)
1371 call h5sselect_hyperslab_f(filespace, h5s_select_set_f, doffset, dcount, &
1374 call h5screate_simple_f(dset_rank, dcount, memspace, ierr)
1379 call vec%init(counts, trim(data_name))
1380 call h5dread_f(dset_id, precision_hdf, vec%x, dcount, ierr, &
1381 file_space_id = filespace, mem_space_id = memspace, &
1387 call h5pclose_f(xf_id, ierr)
1388 call h5sclose_f(memspace, ierr)
1389 call h5sclose_f(filespace, ierr)
1390 call h5dclose_f(dset_id, ierr)
1397 character(len=*),
intent(in) :: data_name
1398 type(matrix_t),
intent(inout) :: mat
1399 character(len=*),
intent(in),
optional :: strategy
1400 character(len=1000) :: strategy_
1401 integer :: ierr, counts, offset, total_count, dset_rank
1402 integer(hid_t) :: precision_hdf
1403 integer(hid_t) :: xf_id, filespace, dset_id, memspace
1404 integer(hsize_t),
dimension(2) :: dcount, doffset
1405 integer(hsize_t),
dimension(2) :: tempddims, tempmaxddims
1407 logical :: dset_exists
1408 type(linear_dist_t) :: dist
1411 if (
present(strategy))
then
1412 if (trim(strategy) .eq.
"linear" .or. &
1413 trim(strategy) .eq.
"rank_0")
then
1414 strategy_ = strategy
1416 call neko_error(
"Unsupported strategy: " // trim(strategy))
1419 strategy_ =
"linear"
1428 call h5pcreate_f(h5p_dataset_xfer_f, xf_id, ierr)
1429 call h5pset_dxpl_mpio_f(xf_id, h5fd_mpio_collective_f, ierr)
1430 precision_hdf = h5kind_to_type(rp, h5_real_kind)
1435 call h5lexists_f(this%active_group_id, trim(data_name), dset_exists, ierr)
1436 if (dset_exists)
then
1438 call h5dopen_f(this%active_group_id, trim(data_name), dset_id, ierr)
1440 call h5dget_space_f(dset_id, filespace, ierr)
1441 call h5sget_simple_extent_ndims_f(filespace, temprank, ierr)
1442 if (temprank .ne. 2)
then
1443 call neko_error(
"Dataset " // trim(data_name) // &
1444 " is not a rank 2 matrix in file " // trim(
file_get_fname(this)))
1447 call h5sget_simple_extent_dims_f(filespace, tempddims, tempmaxddims, &
1449 call h5sclose_f(filespace, ierr)
1451 call neko_error(
"Dataset " // trim(data_name) &
1452 //
" does not exist in current group " // &
1459 total_count = int(tempddims(2))
1460 if (strategy_ .eq.
"linear")
then
1461 dist = linear_dist_t(total_count, pe_rank, pe_size, neko_comm)
1462 counts = dist%num_local()
1464 else if (strategy_ .eq.
"rank_0")
then
1465 if (pe_rank .eq. 0)
then
1466 counts = total_count
1472 call mpi_scan(counts, offset, 1, mpi_integer, &
1473 mpi_sum, neko_comm, ierr)
1474 offset = offset - counts
1480 dcount = [int(tempddims(1), hsize_t), int(counts, hsize_t)]
1481 doffset = [0_hsize_t, int(offset, hsize_t)]
1483 call h5dget_space_f(dset_id, filespace, ierr)
1485 call h5sselect_hyperslab_f(filespace, h5s_select_set_f, doffset, dcount, &
1488 call h5screate_simple_f(dset_rank, dcount, memspace, ierr)
1493 call mat%init(int(tempddims(1)), counts, trim(data_name))
1494 call h5dread_f(dset_id, precision_hdf, mat%x, dcount, ierr, &
1495 file_space_id = filespace, mem_space_id = memspace, &
1501 call h5pclose_f(xf_id, ierr)
1502 call h5sclose_f(memspace, ierr)
1503 call h5sclose_f(filespace, ierr)
1504 call h5dclose_f(dset_id, ierr)
1512 character(len=*),
intent(in) :: attr_name
1513 integer,
intent(in) :: attr
1515 integer(hid_t) :: filespace, attr_id
1516 integer(hsize_t),
dimension(1) :: dcount
1517 logical :: attr_exists
1522 dcount = [int(1, hsize_t)]
1523 call h5aexists_f(this%active_group_id, trim(attr_name), attr_exists, ierr)
1524 if (attr_exists)
then
1526 call h5aopen_f(this%active_group_id, trim(attr_name), attr_id, ierr)
1529 call h5screate_f(h5s_scalar_f, filespace, ierr)
1531 call h5acreate_f(this%active_group_id, trim(attr_name), &
1532 h5t_native_integer, &
1533 filespace, attr_id, ierr, h5p_default_f, h5p_default_f)
1534 call h5sclose_f(filespace, ierr)
1540 call h5awrite_f(attr_id, h5t_native_integer, attr, dcount, ierr)
1545 call h5aclose_f(attr_id, ierr)
1552 character(len=*),
intent(in) :: attr_name
1553 real(kind=rp),
intent(in) :: attr
1555 integer(hid_t) :: precision_hdf
1556 integer(hid_t) :: filespace, attr_id
1557 integer(hsize_t),
dimension(1) :: dcount
1558 logical :: attr_exists
1561 precision_hdf = h5kind_to_type(rp, h5_real_kind)
1566 dcount = [int(1, hsize_t)]
1567 call h5aexists_f(this%active_group_id, trim(attr_name), attr_exists, ierr)
1568 if (attr_exists)
then
1570 call h5aopen_f(this%active_group_id, trim(attr_name), attr_id, ierr)
1573 call h5screate_f(h5s_scalar_f, filespace, ierr)
1575 call h5acreate_f(this%active_group_id, trim(attr_name), precision_hdf, &
1576 filespace, attr_id, ierr, h5p_default_f, h5p_default_f)
1577 call h5sclose_f(filespace, ierr)
1583 call h5awrite_f(attr_id, precision_hdf, attr, dcount, ierr)
1588 call h5aclose_f(attr_id, ierr)
1595 character(len=*),
intent(in) :: attr_name
1596 integer,
intent(inout) :: attr
1597 logical,
intent(inout) :: attr_exists
1599 integer(hid_t) :: filespace, attr_id
1600 integer(hsize_t),
dimension(1) :: dcount
1605 dcount = [int(1, hsize_t)]
1606 call h5aexists_f(this%active_group_id, trim(attr_name), attr_exists, ierr)
1607 if (attr_exists)
then
1609 call h5aopen_f(this%active_group_id, trim(attr_name), attr_id, ierr)
1617 call h5aread_f(attr_id, h5t_native_integer, attr, dcount, ierr)
1622 call h5aclose_f(attr_id, ierr)
1629 character(len=*),
intent(in) :: attr_name
1630 real(kind=rp),
intent(inout) :: attr
1631 logical,
intent(inout) :: attr_exists
1633 integer(hid_t) :: precision_hdf
1634 integer(hid_t) :: filespace, attr_id
1635 integer(hsize_t),
dimension(1) :: dcount
1638 precision_hdf = h5kind_to_type(rp, h5_real_kind)
1643 dcount = [int(1, hsize_t)]
1644 call h5aexists_f(this%active_group_id, trim(attr_name), attr_exists, ierr)
1645 if (attr_exists)
then
1647 call h5aopen_f(this%active_group_id, trim(attr_name), attr_id, ierr)
1655 call h5aread_f(attr_id, precision_hdf, attr, dcount, ierr)
1660 call h5aclose_f(attr_id, ierr)
1669 character(len=1),
intent(in) :: mode
1670 call neko_error(
'Neko needs to be built with HDF5 support')
1676 call neko_error(
'Neko needs to be built with HDF5 support')
1682 character(len=*),
intent(in),
optional :: group_name_path
1683 call neko_error(
'Neko needs to be built with HDF5 support')
1689 class(*),
target,
intent(in) :: data
1690 real(kind=rp),
intent(in),
optional :: t
1691 call neko_error(
'Neko needs to be built with HDF5 support')
1697 class(*),
target,
intent(inout) :: data
1698 call neko_error(
'Neko needs to be built with HDF5 support')
1703 class(*),
intent(inout) :: data
1704 call neko_error(
'Neko needs to be built with HDF5 support')
1709 character(len=*),
intent(in) :: data_name
1710 class(*),
intent(inout) :: data
1711 character(len=*),
intent(in),
optional :: strategy
1712 call neko_error(
'Neko needs to be built with HDF5 support')
1717 character(len=*),
intent(in) :: data_name
1718 class(*),
intent(inout) :: data
1719 call neko_error(
'Neko needs to be built with HDF5 support')
1724 character(len=*),
intent(in) :: data_name
1725 class(*),
intent(inout) :: data
1726 logical,
intent(inout) :: exist
1727 call neko_error(
'Neko needs to be built with HDF5 support')
1732 type(vector_t),
intent(inout) :: vec
1733 call neko_error(
'Neko needs to be built with HDF5 support')
1738 type(matrix_t),
intent(inout) :: mat
1739 call neko_error(
'Neko needs to be built with HDF5 support')
1744 type(field_t),
intent(inout) :: fld
1745 call neko_error(
'Neko needs to be built with HDF5 support')
1750 character(len=*),
intent(in) :: data_name
1751 type(vector_t),
intent(inout) :: vec
1752 character(len=*),
intent(in),
optional :: strategy
1753 call neko_error(
'Neko needs to be built with HDF5 support')
1758 character(len=*),
intent(in) :: data_name
1759 type(matrix_t),
intent(inout) :: mat
1760 character(len=*),
intent(in),
optional :: strategy
1761 call neko_error(
'Neko needs to be built with HDF5 support')
1766 character(len=*),
intent(in) :: attr_name
1767 integer,
intent(in) :: attr
1768 call neko_error(
'Neko needs to be built with HDF5 support')
1773 character(len=*),
intent(in) :: attr_name
1774 real(kind=rp),
intent(in) :: attr
1775 call neko_error(
'Neko needs to be built with HDF5 support')
1780 character(len=*),
intent(in) :: attr_name
1781 integer,
intent(inout) :: attr
1782 logical,
intent(inout) :: attr_exists
1783 call neko_error(
'Neko needs to be built with HDF5 support')
1788 character(len=*),
intent(in) :: attr_name
1789 real(kind=rp),
intent(inout) :: attr
1790 logical,
intent(inout) :: attr_exists
1791 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)
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.