76 class(*),
target,
intent(inout) :: data
77 type(
mesh_t),
pointer :: msh
79 character(len=5) :: hdr_ver
80 character(len=54) :: hdr_str
81 character(len=80) :: hdr_full
82 integer :: nel, ndim, nelv, ierr, nBCre2
83 type(mpi_status) :: status
85 integer (kind=MPI_OFFSET_KIND) :: mpi_offset
88 integer :: ncurv, nbcs
92 character(len=1024) :: fname, map_fname
94 integer :: re2_data_xy_size
95 integer :: re2_data_xyz_size
96 integer :: re2_data_cv_size
97 integer :: re2_data_bc_size
99 character(len=LOG_SIZE) :: log_buf
101 call this%check_exists()
111 fname = trim(this%get_fname())
112 open(newunit=file_unit,
file=trim(fname), status=
'old', iostat=ierr)
113 call neko_log%message(
'Reading binary NEKTON file ' // fname)
115 read(file_unit,
'(a80)') hdr_full
116 read(hdr_full,
'(a5)') hdr_ver
118 if (hdr_ver .eq.
'#v004')
then
119 read(hdr_full,
'(a5,i16,i3,i16,i4,a36)') hdr_ver, nel, ndim, nelv, nbcre2, hdr_str
121 else if (hdr_ver .eq.
'#v002' .or. hdr_ver .eq.
'#v003')
then
122 read(hdr_full,
'(a5,i9,i3,i9,a54)') hdr_ver, nel, ndim, nelv, hdr_str
124 else if (hdr_ver .eq.
'#v001')
then
125 read(hdr_full,
'(a5,i9,i3,i9,a54)') hdr_ver, nel, ndim, nelv, hdr_str
140 write(log_buf,1) ndim, nelv
1411
format(
'gdim = ', i1,
', nelements =', i7)
147 inquire(
file=map_fname, exist=read_map)
149 call nm%init(nelv, 2**ndim)
153 call neko_log%warning(
'No NEKTON map file found')
156 call mpi_file_open(
neko_comm, trim(fname), &
157 mpi_mode_rdonly, mpi_info_null, fh, ierr)
159 if (ierr .ne. 0)
then
160 call neko_log%error(
"Can't open binary NEKTON file ")
165 call msh%init(ndim, dist)
170 call mpi_file_read_at_all(fh, mpi_offset, test, 1, mpi_real, status, ierr)
174 call neko_error(
'Invalid endian of re2 file, byte swap not implemented yet')
178 mpi_offset, re2_data_xy_size, re2_data_xyz_size, v2_format)
183 if (ndim .eq. 2)
then
184 mpi_offset = mpi_offset + int(dist%num_global(),
i8) * int(re2_data_xy_size,
i8)
186 mpi_offset = mpi_offset + int(dist%num_global(),
i8) * int(re2_data_xyz_size,
i8)
192 call mpi_file_read_at_all(fh, mpi_offset, t2, 1, mpi_double_precision, status, ierr)
196 mpi_offset = mpi_offset + int(ncurv,
i8) * int(re2_data_cv_size,
i8)
197 call mpi_file_read_at_all(fh, mpi_offset, t2, 1, mpi_double_precision, status, ierr)
203 call mpi_file_read_at_all(fh, mpi_offset, ncurv, 1, mpi_integer, status, ierr)
206 mpi_offset = mpi_offset + int(ncurv,
i8) * int(re2_data_cv_size,
i8)
207 call mpi_file_read_at_all(fh, mpi_offset, nbcs, 1, mpi_integer, status, ierr)
214 call mpi_file_close(fh, ierr)
225 class(*),
target,
intent(in) :: data
226 real(kind=
rp),
intent(in),
optional :: t
227 type(
re2v1_xy_t),
allocatable :: re2_data_xy(:)
229 type(
mesh_t),
pointer :: msh
230 character(len=5),
parameter :: RE2_HDR_VER =
'#v001'
231 character(len=54),
parameter :: RE2_HDR_STR =
'RE2 exported by NEKO'
232 integer :: i, j, ierr, nelgv
233 type(mpi_status) :: status
235 integer (kind=MPI_OFFSET_KIND) :: mpi_offset
236 integer :: element_offset
237 integer :: re2_data_xy_size
238 integer :: re2_data_xyz_size
249 call mpi_reduce(msh%nelv, nelgv, 1, &
250 mpi_integer, mpi_sum, 0,
neko_comm, ierr)
252 call mpi_exscan(msh%nelv, element_offset, 1, &
255 call neko_log%message(
'Writing data as a binary NEKTON file ' // &
259 open(unit=9,
file=trim(this%get_fname()), status=
'new', iostat=ierr)
260 write(9,
'(a5,i9,i3,i9,a54)') re2_hdr_ver, nelgv, msh%gdim,&
266 call mpi_file_open(
neko_comm, trim(this%get_fname()), &
267 mpi_mode_wronly + mpi_mode_create, mpi_info_null, fh, ierr)
271 mpi_real, status, ierr)
274 if (msh%gdim .eq. 2)
then
275 allocate(re2_data_xy(msh%nelv))
277 re2_data_xy(i)%rgroup = 1.0
279 re2_data_xy(i)%x(j) =
real(msh%elements(i)%e%pts(j)%p%x(1))
280 re2_data_xy(i)%y(j) =
real(msh%elements(i)%e%pts(j)%p%x(2))
283 mpi_offset = mpi_offset + element_offset * re2_data_xy_size
284 call mpi_file_write_at(fh, mpi_offset, &
287 deallocate(re2_data_xy)
289 else if (msh%gdim .eq. 3)
then
290 allocate(re2_data_xyz(msh%nelv))
292 re2_data_xyz(i)%rgroup = 1.0
294 re2_data_xyz(i)%x(j) =
real(msh%elements(i)%e%pts(j)%p%x(1))
295 re2_data_xyz(i)%y(j) =
real(msh%elements(i)%e%pts(j)%p%x(2))
296 re2_data_xyz(i)%z(j) =
real(msh%elements(i)%e%pts(j)%p%x(3))
299 mpi_offset = mpi_offset + element_offset * re2_data_xyz_size
300 call mpi_file_write_at(fh, mpi_offset, &
303 deallocate(re2_data_xyz)
308 call mpi_file_close(fh, ierr)
316 mpi_offset, re2_data_xy_size, re2_data_xyz_size, v2_format)
317 type(
mesh_t),
intent(inout) :: msh
318 integer (kind=MPI_OFFSET_KIND) :: mpi_offset
319 integer,
intent(inout) :: ndim
320 integer,
intent(inout) :: nel
321 type(mpi_file),
intent(inout) :: fh
322 integer,
intent(in) :: re2_data_xy_size
323 integer,
intent(in) :: re2_data_xyz_size
324 logical,
intent(in) :: v2_format
326 integer :: element_offset
327 type(
re2v1_xy_t),
allocatable :: re2v1_data_xy(:)
328 type(
re2v1_xyz_t),
allocatable :: re2v1_data_xyz(:)
329 type(
re2v2_xy_t),
allocatable :: re2v2_data_xy(:)
330 type(
re2v2_xyz_t),
allocatable :: re2v2_data_xyz(:)
331 type(mpi_status) :: status
334 integer :: pt_idx, nelv
335 integer :: i, j, ierr
337 nelv = dist%num_local()
338 element_offset = dist%start_idx()
340 call htp%init(2*nel, ndim)
342 if (ndim .eq. 2)
then
343 mpi_offset = mpi_offset + element_offset * re2_data_xy_size
344 if (.not. v2_format)
then
345 allocate(re2v1_data_xy(nelv))
346 call mpi_file_read_at_all(fh, mpi_offset, &
350 call p(j)%init(
real(re2v1_data_xy(i)%x(j),
dp), &
351 real(re2v1_data_xy(i)%y(j),dp), 0.0d0)
355 if(mod(i,nelv/10) .eq. 0)
write(*,*) i,
'elements read'
358 call msh%add_element(i, i, p(1), p(2), p(4), p(3))
360 deallocate(re2v1_data_xy)
362 allocate(re2v2_data_xy(nelv))
363 call mpi_file_read_at_all(fh, mpi_offset, &
367 call p(j)%init(re2v2_data_xy(i)%x(j), &
368 re2v2_data_xy(i)%y(j), 0.0d0)
372 if(mod(i,nelv/10) .eq. 0)
write(*,*) i,
'elements read'
375 call msh%add_element(i, i, p(1), p(2), p(4), p(3))
377 deallocate(re2v2_data_xy)
379 else if (ndim .eq. 3)
then
380 mpi_offset = mpi_offset + element_offset * re2_data_xyz_size
381 if (.not. v2_format)
then
382 allocate(re2v1_data_xyz(nelv))
383 call mpi_file_read_at_all(fh, mpi_offset, &
387 call p(j)%init(
real(re2v1_data_xyz(i)%x(j),dp), &
388 real(re2v1_data_xyz(i)%y(j),dp),&
389 real(re2v1_data_xyz(i)%z(j),dp))
393 if(mod(i,nelv/100) .eq. 0)
write(*,*) i,
'elements read'
396 call msh%add_element(i, i, &
397 p(1), p(2), p(4), p(3), p(5), p(6), p(8), p(7))
399 deallocate(re2v1_data_xyz)
401 allocate(re2v2_data_xyz(nelv))
402 call mpi_file_read_at_all(fh, mpi_offset, &
406 call p(j)%init(re2v2_data_xyz(i)%x(j), &
407 re2v2_data_xyz(i)%y(j),&
408 re2v2_data_xyz(i)%z(j))
412 if(mod(i,nelv/100) .eq. 0)
write(*,*) i,
'elements read'
415 call msh%add_element(i, i, &
416 p(1), p(2), p(4), p(3), p(5), p(6), p(8), p(7))
418 deallocate(re2v2_data_xyz)
426 type(
mesh_t),
intent(inout) :: msh
427 integer (kind=MPI_OFFSET_KIND) :: mpi_offset
428 integer,
intent(inout) :: ncurve
430 type(mpi_file),
intent(inout) :: fh
431 logical,
intent(in) :: v2_format
432 type(mpi_status) :: status
433 integer :: i, j, l, ierr, el_idx, id
436 real(kind=
dp),
allocatable :: curve_data(:,:,:)
437 integer,
allocatable :: curve_type(:,:)
438 logical,
allocatable :: curve_element(:)
439 character(len=1) :: chtemp
440 logical :: curve_skip = .false.
442 allocate(curve_data(5,12,msh%nelv))
443 allocate(curve_element(msh%nelv))
444 allocate(curve_type(12,msh%nelv))
446 curve_element(i) = .false.
450 curve_data(l,j,i) = 0d0
455 call neko_log%message(
'Reading curved data')
456 if (.not. v2_format)
then
457 allocate(re2v1_data_curve(ncurve))
458 call mpi_file_read_at_all(fh, mpi_offset, re2v1_data_curve, ncurve, &
461 allocate(re2v2_data_curve(ncurve))
462 call mpi_file_read_at_all(fh, mpi_offset, re2v2_data_curve, ncurve, &
468 el_idx = re2v2_data_curve(i)%elem - dist%start_idx()
469 id = re2v2_data_curve(i)%zone
470 chtemp = re2v2_data_curve(i)%type
472 curve_data(j,id, el_idx) = re2v2_data_curve(i)%point(j)
475 el_idx = re2v1_data_curve(i)%elem - dist%start_idx()
476 id = re2v1_data_curve(i)%zone
477 chtemp = re2v1_data_curve(i)%type
479 curve_data(j,id, el_idx) =
real(re2v1_data_curve(i)%point(j),
dp)
483 curve_element(el_idx) = .true.
485 select case(trim(chtemp))
487 curve_type(id,el_idx) = 1
488 call neko_log%warning(
'curve type s not supported, treating mesh as non-curved')
492 curve_type(id,el_idx) = 2
493 call neko_log%warning(
'curve type e not supported, treating mesh as non-curved')
497 curve_type(id,el_idx) = 3
499 curve_type(id,el_idx) = 4
501 write(*,*) chtemp,
'curve type not supported yet, treating mesh as non-curved',id, el_idx
508 deallocate(re2v2_data_curve)
510 deallocate(re2v1_data_curve)
512 if (.not. curve_skip)
then
513 do el_idx = 1, msh%nelv
514 if (curve_element(el_idx))
then
515 call msh%mark_curve_element(el_idx, &
516 curve_data(1,1,el_idx), curve_type(1,el_idx))
521 deallocate(curve_data)
522 deallocate(curve_element)
523 deallocate(curve_type)
528 type(
mesh_t),
intent(inout) :: msh
529 integer (kind=MPI_OFFSET_KIND) :: mpi_offset
530 integer,
intent(inout) :: nbcs
532 type(mpi_file),
intent(inout) :: fh
533 logical,
intent(in) :: v2_format
534 type(mpi_status) :: status
536 integer :: sym_facet, label
537 integer :: p_el_idx, p_facet
538 integer :: i, j, ierr, el_idx
539 integer,
parameter,
dimension(6) :: facet_map = (/3, 2, 4, 1, 5, 6/)
541 type(
re2v1_bc_t),
allocatable :: re2v1_data_bc(:)
542 type(
re2v2_bc_t),
allocatable :: re2v2_data_bc(:)
543 character(len=LOG_SIZE) :: log_buf
546 integer :: user_labeled_zones(NEKO_MSH_MAX_ZLBLS)
547 integer :: labeled_zone_offsets(NEKO_MSH_MAX_ZLBLS)
548 integer :: total_labeled_zone_offset, current_internal_zone
549 total_labeled_zone_offset = 0
550 labeled_zone_offsets = 0
551 user_labeled_zones = 0
552 current_internal_zone = 1
555 call neko_log%message(
"Reading boundary conditions")
556 if (.not. v2_format)
then
557 allocate(re2v1_data_bc(nbcs))
558 call mpi_file_read_at_all(fh, mpi_offset, re2v1_data_bc, nbcs, &
561 allocate(re2v2_data_bc(nbcs))
562 call mpi_file_read_at_all(fh, mpi_offset, re2v2_data_bc, nbcs, &
576 el_idx = int(re2v2_data_bc(i)%elem) - dist%start_idx()
577 sym_facet = facet_map(int(re2v2_data_bc(i)%face))
579 select case(trim(re2v2_data_bc(i)%type))
580 case (
'MSH',
'msh',
'EXO',
'exo')
582 label = int(re2v2_data_bc(i)%bc_data(5))
584 if (label .lt. 1 .or. label .gt. neko_msh_max_zlbls)
then
585 call neko_error(
'Invalid label id (valid range [1,...,20])')
588 if (user_labeled_zones(label) .eq. 0)
then
589 write (log_buf,
"(A,I2,A)")
"Labeled zone ", label, &
592 user_labeled_zones(label) = 1
595 call msh%mark_labeled_facet(sym_facet, el_idx, label)
599 total_labeled_zone_offset =
max(total_labeled_zone_offset, label)
606 el_idx = int(re2v2_data_bc(i)%elem) - dist%start_idx()
607 sym_facet = facet_map(int(re2v2_data_bc(i)%face))
608 select case(trim(re2v2_data_bc(i)%type))
609 case (
'MSH',
'msh',
'EXO',
'exo')
614 current_internal_zone = current_internal_zone + 1
618 re2v2_data_bc(i)%type, &
627 current_internal_zone = current_internal_zone + 1
631 re2v2_data_bc(i)%type, &
639 current_internal_zone = current_internal_zone + 1
643 re2v2_data_bc(i)%type, &
651 current_internal_zone = current_internal_zone + 1
655 re2v2_data_bc(i)%type, &
663 current_internal_zone = current_internal_zone + 1
667 re2v2_data_bc(i)%type, &
672 case (
's',
'sl',
'sh',
'shl',
'S',
'SL',
'SH',
'SHL')
675 current_internal_zone = current_internal_zone + 1
679 re2v2_data_bc(i)%type, &
686 p_el_idx = int(re2v2_data_bc(i)%bc_data(1))
687 p_facet = facet_map(int(re2v2_data_bc(i)%bc_data(2)))
688 call msh%get_facet_ids(sym_facet, el_idx, pids)
689 call msh%mark_periodic_facet(sym_facet, el_idx, &
690 p_facet, p_el_idx, pids)
692 write (*,*) trim(re2v2_data_bc(i)%type),
'bc type not supported yet'
693 write (*,*) re2v2_data_bc(i)%bc_data
703 el_idx = re2v2_data_bc(i)%elem - dist%start_idx()
704 sym_facet = facet_map(int(re2v2_data_bc(i)%face))
705 select case(trim(re2v2_data_bc(i)%type))
707 p_el_idx = int(re2v2_data_bc(i)%bc_data(1))
708 p_facet = facet_map(int(re2v2_data_bc(i)%bc_data(2)))
709 call msh%create_periodic_ids(sym_facet, el_idx, &
715 deallocate(re2v2_data_bc)
724 el_idx = re2v1_data_bc(i)%elem - dist%start_idx()
725 sym_facet = facet_map(re2v1_data_bc(i)%face)
727 select case(trim(re2v1_data_bc(i)%type))
728 case (
'MSH',
'msh',
'EXO',
'exo')
730 label = int(re2v1_data_bc(i)%bc_data(5))
732 if (label .lt. 1 .or. label .gt. neko_msh_max_zlbls)
then
733 call neko_error(
'Invalid label id (valid range [1,...,20])')
736 if (user_labeled_zones(label) .eq. 0)
then
737 write (log_buf,
"(A,I2,A,I3)")
"Labeled zone ", label, &
740 user_labeled_zones(label) = 1
745 total_labeled_zone_offset =
max(total_labeled_zone_offset, label)
747 call msh%mark_labeled_facet(sym_facet, el_idx, label)
754 el_idx = re2v1_data_bc(i)%elem - dist%start_idx()
755 sym_facet = facet_map(re2v1_data_bc(i)%face)
756 select case(trim(re2v1_data_bc(i)%type))
757 case (
'MSH',
'msh',
'EXO',
'exo')
762 current_internal_zone = current_internal_zone + 1
766 re2v1_data_bc(i)%type, &
775 current_internal_zone = current_internal_zone + 1
779 re2v1_data_bc(i)%type, &
787 current_internal_zone = current_internal_zone + 1
791 re2v1_data_bc(i)%type, &
799 current_internal_zone = current_internal_zone + 1
803 re2v1_data_bc(i)%type, &
811 current_internal_zone = current_internal_zone + 1
815 re2v1_data_bc(i)%type, &
820 case (
's',
'sl',
'sh',
'shl',
'S',
'SL',
'SH',
'SHL')
823 current_internal_zone = current_internal_zone + 1
827 re2v1_data_bc(i)%type, &
834 p_el_idx = int(re2v1_data_bc(i)%bc_data(1))
835 p_facet = facet_map(int(re2v1_data_bc(i)%bc_data(2)))
836 call msh%get_facet_ids(sym_facet, el_idx, pids)
837 call msh%mark_periodic_facet(sym_facet, el_idx, &
838 p_facet, p_el_idx, pids)
840 write (*,*) re2v1_data_bc(i)%type,
'bc type not supported yet'
841 write (*,*) re2v1_data_bc(i)%bc_data
851 el_idx = re2v1_data_bc(i)%elem - dist%start_idx()
852 sym_facet = facet_map(re2v1_data_bc(i)%face)
853 select case(trim(re2v1_data_bc(i)%type))
855 p_el_idx = int(re2v1_data_bc(i)%bc_data(1))
856 p_facet = facet_map(int(re2v1_data_bc(i)%bc_data(2)))
857 call msh%create_periodic_ids(sym_facet, el_idx, &
864 deallocate(re2v1_data_bc)