21 type(model_state_type),
target,
intent(inout) :: current_state
23 type (str_socrates_options),
intent(inout) :: socrates_opt
29 if (is_component_enabled(current_state%options_database,
"lwrad_exponential"))
then
31 (
log_error,
"Socrates and lwrad_exponential both enabled, switch off on in config - STOP")
35 if (.not. current_state%th%active)
then
37 (
log_error,
"Socrates called with theta inactive, this is not supported - STOP")
40 socrates_opt%cloud_representation = &
41 options_get_integer(current_state%options_database,
"i_cloud_representation")
42 if (socrates_opt%cloud_representation == 5)
then
44 if (current_state%number_q_fields < 1)
then
47 socrates_opt%iqv=get_q_index(standard_q_names%VAPOUR,
'socrates_couple')
49 else if (socrates_opt%cloud_representation == 2 .or. socrates_opt%cloud_representation == 1)
then
52 if (.not. is_component_enabled(current_state%options_database,
"casim") &
53 .and. .not. is_component_enabled(current_state%options_database,
"simplecloud"))
then
55 (
log_error,
"Socrates called for cloudy sky but no microphysics scheme enabled - STOP")
57 if (current_state%passive_q )
then
59 (
log_error,
"Socrates called for cloudy sky but q is passive so not cloud or vapour - STOP")
61 if (current_state%number_q_fields < 2)
then
63 (
log_error,
"Socrates called for clear and cloud sky calc but no vapour or cloud field - STOP")
69 socrates_opt%iqv=get_q_index(standard_q_names%VAPOUR,
'socrates_couple')
73 socrates_opt%mphys_nq_l=options_get_integer(current_state%options_database,
"mphys_nq_l")
74 socrates_opt%mphys_nd_l=options_get_integer(current_state%options_database,
"mphys_nd_l")
75 socrates_opt%mphys_nq_r=options_get_integer(current_state%options_database,
"mphys_nq_r")
76 socrates_opt%mphys_nq_i=options_get_integer(current_state%options_database,
"mphys_nq_i")
77 socrates_opt%mphys_nq_s=options_get_integer(current_state%options_database,
"mphys_nq_s")
78 socrates_opt%mphys_nq_g=options_get_integer(current_state%options_database,
"mphys_nq_g")
80 if (socrates_opt%mphys_nq_l > 0) &
81 socrates_opt%iql=get_q_index(standard_q_names%CLOUD_LIQUID_MASS,
'socrates_couple')
82 if (socrates_opt%mphys_nq_r > 0) &
83 socrates_opt%iqr=get_q_index(standard_q_names%RAIN_MASS,
'socrates_couple')
84 if (socrates_opt%mphys_nq_i > 0) &
85 socrates_opt%iqi=get_q_index(standard_q_names%ICE_MASS,
'socrates_couple')
86 if (socrates_opt%mphys_nq_s > 0) &
87 socrates_opt%iqs=get_q_index(standard_q_names%SNOW_MASS,
'socrates_couple')
88 if (socrates_opt%mphys_nq_g > 0) &
89 socrates_opt%iqg=get_q_index(standard_q_names%GRAUPEL_MASS,
'socrates_couple')
91 socrates_opt%l_fix_re = options_get_logical(current_state%options_database,
"l_fix_re")
92 socrates_opt%l_use_ndrop = options_get_logical(current_state%options_database,
"l_use_ndrop")
93 if ((socrates_opt%l_fix_re .and. socrates_opt%l_use_ndrop) .or. &
94 (.not. socrates_opt%l_fix_re .and. .not. socrates_opt%l_use_ndrop))
then
96 (
log_error,
"Socrates - l_fix_re and l_use_ndrop both true or both false, please pick one - STOP")
98 if (socrates_opt%l_fix_re)
then
99 socrates_opt%fixed_cloud_re = options_get_real(current_state%options_database,
"fixed_cloud_re")
100 socrates_opt%fixed_ice_re = options_get_real(current_state%options_database,
"fixed_ice_re")
102 (
log_info,
"Socrates - using fixed cloud effective radius"//trim(conv_to_string(socrates_opt%fixed_cloud_re)))
104 (
log_info,
"Socrates - using fixed ice effective radius"//trim(conv_to_string(socrates_opt%fixed_ice_re)))
106 if (socrates_opt%l_use_ndrop)
then
107 socrates_opt%rho_water = options_get_real(current_state%options_database,
"rho_water")
108 socrates_opt%kparam = options_get_real(current_state%options_database,
"kparam")
109 socrates_opt%l_use_liu_spec = options_get_logical(current_state%options_database,
"l_use_liu_spec")
110 if (socrates_opt%mphys_nd_l > 0)
then
111 if (is_component_enabled(current_state%options_database,
"casim"))
then
112 socrates_opt%inl = get_q_index(standard_q_names%CLOUD_LIQUID_NUMBER,
'socrates_couple')
113 socrates_opt%fixed_ice_re = options_get_real(current_state%options_database,
"fixed_ice_re")
115 (
log_info,
"Socrates using prognostic cloud number from CASIM, fixed ice re="&
116 //trim(conv_to_string(socrates_opt%fixed_ice_re))//
" microns")
119 (
log_error,
"Socrates - casim not enabled so no prognostic nd - STOP")
123 socrates_opt%fixed_cloud_number = options_get_real(current_state%options_database,
"fixed_cloud_number")
124 socrates_opt%fixed_ice_re = options_get_real(current_state%options_database,
"fixed_ice_re")
126 (
log_info,
"Socrates using prescribed fix_cloud_number="&
127 //trim(conv_to_string(socrates_opt%fixed_cloud_number))//
" /cm3")
132 (
log_error,
"Socrates config using unrecognised i_cloud_representation, check config - STOP")
138 socrates_opt%l_360 = options_get_logical(current_state%options_database,
"l_360")
139 socrates_opt%l_solar_fixed = &
140 options_get_logical(current_state%options_database,
"l_solar_fixed")
141 socrates_opt%l_no_solar = &
142 options_get_logical(current_state%options_database,
"l_no_solar")
143 socrates_opt%l_rad_calc = .false.
145 if (socrates_opt%l_solar_fixed)
then
146 socrates_opt%solar_fixed = options_get_real(current_state%options_database,
"solar_fixed")
147 socrates_opt%sec_fixed = options_get_real(current_state%options_database,
"sec_fixed")
148 if (socrates_opt%solar_fixed .lt. -1.0 .or. socrates_opt%sec_fixed .lt. -1.0)
then
150 (
log_error,
"Socrates - l_solar_fixed but solar_fixed and/or sec_fixed not set, check config - STOP")
152 socrates_opt%l_variable_srf_albedo = options_get_logical(current_state%options_database,
"l_variable_srf_albedo")
153 if (socrates_opt%l_variable_srf_albedo)
then
155 (
log_info,
"Socrates - solar_fixed but variable srf albedo, default to fixed srf albedo")
157 socrates_opt%surface_albedo = options_get_real(current_state%options_database,
"surface_albedo")
160 socrates_opt%rad_year = options_get_real(current_state%options_database,
"rad_start_year")
161 if (socrates_opt%rad_year < 0.0)
then
163 (
log_error,
"Socrates - start year is negative, which is wrong, check config - STOP")
166 socrates_opt%rad_start_day = options_get_real(current_state%options_database,
"rad_start_day")
167 if (socrates_opt%rad_start_day < 0.0 .or. socrates_opt%rad_start_day > 360.0)
then
169 (
log_error,
"Socrates - start day is outside sensible range, check config - STOP")
172 socrates_opt%rad_start_time = options_get_real(current_state%options_database,
"rad_start_time")
173 if (socrates_opt%rad_time_hours < 0.0 .or. socrates_opt%rad_time_hours > 24.0)
then
175 (
log_error,
"Socrates - start time is outside sensible range, check config - STOP")
178 socrates_opt%rad_int_time = options_get_real(current_state%options_database,
"rad_int_time")
179 if (socrates_opt%rad_int_time <= 0.0)
then
181 (
log_warn,
"Socrates - rad_int_time less than 0.0, SOCRATES will be called every timestep")
185 socrates_opt%l_variable_srf_albedo = options_get_logical(current_state%options_database,
"l_variable_srf_albedo")
186 if (socrates_opt%l_variable_srf_albedo)
then
188 (
log_error,
"Socrates config using variable surface albedo, but this has not been developed. Set to false - STOP")
190 socrates_opt%surface_albedo = options_get_real(current_state%options_database,
"surface_albedo")
193 socrates_opt%latitude = options_get_real(current_state%options_database,
"latitude")
194 if (socrates_opt%latitude < -90.0 .or. socrates_opt%latitude > 90.0)
then
196 (
log_error,
"Socrates - latitude is outside sensible range, check config - STOP")
198 socrates_opt%longitude = options_get_real(current_state%options_database,
"longitude")
199 if (socrates_opt%longitude < -180.0 .or. socrates_opt%longitude > 180.0)
then
201 (
log_error,
"Socrates - longitude is outside sensible range, check config - STOP")
205 if (socrates_opt%surface_albedo < 0.0 .or. socrates_opt%surface_albedo > 1.0)
then
207 (
log_error,
"Socrates - surface albedo outside sensible range, check config - STOP")
210 socrates_opt%default_solar_constant = &
211 options_get_real(current_state%options_database,
"default_solar_constant")
217 socrates_opt%co2_mmr = 5.94100e-4
218 socrates_opt%n2o_mmr = 4.925e-7
219 socrates_opt%ch4_mmr = 9.994e-7
220 socrates_opt%o2_mmr = 0.2314
221 socrates_opt%cfc12_mmr = 1.129e-9
222 socrates_opt%cfc11_mmr = 2.225e-9
223 socrates_opt%cfc113_mmr = 0.0
224 socrates_opt%cfc114_mmr = 0.0
225 socrates_opt%hcfc22_mmr = 0.0
226 socrates_opt%hfc125_mmr = 0.0
227 socrates_opt%hfc134a_mmr = 0.0