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)
154 call mpi_file_open(
neko_comm, trim(fname), &
155 mpi_mode_rdonly, mpi_info_null, fh, ierr)
157 if (ierr .ne. 0)
then
158 call neko_error(
"Can't open binary NEKTON file ")
163 call msh%init(ndim, dist)
168 call mpi_file_read_at_all(fh, mpi_offset, test, 1, mpi_real, status, ierr)
172 call neko_error(
'Invalid endian of re2 file, byte swap not implemented yet')
176 mpi_offset, re2_data_xy_size, re2_data_xyz_size, v2_format)
181 if (ndim .eq. 2)
then
182 mpi_offset = mpi_offset + int(dist%num_global(),
i8) * int(re2_data_xy_size,
i8)
184 mpi_offset = mpi_offset + int(dist%num_global(),
i8) * int(re2_data_xyz_size,
i8)
190 call mpi_file_read_at_all(fh, mpi_offset, t2, 1, mpi_double_precision, status, ierr)
194 mpi_offset = mpi_offset + int(ncurv,
i8) * int(re2_data_cv_size,
i8)
195 call mpi_file_read_at_all(fh, mpi_offset, t2, 1, mpi_double_precision, status, ierr)
201 call mpi_file_read_at_all(fh, mpi_offset, ncurv, 1, mpi_integer, status, ierr)
204 mpi_offset = mpi_offset + int(ncurv,
i8) * int(re2_data_cv_size,
i8)
205 call mpi_file_read_at_all(fh, mpi_offset, nbcs, 1, mpi_integer, status, ierr)
212 call mpi_file_close(fh, ierr)
223 class(*),
target,
intent(in) :: data
224 real(kind=
dp),
intent(in),
optional :: t
225 type(
re2v1_xy_t),
allocatable :: re2_data_xy(:)
227 type(
mesh_t),
pointer :: msh
228 character(len=5),
parameter :: RE2_HDR_VER =
'#v001'
229 character(len=54),
parameter :: RE2_HDR_STR =
'RE2 exported by NEKO'
230 integer :: i, j, ierr, nelgv
232 type(mpi_status) :: status
234 integer (kind=MPI_OFFSET_KIND) :: mpi_offset
235 integer :: element_offset
236 integer :: re2_data_xy_size
237 integer :: re2_data_xyz_size
248 call mpi_reduce(msh%nelv, nelgv, 1, &
249 mpi_integer, mpi_sum, 0,
neko_comm, ierr)
251 call mpi_exscan(msh%nelv, element_offset, 1, &
254 call neko_log%message(
'Writing data as a binary NEKTON file ' // &
258 open(newunit = file_unit,
file = trim(this%get_fname()), &
259 status =
'new', iostat = ierr)
260 if (ierr .ne. 0)
then
261 call neko_error(
"Cannot create new file " // trim(this%get_fname()))
263 write(file_unit,
'(a5,i9,i3,i9,a54)') re2_hdr_ver, nelgv, msh%gdim,&
269 call mpi_file_open(
neko_comm, trim(this%get_fname()), &
270 mpi_mode_wronly + mpi_mode_create, mpi_info_null, fh, ierr)
274 mpi_real, status, ierr)
277 if (msh%gdim .eq. 2)
then
278 allocate(re2_data_xy(msh%nelv))
280 re2_data_xy(i)%rgroup = 1.0
282 re2_data_xy(i)%x(j) =
real(msh%elements(i)%e%pts(j)%p%x(1))
283 re2_data_xy(i)%y(j) =
real(msh%elements(i)%e%pts(j)%p%x(2))
286 mpi_offset = mpi_offset + element_offset * re2_data_xy_size
287 call mpi_file_write_at(fh, mpi_offset, &
290 deallocate(re2_data_xy)
292 else if (msh%gdim .eq. 3)
then
293 allocate(re2_data_xyz(msh%nelv))
295 re2_data_xyz(i)%rgroup = 1.0
297 re2_data_xyz(i)%x(j) =
real(msh%elements(i)%e%pts(j)%p%x(1))
298 re2_data_xyz(i)%y(j) =
real(msh%elements(i)%e%pts(j)%p%x(2))
299 re2_data_xyz(i)%z(j) =
real(msh%elements(i)%e%pts(j)%p%x(3))
302 mpi_offset = mpi_offset + element_offset * re2_data_xyz_size
303 call mpi_file_write_at(fh, mpi_offset, &
306 deallocate(re2_data_xyz)
311 call mpi_file_close(fh, ierr)
319 mpi_offset, re2_data_xy_size, re2_data_xyz_size, v2_format)
320 type(
mesh_t),
intent(inout) :: msh
321 integer (kind=MPI_OFFSET_KIND) :: mpi_offset
322 integer,
intent(inout) :: ndim
323 integer,
intent(inout) :: nel
324 type(mpi_file),
intent(inout) :: fh
325 integer,
intent(in) :: re2_data_xy_size
326 integer,
intent(in) :: re2_data_xyz_size
327 logical,
intent(in) :: v2_format
329 integer :: element_offset
330 type(
re2v1_xy_t),
allocatable :: re2v1_data_xy(:)
331 type(
re2v1_xyz_t),
allocatable :: re2v1_data_xyz(:)
332 type(
re2v2_xy_t),
allocatable :: re2v2_data_xy(:)
333 type(
re2v2_xyz_t),
allocatable :: re2v2_data_xyz(:)
334 type(mpi_status) :: status
337 integer :: pt_idx, nelv
338 integer :: i, j, ierr
340 nelv = dist%num_local()
341 element_offset = dist%start_idx()
343 call htp%init(2*nel, ndim)
345 if (ndim .eq. 2)
then
346 mpi_offset = mpi_offset + element_offset * re2_data_xy_size
347 if (.not. v2_format)
then
348 allocate(re2v1_data_xy(nelv))
349 call mpi_file_read_at_all(fh, mpi_offset, &
353 call p(j)%init(
real(re2v1_data_xy(i)%x(j),
dp), &
354 real(re2v1_data_xy(i)%y(j),dp), 0.0d0)
358 if(mod(i,nelv/10) .eq. 0)
write(*,*) i,
'elements read'
361 call msh%add_element(i, i, p(1), p(2), p(4), p(3))
363 deallocate(re2v1_data_xy)
365 allocate(re2v2_data_xy(nelv))
366 call mpi_file_read_at_all(fh, mpi_offset, &
370 call p(j)%init(re2v2_data_xy(i)%x(j), &
371 re2v2_data_xy(i)%y(j), 0.0d0)
375 if(mod(i,nelv/10) .eq. 0)
write(*,*) i,
'elements read'
378 call msh%add_element(i, i, p(1), p(2), p(4), p(3))
380 deallocate(re2v2_data_xy)
382 else if (ndim .eq. 3)
then
383 mpi_offset = mpi_offset + element_offset * re2_data_xyz_size
384 if (.not. v2_format)
then
385 allocate(re2v1_data_xyz(nelv))
386 call mpi_file_read_at_all(fh, mpi_offset, &
390 call p(j)%init(
real(re2v1_data_xyz(i)%x(j),dp), &
391 real(re2v1_data_xyz(i)%y(j),dp),&
392 real(re2v1_data_xyz(i)%z(j),dp))
396 if(mod(i,nelv/100) .eq. 0)
write(*,*) i,
'elements read'
399 call msh%add_element(i, i, &
400 p(1), p(2), p(4), p(3), p(5), p(6), p(8), p(7))
402 deallocate(re2v1_data_xyz)
404 allocate(re2v2_data_xyz(nelv))
405 call mpi_file_read_at_all(fh, mpi_offset, &
409 call p(j)%init(re2v2_data_xyz(i)%x(j), &
410 re2v2_data_xyz(i)%y(j),&
411 re2v2_data_xyz(i)%z(j))
415 if(mod(i,nelv/100) .eq. 0)
write(*,*) i,
'elements read'
418 call msh%add_element(i, i, &
419 p(1), p(2), p(4), p(3), p(5), p(6), p(8), p(7))
421 deallocate(re2v2_data_xyz)
429 type(
mesh_t),
intent(inout) :: msh
430 integer (kind=MPI_OFFSET_KIND) :: mpi_offset
431 integer,
intent(inout) :: ncurve
433 type(mpi_file),
intent(inout) :: fh
434 logical,
intent(in) :: v2_format
435 type(mpi_status) :: status
436 integer :: i, j, l, ierr, el_idx, id
439 real(kind=
dp),
allocatable :: curve_data(:,:,:)
440 integer,
allocatable :: curve_type(:,:)
441 logical,
allocatable :: curve_element(:)
442 character(len=1) :: chtemp
443 logical :: curve_skip = .false.
445 allocate(curve_data(5,12,msh%nelv))
446 allocate(curve_element(msh%nelv))
447 allocate(curve_type(12,msh%nelv))
449 curve_element(i) = .false.
453 curve_data(l,j,i) = 0d0
458 call neko_log%message(
'Reading curved data')
459 if (.not. v2_format)
then
460 allocate(re2v1_data_curve(ncurve))
461 call mpi_file_read_at_all(fh, mpi_offset, re2v1_data_curve, ncurve, &
464 allocate(re2v2_data_curve(ncurve))
465 call mpi_file_read_at_all(fh, mpi_offset, re2v2_data_curve, ncurve, &
471 el_idx = re2v2_data_curve(i)%elem - dist%start_idx()
472 id = re2v2_data_curve(i)%zone
473 chtemp = re2v2_data_curve(i)%type
475 curve_data(j,id, el_idx) = re2v2_data_curve(i)%point(j)
478 el_idx = re2v1_data_curve(i)%elem - dist%start_idx()
479 id = re2v1_data_curve(i)%zone
480 chtemp = re2v1_data_curve(i)%type
482 curve_data(j,id, el_idx) =
real(re2v1_data_curve(i)%point(j),
dp)
486 curve_element(el_idx) = .true.
488 select case(trim(chtemp))
490 curve_type(id,el_idx) = 1
491 call neko_log%warning(
'curve type s not supported, treating mesh as non-curved')
495 curve_type(id,el_idx) = 2
496 call neko_log%warning(
'curve type e not supported, treating mesh as non-curved')
500 curve_type(id,el_idx) = 3
502 curve_type(id,el_idx) = 4
504 write(*,*) chtemp,
'curve type not supported yet, treating mesh as non-curved',id, el_idx
511 deallocate(re2v2_data_curve)
513 deallocate(re2v1_data_curve)
515 if (.not. curve_skip)
then
516 do el_idx = 1, msh%nelv
517 if (curve_element(el_idx))
then
518 call msh%mark_curve_element(el_idx, &
519 curve_data(1,1,el_idx), curve_type(1,el_idx))
524 deallocate(curve_data)
525 deallocate(curve_element)
526 deallocate(curve_type)
531 type(
mesh_t),
intent(inout) :: msh
532 integer (kind=MPI_OFFSET_KIND) :: mpi_offset
533 integer,
intent(inout) :: nbcs
535 type(mpi_file),
intent(inout) :: fh
536 logical,
intent(in) :: v2_format
537 type(mpi_status) :: status
539 integer :: sym_facet, label
540 integer :: p_el_idx, p_facet
541 integer :: i, j, ierr, el_idx
542 integer,
parameter,
dimension(6) :: facet_map = (/3, 2, 4, 1, 5, 6/)
544 type(
re2v1_bc_t),
allocatable :: re2v1_data_bc(:)
545 type(
re2v2_bc_t),
allocatable :: re2v2_data_bc(:)
546 character(len=LOG_SIZE) :: log_buf
549 integer :: user_labeled_zones(NEKO_MSH_MAX_ZLBLS)
550 integer :: labeled_zone_offsets(NEKO_MSH_MAX_ZLBLS)
551 integer :: total_labeled_zone_offset, current_internal_zone
552 total_labeled_zone_offset = 0
553 labeled_zone_offsets = 0
554 user_labeled_zones = 0
555 current_internal_zone = 1
558 call neko_log%message(
"Reading boundary conditions")
559 if (.not. v2_format)
then
560 allocate(re2v1_data_bc(nbcs))
561 call mpi_file_read_at_all(fh, mpi_offset, re2v1_data_bc, nbcs, &
564 allocate(re2v2_data_bc(nbcs))
565 call mpi_file_read_at_all(fh, mpi_offset, re2v2_data_bc, nbcs, &
579 el_idx = int(re2v2_data_bc(i)%elem) - dist%start_idx()
580 sym_facet = facet_map(int(re2v2_data_bc(i)%face))
582 select case(trim(re2v2_data_bc(i)%type))
583 case (
'MSH',
'msh',
'EXO',
'exo')
585 label = int(re2v2_data_bc(i)%bc_data(5))
587 if (label .lt. 1 .or. label .gt. neko_msh_max_zlbls)
then
588 call neko_error(
'Invalid label id (valid range [1,...,20])')
591 if (user_labeled_zones(label) .eq. 0)
then
592 write (log_buf,
"(A,I2,A)")
"Labeled zone ", label, &
595 user_labeled_zones(label) = 1
598 call msh%mark_labeled_facet(sym_facet, el_idx, label)
602 total_labeled_zone_offset =
max(total_labeled_zone_offset, label)
609 el_idx = int(re2v2_data_bc(i)%elem) - dist%start_idx()
610 sym_facet = facet_map(int(re2v2_data_bc(i)%face))
611 select case(trim(re2v2_data_bc(i)%type))
612 case (
'MSH',
'msh',
'EXO',
'exo')
617 current_internal_zone = current_internal_zone + 1
621 re2v2_data_bc(i)%type, &
630 current_internal_zone = current_internal_zone + 1
634 re2v2_data_bc(i)%type, &
642 current_internal_zone = current_internal_zone + 1
646 re2v2_data_bc(i)%type, &
654 current_internal_zone = current_internal_zone + 1
658 re2v2_data_bc(i)%type, &
666 current_internal_zone = current_internal_zone + 1
670 re2v2_data_bc(i)%type, &
675 case (
's',
'sl',
'sh',
'shl',
'S',
'SL',
'SH',
'SHL')
678 current_internal_zone = current_internal_zone + 1
682 re2v2_data_bc(i)%type, &
689 p_el_idx = int(re2v2_data_bc(i)%bc_data(1))
690 p_facet = facet_map(int(re2v2_data_bc(i)%bc_data(2)))
691 call msh%get_facet_ids(sym_facet, el_idx, pids)
692 call msh%mark_periodic_facet(sym_facet, el_idx, &
693 p_facet, p_el_idx, pids)
695 write (*,*) trim(re2v2_data_bc(i)%type),
'bc type not supported yet'
696 write (*,*) re2v2_data_bc(i)%bc_data
706 el_idx = re2v2_data_bc(i)%elem - dist%start_idx()
707 sym_facet = facet_map(int(re2v2_data_bc(i)%face))
708 select case(trim(re2v2_data_bc(i)%type))
710 p_el_idx = int(re2v2_data_bc(i)%bc_data(1))
711 p_facet = facet_map(int(re2v2_data_bc(i)%bc_data(2)))
712 call msh%create_periodic_ids(sym_facet, el_idx, &
718 deallocate(re2v2_data_bc)
727 el_idx = re2v1_data_bc(i)%elem - dist%start_idx()
728 sym_facet = facet_map(re2v1_data_bc(i)%face)
730 select case(trim(re2v1_data_bc(i)%type))
731 case (
'MSH',
'msh',
'EXO',
'exo')
733 label = int(re2v1_data_bc(i)%bc_data(5))
735 if (label .lt. 1 .or. label .gt. neko_msh_max_zlbls)
then
736 call neko_error(
'Invalid label id (valid range [1,...,20])')
739 if (user_labeled_zones(label) .eq. 0)
then
740 write (log_buf,
"(A,I2,A,I3)")
"Labeled zone ", label, &
743 user_labeled_zones(label) = 1
748 total_labeled_zone_offset =
max(total_labeled_zone_offset, label)
750 call msh%mark_labeled_facet(sym_facet, el_idx, label)
757 el_idx = re2v1_data_bc(i)%elem - dist%start_idx()
758 sym_facet = facet_map(re2v1_data_bc(i)%face)
759 select case(trim(re2v1_data_bc(i)%type))
760 case (
'MSH',
'msh',
'EXO',
'exo')
765 current_internal_zone = current_internal_zone + 1
769 re2v1_data_bc(i)%type, &
778 current_internal_zone = current_internal_zone + 1
782 re2v1_data_bc(i)%type, &
790 current_internal_zone = current_internal_zone + 1
794 re2v1_data_bc(i)%type, &
802 current_internal_zone = current_internal_zone + 1
806 re2v1_data_bc(i)%type, &
814 current_internal_zone = current_internal_zone + 1
818 re2v1_data_bc(i)%type, &
823 case (
's',
'sl',
'sh',
'shl',
'S',
'SL',
'SH',
'SHL')
826 current_internal_zone = current_internal_zone + 1
830 re2v1_data_bc(i)%type, &
837 p_el_idx = int(re2v1_data_bc(i)%bc_data(1))
838 p_facet = facet_map(int(re2v1_data_bc(i)%bc_data(2)))
839 call msh%get_facet_ids(sym_facet, el_idx, pids)
840 call msh%mark_periodic_facet(sym_facet, el_idx, &
841 p_facet, p_el_idx, pids)
843 write (*,*) re2v1_data_bc(i)%type,
'bc type not supported yet'
844 write (*,*) re2v1_data_bc(i)%bc_data
854 el_idx = re2v1_data_bc(i)%elem - dist%start_idx()
855 sym_facet = facet_map(re2v1_data_bc(i)%face)
856 select case(trim(re2v1_data_bc(i)%type))
858 p_el_idx = int(re2v1_data_bc(i)%bc_data(1))
859 p_facet = facet_map(int(re2v1_data_bc(i)%bc_data(2)))
860 call msh%create_periodic_ids(sym_facet, el_idx, &
867 deallocate(re2v1_data_bc)