|
◆ transform_init()
subroutine grid_transform_class::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 |
|
) |
| |
|
private |
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 643 del file grid_transform_class.F90.
649 CALL raise_fatal_error()
653 IF (this%trans_type == 'stencilinter') THEN
654 IF (.NOT.c_e(this%area_info%radius)) THEN
655 CALL l4f_category_log(this%category,l4f_error, &
656 "stencilinter: radius parameter missing")
657 CALL raise_fatal_error()
661 IF (this%sub_type == 'average' .OR. this%sub_type == 'stddev' &
662 .OR. this%sub_type == 'stddevnm1') THEN
663 this%stat_info%percentile = rmiss
664 ELSE IF (this%sub_type == 'max') THEN
665 this%stat_info%percentile = 101.
666 ELSE IF (this%sub_type == 'min') THEN
667 this%stat_info%percentile = -1.
668 ELSE IF (this%sub_type == 'percentile') THEN
669 IF (.NOT.c_e(this%stat_info%percentile)) THEN
670 CALL l4f_category_log(this%category,l4f_error,trim(this%trans_type)// &
671 ':percentile: percentile value not provided')
672 CALL raise_fatal_error()
673 ELSE IF (this%stat_info%percentile >= 100.) THEN
674 this%sub_type = 'max'
675 ELSE IF (this%stat_info%percentile <= 0.) THEN
676 this%sub_type = 'min'
678 ELSE IF (this%sub_type == 'frequency') THEN
679 IF (.NOT.c_e(this%interval_info%gt) .AND. .NOT.c_e(this%interval_info%gt)) THEN
680 CALL l4f_category_log(this%category,l4f_error,trim(this%trans_type)// &
681 ':frequency: lower and/or upper limit not provided')
682 CALL raise_fatal_error()
685 CALL sub_type_error()
689 ELSE IF (this%trans_type == 'maskgen') THEN
691 IF (this%sub_type == 'poly') THEN
693 IF (this%poly%arraysize <= 0) THEN
694 CALL l4f_category_log(this%category,l4f_error, "maskgen:poly poly parameter missing or empty")
695 CALL raise_fatal_error()
698 ELSE IF (this%sub_type == 'grid') THEN
702 CALL sub_type_error()
706 ELSE IF (this%trans_type == 'vertint') THEN
708 IF (this%vertint%input_levtype == vol7d_level_miss) THEN
709 CALL l4f_category_log(this%category,l4f_error, &
710 'vertint parameter input_levtype not provided')
711 CALL raise_fatal_error()
714 IF (this%vertint%output_levtype == vol7d_level_miss) THEN
715 CALL l4f_category_log(this%category,l4f_error, &
716 'vertint parameter output_levtype not provided')
717 CALL raise_fatal_error()
720 IF (this%sub_type == 'linear' .OR. this%sub_type == 'linearsparse') THEN
723 CALL sub_type_error()
727 ELSE IF (this%trans_type == 'metamorphosis') THEN
729 IF (this%sub_type == 'all') THEN
731 ELSE IF (this%sub_type == 'coordbb') THEN
733 IF (c_e(this%rect_coo%ilon) .AND. c_e(this%rect_coo%ilat) .AND. &
734 c_e(this%rect_coo%flon) .AND. c_e(this%rect_coo%flat)) THEN
737 CALL l4f_category_log(this%category,l4f_error, "metamorphosis: coordbb parameters missing")
738 CALL raise_fatal_error()
742 ELSE IF (this%sub_type == 'poly') THEN
744 IF (this%poly%arraysize <= 0) THEN
745 CALL l4f_category_log(this%category,l4f_error, "metamorphosis:poly: poly parameter missing or empty")
746 CALL raise_fatal_error()
749 ELSE IF (this%sub_type == 'mask' .OR. this%sub_type == 'maskvalid' .OR. &
750 this%sub_type == 'maskinvalid' .OR. this%sub_type == 'setinvalidto' .OR. &
751 this%sub_type == 'settoinvalid') THEN
754 CALL sub_type_error()
759 CALL trans_type_error()
765 SUBROUTINE sub_type_error()
767 CALL l4f_category_log(this%category, l4f_error, trim(this%trans_type) &
768 // ': sub_type '//trim(this%sub_type)// ' is not defined')
769 CALL raise_fatal_error()
771 END SUBROUTINE sub_type_error
773 SUBROUTINE trans_type_error()
775 CALL l4f_category_log(this%category, l4f_error, 'trans_type '//this%trans_type &
777 CALL raise_fatal_error()
779 END SUBROUTINE trans_type_error
782 END SUBROUTINE transform_init
788 SUBROUTINE transform_delete(this)
789 TYPE(transform_def), INTENT(inout) :: this
791 this%trans_type=cmiss
794 this%rect_ind%ix=imiss
795 this%rect_ind%iy=imiss
796 this%rect_ind%fx=imiss
797 this%rect_ind%fy=imiss
799 this%rect_coo%ilon=dmiss
800 this%rect_coo%ilat=dmiss
801 this%rect_coo%flon=dmiss
802 this%rect_coo%flat=dmiss
804 this%box_info%npx=imiss
805 this%box_info%npy=imiss
810 CALL l4f_category_delete(this%category)
812 END SUBROUTINE transform_delete
816 SUBROUTINE transform_get_val(this, time_definition, trans_type, sub_type, &
817 input_levtype, output_levtype)
818 type(transform_def), intent(in) :: this
819 INTEGER, INTENT(out), OPTIONAL :: time_definition
820 CHARACTER(len=*), INTENT(out), OPTIONAL :: trans_type
821 CHARACTER(len=*), INTENT(out), OPTIONAL :: sub_type
822 TYPE(vol7d_level), INTENT(out), OPTIONAL :: input_levtype
824 TYPE(vol7d_level), INTENT(out), OPTIONAL :: output_levtype
827 IF ( PRESENT(time_definition)) time_definition=this%time_definition
828 IF ( PRESENT(trans_type)) trans_type = this%trans_type
829 IF ( PRESENT(sub_type)) sub_type = this%sub_type
830 IF ( PRESENT(input_levtype)) input_levtype = this%vertint%input_levtype
831 IF ( PRESENT(output_levtype)) output_levtype = this%vertint%output_levtype
834 END SUBROUTINE transform_get_val
880 SUBROUTINE grid_transform_levtype_levtype_init(this, trans, lev_in, lev_out, &
881 coord_3d_in, categoryappend)
882 TYPE(grid_transform), INTENT(out) :: this
883 TYPE(transform_def), INTENT(in) :: trans
884 TYPE(vol7d_level), INTENT(in) :: lev_in(:)
885 TYPE(vol7d_level), INTENT(in) :: lev_out(:)
886 REAL, INTENT(inout), OPTIONAL, ALLOCATABLE :: coord_3d_in(:,:,:)
887 CHARACTER(len=*), INTENT(in), OPTIONAL :: categoryappend
889 DOUBLE PRECISION :: coord_in(SIZE(lev_in))
890 DOUBLE PRECISION, ALLOCATABLE :: coord_out(:)
891 LOGICAL :: mask_in(SIZE(lev_in))
892 LOGICAL, ALLOCATABLE :: mask_out(:)
894 INTEGER :: i, j, icache, inused, istart, iend, ostart, oend
897 CALL grid_transform_init_common(this, trans, categoryappend)
899 CALL l4f_category_log(this%category, l4f_debug, "grid_transform vertint")
902 IF (this%trans%trans_type == 'vertint') THEN
904 IF (c_e(trans%vertint%input_levtype%level2) .AND. &
905 trans%vertint%input_levtype%level1 /= trans%vertint%input_levtype%level2) THEN
906 CALL l4f_category_log(this%category, l4f_error, &
907 'vertint: input upper and lower surface must be of the same type, '// &
908 t2c(trans%vertint%input_levtype%level1)// '/='// &
909 t2c(trans%vertint%input_levtype%level2))
913 IF (c_e(trans%vertint%output_levtype%level2) .AND. &
914 trans%vertint%output_levtype%level1 /= trans%vertint%output_levtype%level2) THEN
915 CALL l4f_category_log(this%category, l4f_error, &
916 'vertint: output upper and lower surface must be of the same type'// &
917 t2c(trans%vertint%output_levtype%level1)// '/='// &
918 t2c(trans%vertint%output_levtype%level2))
923 mask_in(:) = (lev_in(:)%level1 == trans%vertint%input_levtype%level1) .AND. &
924 (lev_in(:)%level2 == trans%vertint%input_levtype%level2)
925 CALL make_vert_coord(lev_in, mask_in, coord_in, dolog)
926 this%innz = SIZE(lev_in)
927 istart = firsttrue(mask_in)
928 iend = lasttrue(mask_in)
929 inused = iend - istart + 1
930 IF (inused /= count(mask_in)) THEN
931 CALL l4f_category_log(this%category, l4f_error, &
932 'grid_transform_levtype_levtype_init: input levels badly sorted '//&
933 t2c(inused)// '/'//t2c(count(mask_in)))
937 this%levshift = istart-1
938 this%levused = inused
940 IF (trans%vertint%input_levtype%level1 /= trans%vertint%output_levtype%level1) THEN
942 CALL l4f_category_log(this%category, l4f_debug, &
943 'vertint: different input and output level types '// &
944 t2c(trans%vertint%input_levtype%level1)// ' '// &
945 t2c(trans%vertint%output_levtype%level1))
948 ALLOCATE(mask_out( SIZE(lev_out)), this%vcoord_out( SIZE(lev_out)))
949 mask_out(:) = (lev_out(:)%level1 == trans%vertint%output_levtype%level1) .AND. &
950 (lev_out(:)%level2 == trans%vertint%output_levtype%level2)
951 CALL make_vert_coord(lev_out, mask_out, this%vcoord_out, dolog)
952 this%outnz = SIZE(mask_out)
955 IF (.NOT. PRESENT(coord_3d_in)) THEN
956 CALL l4f_category_log(this%category, l4f_warn, &
957 'vertint: different input and output level types &
958 &and no coord_3d_in, expecting vert. coord. in volume')
961 IF ( SIZE(coord_3d_in,3) /= inused) THEN
962 CALL l4f_category_log(this%category, l4f_error, &
963 'vertint: vertical size of coord_3d_in (vertical coordinate) &
964 &different from number of input levels suitable for interpolation')
965 CALL l4f_category_log(this%category, l4f_error, &
966 'coord_3d_in: '//t2c( SIZE(coord_3d_in,3))// &
967 ', input levels for interpolation: '//t2c(inused))
972 CALL move_alloc(coord_3d_in, this%coord_3d_in)
974 WHERE(c_e(this%coord_3d_in) .AND. this%coord_3d_in > 0.0)
975 this%coord_3d_in = log(this%coord_3d_in)
|