123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- module m_read_CLS_data
- ! Reads SLA and SST data from CLS, Toulouse, France
- ! Files are given as .asc (lat,lon,data)
- ! The data points are surface data and therefore the data(k)%depths=0
- ! This subroutine also prepares the gridd which the data
- ! Is provided on.
- contains
- subroutine read_CLS_data(fname,obstype,dformat,gr,form,data,factor,var)
- use mod_measurement
- use mod_grid
- use m_spherdist
- implicit none
- type (measurement), intent(inout) :: data(:)
- type (grid), intent(in) :: gr ! CLS measurement grid
- real, intent(in) :: factor, var
- character(len=80), intent(in) :: fname,dformat
- character(len=3), intent(in)::form
- character(len=*), intent(in)::obstype
- integer :: k, telli, tellj, nrdat, dum
- logical :: ex, found, fleeting
- real :: lon, lat
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ! Read observation file
- if (trim(form) == '0') stop 'read_CLS_data: illegal format '
- inquire (file=fname, exist=ex)
- if (.not. ex) then
- print *, 'read_CLS_data: file ', fname, ' not found.'
- stop
- end if
- !std = 0.0; lat = 0.0; lon = 0.0
- !!! Find out if data column is type integer or not
- found = .false.
- found = ((scan(dformat,'i') > 0) .or. (scan(dformat,'I') > 0))
- fleeting = .not. found
-
- open (10, file=fname, form='formatted', status='old')
- telli=1
- tellj=1
- do k = 1, gridpoints(gr)
- data(k)%id = obstype
- if (fleeting) then ! Data column floating point
- read (10,dformat,end=999,err=999) lat, lon, data(k)%d
- else ! Data column integer valued
- read (10,dformat,end=999,err=999) lat, lon, dum
- data(k)%d = real(dum)
- end if
- ! print*,'lat',lat,'lon', lon,'data',data(k)%d
- !NBNBN Avoid sla data in region 3S to 3N (due to strange Ifremer mean ssh in this region):
- ! if (trim(data(k)%id) == 'ssh' .or. trim(data(k)%id) == 'SSH') then
- ! if ((lat.ge.-3.0).and.(lat.le.3.0)) then
- ! data(k)%d = 999.9
- ! endif
- ! endif
- if (.not. undefined(data(k)%d,gr)) then
- data(k)%d = data(k)%d*factor ! Convert to proper units
- end if
- data(k)%jpiv = telli
- data(k)%ipiv = tellj
- ! iloop(k) = telli
- ! jloop(k) = tellj
-
- telli = telli + 1
- if (telli > gr%ny) then
- tellj=tellj+1
- telli = 1
- endif
- data(k)%lon=lon
- data(k)%lat=lat
- !LB: Data support is assumed = a square grid cell
- !support diameter stored in %a1 (tricky, isn't it ?)
- data(k)%a1 = spherdist(lon-.5*gr%dx,lat-.5*gr%dy,lon+.5*gr%dx,lat+.5*gr%dy)
- data(k)%ns = 1
- data(k)%status = .not. undefined(data(k)%d,gr) ! active data
- if (trim(obstype) == 'SST') then
- data(k) % status = data(k) % status .and.&
- abs(data(k) % d + 1.8d0) > 1.0d-6
- end if
-
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- ! In the case of SSH data the var parameter is given for each data point !!!!
- !
- if (trim(data(k)%id) == 'ssh' .or. trim(data(k)%id) == 'SSH') then
- data(k)%var = var !!!NBNBNB + std**2
- else
- data(k)%var = var
- endif
- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- data(k)%depth = 0.0
- enddo ! k = 1, gridpoints(gr)
- 999 continue
- nrdat =k-1
- print*, 'Number of data read:', nrdat
- close(10)
- end subroutine read_CLS_data
- end module m_read_CLS_data
|