Line data Source code
1 :
2 : #define SERIAL_REMOVE_MPI
3 :
4 : !=======================================================================
5 : !
6 : ! Exit the model.
7 : ! authors William H. Lipscomb (LANL)
8 : ! Elizabeth C. Hunke (LANL)
9 : ! 2006 ECH: separated serial and mpi functionality
10 :
11 : module ice_exit
12 :
13 : use ice_kinds_mod
14 : use ice_fileunits, only: nu_diag, ice_stderr, flush_fileunit
15 : use icepack_intfc, only: icepack_warnings_flush, icepack_warnings_aborted
16 : #if (defined CESMCOUPLED)
17 : use shr_sys_mod
18 : #else
19 : #ifndef SERIAL_REMOVE_MPI
20 : use mpi ! MPI Fortran module
21 : #endif
22 : #endif
23 :
24 : implicit none
25 : public
26 :
27 : !=======================================================================
28 :
29 : contains
30 :
31 : !=======================================================================
32 :
33 0 : subroutine abort_ice(error_message, file, line, doabort)
34 :
35 : ! This routine aborts the ice model and prints an error message.
36 :
37 : character (len=*), intent(in),optional :: error_message ! error message
38 : character (len=*), intent(in),optional :: file ! file
39 : integer (kind=int_kind), intent(in), optional :: line ! line number
40 : logical (kind=log_kind), intent(in), optional :: doabort ! abort flag
41 :
42 : ! local variables
43 :
44 : integer (int_kind) :: &
45 : ierr, & ! MPI error flag ! LCOV_EXCL_LINE
46 : outunit, & ! output unit ! LCOV_EXCL_LINE
47 : error_code ! return code
48 : logical (log_kind) :: ldoabort ! local doabort flag
49 : character(len=*), parameter :: subname='(abort_ice)'
50 :
51 0 : ldoabort = .true.
52 0 : if (present(doabort)) ldoabort = doabort
53 :
54 : #if (defined CESMCOUPLED)
55 : outunit = nu_diag
56 : #else
57 0 : outunit = ice_stderr
58 : #endif
59 :
60 0 : call flush_fileunit(nu_diag)
61 0 : call icepack_warnings_flush(nu_diag)
62 0 : write(outunit,*) ' '
63 0 : write(outunit,*) subname, 'ABORTED: '
64 0 : if (present(file)) write (outunit,*) subname,' called from ',trim(file)
65 0 : if (present(line)) write (outunit,*) subname,' line number ',line
66 0 : if (present(error_message)) write (outunit,*) subname,' error = ',trim(error_message)
67 0 : call flush_fileunit(outunit)
68 :
69 0 : if (ldoabort) then
70 : #if (defined CESMCOUPLED)
71 : call shr_sys_abort(subname//trim(error_message))
72 : #else
73 : #ifndef SERIAL_REMOVE_MPI
74 : error_code = 128
75 : call MPI_ABORT(MPI_COMM_WORLD, error_code, ierr)
76 : #endif
77 0 : stop
78 : #endif
79 : endif
80 :
81 0 : end subroutine abort_ice
82 :
83 : !=======================================================================
84 :
85 1 : subroutine end_run
86 :
87 : ! Ends run by calling MPI_FINALIZE
88 : ! Does nothing in serial runs
89 :
90 : integer (int_kind) :: ierr ! MPI error flag
91 : character(len=*), parameter :: subname = '(end_run)'
92 :
93 : #ifndef SERIAL_REMOVE_MPI
94 : call MPI_FINALIZE(ierr)
95 : #endif
96 :
97 1 : end subroutine end_run
98 :
99 : !=======================================================================
100 :
101 : end module ice_exit
102 :
103 : !=======================================================================
|