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