588 real(dp),
intent(in) :: u1(:,:),u2(:,:),u3(:,:),iucm1(:,:), &
589 iucm2(:,:),iucm3(:,:)
591 real(dp),
intent(in) :: diaginvlambda(:)
592 real(dp),
intent(out) :: postc(:,:)
593 integer,
intent(in) :: astart,aend,bstart,bend
595 integer :: a,b,irow,i,j,sender
596 real(dp),
allocatable :: row2(:),col1(:)
598 integer :: ni,nj,nk,nl,nm,nn,na,nb,ntota,ntotb
600 integer,
allocatable :: av(:)
601 integer,
allocatable :: iv(:),jv(:),kv(:)
602 integer :: p,everynit,impicount,mytotit,rirow
603 real(dp) :: startt,firststartt,endt
604 integer,
allocatable :: scheduling(:),looping(:,:)
605 real(dp),
allocatable :: postcmpi(:,:),recvrow(:),sendrow(:)
606 character(len=30) :: loopinfo
609 write(output_unit,*)
"posteriormean(): calculating posterior mean... [using OpenMPI]" 623 write(*,*)
'(Na /= Nb)', na,nb
626 ntota = aend-astart+1
627 ntotb = bend-bstart+1
628 if ( (
size(postc,1)/=ntota) .or. (
size(postc,2)/=ntotb))
then 629 write(*,*)
"Wrong size of the posterior covariance block array." 633 if ( (astart<1) .or. (aend>na) .or. (astart>aend) .or. &
634 (bstart<1) .or. (bend>na) .or. (bstart>bend) )
then 635 write(*,*)
"Wrong size of the requested block array." 640 allocate(av(na),iv(na),jv(na),kv(na))
642 forall(p = 1:na) av(p) = p
647 iv = (av-1)/(nk*nj)+1
648 jv = (av-1-(iv-1)*nk*nj)/nk + 1
649 kv = av-(jv-1)*nk-(iv-1)*nk*nj
652 nr12 =
size(u1,2)*
size(u2,2)*
size(u3,2)
653 nc1 =
size(iucm1,1)*
size(iucm2,1)*
size(iucm3,1)
654 allocate(row2(nr12),col1(nc1))
660 everynit = ntota/1000
664 firststartt = mpi_wtime()
665 loopinfo =
"blockpostcov() " 669 allocate(postcmpi(scheduling(
myrank+1),ntotb),recvrow(ntotb),sendrow(ntotb))
670 mytotit = scheduling(
myrank+1)
682 call timeinfo(mytotit,irow,startt,loopinfo)
688 row2 = u1(iv(a),iv) * u2(jv(a),jv) * u3(kv(a),kv) * diaginvlambda
695 col1 = iucm1(iv,iv(b)) * iucm2(jv,jv(b)) * iucm3(kv,kv(b))
698 i = irow-looping(
myrank+1,1)+1
699 postcmpi(i,j) = sum(row2*col1)
709 do i=looping(sender+1,1),looping(sender+1,2)
713 if (
myrank==sender) sendrow = postcmpi(i,:)
725 print*,
"blockpostcov():",endt-firststartt,
" MPI wall clock time" integer, parameter, public masterrank
subroutine para_srarr1ddp(source, dest, tag, sendrow, recvrow)
subroutine para_barrier()
integer, public, protected myrank
subroutine spreadwork(nit, nunits, scheduling, looping, startpoint)
integer, public, protected numcpus
subroutine timeinfo(totit, curit, startt, loopinfo)