663
664
666
668# ifdef OUTPUT_STATS
670# endif
671
672
673
674 logical, intent(in), optional :: SetFillVal
675
676 integer, intent(in) :: ng, model, tindex
677 integer, intent(in) :: ifield
678 integer, intent(in) :: LBi, UBi, LBj, UBj, LBk, UBk, LBt, UBt
679
680 integer, intent(in), optional :: ExtractField
681
682 real(dp), intent(in) :: Ascl
683
684# ifdef ASSUMED_SHAPE
685# ifdef MASKING
686 real(r8), intent(in) :: Amask(LBi:,LBj:)
687# endif
688 real(r8), intent(in) :: Adat(LBi:,LBj:,LBk:,LBt:)
689# else
690# ifdef MASKING
691 real(r8), intent(in) :: Amask(LBi:UBi,LBj:UBj)
692# endif
693 real(r8), intent(in) :: Adat(LBi:UBi,LBj:UBj,LBk:UBk,LBt:UBt)
694# endif
695 real(r8), intent(out), optional :: MinValue
696 real(r8), intent(out), optional :: MaxValue
697
698 TYPE (File_desc_t), intent(inout) :: pioFile
699 TYPE (IO_Desc_t), intent(inout) :: pioDesc
700 TYPE (My_VarDesc), intent(inout) :: pioVar
701
702
703
704 logical :: LandFill, Lminmax
705
706 logical, pointer :: Lwater(:,:,:,:)
707
708 integer :: Extract_Flag
709 integer :: i, j, k, l, tile
710 integer :: Imin, Imax, Jmin, Jmax
711 integer :: Cgrid, dkind, ghost, gtype
712 integer :: status
713
714 integer, dimension(5) :: start, total
715
716 real(r8), dimension(2) :: rbuffer
717
718 real(r4), pointer :: Awrk4(:,:,:,:)
719 real(r8), pointer :: Awrk8(:,:,:,:)
720
721# ifdef OUTPUT_STATS
722
723 TYPE (T_STATS) :: Stats
724# endif
725
726 character (len= 3), dimension(2) :: op_handle
727
728
729
730
731
732 status=pio_noerr
733
734
735
736
737 ghost=0
738 dkind=piovar%dkind
739 gtype=piovar%gtype
740
741 SELECT CASE (abs(gtype))
742 CASE (p3dvar)
743 cgrid=1
744 CASE (l3dvar, l4dvar, r3dvar)
745 cgrid=2
746 CASE (u3dvar)
747 cgrid=3
748 CASE (v3dvar)
749 cgrid=4
750 CASE DEFAULT
751 cgrid=2
752 END SELECT
753
754 imin=bounds(ng)%Imin(cgrid,ghost,myrank)
755 imax=bounds(ng)%Imax(cgrid,ghost,myrank)
756 jmin=bounds(ng)%Jmin(cgrid,ghost,myrank)
757 jmax=bounds(ng)%Jmax(cgrid,ghost,myrank)
758
759
760
761 IF (PRESENT(minvalue)) THEN
762 lminmax=.true.
763 IF (.not.associated(lwater)) THEN
764 allocate ( lwater(lbi:ubi,lbj:ubj,lbk:ubk,lbt:ubt) )
765 lwater=.true.
766 END IF
767 ELSE
768 lminmax=.false.
769 END IF
770
771
772
773# ifdef MASKING
774 IF (PRESENT(setfillval)) THEN
775 landfill=setfillval
776 ELSE
777 landfill=tindex.gt.0
778 END IF
779# else
780 landfill=.false.
781# endif
782
783
784
785
786 IF (PRESENT(extractfield)) THEN
787 extract_flag=extractfield
788 ELSE
789 extract_flag=0
790 END IF
791
792# ifdef OUTPUT_STATS
793
794
795
796 stats % checksum=0_i8b
797 stats % count=0
798 stats % min=spval
799 stats % max=-spval
800 stats % avg=0.0_r8
801 stats % rms=0.0_r8
802# endif
803
804
805
806
807
808
809
810
811 IF (dkind.eq.pio_double) THEN
812 IF (.not.associated(awrk8)) THEN
813 allocate ( awrk8(lbi:ubi,lbj:ubj,lbk:ubk,lbt:ubt) )
814 awrk8=0.0_r8
815 END IF
816
817 DO l=lbt,ubt
818 DO k=lbk,ubk
819 DO j=jmin,jmax
820 DO i=imin,imax
821 awrk8(i,j,k,l)=adat(i,j,k,l)*ascl
822# ifdef MASKING
823 IF ((amask(i,j).eq.0.0_r8).and.landfill) THEN
824 awrk8(i,j,k,l)=spval
825 IF (lminmax) lwater(i,j,k,l)=.false.
826 END IF
827# endif
828 END DO
829 END DO
830 END DO
831 END DO
832 IF (lminmax) THEN
833 rbuffer(1)=minval(awrk8, mask=lwater)
834 rbuffer(2)=maxval(awrk8, mask=lwater)
835 END IF
836 ELSE
837 IF (.not.associated(awrk4)) THEN
838 allocate ( awrk4(lbi:ubi,lbj:ubj,lbk:ubk,lbt:ubt) )
839 awrk4=0.0_r8
840 END IF
841
842 DO l=lbt,ubt
843 DO k=lbk,ubk
844 DO j=jmin,jmax
845 DO i=imin,imax
846 awrk4(i,j,k,l)=real(adat(i,j,k,l)*ascl, r4)
847# ifdef MASKING
848 IF ((amask(i,j).eq.0.0_r8).and.landfill) THEN
849 awrk4(i,j,k,l)=real(spval, r4)
850 END IF
851# endif
852 END DO
853 END DO
854 END DO
855 END DO
856 IF (lminmax) THEN
857 rbuffer(1)=real(minval(awrk4, mask=lwater),r8)
858 rbuffer(2)=real(maxval(awrk4, mask=lwater),r8)
859 END IF
860 END IF
861
862
863
864 IF (tindex.gt.0) THEN
865 CALL pio_setframe (piofile, &
866 & piovar%vd, &
867 & int(tindex, kind=pio_offset_kind))
868 END IF
869
870
871
872 IF (dkind.eq.pio_double) THEN
873 CALL pio_write_darray (piofile, &
874 & piovar%vd, &
875 & piodesc, &
876 & awrk8(imin:imax,jmin:jmax, &
877 & lbk:ubk,lbt:ubt), &
878 & status)
879 ELSE
880 CALL pio_write_darray (piofile, &
881 & piovar%vd, &
882 & piodesc, &
883 & awrk4(imin:imax,jmin:jmax, &
884 & lbk:ubk,lbt:ubt), &
885 & status)
886 END IF
887
888# ifdef OUTPUT_STATS
889
890
891
892
893
894# ifdef DISTRIBUTE
895 tile=myrank
896# else
897 tile=-1
898# endif
900 & extract_flag, &
901 & lbi, ubi, lbj, ubj, lbk, ubk, lbt, ubt, &
902 & adat, &
903# ifdef MASKING
904 & fmask = amask, &
905# endif
906 & debug = .false.)
907 IF (outthread) THEN
908 WRITE (stdout,10) trim(vname(1,ifield)), stats%min, stats%max, &
909 & stats%checksum
910 10 FORMAT (4x,'- ',a,':',t35,'Min = ',1p,e15.8,', Max = ', &
911 & 1p,e15.8,', CheckSum = ',i0)
912 END IF
913# endif
914
915
916
917
918
919 IF (lminmax) THEN
920 op_handle(1)='MIN'
921 op_handle(2)='MAX'
922 CALL mp_reduce (ng, model, 2, rbuffer, op_handle)
923 minvalue=rbuffer(1)
924 maxvalue=rbuffer(2)
925 IF (associated(lwater)) deallocate (lwater)
926 END IF
927
928
929
930 IF (dkind.eq.pio_double) THEN
931 IF (associated(awrk8)) deallocate (awrk8)
932 ELSE
933 IF (associated(awrk4)) deallocate (awrk4)
934 END IF
935
936 RETURN
subroutine, public stats_4dfld(ng, tile, model, gtype, s, extract_flag, lbi, ubi, lbj, ubj, lbk, ubk, lbt, ubt, f, fmask, debug)