***s/r statf_dm - calcule la moyenne, la variance, le minimum et * le maximum d un champs et imprime le resultat. *subroutine statf_dm ( F_field, F_nv_S, F_no, F_from_S, F_r8stat_L, 26 $ lminx,lmaxx,lminy,lmaxy,lnk, $ F_i0,F_j0,F_k0,F_in,F_jn,F_kn) implicit none * character*(*) F_nv_S , F_from_S logical F_r8stat_L integer lminx,lmaxx,lminy,lmaxy,lnk, $ F_i0,F_j0,F_k0,F_in,F_jn,F_kn,F_no,unf real F_field(lminx:lmaxx,lminy:lmaxy,lnk) * *author * M. Desgagne * *revision * v2_00 - Desgagne M. - initial MPI version (from MC2) * v3_00 - Desgagne & Lee - Lam configuration * *object * *arguments * Name I/O Description *---------------------------------------------------------------- * F_field I Field to be operated on * F_nv_S I User provided string to define F_field * F_no I Usually the timestep # * F_from_S I Usually the name of the calling subroutine * F_i0,F_j0 I Global lower-left indexes of the sub-domain * on which to perform statistics * F_in,F_jn I Global upper-right indexes of the sub-domain * on which to perform statistics * F_k0,F_kn I Range of levels on which to perform statistics *---------------------------------------------------------------- * *implicits #include "lcldim.cdk"
#include "partopo.cdk"
include 'mpif.h'
* logical done integer i,j,k,imin,jmin,kmin,imax,jmax,kmax,err, $ nijk(8,numproc),tnijk(8,numproc),nw,i0,in,j0,jn, $ bnd_w,bnd_e,bnd_s,bnd_n real*8 sum,sumd2,moy,var,mind,maxd,fijk,npt_8, $ minmax(3,max(2,numproc)),tminmax(3,max(2,numproc)) data done /.false./ save done,bnd_w,bnd_e,bnd_s,bnd_n * *-------------------------------------------------------------------- * nijk (:,:) = 0 minmax(:,:) = 0.0d0 * if (.not.done) then bnd_w = 1 - west *hx bnd_e = ldni + east *hx bnd_s = 1 - south*hy bnd_n = ldnj + north*hy endif * i0 = max(F_i0 - gc_ld(1,myproc) + 1, bnd_w) in = min(F_in - gc_ld(1,myproc) + 1, bnd_e) j0 = max(F_j0 - gc_ld(3,myproc) + 1, bnd_s) jn = min(F_jn - gc_ld(3,myproc) + 1, bnd_n) nijk(8,myproc+1) = 0 if ((i0.le.bnd_e).and.(in.ge.bnd_w).and. $ (j0.le.bnd_n).and.(jn.ge.bnd_s) ) nijk(8,myproc+1) = 1 * if (nijk(8,myproc+1).gt.0) then sum = 0.0 sumd2 = 0.0 imin = i0 jmin = j0 kmin = F_k0 imax = i0 jmax = j0 kmax = F_k0 maxd = F_field(i0,j0,F_k0) mind = F_field(i0,j0,F_k0) * do k=F_k0,F_kn do j=j0,jn do i=i0,in fijk = F_field(i,j,k) sum = sum + fijk sumd2 = sumd2 + fijk*fijk if (fijk .gt. maxd) then maxd = fijk imax = i jmax = j kmax = k endif if (fijk .lt. mind) then mind = fijk imin = i jmin = j kmin = k endif end do end do end do * minmax(1,myproc+1) = maxd minmax(2,myproc+1) = mind minmax(3,1) = sum minmax(3,2) = sumd2 * nijk (1,myproc+1) = imax + gc_ld(1,myproc) - 1 nijk (2,myproc+1) = jmax + gc_ld(3,myproc) - 1 nijk (3,myproc+1) = kmax nijk (4,myproc+1) = imin + gc_ld(1,myproc) - 1 nijk (5,myproc+1) = jmin + gc_ld(3,myproc) - 1 nijk (6,myproc+1) = kmin nijk (7,1) = (in-i0+1)*(jn-j0+1)*(F_kn-F_k0+1) * endif * nw = 3*max(2,numproc) call MPI_REDUCE ( nijk , tnijk , 8*numproc,MPI_INTEGER, $ MPI_SUM, 0, MPI_COMM_WORLD, err ) call MPI_REDUCE ( minmax, tminmax, nw,MPI_DOUBLE_PRECISION, $ MPI_SUM, 0, MPI_COMM_WORLD, err ) * if (myproc.eq.0) then * imax = tnijk (1,1) jmax = tnijk (2,1) kmax = tnijk (3,1) imin = tnijk (4,1) jmin = tnijk (5,1) kmin = tnijk (6,1) maxd = tminmax(1,1) mind = tminmax(2,1) * do i=1,numproc if ( tnijk (8,i) .gt. 0 ) then fijk = tminmax(1,i) if (fijk .gt. maxd) then maxd = fijk imax = tnijk (1,i) jmax = tnijk (2,i) kmax = tnijk (3,i) endif fijk = tminmax(2,i) if (fijk .lt. mind) then mind = fijk imin = tnijk (4,i) jmin = tnijk (5,i) kmin = tnijk (6,i) endif endif end do * npt_8 = dble(tnijk(7,1)) sum = tminmax(3,1) sumd2 = tminmax(3,2) moy = sum / npt_8 var = max(0.d0,(sumd2 + moy*moy*npt_8 - 2*moy*sum) / npt_8) var = sqrt(var) * if (F_r8stat_L) then write(6,99) F_no,F_nv_S,moy,var,imin,jmin,kmin,mind, $ imax,jmax,kmax,maxd else write(6,98) F_no,F_nv_S,moy,var,imin,jmin,kmin,mind, $ imax,jmax,kmax,maxd endif * endif * done = .true. * 98 format (i5,a7,' Mean:',e14.7,' Var:',e14.7, $ ' Min:[(',i5,',',i5,',',i5,')', $ e14.7,']',' Max:[(',i5,',',i5,',',i5,')', $ e14.7,']') 99 format (i5,a7,' Mean:',e22.14,' Var:',e22.14,/ $ ' Min:[(',i5,',',i5,',',i5,')', $ e22.14,']',' Max:[(',i5,',',i5,',',i5,')', $ e22.14,']') * *---------------------------------------------------------------- * return end