7 subroutine rad_ctl(current_state, sw_spectrum, lw_spectrum, &
8 mcc, socrates_opt, merge_fields, socrates_derived_fields)
10 USE def_spectrum,
ONLY: strspecdata
14 USE def_dimen,
ONLY: strdim
15 USE def_atm,
ONLY: stratm, deallocate_atm
16 USE def_cld,
ONLY: strcld, deallocate_cld, &
17 deallocate_cld_prsc, &
19 USE def_aer,
ONLY: straer, deallocate_aer, &
21 USE def_bound,
ONLY: strbound, deallocate_bound
22 USE def_out,
ONLY: strout, deallocate_out
30 use rad_pcf,
only: ip_solar, ip_infra_red
33 TYPE (StrSpecData) :: sw_spectrum
34 TYPE (StrSpecData) :: lw_spectrum
38 TYPE(strbound) :: bound
46 TYPE(strout) :: radout
48 type (str_mcc_profiles),
intent(in) :: mcc
49 type (str_merge_atm),
intent(inout) :: merge_fields
51 type (str_socrates_options),
intent(in) :: socrates_opt
52 type (str_socrates_derived_fields),
intent(inout) :: socrates_derived_fields
55 integer :: target_x_index, target_y_index
61 icol=current_state%column_local_x
62 jcol=current_state%column_local_y
64 target_y_index=jcol-current_state%local_grid%halo_size(
y_index)
65 target_x_index=icol-current_state%local_grid%halo_size(
x_index)
67 k_top = current_state%local_grid%size(
z_index)
70 if (socrates_derived_fields%fraction_lit .ge. 1.0)
then
80 1, mcc%irad_levs, mcc%irad_levs)
86 1 , mcc%irad_levs, socrates_opt, merge_fields)
89 socrates_derived_fields)
92 1 , mcc%irad_levs, mcc%irad_levs, socrates_opt, merge_fields)
97 call radiance_calc(
sw_control, dimen, sw_spectrum, atm, cld, aer, bound, radout)
100 socrates_derived_fields%toa_up_shortwave(target_y_index,target_x_index) = &
101 radout%flux_up(1,0,1)
102 socrates_derived_fields%toa_down_shortwave(target_y_index,target_x_index) = &
103 radout%flux_down(1,0,1)
104 socrates_derived_fields%surface_up_shortwave(target_y_index,target_x_index) = &
105 radout%flux_up(1,mcc%irad_levs,1)
106 socrates_derived_fields%surface_down_shortwave(target_y_index,target_x_index) = &
107 radout%flux_down(1,mcc%irad_levs,1)
109 do k = 1, mcc%irad_levs
110 merge_fields%sw_heat_rate_radlevs(k) = &
112 ((radout%flux_down(1,k-1,1)-radout%flux_up(1,k-1,1)) &
114 - (radout%flux_down(1,k,1)-radout%flux_up(1,k,1)))/ &
115 (merge_fields%mass(k)*
cp)
119 socrates_derived_fields%flux_up_sw(k,target_y_index, target_x_index) = &
120 radout%flux_up(1,mcc%irad_levs+1-k,1)
122 socrates_derived_fields%flux_down_sw(k,target_y_index, target_x_index) = &
123 radout%flux_down(1,mcc%irad_levs+1-k,1)
126 current_state%sth_sw%data(1,jcol, icol) = 0.0
128 current_state%sth_sw%data(2:k_top,jcol, icol) = &
129 merge_fields%sw_heat_rate_radlevs(mcc%irad_levs:mcc%irad_levs+2-k_top:-1)
130 socrates_derived_fields%swrad_hr(:,target_y_index, target_x_index) = &
131 current_state%sth_sw%data(:,jcol, icol)
133 current_state%sth_sw%data(:, jcol, icol) = &
134 current_state%sth_sw%data(:, jcol, icol)* &
135 current_state%global_grid%configuration%vertical%prefrcp(:)
139 socrates_derived_fields%flux_up_sw(k,target_y_index, target_x_index) = &
142 socrates_derived_fields%flux_down_sw(k,target_y_index, target_x_index) = &
145 socrates_derived_fields%toa_up_shortwave(target_y_index,target_x_index) = 0.0
146 socrates_derived_fields%toa_down_shortwave(target_y_index,target_x_index) = 0.0
147 socrates_derived_fields%surface_up_shortwave(target_y_index,target_x_index) = 0.0
148 socrates_derived_fields%surface_down_shortwave(target_y_index,target_x_index) = 0.0
149 current_state%sth_sw%data(:,jcol, icol) = 0.0
150 socrates_derived_fields%swrad_hr(:,target_y_index, target_x_index) = 0.0
154 CALL deallocate_out(radout)
155 CALL deallocate_aer_prsc(aer)
156 CALL deallocate_aer(aer)
158 CALL deallocate_bound(bound)
159 CALL deallocate_cld_prsc(cld)
160 CALL deallocate_cld(cld)
161 call deallocate_atm(atm)
169 1, mcc%irad_levs, mcc%irad_levs)
172 1 , mcc%irad_levs, socrates_opt, merge_fields)
175 socrates_derived_fields)
178 1 , mcc%irad_levs, mcc%irad_levs, socrates_opt, merge_fields)
182 call radiance_calc(
lw_control, dimen, lw_spectrum, atm, cld, aer, bound, radout)
184 socrates_derived_fields%toa_up_longwave(target_y_index,target_x_index) = &
185 radout%flux_up(1,0,1)
186 socrates_derived_fields%surface_up_longwave(target_y_index,target_x_index) = &
187 radout%flux_up(1,mcc%irad_levs,1)
188 socrates_derived_fields%surface_down_longwave(target_y_index,target_x_index) = &
189 radout%flux_down(1,mcc%irad_levs,1)
191 do k = 1, mcc%irad_levs
192 merge_fields%lw_heat_rate_radlevs(k) = &
194 ((radout%flux_down(1,k-1,1)-radout%flux_up(1,k-1,1)) &
196 - (radout%flux_down(1,k,1)-radout%flux_up(1,k,1)))/ &
197 (merge_fields%mass(k)*
cp)
200 current_state%sth_lw%data(1,jcol, icol) = 0.0
202 current_state%sth_lw%data(2:k_top,jcol, icol) = &
203 merge_fields%lw_heat_rate_radlevs(mcc%irad_levs:mcc%irad_levs+2-k_top:-1)
205 current_state%sth_lw%data(:, jcol, icol) = &
206 current_state%sth_lw%data(:, jcol, icol)* &
207 current_state%global_grid%configuration%vertical%prefrcp(:)
209 socrates_derived_fields%lwrad_hr(:,target_y_index, target_x_index) = &
210 current_state%sth_lw%data(:,jcol, icol)
213 socrates_derived_fields%flux_up_lw(k,target_y_index, target_x_index) = &
214 radout%flux_up(1,mcc%irad_levs+1-k,1)
216 socrates_derived_fields%flux_down_lw(k,target_y_index, target_x_index) = &
217 radout%flux_down(1,mcc%irad_levs+1-k,1)
220 socrates_derived_fields%totrad_hr(:,target_y_index, target_x_index) = &
221 socrates_derived_fields%lwrad_hr(:,target_y_index, target_x_index) + &
222 socrates_derived_fields%swrad_hr(:,target_y_index, target_x_index)
224 CALL deallocate_out(radout)
225 CALL deallocate_aer_prsc(aer)
226 CALL deallocate_aer(aer)
227 CALL deallocate_bound(bound)
228 CALL deallocate_cld_prsc(cld)
229 CALL deallocate_cld(cld)
230 CALL deallocate_atm(atm)