102 class(*),
target,
intent(in) :: data
103 real(kind=
rp),
intent(in),
optional :: t
105 real(kind=
rp),
allocatable,
target :: tempo(:)
106 type(
mesh_t),
pointer :: msh
109 real(kind=
dp) :: time
110 character(len= 132) :: hdr
111 character :: rdcode(10)
112 character(len=6) :: id_str
113 character(len= 1024) :: fname
114 character(len= 1024) :: name
116 integer :: i, ierr, n, suffix_pos, tslash_pos
117 integer :: lx, ly, lz, lxyz, gdim, glb_nelv, nelv, offset_el
118 integer,
allocatable :: idx(:)
119 type(mpi_status) :: status
121 integer (kind=MPI_OFFSET_KIND) :: mpi_offset, byte_offset, temp_offset
122 real(kind=
sp),
parameter :: test_pattern = 6.54321
124 logical :: write_mesh, write_velocity, write_pressure, write_temperature
125 integer :: fld_data_size, n_scalar_fields
137 write_pressure = .false.
138 write_velocity = .false.
139 write_temperature = .false.
148 glb_nelv = data%glb_nelv
149 offset_el = data%offset_el
151 if (data%x%size() .gt. 0) x%ptr => data%x%x
152 if (data%y%size() .gt. 0) y%ptr => data%y%x
153 if (data%z%size() .gt. 0) z%ptr => data%z%x
154 if (gdim .eq. 2) z%ptr => data%y%x
155 if (data%u%size() .gt. 0)
then
159 if (data%v%size() .le. 0) v%ptr => data%u%x
160 if (data%w%size() .le. 0) w%ptr => data%u%x
161 write_velocity = .true.
163 if (data%v%size() .gt. 0) v%ptr => data%v%x
164 if (data%w%size() .gt. 0) w%ptr => data%w%x
165 if (data%p%size() .gt. 0)
then
167 write_pressure = .true.
169 if (data%t%size() .gt. 0)
then
170 write_temperature = .true.
175 if (gdim .eq. 2 .and. data%w%size() .gt. 0)
then
176 n_scalar_fields = data%n_scalars + 1
177 allocate(scalar_fields(n_scalar_fields))
178 do i = 1, n_scalar_fields -1
179 scalar_fields(i)%ptr => data%s(i)%x
181 scalar_fields(n_scalar_fields)%ptr => data%w%x
183 n_scalar_fields = data%n_scalars
184 allocate(scalar_fields(n_scalar_fields+1))
185 do i = 1, n_scalar_fields
186 scalar_fields(i)%ptr => data%s(i)%x
188 scalar_fields(n_scalar_fields+1)%ptr => data%w%x
193 if (nelv .eq. 0)
then
210 p%ptr => data%x(:,1,1,1)
212 write_pressure = .true.
213 write_velocity = .false.
215 select case (data%size())
217 p%ptr => data%items(1)%ptr%x(:,1,1,1)
218 write_pressure = .true.
219 write_velocity = .false.
221 p%ptr => data%items(1)%ptr%x(:,1,1,1)
222 tem%ptr => data%items(2)%ptr%x(:,1,1,1)
223 write_pressure = .true.
224 write_temperature = .true.
226 u%ptr => data%items(1)%ptr%x(:,1,1,1)
227 v%ptr => data%items(2)%ptr%x(:,1,1,1)
228 w%ptr => data%items(3)%ptr%x(:,1,1,1)
229 write_velocity = .true.
231 p%ptr => data%items(1)%ptr%x(:,1,1,1)
232 u%ptr => data%items(2)%ptr%x(:,1,1,1)
233 v%ptr => data%items(3)%ptr%x(:,1,1,1)
234 w%ptr => data%items(4)%ptr%x(:,1,1,1)
235 write_pressure = .true.
236 write_velocity = .true.
238 p%ptr => data%items(1)%ptr%x(:,1,1,1)
239 u%ptr => data%items(2)%ptr%x(:,1,1,1)
240 v%ptr => data%items(3)%ptr%x(:,1,1,1)
241 w%ptr => data%items(4)%ptr%x(:,1,1,1)
242 tem%ptr => data%items(5)%ptr%x(:,1,1,1)
243 n_scalar_fields = data%size() - 5
244 allocate(scalar_fields(n_scalar_fields))
245 do i = 1, n_scalar_fields
246 scalar_fields(i)%ptr => data%items(i+5)%ptr%x(:,1,1,1)
248 write_pressure = .true.
249 write_velocity = .true.
250 write_temperature = .true.
252 call neko_error(
'This many fields not supported yet, fld_file')
259 if (
associated(dof))
then
260 x%ptr => dof%x(:,1,1,1)
261 y%ptr => dof%y(:,1,1,1)
262 z%ptr => dof%z(:,1,1,1)
267 if (
associated(msh))
then
269 glb_nelv = msh%glb_nelv
270 offset_el = msh%offset_el
273 allocate(idx(msh%nelv))
275 idx(i) = msh%elements(i)%e%id()
279 if (
associated(xh))
then
288 if (this%dp_precision)
then
293 if (this%dp_precision)
then
304 call this%increment_counter()
306 if (.not. this%write_mesh)
then
307 write_mesh = (this%get_counter() .eq. this%get_start_counter())
309 write_mesh = this%write_mesh
311 call mpi_allreduce(mpi_in_place, write_mesh, 1, &
313 call mpi_allreduce(mpi_in_place, write_velocity, 1, &
315 call mpi_allreduce(mpi_in_place, write_pressure, 1, &
317 call mpi_allreduce(mpi_in_place, write_temperature, 1, &
319 call mpi_allreduce(mpi_in_place, n_scalar_fields, 1, &
330 if (write_velocity)
then
334 if (write_pressure)
then
338 if (write_temperature)
then
342 if (n_scalar_fields .gt. 0 )
then
345 write(rdcode(i),
'(i1)') (n_scalar_fields)/10
347 write(rdcode(i),
'(i1)') (n_scalar_fields) - 10*((n_scalar_fields)/10)
352 write(hdr, 1) fld_data_size, lx, ly, lz, glb_nelv, glb_nelv,&
353 time, this%get_counter(), 1, 1, (rdcode(i), i = 1, 10)
3541
format(
'#std', 1x, i1, 1x,
i2, 1x,
i2, 1x,
i2, 1x, i10, 1x, i10, &
355 1x, e20.13, 1x, i9, 1x, i6, 1x, i6, 1x, 10a)
358 fname = this%get_fld_fname()
360 call mpi_file_open(
neko_comm, trim(fname), &
361 mpi_mode_wronly + mpi_mode_create, mpi_info_null, fh, &
364 call mpi_file_write_all(fh, hdr, 132, mpi_character, status, ierr)
367 call mpi_file_write_all(fh, test_pattern, 1, mpi_real, status, ierr)
370 byte_offset = mpi_offset + &
372 call mpi_file_write_at_all(fh, byte_offset, idx, nelv, &
373 mpi_integer, status, ierr)
378 byte_offset = mpi_offset + int(offset_el,
i8) * &
379 (int(gdim*lxyz,
i8) * &
380 int(fld_data_size,
i8))
382 x%ptr, y%ptr, z%ptr, &
384 mpi_offset = mpi_offset + int(glb_nelv,
i8) * &
385 (int(gdim *lxyz,
i8) * &
386 int(fld_data_size,
i8))
388 if (write_velocity)
then
389 byte_offset = mpi_offset + int(offset_el,
i8) * &
390 (int(gdim * (lxyz),
i8) * int(fld_data_size,
i8))
392 u%ptr, v%ptr, w%ptr, n, gdim, lxyz, nelv)
394 mpi_offset = mpi_offset + int(glb_nelv,
i8) * &
395 (int(gdim * (lxyz),
i8) * &
396 int(fld_data_size,
i8))
400 if (write_pressure)
then
401 byte_offset = mpi_offset + int(offset_el,
i8) * &
402 (int((lxyz),
i8) * int(fld_data_size,
i8))
404 mpi_offset = mpi_offset + int(glb_nelv,
i8) * &
405 (int((lxyz),
i8) * int(fld_data_size,
i8))
408 if (write_temperature)
then
409 byte_offset = mpi_offset + int(offset_el,
i8) * &
411 int(fld_data_size,
i8))
413 mpi_offset = mpi_offset + int(glb_nelv,
i8) * &
415 int(fld_data_size,
i8))
418 temp_offset = mpi_offset
420 do i = 1, n_scalar_fields
424 mpi_offset = int(temp_offset,
i8) + int(1_i8*glb_nelv,
i8) * &
425 (int(lxyz,
i8) * int(fld_data_size,
i8))
427 byte_offset = int(mpi_offset,
i8) + int(offset_el,
i8) * &
429 int(fld_data_size,
i8))
431 mpi_offset = int(mpi_offset,
i8) + int(glb_nelv,
i8) * &
433 int(fld_data_size,
i8))
436 if (gdim .eq. 3)
then
443 byte_offset = int(mpi_offset,
i8) + &
444 int(offset_el,
i8) * &
449 x%ptr, y%ptr, z%ptr, gdim, lxyz, nelv)
450 mpi_offset = int(mpi_offset,
i8) + &
451 int(glb_nelv,
i8) * &
457 if (write_velocity)
then
458 byte_offset = int(mpi_offset,
i8) + &
459 int(offset_el,
i8) * &
464 u%ptr, v%ptr, w%ptr, gdim, lxyz, nelv)
465 mpi_offset = int(mpi_offset,
i8) + &
466 int(glb_nelv,
i8) * &
473 if (write_pressure)
then
474 byte_offset = int(mpi_offset,
i8) + &
475 int(offset_el,
i8) * &
480 mpi_offset = int(mpi_offset,
i8) + &
481 int(glb_nelv,
i8) * &
487 if (write_temperature)
then
488 byte_offset = int(mpi_offset,
i8) + &
489 int(offset_el,
i8) * &
494 mpi_offset = int(mpi_offset,
i8) + &
495 int(glb_nelv,
i8) * &
503 temp_offset = mpi_offset
505 do i = 1, n_scalar_fields
509 mpi_offset = int(temp_offset,
i8) + &
510 int(1_i8*glb_nelv,
i8) * &
515 byte_offset = int(mpi_offset,
i8) + &
516 int(offset_el,
i8) * &
520 scalar_fields(i)%ptr, lxyz, nelv)
521 mpi_offset = int(mpi_offset,
i8) + &
522 int(glb_nelv,
i8) * &
529 call mpi_file_sync(fh, ierr)
530 call mpi_file_close(fh, ierr)
535 open(newunit = file_unit, &
536 file = this%get_meta_fname(), status =
'replace')
543 write(file_unit, fmt =
'(A,A,A)')
'filetemplate: ', &
544 trim(name),
'%01d.f%05d'
545 write(file_unit, fmt =
'(A,i5)')
'firsttimestep: ', &
546 this%get_start_counter()
547 write(file_unit, fmt =
'(A,i5)')
'numtimesteps: ', &
548 (this%get_counter() + 1) - this%get_start_counter()
554 if (
allocated(tempo))
deallocate(tempo)
555 if (
allocated(scalar_fields))
deallocate(scalar_fields)
563 class(*),
target,
intent(in) :: data
564 type(
mask_t),
intent(in) :: mask
565 real(kind=
rp),
intent(in),
optional :: t
567 real(kind=
rp),
allocatable,
target :: tempo(:)
568 type(
mesh_t),
pointer :: msh
571 real(kind=
dp) :: time
572 character(len= 132) :: hdr
573 character :: rdcode(10)
574 character(len=6) :: id_str
575 character(len= 1024) :: fname
576 character(len= 1024) :: name
578 integer :: i, ierr, n, suffix_pos, tslash_pos
579 integer :: lx, ly, lz, lxyz, gdim, glb_nelv, nelv, offset_el
580 integer,
allocatable :: idx(:)
581 type(mpi_status) :: status
583 integer (kind=MPI_OFFSET_KIND) :: mpi_offset, byte_offset, temp_offset
584 real(kind=
sp),
parameter :: test_pattern = 6.54321
586 logical :: write_mesh, write_velocity, write_pressure, write_temperature
587 integer :: fld_data_size, n_scalar_fields
599 write_pressure = .false.
600 write_velocity = .false.
601 write_temperature = .false.
610 glb_nelv = data%glb_nelv
611 offset_el = data%offset_el
613 if (data%x%size() .gt. 0) x%ptr => data%x%x
614 if (data%y%size() .gt. 0) y%ptr => data%y%x
615 if (data%z%size() .gt. 0) z%ptr => data%z%x
616 if (gdim .eq. 2) z%ptr => data%y%x
617 if (data%u%size() .gt. 0)
then
621 if (data%v%size() .le. 0) v%ptr => data%u%x
622 if (data%w%size() .le. 0) w%ptr => data%u%x
623 write_velocity = .true.
625 if (data%v%size() .gt. 0) v%ptr => data%v%x
626 if (data%w%size() .gt. 0) w%ptr => data%w%x
627 if (data%p%size() .gt. 0)
then
629 write_pressure = .true.
631 if (data%t%size() .gt. 0)
then
632 write_temperature = .true.
637 if (gdim .eq. 2 .and. data%w%size() .gt. 0)
then
638 n_scalar_fields = data%n_scalars + 1
639 allocate(scalar_fields(n_scalar_fields))
640 do i = 1, n_scalar_fields -1
641 scalar_fields(i)%ptr => data%s(i)%x
643 scalar_fields(n_scalar_fields)%ptr => data%w%x
645 n_scalar_fields = data%n_scalars
646 allocate(scalar_fields(n_scalar_fields+1))
647 do i = 1, n_scalar_fields
648 scalar_fields(i)%ptr => data%s(i)%x
650 scalar_fields(n_scalar_fields+1)%ptr => data%w%x
655 if (nelv .eq. 0)
then
672 p%ptr => data%x(:,1,1,1)
674 write_pressure = .true.
675 write_velocity = .false.
677 select case (data%size())
679 p%ptr => data%items(1)%ptr%x(:,1,1,1)
680 write_pressure = .true.
681 write_velocity = .false.
683 p%ptr => data%items(1)%ptr%x(:,1,1,1)
684 tem%ptr => data%items(2)%ptr%x(:,1,1,1)
685 write_pressure = .true.
686 write_temperature = .true.
688 u%ptr => data%items(1)%ptr%x(:,1,1,1)
689 v%ptr => data%items(2)%ptr%x(:,1,1,1)
690 w%ptr => data%items(3)%ptr%x(:,1,1,1)
691 write_velocity = .true.
693 p%ptr => data%items(1)%ptr%x(:,1,1,1)
694 u%ptr => data%items(2)%ptr%x(:,1,1,1)
695 v%ptr => data%items(3)%ptr%x(:,1,1,1)
696 w%ptr => data%items(4)%ptr%x(:,1,1,1)
697 write_pressure = .true.
698 write_velocity = .true.
700 p%ptr => data%items(1)%ptr%x(:,1,1,1)
701 u%ptr => data%items(2)%ptr%x(:,1,1,1)
702 v%ptr => data%items(3)%ptr%x(:,1,1,1)
703 w%ptr => data%items(4)%ptr%x(:,1,1,1)
704 tem%ptr => data%items(5)%ptr%x(:,1,1,1)
705 n_scalar_fields = data%size() - 5
706 allocate(scalar_fields(n_scalar_fields))
707 do i = 1, n_scalar_fields
708 scalar_fields(i)%ptr => data%items(i+5)%ptr%x(:,1,1,1)
710 write_pressure = .true.
711 write_velocity = .true.
712 write_temperature = .true.
714 call neko_error(
'This many fields not supported yet, fld_file')
721 if (
associated(dof))
then
722 x%ptr => dof%x(:,1,1,1)
723 y%ptr => dof%y(:,1,1,1)
724 z%ptr => dof%z(:,1,1,1)
729 if (
associated(msh))
then
731 glb_nelv = msh%glb_nelv
732 offset_el = msh%offset_el
735 allocate(idx(msh%nelv))
737 idx(i) = msh%elements(i)%e%id()
741 if (
associated(xh))
then
750 nelv =
mask%size() / lxyz
751 if (mod(
mask%size(), lxyz) /= 0)
then
752 call neko_error(
"Mask size must be a multiple of the number of elements in the mesh.")
754 call mpi_allreduce(nelv, glb_nelv, 1, &
756 call mpi_scan(nelv, offset_el, 1, &
758 offset_el = offset_el - nelv
760 if (
allocated(idx))
then
766 idx(i) = offset_el + i
770 if (this%dp_precision)
then
775 if (this%dp_precision)
then
786 call this%increment_counter()
788 if (.not. this%write_mesh)
then
789 write_mesh = (this%get_counter() .eq. this%get_start_counter())
791 write_mesh = this%write_mesh
793 call mpi_allreduce(mpi_in_place, write_mesh, 1, &
795 call mpi_allreduce(mpi_in_place, write_velocity, 1, &
797 call mpi_allreduce(mpi_in_place, write_pressure, 1, &
799 call mpi_allreduce(mpi_in_place, write_temperature, 1, &
801 call mpi_allreduce(mpi_in_place, n_scalar_fields, 1, &
812 if (write_velocity)
then
816 if (write_pressure)
then
820 if (write_temperature)
then
824 if (n_scalar_fields .gt. 0 )
then
827 write(rdcode(i),
'(i1)') (n_scalar_fields)/10
829 write(rdcode(i),
'(i1)') (n_scalar_fields) - 10*((n_scalar_fields)/10)
834 write(hdr, 1) fld_data_size, lx, ly, lz, glb_nelv, glb_nelv,&
835 time, this%get_counter(), 1, 1, (rdcode(i), i = 1, 10)
8361
format(
'#std', 1x, i1, 1x,
i2, 1x,
i2, 1x,
i2, 1x, i10, 1x, i10, &
837 1x, e20.13, 1x, i9, 1x, i6, 1x, i6, 1x, 10a)
840 fname = this%get_fld_fname()
842 call mpi_file_open(
neko_comm, trim(fname), &
843 mpi_mode_wronly + mpi_mode_create, mpi_info_null, fh, &
846 call mpi_file_write_all(fh, hdr, 132, mpi_character, status, ierr)
849 call mpi_file_write_all(fh, test_pattern, 1, mpi_real, status, ierr)
852 byte_offset = mpi_offset + &
854 call mpi_file_write_at_all(fh, byte_offset, idx, nelv, &
855 mpi_integer, status, ierr)
860 byte_offset = mpi_offset + int(offset_el,
i8) * &
861 (int(gdim*lxyz,
i8) * &
862 int(fld_data_size,
i8))
864 x%ptr, y%ptr, z%ptr, &
865 n, gdim, lxyz, nelv, lx, ly, lz,
mask%get())
866 mpi_offset = mpi_offset + int(glb_nelv,
i8) * &
867 (int(gdim *lxyz,
i8) * &
868 int(fld_data_size,
i8))
870 if (write_velocity)
then
871 byte_offset = mpi_offset + int(offset_el,
i8) * &
872 (int(gdim * (lxyz),
i8) * int(fld_data_size,
i8))
874 u%ptr, v%ptr, w%ptr, n, gdim, lxyz, nelv, lx, ly, lz,
mask%get())
876 mpi_offset = mpi_offset + int(glb_nelv,
i8) * &
877 (int(gdim * (lxyz),
i8) * &
878 int(fld_data_size,
i8))
882 if (write_pressure)
then
883 byte_offset = mpi_offset + int(offset_el,
i8) * &
884 (int((lxyz),
i8) * int(fld_data_size,
i8))
886 mpi_offset = mpi_offset + int(glb_nelv,
i8) * &
887 (int((lxyz),
i8) * int(fld_data_size,
i8))
890 if (write_temperature)
then
891 byte_offset = mpi_offset + int(offset_el,
i8) * &
893 int(fld_data_size,
i8))
895 mpi_offset = mpi_offset + int(glb_nelv,
i8) * &
897 int(fld_data_size,
i8))
900 temp_offset = mpi_offset
902 do i = 1, n_scalar_fields
906 mpi_offset = int(temp_offset,
i8) + int(1_i8*glb_nelv,
i8) * &
907 (int(lxyz,
i8) * int(fld_data_size,
i8))
909 byte_offset = int(mpi_offset,
i8) + int(offset_el,
i8) * &
911 int(fld_data_size,
i8))
913 mpi_offset = int(mpi_offset,
i8) + int(glb_nelv,
i8) * &
915 int(fld_data_size,
i8))
918 if (gdim .eq. 3)
then
925 byte_offset = int(mpi_offset,
i8) + &
926 int(offset_el,
i8) * &
931 x%ptr, y%ptr, z%ptr, gdim, lxyz, nelv, lx, ly, lz, n,
mask%get())
932 mpi_offset = int(mpi_offset,
i8) + &
933 int(glb_nelv,
i8) * &
939 if (write_velocity)
then
940 byte_offset = int(mpi_offset,
i8) + &
941 int(offset_el,
i8) * &
946 u%ptr, v%ptr, w%ptr, gdim, lxyz, nelv, lx, ly, lz, n,
mask%get())
947 mpi_offset = int(mpi_offset,
i8) + &
948 int(glb_nelv,
i8) * &
955 if (write_pressure)
then
956 byte_offset = int(mpi_offset,
i8) + &
957 int(offset_el,
i8) * &
961 p%ptr, lxyz, nelv, lx, ly, lz, n,
mask%get())
962 mpi_offset = int(mpi_offset,
i8) + &
963 int(glb_nelv,
i8) * &
969 if (write_temperature)
then
970 byte_offset = int(mpi_offset,
i8) + &
971 int(offset_el,
i8) * &
975 tem%ptr, lxyz, nelv, lx, ly, lz, n,
mask%get())
976 mpi_offset = int(mpi_offset,
i8) + &
977 int(glb_nelv,
i8) * &
985 temp_offset = mpi_offset
987 do i = 1, n_scalar_fields
991 mpi_offset = int(temp_offset,
i8) + &
992 int(1_i8*glb_nelv,
i8) * &
997 byte_offset = int(mpi_offset,
i8) + &
998 int(offset_el,
i8) * &
1002 scalar_fields(i)%ptr, lxyz, nelv, lx, ly, lz, n,
mask%get())
1003 mpi_offset = int(mpi_offset,
i8) + &
1004 int(glb_nelv,
i8) * &
1011 call mpi_file_sync(fh, ierr)
1012 call mpi_file_close(fh, ierr)
1017 open(newunit = file_unit, &
1018 file = this%get_meta_fname(), status =
'replace')
1025 write(file_unit, fmt =
'(A,A,A)')
'filetemplate: ', &
1026 trim(name),
'%01d.f%05d'
1027 write(file_unit, fmt =
'(A,i5)')
'firsttimestep: ', &
1028 this%get_start_counter()
1029 write(file_unit, fmt =
'(A,i5)')
'numtimesteps: ', &
1030 (this%get_counter() + 1) - this%get_start_counter()
1036 if (
allocated(tempo))
deallocate(tempo)
1037 if (
allocated(scalar_fields))
deallocate(scalar_fields)
1340 class(*),
target,
intent(inout) :: data
1341 character(len= 132) :: hdr
1342 integer :: ierr, suffix_pos, i, j
1343 type(mpi_file) :: fh
1344 type(mpi_status) :: status
1345 character(len= 1024) :: fname, base_fname, meta_fname, string, path
1346 logical :: meta_file, read_mesh, read_velocity, read_pressure
1347 logical :: read_temp
1348 character(len=6) :: suffix
1349 integer (kind=MPI_OFFSET_KIND) :: mpi_offset, byte_offset
1350 integer :: lx, ly, lz, glb_nelv, counter, lxyz
1351 integer :: FLD_DATA_SIZE, n_scalars, n
1352 integer :: file_unit
1353 real(kind=
rp) :: time
1354 real(kind=
sp) :: temp
1356 real(kind=
sp),
parameter :: test_pattern = 6.54321
1357 character :: rdcode(10), temp_str(4)
1358 character(len=LOG_SIZE) :: log_buf
1364 inquire(
file = trim(meta_fname), exist = meta_file)
1365 if (meta_file .and. data%meta_nsamples .eq. 0)
then
1367 open(newunit = file_unit,
file = trim(meta_fname))
1368 read(file_unit, fmt =
'(A)') string
1369 read(string(14:), fmt =
'(A)') string
1370 string = trim(string)
1372 data%fld_series_fname = string(:scan(trim(string),
'%')-1)
1373 data%fld_series_fname = adjustl(data%fld_series_fname)
1374 data%fld_series_fname = trim(data%fld_series_fname)//
'0'
1376 read(file_unit, fmt =
'(A)') string
1377 read(string(scan(string,
':')+1:), *) data%meta_start_counter
1378 read(file_unit, fmt =
'(A)') string
1379 read(string(scan(string,
':')+1:), *) data%meta_nsamples
1382 write(log_buf,*)
'Reading meta file for fld series'
1384 write(log_buf,*)
'Name: ', trim(data%fld_series_fname)
1386 write(log_buf,*)
'Start counter: ', data%meta_start_counter
1388 write(log_buf,*)
'Nsamples: ', data%meta_nsamples
1392 call mpi_bcast(data%fld_series_fname, 1024, mpi_character, 0, &
1394 call mpi_bcast(data%meta_start_counter, 1, mpi_integer, 0, &
1396 call mpi_bcast(data%meta_nsamples, 1, mpi_integer, 0, &
1399 if (this%get_counter() .eq. -1)
then
1400 call this%set_start_counter(data%meta_start_counter)
1401 call this%set_counter(data%meta_start_counter)
1407 write(suffix,
'(a,i5.5)')
'f', this%get_counter()
1408 fname = trim(path) // trim(data%fld_series_fname) //
'.' // suffix
1409 if (this%get_counter() .ge. &
1410 data%meta_nsamples+data%meta_start_counter)
then
1411 call neko_error(
'Trying to read more fld files than exist')
1414 write(suffix,
'(a,i5.5)')
'f', this%get_counter()
1417 call mpi_file_open(
neko_comm, trim(fname), &
1418 mpi_mode_rdonly, mpi_info_null, fh, ierr)
1420 if (ierr .ne. 0)
call neko_error(
"Could not read "//trim(fname))
1422 call neko_log%message(
'Reading fld file ' // trim(fname))
1424 call mpi_file_read_all(fh, hdr, 132, mpi_character, status, ierr)
1428 read(hdr, 1) temp_str, fld_data_size, lx, ly, lz, glb_nelv, glb_nelv, &
1429 time, counter, i, j, (rdcode(i), i = 1, 10)
14301
format(4a, 1x, i1, 1x,
i2, 1x,
i2, 1x,
i2, 1x, i10, 1x, i10, &
1431 1x, e20.13, 1x, i9, 1x, i6, 1x, i6, 1x, 10a)
1432 if (data%nelv .eq. 0)
then
1434 data%nelv = dist%num_local()
1435 data%offset_el = dist%start_idx()
1440 data%glb_nelv = glb_nelv
1441 data%t_counter = counter
1444 n = lxyz * data%nelv
1454 this%dp_precision = .true.
1456 this%dp_precision = .false.
1458 if (this%dp_precision)
then
1459 allocate(
tmp_dp(data%gdim*n))
1461 allocate(
tmp_sp(data%gdim*n))
1467 read_velocity = .false.
1468 read_pressure = .false.
1470 if (rdcode(i) .eq.
'X')
then
1477 if (rdcode(i) .eq.
'U')
then
1478 read_velocity = .true.
1484 if (rdcode(i) .eq.
'P')
then
1485 read_pressure = .true.
1489 if (rdcode(i) .eq.
'T')
then
1495 if (rdcode(i) .eq.
'S')
then
1497 read(rdcode(i),*) n_scalars
1498 n_scalars = n_scalars*10
1501 n_scalars = n_scalars+j
1503 if (
allocated(data%s))
then
1504 if (data%n_scalars .ne. n_scalars)
then
1505 do j = 1, data%n_scalars
1506 call data%s(j)%free()
1509 data%n_scalars = n_scalars
1510 allocate(data%s(n_scalars))
1511 do j = 1, data%n_scalars
1512 call data%s(j)%init(n)
1516 data%n_scalars = n_scalars
1517 allocate(data%s(data%n_scalars))
1518 do j = 1, data%n_scalars
1519 call data%s(j)%init(n)
1526 call mpi_file_read_at_all(fh, mpi_offset, temp, 1, &
1527 mpi_real, status, ierr)
1528 if (.not.
sabscmp(temp, test_pattern, epsilon(1.0_sp)))
then
1529 call neko_error(
'Incorrect format for fld file, &
1530 &test pattern does not match.')
1535 if (
allocated(data%idx))
then
1536 if (
size(data%idx) .ne. data%nelv)
then
1537 deallocate(data%idx)
1538 allocate(data%idx(data%nelv))
1541 allocate(data%idx(data%nelv))
1544 byte_offset = mpi_offset + &
1547 call mpi_file_read_at_all(fh, byte_offset, data%idx, data%nelv, &
1548 mpi_integer, status, ierr)
1550 mpi_offset = mpi_offset + &
1554 byte_offset = mpi_offset + int(data%offset_el,
i8) * &
1555 (int(data%gdim*lxyz,
i8) * &
1556 int(fld_data_size,
i8))
1558 data%x, data%y, data%z, data)
1559 mpi_offset = mpi_offset + int(data%glb_nelv,
i8) * &
1560 (int(data%gdim *lxyz,
i8) * &
1561 int(fld_data_size,
i8))
1564 if (read_velocity)
then
1565 byte_offset = mpi_offset + int(data%offset_el,
i8) * &
1566 (int(data%gdim*lxyz,
i8) * &
1567 int(fld_data_size,
i8))
1569 data%u, data%v, data%w, data)
1570 mpi_offset = mpi_offset + int(data%glb_nelv,
i8) * &
1571 (int(data%gdim *lxyz,
i8) * &
1572 int(fld_data_size,
i8))
1575 if (read_pressure)
then
1576 byte_offset = mpi_offset + int(data%offset_el,
i8) * &
1578 int(fld_data_size,
i8))
1580 mpi_offset = mpi_offset + int(data%glb_nelv,
i8) * &
1582 int(fld_data_size,
i8))
1586 byte_offset = mpi_offset + int(data%offset_el,
i8) * &
1588 int(fld_data_size,
i8))
1590 mpi_offset = mpi_offset + int(data%glb_nelv,
i8) * &
1592 int(fld_data_size,
i8))
1596 byte_offset = mpi_offset + int(data%offset_el,
i8) * &
1598 int(fld_data_size,
i8))
1600 mpi_offset = mpi_offset + int(data%glb_nelv,
i8) * &
1602 int(fld_data_size,
i8))
1606 call this%increment_counter()
1611 call neko_error(
'Currently we only read into fld_file_data_t, &
1612 &please use that data structure instead.')