00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
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(:)
00039 double precision, pointer :: nd_array_dble(:)
00040 double precision, pointer :: rd_array_dble(:)
00041 real, pointer :: st_array_real(:)
00042 real, pointer :: nd_array_real(:)
00043 real, pointer :: rd_array_real(:)
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
00416 nullify (grid_data, point_data, mask_data, var_data)
00417
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