libsim  Versione7.2.6

◆ volgrid6d_v7d_transform()

subroutine volgrid6d_v7d_transform ( type(transform_def), intent(in)  this,
type(volgrid6d), intent(inout)  volgrid6d_in,
type(vol7d), intent(out)  vol7d_out,
type(vol7d), intent(in), optional  v7d,
real, dimension(:,:), intent(in), optional  maskgrid,
real, dimension(:), intent(in), optional  maskbounds,
character(len=*), intent(in), optional  networkname,
logical, intent(in), optional  noconvert,
procedure(basic_find_index), optional, pointer  find_index,
character(len=*), intent(in), optional  categoryappend 
)

Performs the specified abstract transformation on the data provided.

The abstract transformation is specified by this parameter; the corresponding specifical transformation (grid_transform object) is created and destroyed internally. The output transformed object is created internally and it does not require preliminary initialisation.

Parametri
[in]thisobject specifying the abstract transformation
[in,out]volgrid6d_inobject to be transformed, it is not modified, despite the INTENT(inout)
[out]vol7d_outtransformed object, it does not requires initialisation
[in]v7dobject containing a list of points over which transformation has to be done (required by some transformation types)
[in]maskgrid2D field to be used for defining subareas according to its values, it must have the same shape as the field to be interpolated (for transformation type 'maskinter')
[in]maskboundsarray of boundary values for defining subareas from the values of maskgrid, the number of subareas is SIZE(maskbounds) - 1, if not provided a default based on extreme values of makgrid is used
[in]networknameset the output network name in vol7d_out (default='generic')
[in]noconvertdo not try to match variable and convert values during transform
[in]categoryappendappend this suffix to log4fortran namespace category

Definizione alla linea 2336 del file volgrid6d_class.F90.

2336 ! no time_definition conversion implemented, output will be the same as input
2337 if (associated(vol7d_in%time))then
2338  ntime=size(vol7d_in%time)
2339  volgrid6d_out%time=vol7d_in%time
2340 end if
2341 
2342 if (associated(vol7d_in%timerange))then
2343  ntimerange=size(vol7d_in%timerange)
2344  volgrid6d_out%timerange=vol7d_in%timerange
2345 end if
2346 
2347 if (associated(vol7d_in%level))then
2348  nlevel=size(vol7d_in%level)
2349  volgrid6d_out%level=vol7d_in%level
2350 end if
2351 
2352 if (associated(vol7d_in%dativar%r))then
2353  nvar=size(vol7d_in%dativar%r)
2354  CALL varbufr2vargrib(vol7d_in%dativar%r, volgrid6d_out%var, c_func, gaid_template)
2355 end if
2356 
2357 nana=SIZE(vol7d_in%voldatir, 1)
2358 ! allocate once for speed
2359 IF (.NOT.ASSOCIATED(volgrid6d_out%voldati)) THEN
2360  ALLOCATE(voldatiout(volgrid6d_out%griddim%dim%nx, volgrid6d_out%griddim%dim%ny, &
2361  nlevel))
2362 ENDIF
2363 
2364 DO ivar=1,nvar
2365  DO itimerange=1,ntimerange
2366  DO itime=1,ntime
2367 
2368 ! clone the gaid template where I have data
2369  IF (PRESENT(gaid_template)) THEN
2370  DO ilevel = 1, nlevel
2371  IF (any(c_e(vol7d_in%voldatir(:,itime,ilevel,itimerange,ivar,inetwork)))) THEN
2372  CALL copy(gaid_template, volgrid6d_out%gaid(ilevel,itime,itimerange,ivar))
2373  ELSE
2374  volgrid6d_out%gaid(ilevel,itime,itimerange,ivar) = grid_id_new()
2375  ENDIF
2376  ENDDO
2377  ENDIF
2378 
2379 ! get data
2380  IF (ASSOCIATED(volgrid6d_out%voldati)) & ! improve!!!!
2381  CALL volgrid_get_vol_3d(volgrid6d_out, itime, itimerange, ivar, &
2382  voldatiout)
2383 ! do the interpolation
2384  CALL compute(this, &
2385  vol7d_in%voldatir(:,itime,:,itimerange,ivar,inetwork), voldatiout, &
2386  vol7d_in%dativar%r(ivar))
2387 ! rescale valid data according to variable conversion table
2388  IF (ASSOCIATED(c_func)) THEN
2389  CALL compute(c_func(ivar), voldatiout(:,:,:))
2390  ENDIF
2391 ! put data
2392  CALL volgrid_set_vol_3d(volgrid6d_out, itime, itimerange, ivar, &
2393  voldatiout)
2394 
2395  ENDDO
2396  ENDDO
2397 ENDDO
2398 
2399 IF (.NOT.ASSOCIATED(volgrid6d_out%voldati)) THEN
2400  DEALLOCATE(voldatiout)
2401 ENDIF
2402 IF (ASSOCIATED(c_func)) THEN
2403  DEALLOCATE(c_func)
2404 ENDIF
2405 
2406 END SUBROUTINE v7d_volgrid6d_transform_compute
2407 
2408 
2415 SUBROUTINE v7d_volgrid6d_transform(this, griddim, vol7d_in, volgrid6d_out, &
2416  networkname, gaid_template, categoryappend)
2417 TYPE(transform_def),INTENT(in) :: this
2418 TYPE(griddim_def),INTENT(in),OPTIONAL :: griddim
2419 ! TODO ripristinare intent(in) dopo le opportune modifiche in grid_class.F90
2420 TYPE(vol7d),INTENT(inout) :: vol7d_in
2421 TYPE(volgrid6d),INTENT(out) :: volgrid6d_out
2422 CHARACTER(len=*),OPTIONAL,INTENT(in) :: networkname
2423 TYPE(grid_id),OPTIONAL,INTENT(in) :: gaid_template
2424 CHARACTER(len=*),INTENT(in),OPTIONAL :: categoryappend
2425 
2426 type(grid_transform) :: grid_trans
2427 integer :: ntime, ntimerange, nlevel, nvar
2428 
2429 
2430 !TODO la category sarebbe da prendere da vol7d
2431 !call l4f_category_log(vol7d_out%category,L4F_DEBUG,"start volgrid6d_transform")
2432 
2433 CALL vol7d_alloc_vol(vol7d_in) ! be safe
2434 ntime=SIZE(vol7d_in%time)
2435 ntimerange=SIZE(vol7d_in%timerange)
2436 nlevel=SIZE(vol7d_in%level)
2437 nvar=0
2438 if (associated(vol7d_in%dativar%r)) nvar=size(vol7d_in%dativar%r)
2439 
2440 IF (nvar <= 0) THEN ! use vol7d category once it will be implemented
2441  CALL l4f_log(l4f_error, &
2442  "trying to transform a vol7d object incomplete or without real variables")
2443  CALL init(volgrid6d_out) ! initialize to empty
2444  CALL raise_error()
2445  RETURN
2446 ENDIF
2447 
2448 CALL init(grid_trans, this, vol7d_in, griddim, categoryappend=categoryappend)
2449 CALL init(volgrid6d_out, griddim, time_definition=vol7d_in%time_definition, &
2450  categoryappend=categoryappend)
2451 
2452 IF (c_e(grid_trans)) THEN
2453 
2454  CALL volgrid6d_alloc(volgrid6d_out, griddim%dim, ntime=ntime, nlevel=nlevel, &

Generated with Doxygen.