Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
e6c6918
Replace cray pointers with pointers with Fortran 2008 semantic in mpp…
foxtran Sep 10, 2025
188ac84
Add get_pointer_address function into mpp_mod
foxtran Sep 10, 2025
bcc257c
Avoid cray pointers in mpp_transmit_mpi.fh
foxtran Sep 10, 2025
a716f92
Avoid cray pointers in mpp_sum.inc
foxtran Sep 10, 2025
0cf691b
Avoid cray pointers in mpp_sum_ad.inc
foxtran Sep 10, 2025
0f240d4
Remove unused cray pointer in mpp_comm_mpi.inc
foxtran Sep 10, 2025
745c9ee
Format mpp_chksum_scalar.fh
foxtran Sep 10, 2025
f47aa1d
Remove cray pointer from mpp_chksum_scalar.fh
foxtran Sep 10, 2025
e7e0296
Collect lists of addresses without cray pointers
foxtran Sep 10, 2025
e3e1f13
Avoid cray pointers in mpp_update_nest_domains.fh
foxtran Sep 10, 2025
a4329ae
Remove cray pointers from mpp_update_domains2D.fh
foxtran Sep 10, 2025
d56f9b9
Remove cray pointers from mpp_get_boundary.fh and mpp_get_boundary_ad.fh
foxtran Sep 10, 2025
fe1fc0e
Remove cray pointers from mpp_update_domains2D_nonblock
foxtran Sep 10, 2025
575a4af
Remove cray pointers from mpp_update_domains2D_ad.fh
foxtran Sep 11, 2025
60e3885
Fix of missed round bracket
foxtran Sep 11, 2025
86c5668
Add byte kind
foxtran Sep 11, 2025
b436ea9
Remove cray pointers to mpp_domains_stakc and mpp_domains_stakc_nonblock
foxtran Sep 11, 2025
9e772c0
Add i1_kind
foxtran Sep 11, 2025
b733173
Remove strange wordlen
foxtran Sep 11, 2025
30dc328
Rename mpp_domains_stack{_nonblock} back
foxtran Sep 11, 2025
8088540
Remove cray pointers from mpp_globbal_field*
foxtran Sep 11, 2025
882e611
Remove cray pointers from mpp_global_reduce.fh
foxtran Sep 11, 2025
86a8cc1
Update mpp_do_updateV.fh
foxtran Sep 11, 2025
194b100
Update mpp_do_checkV.fh
foxtran Sep 11, 2025
34de0d4
Update mpp_update_domains2D.fh
foxtran Sep 11, 2025
b9a65c1
Update mpp_do_updateV_ad.fh
foxtran Sep 11, 2025
f626e51
Update mpp_update_domains2D_ad.fh
foxtran Sep 11, 2025
f72fe18
Update mpp_do_updateV_nonblock.fh
foxtran Sep 11, 2025
e34d07d
Use type(c_ptr) in nonblock_type
foxtran Sep 11, 2025
4bae8b9
Update mpp_do_update_nonblock.fh
foxtran Sep 11, 2025
0ab831d
Update mpp_update_domains2D_nonblock.fh
foxtran Sep 11, 2025
5b72592
Update mpp_do_get_boundary.fh
foxtran Sep 13, 2025
58c436b
Update mpp_do_get_boundary_ad.fh
foxtran Sep 13, 2025
0612d2d
Update mpp_get_boundary.fh
foxtran Sep 13, 2025
a57ac7e
Update mpp_get_boundary_ad.fh
foxtran Sep 13, 2025
5296b6f
Update mpp_do_update_nest.fh
foxtran Sep 13, 2025
1885e0e
Update mpp_update_nest_domains.fh
foxtran Sep 13, 2025
0a2cf04
Update mpp_do_update_ad.fh
foxtran Sep 13, 2025
9afddf4
Update mpp_update_domains2D_ad.fh
foxtran Sep 13, 2025
a88add7
Update mpp_do_check.fh
foxtran Sep 13, 2025
efeff62
Update mpp_do_update.fh
foxtran Sep 13, 2025
356d451
Update mpp_do_redistribute.fh
foxtran Sep 13, 2025
a1933b1
Update DomainCommunicator2D
foxtran Sep 13, 2025
8d2d0c3
Update mpp_domains_comm.inc
foxtran Sep 13, 2025
d908e38
Update mpp_update_domains2D.fh
foxtran Sep 13, 2025
43d8874
Do not use get_pointer_address in mpp_update_domains2D_nonblock.fh
foxtran Sep 13, 2025
ed8a5c1
Update mpp_unstruct_pass_data.fh
foxtran Sep 13, 2025
3840e8c
Update mpp_group_update_type
foxtran Sep 13, 2025
b5b9438
Update mpp_group_update.fh
foxtran Sep 13, 2025
d1e930a
Update test_mpp.F90
foxtran Sep 13, 2025
ebdab87
Remove get_pointer_address from mpp_update_domains2D.fh
foxtran Sep 13, 2025
08470ea
Make get_pointer_address public
foxtran Sep 13, 2025
737bd11
Compile without cray pointers :-)
foxtran Sep 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cmake/compiler_flags_GNU_Fortran.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ set(r8_flags "-fdefault-real-8 -fdefault-double-8") # Fortran flags for 64BIT pr
set(r4_flags "-fdefault-real-4") # Fortran flags for 32BIT precision

# GNU Fortran
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fcray-pointer -fallow-argument-mismatch -ffree-line-length-none")
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fallow-argument-mismatch -ffree-line-length-none")

set(CMAKE_Fortran_FLAGS_RELEASE "-O2")
set(CMAKE_Fortran_FLAGS_DEBUG "-O0 -g")
Expand Down
3 changes: 1 addition & 2 deletions cmake/compiler_flags_Intel_Fortran.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,11 @@ set(r4_flags "-real-size 32") # Fortran flags for 32BIT precision
set(r8_flags "-real-size 64") # Fortran flags for 64BIT precision

# Minimal set of flags for stand release and debug build types
set(CMAKE_Fortran_FLAGS "${RELEASE} -safe-cray-ptr")
set(CMAKE_Fortran_FLAGS_RELEASE "-O3")
set(CMAKE_Fortran_FLAGS_DEBUG "-g -O0")

# ufs flags to reproduce past behavior
set(ufs_flags_base "${CMAKE_Fortran_FLAGS} -fpp -fno-alias -auto -safe-cray-ptr -ftz -assume byterecl -align array64byte -nowarn -sox -traceback")
set(ufs_flags_base "${CMAKE_Fortran_FLAGS} -fpp -fno-alias -auto -ftz -assume byterecl -align array64byte -nowarn -sox -traceback")

set(CMAKE_Fortran_FLAGS_RELEASE "${ufs_flags_base} -O2 -debug minimal -fp-model source -nowarn -qoverride-limits -qno-opt-dynamic-align -qopt-prefetch=3")
set(CMAKE_Fortran_FLAGS_DEBUGUFS "${ufs_flags_base} -g -O0 -check -check noarg_temp_created -check nopointer -warn -warn noerrors -fpe0 -ftrapuv")
Expand Down
7 changes: 5 additions & 2 deletions include/fms_platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,16 @@
!Set type kinds.
#ifdef PORTABLE_KINDS
use,intrinsic :: iso_fortran_env, only: real128
use,intrinsic :: iso_c_binding, only: c_double,c_float,c_int64_t, &
c_int32_t,c_int16_t,c_intptr_t
use,intrinsic :: iso_c_binding, only: c_double,c_float, &
c_int64_t,c_int32_t,c_int16_t, &
c_int8_t,c_intptr_t
#define QUAD_KIND real128
#define DOUBLE_KIND c_double
#define FLOAT_KIND c_float
#define LONG_KIND c_int64_t
#define INT_KIND c_int32_t
#define SHORT_KIND c_int16_t
#define BYTE_KIND c_int8_t
#define POINTER_KIND c_intptr_t
#else
!These values are not necessarily portable.
Expand All @@ -42,6 +44,7 @@ use,intrinsic :: iso_c_binding, only: c_double,c_float,c_int64_t, &
#define LONG_KIND 8
#define INT_KIND 4
#define SHORT_KIND 2
#define BYTE_KIND 1
#define POINTER_KIND 8
!DEC$ MESSAGE:'Using 8-byte addressing'
#endif
Expand Down
106 changes: 70 additions & 36 deletions mpp/include/group_update_pack.inc

Large diffs are not rendered by default.

28 changes: 18 additions & 10 deletions mpp/include/group_update_unpack.inc
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,19 @@
!***********************************************************************

if( group%k_loop_inside ) then
!$OMP parallel do default(none) shared(nunpack,group,nscalar,ptr,nvector,ksize,buffer_start_pos) &
!$OMP parallel do default(none) &
!$OMP shared(nunpack,group,nscalar,buffer,nvector,ksize,buffer_start_pos,shape_f,shape_x,shape_y) &
!$OMP private(buffer_pos,pos,m,is, ie, js, je,rotation, &
!$OMP ptr_field, ptr_fieldx, ptr_fieldy, n,k )
!$OMP field, fieldx, fieldy, tmpptr, n,k )
do n = nunpack, 1, -1
buffer_pos = group%unpack_buffer_pos(n) + buffer_start_pos
pos = buffer_pos
is = group%unpack_is(n); ie = group%unpack_ie(n)
js = group%unpack_js(n); je = group%unpack_je(n)
if( group%unpack_type(n) == FIELD_S ) then
do l=1,nscalar ! loop over number of fields
ptr_field = group%addrs_s(l)
call c_f_pointer(group%addrs_s(l), tmpptr, shape=shape_f)
field(group%is_s:group%ie_s,group%js_s:group%je_s, 1:group%ksize_s) => tmpptr
do k = 1, ksize
do j = js, je
do i = is, ie
Expand All @@ -39,7 +41,8 @@ if( group%k_loop_inside ) then
end do
else if( group%unpack_type(n) == FIELD_X ) then
do l=1,nvector ! loop over number of fields
ptr_fieldx = group%addrs_x(l)
call c_f_pointer(group%addrs_x(l), tmpptr, shape=shape_x)
fieldx(group%is_x:group%ie_x,group%js_x:group%je_x,1:group%ksize_v) => tmpptr
do k = 1, ksize
do j = js, je
do i = is, ie
Expand All @@ -51,7 +54,8 @@ if( group%k_loop_inside ) then
end do
else if( group%unpack_type(n) == FIELD_Y ) then
do l=1,nvector ! loop over number of fields
ptr_fieldy = group%addrs_y(l)
call c_f_pointer(group%addrs_y(l), tmpptr, shape=shape_y)
fieldy(group%is_y:group%ie_y,group%js_y:group%je_y,1:group%ksize_v) => tmpptr
do k = 1, ksize
do j = js, je
do i = is, ie
Expand All @@ -64,9 +68,10 @@ if( group%k_loop_inside ) then
endif
enddo
else
!$OMP parallel do default(none) shared(nunpack,group,nscalar,ptr,nvector,ksize,buffer_start_pos) &
!$OMP parallel do default(none) &
!$OMP shared(nunpack,group,nscalar,buffer,nvector,ksize,buffer_start_pos,shape_f,shape_x,shape_y) &
!$OMP private(buffer_pos,pos,m,is, ie, js, je,rotation, &
!$OMP ptr_field, ptr_fieldx, ptr_fieldy,n,k)
!$OMP field, fieldx, fieldy, tmpptr,n,k)
do nk = nunpack*ksize, 1, -1
n = (nk-1)/ksize + 1
k = mod((nk-1), ksize) + 1
Expand All @@ -76,7 +81,8 @@ else
js = group%unpack_js(n); je = group%unpack_je(n)
if( group%unpack_type(n) == FIELD_S ) then
do l=1,nscalar ! loop over number of fields
ptr_field = group%addrs_s(l)
call c_f_pointer(group%addrs_s(l), tmpptr, shape=shape_f)
field(group%is_s:group%ie_s,group%js_s:group%je_s, 1:group%ksize_s) => tmpptr
do j = js, je
do i = is, ie
pos = pos + 1
Expand All @@ -86,7 +92,8 @@ else
end do
else if( group%unpack_type(n) == FIELD_X ) then
do l=1,nvector ! loop over number of fields
ptr_fieldx = group%addrs_x(l)
call c_f_pointer(group%addrs_x(l), tmpptr, shape=shape_x)
fieldx(group%is_x:group%ie_x,group%js_x:group%je_x,1:group%ksize_v) => tmpptr
do j = js, je
do i = is, ie
pos = pos + 1
Expand All @@ -96,7 +103,8 @@ else
end do
else if( group%unpack_type(n) == FIELD_Y ) then
do l=1,nvector ! loop over number of fields
ptr_fieldy = group%addrs_y(l)
call c_f_pointer(group%addrs_y(l), tmpptr, shape=shape_y)
fieldy(group%is_y:group%ie_y,group%js_y:group%je_y,1:group%ksize_v) => tmpptr
do j = js, je
do i = is, ie
pos = pos + 1
Expand Down
20 changes: 10 additions & 10 deletions mpp/include/mpp_chksum_scalar.fh
Original file line number Diff line number Diff line change
Expand Up @@ -29,20 +29,20 @@
!! result is i8_kind, which will actually be int ifdef no_8byte_integers
!! mold and mask_val must be same numBytes, otherwise undefined behavior
function MPP_CHKSUM_( var, pelist, mask_val )
integer(i8_kind) :: MPP_CHKSUM_
MPP_TYPE_, intent(in) :: var
integer, intent(in), optional :: pelist(:)
integer(i8_kind) :: mold(1)
use, intrinsic :: iso_c_binding, only: c_f_pointer, c_loc
integer(i8_kind) :: MPP_CHKSUM_
MPP_TYPE_, target, intent(in) :: var
integer, intent(in), optional :: pelist(:)
MPP_TYPE_, intent(in), optional :: mask_val
pointer( p, mold )
integer(i8_kind), pointer :: mold(:)

p = LOC(var)
call c_f_pointer(c_loc(var), mold, [1])

if ( PRESENT(mask_val) ) then
MPP_CHKSUM_ = mpp_chksum( mold, pelist, TRANSFER(mask_val, mold(1)) )
MPP_CHKSUM_ = mpp_chksum( mold, pelist, TRANSFER(mask_val, mold(1)) )
else
MPP_CHKSUM_ = mpp_chksum( mold, pelist )
MPP_CHKSUM_ = mpp_chksum( mold, pelist )
end if
return
end function MPP_CHKSUM_
return
end function MPP_CHKSUM_
!> @}
3 changes: 0 additions & 3 deletions mpp/include/mpp_comm_mpi.inc
Original file line number Diff line number Diff line change
Expand Up @@ -326,8 +326,6 @@ end subroutine mpp_exit
integer, intent(in) :: from_pe !< pe to broadcast from
integer, intent(in), optional :: pelist(:) !< optional pelist to broadcast to
integer :: n, i, from_rank
character :: str1D(length*size(char_data(:)))
pointer(lptr, str1D)

if( .NOT.module_is_initialized )call mpp_error( FATAL, 'mpp_broadcast_text: You must first call mpp_init.' )
n = get_peset(pelist); if( peset(n)%count.EQ.1 )return
Expand All @@ -352,7 +350,6 @@ end subroutine mpp_exit
exit
endif
enddo
lptr = LOC (char_data)
if( mpp_npes().GT.1 ) call MPI_BCAST( char_data, length*size(char_data(:)), &
MPI_CHARACTER, from_rank, peset(n)%id, error )
if( debug .and. (current_clock.NE.0) )call increment_current_clock( EVENT_BROADCAST, length )
Expand Down
8 changes: 4 additions & 4 deletions mpp/include/mpp_data_mpi.inc
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ integer, parameter :: mpp_from_pe = -999, ptr_from = -999
!-------------------------------------------------------------------!
! The following data is used in mpp_domains_mod and its components !
!-------------------------------------------------------------------!
real(r8_kind), allocatable :: mpp_domains_stack(:) !< stack used to hold data for domain operations
real(r8_kind), allocatable :: mpp_domains_stack_nonblock(:) !< stack used for non-blocking domain operations
real(r8_kind), target, allocatable :: mpp_domains_stack(:) !< stack used to hold data for domain operations
real(r8_kind), target, allocatable :: mpp_domains_stack_nonblock(:) !< stack used for non-blocking domain operations
!--- some dummy variables with dummy values that will never be used
integer, parameter :: ptr_domains_stack = -999
integer, parameter :: ptr_domains_stack_nonblock = -999
type(c_ptr), parameter :: ptr_domains_stakc = c_null_ptr
type(c_ptr), parameter :: ptr_domains_stakc_nonblock = c_null_ptr
8 changes: 4 additions & 4 deletions mpp/include/mpp_data_nocomm.inc
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ integer, parameter :: mpp_from_pe = -999, ptr_from = -999
!-------------------------------------------------------------------!
! The following data is used in mpp_domains_mod and its components !
!-------------------------------------------------------------------!
real(r8_kind), allocatable :: mpp_domains_stack(:)
real(r8_kind), allocatable :: mpp_domains_stack_nonblock(:)
real(r8_kind), target, allocatable :: mpp_domains_stack(:)
real(r8_kind), target, allocatable :: mpp_domains_stack_nonblock(:)
!--- some dummy variables with dummy values that will never be used
integer, parameter :: ptr_domains_stack = -999
integer, parameter :: ptr_domains_stack_nonblock = -999
type(c_ptr), parameter :: ptr_domains_stakc = c_null_ptr
type(c_ptr), parameter :: ptr_domains_stakc_nonblock = c_null_ptr
29 changes: 18 additions & 11 deletions mpp/include/mpp_do_check.fh
Original file line number Diff line number Diff line change
Expand Up @@ -24,23 +24,24 @@

!> Updates data domain of 3D field whose computational domains have been computed
subroutine MPP_DO_CHECK_3D_( f_addrs, domain, check, d_type, ke, flags, name)
integer(i8_kind), intent(in) :: f_addrs(:,:)
use, intrinsic :: iso_c_binding, only: c_ptr, c_f_pointer, c_loc
type(c_ptr), intent(in) :: f_addrs(:,:)
type(domain2D), intent(in) :: domain
type(overlapSpec), intent(in) :: check
MPP_TYPE_, intent(in) :: d_type !<creates unique interface
integer, intent(in) :: ke
integer, optional, intent(in) :: flags
character(len=*), optional, intent(in) :: name

MPP_TYPE_ :: field(check%xbegin:check%xend, check%ybegin:check%yend,ke)
pointer(ptr_field, field)
MPP_TYPE_, pointer :: field(:,:,:)
MPP_TYPE_, pointer, contiguous :: tmpptr(:,:,:)
integer :: shape(3)
integer :: update_flags
character(len=8) :: text
character(len=64) :: field_name

!equate to mpp_domains_stack
MPP_TYPE_ :: buffer(size(mpp_domains_stack(:)))
pointer( ptr, buffer )
MPP_TYPE_, pointer :: buffer(:)
integer :: buffer_pos
integer, allocatable :: msg1(:), msg2(:)
!receive domains saved here for unpacking
Expand All @@ -51,8 +52,9 @@
integer :: buffer_recv_size, nlist
integer :: outunit

shape = [check%xend-check%xbegin+1, check%yend-check%ybegin+1, ke]
outunit = stdout()
ptr = LOC(mpp_domains_stack)
call c_f_pointer(c_loc(mpp_domains_stack), buffer, [size(mpp_domains_stack)])
l_size = size(f_addrs,1)

update_flags = XUPDATE+YUPDATE !default
Expand Down Expand Up @@ -149,7 +151,8 @@
select case( check%recv(m)%rotation(n) )
case(ZERO)
do l = 1, l_size ! loop over number of fields
ptr_field = f_addrs(l, tMe)
call c_f_pointer(f_addrs(l, tMe), tmpptr, shape=shape)
field(check%xbegin:check%xend, check%ybegin:check%yend, 1:ke) => tmpptr
do k = 1,ke
do j = js, je
do i = is, ie
Expand All @@ -161,7 +164,8 @@
end do
case(MINUS_NINETY)
do l = 1, l_size ! loop over number of fields
ptr_field = f_addrs(l, tMe)
call c_f_pointer(f_addrs(l, tMe), tmpptr, shape=shape)
field(check%xbegin:check%xend, check%ybegin:check%yend, 1:ke) => tmpptr
do k = 1,ke
do j = je, js, -1
do i = is, ie
Expand All @@ -174,7 +178,8 @@
end do
case(NINETY)
do l = 1, l_size ! loop over number of fields
ptr_field = f_addrs(l, tMe)
call c_f_pointer(f_addrs(l, tMe), tmpptr, shape=shape)
field(check%xbegin:check%xend, check%ybegin:check%yend, 1:ke) => tmpptr
do k = 1,ke
do j = js, je
do i = ie, is, -1
Expand All @@ -187,7 +192,8 @@
end do
case(ONE_HUNDRED_EIGHTY)
do l = 1, l_size ! loop over number of fields
ptr_field = f_addrs(l, tMe)
call c_f_pointer(f_addrs(l, tMe), tmpptr, shape=shape)
field(check%xbegin:check%xend, check%ybegin:check%yend, 1:ke) => tmpptr
do k = 1,ke
do j = je, js, -1
do i = ie, is, -1
Expand Down Expand Up @@ -225,7 +231,8 @@
buffer_pos = pos
tMe = check%recv(m)%tileMe(n)
do l=1, l_size ! loop over number of fields
ptr_field = f_addrs(l, tMe)
call c_f_pointer(f_addrs(l, tMe), tmpptr, shape=shape)
field(check%xbegin:check%xend, check%ybegin:check%yend, 1:ke) => tmpptr
do k = 1,ke
do j = js, je
do i = is, ie
Expand Down
Loading