24 module stock_constants_mod
29 use time_manager_mod,
only :
operator(+),
operator(-)
31 use platform_mod,
only : r8_kind
36 #include<file_version.h>
38 integer,
public,
parameter :: NELEMS=3
39 integer,
parameter :: NELEMS_report=3
40 integer,
public,
parameter :: ISTOCK_WATER=1, istock_heat=2, istock_salt=3
41 integer,
public,
parameter :: ISTOCK_TOP=1, istock_bottom=2, istock_side=3
42 integer,
public :: stocks_file
53 real(r8_kind) :: q_start = 0.0_r8_kind
54 real(r8_kind) :: q_now = 0.0_r8_kind
59 real(r8_kind) :: dq(
nsides) = 0.0_r8_kind
60 real(r8_kind) :: dq_in(
nsides) = 0.0_r8_kind
65 type(
stock_type),
save,
public,
dimension(NELEMS) :: atm_stock, ocn_stock, lnd_stock, ice_stock
72 integer,
private,
parameter :: ncomps=4
73 integer,
private,
parameter :: istock_atm=1,istock_lnd=2,istock_ice=3,istock_ocn=4
74 character(len=3),
parameter,
dimension(NCOMPS) :: comp_names=(/
'ATM',
'LND',
'ICE',
'OCN'/)
77 character(len=5) ,
parameter,
dimension(NELEMS) :: stock_names=(/
'water',
'heat ',
'salt '/)
78 character(len=12),
parameter,
dimension(NELEMS) :: stock_units=(/
'[Kg] ',
'[Joules]',
'[Kg] '/)
87 character(len=80) :: formatstring,space
89 real(r8_kind),
dimension(NELEMS) :: val_atm, val_lnd, val_ice, val_ocn
94 do i = 1, nelems_report
95 val_atm(i) = atm_stock(i)%q_start
96 val_lnd(i) = lnd_stock(i)%q_start
97 val_ice(i) = ice_stock(i)%q_start
98 val_ocn(i) = ocn_stock(i)%q_start
107 if(
mpp_pe() == mpp_root_pe())
then
110 write(stocks_file,*)
'================Stocks Report Guide====================================='
111 write(stocks_file,*)
' '
112 write(stocks_file,*)
'S(t) = Total amount of a tracer in the component model at time t.'
113 write(stocks_file,*)
' Calculated via the component model itself.'
114 write(stocks_file,*)
' '
115 write(stocks_file,*)
'F(t) = Cumulative input of a tracer to the component model at time t.'
116 write(stocks_file,*)
' Calculated via interchange of fluxes with other component models.'
117 write(stocks_file,*)
' '
118 write(stocks_file,*)
'S(t) - S(0) = Cumulative increase of the component stocks at time t'
119 write(stocks_file,*)
' Calculated by the component itself.'
120 write(stocks_file,*)
' '
121 write(stocks_file,*)
'In a conserving component F(t)=S(t)-S(0) to within numerical accuracy.'
122 write(stocks_file,*)
' '
123 write(stocks_file,*)
'Component Model refers to one of OCN, ATM, LND or ICE'
124 write(stocks_file,*)
''
125 write(stocks_file,*)
'NOTE: When use_lag_fluxes=.true. is used in coupler, the ocean stocks '
126 write(stocks_file,*)
' calculations are in error by an order which scales as the inverse'
127 write(stocks_file,*)
' of the number of time steps.'
128 write(stocks_file,*)
' '
129 write(stocks_file,*)
'======================================================================='
132 write(stocks_file,*)
'======================Initial Stock S(0)==============================='
136 s = 25-len_trim(stock_names(i))-len_trim(stock_units(i))
137 write(space,
'(i2)') s
138 formatstring= trim(formatstring)//
',a,a,'//trim(space)
139 formatstring= trim(formatstring)//trim(
'x')
141 formatstring= trim(formatstring)//
')'
143 write(stocks_file,formatstring) (trim(stock_names(i)),trim(stock_units(i)), i=1,nelems_report)
148 write(space,
'(i2)') s
149 formatstring= trim(formatstring)//
',es22.15,3x'
151 formatstring= trim(formatstring)//
')'
154 write(stocks_file,formatstring)
'ATM', (val_atm(i), i=1,nelems_report)
155 write(stocks_file,formatstring)
'LND', (val_lnd(i), i=1,nelems_report)
156 write(stocks_file,formatstring)
'ICE', (val_ice(i), i=1,nelems_report)
157 write(stocks_file,formatstring)
'OCN', (val_ocn(i), i=1,nelems_report)
159 write(stocks_file,*)
'========================================================================'
160 write(stocks_file,
'(a)' )
' '
173 real(r8_kind),
dimension(NCOMPS) :: f_value, f_ice_grid, f_ocn_grid, f_ocn_btf, q_start, q_now,c_value
174 character(len=80) :: formatstring
175 integer :: iday0, isec0, iday, isec, hours
176 real(r8_kind) :: days
177 integer :: diagid , comp,elem,i
178 integer,
parameter :: initid = -2
183 integer,
dimension(NCOMPS,NELEMS),
save :: f_valuediagid = initid
184 integer,
dimension(NCOMPS,NELEMS),
save :: c_valuediagid = initid
185 integer,
dimension(NCOMPS,NELEMS),
save :: fmc_valuediagid = initid
186 integer,
dimension(NCOMPS,NELEMS),
save :: f_lostdiagid = initid
188 real(r8_kind) :: diagfield
190 character(len=30) :: field_name, units
192 if(
mpp_pe()==mpp_root_pe())
then
193 call get_time(init_time, isec0, iday0)
196 hours = iday*24 + isec/3600 - iday0*24 - isec0/3600
197 days = real(hours, r8_kind)/24.0_r8_kind
198 write(stocks_file,*)
'==============================================='
199 write(stocks_file,
'(a,f12.3)')
't = TimeSinceStart[days]= ',days
200 write(stocks_file,*)
'==============================================='
203 do elem = 1,nelems_report
207 if(comp == istock_atm) stck = atm_stock(elem)
208 if(comp == istock_lnd) stck = lnd_stock(elem)
209 if(comp == istock_ice) stck = ice_stock(elem)
210 if(comp == istock_ocn) stck = ocn_stock(elem)
213 f_ice_grid(comp) = sum(stck%dq)
214 f_ocn_grid(comp) = sum(stck%dq_IN)
215 f_ocn_btf(comp) = stck%dq_IN( istock_bottom )
217 q_start(comp) = stck%q_start
218 q_now(comp) = stck%q_now
226 c_value(comp) = q_now(comp) - q_start(comp)
228 if(
mpp_pe() == mpp_root_pe())
then
230 if(f_valuediagid(comp,elem) == initid)
then
231 field_name = trim(comp_names(comp)) // trim(stock_names(elem))
232 field_name = trim(field_name) //
'StocksChange_Flux'
233 units = trim(stock_units(elem))
238 if(c_valuediagid(comp,elem) == initid)
then
239 field_name = trim(comp_names(comp)) // trim(stock_names(elem))
240 field_name = trim(field_name) //
'StocksChange_Comp'
241 units = trim(stock_units(elem))
246 if(fmc_valuediagid(comp,elem) == initid)
then
247 field_name = trim(comp_names(comp)) // trim(stock_names(elem))
248 field_name = trim(field_name) //
'StocksChange_Diff'
249 units = trim(stock_units(elem))
254 f_value(comp) = f_ice_grid(comp)
256 if(comp == istock_ocn)
then
258 f_value(comp) = f_ocn_grid(comp)
260 if(f_lostdiagid(comp,elem) == initid)
then
261 field_name = trim(comp_names(comp)) // trim(stock_names(elem))
262 field_name = trim(field_name) //
'StocksExchangeLost'
263 units = trim(stock_units(elem))
268 diagid=f_lostdiagid(comp,elem)
269 diagfield = f_ice_grid(comp) - f_ocn_grid(comp)
270 if (diagid > 0) used =
send_data(diagid, diagfield, time)
275 diagid=f_valuediagid(comp,elem)
276 diagfield = f_value(comp)
277 if (diagid > 0) used =
send_data(diagid, diagfield, time)
278 diagid=c_valuediagid(comp,elem)
279 diagfield = c_value(comp)
280 if (diagid > 0) used =
send_data(diagid, diagfield, time)
281 diagid=fmc_valuediagid(comp,elem)
282 diagfield = f_value(comp)-c_value(comp)
283 if (diagid > 0) used =
send_data(diagid, diagfield, time)
297 if(
mpp_pe()==mpp_root_pe())
then
306 write(stocks_file,
'(a,a,40x,a,20x,a,20x,a,20x,a)')
'Stocks of ',trim(stock_names(elem)),
'ATM',
'LND', &
308 formatstring =
'(a,a,2x,es22.15,2x,es22.15,2x,es22.15,2x,es22.15)'
310 write(stocks_file,formatstring)
'Total =S(t) ',stock_units(elem),&
311 ( q_now(i), i=1,ncomps)
312 write(stocks_file,formatstring)
'Change=S(t)-S(0) ',stock_units(elem),&
313 ( q_now(i)-q_start(i), i=1,ncomps)
314 write(stocks_file,formatstring)
'Input =F(t) ',stock_units(elem),&
315 ( f_value(i), i=1,ncomps)
316 write(stocks_file,formatstring)
'Diff =F(t) - (S(t)-S(0)) ',stock_units(elem),&
317 ( f_value(i) - c_value(i), i=1,ncomps)
318 write(stocks_file,formatstring)
'Error =Diff/S(0) ',
'[NonDim] ', &
319 ((f_value(i) - c_value(i))/(1+q_start(i)), i=1,ncomps)
322 write(stocks_file,
'(a)' )
' '
323 formatstring =
'(a,a,a,6x,es22.15)'
324 write(stocks_file,formatstring)
'Lost Stocks in the exchange between Ice and Ocean ',trim(stock_names(elem))&
325 &,trim(stock_units(elem)), f_ice_grid(istock_ocn) - f_ocn_grid(istock_ocn) + f_ocn_btf(istock_ocn)
327 write(stocks_file,
'(a)')
' '
328 write(stocks_file,
'(a)')
' '
341 end module stock_constants_mod
Register a diagnostic field for a given module.
Send data over to output fields.
subroutine, public write_version_number(version, tag, unit)
Prints to the log file (or a specified unit) the version id string and tag name.
integer function mpp_pe()
Returns processor ID.
subroutine, public stocks_report(Time)
Writes update to stock report.
subroutine, public stocks_report_init(Time)
Starts a stock report.
subroutine, public stocks_set_init_time(Time)
integer, parameter nsides
top, bottom, side
Holds stocks amounts per PE values.
subroutine, public get_time(Time, seconds, days, ticks, err_msg)
Returns days and seconds ( < 86400 ) corresponding to a time. err_msg should be checked for any error...
Type to represent amounts of time. Implemented as seconds and days to allow for larger intervals.