80 class(*),
target,
intent(in) :: data
81 real(kind=
rp),
intent(in),
optional :: t
83 real(kind=
rp),
allocatable,
target :: tempo(:)
84 type(
mesh_t),
pointer :: msh
88 character(len= 132) :: hdr
89 character :: rdcode(10)
90 character(len=6) :: id_str
91 character(len= 1024) :: fname
92 character(len= 1024) :: start_field
94 integer :: i, ierr, n, suffix_pos, tslash_pos
95 integer :: lx, ly, lz, lxyz, gdim, glb_nelv, nelv, offset_el
96 integer,
allocatable :: idx(:)
97 type(mpi_status) :: status
99 integer (kind=MPI_OFFSET_KIND) :: mpi_offset, byte_offset, temp_offset
100 real(kind=
sp),
parameter :: test_pattern = 6.54321
102 logical :: write_mesh, write_velocity, write_pressure, write_temperature
103 integer :: fld_data_size, n_scalar_fields
115 write_pressure = .false.
116 write_velocity = .false.
117 write_temperature = .false.
126 glb_nelv = data%glb_nelv
127 offset_el = data%offset_el
129 if (data%x%size() .gt. 0) x%ptr => data%x%x
130 if (data%y%size() .gt. 0) y%ptr => data%y%x
131 if (data%z%size() .gt. 0) z%ptr => data%z%x
132 if (gdim .eq. 2) z%ptr => data%y%x
133 if (data%u%size() .gt. 0)
then
135 write_velocity = .true.
137 if (data%v%size() .gt. 0) v%ptr => data%v%x
138 if (data%w%size() .gt. 0) w%ptr => data%w%x
139 if (data%p%size() .gt. 0)
then
141 write_pressure = .true.
143 if (data%t%size() .gt. 0)
then
144 write_temperature = .true.
149 if (gdim .eq. 2 .and. data%w%size() .gt. 0)
then
150 n_scalar_fields = data%n_scalars + 1
151 allocate(scalar_fields(n_scalar_fields))
152 do i = 1, n_scalar_fields -1
153 scalar_fields(i)%ptr => data%s(i)%x
155 scalar_fields(n_scalar_fields)%ptr => data%w%x
157 n_scalar_fields = data%n_scalars
158 allocate(scalar_fields(n_scalar_fields+1))
159 do i = 1, n_scalar_fields
160 scalar_fields(i)%ptr => data%s(i)%x
162 scalar_fields(n_scalar_fields+1)%ptr => data%w%x
167 if (nelv .eq. 0)
then
184 p%ptr => data%x(:,1,1,1)
186 write_pressure = .true.
187 write_velocity = .false.
189 select case (data%size())
191 p%ptr => data%items(1)%ptr%x(:,1,1,1)
192 write_pressure = .true.
193 write_velocity = .false.
195 p%ptr => data%items(1)%ptr%x(:,1,1,1)
196 tem%ptr => data%items(2)%ptr%x(:,1,1,1)
197 write_pressure = .true.
198 write_temperature = .true.
200 u%ptr => data%items(1)%ptr%x(:,1,1,1)
201 v%ptr => data%items(2)%ptr%x(:,1,1,1)
202 w%ptr => data%items(3)%ptr%x(:,1,1,1)
203 write_velocity = .true.
205 p%ptr => data%items(1)%ptr%x(:,1,1,1)
206 u%ptr => data%items(2)%ptr%x(:,1,1,1)
207 v%ptr => data%items(3)%ptr%x(:,1,1,1)
208 w%ptr => data%items(4)%ptr%x(:,1,1,1)
209 write_pressure = .true.
210 write_velocity = .true.
212 p%ptr => data%items(1)%ptr%x(:,1,1,1)
213 u%ptr => data%items(2)%ptr%x(:,1,1,1)
214 v%ptr => data%items(3)%ptr%x(:,1,1,1)
215 w%ptr => data%items(4)%ptr%x(:,1,1,1)
217 if (trim(data%name(5)) .eq.
'temperature')
then
219 tem%ptr => data%items(5)%ptr%x(:,1,1,1)
220 n_scalar_fields = data%size() - 5
221 allocate(scalar_fields(n_scalar_fields))
222 do i = 1, n_scalar_fields
223 scalar_fields(i)%ptr => data%items(i+5)%ptr%x(:,1,1,1)
225 write_temperature = .true.
228 n_scalar_fields = data%size() - 4
229 allocate(scalar_fields(n_scalar_fields))
230 do i = 1, n_scalar_fields
231 scalar_fields(i)%ptr => data%items(i+4)%ptr%x(:,1,1,1)
233 write_temperature = .false.
235 write_pressure = .true.
236 write_velocity = .true.
238 call neko_error(
'This many fields not supported yet, fld_file')
243 u%ptr => data%u%mf%x(:,1,1,1)
244 v%ptr => data%v%mf%x(:,1,1,1)
245 w%ptr => data%w%mf%x(:,1,1,1)
246 p%ptr => data%p%mf%x(:,1,1,1)
248 write_pressure = .true.
249 write_velocity = .true.
251 u%ptr => data%uu%mf%x(:,1,1,1)
252 v%ptr => data%vv%mf%x(:,1,1,1)
253 w%ptr => data%ww%mf%x(:,1,1,1)
254 p%ptr => data%pp%mf%x(:,1,1,1)
255 dof => data%pp%mf%dof
256 write_pressure = .true.
257 write_velocity = .true.
262 if (
associated(dof))
then
263 x%ptr => dof%x(:,1,1,1)
264 y%ptr => dof%y(:,1,1,1)
265 z%ptr => dof%z(:,1,1,1)
270 if (
associated(msh))
then
272 glb_nelv = msh%glb_nelv
273 offset_el = msh%offset_el
276 allocate(idx(msh%nelv))
278 idx(i) = msh%elements(i)%e%id()
282 if (
associated(xh))
then
291 if (this%dp_precision)
then
296 if (this%dp_precision)
then
307 write_mesh = (this%counter .eq. this%start_counter)
308 call mpi_allreduce(mpi_in_place, write_mesh, 1, &
310 call mpi_allreduce(mpi_in_place, write_velocity, 1, &
312 call mpi_allreduce(mpi_in_place, write_pressure, 1, &
314 call mpi_allreduce(mpi_in_place, write_temperature, 1, &
316 call mpi_allreduce(mpi_in_place, n_scalar_fields, 1, &
327 if (write_velocity)
then
331 if (write_pressure)
then
335 if (write_temperature)
then
339 if (n_scalar_fields .gt. 0 )
then
342 write(rdcode(i),
'(i1)') (n_scalar_fields)/10
344 write(rdcode(i),
'(i1)') (n_scalar_fields) - 10*((n_scalar_fields)/10)
349 write(hdr, 1) fld_data_size, lx, ly, lz, glb_nelv, glb_nelv,&
350 time, this%counter, 1, 1, (rdcode(i),i = 1, 10)
3511
format(
'#std', 1x, i1, 1x,
i2, 1x,
i2, 1x,
i2, 1x, i10, 1x, i10, &
352 1x, e20.13, 1x, i9, 1x, i6, 1x, i6, 1x, 10a)
356 write(id_str,
'(a,i5.5)')
'f', this%counter
357 fname = trim(this%fname(1:suffix_pos-1))//
'0.'//id_str
359 call mpi_file_open(
neko_comm, trim(fname), &
360 mpi_mode_wronly + mpi_mode_create, mpi_info_null, fh, &
363 call mpi_file_write_all(fh, hdr, 132, mpi_character, status, ierr)
366 call mpi_file_write_all(fh, test_pattern, 1, mpi_real, status, ierr)
369 byte_offset = mpi_offset + &
371 call mpi_file_write_at_all(fh, byte_offset, idx, nelv, &
372 mpi_integer, status, ierr)
377 byte_offset = mpi_offset + int(offset_el,
i8) * &
378 (int(gdim*lxyz,
i8) * &
379 int(fld_data_size,
i8))
381 x%ptr, y%ptr, z%ptr, &
383 mpi_offset = mpi_offset + int(glb_nelv,
i8) * &
384 (int(gdim *lxyz,
i8) * &
385 int(fld_data_size,
i8))
387 if (write_velocity)
then
388 byte_offset = mpi_offset + int(offset_el,
i8) * &
389 (int(gdim * (lxyz),
i8) * int(fld_data_size,
i8))
391 u%ptr, v%ptr, w%ptr, n, gdim, lxyz, nelv)
393 mpi_offset = mpi_offset + int(glb_nelv,
i8) * &
394 (int(gdim * (lxyz),
i8) * &
395 int(fld_data_size,
i8))
399 if (write_pressure)
then
400 byte_offset = mpi_offset + int(offset_el,
i8) * &
401 (int((lxyz),
i8) * int(fld_data_size,
i8))
403 mpi_offset = mpi_offset + int(glb_nelv,
i8) * &
404 (int((lxyz),
i8) * int(fld_data_size,
i8))
407 if (write_temperature)
then
408 byte_offset = mpi_offset + int(offset_el,
i8) * &
410 int(fld_data_size,
i8))
412 mpi_offset = mpi_offset + int(glb_nelv,
i8) * &
414 int(fld_data_size,
i8))
417 temp_offset = mpi_offset
419 do i = 1, n_scalar_fields
423 mpi_offset = int(temp_offset,
i8) + int(1_i8*glb_nelv,
i8) * &
424 (int(lxyz,
i8) * int(fld_data_size,
i8))
426 byte_offset = int(mpi_offset,
i8) + int(offset_el,
i8) * &
428 int(fld_data_size,
i8))
430 mpi_offset = int(mpi_offset,
i8) + int(glb_nelv,
i8) * &
432 int(fld_data_size,
i8))
435 if (gdim .eq. 3)
then
442 byte_offset = int(mpi_offset,
i8) + &
443 int(offset_el,
i8) * &
448 x%ptr, y%ptr, z%ptr, gdim, lxyz, nelv)
449 mpi_offset = int(mpi_offset,
i8) + &
450 int(glb_nelv,
i8) * &
456 if (write_velocity)
then
457 byte_offset = int(mpi_offset,
i8) + &
458 int(offset_el,
i8) * &
463 u%ptr, v%ptr, w%ptr, gdim, lxyz, nelv)
464 mpi_offset = int(mpi_offset,
i8) + &
465 int(glb_nelv,
i8) * &
472 if (write_pressure)
then
473 byte_offset = int(mpi_offset,
i8) + &
474 int(offset_el,
i8) * &
479 mpi_offset = int(mpi_offset,
i8) + &
480 int(glb_nelv,
i8) * &
486 if (write_temperature)
then
487 byte_offset = int(mpi_offset,
i8) + &
488 int(offset_el,
i8) * &
493 mpi_offset = int(mpi_offset,
i8) + &
494 int(glb_nelv,
i8) * &
502 temp_offset = mpi_offset
504 do i = 1, n_scalar_fields
508 mpi_offset = int(temp_offset,
i8) + &
509 int(1_i8*glb_nelv,
i8) * &
514 byte_offset = int(mpi_offset,
i8) + &
515 int(offset_el,
i8) * &
519 scalar_fields(i)%ptr, lxyz, nelv)
520 mpi_offset = int(mpi_offset,
i8) + &
521 int(glb_nelv,
i8) * &
528 call mpi_file_sync(fh, ierr)
529 call mpi_file_close(fh, ierr)
533 write(start_field,
"(I5,A8)") this%start_counter,
'.nek5000'
534 open(newunit = file_unit, &
535 file = trim(this%fname(1:suffix_pos-1)) // &
536 trim(adjustl(start_field)), status =
'replace')
543 write(file_unit, fmt =
'(A,A,A)')
'filetemplate: ', &
544 this%fname(tslash_pos+1:suffix_pos-1),
'%01d.f%05d'
545 write(file_unit, fmt =
'(A,i5)')
'firsttimestep: ', this%start_counter
546 write(file_unit, fmt =
'(A,i5)')
'numtimesteps: ', &
547 (this%counter + 1) - this%start_counter
551 this%counter = this%counter + 1
700 class(*),
target,
intent(inout) :: data
701 character(len= 132) :: hdr
702 integer :: ierr, suffix_pos, i, j
704 type(mpi_status) :: status
705 character(len= 1024) :: fname, meta_fname, string, path
706 logical :: meta_file, read_mesh, read_velocity, read_pressure
708 character(len=6) :: id_str
709 integer (kind=MPI_OFFSET_KIND) :: mpi_offset, byte_offset
710 integer :: lx, ly, lz, glb_nelv, counter, lxyz
711 integer :: FLD_DATA_SIZE, n_scalars, n
713 real(kind=
rp) :: time
714 real(kind=
sp) :: temp
716 real(kind=
sp),
parameter :: test_pattern = 6.54321
717 character :: rdcode(10), temp_str(4)
723 inquire(
file = trim(meta_fname), exist = meta_file)
724 if (meta_file .and. data%meta_nsamples .eq. 0)
then
726 open(newunit = file_unit,
file = trim(meta_fname))
727 read(file_unit, fmt =
'(A)') string
728 read(string(14:), fmt =
'(A)') string
729 string = trim(string)
730 data%fld_series_fname = string(:scan(trim(string),
'%')-1)
731 data%fld_series_fname = adjustl(data%fld_series_fname)
732 data%fld_series_fname = trim(data%fld_series_fname)//
'0'
733 read(file_unit, fmt =
'(A)') string
734 read(string(scan(string,
':')+1:), *) data%meta_start_counter
735 read(file_unit, fmt =
'(A)') string
736 read(string(scan(string,
':')+1:), *) data%meta_nsamples
739 write(*,*)
'Reading meta file for fld series'
740 write(*,*)
'Name: ', trim(data%fld_series_fname)
741 write(*,*)
'Start counter: ', data%meta_start_counter, &
742 'Nsamples: ', data%meta_nsamples
744 call mpi_bcast(data%fld_series_fname, 1024, mpi_character, 0, &
746 call mpi_bcast(data%meta_start_counter, 1, mpi_integer, 0, &
748 call mpi_bcast(data%meta_nsamples, 1, mpi_integer, 0, &
750 if (this%counter .eq. 0) this%counter = data%meta_start_counter
754 write(id_str,
'(a,i5.5)')
'f', this%counter
755 path = trim(meta_fname(1:scan(meta_fname,
'/', .true. )))
756 fname = trim(path)//trim(data%fld_series_fname)//
'.'//id_str
757 if (this%counter .ge. data%meta_nsamples+data%meta_start_counter)
then
758 call neko_error(
'Trying to read more fld files than exist')
762 write(id_str,
'(a,i5.5)')
'f', this%counter
763 fname = trim(this%fname(1:suffix_pos-1))//
'.'//id_str
765 call mpi_file_open(
neko_comm, trim(fname), &
766 mpi_mode_rdonly, mpi_info_null, fh, ierr)
768 if (ierr .ne. 0)
call neko_error(
"Could not read "//trim(fname))
770 call mpi_file_read_all(fh, hdr, 132, mpi_character, status, ierr)
774 read(hdr, 1) temp_str, fld_data_size, lx, ly, lz, glb_nelv, glb_nelv, &
775 time, counter, i, j, (rdcode(i), i = 1, 10)
7761
format(4a, 1x, i1, 1x,
i2, 1x,
i2, 1x,
i2, 1x, i10, 1x, i10, &
777 1x, e20.13, 1x, i9, 1x, i6, 1x, i6, 1x, 10a)
778 if (data%nelv .eq. 0)
then
780 data%nelv = dist%num_local()
781 data%offset_el = dist%start_idx()
786 data%glb_nelv = glb_nelv
787 data%t_counter = counter
800 this%dp_precision = .true.
802 this%dp_precision = .false.
804 if (this%dp_precision)
then
805 allocate(
tmp_dp(data%gdim*n))
807 allocate(
tmp_sp(data%gdim*n))
813 read_velocity = .false.
814 read_pressure = .false.
816 if (rdcode(i) .eq.
'X')
then
823 if (rdcode(i) .eq.
'U')
then
824 read_velocity = .true.
830 if (rdcode(i) .eq.
'P')
then
831 read_pressure = .true.
835 if (rdcode(i) .eq.
'T')
then
841 if (rdcode(i) .eq.
'S')
then
843 read(rdcode(i),*) n_scalars
844 n_scalars = n_scalars*10
847 n_scalars = n_scalars+j
849 if (
allocated(data%s))
then
850 if (data%n_scalars .ne. n_scalars)
then
851 do j = 1, data%n_scalars
852 call data%s(j)%free()
855 data%n_scalars = n_scalars
856 allocate(data%s(n_scalars))
857 do j = 1, data%n_scalars
858 call data%s(j)%init(n)
862 data%n_scalars = n_scalars
863 allocate(data%s(data%n_scalars))
864 do j = 1, data%n_scalars
865 call data%s(j)%init(n)
872 call mpi_file_read_at_all(fh, mpi_offset, temp, 1, &
873 mpi_real, status, ierr)
874 if (temp .ne. test_pattern)
then
875 call neko_error(
'Incorrect format for fld file, &
876 &test pattern does not match.')
881 if (
allocated(data%idx))
then
882 if (
size(data%idx) .ne. data%nelv)
then
884 allocate(data%idx(data%nelv))
887 allocate(data%idx(data%nelv))
890 byte_offset = mpi_offset + &
893 call mpi_file_read_at_all(fh, byte_offset, data%idx, data%nelv, &
894 mpi_integer, status, ierr)
896 mpi_offset = mpi_offset + &
900 byte_offset = mpi_offset + int(data%offset_el,
i8) * &
901 (int(data%gdim*lxyz,
i8) * &
902 int(fld_data_size,
i8))
904 data%x, data%y, data%z, data)
905 mpi_offset = mpi_offset + int(data%glb_nelv,
i8) * &
906 (int(data%gdim *lxyz,
i8) * &
907 int(fld_data_size,
i8))
910 if (read_velocity)
then
911 byte_offset = mpi_offset + int(data%offset_el,
i8) * &
912 (int(data%gdim*lxyz,
i8) * &
913 int(fld_data_size,
i8))
915 data%u, data%v, data%w, data)
916 mpi_offset = mpi_offset + int(data%glb_nelv,
i8) * &
917 (int(data%gdim *lxyz,
i8) * &
918 int(fld_data_size,
i8))
921 if (read_pressure)
then
922 byte_offset = mpi_offset + int(data%offset_el,
i8) * &
924 int(fld_data_size,
i8))
926 mpi_offset = mpi_offset + int(data%glb_nelv,
i8) * &
928 int(fld_data_size,
i8))
932 byte_offset = mpi_offset + int(data%offset_el,
i8) * &
934 int(fld_data_size,
i8))
936 mpi_offset = mpi_offset + int(data%glb_nelv,
i8) * &
938 int(fld_data_size,
i8))
942 byte_offset = mpi_offset + int(data%offset_el,
i8) * &
944 int(fld_data_size,
i8))
946 mpi_offset = mpi_offset + int(data%glb_nelv,
i8) * &
948 int(fld_data_size,
i8))
951 this%counter = this%counter + 1
956 call neko_error(
'Currently we only read into fld_file_data_t, &
957 &please use that data structure instead.')