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=
dp) :: depth = 1.0_dp
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)
581 type(mpi_file),
intent(inout) :: fh
582 integer(kind=MPI_OFFSET_KIND),
intent(in) :: base_offset
583 integer,
intent(in) :: ncurves
584 type(
mesh_t),
intent(inout) :: msh
585 real(kind=
dp),
intent(in),
optional :: extrusion_depth
588 type(mpi_status) :: status
589 integer(kind=MPI_OFFSET_KIND) :: mpi_offset
590 integer :: nmsh_curve_size, nlocal, max_recv, n_recv
591 integer :: i, j, ierr, src, dst, step, el_idx, el_idx_glb
596 nlocal = dist%num_local()
598 allocate(curve_send(nlocal))
600 mpi_offset = base_offset + &
601 int(dist%start_idx(),
i8) * int(nmsh_curve_size,
i8)
602 call mpi_file_read_at_all(fh, mpi_offset, &
605 if (
present(extrusion_depth))
then
607 curve_send(i)%curve_data(:,5:8) = &
608 curve_send(i)%curve_data(:,1:4)
609 curve_send(i)%type(5:8) = curve_send(i)%type(1:4)
611 if (curve_send(i)%type(j) .eq. 4)
then
612 curve_send(i)%curve_data(3,j) = extrusion_depth
618 call mpi_allreduce(nlocal, max_recv, 1, mpi_integer, mpi_max, &
620 allocate(curve_recv(max_recv))
623 el_idx_glb = curve_send(i)%e
624 if (msh%htel%get(el_idx_glb, el_idx) .eq. 0)
then
625 call msh%mark_curve_element(el_idx, &
626 curve_send(i)%curve_data, curve_send(i)%type)
638 el_idx_glb = curve_recv(i)%e
639 if (msh%htel%get(el_idx_glb, el_idx) .eq. 0)
then
640 call msh%mark_curve_element(el_idx, &
641 curve_recv(i)%curve_data, curve_recv(i)%type)
646 deallocate(curve_send)
647 deallocate(curve_recv)
655 class(*),
target,
intent(in) :: data
656 real(kind=
rp),
intent(in),
optional :: t
661 type(
mesh_t),
pointer :: msh
662 type(mpi_status) :: status
664 integer (kind=MPI_OFFSET_KIND) :: mpi_offset, mpi_el_offset
665 integer :: i, j, ierr, k
666 integer :: nmsh_quad_size, nmsh_hex_size, nmsh_zone_size, nmsh_curve_size
667 integer :: nzones, nzones_glb, nzones_offset
668 integer :: ncurves, ncurves_glb, ncurves_offset
669 integer :: el_idx, el_idx_glb
671 integer(i4),
dimension(8),
parameter :: vcyc_to_sym = &
672 [1, 2, 4, 3, 5, 6, 8, 7]
686 call neko_log%message(
'Writing data as a binary Neko file ' // &
689 call mpi_file_open(
neko_comm, trim(this%get_fname()), &
690 mpi_mode_wronly + mpi_mode_create, mpi_info_null, fh, ierr)
692 call mpi_file_write_all(fh, msh%glb_nelv, 1, mpi_integer, status, ierr)
693 call mpi_file_write_all(fh, msh%gdim, 1, mpi_integer, status, ierr)
695 call msh%reset_periodic_ids()
697 if (msh%gdim .eq. 2)
then
698 allocate(nmsh_quad(msh%nelv))
700 ep => msh%elements(i)%e
701 nmsh_quad(i)%el_idx = ep%id()
703 nmsh_quad(i)%v(j)%v_idx = ep%pts(vcyc_to_sym(j))%p%id()
704 nmsh_quad(i)%v(j)%v_xyz = ep%pts(vcyc_to_sym(j))%p%x
708 int(msh%offset_el,
i8) * int(nmsh_quad_size,
i8)
709 call mpi_file_write_at_all(fh, mpi_offset, &
711 deallocate(nmsh_quad)
713 int(msh%glb_nelv,
i8) * int(nmsh_quad_size,
i8)
714 else if (msh%gdim .eq. 3)
then
715 allocate(nmsh_hex(msh%nelv))
717 ep => msh%elements(i)%e
718 nmsh_hex(i)%el_idx = ep%id()
720 nmsh_hex(i)%v(j)%v_idx = ep%pts(vcyc_to_sym(j))%p%id()
721 nmsh_hex(i)%v(j)%v_xyz = ep%pts(vcyc_to_sym(j))%p%x
725 int(msh%offset_el,
i8) * int(nmsh_hex_size,
i8)
726 call mpi_file_write_at_all(fh, mpi_offset, &
731 call mpi_file_write_at_all(fh, mpi_offset, &
738 int(msh%glb_nelv,
i8) * int(nmsh_hex_size,
i8)
743 nzones = msh%periodic%size
745 nzones = nzones + msh%labeled_zones(i)%size
748 call mpi_allreduce(nzones, nzones_glb, 1, &
752 call mpi_exscan(nzones, nzones_offset, 1, &
755 mpi_offset = mpi_el_offset
756 call mpi_file_write_at_all(fh, mpi_offset, &
757 nzones_glb, 1, mpi_integer, status, ierr)
759 if (nzones_glb .gt. 0)
then
760 allocate(nmsh_zone(nzones))
762 if (nzones .gt. 0)
then
763 nmsh_zone(:)%type = 0
766 do i = 1, msh%periodic%size
767 nmsh_zone(j)%e = msh%elements(msh%periodic%facet_el(i)%x(2))%e%id()
768 nmsh_zone(j)%f = msh%periodic%facet_el(i)%x(1)
769 nmsh_zone(j)%p_e = msh%periodic%p_facet_el(i)%x(2)
770 nmsh_zone(j)%p_f = msh%periodic%p_facet_el(i)%x(1)
771 nmsh_zone(j)%glb_pt_ids = msh%periodic%p_ids(i)%x
772 nmsh_zone(j)%type = 5
777 do i = 1, msh%labeled_zones(k)%size
779 msh%elements(msh%labeled_zones(k)%facet_el(i)%x(2))%e%id()
780 nmsh_zone(j)%f = msh%labeled_zones(k)%facet_el(i)%x(1)
782 nmsh_zone(j)%type = 7
789 int(nzones_offset,
i8) * int(nmsh_zone_size,
i8)
790 call mpi_file_write_at_all(fh, mpi_offset, &
793 deallocate(nmsh_zone)
796 ncurves = msh%curve%size
799 call mpi_allreduce(ncurves, ncurves_glb, 1, &
803 call mpi_exscan(ncurves, ncurves_offset, 1, &
807 int(nzones_glb,
i8)*int(nmsh_zone_size,
i8)
809 call mpi_file_write_at_all(fh, mpi_offset, &
810 ncurves_glb, 1, mpi_integer, status, ierr)
812 if (ncurves_glb .gt. 0)
then
814 allocate(nmsh_curve(ncurves))
817 nmsh_curve(i)%type = 0
821 nmsh_curve(i)%e = msh%elements(msh%curve%curve_el(i)%el_idx)%e%id()
822 nmsh_curve(i)%curve_data = msh%curve%curve_el(i)%curve_data
823 nmsh_curve(i)%type = msh%curve%curve_el(i)%curve_type
827 int(nzones_glb,
i8) * int(nmsh_zone_size,
i8) + &
828 int(ncurves_offset,
i8) * int(nmsh_curve_size,
i8)
830 call mpi_file_write_at_all(fh, mpi_offset, &
832 deallocate(nmsh_curve)
835 call mpi_file_sync(fh, ierr)
836 call mpi_file_close(fh, ierr)
843 do i = 1, msh%periodic%size
844 el_idx_glb = msh%elements(msh%periodic%facet_el(i)%x(2))%e%id()
845 if (msh%htel%get(el_idx_glb, el_idx) .eq. 0)
then
846 call msh%apply_periodic_facet(msh%periodic%facet_el(i)%x(1), el_idx, &
847 msh%periodic%p_facet_el(i)%x(1), &
848 msh%periodic%p_facet_el(i)%x(2), msh%periodic%p_ids(i)%x)