123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- module mod_measurement
- integer, parameter, public :: OBSTYPESTRLEN = 8
- integer, parameter, private :: MAXNUOBS = 9
- integer, public :: nuobs
- character(OBSTYPESTRLEN), public :: unique_obs(MAXNUOBS)
- integer, public :: nobseach(MAXNUOBS)
- integer :: uobs_begin(MAXNUOBS), uobs_end(MAXNUOBS)
- type measurement
- real d ! Measurement value
- real var ! Error variance of measurement
- character(OBSTYPESTRLEN) id ! Type of measurement ('a_i_htc1', 'a_i_tot ', 'u_ice ', 'v_ice ')
- real lon ! Longitude position
- real lat ! Latitude position
- real depths ! depths of position
- integer ipiv ! i-pivot point in grid
- integer jpiv ! j-pivot point in grid
- integer ns ! representativity in mod cells (meas. support)
- ! ns=0 means: point measurements
- ! used in m_Generate_element_Sij.F90
- real a1 ! bilinear coeffisients (if ni=0)
- real a2 ! bilinear coeffisients
- real a3 ! bilinear coeffisients
- real a4 ! bilinear coeffisients
- logical status ! active or not
- integer i_orig_grid ! KAL - ice drift needs orig grid index as well
- integer j_orig_grid ! KAL - ice drift needs orig grid index as well
- real h ! PS - layer thickness, sorry for that
- integer date ! FanF- age of the data
- integer orig_id ! PS used in superobing
- end type measurement
- contains
- subroutine get_unique_obs(tags, nrobs, master)
- implicit none
- integer , intent(in) :: nrobs
- logical , intent(in) :: master
- character(OBSTYPESTRLEN), intent(in) :: tags(nrobs)
- logical :: obsmatch
- integer :: o, uo
- nobseach = 0
- ! check for unique obs
- if (master) then
- print *
- print *, '(get_unique_obs) Getting unique obs '
- end if
- nuobs = 0
- unique_obs = ''
- do o = 1, nrobs
- obsmatch = .false.
- do uo = 1, MAXNUOBS
- if (trim(tags(o)) == trim(unique_obs(uo))) then
- obsmatch = .true.
- nobseach(uo) = nobseach(uo) + 1
- exit
- end if
- end do
- if (.not. obsmatch) then
- nuobs = nuobs + 1
- nobseach(nuobs) = 1
- if (nuobs > MAXNUOBS) then
- if (master) then
- print *, '(get_unique_obs) ERROR: # of unique obs > MAXNUOBS'
- end if
- stop
- end if
- unique_obs(nuobs) = trim(tags(o))
- end if
- end do
- if (master) then
- do uo = 1, nuobs
- print *, '(get_unique_obs) obs variable ', uo, ' -- ', trim(unique_obs(uo)),&
- ',', nobseach(uo), ' observations'
- end do
- end if
- uobs_begin(1) = 1
- uobs_end(1) = nobseach(1)
- do uo = 2, nuobs
- uobs_begin(uo) = uobs_end(uo - 1) + 1
- uobs_end(uo) = uobs_begin(uo) + nobseach(uo) - 1
- end do
- if (master) then
- do uo = 1, nuobs
- do o = uobs_begin(uo), uobs_end(uo)
- if (trim(tags(o)) /= trim(unique_obs(uo))) then
- print *, '(get_unique_obs) ERROR: unique observations not ',&
- 'continuous in observation array'
- stop
- end if
- end do
- end do
- end if
- end subroutine get_unique_obs
- end module mod_measurement
|