|
◆ grid_transform_vol7d_vol7d_init()
subroutine 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 |
|
) |
| |
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 2723 del file grid_transform_class.F90.
2723 IF (.NOT. PRESENT(maskbounds)) THEN 2724 CALL l4f_category_log(this%category,l4f_error, & 2725 'grid_transform_init maskbounds missing for metamorphosis:'// & 2726 trim(this%trans%sub_type)// ' transformation') 2729 ELSE IF ( SIZE(maskbounds) < 2) THEN 2730 CALL l4f_category_log(this%category,l4f_error, & 2731 'grid_transform_init maskbounds must have at least 2 elements for metamorphosis:'// & 2732 trim(this%trans%sub_type)// ' transformation') 2736 this%val1 = maskbounds(1) 2737 this%val2 = maskbounds( SIZE(maskbounds)) 2739 CALL l4f_category_log(this%category, l4f_debug, & 2740 "grid_transform_init setting to invalid interval ]"//t2c(this%val1)// ','// & 2741 t2c(this%val2)// ']') 2745 CALL metamorphosis_all_setup() 2754 SUBROUTINE metamorphosis_all_setup() 2756 this%outnx = SIZE(v7d_in%ana) 2758 this%point_index(:,1) = (/(i,i=1,this%innx)/) 2759 CALL vol7d_alloc(v7d_out, nana= SIZE(v7d_in%ana)) 2760 v7d_out%ana = v7d_in%ana 2764 END SUBROUTINE metamorphosis_all_setup 2766 END SUBROUTINE grid_transform_vol7d_vol7d_init 2770 SUBROUTINE grid_transform_init_common(this, trans, categoryappend) 2771 TYPE(grid_transform), INTENT(inout) :: this 2772 TYPE(transform_def), INTENT(in) :: trans 2773 CHARACTER(len=*), INTENT(in), OPTIONAL :: categoryappend 2775 CHARACTER(len=512) :: a_name 2777 IF ( PRESENT(categoryappend)) THEN 2778 CALL l4f_launcher(a_name,a_name_append=trim(subcategory)// "."// & 2779 trim(categoryappend)) 2781 CALL l4f_launcher(a_name,a_name_append=trim(subcategory)) 2783 this%category=l4f_category_get(a_name) 2786 CALL l4f_category_log(this%category,l4f_debug, "start init_grid_transform") 2791 END SUBROUTINE grid_transform_init_common 2795 SUBROUTINE poly_to_coordinates(poly, v7d_out) 2796 TYPE(arrayof_georef_coord_array), intent(in) :: poly 2797 TYPE(vol7d), INTENT(inout) :: v7d_out 2800 DOUBLE PRECISION, ALLOCATABLE :: lon(:), lat(:) 2802 DO n = 1, poly%arraysize 2803 CALL getval(poly%array(n), x=lon, y=lat) 2804 sz = min( SIZE(lon), SIZE(lat)) 2805 IF (lon(1) == lon(sz) .AND. lat(1) == lat(sz)) THEN 2808 CALL init(v7d_out%ana(n), lon=stat_average(lon(1:sz)), lat=stat_average(lat(1:sz))) 2811 END SUBROUTINE poly_to_coordinates 2816 SUBROUTINE grid_transform_delete(this) 2817 TYPE(grid_transform), INTENT(inout) :: this 2819 CALL delete(this%trans) 2834 if ( associated(this%inter_index_x)) deallocate (this%inter_index_x) 2835 if ( associated(this%inter_index_y)) deallocate (this%inter_index_y) 2836 if ( associated(this%inter_index_z)) deallocate (this%inter_index_z) 2837 if ( associated(this%point_index)) deallocate (this%point_index) 2839 if ( associated(this%inter_x)) deallocate (this%inter_x) 2840 if ( associated(this%inter_y)) deallocate (this%inter_y) 2842 if ( associated(this%inter_xp)) deallocate (this%inter_xp) 2843 if ( associated(this%inter_yp)) deallocate (this%inter_yp) 2844 if ( associated(this%inter_zp)) deallocate (this%inter_zp) 2845 if ( associated(this%vcoord_in)) deallocate (this%vcoord_in) 2846 if ( associated(this%vcoord_out)) deallocate (this%vcoord_out) 2847 if ( associated(this%point_mask)) deallocate (this%point_mask) 2848 if ( associated(this%stencil)) deallocate (this%stencil) 2849 if ( associated(this%output_level_auto)) deallocate (this%output_level_auto) 2850 IF ( ALLOCATED(this%coord_3d_in)) DEALLOCATE(this%coord_3d_in) 2851 this%valid = .false. 2854 call l4f_category_delete(this%category) 2856 END SUBROUTINE grid_transform_delete 2863 SUBROUTINE grid_transform_get_val(this, output_level_auto, point_mask, & 2864 point_index, output_point_index, levshift, levused) 2865 TYPE(grid_transform), INTENT(in) :: this 2866 TYPE(vol7d_level), POINTER, OPTIONAL :: output_level_auto(:) 2867 LOGICAL, INTENT(out), ALLOCATABLE, OPTIONAL :: point_mask(:) 2868 INTEGER, INTENT(out), ALLOCATABLE, OPTIONAL :: point_index(:) 2869 INTEGER, INTENT(out), ALLOCATABLE, OPTIONAL :: output_point_index(:) 2870 INTEGER, INTENT(out), OPTIONAL :: levshift 2871 INTEGER, INTENT(out), OPTIONAL :: levused 2875 IF ( PRESENT(output_level_auto)) output_level_auto => this%output_level_auto 2876 IF ( PRESENT(point_mask)) THEN 2877 IF ( ASSOCIATED(this%point_index)) THEN 2878 point_mask = c_e(reshape(this%point_index, (/ SIZE(this%point_index)/))) 2881 IF ( PRESENT(point_index)) THEN 2882 IF ( ASSOCIATED(this%point_index)) THEN 2883 point_index = reshape(this%point_index, (/ SIZE(this%point_index)/)) 2886 IF ( PRESENT(output_point_index)) THEN 2887 IF ( ASSOCIATED(this%point_index)) THEN 2889 output_point_index = pack(this%point_index(:,:), c_e(this%point_index)) 2890 ELSE IF (this%trans%trans_type == 'polyinter' .OR. & 2891 this%trans%trans_type == 'maskinter') THEN 2893 output_point_index = (/(i,i=1,this%outnx)/) 2896 IF ( PRESENT(levshift)) levshift = this%levshift 2897 IF ( PRESENT(levused)) levused = this%levused 2899 END SUBROUTINE grid_transform_get_val 2904 FUNCTION grid_transform_c_e(this) 2905 TYPE(grid_transform), INTENT(in) :: this 2906 LOGICAL :: grid_transform_c_e 2908 grid_transform_c_e = this%valid 2910 END FUNCTION grid_transform_c_e 2922 RECURSIVE SUBROUTINE grid_transform_compute(this, field_in, field_out, var, & 2924 TYPE(grid_transform), INTENT(in), TARGET :: this 2925 REAL, INTENT(in) :: field_in(:,:,:) 2926 REAL, INTENT(out) :: field_out(:,:,:) 2927 TYPE(vol7d_var), INTENT(in), OPTIONAL :: var 2928 REAL, INTENT(in), OPTIONAL, TARGET :: coord_3d_in(:,:,:) 2930 INTEGER :: i, j, k, l, m, s, ii, jj, ie, je, n, navg, kk, kkcache, kkup, kkdown, & 2931 kfound, kfoundin, inused, i1, i2, j1, j2, np, ns, ix, iy 2932 INTEGER, ALLOCATABLE :: nval(:,:) 2933 REAL :: z1,z2,z3,z4,z(4) 2934 DOUBLE PRECISION :: x1,x3,y1,y3,xp,yp, disttmp, dist 2935 INTEGER :: innx, inny, innz, outnx, outny, outnz, vartype, nearcount 2936 REAL, ALLOCATABLE :: coord_in(:) 2937 LOGICAL, ALLOCATABLE :: mask_in(:) 2938 REAL, ALLOCATABLE :: val_in(:), field_tmp(:,:,:) 2939 REAL, POINTER :: coord_3d_in_act(:,:,:) 2940 TYPE(grid_transform) :: likethis 2941 LOGICAL :: alloc_coord_3d_in_act, nm1, optsearch, farenough 2942 CHARACTER(len=4) :: env_var 2946 CALL l4f_category_log(this%category,l4f_debug, "start grid_transform_compute") 2949 field_out(:,:,:) = rmiss 2951 IF (.NOT.this%valid) THEN 2952 CALL l4f_category_log(this%category,l4f_error, & 2953 "refusing to perform a non valid transformation")
|