Oasis3-MCT
 All Classes Files Functions Variables Macros Pages
mod_oasis_mem.F90
Go to the documentation of this file.
1 !> Provides methods for querying memory use
2 
4 
5 !-------------------------------------------------------------------------------
6 ! PURPOSE: memory use query methods
7 ! Should call oasis_mem_init once before calling other interfaces
8 !-------------------------------------------------------------------------------
9 
10  use mod_oasis_kinds, only : ip_double_p
12 
13  implicit none
14  private
15 
16 ! PUBLIC: Public interfaces
17 
18  public :: oasis_mem_getusage, &
21 
22 ! PUBLIC: Public interfaces
23 
24  real(ip_double_p) :: mb_blk = 1.0_ip_double_p
25  logical :: initset = .false.
26 
27 !===============================================================================
28 CONTAINS
29 !===============================================================================
30 
31 !> Initialize memory conversion to MB
32 
33 subroutine oasis_mem_init(iunit)
34 
35  implicit none
36 
37  !----- arguments -----
38 
39  integer, optional :: iunit !< output unit number for optional writes
40 
41  !----- local -----
42 
43  ! --- Memory stats ---
44  integer :: msize ! memory size (high water)
45  integer :: mrss ! resident size (current memory use)
46  integer :: msize0,msize1 ! temporary size
47  integer :: mrss0,mrss1,mrss2 ! temporary rss
48  integer :: mshare,mtext,mdatastack
49  integer :: ierr
50 
51  integer :: GPTLget_memusage
52 
53  real(ip_double_p),allocatable :: mem_tmp(:)
54  character(*),parameter :: subname = '(oasis_mem_init)'
55 
56  !---------------------------------------------------
57 
58  call oasis_debug_enter(subname)
59 
60  ierr = gptlget_memusage(msize, mrss0, mshare, mtext, mdatastack)
61  allocate(mem_tmp(1024*1024)) ! 1 MWord, 8 MB
62  mem_tmp = -1.0
63  ierr = gptlget_memusage(msize, mrss1, mshare, mtext, mdatastack)
64  deallocate(mem_tmp)
65  ierr = gptlget_memusage(msize, mrss2, mshare, mtext, mdatastack)
66  mb_blk = 1.0_ip_double_p
67  if (mrss1 - mrss0 > 0) then
68  mb_blk = (8.0_ip_double_p)/((mrss1-mrss0)*1.0_ip_double_p)
69  initset = .true.
70  endif
71 
72  if (present(iunit)) then
73  write(iunit,'(A,l4)') subname//' Initset conversion flag is ',initset
74  write(iunit,'(A,f16.2)') subname//' 8 MB memory alloc in MB is ',(mrss1-mrss0)*mb_blk
75  write(iunit,'(A,f16.2)') subname//' 8 MB memory dealloc in MB is ',(mrss1-mrss2)*mb_blk
76  write(iunit,'(A,f16.2)') subname//' Memory block size conversion in bytes is ',mb_blk*1024_ip_double_p*1024.0_ip_double_p
77  endif
78 
79  call oasis_debug_exit(subname)
80 
81 end subroutine oasis_mem_init
82 
83 !===============================================================================
84 
85 !> Determine memory use
86 
87 subroutine oasis_mem_getusage(r_msize,r_mrss)
88 
89  implicit none
90 
91  !----- arguments ---
92  real(ip_double_p),intent(out) :: r_msize !< memory usage value
93  real(ip_double_p),intent(out) :: r_mrss !< memory usage value
94 
95  !----- local ---
96  integer :: msize,mrss
97  integer :: mshare,mtext,mdatastack
98  integer :: ierr
99  integer :: GPTLget_memusage
100  character(*),parameter :: subname = '(oasis_mem_getusage)'
101 
102  !---------------------------------------------------
103 
104  call oasis_debug_enter(subname)
105 
106  ierr = gptlget_memusage(msize, mrss, mshare, mtext, mdatastack)
107  r_msize = msize*mb_blk
108  r_mrss = mrss*mb_blk
109 
110  call oasis_debug_exit(subname)
111 
112 end subroutine oasis_mem_getusage
113 
114 !===============================================================================
115 
116 !> Print memory use
117 
118 subroutine oasis_mem_print(iunit,string)
119 
120  implicit none
121 
122  !----- arguments ---
123  integer, intent(in) :: iunit !< unit number to write to
124  character(len=*),optional, intent(in) :: string !< optional string
125 
126  !----- local ---
127  real(ip_double_p) :: msize,mrss
128  character(len=128) :: lstring
129  character(*),parameter :: subname = '(oasis_mem_print)'
130 
131  !---------------------------------------------------
132 
133  call oasis_debug_enter(subname)
134 
135  lstring = ' '
136  if (present(string)) then
137  lstring = string
138  endif
139 
140  call oasis_mem_getusage(msize,mrss)
141 
142  if (initset) then
143  write(iunit,'(2a,2f14.4,1x,a)') subname,' memory use (MB) = ',msize,mrss,trim(lstring)
144  else
145  write(iunit,'(2a,2f14.4,1x,a)') subname,' memory use (??) = ',msize,mrss,trim(lstring)
146  endif
147 
148  call oasis_debug_exit(subname)
149 
150 end subroutine oasis_mem_print
151 
152 !===============================================================================
153 
154 END MODULE mod_oasis_mem
subroutine, public oasis_mem_getusage(r_msize, r_mrss)
Determine memory use.
subroutine, public oasis_debug_exit(string)
Used when a subroutine is exited, write info to log file at some debug level.
System type methods.
Provides methods for querying memory use.
subroutine, public oasis_mem_print(iunit, string)
Print memory use.
subroutine, public oasis_debug_enter(string)
Used when a subroutine is entered, write info to log file at some debug level.
Defines kinds for OASIS.
subroutine, public oasis_mem_init(iunit)
Initialize memory conversion to MB.