SUBSE1 Subroutine

public subroutine SUBSE1(X, N, D, Dmin, Dmax, Y, Ny)

NAME

subse1(3f) - [M_datapac:VECTOR_OPERATION] extract the elements of a vector
which fall into a user-specified subset (one subset variable)

SYNOPSIS

   SUBROUTINE SUBSE1(X,N,D,Dmin,Dmax,Y,Ny)

    REAL(kind=wp) :: D(:), Dmax, Dmin, X(:), Y(:)
    INTEGER       :: N, Ny

DESCRIPTION

This subroutine carries over into Y all observations of the precision
precision vector X for which the corresponding elements in the precision
precision vector D are inside the closed (inclusive) interval defined
by DMIN and DMAX, while not carrying over any observations of X
corresponding to elements of D outside of this interval.

the input vector X is itself unaltered; those elements of X to be
retained are copied over into the output vector Y.

thus all observations of X which correspond to elements in D which
are smaller than DMIN or larger than DMAX are not copied over into Y.

the use of subse1(3f) gives the data analyst the capability
to easily extract subsets of the data prior to data analysis on
each subset.

INPUT ARGUMENTS

X      The vector of (unsorted or sorted) observations.

n      The integer number of observations in the vector x.

d      The vector which 'defines' the various possible subsets of x.

dmin   The value which defines the lower limit (inclusively) of the
       particular subset of interest to be retained.

dmax   The value which defines the upper limit (inclusively) of the
       particular subset of interest to be retained.

OUTPUT ARGUMENTS

y      the vector containing only those elements
       of x corresponding to values of the d vector
       in the interval dmin to dmax (inclusive).

ny     the integer number of retained observations copied into
       the vector y.

EXAMPLES

Sample program:

program demo_subse1
use M_datapac, only : subse1
implicit none
! call subse1(x,y)
end program demo_subse1

Results:

AUTHOR

The original DATAPAC library was written by James Filliben of the Statistical
Engineering Division, National Institute of Standards and Technology.

MAINTAINER

John Urban, 2022.05.31

LICENSE

CC0-1.0

Arguments

Type IntentOptional Attributes Name
real(kind=wp) :: X(:)
integer :: N
real(kind=wp) :: D(:)
real(kind=wp) :: Dmin
real(kind=wp) :: Dmax
real(kind=wp) :: Y(:)
integer :: Ny

Source Code

SUBROUTINE SUBSE1(X,N,D,Dmin,Dmax,Y,Ny)
REAL(kind=wp) :: D(:) , Dmax , Dmin , hold , pointl , pointu , X(:) , Y(:)
INTEGER i , k , N , ndel , Ny

!     OUTPUT--THE VECTOR Y
!             INTO WHICH HAVE BEEN COPIED
!             ONLY THOSE VALUES OF X WHICH
!             CORRESPOND TO VALUES
!             IN THE D VECTOR INSIDE
!             (INCLUSIVELY) THE INTERVAL OF
!             INTEREST, AND
!             THE INTEGER VALUE NY
!             WHICH GIVES THE NUMBER OF
!             OBSERVATIONS COPIED INTO Y.
!             ALSO, 12 LINES OF SUMMARY INFORMATION
!             WILL BE GENERATED INDICATING
!             1) WHAT THE INTERVAL OF INTEREST WAS
!                IN THE D VECTOR;
!             2) HOW MANY OBSERVATIONS WERE DELETED;
!             3) WHAT THE SAMPLE SIZE OF X WAS (N);
!             4) WHAT THE SAMPLE SIZE OF Y WAS (NY);
!     PRINTING--YES.

!     COMMENT--THE INPUT VECTOR X IS NOT ALTERED
!              BY APPLICATION OF THIS SUBROUTINE.
!              THIS IS THE MAJOR DISTINCTION
!              BETWEEN THIS SUBROUTINE AND, SAY,
!              THE SUBSET SUBROUTINE.
!              IT IS THUS SEEN THAT THIS (SUBSE1)
!              SUBROUTINE IS THE PREFERABLE OF THE 2
!              (SUBSET VERSUS SUBSE1)
!              FOR HANDLING THE PROBLEM OF
!              SEQUENTIALLY EXTRACTING EACH POSSIBLE
!              SUBSET OF X (FOR THE PURPOSE OF
!              ANALYZING EACH INDIVIDUAL SUBSET).
!              INASMUCH AS THE ORIGINAL X VECTOR
!              REMAINS UNCHANGED, THE ANALYST
!              CAN ALWAYS OPERATE ON IT WITH
!              SUBSE1 IN SEQUENTIALLY EXTRACTING
!              SUBSETS OF INTEREST.
!     COMMENT--IN THE END, AFTER THIS SUBROUTINE HAS
!              MADE WHATEVER DELETIONS ARE APPROPRIATE,
!              THE OUTPUT VECTOR Y WILL BE 'PACKED';
!              THAT IS, NO 'HOLES' WILL EXIST IN THE
!              VECTOR Y--ALL OF THE RETAINED ELEMENTS
!              OF Y WILL BE PACKED INTO THE FIRST AVAILABLE
!              LOCATIONS IN Y, WHILE THE REMAINDER
!              OF THE N LOCATIONS IN Y WILL BE ZERO-FILLED.
!     COMMENT--ALTHOUGH THERE
!              MAY BE A CORRESPONDANCE BETWEEN THE
!              ELEMENTS OF THE X AND D VECTORS
!              BEFORE APPLICATION OF
!              THIS SUBROUTINE, THERE WILL
!              BE NO CORRESPONDANCE BETWEEN
!              Y AND D (DUE TO THE PACKING OF
!              THE RETAINED ELEMENTS IN Y)
!              AFTER APPLICATION OF THIS SUBROUTINE.
!     ORIGINAL VERSION--APRIL     1975.
!     UPDATED         --NOVEMBER  1975.
!---------------------------------------------------------------------
!
!     CHECK THE INPUT ARGUMENTS FOR ERRORS
!
      IF ( N<1 ) THEN
         WRITE (G_IO,99001)
99001    FORMAT (' ',                                                   &
     &'***** FATAL ERROR--THE SECOND INPUT ARGUMENT TO THE SUBSE1 SUBROU&
     &TINE IS NON-POSITIVE *****')
         WRITE (G_IO,99002) N
99002    FORMAT (' ','***** THE VALUE OF THE ARGUMENT IS ',I0,' *****')
         RETURN
      ELSE
         IF ( N==1 ) THEN
            WRITE (G_IO,99003)
99003       FORMAT (' ',                                                &
     &'***** NON-FATAL DIAGNOSTIC--THE SECOND INPUT ARGUMENT TO THE SUBS&
     &E1 SUBROUTINE HAS THE VALUE 1 *****')
         ELSE
            hold = X(1)
            DO i = 2 , N
               IF ( X(i)/=hold ) GOTO 50
            ENDDO
            WRITE (G_IO,99004) hold
99004       FORMAT (' ',                                                &
     &'***** NON-FATAL DIAGNOSTIC--THE FIRST  INPUT ARGUMENT (A VECTOR) &
     &TO THE SUBSE1 SUBROUTINE HAS ALL ELEMENTS =',E15.8,' *****')
         ENDIF
!
!-----START POINT-----------------------------------------------------
!
 50      pointl = Dmin
         pointu = Dmax
         IF ( Dmin>Dmax ) pointl = Dmax
         IF ( Dmin>Dmax ) pointu = Dmin
!
         k = 0
         DO i = 1 , N
            IF ( D(i)>=pointl .AND. D(i)<=pointu ) THEN
               k = k + 1
               Y(k) = X(i)
            ENDIF
         ENDDO
         Ny = k
         ndel = N - Ny
!
!     WRITE OUT A BRIEF SUMMARY
!
         WRITE (G_IO,99005)
99005    FORMAT (' ')
         WRITE (G_IO,99006)
99006    FORMAT (' ','OUTPUT FROM THE SUBSE1 SUBROUTINE--')
         WRITE (G_IO,99007) pointl , pointu
99007    FORMAT (' ',7X,'D1 LIMITS (INCLUSIVE)--   ',E15.8,' AND ', E15.8)
         WRITE (G_IO,99008)
99008    FORMAT (' ',7X,'ONLY THOSE OBSERVATIONS IN X')
         WRITE (G_IO,99009)
99009    FORMAT (' ',7X,'WILL BE CARRIED OVER INTO Y')
         WRITE (G_IO,99010)
99010    FORMAT (' ',7X,'FOR WHICH THE CORRESPONDING ELEMENTS OF ','D1')
         WRITE (G_IO,99011)
99011    FORMAT (' ',7X,'ARE SIMULTANEOUSLY WITHIN (INCLUSIVE)')
         WRITE (G_IO,99012)
99012    FORMAT (' ',7X,'EACH SPECIFIED LIMIT.')
         WRITE (G_IO,99013)
99013    FORMAT (' ',7X,'NO OBSERVATIONS OUTSIDE OF THIS INTERVAL')
         WRITE (G_IO,99014)
99014    FORMAT (' ',7X,'HAVE BEEN CARRIED OVER INTO Y.')
         WRITE (G_IO,99015) N
99015    FORMAT (' ',7X,'THE INPUT  NUMBER OF OBSERVATIONS (IN X) IS ', I0)
         WRITE (G_IO,99016) Ny
99016    FORMAT (' ',7X,'THE OUTPUT NUMBER OF OBSERVATIONS (IN Y) IS ', I0)
         WRITE (G_IO,99017) ndel
99017    FORMAT (' ',7X,'THE NUMBER OF OBSERVATIONS DELETED       IS ', I0)
      ENDIF
!
END SUBROUTINE SUBSE1