123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- module m_read_MET_SST
- ! Reads CLS SLA data after having read the grid in read_CLS_SST_grid
- integer, parameter, private :: STRLEN = 512
- contains
- subroutine read_MET_SST(filename,gr,data)
- use mod_measurement
- use mod_grid
- use m_spherdist
- use netcdf
- use nfw_mod
- implicit none
- type (measurement), intent(inout) :: data(:)
- type (grid), intent(inout) :: gr ! CLS measurement grid
- character(len=80), intent(in) :: filename
- ! Variable ids
- integer :: lon_ID, lat_ID,vsst_ID, vstd_ID, vmask_ID
- ! Data arrays
- real, allocatable :: sst(:,:), lon(:), lat(:), std(:,:)
- integer, allocatable :: mask(:,:)
- integer :: ncid ! observations
- real, dimension(1) :: undef_sst
- integer :: i, j, count1
- real, parameter :: eps = 0.01 ! test for undefined values
- ! filen name
- logical :: ex
- print *, 'read_MET_SST:'
- inquire(file=trim(filename),exist=ex)
- if (ex) then
- ! Reading the observation file
- call nfw_open(filename, nf_nowrite, ncid)
- ! Get dimension id in netcdf file ...
- !nb total of data
- allocate(lon(gr%nx), lat(gr%ny), sst(gr%nx,gr%ny), std(gr%nx, gr%ny), mask(gr%nx, gr%ny))
- ! Variable ids in netcdf file
- call nfw_inq_varid(filename, ncid, 'lat', lat_ID)
- call nfw_inq_varid(filename, ncid,'lon', lon_ID)
- call nfw_inq_varid(filename, ncid,'analysed_sst' ,vsst_ID)
- call nfw_inq_varid(filename, ncid,'analysis_error' ,vstd_ID)
- call nfw_inq_varid(filename, ncid,'mask' ,vmask_ID)
-
- ! Variable _FillValue attributes
- call nfw_get_att_double(filename, ncid, vsst_ID, '_FillValue', undef_sst(1))
- gr % undef = undef_sst(1)
-
- ! actual variable values (for dimensions of var -- see ncdump, or improve this program)
- ! NB: note that index dimensions are different between fortran and C internals.
- ! "ncdump" gives C internals.
- call nfw_get_var_double(filename, ncid, lon_ID, lon)
- call nfw_get_var_double(filename, ncid, lat_ID, lat)
- call nfw_get_var_double(filename, ncid, vsst_ID, sst)
- call nfw_get_var_double(filename, ncid, vstd_ID, std)
- call nfw_get_var_int(filename, ncid, vmask_ID, mask)
- print '(1x, a, 2f10.2)', ' range Lon = ', minval(lon), maxval(lon)
- print '(1x, a, 2f10.2)', ' range Lat = ', minval(lat), maxval(lat)
- print '(1x, a, 2f10.2)', ' range sst (K) = ', minval(sst), maxval(sst)
- print '(1x, a, 2i10)', ' range mask = ', minval(mask), maxval(mask)
- call nfw_close(filename, ncid)
- count1=1
- do i=1,gr%nx
- do j=1,gr%ny
- !here we only consider:
- !data above -30 of lat; valid, within reasonable range,
- ! and only open ocean (mask == 1)
- !
- if (lat(j) > -30 .and.&
- abs(sst(i,j)-undef_sst(1)) > eps .and.&
- mask(i,j) == 1 .and. &
- sst(i,j) > -190 .and. &
- sst(i,j) < 4500 .and. &
- std(i,j) > 0.0) then
- data(count1)%id = 'SST'
- data(count1)%d = sst(i,j)*0.01
- data(count1)%ipiv = count1 !whatever it is filled afterwards
- data(count1)%jpiv = 1 !whaterver it is filled afterwards
- data(count1)%lat=lat(j)
- data(count1)%lon=lon(i)
- data(count1)%a1 = spherdist(lon(i)-.5*gr%dx,lat(j)-.5*gr%dy,lon(i)+.5*gr%dx,lat(j)+.5*gr%dy)
- data(count1)%ns = 1 ! 1 for data with a spatial extent
- data(count1)%var = (std(i,j) * 0.01 * 8) ** 2 ! Exaggerate, factor 8
- data(count1)%date = 0
- data(count1)%depth = 0.0
- data(count1)%status = .true.
- count1=count1+1
- endif
- enddo !i
- enddo !j
- print*, ' # of obs read = ', count1
- deallocate(lat, lon, sst, mask)
- end if ! ex
- print *, 'MAX var(SST) = ', maxval(data(1 : count1) % var)
- end subroutine read_MET_SST
- end module m_read_MET_SST
|