72 class(*),
target,
intent(inout) :: data
75 type(
mesh_t),
pointer :: msh
76 type(mpi_status) :: status
78 integer (kind=MPI_OFFSET_KIND) :: mpi_offset, mpi_el_offset
79 integer :: i, j, ierr, element_offset
80 integer :: nmsh_quad_size, nmsh_hex_size, nmsh_zone_size
81 integer :: nelv, gdim, nzones, ncurves
84 character(len=LOG_SIZE) :: log_buf
85 real(kind=
rp) :: t_start, t_end
87 call this%check_exists()
98 call neko_log%message(
'Reading a binary Neko file ' // this%get_fname())
104 call mpi_file_open(
neko_comm, trim(this%get_fname()), &
105 mpi_mode_rdonly, mpi_info_null, fh, ierr)
108 call neko_error(
'Could not open the mesh file ' // this%get_fname() // &
111 call mpi_file_read_all(fh, nelv, 1, mpi_integer, status, ierr)
112 call mpi_file_read_all(fh, gdim, 1, mpi_integer, status, ierr)
114 write(log_buf,1) gdim, nelv
1151
format(
'gdim = ', i1,
', nelements = ', i9)
118 if (gdim .eq. 2)
then
119 call mpi_file_close(fh, ierr)
124 nelv = dist%num_local()
125 element_offset = dist%start_idx()
127 call msh%init(gdim, nelv)
129 call neko_log%message(
'Reading elements')
131 if (msh%gdim .eq. 2)
then
132 allocate(nmsh_quad(msh%nelv))
134 int(element_offset,
i8) * int(nmsh_quad_size,
i8)
135 call mpi_file_read_at_all(fh, mpi_offset, &
139 call p(j)%init(nmsh_quad(i)%v(j)%v_xyz, nmsh_quad(i)%v(j)%v_idx)
142 call msh%add_element(i, nmsh_quad(i)%el_idx, &
143 p(1), p(2), p(4), p(3))
145 deallocate(nmsh_quad)
147 int(dist%num_global(),
i8) * int(nmsh_quad_size,
i8)
148 else if (msh%gdim .eq. 3)
then
149 allocate(nmsh_hex(msh%nelv))
151 int(element_offset,
i8) * int(nmsh_hex_size,
i8)
152 call mpi_file_read_at_all(fh, mpi_offset, &
156 call p(j)%init(nmsh_hex(i)%v(j)%v_xyz, nmsh_hex(i)%v(j)%v_idx)
159 call msh%add_element(i, nmsh_hex(i)%el_idx, &
160 p(1), p(2), p(4), p(3), p(5), p(6), p(8), p(7))
164 int(dist%num_global(),
i8) * int(nmsh_hex_size,
i8)
168 call neko_log%message(
'Reading BC/zone data')
170 mpi_offset = mpi_el_offset
171 call mpi_file_read_at_all(fh, mpi_offset, &
172 nzones, 1, mpi_integer, status, ierr)
173 if (nzones .gt. 0)
then
177 call neko_log%message(
'Reading deformation data')
180 int(nzones,
i8)*int(nmsh_zone_size,
i8)
181 call mpi_file_read_at_all(fh, mpi_offset, &
182 ncurves, 1, mpi_integer, status, ierr)
184 if (ncurves .gt. 0)
then
186 int(nzones,
i8)*int(nmsh_zone_size,
i8)
190 call mpi_file_close(fh, ierr)
191 call neko_log%message(
'Mesh read, setting up connectivity')
193 t_start = mpi_wtime()
197 write(log_buf,
'(A)')
'Done setting up mesh and connectivity'
199 write(log_buf,
'(A,F9.6)') &
200 'Mesh and connectivity setup (excluding read) time (s): ', &
212 type(
mesh_t),
pointer,
intent(inout) :: msh
215 type(mpi_status) :: status
217 integer (kind=MPI_OFFSET_KIND) :: mpi_offset, mpi_el_offset
218 integer :: i, j, ierr, element_offset, id
219 integer :: nmsh_quad_size, nmsh_hex_size, nmsh_zone_size
220 integer :: nelv, gdim, nzones, ncurves
224 character(len=LOG_SIZE) :: log_buf
225 real(kind=
rp) :: depth = 1d0
226 real(kind=
dp) :: coord(3)
234 call mpi_file_open(
neko_comm, trim(this%get_fname()), &
235 mpi_mode_rdonly, mpi_info_null, fh, ierr)
236 call mpi_file_read_all(fh, nelv, 1, mpi_integer, status, ierr)
237 call mpi_file_read_all(fh, gdim, 1, mpi_integer, status, ierr)
239 write(log_buf,2) gdim
2402
format(
'gdim = ', i1,
', no full 2d support, creating thin slab')
245 nelv = dist%num_local()
246 element_offset = dist%start_idx()
248 call msh%init(gdim, nelv)
250 allocate(nmsh_quad(msh%nelv))
252 int(element_offset,
i8) * int(nmsh_quad_size,
i8)
253 call mpi_file_read_at_all(fh, mpi_offset, &
257 coord = nmsh_quad(i)%v(j)%v_xyz
259 call p(j)%init(coord, nmsh_quad(i)%v(j)%v_idx)
262 coord = nmsh_quad(i)%v(j)%v_xyz
264 id = nmsh_quad(i)%v(j)%v_idx+msh%glb_nelv*8
265 call p(j+4)%init(coord, id)
268 call msh%add_element(i, nmsh_quad(i)%el_idx, &
269 p(1), p(2), p(4), p(3), p(5), p(6), p(8), p(7))
271 deallocate(nmsh_quad)
273 int(dist%num_global(),
i8) * int(nmsh_quad_size,
i8)
275 mpi_offset = mpi_el_offset
276 call mpi_file_read_at_all(fh, mpi_offset, &
277 nzones, 1, mpi_integer, status, ierr)
278 if (nzones .gt. 0)
then
284 call msh%elements(el_idx)%e%facet_order(glb_pt_ids,5)
285 call msh%mark_periodic_facet(6, el_idx, &
286 5, el_idx, glb_pt_ids%x)
287 call msh%elements(el_idx)%e%facet_order(glb_pt_ids,5)
288 call msh%mark_periodic_facet(5, el_idx, &
289 6, el_idx, glb_pt_ids%x)
292 call msh%elements(el_idx)%e%facet_order(glb_pt_ids,5)
293 call msh%apply_periodic_facet(6, el_idx, &
294 5, el_idx, glb_pt_ids%x)
295 call msh%elements(el_idx)%e%facet_order(glb_pt_ids,5)
296 call msh%apply_periodic_facet(5, el_idx, &
297 6, el_idx, glb_pt_ids%x)
301 mpi_offset = mpi_el_offset + &
303 call mpi_file_read_at_all(fh, mpi_offset, &
304 ncurves, 1, mpi_integer, status, ierr)
306 if (ncurves .gt. 0)
then
307 mpi_offset = mpi_el_offset + &
309 int(nzones,
i8)*int(nmsh_zone_size,
i8)
313 call mpi_file_close(fh, ierr)
327 type(mpi_file),
intent(inout) :: fh
328 integer(kind=MPI_OFFSET_KIND),
intent(in) :: base_offset
329 integer,
intent(in) :: nzones
330 type(
mesh_t),
intent(inout) :: msh
331 type(
nmsh_zone_t),
allocatable :: zone_send(:), zone_recv(:)
333 type(mpi_status) :: status
334 integer(kind=MPI_OFFSET_KIND) :: mpi_offset
335 integer :: nmsh_zone_size, nlocal, max_recv, n_recv
336 integer :: i, ierr, src, dst, step, el_idx, el_idx_glb
341 nlocal = dist%num_local()
343 allocate(zone_send(nlocal))
345 mpi_offset = base_offset + &
346 int(dist%start_idx(),
i8) * int(nmsh_zone_size,
i8)
347 call mpi_file_read_at_all(fh, mpi_offset, &
350 call mpi_allreduce(nlocal, max_recv, 1, mpi_integer, mpi_max, &
352 allocate(zone_recv(max_recv))
356 el_idx_glb = zone_send(i)%e
357 if (msh%htel%get(el_idx_glb, el_idx) .eq. 0)
then
358 select case (zone_send(i)%type)
360 call msh%mark_periodic_facet(zone_send(i)%f, el_idx, &
361 zone_send(i)%p_f, zone_send(i)%p_e, &
362 zone_send(i)%glb_pt_ids)
364 call msh%mark_labeled_facet(zone_send(i)%f, el_idx, &
374 call mpi_sendrecv(zone_send, nlocal,
mpi_nmsh_zone, dst, 0, &
379 el_idx_glb = zone_recv(i)%e
380 if (msh%htel%get(el_idx_glb, el_idx) .eq. 0)
then
381 select case (zone_recv(i)%type)
383 call msh%mark_periodic_facet(zone_recv(i)%f, el_idx, &
384 zone_recv(i)%p_f, zone_recv(i)%p_e, &
385 zone_recv(i)%glb_pt_ids)
387 call msh%mark_labeled_facet(zone_recv(i)%f, el_idx, &
396 el_idx_glb = zone_send(i)%e
397 if (msh%htel%get(el_idx_glb, el_idx) .eq. 0)
then
398 if (zone_send(i)%type .eq. 5)
then
399 call msh%apply_periodic_facet(zone_send(i)%f, el_idx, &
400 zone_send(i)%p_f, zone_send(i)%p_e, &
401 zone_send(i)%glb_pt_ids)
410 call mpi_sendrecv(zone_send, nlocal,
mpi_nmsh_zone, dst, 1, &
415 el_idx_glb = zone_recv(i)%e
416 if (msh%htel%get(el_idx_glb, el_idx) .eq. 0)
then
417 if (zone_recv(i)%type .eq. 5)
then
418 call msh%apply_periodic_facet(zone_recv(i)%f, el_idx, &
419 zone_recv(i)%p_f, zone_recv(i)%p_e, &
420 zone_recv(i)%glb_pt_ids)
426 deallocate(zone_send)
427 deallocate(zone_recv)
464 type(mpi_file),
intent(inout) :: fh
465 integer(kind=MPI_OFFSET_KIND),
intent(in) :: base_offset
466 integer,
intent(in) :: nzones
467 type(
mesh_t),
intent(inout) :: msh
468 type(
nmsh_zone_t),
allocatable :: zone_send(:), zone_recv(:)
470 type(mpi_status) :: status
471 integer(kind=MPI_OFFSET_KIND) :: mpi_offset
472 integer :: nmsh_zone_size, nlocal, max_recv, n_recv
473 integer :: i, ierr, src, dst, step, el_idx, el_idx_glb
479 nlocal = dist%num_local()
481 allocate(zone_send(nlocal))
483 mpi_offset = base_offset + &
484 int(dist%start_idx(),
i8) * int(nmsh_zone_size,
i8)
485 call mpi_file_read_at_all(fh, mpi_offset, &
488 call mpi_allreduce(nlocal, max_recv, 1, mpi_integer, mpi_max, &
490 allocate(zone_recv(max_recv))
496 el_idx_glb = zone_send(i)%e
497 if (msh%htel%get(el_idx_glb, el_idx) .eq. 0)
then
498 select case (zone_send(i)%type)
501 zone_send(i)%glb_pt_ids, msh%glb_nelv, ids)
502 call msh%mark_periodic_facet(zone_send(i)%f, el_idx, &
503 zone_send(i)%p_f, zone_send(i)%p_e, ids)
505 call msh%mark_labeled_facet(zone_send(i)%f, el_idx, &
515 call mpi_sendrecv(zone_send, nlocal,
mpi_nmsh_zone, dst, 0, &
520 el_idx_glb = zone_recv(i)%e
521 if (msh%htel%get(el_idx_glb, el_idx) .eq. 0)
then
522 select case (zone_recv(i)%type)
525 zone_recv(i)%glb_pt_ids, msh%glb_nelv, ids)
526 call msh%mark_periodic_facet(zone_recv(i)%f, el_idx, &
527 zone_recv(i)%p_f, zone_recv(i)%p_e, ids)
529 call msh%mark_labeled_facet(zone_recv(i)%f, el_idx, &
538 el_idx_glb = zone_send(i)%e
539 if (msh%htel%get(el_idx_glb, el_idx) .eq. 0)
then
540 if (zone_send(i)%type .eq. 5)
then
542 zone_send(i)%glb_pt_ids, msh%glb_nelv, ids)
543 call msh%apply_periodic_facet(zone_send(i)%f, el_idx, &
544 zone_send(i)%p_f, zone_send(i)%p_e, ids)
553 call mpi_sendrecv(zone_send, nlocal,
mpi_nmsh_zone, dst, 1, &
558 el_idx_glb = zone_recv(i)%e
559 if (msh%htel%get(el_idx_glb, el_idx) .eq. 0)
then
560 if (zone_recv(i)%type .eq. 5)
then
562 zone_recv(i)%glb_pt_ids, msh%glb_nelv, ids)
563 call msh%apply_periodic_facet(zone_recv(i)%f, el_idx, &
564 zone_recv(i)%p_f, zone_recv(i)%p_e, ids)
570 deallocate(zone_send)
571 deallocate(zone_recv)
578 type(mpi_file),
intent(inout) :: fh
579 integer(kind=MPI_OFFSET_KIND),
intent(in) :: base_offset
580 integer,
intent(in) :: ncurves
581 type(
mesh_t),
intent(inout) :: msh
584 type(mpi_status) :: status
585 integer(kind=MPI_OFFSET_KIND) :: mpi_offset
586 integer :: nmsh_curve_size, nlocal, max_recv, n_recv
587 integer :: i, ierr, src, dst, step, el_idx, el_idx_glb
592 nlocal = dist%num_local()
594 allocate(curve_send(nlocal))
596 mpi_offset = base_offset + &
597 int(dist%start_idx(),
i8) * int(nmsh_curve_size,
i8)
598 call mpi_file_read_at_all(fh, mpi_offset, &
601 call mpi_allreduce(nlocal, max_recv, 1, mpi_integer, mpi_max, &
603 allocate(curve_recv(max_recv))
606 el_idx_glb = curve_send(i)%e
607 if (msh%htel%get(el_idx_glb, el_idx) .eq. 0)
then
608 call msh%mark_curve_element(el_idx, &
609 curve_send(i)%curve_data, curve_send(i)%type)
621 el_idx_glb = curve_recv(i)%e
622 if (msh%htel%get(el_idx_glb, el_idx) .eq. 0)
then
623 call msh%mark_curve_element(el_idx, &
624 curve_recv(i)%curve_data, curve_recv(i)%type)
629 deallocate(curve_send)
630 deallocate(curve_recv)
638 class(*),
target,
intent(in) :: data
639 real(kind=
rp),
intent(in),
optional :: t
644 type(
mesh_t),
pointer :: msh
645 type(mpi_status) :: status
647 integer (kind=MPI_OFFSET_KIND) :: mpi_offset, mpi_el_offset
648 integer :: i, j, ierr, k
649 integer :: nmsh_quad_size, nmsh_hex_size, nmsh_zone_size, nmsh_curve_size
650 integer :: nzones, nzones_glb, nzones_offset
651 integer :: ncurves, ncurves_glb, ncurves_offset
652 integer :: el_idx, el_idx_glb
654 integer(i4),
dimension(8),
parameter :: vcyc_to_sym = &
655 [1, 2, 4, 3, 5, 6, 8, 7]
669 call neko_log%message(
'Writing data as a binary Neko file ' // &
672 call mpi_file_open(
neko_comm, trim(this%get_fname()), &
673 mpi_mode_wronly + mpi_mode_create, mpi_info_null, fh, ierr)
675 call mpi_file_write_all(fh, msh%glb_nelv, 1, mpi_integer, status, ierr)
676 call mpi_file_write_all(fh, msh%gdim, 1, mpi_integer, status, ierr)
678 call msh%reset_periodic_ids()
680 if (msh%gdim .eq. 2)
then
681 allocate(nmsh_quad(msh%nelv))
683 ep => msh%elements(i)%e
684 nmsh_quad(i)%el_idx = ep%id()
686 nmsh_quad(i)%v(j)%v_idx = ep%pts(vcyc_to_sym(j))%p%id()
687 nmsh_quad(i)%v(j)%v_xyz = ep%pts(vcyc_to_sym(j))%p%x
691 int(msh%offset_el,
i8) * int(nmsh_quad_size,
i8)
692 call mpi_file_write_at_all(fh, mpi_offset, &
694 deallocate(nmsh_quad)
696 int(msh%glb_nelv,
i8) * int(nmsh_quad_size,
i8)
697 else if (msh%gdim .eq. 3)
then
698 allocate(nmsh_hex(msh%nelv))
700 ep => msh%elements(i)%e
701 nmsh_hex(i)%el_idx = ep%id()
703 nmsh_hex(i)%v(j)%v_idx = ep%pts(vcyc_to_sym(j))%p%id()
704 nmsh_hex(i)%v(j)%v_xyz = ep%pts(vcyc_to_sym(j))%p%x
708 int(msh%offset_el,
i8) * int(nmsh_hex_size,
i8)
709 call mpi_file_write_at_all(fh, mpi_offset, &
714 call mpi_file_write_at_all(fh, mpi_offset, &
721 int(msh%glb_nelv,
i8) * int(nmsh_hex_size,
i8)
726 nzones = msh%periodic%size
728 nzones = nzones + msh%labeled_zones(i)%size
731 call mpi_allreduce(nzones, nzones_glb, 1, &
735 call mpi_exscan(nzones, nzones_offset, 1, &
738 mpi_offset = mpi_el_offset
739 call mpi_file_write_at_all(fh, mpi_offset, &
740 nzones_glb, 1, mpi_integer, status, ierr)
742 if (nzones_glb .gt. 0)
then
743 allocate(nmsh_zone(nzones))
745 if (nzones .gt. 0)
then
746 nmsh_zone(:)%type = 0
749 do i = 1, msh%periodic%size
750 nmsh_zone(j)%e = msh%elements(msh%periodic%facet_el(i)%x(2))%e%id()
751 nmsh_zone(j)%f = msh%periodic%facet_el(i)%x(1)
752 nmsh_zone(j)%p_e = msh%periodic%p_facet_el(i)%x(2)
753 nmsh_zone(j)%p_f = msh%periodic%p_facet_el(i)%x(1)
754 nmsh_zone(j)%glb_pt_ids = msh%periodic%p_ids(i)%x
755 nmsh_zone(j)%type = 5
760 do i = 1, msh%labeled_zones(k)%size
762 msh%elements(msh%labeled_zones(k)%facet_el(i)%x(2))%e%id()
763 nmsh_zone(j)%f = msh%labeled_zones(k)%facet_el(i)%x(1)
765 nmsh_zone(j)%type = 7
772 int(nzones_offset,
i8) * int(nmsh_zone_size,
i8)
773 call mpi_file_write_at_all(fh, mpi_offset, &
776 deallocate(nmsh_zone)
779 ncurves = msh%curve%size
782 call mpi_allreduce(ncurves, ncurves_glb, 1, &
786 call mpi_exscan(ncurves, ncurves_offset, 1, &
790 int(nzones_glb,
i8)*int(nmsh_zone_size,
i8)
792 call mpi_file_write_at_all(fh, mpi_offset, &
793 ncurves_glb, 1, mpi_integer, status, ierr)
795 if (ncurves_glb .gt. 0)
then
797 allocate(nmsh_curve(ncurves))
800 nmsh_curve(i)%type = 0
804 nmsh_curve(i)%e = msh%elements(msh%curve%curve_el(i)%el_idx)%e%id()
805 nmsh_curve(i)%curve_data = msh%curve%curve_el(i)%curve_data
806 nmsh_curve(i)%type = msh%curve%curve_el(i)%curve_type
810 int(nzones_glb,
i8) * int(nmsh_zone_size,
i8) + &
811 int(ncurves_offset,
i8) * int(nmsh_curve_size,
i8)
813 call mpi_file_write_at_all(fh, mpi_offset, &
815 deallocate(nmsh_curve)
818 call mpi_file_sync(fh, ierr)
819 call mpi_file_close(fh, ierr)
826 do i = 1, msh%periodic%size
827 el_idx_glb = msh%elements(msh%periodic%facet_el(i)%x(2))%e%id()
828 if (msh%htel%get(el_idx_glb, el_idx) .eq. 0)
then
829 call msh%apply_periodic_facet(msh%periodic%facet_el(i)%x(1), el_idx, &
830 msh%periodic%p_facet_el(i)%x(1), &
831 msh%periodic%p_facet_el(i)%x(2), msh%periodic%p_ids(i)%x)