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
99 function get_peset(pelist)
101 integer,
intent(in),
optional :: pelist(:)
104 integer,
allocatable :: pelist_tmp(:)
106 if( .NOT.
PRESENT(pelist) )
then
107 get_peset = current_peset_num;
return
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
125 get_peset = i;
return
130 peset_num = peset_num + 1
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)
147 end function get_peset
152 integer,
intent(in),
optional :: pelist(:)
153 logical,
intent(in),
optional :: do_self
157 dself=.true.;
if(
PRESENT(do_self))dself=do_self
160 n = get_peset(pelist);
if( peset(n)%count.EQ.1 )
return
162 if( debug .and. (current_clock.NE.0) )
call system_clock(start_tick)
163 call mpi_barrier( peset(n)%id, error )
165 if( debug .and. (current_clock.NE.0) )
call increment_current_clock(event_wait)
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...
subroutine mpp_error_basic(errortype, errormsg)
A very basic error handler uses ABORT and FLUSH calls, may need to use cpp to rename.
integer function stderr()
This function returns the current standard fortran unit numbers for error messages.
subroutine mpp_sync(pelist, do_self)
Synchronize PEs in list.
subroutine expand_peset()
This routine will double the size of peset and copy the original peset data into the expanded one....