psmile_user_data.F90

Go to the documentation of this file.
00001 !-----------------------------------------------------------------------
00002 ! Copyright 2010, DKRZ, Hamburg, Germany.
00003 ! All rights reserved. Use is subject to OASIS4 license terms.
00004 !-----------------------------------------------------------------------
00005 !
00006 ! !DESCRIPTION:
00007 !
00008 ! Module psmile_user_data stores the information provided by the user
00009 ! (e.g. grid, corners, masks). This data is then preprocessed before
00010 ! psmile internal data structures (e.g. Fields, Grids) are generated
00011 ! from this.
00012 ! The preprocessing is required in order to avoid problems that
00013 ! occurred when multiple blocks per partition were defined.
00014 !
00015 !
00016 ! !REVISION HISTORY:
00017 !
00018 !   Date      Programmer   Description
00019 ! ----------  ----------   -----------
00020 ! 22.10.10    M. Hanke     created
00021 !
00022 !----------------------------------------------------------------------
00023 !
00024 !  $Id: psmile_user_data.F90 2769 2010-11-23 14:49:21Z hanke $
00025 !  $Author: hanke $
00026 !
00027 !----------------------------------------------------------------------
00028 
00029 module psmile_user_data
00030 
00031    use psmile_common, only : max_name
00032    use psmile_multimap, only : multimap, init_multimap
00033 
00034    implicit none
00035 
00036    type user_coordinate_data
00037       integer, pointer :: actual_shape(:,:)
00038       double precision, pointer :: st_array_dble(:) ! first
00039       double precision, pointer :: nd_array_dble(:) ! second
00040       double precision, pointer :: rd_array_dble(:) ! third
00041       real, pointer :: st_array_real(:) ! first
00042       real, pointer :: nd_array_real(:) ! second
00043       real, pointer :: rd_array_real(:) ! third
00044    end type user_coordinate_data
00045 
00046    type user_grid_data
00047       character(len=max_name) :: grid_name
00048       integer :: comp_id
00049       integer, pointer :: grid_valid_shape(:,:)
00050       integer :: grid_type
00051 
00052       integer :: nbr_corners
00053       type(user_coordinate_data) :: corners
00054 
00055       integer, pointer :: nbr_points_per_lat(:)
00056 
00057       integer, pointer :: partition_array(:,:)
00058       integer, pointer :: extent_array(:,:)
00059    end type user_grid_data
00060 
00061    type user_point_data
00062       integer :: grid_id
00063       type(user_coordinate_data) :: points
00064       character(len=max_name) :: name
00065    end type user_point_data
00066 
00067    type user_mask_data
00068       integer :: grid_id
00069       integer, pointer :: mask_actual_shape(:,:)
00070       logical, pointer :: mask(:)
00071    end type user_mask_data
00072 
00073    type user_var_data
00074       character(len=max_name) :: var_name
00075       integer :: point_id
00076       integer :: mask_id
00077       integer, pointer :: var_actual_shape(:,:)
00078       integer :: var_type
00079    end type user_var_data
00080 
00081    type(user_grid_data), pointer  :: grid_data(:)
00082    type(user_point_data), pointer :: point_data(:)
00083    type(user_mask_data), pointer  :: mask_data(:)
00084    type(user_var_data), pointer   :: var_data(:)
00085 
00086    type(multimap) :: grid_id_map
00087    type(multimap) :: mask_id_map
00088    type(multimap) :: point_id_map
00089    type(multimap) :: var_id_map
00090 
00091    interface
00092       subroutine psmile_store_data_grid (grid_id, grid_name,        &
00093                                          comp_id, grid_valid_shape, &
00094                                          grid_type, ierror)
00095 
00096          integer, intent(out)         :: grid_id
00097          character(len=*), intent(in) :: grid_name
00098          integer, intent(in)          :: comp_id
00099          integer, intent(in)          :: grid_valid_shape (2, *)
00100          integer, intent(in)          :: grid_type
00101          integer, intent(out)         :: ierror
00102       end subroutine psmile_store_data_grid
00103 
00104       subroutine psmile_store_data_partition (grid_id, nbr_blocks, &
00105                                               partition_array,     &
00106                                               extent_array, ierror)
00107 
00108          integer, intent (in)  :: grid_id
00109          integer, intent (in)  :: nbr_blocks
00110          integer, intent (in)  :: partition_array(1:nbr_blocks,*)
00111          integer, intent (in)  :: extent_array(1:nbr_blocks,*)
00112          integer, intent (out) :: ierror
00113       end subroutine psmile_store_data_partition
00114 
00115       subroutine psmile_store_data_reducedgrid (grid_id, nbr_latitudes, &
00116                                                 nbr_points_per_lat, ierror)
00117 
00118          integer, intent (in)                :: grid_id
00119          integer, intent (in)                :: nbr_latitudes
00120          integer, intent (in)                :: nbr_points_per_lat(nbr_latitudes)
00121          integer, intent (out)               :: ierror
00122       end subroutine psmile_store_data_reducedgrid
00123 
00124       subroutine psmile_store_data_corner_3d_db (       &
00125             grid_id, nbr_corners, corners_actual_shape, &
00126             corners_1st_array,corners_2nd_array,        &
00127             corners_3rd_array, array_size, ierror)
00128 
00129          integer, intent (in)          :: grid_id
00130          integer, intent (in)          :: nbr_corners
00131          double precision, intent (in) :: corners_1st_array (*)
00132          double precision, intent (in) :: corners_2nd_array (*)
00133          double precision, intent (in) :: corners_3rd_array (*)
00134          integer, intent (in)          :: array_size (3)
00135          integer, intent (in)          :: corners_actual_shape (1:2, *)
00136          integer, intent(out)          :: ierror
00137       end subroutine psmile_store_data_corner_3d_db
00138 
00139       subroutine psmile_store_data_corner_3d_re (       &
00140             grid_id, nbr_corners, corners_actual_shape, &
00141             corners_1st_array,corners_2nd_array,        &
00142             corners_3rd_array, array_size, ierror)
00143 
00144          integer, intent (in) :: grid_id
00145          integer, intent (in) :: nbr_corners
00146          real, intent (in)    :: corners_1st_array (*)
00147          real, intent (in)    :: corners_2nd_array (*)
00148          real, intent (in)    :: corners_3rd_array (*)
00149          integer, intent (in) :: array_size (3)
00150          integer, intent (in) :: corners_actual_shape (1:2, *)
00151          integer, intent(out) :: ierror
00152       end subroutine psmile_store_data_corner_3d_re
00153 
00154       subroutine psmile_store_data_points_3d_db(point_id, point_name, grid_id,         &
00155                                                 points_actual_shape, points_1st_array, &
00156                                                 points_2nd_array, points_3rd_array,    &
00157                                                 array_size, new_points, ierror)
00158          character (len=*), intent(in)                :: point_name
00159          integer,           intent(in)                :: grid_id
00160          integer,           intent(inout)             :: point_id
00161          double precision,  intent(in), dimension (*) :: points_1st_array, points_2nd_array, points_3rd_array
00162          integer,           intent(in)                :: points_actual_shape (2, *)
00163          integer,           intent(in)                :: array_size(3)
00164          logical,           intent(in)                :: new_points
00165          integer,           intent(out)               :: ierror
00166       end subroutine psmile_store_data_points_3d_db
00167 
00168       subroutine psmile_store_data_points_3d_re(point_id, point_name, grid_id,         &
00169                                                 points_actual_shape, points_1st_array, &
00170                                                 points_2nd_array, points_3rd_array,    &
00171                                                 array_size, new_points, ierror)
00172          character (len=*), intent(in)    :: point_name
00173          integer,           intent(in)    :: grid_id
00174          integer,           intent(inout) :: point_id
00175          real,  intent(in), dimension (*) :: points_1st_array, points_2nd_array, points_3rd_array
00176          integer,           intent(in)    :: points_actual_shape (2, *)
00177          integer,           intent(in)    :: array_size(3)
00178          logical,           intent(in)    :: new_points
00179          integer,           intent(out)   :: ierror
00180       end subroutine psmile_store_data_points_3d_re
00181 
00182       subroutine psmile_store_data_points_grless(point_id, point_name, grid_id, &
00183                                                    new_points, ierror)
00184          integer,           intent(inout) :: point_id
00185          character (len=*), intent(in)    :: point_name
00186          integer,           intent(in)    :: grid_id
00187          logical,           intent(in)    :: new_points
00188          integer,           intent(out)   :: ierror
00189       end subroutine psmile_store_data_points_grless
00190 
00191       subroutine psmile_store_data_mask (mask_id, grid_id, mask_actual_shape, &
00192                                           mask_array, new_mask, ierror)
00193             integer, intent(inout)       :: mask_id
00194             integer, intent(in)          :: grid_id
00195             integer, intent(in)          :: mask_actual_shape(2, *)
00196             logical, intent(in)          :: mask_array (*)
00197             logical, intent(in)          :: new_mask
00198             integer, intent(out)         :: ierror
00199       end subroutine psmile_store_data_mask
00200 
00201       subroutine psmile_store_data_rm_mask (mask_id, ierror)
00202          integer, intent(in)  :: mask_id
00203          integer, intent(out) :: ierror
00204       end subroutine psmile_store_data_rm_mask
00205 
00206       subroutine psmile_store_data_var (var_id, name, grid_id, point_id, mask_id, &
00207                               var_nodims, var_actual_shape, var_type, ierror )
00208          integer, intent(out)          :: var_id
00209          character (len=*), intent(in) :: name
00210          integer, intent(in)           :: grid_id
00211          integer, intent(in)           :: point_id
00212          integer, intent(in)           :: mask_id
00213          integer, intent(in)           :: var_nodims(2)
00214          integer, intent(in)           :: var_actual_shape(1:2, 1:var_nodims(1)+var_nodims(2))
00215          integer, intent(in)           :: var_type
00216          integer, intent(out)          :: ierror
00217       end subroutine psmile_store_data_var
00218 
00219       subroutine psmile_apply_user_data(ierror)
00220          integer, intent (out) :: ierror
00221       end subroutine psmile_apply_user_data
00222 
00223       subroutine psmile_merge_fields(ierror)
00224          integer, intent (out) :: ierror
00225       end subroutine psmile_merge_fields
00226 
00227       subroutine psmile_store_data_intern_field(psmile_var_id)
00228          integer, intent (in) :: psmile_var_id
00229       end subroutine psmile_store_data_intern_field
00230 
00231       subroutine psmile_store_data_intern_points(psmile_point_id)
00232          integer, intent (in) :: psmile_point_id
00233       end subroutine psmile_store_data_intern_points
00234 
00235    end interface
00236 
00237    contains
00238 
00239    function get_grid_type (grid_id)
00240 
00241       integer, intent (in) :: grid_id
00242       integer :: get_grid_type
00243 
00244       get_grid_type = grid_data(grid_id)%grid_type
00245    end function get_grid_type
00246 
00247    function get_grid_id (point_id)
00248 
00249       integer, intent (in) :: point_id
00250       integer :: get_grid_id
00251 
00252       get_grid_id = point_data(point_id)%grid_id
00253    end function get_grid_id
00254 
00255    function get_comp_id (grid_id)
00256 
00257       integer, intent (in) :: grid_id
00258       integer :: get_comp_id
00259 
00260       get_comp_id = grid_data(grid_id)%comp_id
00261    end function get_comp_id
00262 
00263    function get_grid_valid_shape(grid_id, size_of_valid_shape)
00264 
00265       integer, intent(in) :: grid_id, size_of_valid_shape(2)
00266       integer :: get_grid_valid_shape (size_of_valid_shape(1), 
00267                                        size_of_valid_shape(2))
00268 
00269       get_grid_valid_shape = grid_data(grid_id)%grid_valid_shape
00270    end function get_grid_valid_shape
00271 
00272    subroutine test_user_grid_id(user_grid_id, ierror)
00273       use prism_constants, only : PRISM_Error_Arg
00274 
00275       integer, intent(in)  :: user_grid_id
00276       integer, intent(out) :: ierror
00277 
00278       ierror = 0
00279 
00280       if (.not. associated (grid_data)) ierror = PRISM_Error_Arg
00281       if (ierror == 0 ) then
00282          if (user_grid_id > size(grid_data)) ierror = PRISM_Error_Arg
00283       endif
00284 
00285       if (ierror /= 0) then
00286          ierror = PRISM_Error_Arg
00287          call psmile_error ( PRISM_Error_Arg, 'grid_id', &
00288                            (/user_grid_id/), 1, __FILE__, __LINE__ )
00289          return
00290       endif
00291    end subroutine test_user_grid_id
00292 
00293    subroutine test_user_mask_id(user_mask_id, ierror)
00294       use prism_constants, only : PRISM_Error_Arg
00295 
00296       integer, intent(in)  :: user_mask_id
00297       integer, intent(out) :: ierror
00298 
00299       if (.not. associated (mask_data)) then
00300          continue
00301       else if (user_mask_id > size(mask_data))then
00302          continue
00303       else if (.not. associated (mask_data(user_mask_id)%mask_actual_shape) .or. &
00304                .not. associated (mask_data(user_mask_id)%mask)) then
00305          continue
00306       else
00307          ierror = 0
00308          return
00309       endif
00310 
00311       ierror = PRISM_Error_Arg
00312       call psmile_error ( PRISM_Error_Arg, 'mask_id', &
00313                         (/user_mask_id/), 1, __FILE__, __LINE__ )
00314    end subroutine test_user_mask_id
00315 
00316    subroutine test_user_point_id(user_point_id, ierror)
00317       use prism_constants, only : PRISM_Error_Arg
00318 
00319       integer, intent(in)  :: user_point_id
00320       integer, intent(out) :: ierror
00321 
00322       if (.not. associated (point_data)) then
00323          continue
00324       else if (user_point_id > size(point_data)) then
00325          continue
00326       else
00327          ierror = 0
00328          return
00329       endif
00330 
00331       ierror = PRISM_Error_Arg
00332       call psmile_error ( PRISM_Error_Arg, 'point_id', &
00333                         (/user_point_id/), 1, __FILE__, __LINE__ )
00334    end subroutine test_user_point_id
00335 
00336    subroutine init_user_coordinate_data(data)
00337 
00338       type (user_coordinate_data), intent(inout) :: data
00339 
00340       nullify (data%actual_shape)
00341       nullify (data%st_array_dble)
00342       nullify (data%nd_array_dble)
00343       nullify (data%rd_array_dble)
00344       nullify (data%st_array_real)
00345       nullify (data%nd_array_real)
00346       nullify (data%rd_array_real)
00347 
00348    end subroutine init_user_coordinate_data
00349 
00350    subroutine free_user_coordinate_data (data, ierror)
00351 
00352       type (user_coordinate_data), intent(inout) :: data
00353       integer, intent(out) :: ierror
00354 
00355       if (associated (data%actual_shape)) deallocate (data%actual_shape)
00356       if (associated (data%st_array_dble)) deallocate (data%st_array_dble)
00357       if (associated (data%nd_array_dble)) deallocate (data%nd_array_dble)
00358       if (associated (data%rd_array_dble)) deallocate (data%rd_array_dble)
00359       if (associated (data%st_array_real)) deallocate (data%st_array_real)
00360       if (associated (data%nd_array_real)) deallocate (data%nd_array_real)
00361       if (associated (data%rd_array_real)) deallocate (data%rd_array_real)
00362 
00363    end subroutine free_user_coordinate_data
00364 
00365    function partition_data_available (grid_id)
00366       integer, intent (in) :: grid_id
00367       logical :: partition_data_available
00368 
00369       integer :: ierror
00370 
00371       call test_user_grid_id (grid_id, ierror)
00372 
00373       partition_data_available = associated (grid_data(grid_id)%partition_array) .and. &
00374                                  associated (grid_data(grid_id)%extent_array)
00375    end function partition_data_available
00376 
00377    function reducedgrid_map_available (grid_id)
00378       integer, intent (in) :: grid_id
00379       logical :: reducedgrid_map_available
00380 
00381       integer :: ierror
00382 
00383       call test_user_grid_id (grid_id, ierror)
00384 
00385       reducedgrid_map_available = associated (grid_data(grid_id)%nbr_points_per_lat)
00386    end function reducedgrid_map_available
00387 
00388    subroutine generate_partition_data (grid_id)
00389 
00390       use psmile_grid, only : get_size_of_shape
00391 
00392       integer, intent (in) :: grid_id
00393 
00394       integer :: shape_size(2)
00395       integer :: ierror
00396 
00397       call test_user_grid_id (grid_id, ierror)
00398 
00399       if (.not. partition_data_available(grid_id)) then
00400 
00401          shape_size = get_size_of_shape(grid_data(grid_id)%grid_type)
00402 
00403          allocate (grid_data(grid_id)%partition_array(1,1:shape_size(2)), &
00404                    grid_data(grid_id)%extent_array(1,1:shape_size(2)))
00405 
00406          grid_data(grid_id)%partition_array(1, 1:shape_size(2)) = &
00407             grid_data(grid_id)%grid_valid_shape(1,1:shape_size(2)) - 1
00408          grid_data(grid_id)%extent_array(1, 1:shape_size(2)) = &
00409             grid_data(grid_id)%grid_valid_shape(2,1:shape_size(2)) - &
00410             grid_data(grid_id)%grid_valid_shape(1,1:shape_size(2)) + 1
00411       endif
00412    end subroutine generate_partition_data
00413 
00414    subroutine psmile_user_data_init()
00415       ! initialise internal data structures
00416       nullify (grid_data, point_data, mask_data, var_data)
00417       ! initialise the map structures
00418       call init_multimap(grid_id_map)
00419       call init_multimap(mask_id_map)
00420       call init_multimap(point_id_map)
00421       call init_multimap(var_id_map)
00422    end subroutine
00423 
00424 end module psmile_user_data

Generated on 18 Mar 2011 for Oasis4 by  doxygen 1.6.1