|
◆ transform_init()
subroutine transform_init |
( |
type(transform_def), intent(out) |
this, |
|
|
character(len=*) |
trans_type, |
|
|
character(len=*) |
sub_type, |
|
|
integer, intent(in), optional |
ix, |
|
|
integer, intent(in), optional |
iy, |
|
|
integer, intent(in), optional |
fx, |
|
|
integer, intent(in), optional |
fy, |
|
|
doubleprecision, intent(in), optional |
ilon, |
|
|
doubleprecision, intent(in), optional |
ilat, |
|
|
doubleprecision, intent(in), optional |
flon, |
|
|
doubleprecision, intent(in), optional |
flat, |
|
|
integer, intent(in), optional |
npx, |
|
|
integer, intent(in), optional |
npy, |
|
|
doubleprecision, intent(in), optional |
boxdx, |
|
|
doubleprecision, intent(in), optional |
boxdy, |
|
|
doubleprecision, intent(in), optional |
radius, |
|
|
type(arrayof_georef_coord_array), optional |
poly, |
|
|
doubleprecision, intent(in), optional |
percentile, |
|
|
real, intent(in), optional |
interv_gt, |
|
|
real, intent(in), optional |
interv_ge, |
|
|
real, intent(in), optional |
interv_lt, |
|
|
real, intent(in), optional |
interv_le, |
|
|
logical, intent(in), optional |
extrap, |
|
|
integer, intent(in), optional |
time_definition, |
|
|
type(vol7d_level), intent(in), optional |
input_levtype, |
|
|
type(vol7d_var), intent(in), optional |
input_coordvar, |
|
|
type(vol7d_level), intent(in), optional |
output_levtype, |
|
|
character(len=*), intent(in), optional |
categoryappend |
|
) |
| |
Constructor for a transform_def object, defining an abstract transformation between gridded and/or sparse point data.
The parameters trans_type and sub_type define the type of transformation, while all the other following parameters are optional, they have to be passed in keyword mode and those required by the transformation type and subtype chosen have to be present.
- Parametri
-
[out] | this | transformation object |
| trans_type | type of transformation, can be 'zoom' , 'boxregrid' , 'interp' , 'vertint' ... |
| sub_type | sub type of transformation, it depends on trans_type |
[in] | ix | index of initial point of new grid on x (for zoom) |
[in] | iy | index of initial point of new grid on y (for zoom) |
[in] | fx | index of final point of new grid on x (for zoom) |
[in] | fy | index of final point of new grid on y (for zoom) |
[in] | ilon | coordinate of initial point of new grid or of bounding box on x (for zoom and metamorphosis) |
[in] | ilat | coordinate of initial point of new grid or of bounding box on y (for zoom and metamorphosis) |
[in] | flon | coordinate of final point of new grid or of bounding box on x (for zoom and metamorphosis) |
[in] | flat | coordinate of final point of new grid or of bounding box on y (for zoom and metamorphosis) |
[in] | npx | number of points to average along x direction (for boxregrid) |
[in] | npy | number of points to average along y direction (for boxregrid) |
[in] | boxdx | longitudinal/x extension of the box for box interpolation, default the target x grid step (unimplemented !) |
[in] | boxdy | latitudinal/y extension of the box for box interpolation, default the target y grid step (unimplemented !) |
[in] | radius | radius of stencil in grid points (also fractionary values) for stencil interpolation |
| poly | array of polygons indicating areas over which to interpolate (for transformations 'polyinter' or 'metamorphosis:poly') |
[in] | percentile | percentile [0,100.] of the distribution of points in the box to use as interpolated value for 'percentile' subtype |
[in] | interv_gt | greater than condition for defining interval |
[in] | interv_ge | greater equal condition for defining interval |
[in] | interv_lt | less than condition for defining interval |
[in] | interv_le | less equal condition for defining interval |
[in] | extrap | activate extrapolation outside input domain (use with care!) |
[in] | time_definition | time definition for output vol7d object 0=time is reference time ; 1=time is validity time |
[in] | input_levtype | type of vertical level of input data to be vertically interpolated (only type of first and second surface are used, level values are ignored) |
[in] | input_coordvar | variable that defines the vertical coordinate in the input volume for vertical interpolation, if missing, the value of the vertical level defined with input_levtype is used |
[in] | output_levtype | type of vertical level to which data should be vertically interpolated (only type of first and second surface are used, level values are ignored) |
[in] | categoryappend | suffix to append to log4fortran namespace category |
Definizione alla linea 658 del file grid_transform_class.F90.
658 IF (this%trans_type == 'stencilinter') THEN 659 IF (.NOT.c_e(this%area_info%radius)) THEN 660 CALL l4f_category_log(this%category,l4f_error, & 661 "stencilinter: radius parameter missing") 662 CALL raise_fatal_error() 666 IF (this%sub_type == 'average' .OR. this%sub_type == 'stddev' & 667 .OR. this%sub_type == 'stddevnm1') THEN 668 this%stat_info%percentile = rmiss 669 ELSE IF (this%sub_type == 'max') THEN 670 this%stat_info%percentile = 101. 671 ELSE IF (this%sub_type == 'min') THEN 672 this%stat_info%percentile = -1. 673 ELSE IF (this%sub_type == 'percentile') THEN 674 IF (.NOT.c_e(this%stat_info%percentile)) THEN 675 CALL l4f_category_log(this%category,l4f_error,trim(this%trans_type)// & 676 ':percentile: percentile value not provided') 677 CALL raise_fatal_error() 678 ELSE IF (this%stat_info%percentile >= 100.) THEN 679 this%sub_type = 'max' 680 ELSE IF (this%stat_info%percentile <= 0.) THEN 681 this%sub_type = 'min' 683 ELSE IF (this%sub_type == 'frequency') THEN 684 IF (.NOT.c_e(this%interval_info%gt) .AND. .NOT.c_e(this%interval_info%gt)) THEN 685 CALL l4f_category_log(this%category,l4f_error,trim(this%trans_type)// & 686 ':frequency: lower and/or upper limit not provided') 687 CALL raise_fatal_error() 690 CALL sub_type_error() 694 ELSE IF (this%trans_type == 'maskgen') THEN 696 IF (this%sub_type == 'poly') THEN 698 IF (this%poly%arraysize <= 0) THEN 699 CALL l4f_category_log(this%category,l4f_error, "maskgen:poly poly parameter missing or empty") 700 CALL raise_fatal_error() 703 ELSE IF (this%sub_type == 'grid') THEN 707 CALL sub_type_error() 711 ELSE IF (this%trans_type == 'vertint') THEN 713 IF (this%vertint%input_levtype == vol7d_level_miss) THEN 714 CALL l4f_category_log(this%category,l4f_error, & 715 'vertint parameter input_levtype not provided') 716 CALL raise_fatal_error() 719 IF (this%vertint%output_levtype == vol7d_level_miss) THEN 720 CALL l4f_category_log(this%category,l4f_error, & 721 'vertint parameter output_levtype not provided') 722 CALL raise_fatal_error() 725 IF (this%sub_type == 'linear' .OR. this%sub_type == 'linearsparse') THEN 728 CALL sub_type_error() 732 ELSE IF (this%trans_type == 'metamorphosis') THEN 734 IF (this%sub_type == 'all') THEN 736 ELSE IF (this%sub_type == 'coordbb') THEN 738 IF (c_e(this%rect_coo%ilon) .AND. c_e(this%rect_coo%ilat) .AND. & 739 c_e(this%rect_coo%flon) .AND. c_e(this%rect_coo%flat)) THEN 742 CALL l4f_category_log(this%category,l4f_error, "metamorphosis: coordbb parameters missing") 743 CALL raise_fatal_error() 747 ELSE IF (this%sub_type == 'poly') THEN 749 IF (this%poly%arraysize <= 0) THEN 750 CALL l4f_category_log(this%category,l4f_error, "metamorphosis:poly: poly parameter missing or empty") 751 CALL raise_fatal_error() 754 ELSE IF (this%sub_type == 'mask' .OR. this%sub_type == 'maskvalid' .OR. & 755 this%sub_type == 'maskinvalid' .OR. this%sub_type == 'setinvalidto' .OR. & 756 this%sub_type == 'settoinvalid' .OR. this%sub_type == 'lemaskinvalid' .OR. & 757 this%sub_type == 'ltmaskinvalid' .OR. this%sub_type == 'gemaskinvalid' .OR. & 758 this%sub_type == 'gtmaskinvalid') THEN 761 CALL sub_type_error() 766 CALL trans_type_error() 772 SUBROUTINE sub_type_error() 774 CALL l4f_category_log(this%category, l4f_error, trim(this%trans_type) & 775 // ': sub_type '//trim(this%sub_type)// ' is not defined') 776 CALL raise_fatal_error() 778 END SUBROUTINE sub_type_error 780 SUBROUTINE trans_type_error() 782 CALL l4f_category_log(this%category, l4f_error, 'trans_type '//this%trans_type & 784 CALL raise_fatal_error() 786 END SUBROUTINE trans_type_error 789 END SUBROUTINE transform_init 795 SUBROUTINE transform_delete(this) 796 TYPE(transform_def), INTENT(inout) :: this 798 this%trans_type=cmiss 801 this%rect_ind%ix=imiss 802 this%rect_ind%iy=imiss 803 this%rect_ind%fx=imiss 804 this%rect_ind%fy=imiss 806 this%rect_coo%ilon=dmiss 807 this%rect_coo%ilat=dmiss 808 this%rect_coo%flon=dmiss 809 this%rect_coo%flat=dmiss 811 this%box_info%npx=imiss 812 this%box_info%npy=imiss 817 CALL l4f_category_delete(this%category) 819 END SUBROUTINE transform_delete 823 SUBROUTINE transform_get_val(this, time_definition, trans_type, sub_type, & 824 input_levtype, output_levtype) 825 type(transform_def), intent(in) :: this 826 INTEGER, INTENT(out), OPTIONAL :: time_definition 827 CHARACTER(len=*), INTENT(out), OPTIONAL :: trans_type 828 CHARACTER(len=*), INTENT(out), OPTIONAL :: sub_type 829 TYPE(vol7d_level), INTENT(out), OPTIONAL :: input_levtype 831 TYPE(vol7d_level), INTENT(out), OPTIONAL :: output_levtype 834 IF ( PRESENT(time_definition)) time_definition=this%time_definition 835 IF ( PRESENT(trans_type)) trans_type = this%trans_type 836 IF ( PRESENT(sub_type)) sub_type = this%sub_type 837 IF ( PRESENT(input_levtype)) input_levtype = this%vertint%input_levtype 838 IF ( PRESENT(output_levtype)) output_levtype = this%vertint%output_levtype 841 END SUBROUTINE transform_get_val 887 SUBROUTINE grid_transform_levtype_levtype_init(this, trans, lev_in, lev_out, & 888 coord_3d_in, categoryappend) 889 TYPE(grid_transform), INTENT(out) :: this 890 TYPE(transform_def), INTENT(in) :: trans 891 TYPE(vol7d_level), INTENT(in) :: lev_in(:) 892 TYPE(vol7d_level), INTENT(in) :: lev_out(:) 893 REAL, INTENT(inout), OPTIONAL, ALLOCATABLE :: coord_3d_in(:,:,:) 894 CHARACTER(len=*), INTENT(in), OPTIONAL :: categoryappend 896 DOUBLE PRECISION :: coord_in(SIZE(lev_in)) 897 DOUBLE PRECISION, ALLOCATABLE :: coord_out(:) 898 LOGICAL :: mask_in(SIZE(lev_in)) 899 LOGICAL, ALLOCATABLE :: mask_out(:) 901 INTEGER :: i, j, icache, inused, istart, iend, ostart, oend 904 CALL grid_transform_init_common(this, trans, categoryappend) 906 CALL l4f_category_log(this%category, l4f_debug, "grid_transform vertint") 909 IF (this%trans%trans_type == 'vertint') THEN 911 IF (c_e(trans%vertint%input_levtype%level2) .AND. & 912 trans%vertint%input_levtype%level1 /= trans%vertint%input_levtype%level2) THEN 913 CALL l4f_category_log(this%category, l4f_error, & 914 'vertint: input upper and lower surface must be of the same type, '// & 915 t2c(trans%vertint%input_levtype%level1)// '/='// & 916 t2c(trans%vertint%input_levtype%level2)) 920 IF (c_e(trans%vertint%output_levtype%level2) .AND. & 921 trans%vertint%output_levtype%level1 /= trans%vertint%output_levtype%level2) THEN 922 CALL l4f_category_log(this%category, l4f_error, & 923 'vertint: output upper and lower surface must be of the same type'// & 924 t2c(trans%vertint%output_levtype%level1)// '/='// & 925 t2c(trans%vertint%output_levtype%level2)) 930 mask_in(:) = (lev_in(:)%level1 == trans%vertint%input_levtype%level1) .AND. & 931 (lev_in(:)%level2 == trans%vertint%input_levtype%level2) 932 CALL make_vert_coord(lev_in, mask_in, coord_in, dolog) 933 this%innz = SIZE(lev_in) 934 istart = firsttrue(mask_in) 935 iend = lasttrue(mask_in) 936 inused = iend - istart + 1 937 IF (inused /= count(mask_in)) THEN 938 CALL l4f_category_log(this%category, l4f_error, & 939 'grid_transform_levtype_levtype_init: input levels badly sorted '//& 940 t2c(inused)// '/'//t2c(count(mask_in))) 944 this%levshift = istart-1 945 this%levused = inused 947 IF (trans%vertint%input_levtype%level1 /= trans%vertint%output_levtype%level1) THEN 949 CALL l4f_category_log(this%category, l4f_debug, & 950 'vertint: different input and output level types '// & 951 t2c(trans%vertint%input_levtype%level1)// ' '// & 952 t2c(trans%vertint%output_levtype%level1)) 955 ALLOCATE(mask_out( SIZE(lev_out)), this%vcoord_out( SIZE(lev_out))) 956 mask_out(:) = (lev_out(:)%level1 == trans%vertint%output_levtype%level1) .AND. & 957 (lev_out(:)%level2 == trans%vertint%output_levtype%level2) 958 CALL make_vert_coord(lev_out, mask_out, this%vcoord_out, dolog) 959 this%outnz = SIZE(mask_out) 962 IF (.NOT. PRESENT(coord_3d_in)) THEN 963 CALL l4f_category_log(this%category, l4f_warn, & 964 'vertint: different input and output level types & 965 &and no coord_3d_in, expecting vert. coord. in volume') 968 IF ( SIZE(coord_3d_in,3) /= inused) THEN 969 CALL l4f_category_log(this%category, l4f_error, & 970 'vertint: vertical size of coord_3d_in (vertical coordinate) & 971 &different from number of input levels suitable for interpolation') 972 CALL l4f_category_log(this%category, l4f_error, & 973 'coord_3d_in: '//t2c( SIZE(coord_3d_in,3))// & 974 ', input levels for interpolation: '//t2c(inused)) 979 CALL move_alloc(coord_3d_in, this%coord_3d_in) 981 WHERE(c_e(this%coord_3d_in) .AND. this%coord_3d_in > 0.0) 982 this%coord_3d_in = log(this%coord_3d_in) 984 this%coord_3d_in = rmiss
|