libsim Versione 7.2.1

◆ grid_transform_v7d_grid_compute()

subroutine grid_transform_v7d_grid_compute ( type(grid_transform), intent(in)  this,
real, dimension(:,:), intent(in)  field_in,
real, dimension(:,:,:), intent(out)  field_out,
type(vol7d_var), intent(in), optional  var,
real, dimension(:,:,:), intent(in), optional, target  coord_3d_in 
)
private

Compute the output data array from input data array according to the defined transformation.

The grid_transform object this must have been properly initialised, so that it contains all the information needed for computing the transformation. This is the sparse points-to-grid and sparse points-to-sparse points version.

Parametri
[in]thisgrid_tranform object
[in]field_ininput array
[out]field_outoutput array
[in]varphysical variable to be interpolated, if provided, some ad-hoc algorithms may be used where possible
[in]coord_3d_ininput vertical coordinate for vertical interpolation, if not provided by other means

Definizione alla linea 4248 del file grid_transform_class.F90.

4250
4251z5 = (z4-z1)*p2+z1
4252z6 = (z3-z2)*p2+z2
4253
4254zp = (z6-z5)*(p1)+z5
4255
4256END FUNCTION hbilin
4257
4258
4259! Shapiro filter of order 2
4260FUNCTION shapiro (z,zp) RESULT(zs)
4261!! z_smoothed(i,j) = z(i,j) * (1-S) + S * sum(z_vicini)/N
4262!! = z(i,j) - S/N (N*z(i,j) - sum(z_vicini))
4263REAL,INTENT(in) :: z(:) ! Z values on the four surrounding points
4264REAL,INTENT(in) :: zp ! Z values on the central point
4265REAL :: zs ! Z smoothed value on the central point
4266INTEGER:: N
4267
4268IF(c_e(zp))THEN
4269 n = count(c_e(z))
4270 zs = zp - 0.5* ( n*zp - sum(z, c_e(z)) )/n
4271ELSE
4272 zs = rmiss
4273END IF
4274
4275END FUNCTION shapiro
4276
4277
4278! Locate index of requested point
4279SUBROUTINE basic_find_index(this, near, nx, ny, xmin, xmax, ymin, ymax, &
4280 lon, lat, extrap, index_x, index_y)
4281TYPE(griddim_def),INTENT(in) :: this ! griddim object (from grid)
4282logical,INTENT(in) :: near ! near or bilin interpolation (determine wich point is requested)
4283INTEGER,INTENT(in) :: nx,ny ! dimension (to grid)
4284DOUBLE PRECISION,INTENT(in) :: xmin, xmax, ymin, ymax ! extreme coordinate (to grid)
4285DOUBLE PRECISION,INTENT(in) :: lon(:,:),lat(:,:) ! target coordinate
4286LOGICAL,INTENT(in) :: extrap ! extrapolate
4287INTEGER,INTENT(out) :: index_x(:,:),index_y(:,:) ! index of point requested
4288
4289INTEGER :: lnx, lny
4290DOUBLE PRECISION :: x(SIZE(lon,1),SIZE(lon,2)),y(SIZE(lon,1),SIZE(lon,2))
4291
4292IF (near) THEN
4293 CALL proj(this,lon,lat,x,y)
4294 index_x = nint((x-xmin)/((xmax-xmin)/dble(nx-1)))+1
4295 index_y = nint((y-ymin)/((ymax-ymin)/dble(ny-1)))+1
4296 lnx = nx
4297 lny = ny
4298ELSE
4299 CALL proj(this,lon,lat,x,y)
4300 index_x = floor((x-xmin)/((xmax-xmin)/dble(nx-1)))+1
4301 index_y = floor((y-ymin)/((ymax-ymin)/dble(ny-1)))+1
4302 lnx = nx-1
4303 lny = ny-1
4304ENDIF
4305
4306IF (extrap) THEN ! trim indices outside grid for extrapolation
4307 index_x = max(index_x, 1)
4308 index_y = max(index_y, 1)
4309 index_x = min(index_x, lnx)
4310 index_y = min(index_y, lny)
4311ELSE ! nullify indices outside grid
4312 WHERE(index_x < 1 .OR. index_x > lnx .OR. index_y < 1 .OR. index_y > lny)
4313 index_x = imiss
4314 index_y = imiss
4315 END WHERE
4316ENDIF
4317
4318END SUBROUTINE basic_find_index
4319
4320END MODULE grid_transform_class
Module for defining transformations between rectangular georeferenced grids and between grids and spa...

Generated with Doxygen.