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