|
|
◆ grid_transform_vol7d_vol7d_init()
| subroutine grid_transform_class::grid_transform_vol7d_vol7d_init |
( |
type(grid_transform), intent(out) |
this, |
|
|
type(transform_def), intent(in) |
trans, |
|
|
type(vol7d), intent(in) |
v7d_in, |
|
|
type(vol7d), intent(inout) |
v7d_out, |
|
|
real, dimension(:), intent(in), optional |
maskbounds, |
|
|
character(len=*), intent(in), optional |
categoryappend |
|
) |
| |
|
private |
Constructor for a grid_transform object, defining a particular sparse points-to-sparse points transformation.
It defines an object describing a transformation from a set of sparse points to a set of sparse points; the abstract type of transformation is described in the transformation object trans (type transform_def) which must have been properly initialised. The additional information required here is the list of the input sparse points in the form of a vol7d object (parameter v7d_in), which can be the same volume that will be successively used for interpolation, or a volume with just the same coordinate data, and, if required by the transformation type, the information about the target sparse points over which the transformation should take place:
- for 'inter' transformation, this is provided in the form of a vol7d object (v7d_out argument, input), which must have been initialized with the coordinates of desired sparse points
- for 'polyinter' transformation, no target point information has to be provided in input (it is calculated on the basis of input grid and trans object), and the coordinates of the target points (polygons' centroids) are returned in output in v7d_out argument
- for 'metamorphosis' transformation, no target point information has to be provided in input (it is calculated on the basis of input grid and trans object), and, as for 'polyinter', this information is returned in output in v7d_out argument.
The generated grid_transform object is specific to the input and output sparse point lists provided or computed. The function c_e can be used in order to check whether the object has been successfully initialised, if the result is .FALSE., it should not be used further on.
- Parametri
-
| [out] | this | grid_transformation object |
| [in] | trans | transformation object |
| [in] | v7d_in | vol7d object with the coordinates of the sparse point to be used as input (only information about coordinates is used) |
| [in,out] | v7d_out | vol7d object with the coordinates of the sparse points to be used as transformation target (input or output depending on type of transformation, when output, it must have been initialised anyway) |
| [in] | maskbounds | array of boundary values for defining a subset of valid points where the values of maskgrid are within the first and last value of maskbounds (for transformation type 'metamorphosis:maskvalid/settoinvalid' and others) |
| [in] | categoryappend | append this suffix to log4fortran namespace category |
Definizione alla linea 2765 del file grid_transform_class.F90.
2765 IF (.NOT. PRESENT(maskbounds)) THEN 2766 CALL l4f_category_log(this%category,l4f_error, & 2767 'grid_transform_init maskbounds missing for metamorphosis:'// & 2768 trim(this%trans%sub_type)// ' transformation') 2771 ELSE IF ( SIZE(maskbounds) < 2) THEN 2772 CALL l4f_category_log(this%category,l4f_error, & 2773 'grid_transform_init maskbounds must have at least 2 elements for metamorphosis:'// & 2774 trim(this%trans%sub_type)// ' transformation') 2778 this%val1 = maskbounds(1) 2779 this%val2 = maskbounds( SIZE(maskbounds)) 2781 CALL l4f_category_log(this%category, l4f_debug, & 2782 "grid_transform_init setting to invalid interval ]"//t2c(this%val1)// ','// & 2783 t2c(this%val2)// ']') 2787 CALL metamorphosis_all_setup() 2796 SUBROUTINE metamorphosis_all_setup() 2798 this%outnx = SIZE(v7d_in%ana) 2800 this%point_index(:,1) = (/(i,i=1,this%innx)/) 2801 CALL vol7d_alloc(v7d_out, nana= SIZE(v7d_in%ana)) 2802 v7d_out%ana = v7d_in%ana 2806 END SUBROUTINE metamorphosis_all_setup 2808 END SUBROUTINE grid_transform_vol7d_vol7d_init 2812 SUBROUTINE grid_transform_init_common(this, trans, categoryappend) 2813 TYPE(grid_transform), INTENT(inout) :: this 2814 TYPE(transform_def), INTENT(in) :: trans 2815 CHARACTER(len=*), INTENT(in), OPTIONAL :: categoryappend 2817 CHARACTER(len=512) :: a_name 2819 IF ( PRESENT(categoryappend)) THEN 2820 CALL l4f_launcher(a_name,a_name_append=trim(subcategory)// "."// & 2821 trim(categoryappend)) 2823 CALL l4f_launcher(a_name,a_name_append=trim(subcategory)) 2825 this%category=l4f_category_get_handle(a_name) 2828 CALL l4f_category_log(this%category,l4f_debug, "start init_grid_transform") 2833 END SUBROUTINE grid_transform_init_common 2837 SUBROUTINE poly_to_coordinates(poly, v7d_out) 2838 TYPE(arrayof_georef_coord_array), intent(in) :: poly 2839 TYPE(vol7d), INTENT(inout) :: v7d_out 2842 DOUBLE PRECISION, ALLOCATABLE :: lon(:), lat(:) 2844 DO n = 1, poly%arraysize 2845 CALL getval(poly%array(n), x=lon, y=lat) 2846 sz = min( SIZE(lon), SIZE(lat)) 2847 IF (lon(1) == lon(sz) .AND. lat(1) == lat(sz)) THEN 2850 CALL init(v7d_out%ana(n), lon=stat_average(lon(1:sz)), lat=stat_average(lat(1:sz))) 2853 END SUBROUTINE poly_to_coordinates 2858 SUBROUTINE grid_transform_delete(this) 2859 TYPE(grid_transform), INTENT(inout) :: this 2861 CALL delete(this%trans) 2876 if ( associated(this%inter_index_x)) deallocate (this%inter_index_x) 2877 if ( associated(this%inter_index_y)) deallocate (this%inter_index_y) 2878 if ( associated(this%inter_index_z)) deallocate (this%inter_index_z) 2879 if ( associated(this%point_index)) deallocate (this%point_index) 2881 if ( associated(this%inter_x)) deallocate (this%inter_x) 2882 if ( associated(this%inter_y)) deallocate (this%inter_y) 2884 if ( associated(this%inter_xp)) deallocate (this%inter_xp) 2885 if ( associated(this%inter_yp)) deallocate (this%inter_yp) 2886 if ( associated(this%inter_zp)) deallocate (this%inter_zp) 2887 if ( associated(this%vcoord_in)) deallocate (this%vcoord_in) 2888 if ( associated(this%vcoord_out)) deallocate (this%vcoord_out) 2889 if ( associated(this%point_mask)) deallocate (this%point_mask) 2890 if ( associated(this%stencil)) deallocate (this%stencil) 2891 if ( associated(this%output_level_auto)) deallocate (this%output_level_auto) 2892 IF ( ALLOCATED(this%coord_3d_in)) DEALLOCATE(this%coord_3d_in) 2893 this%valid = .false. 2896 call l4f_category_delete(this%category) 2898 END SUBROUTINE grid_transform_delete 2905 SUBROUTINE grid_transform_get_val(this, output_level_auto, point_mask, & 2906 point_index, output_point_index, levshift, levused) 2907 TYPE(grid_transform), INTENT(in) :: this 2908 TYPE(vol7d_level), POINTER, OPTIONAL :: output_level_auto(:) 2909 LOGICAL, INTENT(out), ALLOCATABLE, OPTIONAL :: point_mask(:) 2910 INTEGER, INTENT(out), ALLOCATABLE, OPTIONAL :: point_index(:) 2911 INTEGER, INTENT(out), ALLOCATABLE, OPTIONAL :: output_point_index(:) 2912 INTEGER, INTENT(out), OPTIONAL :: levshift 2913 INTEGER, INTENT(out), OPTIONAL :: levused 2917 IF ( PRESENT(output_level_auto)) output_level_auto => this%output_level_auto 2918 IF ( PRESENT(point_mask)) THEN 2919 IF ( ASSOCIATED(this%point_index)) THEN 2920 point_mask = c_e(reshape(this%point_index, (/ SIZE(this%point_index)/))) 2923 IF ( PRESENT(point_index)) THEN 2924 IF ( ASSOCIATED(this%point_index)) THEN 2925 point_index = reshape(this%point_index, (/ SIZE(this%point_index)/)) 2928 IF ( PRESENT(output_point_index)) THEN 2929 IF ( ASSOCIATED(this%point_index)) THEN 2931 output_point_index = pack(this%point_index(:,:), c_e(this%point_index)) 2932 ELSE IF (this%trans%trans_type == 'polyinter' .OR. & 2933 this%trans%trans_type == 'maskinter') THEN 2935 output_point_index = (/(i,i=1,this%outnx)/) 2938 IF ( PRESENT(levshift)) levshift = this%levshift 2939 IF ( PRESENT(levused)) levused = this%levused 2941 END SUBROUTINE grid_transform_get_val 2946 FUNCTION grid_transform_c_e(this) 2947 TYPE(grid_transform), INTENT(in) :: this 2948 LOGICAL :: grid_transform_c_e 2950 grid_transform_c_e = this%valid 2952 END FUNCTION grid_transform_c_e 2964 RECURSIVE SUBROUTINE grid_transform_compute(this, field_in, field_out, var, & 2966 TYPE(grid_transform), INTENT(in), TARGET :: this 2967 REAL, INTENT(in) :: field_in(:,:,:) 2968 REAL, INTENT(out) :: field_out(:,:,:) 2969 TYPE(vol7d_var), INTENT(in), OPTIONAL :: var 2970 REAL, INTENT(in), OPTIONAL, TARGET :: coord_3d_in(:,:,:) 2971 LOGICAL, INTENT(in), OPTIONAL :: zlist(:) 2973 INTEGER :: i, j, k, l, m, s, ii, jj, ie, je, n, navg, kk, kkcache, kkup, kkdown, & 2974 kfound, kfoundin, inused, i1, i2, j1, j2, np, ns, ix, iy 2975 INTEGER, ALLOCATABLE :: nval(:,:) 2976 REAL :: z1,z2,z3,z4,z(4) 2977 DOUBLE PRECISION :: x1,x3,y1,y3,xp,yp, disttmp, dist 2978 INTEGER :: innx, inny, innz, outnx, outny, outnz, vartype, nearcount 2979 REAL, ALLOCATABLE :: coord_in(:) 2980 LOGICAL, ALLOCATABLE :: mask_in(:) 2981 REAL, ALLOCATABLE :: val_in(:), field_tmp(:,:,:) 2982 REAL, POINTER :: coord_3d_in_act(:,:,:) 2983 TYPE(grid_transform) :: likethis 2984 LOGICAL :: alloc_coord_3d_in_act, nm1, optsearch, farenough 2985 CHARACTER(len=4) :: env_var 2986 LOGICAL, ALLOCATABLE :: lzlist(:) 2989 CALL l4f_category_log(this%category,l4f_debug, "start grid_transform_compute") 2992 field_out(:,:,:) = rmiss 2994 IF (.NOT.this%valid) THEN 2995 CALL l4f_category_log(this%category,l4f_error, & 2996 "refusing to perform a non valid transformation")
|