35 #ifdef __INTEL_COMPILER
39 integer,
intent(in) :: errortype
40 character(len=*),
intent(in),
optional :: errormsg
41 character(len=512) :: text
44 if( .NOT.module_is_initialized )
call abort()
46 select case( errortype )
54 text =
'WARNING: non-existent errortype (must be NOTE|WARNING|FATAL)'
57 if( npes.GT.1 )
write( text,
'(a,i6)' )trim(text)//
' from PE', pe
58 if(
PRESENT(errormsg) )text = trim(text)//
': '//trim(errormsg)
60 select case( errortype )
63 write( out_unit,
'(a)' )trim(text)
64 write( warn_unit,
'(a)' )trim(text)
68 write( errunit,
'(/a/)' )trim(text)
70 write( out_unit,
'(/a/)' )trim(text)
71 write( warn_unit,
'(/a/)' )trim(text)
73 if( errortype.EQ.fatal .OR. warnings_are_fatal )
then
77 #ifdef __INTEL_COMPILER
79 call tracebackqq(user_exit_code=-1)
83 call mpi_abort( mpi_comm_world, 1, error )
87 error_state = errortype
98 function get_peset(pelist)
100 integer,
intent(in),
optional :: pelist(:)
103 integer,
allocatable :: pelist_tmp(:)
105 if( .NOT.
PRESENT(pelist) )
then
106 get_peset = current_peset_num;
return
110 if (
size(pelist(:)) .GT. 1)
then
111 do n = 2,
size(pelist(:))
112 if(pelist(n) <= pelist(n-1))
call mpp_error(fatal,
"GET_PESET: pelist is not monotonically increasing")
117 if( debug )
write( errunit,* )
'pelist=', pelist
121 if( debug )
write( errunit,
'(a,3i6)' )
'pe, i, peset_num=', pe, i, peset_num
122 if(
size(pelist(:)).EQ.
size(peset(i)%list(:)) )
then
123 if( all(pelist.EQ.peset(i)%list) )
then
124 get_peset = i;
return
129 peset_num = peset_num + 1
133 allocate( peset(i)%list(
size(pelist(:))) )
134 peset(i)%list(:) = pelist(:)
135 peset(i)%count =
size(pelist(:))
137 allocate(pelist_tmp(
size(pelist(:))))
138 pelist_tmp = pelist - mpp_root_pe()
139 call mpi_group_incl( peset(current_peset_num)%group,
size(pelist(:)), pelist_tmp, peset(i)%group, error )
140 call mpi_comm_create_group(peset(current_peset_num)%id, peset(i)%group, &
141 default_tag, peset(i)%id, error )
143 deallocate(pelist_tmp)
146 end function get_peset
151 integer,
intent(in),
optional :: pelist(:)
152 logical,
intent(in),
optional :: do_self
156 dself=.true.;
if(
PRESENT(do_self))dself=do_self
159 n = get_peset(pelist);
if( peset(n)%count.EQ.1 )
return
161 if( debug .and. (current_clock.NE.0) )
call system_clock(start_tick)
162 call mpi_barrier( peset(n)%id, error )
164 if( debug .and. (current_clock.NE.0) )
call increment_current_clock(event_wait)
174 integer,
intent(in),
optional :: pelist(:)
175 integer,
intent(in),
optional :: check
176 integer,
intent(inout),
optional :: request(:)
177 integer,
intent(in ),
optional :: msg_size(:)
178 integer,
intent(in ),
optional :: msg_type(:)
180 integer :: m, my_check, rsize
182 if( debug .and. (current_clock.NE.0) )
call system_clock(start_tick)
183 my_check = event_send
184 if(
present(check)) my_check = check
185 if( my_check .NE. event_send .AND. my_check .NE. event_recv )
then
186 call mpp_error( fatal,
'mpp_sync_self: The value of optional argument check should be EVENT_SEND or EVENT_RECV')
189 if(
PRESENT(request))
then
190 if( .not.
present(check) )
then
191 call mpp_error(fatal,
'mpp_sync_self: check is not present when request is present')
193 if( my_check == event_recv )
then
194 if( .not.
present(msg_size) )
then
195 call mpp_error(fatal,
'mpp_sync_self: msg_size is not present when request is present and it is EVENT_RECV')
197 if( .not.
present(msg_type) )
then
198 call mpp_error(fatal,
'mpp_sync_self: msg_type is not present when request is present and it is EVENT_RECV')
200 if(
size(msg_size) .NE.
size(request))
then
201 call mpp_error(fatal,
'mpp_sync_self: dimension mismatch between msg_size and request')
203 if(
size(msg_type) .NE.
size(request))
then
204 call mpp_error(fatal,
'mpp_sync_self: dimension mismatch between msg_type and request')
207 do m = 1,
size(request(:))
208 if( request(m) == mpi_request_null ) cycle
209 call mpi_wait(request(m), stat, error )
210 call mpi_get_count(stat, msg_type(m), rsize, error)
211 if(msg_size(m) .NE. rsize)
then
212 call mpp_error(fatal,
"mpp_sync_self: msg_size does not match size of data received")
216 do m = 1,
size(request(:))
217 if(request(m) .NE.mpi_request_null )
call mpi_wait(request(m), stat, error )
221 select case(my_check)
223 do m = 1,cur_send_request
224 if( request_send(m).NE.mpi_request_null )
call mpi_wait( request_send(m), stat, error )
228 do m = 1,cur_recv_request
229 call mpi_wait( request_recv(m), stat, error )
230 call mpi_get_count(stat, type_recv(m), rsize, error)
231 if(size_recv(m) .NE. rsize)
then
232 call mpp_error(fatal,
"mpp_sync_self: size_recv does not match of data received")
239 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....