|
◆ 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 2715 del file grid_transform_class.F90.
2715 IF (.NOT. PRESENT(maskbounds)) THEN 2716 CALL l4f_category_log(this%category,l4f_error, & 2717 'grid_transform_init maskbounds missing for metamorphosis:'// & 2718 trim(this%trans%sub_type)// ' transformation') 2721 ELSE IF ( SIZE(maskbounds) < 2) THEN 2722 CALL l4f_category_log(this%category,l4f_error, & 2723 'grid_transform_init maskbounds must have at least 2 elements for metamorphosis:'// & 2724 trim(this%trans%sub_type)// ' transformation') 2728 this%val1 = maskbounds(1) 2729 this%val2 = maskbounds( SIZE(maskbounds)) 2731 CALL l4f_category_log(this%category, l4f_debug, & 2732 "grid_transform_init setting to invalid interval ]"//t2c(this%val1)// ','// & 2733 t2c(this%val2)// ']') 2737 CALL metamorphosis_all_setup() 2746 SUBROUTINE metamorphosis_all_setup() 2748 this%outnx = SIZE(v7d_in%ana) 2750 this%point_index(:,1) = (/(i,i=1,this%innx)/) 2751 CALL vol7d_alloc(v7d_out, nana= SIZE(v7d_in%ana)) 2752 v7d_out%ana = v7d_in%ana 2756 END SUBROUTINE metamorphosis_all_setup 2758 END SUBROUTINE grid_transform_vol7d_vol7d_init 2762 SUBROUTINE grid_transform_init_common(this, trans, categoryappend) 2763 TYPE(grid_transform), INTENT(inout) :: this 2764 TYPE(transform_def), INTENT(in) :: trans 2765 CHARACTER(len=*), INTENT(in), OPTIONAL :: categoryappend 2767 CHARACTER(len=512) :: a_name 2769 IF ( PRESENT(categoryappend)) THEN 2770 CALL l4f_launcher(a_name,a_name_append=trim(subcategory)// "."// & 2771 trim(categoryappend)) 2773 CALL l4f_launcher(a_name,a_name_append=trim(subcategory)) 2775 this%category=l4f_category_get(a_name) 2778 CALL l4f_category_log(this%category,l4f_debug, "start init_grid_transform") 2783 END SUBROUTINE grid_transform_init_common 2787 SUBROUTINE poly_to_coordinates(poly, v7d_out) 2788 TYPE(arrayof_georef_coord_array), intent(in) :: poly 2789 TYPE(vol7d), INTENT(inout) :: v7d_out 2792 DOUBLE PRECISION, ALLOCATABLE :: lon(:), lat(:) 2794 DO n = 1, poly%arraysize 2795 CALL getval(poly%array(n), x=lon, y=lat) 2796 sz = min( SIZE(lon), SIZE(lat)) 2797 IF (lon(1) == lon(sz) .AND. lat(1) == lat(sz)) THEN 2800 CALL init(v7d_out%ana(n), lon=stat_average(lon(1:sz)), lat=stat_average(lat(1:sz))) 2803 END SUBROUTINE poly_to_coordinates 2808 SUBROUTINE grid_transform_delete(this) 2809 TYPE(grid_transform), INTENT(inout) :: this 2811 CALL delete(this%trans) 2826 if ( associated(this%inter_index_x)) deallocate (this%inter_index_x) 2827 if ( associated(this%inter_index_y)) deallocate (this%inter_index_y) 2828 if ( associated(this%inter_index_z)) deallocate (this%inter_index_z) 2829 if ( associated(this%point_index)) deallocate (this%point_index) 2831 if ( associated(this%inter_x)) deallocate (this%inter_x) 2832 if ( associated(this%inter_y)) deallocate (this%inter_y) 2834 if ( associated(this%inter_xp)) deallocate (this%inter_xp) 2835 if ( associated(this%inter_yp)) deallocate (this%inter_yp) 2836 if ( associated(this%inter_zp)) deallocate (this%inter_zp) 2837 if ( associated(this%vcoord_in)) deallocate (this%vcoord_in) 2838 if ( associated(this%vcoord_out)) deallocate (this%vcoord_out) 2839 if ( associated(this%point_mask)) deallocate (this%point_mask) 2840 if ( associated(this%stencil)) deallocate (this%stencil) 2841 if ( associated(this%output_level_auto)) deallocate (this%output_level_auto) 2842 IF ( ALLOCATED(this%coord_3d_in)) DEALLOCATE(this%coord_3d_in) 2843 this%valid = .false. 2846 call l4f_category_delete(this%category) 2848 END SUBROUTINE grid_transform_delete 2855 SUBROUTINE grid_transform_get_val(this, output_level_auto, point_mask, & 2856 point_index, output_point_index, levshift, levused) 2857 TYPE(grid_transform), INTENT(in) :: this 2858 TYPE(vol7d_level), POINTER, OPTIONAL :: output_level_auto(:) 2859 LOGICAL, INTENT(out), ALLOCATABLE, OPTIONAL :: point_mask(:) 2860 INTEGER, INTENT(out), ALLOCATABLE, OPTIONAL :: point_index(:) 2861 INTEGER, INTENT(out), ALLOCATABLE, OPTIONAL :: output_point_index(:) 2862 INTEGER, INTENT(out), OPTIONAL :: levshift 2863 INTEGER, INTENT(out), OPTIONAL :: levused 2867 IF ( PRESENT(output_level_auto)) output_level_auto => this%output_level_auto 2868 IF ( PRESENT(point_mask)) THEN 2869 IF ( ASSOCIATED(this%point_index)) THEN 2870 point_mask = c_e(reshape(this%point_index, (/ SIZE(this%point_index)/))) 2873 IF ( PRESENT(point_index)) THEN 2874 IF ( ASSOCIATED(this%point_index)) THEN 2875 point_index = reshape(this%point_index, (/ SIZE(this%point_index)/)) 2878 IF ( PRESENT(output_point_index)) THEN 2879 IF ( ASSOCIATED(this%point_index)) THEN 2881 output_point_index = pack(this%point_index(:,:), c_e(this%point_index)) 2882 ELSE IF (this%trans%trans_type == 'polyinter' .OR. & 2883 this%trans%trans_type == 'maskinter') THEN 2885 output_point_index = (/(i,i=1,this%outnx)/) 2888 IF ( PRESENT(levshift)) levshift = this%levshift 2889 IF ( PRESENT(levused)) levused = this%levused 2891 END SUBROUTINE grid_transform_get_val 2896 FUNCTION grid_transform_c_e(this) 2897 TYPE(grid_transform), INTENT(in) :: this 2898 LOGICAL :: grid_transform_c_e 2900 grid_transform_c_e = this%valid 2902 END FUNCTION grid_transform_c_e 2914 RECURSIVE SUBROUTINE grid_transform_compute(this, field_in, field_out, var, & 2916 TYPE(grid_transform), INTENT(in), TARGET :: this 2917 REAL, INTENT(in) :: field_in(:,:,:) 2918 REAL, INTENT(out) :: field_out(:,:,:) 2919 TYPE(vol7d_var), INTENT(in), OPTIONAL :: var 2920 REAL, INTENT(in), OPTIONAL, TARGET :: coord_3d_in(:,:,:) 2922 INTEGER :: i, j, k, l, m, ii, jj, ie, je, n, navg, kk, kkcache, kkup, kkdown, & 2923 kfound, kfoundin, inused, i1, i2, j1, j2, np, ns 2924 INTEGER, ALLOCATABLE :: nval(:,:) 2925 REAL :: z1,z2,z3,z4,z(4) 2926 DOUBLE PRECISION :: x1,x3,y1,y3,xp,yp, disttmp, dist 2927 INTEGER :: innx, inny, innz, outnx, outny, outnz, vartype 2928 REAL, ALLOCATABLE :: coord_in(:) 2929 LOGICAL, ALLOCATABLE :: mask_in(:) 2930 REAL, ALLOCATABLE :: val_in(:), field_tmp(:,:,:) 2931 REAL, POINTER :: coord_3d_in_act(:,:,:) 2932 TYPE(grid_transform) :: likethis 2933 LOGICAL :: alloc_coord_3d_in_act, nm1 2937 CALL l4f_category_log(this%category,l4f_debug, "start grid_transform_compute") 2940 field_out(:,:,:) = rmiss 2942 IF (.NOT.this%valid) THEN 2943 CALL l4f_category_log(this%category,l4f_error, & 2944 "refusing to perform a non valid transformation") 2948 IF (this%recur) THEN
|