630 real(dp),
intent(in) :: u1(:,:),u2(:,:),u3(:,:), g1(:,:),g2(:,:),g3(:,:)
631 real(dp),
intent(in) :: z1(:,:),z2(:,:),z3(:,:)
632 real(dp),
intent(in) :: mprior(:),dobs(:),diaginvlambda(:)
633 real(dp),
intent(out) :: postm(:)
635 real(dp),
allocatable :: row2(:),col1(:),bigmatrow(:),datrow(:)
636 real(dp),
allocatable :: ddiff(:)
637 integer :: nr12,nc1,a,b,na,nb
638 integer :: ni,nj,nk,nl,nm,nn
640 integer,
allocatable :: av(:),bv(:)
641 integer,
allocatable :: iv(:),jv(:),kv(:),lv(:),mv(:),nv(:)
643 integer :: p,j,i,everynit
645 real(dp),
allocatable :: zh(:),eludzh(:)
646 real(dp) :: datp,elg,elrowud,tzz
648 integer :: nsteps,hr,min,nthread,privcount,nthr
649 real(dp) :: eta,et1,et2,sec,startt,firststartt,endt,finish,frac
650 character(8) :: curdate
651 character(10) :: curtime
653 write(output_unit,*)
"posteriormean(): calculating posterior mean... [using OpenMP]" 671 allocate(zh(na),eludzh(na))
675 allocate(av(na),iv(na),jv(na),kv(na))
676 allocate(bv(nb),lv(nb),mv(nb),nv(nb))
677 forall(p = 1:na) av(p) = p
678 forall(p = 1:nb) bv(p) = p
682 iv = (av-1)/(nk*nj)+1
683 jv = (av-1-(iv-1)*nk*nj)/nk+1
684 kv = av-(jv-1)*nk-(iv-1)*nk*nj
687 lv = (bv-1)/(nn*nm) + 1
688 mv = (bv-1-(lv-1)*nn*nm)/nn + 1
689 nv = bv-(mv-1)*nn-(lv-1)*nn*nm
695 else if (na<100000)
then 704 firststartt = omp_get_wtime()
705 nthr = omp_get_num_threads()
710 startt= omp_get_wtime()
715 privcount = privcount + 1
716 if ( (omp_get_thread_num()==0 ) .and. (mod(privcount,everynit/nthr)==0) )
then 717 frac =
real(privcount,
dp)/(
real(nb,
dp)/
real(nthr,
dp))
718 eta = ( (omp_get_wtime()-startt) /
real(privcount,dp) ) * &
719 (
real(nb-nthr*privcount,
dp)/
real(nthr,
dp))
720 write(output_unit,fmt=
'(a27,f7.3,6x,a4,f12.2,1x,a3,a5)')
'posteriormean() loop 1/3: %',&
721 frac*100_dp,
"ETA:",eta/60.0,
"min",char(27)//
'[1A'//achar(13)
726 ddiff(b) = dobs(b) - sum(mprior * g1(lv(b),iv) * g2(mv(b),jv) * g3(nv(b),kv))
736 startt= omp_get_wtime()
739 privcount = privcount + 1
740 if ( (omp_get_thread_num()==0 ) .and. (mod(privcount,everynit/nthr)==0) )
then 741 frac =
real(privcount,
dp)/(
real(na,
dp)/
real(nthr,
dp))
742 eta = ( (omp_get_wtime()-startt) /
real(privcount,dp) ) * &
743 (
real(na-nthr*privcount,
dp)/
real(nthr,
dp))
744 write(output_unit,fmt=
'(a27,f7.3,6x,a4,f12.2,1x,a3,a5)')
'posteriormean() loop 2/3: %',&
745 frac*100_dp,
"ETA:",eta/60.0,
"min",char(27)//
'[1A'//achar(13)
750 zh(a) = sum( z1(iv(a),lv) * z2(jv(a),mv) * z3(kv(a),nv) * ddiff )
763 startt= omp_get_wtime()
766 privcount = privcount + 1
767 if ( (omp_get_thread_num()==0 ) .and. (mod(privcount,everynit/nthr)==0) )
then 768 frac =
real(privcount,
dp)/(
real(na,
dp)/
real(nthr,
dp))
769 eta = ( (omp_get_wtime()-startt) /
real(privcount,dp) ) * &
770 (
real(na-nthr*privcount,
dp)/
real(nthr,
dp))
771 write(output_unit,fmt=
'(a27,f7.3,6x,a4,f12.2,1x,a3,a5)')
'posteriormean() loop 3/3: %',&
772 frac*100_dp,
"ETA:",eta/60.0,
"min",char(27)//
'[1A'//achar(13)
777 eludzh(a) = sum( u1(iv(a),iv) * u2(jv(a),jv) * u3(kv(a),kv) * diaginvlambda * zh )
779 postm(a) = mprior(a) + eludzh(a)
784 endt = omp_get_wtime()
787 print*,
"posteriormean():",endt-firststartt,
" OMP wall clock time" integer, parameter, public dp