@@ -39,16 +39,12 @@ module radheat
3939
4040 public :: radheat_disable_waccm ! disable waccm heating in the upper atm
4141
42+ real (r8 ), public :: p_top_for_equil_rad = 0._r8
43+
4244! Private variables for merging heating rates
4345 real (r8 ):: qrs_wt(pver) ! merge weight for cam solar heating
4446 real (r8 ):: qrl_wt(pver) ! merge weight for cam long wave heating
4547
46- ! sw merge region
47- ! highest altitude (lowest pressure) of merge region (Pa)
48- real (r8 ) :: min_pressure_sw= 5._r8
49- ! lowest altitude (lowest pressure) of merge region (Pa)
50- real (r8 ) :: max_pressure_sw= 50._r8
51-
5248 ! lw merge region
5349 ! highest altitude (lowest pressure) of merge region (Pa)
5450 real (r8 ) :: min_pressure_lw= 5._r8
@@ -61,10 +57,36 @@ module radheat
6157contains
6258! ===============================================================================
6359subroutine radheat_readnl (nlfile )
64-
65- character (len=* ), intent (in ) :: nlfile ! filepath for file containing namelist input
66-
67- ! No options for this version of radheat; this is just a stub.
60+ ! Read radheat_nl namelist group
61+ use namelist_utils, only: find_group_name
62+ use spmd_utils, only: mpicom, mstrid= >masterprocid, mpi_real8
63+ use cam_abortutils, only: endrun
64+
65+ character (len=* ), intent (in ) :: nlfile ! filepath for file containing namelist input
66+
67+ ! Local variables
68+ integer :: unitn, ierr
69+ integer :: dtime ! timestep size
70+ character (len= 32 ) :: errmsg
71+ character (len=* ), parameter :: sub = ' radheat_readnl'
72+
73+ namelist / radheat_nl/ p_top_for_equil_rad
74+ !- ----------------------------------------------------------------------------
75+
76+ if (masterproc) then
77+ open ( newunit= unitn, file= trim (nlfile), status= ' old' )
78+ call find_group_name(unitn, ' radheat_nl' , status= ierr)
79+ if (ierr == 0 ) then
80+ read (unitn, radheat_nl, iostat= ierr, iomsg= errmsg)
81+ if (ierr /= 0 ) then
82+ call endrun(sub// ' : ERROR reading namelist: ' // trim (errmsg))
83+ end if
84+ end if
85+ close (unitn)
86+ end if
87+
88+ call mpi_bcast(p_top_for_equil_rad, 1 , mpi_real8, mstrid, mpicom, ierr)
89+ if (ierr /= 0 ) call endrun(sub// " : FATAL: mpi_bcast: p_top_for_equil_rad" )
6890
6991end subroutine radheat_readnl
7092
@@ -92,8 +114,6 @@ subroutine radheat_init(pref_mid)
92114 ! local vars
93115 real (r8 ) :: co2_mw, o1_mw, o2_mw, o3_mw, no_mw, n2_mw ! molecular weights
94116
95- real (r8 ) :: delta_merge_sw ! range of merge region
96- real (r8 ) :: midpoint_sw ! midpoint of merge region
97117 real (r8 ) :: delta_merge_lw ! range of merge region
98118 real (r8 ) :: midpoint_lw ! midpoint of merge region
99119 real (r8 ) :: psh(pver) ! pressure scale height
@@ -116,43 +136,22 @@ subroutine radheat_init(pref_mid)
116136 ! set max/min pressures for merging regions.
117137
118138 if (camrt) then
119- min_pressure_sw = 1e5_r8 * exp (- 10._r8 )
120- max_pressure_sw = 1e5_r8 * exp (- 9._r8 )
121139 min_pressure_lw = 1e5_r8 * exp (- 10._r8 )
122140 max_pressure_lw = 1e5_r8 * exp (- 8.57_r8 )
123141 else
124- min_pressure_sw = 5._r8
125- max_pressure_sw = 50._r8
126- min_pressure_lw = 10._r8
142+ min_pressure_lw = p_top_for_equil_rad
127143 max_pressure_lw = 50._r8
128144 endif
129145
130- delta_merge_sw = max_pressure_sw - min_pressure_sw
131146 delta_merge_lw = max_pressure_lw - min_pressure_lw
132147
133- midpoint_sw = (max_pressure_sw + min_pressure_sw)/ 2._r8
134148 midpoint_lw = (max_pressure_lw + min_pressure_lw)/ 2._r8
135149
136150 do k= 1 ,pver
137151
138152 ! pressure scale heights for camrt merging (cam4)
139153 psh(k)= log (1e5_r8 / pref_mid(k))
140154
141- if ( pref_mid(k) .le. min_pressure_sw ) then
142- qrs_wt(k) = 0._r8
143- else if ( pref_mid(k) .ge. max_pressure_sw) then
144- qrs_wt(k) = 1._r8
145- else
146- if (camrt) then
147- ! camrt
148- qrs_wt(k) = 1._r8 - tanh ( (psh(k) - 9._r8 )/ .75_r8 )
149- else
150- ! rrtmg
151- qrs_wt(k) = 0.5_r8 + 1.5_r8 * ((pref_mid(k)- midpoint_sw)/ delta_merge_sw) &
152- - 2._r8 * ((pref_mid(k)- midpoint_sw)/ delta_merge_sw)** 3._r8
153- endif
154- endif
155-
156155 if ( pref_mid(k) .le. min_pressure_lw ) then
157156 qrl_wt(k)= 0._r8
158157 else if ( pref_mid(k) .ge. max_pressure_lw) then
0 commit comments