19 INTEGER,
POINTER,
DIMENSION(:,:) :: send_list
20 INTEGER,
POINTER,
DIMENSION(:) :: npoin_all
24 INTEGER,
POINTER,
DIMENSION(:,:) :: send_map
30 INTEGER,
POINTER,
DIMENSION(:,:,:) :: recv_map
33 INTEGER,
POINTER,
DIMENSION(:) :: poin2send
35 INTEGER,
POINTER,
DIMENSION(:) :: poin2recv
40 INTEGER,
POINTER,
DIMENSION(:) :: send_npoin
42 INTEGER,
POINTER,
DIMENSION(:) :: send_knolg
49 INTEGER :: np_send_noloc
51 INTEGER :: np_recv_noloc
54 DOUBLE PRECISION,
POINTER,
DIMENSION(:,:) :: send_buf
56 DOUBLE PRECISION,
POINTER,
DIMENSION(:,:) :: recv_buf
58 INTEGER,
POINTER,
DIMENSION(:) :: reqlist
63 DOUBLE PRECISION,
POINTER,
DIMENSION(:,:) :: weights
75 INTEGER,
PARAMETER ::
maxvar = 10
77 INTEGER,
PARAMETER ::
maxnpp = 20
102 INTEGER :: ICOUPLE, IERR
111 CALL check_allocate(ierr,
'CPLD')
115 ALLOCATE(
cpld(icouple)%SEND_NPOIN(max(ncsize,1)),stat=ierr)
116 CALL check_allocate(ierr,
'SEND_NPOIN')
146 INTEGER ,
INTENT(IN) :: CID
147 type(bief_mesh),
INTENT(IN) :: mesh_send
151 INTEGER :: NPOIN, IERR , IPOIN, IPROC, ITAG, IREQ
152 INTEGER ,
DIMENSION(1) :: SEND_BUF
153 INTEGER ,
DIMENSION(:),
ALLOCATABLE :: RECV_BUF
157 ALLOCATE(
cpld(cid)%REQLIST(max(ncsize,1)-1),stat=ierr)
158 CALL check_allocate(ierr,
'REQLIST')
160 ALLOCATE (recv_buf(max(ncsize,1)),stat=ierr)
161 CALL check_allocate(ierr,
'RECV_BUF')
165 npoin = mesh_send%NPOIN
170 #if defined (HAVE_MPI) 171 IF (ncsize.GT.1)
THEN 172 CALL mpi_allgather(send_buf, 1,
mpi_integer, recv_buf, 1,
175 recv_buf(1) = send_buf(1)
178 recv_buf(1) = send_buf(1)
182 WRITE (
lu,*)
'ALL TO ALL PROBLEM IN ADD_SENDER' 187 IF (ncsize.GT.1)
THEN 191 cpld(cid)%SEND_NPOIN(1:max(ncsize,1)) = recv_buf(1:max(ncsize,1))
192 DEALLOCATE (recv_buf)
193 cpld(cid)%MAXPOIN = maxval(
cpld(cid)%SEND_NPOIN(1:max(ncsize,1)))
197 ALLOCATE(
cpld(cid)%SEND_KNOLG(npoin),stat=ierr)
198 CALL check_allocate(ierr,
'SEND_KNOLG')
199 IF (ncsize.GT.1)
THEN 201 cpld(cid)%SEND_KNOLG(ipoin)=mesh_send%KNOLG%I(ipoin)
206 cpld(cid)%SEND_KNOLG(ipoin)= ipoin
213 DO iproc = 0,max(ncsize,1)-1
214 IF (iproc.EQ.ipid)
THEN 217 itag = ipid+iproc*ncsize
220 & iproc,itag,
cpld(cid)%REQLIST(ireq))
231 & (file_recv,recv_var,cid,npoin,send_node,npp)
253 INTEGER ,
INTENT(IN) :: CID, NPOIN
254 TYPE(bief_file) ,
INTENT(IN) :: FILE_RECV
255 CHARACTER(LEN=16),
INTENT(IN) :: RECV_VAR
256 DOUBLE PRECISION,
INTENT(OUT),
DIMENSION(:,:),
ALLOCATABLE ::
258 INTEGER,
INTENT(INOUT) :: NPP
259 CHARACTER(LEN=2) :: STRI
260 CHARACTER(LEN=16),
ALLOCATABLE :: VAR_LIST(:)
261 CHARACTER(LEN=16),
ALLOCATABLE :: UNIT_LIST(:)
262 CHARACTER(LEN=16) :: VARNAME
265 INTEGER :: IERR, NVAR, IVAR, INUM, I, INDVAR, IPOIN, NRFOUND
266 DOUBLE PRECISION :: TMP
272 CALL check_call(ierr,
'FIND_VARIABLE:GET_DATA_NVAR')
273 ALLOCATE(var_list(nvar),stat=ierr)
274 ALLOCATE(unit_list(nvar),stat=ierr)
275 CALL check_allocate(ierr,
'VAR_LIST')
277 & var_list,unit_list,ierr)
278 CALL check_call(ierr,
'FIND_VARIABLE:GET_DATA_VAR_LIST')
283 IF (recv_var(i:i).EQ.
' ')
THEN 289 WRITE (
lu,*)
'INVALID VARIABLE NAME FOR COUPLING: ', recv_var
294 IF (var_list(ivar)(1:inum-1).EQ.recv_var(1:inum-1).AND.
295 & var_list(ivar)(inum:inum).NE.
'W')
THEN 296 nrfound = nrfound + 1
299 IF (nrfound.EQ.0)
THEN 300 WRITE (
lu,*)
'ERROR: COUPLE_MOD NO COUPLING INFO FOR ',
311 IF (var_list(ivar)(1:inum-1).EQ.recv_var(1:inum-1).AND.
312 & var_list(ivar)(inum:inum).NE.
'W')
THEN 313 READ (var_list(ivar)(inum:inum+1),*) indvar
314 IF (indvar.GT.
maxnpp .OR. indvar.LE.0)
THEN 315 WRITE (
lu,*)
'INVALID NUMBER FOR ',recv_var,
': ',indvar
318 npp = max(npp,indvar)
323 DEALLOCATE(unit_list)
328 ALLOCATE(send_node(npoin,npp),stat=ierr)
329 CALL check_allocate(ierr,
'SEND_NODE')
331 ALLOCATE(
cpld(cid)%WEIGHTS(npoin,npp),stat=ierr)
332 CALL check_allocate(ierr,
'WEIGHTS')
337 WRITE(stri,
'(I2.2)') i
338 varname = recv_var(1:inum-1)//stri
341 & send_node(:,i),npoin,ierr)
343 WRITE (
lu,*)
'VARIABLE ',varname,
' CANNOT BE READ ' 348 varname = recv_var(1:inum-1)//
'WTS'//stri
350 &
cpld(cid)%WEIGHTS(:,i),npoin,ierr)
352 WRITE (
lu,*)
'VARIABLE ',varname,
' CANNOT BE READ ' 358 IF (any(send_node(ipoin,:).GT.0))
THEN 359 tmp = sum(
cpld(cid)%WEIGHTS(ipoin,:))
361 IF (abs(tmp-1.0d0).GT.1.0d-4)
THEN 362 WRITE (
lu,*)
'WRONG WEIGHTS IN POINT ', npoin
363 WRITE (
lu,*)
'WEIGHST ARE: ',
cpld(cid)%WEIGHTS(ipoin,:)
366 cpld(cid)%WEIGHTS(ipoin,:)=
cpld(cid)%WEIGHTS(ipoin,:)/tmp
379 & (mesh_recv,file_recv,recv_var,cid)
392 INTEGER ,
INTENT(IN) :: CID
393 TYPE(bief_file) ,
INTENT(IN) :: FILE_RECV
394 TYPE(bief_mesh),
INTENT(IN) :: MESH_RECV
395 CHARACTER(LEN=16),
INTENT(IN) :: RECV_VAR
398 INTEGER :: IERR, NPOIN , IPROC, IP_S, IP_R, IP_P
399 INTEGER :: MAXP, IPOIN, NP, ITMP, ITAG , IREQ, NPR,NPS, NPP
401 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: NSEND
403 DOUBLE PRECISION,
ALLOCATABLE,
DIMENSION(:,:) :: SEND_NODE
404 INTEGER,
ALLOCATABLE,
DIMENSION(:,:) :: TMP_SEND, LOC_SEND_MAP
405 LOGICAL,
ALLOCATABLE,
DIMENSION(:,:) :: DO_SEND
406 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: TMP_KNOLG
407 LOGICAL,
ALLOCATABLE,
DIMENSION(:) :: TMP_LOG
412 INTEGER,
ALLOCATABLE,
DIMENSION(:,:,:) :: RECV_LIST
417 npoin = mesh_recv%NPOIN
418 maxp =
cpld(cid)%MAXPOIN
421 CALL read_recv(file_recv,recv_var,cid,npoin,send_node,npp)
425 ALLOCATE(recv_list(npoin,2,npp),stat=ierr)
426 CALL check_allocate(ierr,
'RECV_LIST')
429 ALLOCATE(tmp_knolg(maxp),stat=ierr)
430 CALL check_allocate(ierr,
'TMP_KNOLG')
436 DO iproc = 0,max(ncsize,1)-1
439 np =
cpld(cid)%SEND_NPOIN(iproc+1)
440 IF (iproc.NE.ipid)
THEN 441 itag = ipid*ncsize+iproc
444 & iproc,itag,
cpld(cid)%REQLIST(1))
448 tmp_knolg(1:np) =
cpld(cid)%SEND_KNOLG(1:np)
455 IF (nint(send_node(ip_r,ip_p)).EQ.tmp_knolg(ip_s))
THEN 456 recv_list(ip_r,1,ip_p) = ip_s
457 recv_list(ip_r,2,ip_p) = iproc+1
469 ALLOCATE(
cpld(cid)%SEND_MAP(maxp,max(ncsize,1)),stat=ierr)
470 CALL check_allocate(ierr,
'SEND_MAP')
471 ALLOCATE(loc_send_map(maxp,max(ncsize,1)),stat=ierr)
472 CALL check_allocate(ierr,
'_LOC_SEND_MAP')
475 ALLOCATE(
cpld(cid)%RECV_MAP(max(ncsize,1),npoin,npp),stat=ierr)
476 CALL check_allocate(ierr,
'RECV_MAP')
479 ALLOCATE(
cpld(cid)%POIN2SEND(max(ncsize,1)),stat=ierr)
480 CALL check_allocate(ierr,
'POIN2SEND')
481 ALLOCATE(
cpld(cid)%POIN2RECV(max(ncsize,1)),stat=ierr)
482 CALL check_allocate(ierr,
'POIN2RECV')
485 ALLOCATE(do_send(max(ncsize,1),maxp),stat=ierr)
487 ALLOCATE(tmp_send(max(ncsize,1),maxp),stat=ierr)
490 ALLOCATE(nsend(max(ncsize,1)),stat=ierr)
491 CALL check_allocate(ierr,
'NSEND')
494 cpld(cid)%POIN2SEND = 0
495 cpld(cid)%POIN2RECV = 0
496 cpld(cid)%RECV_MAP = 0
497 cpld(cid)%SEND_MAP = 0
507 ip_s = recv_list(ip_r,1,ip_p)
508 iproc = recv_list(ip_r,2,ip_p)
510 IF (.NOT.do_send(iproc,ip_s))
THEN 512 do_send(iproc,ip_s) = .true.
513 nsend(iproc) = nsend(iproc)+1
514 cpld(cid)%RECV_MAP(iproc,ip_r,ip_p) = nsend(iproc)
517 loc_send_map(nsend(iproc),iproc) = ip_s
518 tmp_send(iproc,ip_s) = nsend(iproc)
521 cpld(cid)%RECV_MAP(iproc,ip_r,ip_p) = tmp_send(iproc,ip_s)
528 DO iproc = 1,max(ncsize,1)
529 cpld(cid)%POIN2RECV(iproc) = nsend(iproc)
535 #if defined (HAVE_MPI) 536 DO iproc = 0,max(ncsize,1)-1
543 cpld(cid)%NP_SEND = count(
cpld(cid)%POIN2SEND.GT.0)
544 cpld(cid)%NP_RECV = count(
cpld(cid)%POIN2RECV.GT.0)
545 IF (
cpld(cid)%POIN2SEND(ipid+1).GT.0)
THEN 546 cpld(cid)%NP_SEND_NOLOC =
cpld(cid)%NP_SEND - 1
548 cpld(cid)%NP_SEND_NOLOC =
cpld(cid)%NP_SEND
550 IF (
cpld(cid)%POIN2RECV(ipid+1).GT.0)
THEN 551 cpld(cid)%NP_RECV_NOLOC =
cpld(cid)%NP_RECV - 1
553 cpld(cid)%NP_RECV_NOLOC =
cpld(cid)%NP_RECV
557 cpld(cid)%POIN2SEND(1) =
cpld(cid)%POIN2RECV(1)
558 cpld(cid)%NP_SEND = 1
559 cpld(cid)%NP_RECV = 1
562 WRITE (
lu,*)
'ERROR IN MPI_SCATTER POIN2SEND' 569 DO iproc = 0,max(ncsize,1)-1
570 np =
cpld(cid)%POIN2RECV(iproc+1)
572 IF (iproc.NE.ipid)
THEN 574 itag = ipid+iproc*ncsize
575 CALL p_iwriti(loc_send_map(1:np,iproc+1),
576 & np,iproc,itag,
cpld(cid)%REQLIST(ireq))
583 DO iproc = 0,max(ncsize,1)-1
584 np =
cpld(cid)%POIN2SEND(iproc+1)
586 IF (iproc.NE.ipid)
THEN 588 itag = iproc+ipid*ncsize
590 & iproc,itag,
cpld(cid)%REQLIST(ireq))
594 cpld(cid)%SEND_MAP(ipoin,iproc+1) =
595 & loc_send_map(ipoin,iproc+1)
601 IF (ncsize.GT.1)
THEN 608 IF (ncsize.GT.1)
THEN 616 nps =
cpld(cid)%NP_SEND
617 npr =
cpld(cid)%NP_RECV
621 maxp = maxval(
cpld(cid)%POIN2SEND(1:max(ncsize,1)))
622 ALLOCATE(
cpld(cid)%SEND_BUF(
maxvar*maxp,nps),stat=ierr)
623 cpld(cid)%SEND_BUF = -99
624 CALL check_allocate(ierr,
'SEND_DATA')
628 maxp = maxval(
cpld(cid)%POIN2RECV(1:max(ncsize,1)))
629 ALLOCATE(
cpld(cid)%RECV_BUF(
maxvar*maxp,npr),stat=ierr)
630 cpld(cid)%RECV_BUF = -999
631 CALL check_allocate(ierr,
'RECV_BUF')
636 DEALLOCATE (
cpld(cid)%SEND_NPOIN,stat=ierr)
637 CALL check_allocate(ierr,
'DEAL:SEND_NPOIN')
639 DEALLOCATE (
cpld(cid)%SEND_KNOLG,stat=ierr)
640 CALL check_allocate(ierr,
'DEAL:SEND_KNOLG')
642 DEALLOCATE(tmp_knolg,stat=ierr)
643 CALL check_allocate(ierr,
'DEAL:TMP_KNOLG')
645 DEALLOCATE(send_node,stat=ierr)
646 CALL check_allocate(ierr,
'DEAL:SEND_NODE')
648 DEALLOCATE(recv_list,stat=ierr)
649 CALL check_allocate(ierr,
'DEAL:RECV_LIST')
651 DEALLOCATE(nsend,stat=ierr)
652 CALL check_allocate(ierr,
'DEAL:NSEND')
654 DEALLOCATE(do_send,stat=ierr)
655 CALL check_allocate(ierr,
'DEAL:DO_SEND')
657 DEALLOCATE(tmp_send,stat=ierr)
658 CALL check_allocate(ierr,
'DEAL:TMP_SEND')
660 DEALLOCATE(loc_send_map,stat=ierr)
661 CALL check_allocate(ierr,
'DEAL:LOC_SEND_MAP')
666 ALLOCATE(tmp_log(npoin),stat=ierr)
667 CALL check_allocate(ierr,
'AL:TMPLOG')
670 DO iproc =1,max(ncsize,1)
671 np =
cpld(cid)%POIN2RECV(iproc)
675 itmp =
cpld(cid)%RECV_MAP(iproc,ipoin,ip_p)
677 tmp_log(ipoin) = .true.
684 IF (all(tmp_log))
THEN 685 WRITE (
lu,*)
'ALL NODES RECEIVE INFORMATION' 687 WRITE (
lu,*)
'WARNING: NO INFORMATION FOR ',
688 & count(.NOT.tmp_log),
' NODES OUT OF ', npoin
690 DEALLOCATE(tmp_log,stat=ierr)
691 CALL check_allocate(ierr,
'DEAL:TMPLOG')
703 &(cid,npoin,nvar,varcouple)
723 INTEGER ,
INTENT(IN) :: NPOIN, NVAR,CID
724 TYPE(bief_obj),
INTENT(IN) :: VARCOUPLE
727 INTEGER :: IPOIN, IVAR, I, ITMP, NP, IPROC,IP,IPB, DUMMY
728 INTEGER :: IREQ, ITAG , NPV, NOERR, IERR
735 WRITE (
lu,*)
'TOO MANY VARIABLES' 743 IF (ncsize.GT.1)
THEN 744 ALLOCATE(
cpld(cid)%REQLIST(max(ncsize,1)-1),stat=ierr)
745 CALL check_allocate(ierr,
'REQLIST')
751 DO iproc =1,max(ncsize,1)
752 np =
cpld(cid)%POIN2RECV(iproc)
756 IF (ipid.NE.iproc-1)
THEN 759 itag = (iproc-1)+ipid*ncsize
760 CALL p_iread(
cpld(cid)%RECV_BUF(1:npv,ipb),npv,8,iproc-1,
761 & itag,
cpld(cid)%REQLIST(ip))
766 IF (ncsize.GT.1)
THEN 774 DO iproc=1,max(ncsize,1)
776 np =
cpld(cid)%POIN2SEND(iproc)
781 itmp =
cpld(cid)%SEND_MAP(ipoin,iproc)
782 IF (itmp.GT.npoin.OR. itmp.LT.1)
THEN 783 WRITE (
lu,*)
'WRONG VALUE FOR SENDMAP: ',
784 & itmp,
' FOR ',ipoin,ivar,ip,i
788 cpld(cid)%SEND_BUF(i,ip) = varcouple%ADR(ivar)%P%R(itmp)
794 IF (ncsize.GT.1)
THEN 800 DO iproc=1,max(ncsize,1)
801 np =
cpld(cid)%POIN2SEND(iproc)*nvar
804 IF (iproc-1.NE.ipid)
THEN 805 itag = (iproc-1)*ncsize+ipid
808 & np,8,iproc-1,itag,dummy)
811 itmp = count(
cpld(cid)%POIN2RECV(1:iproc).GT.0)
812 cpld(cid)%RECV_BUF(1:np,itmp) =
813 &
cpld(cid)%SEND_BUF(1:np,ip)
819 IF (ncsize.GT.1)
THEN 836 & (cid,npoin,nvar,varcouple,default_val)
852 INTEGER ,
INTENT(IN ) :: NPOIN, CID, NVAR
853 DOUBLE PRECISION,
INTENT(IN),
DIMENSION(NVAR),
OPTIONAL ::
855 type(bief_obj),
INTENT(INOUT) :: varcouple
859 INTEGER :: IPROC, ITMP , NP, I, IP, IVAR , IPR, NPR
860 INTEGER :: NOERR, IPP,NPP
861 DOUBLE PRECISION :: WP
862 DOUBLE PRECISION,
DIMENSION(NVAR) :: DEF_VAR
871 WRITE (
lu,*)
'TOO MANY VARIABLES' 879 IF (
PRESENT(default_val))
THEN 880 def_var = default_val
887 varcouple%ADR(ivar)%P%R(ip) = def_var(ivar)
894 npr =
cpld(cid)%NP_RECV_NOLOC
895 IF (ncsize.GT.1)
THEN 906 DO iproc =1,max(ncsize,1)
907 np =
cpld(cid)%POIN2RECV(iproc)
912 itmp =
cpld(cid)%RECV_MAP(iproc,ip,ipp)
919 wp =
cpld(cid)%WEIGHTS(ip,ipp)
923 varcouple%ADR(ivar)%P%R(ip) =
924 & wp*
cpld(cid)%RECV_BUF(i,ipr)
929 varcouple%ADR(ivar)%P%R(ip) =
930 & varcouple%ADR(ivar)%P%R(ip) +
931 & wp*
cpld(cid)%RECV_BUF(i,ipr)
941 IF (ncsize.GT.1)
THEN 966 INTEGER :: ICPL, IERR
974 DEALLOCATE(
cpld(icpl)%POIN2RECV,stat=ierr)
975 DEALLOCATE(
cpld(icpl)%POIN2SEND,stat=ierr)
976 DEALLOCATE(
cpld(icpl)%SEND_MAP,stat=ierr)
977 DEALLOCATE(
cpld(icpl)%RECV_MAP,stat=ierr)
981 DEALLOCATE(
cpld(icpl)%RECV_BUF,stat=ierr)
982 DEALLOCATE(
cpld(icpl)%SEND_BUF,stat=ierr)
983 DEALLOCATE(
cpld(icpl)%REQLIST,stat=ierr)
984 DEALLOCATE(
cpld(icpl)%WEIGHTS,stat=ierr)
988 DEALLOCATE(
cpld(icpl)%SEND_NPOIN,stat=ierr)
991 DEALLOCATE(
cpld,stat=ierr)
999 SUBROUTINE debug_info (DEBUG_STRING,DEBUG_INT)
1010 CHARACTER (LEN=*),
INTENT(IN) :: DEBUG_STRING
1011 INTEGER,
OPTIONAL,
INTENT(IN) :: DEBUG_INT
1013 WRITE (
lu,*)
'***********************************************' 1014 IF (
PRESENT(debug_int))
THEN 1015 WRITE (
lu,*) debug_string, debug_int
1017 WRITE (
lu,*) debug_string
1019 WRITE (
lu,*)
'***********************************************'
subroutine get_data_nvar(FFORMAT, FID, NVAR, IERR)
type(couple_data_type), dimension(:), allocatable cpld
subroutine get_data_var_list(FFORMAT, FID, NVAR, VARLIST, UNITLIST, IERR)
subroutine p_iwrit(BUFFER, N, BYTES, DEST, ITAG, IREQ)
integer, parameter maxvar
integer, parameter mpi_integer
integer, parameter maxnpp
logical, public do_couple
subroutine, public init_couple()
subroutine, public add_sender(MESH_SEND, CID)
subroutine p_iread(BUFFER, N, BYTES, SOURCE, ITAG, IREQ)
subroutine, public send_couple(CID, NPOIN, NVAR, VARCOUPLE)
subroutine p_ireadi(BUFFER, NVAL, SOURCE, ITAG, IREQ)
subroutine, public add_receiver(MESH_RECV, FILE_RECV, RECV_VAR, CID)
subroutine find_variable(FFORMAT, FID, VAR_NAME, RES, N, IERR, TIME, EPS_TIME, RECORD, TIME_RECORD, OFFSET)
subroutine read_recv(FILE_RECV, RECV_VAR, CID, NPOIN, SEND_NODE, NPP)
subroutine p_wait_paraco(IBUF, NB)
subroutine debug_info(DEBUG_STRING, DEBUG_INT)
subroutine p_iwriti(BUFFER, NVAL, DEST, ITAG, IREQ)
subroutine, public receive_couple(CID, NPOIN, NVAR, VARCOUPLE, DEFAULT_VAL)
integer, parameter maxcouple
subroutine, public end_couple