18 use scale_prc,
only: &
40 real(rp),
allocatable :: send_buf(:,:)
41 real(rp),
allocatable :: recv_buf(:,:)
42 integer :: nnode_lcmeshface
47 integer :: s_tilelocalid
50 procedure,
public :: init => localmeshcommdata_init
51 procedure,
public :: final => localmeshcommdata_final
52 procedure,
public :: sendrecv => localmeshcommdata_sendrecv
53 procedure,
public :: pc_init_recv => localmeshcommdata_pc_init_recv
54 procedure,
public :: pc_init_send => localmeshcommdata_pc_init_send
60 integer :: hvfield_num
61 integer :: htensorfield_num
62 integer :: field_num_tot
63 integer :: nfaces_comm
65 integer :: bufsize_per_field
68 real(rp),
allocatable :: send_buf(:,:,:)
69 real(rp),
allocatable :: recv_buf(:,:,:)
70 integer,
allocatable :: request_send(:)
71 integer,
allocatable :: request_recv(:)
74 integer,
allocatable :: is_f(:,:)
75 integer,
allocatable :: nnode_lcmeshallface(:)
77 logical :: mpi_pc_flag
78 logical :: use_mpi_pc_fujitsu_ext
79 integer,
allocatable :: request_pc(:)
81 integer :: req_counter
82 logical :: call_wait_flag_sub_get
87 logical :: use_vmap_wide_flag
88 integer,
allocatable :: vmapb_size(:)
89 integer,
allocatable :: vmapb2(:)
92 procedure(meshfieldcommbase_get),
public,
deferred :: get
93 procedure(meshfieldcommbase_exchange),
public,
deferred :: exchange
94 procedure,
public :: prepare_pc => meshfieldcommbase_prepare_pc
120 integer,
intent(in) :: varid_s
123 subroutine meshfieldcommbase_get(this, field_list, varid_s)
128 integer,
intent(in) :: varid_s
129 end subroutine meshfieldcommbase_get
131 subroutine meshfieldcommbase_exchange(this, do_wait)
134 logical,
intent(in),
optional :: do_wait
135 end subroutine meshfieldcommbase_exchange
137 subroutine meshfieldcomm_final(this)
140 end subroutine meshfieldcomm_final
158 integer :: obj_ind = 0
159 integer,
parameter :: OBJ_INDEX_MAX = 8192
173 sfield_num, hvfield_num, htensorfield_num, bufsize_per_field, comm_face_num, &
174 Nnode_LCMeshFace, mesh )
179 class(
meshbase),
intent(in),
target :: mesh
180 integer,
intent(in) :: sfield_num
181 integer,
intent(in) :: hvfield_num
182 integer,
intent(in) :: htensorfield_num
183 integer,
intent(in) :: bufsize_per_field
184 integer,
intent(in) :: comm_face_num
185 integer,
intent(in) :: nnode_lcmeshface(comm_face_num,mesh%local_mesh_num)
193 this%sfield_num = sfield_num
194 this%hvfield_num = hvfield_num
195 this%htensorfield_num = htensorfield_num
196 this%field_num_tot = sfield_num + hvfield_num*2 + htensorfield_num*4
197 this%nfaces_comm = comm_face_num
201 if (this%field_num_tot > 0)
then
202 allocate( this%send_buf(bufsize_per_field, this%field_num_tot, mesh%LOCAL_MESH_NUM) )
203 allocate( this%recv_buf(bufsize_per_field, this%field_num_tot, mesh%LOCAL_MESH_NUM) )
204 allocate( this%request_send(comm_face_num*mesh%LOCAL_MESH_NUM) )
205 allocate( this%request_recv(comm_face_num*mesh%LOCAL_MESH_NUM) )
208 allocate( this%commdata_list(comm_face_num,mesh%LOCAL_MESH_NUM) )
209 allocate( this%is_f(comm_face_num,mesh%LOCAL_MESH_NUM) )
210 allocate( this%Nnode_LCMeshAllFace(mesh%LOCAL_MESH_NUM) )
213 do n=1, mesh%LOCAL_MESH_NUM
215 do f=2, this%nfaces_comm
216 this%is_f(f,n) = this%is_f(f-1,n) + nnode_lcmeshface(f-1,n)
218 this%Nnode_LCMeshAllFace(n) = sum(nnode_lcmeshface(:,n))
220 call mesh%GetLocalMesh(n, lcmesh)
221 do f=1, this%nfaces_comm
222 call this%commdata_list(f,n)%Init( this, lcmesh, f, nnode_lcmeshface(f,n) )
228 do n=1, mesh%LOCAL_MESH_NUM
229 do f=1, this%nfaces_comm
230 call localmeshcommdata_setupforgpu( this%commdata_list(f,n) )
236 this%MPI_pc_flag = .false.
238 obj_ind = obj_ind + 1
239 if ( obj_ind > obj_index_max )
then
240 log_error(
"MeshFieldCommBase_Init",*)
'obj_ind > OBJ_INDEX_MAX. Check!'
243 this%obj_ind = obj_ind
261 if (this%field_num_tot > 0)
then
263 deallocate( this%send_buf, this%recv_buf )
265 deallocate( this%request_send, this%request_recv )
267 do n=1, this%mesh%LOCAL_MESH_NUM
268 do f=1, this%nfaces_comm
269 call this%commdata_list(f,n)%Final()
273 deallocate( this%commdata_list, this%is_f, this%Nnode_LCMeshAllFace )
275 if ( this%MPI_pc_flag )
then
276 do ireq=1, this%req_counter
277 call mpi_request_free( this%request_pc(ireq), ierr )
279 deallocate( this%request_pc )
283 if (
allocated(this%VMapB_size) )
then
285 deallocate(this%VMapB_size)
287 if ( this%use_vmap_wide_flag )
then
289 deallocate( this%VMapB2 )
300 subroutine meshfieldcommbase_prepare_pc( this, &
301 use_mpi_pc_fujitsu_ext )
304 logical,
intent(in),
optional :: use_mpi_pc_fujitsu_ext
309 this%MPI_pc_flag = .true.
312 this%use_mpi_pc_fujitsu_ext = .true.
314 this%use_mpi_pc_fujitsu_ext = .false.
316 if (
present(use_mpi_pc_fujitsu_ext) )
then
317 this%use_mpi_pc_fujitsu_ext = use_mpi_pc_fujitsu_ext
319 if ( use_mpi_pc_fujitsu_ext )
then
320 log_error(
"MeshFieldCommBase_prepare_PC",*)
'use_mpi_pc_fujitsu_ext=.true., but Fujitsu MPI is unavailable. Check!'
326 if (this%field_num_tot > 0)
then
327 allocate( this%request_pc(2*this%nfaces_comm*this%mesh%LOCAL_MESH_NUM) )
331 do n=1, this%mesh%LOCAL_MESH_NUM
332 do f=1, this%nfaces_comm
333 call this%commdata_list(f,n)%PC_Init_recv( &
334 this%req_counter, this%request_pc(:), &
335 this%obj_ind, this%use_mpi_pc_fujitsu_ext )
338 do n=1, this%mesh%LOCAL_MESH_NUM
339 do f=1, this%nfaces_comm
340 call this%commdata_list(f,n)%PC_Init_send( &
341 this%req_counter, this%request_pc(:), &
342 this%obj_ind, this%use_mpi_pc_fujitsu_ext )
347 end subroutine meshfieldcommbase_prepare_pc
357 fjmpi_prequest_startall
365 type(
localmeshcommdata),
intent(inout),
target :: commdata_list(this%nfaces_comm, this%mesh%local_mesh_num)
366 logical,
intent(in),
optional :: do_wait
376 if (
present(do_wait) )
then
384 if ( this%MPI_pc_flag )
then
386 do n=1, this%mesh%LOCAL_MESH_NUM
387 do f=1, this%nfaces_comm
388 lcommdata => commdata_list(f,n)
389 if ( lcommdata%s_rank /= lcommdata%lcmesh%PRC_myrank )
then
399 if ( this%use_mpi_pc_fujitsu_ext )
then
402 call fjmpi_prequest_startall( this%req_counter, this%request_pc(1:this%req_counter), ierr )
405 call mpi_startall( this%req_counter, this%request_pc(1:this%req_counter), ierr )
410 do n=1, this%mesh%LOCAL_MESH_NUM
411 do f=1, this%nfaces_comm
412 lcommdata => commdata_list(f,n)
413 if ( lcommdata%s_rank == lcommdata%lcmesh%PRC_myrank )
then
415 call set_recvbuf_from_sendbuf_lc( commdata_list(abs(lcommdata%s_faceID), lcommdata%s_tilelocalID)%recv_buf, &
416 lcommdata%send_buf,
size(lcommdata%send_buf) )
418 commdata_list(abs(lcommdata%s_faceID), lcommdata%s_tilelocalID)%recv_buf(:,:) &
419 = lcommdata%send_buf(:,:)
428 do n=1, this%mesh%LOCAL_MESH_NUM
429 do f=1, this%nfaces_comm
430 call commdata_list(f,n)%SendRecv( &
431 this%req_counter, this%request_send, this%request_recv, &
442 this%call_wait_flag_sub_get = .false.
444 this%call_wait_flag_sub_get = .true.
455 field_list, dim, varid_s, lcmesh_list )
463 type(
localmeshcommdata),
intent(inout),
target :: commdata_list(this%nfaces_comm, this%mesh%local_mesh_num)
465 integer,
intent(in),
optional :: dim
466 integer,
intent(in),
optional :: varid_s
467 class(
localmeshbase),
intent(in),
optional,
target :: lcmesh_list(:)
470 integer :: stat_send(mpi_status_size, this%req_counter)
471 integer :: stat_recv(mpi_status_size, this%req_counter)
472 integer :: stat_pc(mpi_status_size, this%req_counter)
476 integer :: irs(this%nfaces_comm,this%mesh%local_mesh_num), ire(this%nfaces_comm,this%mesh%local_mesh_num)
479 integer :: val_size(this%mesh%local_mesh_num)
483 if ( this%MPI_pc_flag )
then
484 if (this%req_counter > 0)
then
485 call mpi_waitall( this%req_counter, this%request_pc(1:this%req_counter), stat_pc, ierr )
488 if ( this%req_counter > 0 )
then
489 call mpi_waitall( this%req_counter, this%request_recv(1:this%req_counter), stat_recv, ierr )
490 call mpi_waitall( this%req_counter, this%request_send(1:this%req_counter), stat_send, ierr )
495 do n=1, this%mesh%LOCAL_MESH_NUM
496 do f=1, this%nfaces_comm
497 if ( commdata_list(f,n)%s_rank /= commdata_list(f,n)%lcmesh%PRC_myrank )
then
510 if (
present(field_list) )
then
511 do n=1, this%mesh%LOCAL_MESH_NUM
512 lcmesh => lcmesh_list(n)
513 val_size(n) = lcmesh%refElem%Np * lcmesh%NeA
514 irs(1,n) = lcmesh%refElem%Np * lcmesh%Ne + 1
515 do f=1, this%nfaces_comm
516 ire(f,n) = irs(f,n) + commdata_list(f,n)%Nnode_LCMeshFace - 1
517 if (f<this%nfaces_comm) irs(f+1,n) = ire(f,n) + 1
523 do n=1, this%mesh%LOCAL_MESH_NUM
524 do i=1,
size(field_list)
525 do f=1, this%nfaces_comm
526 var_id = varid_s + i - 1
529 call set_bounddata( field_list(var_id)%field1d%local(n)%val, val_size(n), irs(f,n), ire(f,n), commdata_list(f,n)%recv_buf(:,var_id) )
530 else if (dim==2)
then
531 call set_bounddata( field_list(var_id)%field2d%local(n)%val, val_size(n), irs(f,n), ire(f,n), commdata_list(f,n)%recv_buf(:,var_id) )
532 else if (dim==3)
then
533 call set_bounddata( field_list(var_id)%field3d%local(n)%val, val_size(n), irs(f,n), ire(f,n), commdata_list(f,n)%recv_buf(:,var_id) )
539 do n=1, this%mesh%LOCAL_MESH_NUM
540 do i=1,
size(field_list)
541 do f=1, this%nfaces_comm
542 var_id = varid_s + i - 1
545 else if (dim==2)
then
547 else if (dim==3)
then
557 do n=1, this%mesh%LOCAL_MESH_NUM
559 do f=1, this%nfaces_comm
560 ire(f,n) = irs(f,n) + commdata_list(f,n)%Nnode_LCMeshFace - 1
561 if (f<this%nfaces_comm) irs(f+1,n) = ire(f,n) + 1
567 do n=1, this%mesh%LOCAL_MESH_NUM
568 do var_id=1, this%field_num_tot
569 do f=1, this%nfaces_comm
571 call set_bounddata( this%recv_buf(:,var_id,n),
size(this%recv_buf(:,var_id,n)), irs(f,n), ire(f,n), commdata_list(f,n)%recv_buf(:,var_id) )
573 this%recv_buf(irs(f,n):ire(f,n),var_id,n) = commdata_list(f,n)%recv_buf(:,var_id)
587 integer,
intent(in) :: IA
588 real(RP),
intent(inout) :: var(IA)
589 integer,
intent(in) :: irs_, ire_
590 real(RP),
intent(in) :: recv_buf(ire_-irs_+1)
597 do ii=1,
size(recv_buf)
598 var(irs_+ii-1) = recv_buf(ii)
611 real(rp),
intent(in) :: var(refelem%np * mesh%nea)
612 real(rp),
intent(out) :: buf(size(mesh%vmapb))
620 buf(i) = var(mesh%VmapB(i))
629 integer,
intent(in) :: vmapb_size
630 integer,
intent(in) :: npxnea
631 real(rp),
intent(in) :: var(npxnea)
632 integer,
intent(in) :: vmapb(vmapb_size)
633 real(rp),
intent(out) :: buf(vmapb_size)
641 buf(i) = var(vmapb(i))
655 integer,
intent(in) :: varid_s
656 integer,
intent(in) :: dim
658 integer,
intent(in) :: vmapb_size
659 real(rp),
intent(out) :: buf(vmapb_size,size(field_list),size(lcmesh_list))
668 field_num =
size(field_list)
670 do n=1,
size(lcmesh_list)
671 lcmesh => lcmesh_list(n)
673 do while( i <= field_num )
674 varid = varid_s + i - 1
675 if ( i+1 <= field_num )
then
677 call extract_bounddata_var2( buf(:,varid,n), buf(:,varid+1,n), field_list(varid)%field1d%local(n)%val, field_list(varid+1)%field1d%local(n)%val, lcmesh, lcmesh%refElem )
679 call extract_bounddata_var2( buf(:,varid,n), buf(:,varid+1,n), field_list(varid)%field2d%local(n)%val, field_list(varid+1)%field2d%local(n)%val, lcmesh, lcmesh%refElem )
681 call extract_bounddata_var2( buf(:,varid,n), buf(:,varid+1,n), field_list(varid)%field3d%local(n)%val, field_list(varid+1)%field3d%local(n)%val, lcmesh, lcmesh%refElem )
702 subroutine extract_bounddata_var2( buf1_, buf2_, var1, var2, lmesh, elem )
706 real(rp),
intent(out) :: buf1_(size(lmesh%vmapb))
707 real(rp),
intent(out) :: buf2_(size(lmesh%vmapb))
708 real(rp),
intent(inout) :: var1(elem%np*lmesh%nea)
709 real(rp),
intent(inout) :: var2(elem%np*lmesh%nea)
722 end subroutine extract_bounddata_var2
730 integer,
intent(in) :: varid_s
731 integer,
intent(in) :: dim
733 integer,
intent(in) :: vmapb2_size
734 integer,
intent(in) :: vmapb2(vmapb2_size)
735 real(rp),
intent(out) :: buf(vmapb2_size,size(field_list),size(lcmesh_list))
744 field_num =
size(field_list)
746 do n=1,
size(lcmesh_list)
747 lcmesh => lcmesh_list(n)
749 do while( i <= field_num )
750 varid = varid_s + i - 1
751 if ( i+1 <= field_num )
then
753 call extract_bounddata_var2( buf(:,varid,n), buf(:,varid+1,n), &
754 vmapb2, vmapb2_size, field_list(varid)%field1d%local(n)%val, field_list(varid+1)%field1d%local(n)%val, lcmesh%refElem%Np * lcmesh%NeA )
756 call extract_bounddata_var2( buf(:,varid,n), buf(:,varid+1,n), &
757 vmapb2, vmapb2_size, field_list(varid)%field2d%local(n)%val, field_list(varid+1)%field2d%local(n)%val, lcmesh%refElem%Np * lcmesh%NeA )
759 call extract_bounddata_var2( buf(:,varid,n), buf(:,varid+1,n), &
760 vmapb2, vmapb2_size, field_list(varid)%field3d%local(n)%val, field_list(varid+1)%field3d%local(n)%val, lcmesh%refElem%Np * lcmesh%NeA )
781 subroutine extract_bounddata_var2( buf1_, buf2_, VMapB, VMapB_size, var1, var2, varSize )
783 integer,
intent(in) :: vmapb_size
784 real(rp),
intent(out) :: buf1_(vmapb_size)
785 real(rp),
intent(out) :: buf2_(vmapb_size)
786 integer,
intent(in) :: vmapb(vmapb_size)
787 integer,
intent(in) :: varsize
788 real(rp),
intent(inout) :: var1(varsize)
789 real(rp),
intent(inout) :: var2(varsize)
796 buf1_(ii) = var1(vmapb(ii))
797 buf2_(ii) = var2(vmapb(ii))
800 end subroutine extract_bounddata_var2
809 real(rp),
intent(in) :: buf(size(mesh%vmapb))
810 real(rp),
intent(inout) :: var(refelem%np * mesh%nea)
816 iis = refelem%Np*mesh%NeE
819 var(iis+ii) = buf(ii)
822 var(refelem%Np*mesh%NeE+1:refelem%Np*mesh%NeE+
size(buf)) = buf(:)
833 integer,
intent(in) :: vmapb_size
834 integer,
intent(in) :: vmapb(vmapb_size)
835 real(rp),
intent(in) :: buf(vmapb_size)
836 real(rp),
intent(inout) :: var(refelem%np * mesh%nea)
839 var(refelem%Np*mesh%NeE+1:refelem%Np*mesh%NeE+
size(buf)) = buf(:)
846 subroutine localmeshcommdata_init( this, comm, lcmesh, faceID, Nnode_LCMeshFace )
852 integer,
intent(in) :: faceid
853 integer,
intent(in) :: nnode_lcmeshface
856 this%lcmesh => lcmesh
857 this%Nnode_LCMeshFace = nnode_lcmeshface
860 this%s_tileID = comm%mesh%tileID_globalMap(faceid, lcmesh%tileID)
861 this%s_faceID = comm%mesh%tileFaceID_globalMap(faceid, lcmesh%tileID)
862 this%s_panelID = comm%mesh%tilePanelID_globalMap(faceid, lcmesh%tileID)
863 this%s_rank = comm%mesh%PRCrank_globalMap(this%s_tileID)
864 this%s_tilelocalID = comm%mesh%tileID_global2localMap(this%s_tileID)
867 allocate( this%send_buf(nnode_lcmeshface, comm%field_num_tot))
868 allocate( this%recv_buf(nnode_lcmeshface, comm%field_num_tot))
870 end subroutine localmeshcommdata_init
872 subroutine localmeshcommdata_setupforgpu( this )
879 end subroutine localmeshcommdata_setupforgpu
882 subroutine localmeshcommdata_sendrecv( this, &
883 req_counter, req_send, req_recv, &
886 use scale_prc,
only: &
894 integer,
intent(inout) :: req_counter
895 integer,
intent(inout) :: req_send(:)
896 integer,
intent(inout) :: req_recv(:)
904 if ( this%s_rank /= this%lcmesh%PRC_myrank )
then
909 req_counter = req_counter + 1
911 tag = 10 * this%lcmesh%tileID + this%faceID
912 bufsize =
size(this%recv_buf)
913 call mpi_irecv( this%recv_buf(1,1), bufsize, mpi_double_precision, &
914 this%s_rank, tag, prc_local_comm_world, &
915 req_recv(req_counter), ierr)
917 bufsize =
size(this%send_buf)
918 tag = 10 * this%s_tileID + abs(this%s_faceID)
919 call mpi_isend( this%send_buf(1,1), bufsize, mpi_double_precision, &
920 this%s_rank, tag, prc_local_comm_world, &
921 req_send(req_counter), ierr )
923 else if ( this%s_rank == this%lcmesh%PRC_myrank )
then
925 call set_recvbuf_from_sendbuf_lc( lccommdat_list(abs(this%s_faceID), this%s_tilelocalID)%recv_buf, &
926 this%send_buf,
size(this%send_buf) )
928 lccommdat_list(abs(this%s_faceID), this%s_tilelocalID)%recv_buf(:,:) &
934 end subroutine localmeshcommdata_sendrecv
936 subroutine set_recvbuf_from_sendbuf_lc( recv_buf, send_buf, buf_size )
938 integer,
intent(in) :: buf_size
939 real(rp),
intent(out) :: recv_buf(buf_size)
940 real(rp),
intent(in) :: send_buf(buf_size)
946 recv_buf(i) = send_buf(i)
949 end subroutine set_recvbuf_from_sendbuf_lc
953 subroutine localmeshcommdata_pc_init_send( this, &
954 req_counter, req, obj_ind_ , &
955 use_mpi_pc_fujisu_ext )
957 use scale_prc,
only: &
964 fjmpi_prequest_send_init
969 integer,
intent(inout) :: req_counter
970 integer,
intent(inout) :: req(:)
971 integer,
intent(in) :: obj_ind_
972 logical,
intent(in) :: use_mpi_pc_fujisu_ext
979 if ( this%s_rank /= this%lcmesh%PRC_myrank )
then
980 req_counter = req_counter + 1
982 bufsize =
size(this%send_buf)
986 if ( use_mpi_pc_fujisu_ext )
then
988 call fjmpi_prequest_send_init( this%send_buf(1,1), bufsize, mpi_double_precision, &
989 this%s_rank, tag, prc_local_comm_world, &
990 req(req_counter), ierr )
993 call mpi_send_init( this%send_buf(1,1), bufsize, mpi_double_precision, &
994 this%s_rank, tag, prc_local_comm_world, &
995 req(req_counter), ierr )
1000 end subroutine localmeshcommdata_pc_init_send
1002 subroutine localmeshcommdata_pc_init_recv( this, &
1003 req_counter, req, obj_ind_, &
1004 use_mpi_pc_fujisu_ext )
1006 use scale_prc,
only: &
1007 prc_local_comm_world
1009 mpi_double_precision
1012 use mpi_ext,
only: &
1013 fjmpi_prequest_recv_init
1018 integer,
intent(inout) :: req_counter
1019 integer,
intent(inout) :: req(:)
1020 integer,
intent(in) :: obj_ind_
1021 logical,
intent(in) :: use_mpi_pc_fujisu_ext
1028 if ( this%s_rank /= this%lcmesh%PRC_myrank )
then
1029 req_counter = req_counter + 1
1031 bufsize =
size(this%recv_buf)
1035 if ( use_mpi_pc_fujisu_ext )
then
1037 call fjmpi_prequest_recv_init( this%recv_buf(1,1), bufsize, mpi_double_precision, &
1038 this%s_rank, tag, prc_local_comm_world, &
1039 req(req_counter), ierr )
1042 call mpi_recv_init( this%recv_buf(1,1), bufsize, mpi_double_precision, &
1043 this%s_rank, tag, prc_local_comm_world, &
1044 req(req_counter), ierr )
1049 end subroutine localmeshcommdata_pc_init_recv
1052 subroutine localmeshcommdata_final( this )
1059 deallocate( this%send_buf )
1060 deallocate( this%recv_buf )
1062 end subroutine localmeshcommdata_final
module FElib / Element / Base
module FElib / Mesh / Local, Base
module FElib / Mesh / Base
module FElib / Data / base
module FElib / Data / Communication base
subroutine, public meshfieldcommbase_extract_bounddata(var, refelem, mesh, buf)
Extract halo data from data array with MeshField object and set it to the receiving buffer.
subroutine, public meshfieldcommbase_extract_bounddata_3(field_list, dim, varid_s, lcmesh_list, vmapb2, vmapb2_size, buf)
Extract halo data from data array with MeshField object and set it to the recieving buffer.
subroutine, public meshfieldcommbase_final(this)
Finalize a base object to manage data communication of fields.
subroutine, public meshfieldcommbase_wait_core(this, commdata_list, field_list, dim, varid_s, lcmesh_list)
Wait data communication and move tmp data of LocalMeshCommData object to a recv buffer.
subroutine, public meshfieldcommbase_set_bounddata(buf, refelem, mesh, var)
Extract halo data from the receiving buffer and set it to data array with MeshField object.
subroutine, public meshfieldcommbase_set_bounddata_3(buf, refelem, mesh, vmapb, vmapb_size, var)
Extract halo data from the recieving buffer and set it to data array with MeshField object.
subroutine, public meshfieldcommbase_init(this, sfield_num, hvfield_num, htensorfield_num, bufsize_per_field, comm_face_num, nnode_lcmeshface, mesh)
Initialize a base object to manage data communication of fields.
subroutine, public meshfieldcommbase_extract_bounddata_2(field_list, dim, varid_s, lcmesh_list, vmapb_size, buf)
Extract halo data from data array with MeshField object and set it to the receiving buffer.
subroutine, public meshfieldcommbase_extract_bounddata2(var, vmapb, vmapb_size, npxnea, buf)
Extract halo data from data array with MeshField object and set it to the receiving buffer.
subroutine, public meshfieldcommbase_exchange_core(this, commdata_list, do_wait)
Exchange halo data.
subroutine set_bounddata(var, ia, irs_, ire_, recv_buf)
Derived type representing an arbitrary finite element.
Derived type to manage a local computational domain (base type)
Base type to manage a computational mesh.
Derived type representing a field with 1D mesh.
Derived type representing a field with 2D mesh.
Derived type representing a field with 3D mesh.
Derived type representing a field (base type)
Derived type to manage data communication at a face between adjacent local meshes.
Base derived type to manage data communication.
Container to save a pointer of MeshField(1D, 2D, 3D) object.