36#ifdef __INTEL_COMPILER
40 integer,
intent(in) :: errortype
41 character(len=*),
intent(in),
optional :: errormsg
42 character(len=512) :: text
45 if( .NOT.module_is_initialized )
call abort()
47 select case( errortype )
55 text =
'WARNING: non-existent errortype (must be NOTE|WARNING|FATAL)'
58 if( npes.GT.1 )
write( text,
'(a,i6)' )trim(text)//
' from PE', pe
59 if(
PRESENT(errormsg) )text = trim(text)//
': '//trim(errormsg)
61 select case( errortype )
64 write( out_unit,
'(a)' )trim(text)
65 write( warn_unit,
'(a)' )trim(text)
69 write( errunit,
'(/a/)' )trim(text)
71 write( out_unit,
'(/a/)' )trim(text)
72 write( warn_unit,
'(/a/)' )trim(text)
74 if( errortype.EQ.fatal .OR. warnings_are_fatal )
then
78#ifdef __INTEL_COMPILER
80 call tracebackqq(user_exit_code=-1)
84 call mpi_abort( mpi_comm_world, 1, error )
88 error_state = errortype
101 integer,
intent(in),
optional :: pelist(:)
104 integer,
allocatable :: pelist_tmp(:)
106 if( .NOT.
PRESENT(pelist) )
then
111 if (
size(pelist(:)) .GT. 1)
then
112 do n = 2,
size(pelist(:))
113 if(pelist(n) <= pelist(n-1))
call mpp_error(fatal,
"GET_PESET: pelist is not monotonically increasing")
118 if( debug )
write( errunit,* )
'pelist=', pelist
122 if( debug )
write( errunit,
'(a,3i6)' )
'pe, i, peset_num=', pe, i, peset_num
123 if(
size(pelist(:)).EQ.
size(peset(i)%list(:)) )
then
124 if( all(pelist.EQ.peset(i)%list) )
then
130 peset_num = peset_num + 1
131 if( peset_num > current_peset_max )
call expand_peset()
134 allocate( peset(i)%list(
size(pelist(:))) )
135 peset(i)%list(:) = pelist(:)
136 peset(i)%count =
size(pelist(:))
138 allocate(pelist_tmp(
size(pelist(:))))
139 pelist_tmp = pelist - mpp_root_pe()
140 call mpi_group_incl( peset(current_peset_num)%group,
size(pelist(:)), pelist_tmp, peset(i)%group, error )
141 call mpi_comm_create_group(peset(current_peset_num)%id, peset(i)%group, &
142 default_tag, peset(i)%id, error )
144 deallocate(pelist_tmp)
175 integer,
intent(in),
optional :: pelist(:)
176 integer,
intent(in),
optional :: check
177 integer,
intent(inout),
optional :: request(:)
178 integer,
intent(in ),
optional :: msg_size(:)
179 integer,
intent(in ),
optional :: msg_type(:)
181 integer :: m, my_check, rsize
183 if( debug .and. (current_clock.NE.0) )
call system_clock(start_tick)
184 my_check = event_send
185 if(
present(check)) my_check = check
186 if( my_check .NE. event_send .AND. my_check .NE. event_recv )
then
187 call mpp_error( fatal,
'mpp_sync_self: The value of optional argument check should be EVENT_SEND or EVENT_RECV')
190 if(
PRESENT(request))
then
191 if( .not.
present(check) )
then
192 call mpp_error(fatal,
'mpp_sync_self: check is not present when request is present')
194 if( my_check == event_recv )
then
195 if( .not.
present(msg_size) )
then
196 call mpp_error(fatal,
'mpp_sync_self: msg_size is not present when request is present and it is EVENT_RECV')
198 if( .not.
present(msg_type) )
then
199 call mpp_error(fatal,
'mpp_sync_self: msg_type is not present when request is present and it is EVENT_RECV')
201 if(
size(msg_size) .NE.
size(request))
then
202 call mpp_error(fatal,
'mpp_sync_self: dimension mismatch between msg_size and request')
204 if(
size(msg_type) .NE.
size(request))
then
205 call mpp_error(fatal,
'mpp_sync_self: dimension mismatch between msg_type and request')
208 do m = 1,
size(request(:))
209 if( request(m) == mpi_request_null ) cycle
210 call mpi_wait(request(m), stat, error )
211 call mpi_get_count(stat, msg_type(m), rsize, error)
212 if(msg_size(m) .NE. rsize)
then
213 call mpp_error(fatal,
"mpp_sync_self: msg_size does not match size of data received")
217 do m = 1,
size(request(:))
218 if(request(m) .NE.mpi_request_null )
call mpi_wait(request(m), stat, error )
222 select case(my_check)
224 do m = 1,cur_send_request
225 if( request_send(m).NE.mpi_request_null )
call mpi_wait( request_send(m), stat, error )
229 do m = 1,cur_recv_request
230 call mpi_wait( request_recv(m), stat, error )
231 call mpi_get_count(stat, type_recv(m), rsize, error)
232 if(size_recv(m) .NE. rsize)
then
233 call mpp_error(fatal,
"mpp_sync_self: size_recv does not match of data received")
240 if( debug .and. (current_clock.NE.0) )
call increment_current_clock(event_wait)
subroutine mpp_sync_self(pelist, check, request, msg_size, msg_type)
This is to check if current PE's outstanding puts are complete but we can't use shmem_fence because w...