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
00030
00031
00032
00033
00034 subroutine psmile_init_enddef_field_info (field_info)
00035 use psmile_common, only : enddef_field_info, &
00036 psmile_undef
00037
00038 implicit none
00039
00040 type (enddef_field_info), intent (out) :: field_info
00041
00042 field_info%tgt_method_id = psmile_undef
00043 field_info%tgt_var_id = psmile_undef
00044 field_info%tgt_mask_id = psmile_undef
00045 field_info%transient_in_id = psmile_undef
00046 field_info%transient_out_id = psmile_undef
00047 field_info%requires_conserv_remap = psmile_undef
00048
00049 end subroutine psmile_init_enddef_field_info
00050
00051 subroutine psmile_pack_field_info (field_info, buffer, num_field_info)
00052 use psmile_common, only : enddef_field_info, nd_field_list
00053
00054 implicit none
00055
00056 integer, intent (in) :: num_field_info
00057 type (enddef_field_info), intent (in) :: field_info(num_field_info)
00058 integer, intent (out) :: buffer(nd_field_list, num_field_info)
00059
00060 integer :: i
00061
00062 do i = 1, num_field_info
00063 buffer (1,i) = field_info(i)%tgt_method_id
00064 buffer (2,i) = field_info(i)%tgt_var_id
00065 buffer (3,i) = field_info(i)%tgt_mask_id
00066 buffer (4,i) = field_info(i)%transient_in_id
00067 buffer (5,i) = field_info(i)%transient_out_id
00068 buffer (6,i) = field_info(i)%requires_conserv_remap
00069
00070 #ifdef DEBUGX
00071 PRINT *, ' pack tgt_method_id ', buffer (1,i)
00072 PRINT *, ' pack tgt_var_id ', buffer (2,i)
00073 PRINT *, ' pack tgt_mask_id ', buffer (3,i)
00074 PRINT *, ' pack transient_in_id ', buffer (4,i)
00075 PRINT *, ' pack transient_out_id ', buffer (5,i)
00076 PRINT *, ' pack requires_conserv_remap ', buffer (6,i)
00077 #endif
00078 enddo
00079
00080 end subroutine psmile_pack_field_info
00081
00082 subroutine psmile_unpack_field_info (field_info, buffer, num_field_info)
00083 use psmile_common, only : enddef_field_info, nd_field_list
00084
00085 implicit none
00086
00087 integer, intent (in) :: num_field_info
00088 type (enddef_field_info), intent (out) :: field_info(num_field_info)
00089 integer, intent (in) :: buffer(nd_field_list, num_field_info)
00090
00091 integer :: i
00092
00093 do i = 1, num_field_info
00094 field_info(i)%tgt_method_id = buffer (1,i)
00095 field_info(i)%tgt_var_id = buffer (2,i)
00096 field_info(i)%tgt_mask_id = buffer (3,i)
00097 field_info(i)%transient_in_id = buffer (4,i)
00098 field_info(i)%transient_out_id = buffer (5,i)
00099 field_info(i)%requires_conserv_remap = buffer (6,i)
00100
00101 #ifdef DEBUGX
00102 PRINT *, ' unpack tgt_method_id ', buffer (1,i)
00103 PRINT *, ' unpack tgt_var_id ', buffer (2,i)
00104 PRINT *, ' unpack tgt_mask_id ', buffer (3,i)
00105 PRINT *, ' unpack transient_in_id ', buffer (4,i)
00106 PRINT *, ' unpack transient_out_id ', buffer (5,i)
00107 PRINT *, ' unpack requires_conserv_remap ', buffer (6,i)
00108 #endif
00109 enddo
00110
00111 end subroutine psmile_unpack_field_info
00112
00113 subroutine psmile_init_enddef_msg_inters (msg_intersections)
00114 use psmile_common, only : enddef_msg_intersections, &
00115 psmile_undef
00116
00117 implicit none
00118
00119 type (enddef_msg_intersections), intent (out) :: msg_intersections
00120
00121 call psmile_init_enddef_field_info (msg_intersections%field_info)
00122
00123 msg_intersections%tgt_comp_id = psmile_undef
00124 msg_intersections%src_comp_id = psmile_undef
00125 msg_intersections%tgt_grid_id = psmile_undef
00126 msg_intersections%src_grid_id = psmile_undef
00127 msg_intersections%first_tgt_all_extents_grid_id = psmile_undef
00128 msg_intersections%first_src_all_extents_grid_id = psmile_undef
00129 msg_intersections%method_type = psmile_undef
00130 msg_intersections%method_datatype = psmile_undef
00131 msg_intersections%all_comp_infos_comp_idx = psmile_undef
00132 msg_intersections%num_vars = psmile_undef
00133 msg_intersections%num_parts = psmile_undef
00134 msg_intersections%relative_msg_tag = psmile_undef
00135
00136 nullify (msg_intersections%intersections)
00137
00138 end subroutine psmile_init_enddef_msg_inters
00139
00140 subroutine psmile_pack_msg_intersections (msg_intersections, buffer)
00141 use psmile_common, only : enddef_msg_intersections, ndim_3d, &
00142 ip_msgint_inter, nd_msgint, psmile_undef
00143
00144 implicit none
00145
00146 type (enddef_msg_intersections), intent (in) :: msg_intersections
00147 integer, intent (out) :: buffer(nd_msgint)
00148
00149 integer :: npart, n
00150
00151 buffer = psmile_undef
00152
00153 buffer (1) = msg_intersections%src_comp_id
00154 buffer (2) = msg_intersections%first_src_all_extents_grid_id
00155 buffer (3) = msg_intersections%tgt_comp_id
00156 buffer (4) = msg_intersections%tgt_grid_id
00157 buffer (5) = msg_intersections%first_tgt_all_extents_grid_id
00158 buffer (6) = msg_intersections%field_info%tgt_method_id
00159 buffer (7) = msg_intersections%method_type
00160 buffer (8) = msg_intersections%method_datatype
00161 buffer (9) = msg_intersections%all_comp_infos_comp_idx
00162 buffer (10) = msg_intersections%field_info%tgt_var_id
00163 buffer (11) = msg_intersections%field_info%tgt_mask_id
00164 buffer (12) = msg_intersections%field_info%transient_in_id
00165 buffer (13) = msg_intersections%num_parts
00166 buffer (14) = msg_intersections%field_info%transient_out_id
00167 buffer (15) = msg_intersections%num_vars
00168 buffer (16) = msg_intersections%field_info%requires_conserv_remap
00169 buffer (17) = msg_intersections%relative_msg_tag
00170
00171 npart = msg_intersections%num_parts
00172
00173 if (npart > 0) then
00174
00175 do n = 1, npart
00176 buffer (ip_msgint_inter+1+(n-1)*2*ndim_3d:ip_msgint_inter+n*2*ndim_3d) = &
00177 pack (msg_intersections%intersections(n)%intersection, .true.)
00178 enddo
00179
00180 buffer (ip_msgint_inter+2*ndim_3d*npart+1:ip_msgint_inter+2*ndim_3d*npart+npart) = &
00181 msg_intersections%intersections(1:npart)%tgt_all_extents_grid_id
00182
00183 buffer (ip_msgint_inter+2*ndim_3d*npart+npart+1:ip_msgint_inter+2*ndim_3d*npart+2*npart) = &
00184 msg_intersections%intersections(1:npart)%src_all_extents_grid_id
00185
00186
00187 if (npart < size (msg_intersections%intersections)) then
00188
00189 buffer(ip_msgint_inter+2*ndim_3d*npart+2*npart+1) = msg_intersections%num_parts
00190
00191 do n = 1, size (msg_intersections%intersections) - npart
00192
00193 buffer(ip_msgint_inter+2*ndim_3d*npart+2*npart+2+(n-1)*2*ndim_3d: &
00194 ip_msgint_inter+2*ndim_3d*npart+2*npart+1+n*2*ndim_3d) = &
00195 pack (msg_intersections%intersections(n+npart)%intersection, .true.)
00196 enddo
00197 endif
00198 endif
00199 end subroutine psmile_pack_msg_intersections
00200
00201 subroutine psmile_unpack_msg_intersections (msg_intersections, buffer)
00202 use psmile_common, only : enddef_msg_intersections, ndim_3d, &
00203 ip_msgint_inter, nd_msgint, psmile_undef
00204
00205 implicit none
00206
00207 type (enddef_msg_intersections), intent (out) :: msg_intersections
00208 integer, intent (in) :: buffer(nd_msgint)
00209
00210 integer :: n, npart, npart_alloc
00211
00212 msg_intersections%src_comp_id = buffer (1)
00213 msg_intersections%first_src_all_extents_grid_id = buffer (2)
00214 msg_intersections%tgt_comp_id = buffer (3)
00215 msg_intersections%tgt_grid_id = buffer (4)
00216 msg_intersections%first_tgt_all_extents_grid_id = buffer (5)
00217 msg_intersections%field_info%tgt_method_id = buffer (6)
00218 msg_intersections%method_type = buffer (7)
00219 msg_intersections%method_datatype = buffer (8)
00220 msg_intersections%all_comp_infos_comp_idx = buffer (9)
00221 msg_intersections%field_info%tgt_var_id = buffer (10)
00222 msg_intersections%field_info%tgt_mask_id = buffer (11)
00223 msg_intersections%field_info%transient_in_id = buffer (12)
00224 msg_intersections%num_parts = buffer (13)
00225 msg_intersections%field_info%transient_out_id = buffer (14)
00226 msg_intersections%num_vars = buffer (15)
00227 msg_intersections%field_info%requires_conserv_remap = buffer (16)
00228 msg_intersections%relative_msg_tag = buffer (17)
00229
00230 npart = msg_intersections%num_parts
00231
00232
00233 if (buffer(ip_msgint_inter+2*ndim_3d*npart+2*npart+1) == buffer (13)) then
00234 npart_alloc = 2 * npart
00235 else
00236 npart_alloc = npart
00237 endif
00238
00239 if (npart > 0) then
00240
00241 allocate (msg_intersections%intersections(npart_alloc))
00242
00243 do n = 1, msg_intersections%num_parts
00244 msg_intersections%intersections(n)%intersection = &
00245 reshape (buffer(ip_msgint_inter+1+(n-1)*2*ndim_3d:ip_msgint_inter+n*2*ndim_3d), &
00246 (/2,ndim_3d/))
00247 enddo
00248
00249 msg_intersections%intersections(1:npart)%tgt_all_extents_grid_id = &
00250 buffer (ip_msgint_inter+2*ndim_3d*npart+1:ip_msgint_inter+2*ndim_3d*npart+npart)
00251
00252 msg_intersections%intersections(1:npart)%src_all_extents_grid_id = &
00253 buffer (ip_msgint_inter+2*ndim_3d*npart+npart+1:ip_msgint_inter+2*ndim_3d*npart+2*npart)
00254
00255
00256 if (npart /= npart_alloc) then
00257
00258 msg_intersections%intersections(npart+1:npart_alloc)%tgt_all_extents_grid_id = psmile_undef
00259 msg_intersections%intersections(npart+1:npart_alloc)%src_all_extents_grid_id = psmile_undef
00260
00261 do n = 1, msg_intersections%num_parts
00262
00263 msg_intersections%intersections(n+npart)%intersection = &
00264 reshape (buffer(ip_msgint_inter+2*ndim_3d*npart+2*npart+2+(n-1)*2*ndim_3d: &
00265 ip_msgint_inter+2*ndim_3d*npart+2*npart+1+n*2*ndim_3d), &
00266 (/2,ndim_3d/))
00267 enddo
00268 endif
00269
00270 else
00271
00272 nullify (msg_intersections%intersections)
00273
00274 endif
00275
00276 end subroutine psmile_unpack_msg_intersections
00277
00278 subroutine psmile_copy_msg_intersections (msg_intersections_to, &
00279 msg_intersections_from)
00280 use psmile_common, only : enddef_msg_intersections
00281
00282 implicit none
00283
00284 type (enddef_msg_intersections), intent (in) :: msg_intersections_from
00285 type (enddef_msg_intersections), intent (out) :: msg_intersections_to
00286
00287 msg_intersections_to = msg_intersections_from
00288
00289 nullify (msg_intersections_to%intersections)
00290
00291 allocate (msg_intersections_to%intersections (size (msg_intersections_from%intersections)))
00292
00293 msg_intersections_to%intersections = msg_intersections_from%intersections
00294
00295 end subroutine psmile_copy_msg_intersections