To represent each set of measurements, we choose the structure
type meas_set real, dimension(:), pointer :: data integer :: dim real :: mean, dev end type meas_setwhere the number of measured values in the set, dim, may vary; data holds the measured values, mean and dev the mean value and the standard deviation of the set of measurements.
Suppose we have a total of N_Meas data sets. For reasons that will become clear later, we want to work with pointers to objects of type Meas_Set; thus, we construct
type ptr_meas_set type(meas_set), pointer :: v end type ptr_meas_set type(ptr_meas_set), dimension(n_meas) :: mx type(ptr_meas_set) :: tmpEach measurement set will correspond to one entry in the vector mx.
We can read in the N_Meas measurement sets as follows. If there are still measured data sets to be read in, we allocate an object of the type Ptr_Meas_Set, then read in the number of points dim, allocate the vector data of dimension dim, read the measured values and store them in data.
do i=1,n_meas allocate( mx(i)%v ) if (ierr.ne.0) .... ! some action read(10,10) mx(i)%v%dim ! no. of data points allocate( mx(i)%v%data(mx(i)%v%dim), stat=ierr) ! allocate data vector if (ierr.ne.0) .... ! some action read(10,10) mx(i)%v%data ! read data end do
After creating the storage and reading in the data, we can compute the mean and the deviation for each data set
do i=1,n_meas ! compute the mean mx(i)%v%mean = 0.0 do j=1,mx(i)%v%dim mx(i)%v%mean = mx(i)%v%mean + mx(i)%v%data(j) end do mx(i)%v%mean = mx(i)%v%mean/mx(i)%v%dim ! compute the deviation mx(i)%v%dev = 0.0 do j=1,mx(i)%v%dim mx(i)%v%dev = mx(i)%v%dev + (mx(i)%v%data(j)-mx(i)%v%mean)**2 end do mx(i)%v%dev = sqrt(mx(i)%v%dev/mx(i)%v%dim) end doNow we need to sort the measured data in increasing mean order. Since the sorting algorithms move the data around, and we want to avoid repeated copying of large measurement vectors, we introduced the array of pointers mx. Interchanging to elements of mx means interchanging two pointer values; this is a cheap operation, when compared to interchanging two 10,000-elements vectors.
The simplest sorting algorithm might look like
do k=1,n_meas do i=1,n_meas-1 if( mx(i)%v%mean > mx(i+1)%v%mean ) then tmp = mx(i+1) mx(i+1) = mx(i) mx(i) = tmp end if end do end do