psmile_enddef_msg_inters_utils.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 ! This file contains routines for initiating objects of the derived
00009 ! type enddef_msg_intersections. In addition there are two routines
00010 ! which allow to convert between object from this type and a integer
00011 ! array which is sendable via MPI.
00012 ! Since the derived type enddef_field_info is closely related to
00013 ! enddef_msg_intersections the respective pack and unpack routines
00014 ! are also in this file.
00015 ! Since objects of type enddef_msg_intersections have a dynamical
00016 ! size it seems unpractically for me to create a MPI datatype for
00017 ! sending these objects.
00018 !
00019 !
00020 ! !REVISION HISTORY:
00021 !
00022 !   Date      Programmer   Description
00023 ! ----------  ----------   -----------
00024 ! 25.11.2010  M. Hanke     created
00025 ! 08.04.2011  M. Hanke     added routines for enddef_field_info
00026 !
00027 !----------------------------------------------------------------------
00028 !
00029 !  $Id: psmile_enddef_msg_inters_utils.F90 3119 2011-04-08 12:35:20Z hanke $
00030 !  $Author: hanke $
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 ! i
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 ! i
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       ! if there is additional data for gridless grids
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    ! In case we have a gridless grid npart is stored twice in buffer
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       ! if we have a gridless grid, then there is additional grid information in buffer
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

Generated on 1 Dec 2011 for Oasis4 by  doxygen 1.6.1