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