Revision 4c60c6b6c049f3ea16de61f103bbdebf7dc69847 authored by James Foucar on 05 October 2021, 21:08:29 UTC, committed by James Foucar on 05 October 2021, 21:08:29 UTC
1 parent 73c6273
seq_map_type_mod.F90
module seq_map_type_mod
use shr_kind_mod , only: R8 => SHR_KIND_R8, IN=>SHR_KIND_IN
use shr_kind_mod , only: CL => SHR_KIND_CL, CX => SHR_KIND_CX
use shr_mct_mod , only: shr_mct_sMatPInitnc, shr_mct_queryConfigFile
use shr_sys_mod
use shr_const_mod
use seq_comm_mct, only: logunit, CPLID, seq_comm_iamroot
use mct_mod
type seq_map
logical :: copy_only
logical :: rearrange_only
logical :: esmf_map
type(mct_rearr) :: rearr
type(mct_sMatp) :: sMatp
!
!---- for comparing
integer(IN) :: counter ! indicates which seq_maps this mapper points to
character(CL) :: strategy ! indicates the strategy for this mapper, (copy, rearrange, X, Y)
character(CX) :: mapfile ! indicates the mapping file used
type(mct_gsMap),pointer :: gsmap_s
type(mct_gsMap),pointer :: gsmap_d
!
!---- for cart3d
character(CL) :: cart3d_init
real(R8), pointer :: slon_s(:)
real(R8), pointer :: clon_s(:)
real(R8), pointer :: slat_s(:)
real(R8), pointer :: clat_s(:)
real(R8), pointer :: slon_d(:)
real(R8), pointer :: clon_d(:)
real(R8), pointer :: slat_d(:)
real(R8), pointer :: clat_d(:)
integer(IN) :: mpicom ! mpicom
!
end type seq_map
public seq_map
!--------------------------------------------------------------------------
! Private data
!--------------------------------------------------------------------------
! seq_map_maxcnt is the total number of mappings supported
! seq_map_cnt is the total number of mappings initialized any any time
! seq_maps are the mappers that have been initialized
integer(IN),parameter :: seq_map_maxcnt = 5000
integer(IN) :: seq_map_cnt = 0
type(seq_map),private,target :: seq_maps(seq_map_maxcnt)
! tcraig, work-in-progress
! type seq_map_node
! type(seq_map_node), pointer :: next,prev
! type(seq_map), pointer :: seq_map
! end type seq_map_node
! type(seq_map_node), pointer :: seq_map_list, seq_map_curr
!===============================================================================
contains
!===============================================================================
subroutine seq_map_mapmatch(mapid,gsMap_s,gsMap_d,mapfile,strategy)
! This method searches through the current seq_maps to find a
! mapping file that matches the values passed in
implicit none
integer ,intent(out) :: mapid
type(mct_gsMap) ,intent(in),optional :: gsMap_s
type(mct_gsMap) ,intent(in),optional :: gsMap_d
character(len=*),intent(in),optional :: mapfile
character(len=*),intent(in),optional :: strategy
integer(IN) :: m
logical :: match
character(*),parameter :: subName = '(seq_map_mapmatch) '
mapid = -1
! tcraig - this return turns off the mapping reuse
! RETURN
do m = 1,seq_map_cnt
match = .true.
if (match .and. present(mapfile)) then
if (trim(mapfile) /= trim(seq_maps(m)%mapfile)) match = .false.
endif
if (match .and. present(strategy)) then
if (trim(strategy) /= trim(seq_maps(m)%strategy)) match = .false.
endif
if (match .and. present(gsMap_s)) then
if (.not.mct_gsmap_Identical(gsmap_s,seq_maps(m)%gsmap_s)) match = .false.
endif
if (match .and. present(gsMap_d)) then
if (.not.mct_gsmap_Identical(gsmap_d,seq_maps(m)%gsmap_d)) match = .false.
endif
if (match) then
mapid = m
if (seq_comm_iamroot(CPLID)) then
write(logunit,'(A,i6)') subname//' found match ',mapid
call shr_sys_flush(logunit)
endif
return
endif
enddo
end subroutine seq_map_mapmatch
!===============================================================================
subroutine seq_map_mapinit(mapper,mpicom)
! This method initializes a new seq_maps map datatype and
! has the mapper passed in point to it
implicit none
type(seq_map) ,intent(inout),pointer :: mapper
integer(IN) ,intent(in) :: mpicom
character(*),parameter :: subName = '(seq_map_mapinit) '
! set the seq_map data
seq_map_cnt = seq_map_cnt + 1
if (seq_map_cnt > seq_map_maxcnt) then
write(logunit,*) trim(subname),'seq_map_cnt too large',seq_map_cnt
call shr_sys_abort(subName // "seq_map_cnt bigger than seq_map_maxcnt")
endif
mapper => seq_maps(seq_map_cnt)
mapper%counter = seq_map_cnt
mapper%copy_only = .false.
mapper%rearrange_only = .false.
mapper%mpicom = mpicom
mapper%strategy = "undefined"
mapper%mapfile = "undefined"
end subroutine seq_map_mapinit
!===============================================================================
subroutine seq_map_mappoint(mapid,mapper)
! This method searches through the current seq_maps to find a
! mapping file that matches the values passed in
implicit none
integer ,intent(in) :: mapid
type(seq_map) ,intent(inout),pointer :: mapper
mapper => seq_maps(mapid)
end subroutine seq_map_mappoint
!===============================================================================
subroutine seq_map_gsmapcheck(gsmap1,gsmap2)
! This method verifies that two gsmaps are of the same global size
implicit none
type(mct_gsMap),intent(in) :: gsmap1
type(mct_gsMap),intent(in) :: gsmap2
integer(IN) :: s1, s2
character(*),parameter :: subName = '(seq_map_gsmapcheck) '
s1 = mct_gsMap_gsize(gsMap1)
s2 = mct_gsMap_gsize(gsMap2)
if (s1 /= s2) then
write(logunit,*) trim(subname),'gsmap global sizes different ',s1,s2
call shr_sys_abort(subName // "different gsmap size")
endif
end subroutine seq_map_gsmapcheck
end module seq_map_type_mod
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...