/[ascend]/trunk/models/solar/solar_field.a4l
ViewVC logotype

Contents of /trunk/models/solar/solar_field.a4l

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2623 - (show annotations) (download) (as text)
Tue May 15 17:18:37 2012 UTC (8 years, 1 month ago) by jpye
File MIME type: text/x-ascend
File size: 8690 byte(s)
absorber relations are in deg C
1 (*
2 Model of a parabolic trough solar thermal collector field, of the type
3 of SEGS VI plant, closely following the approach of Angela Patnode (2006).
4 https://www.nrel.gov/analysis/sam/pdfs/thesis_patnode06.pdf
5
6 First version by Vikram Kaadam (2011) as part of GSOC2011.
7 Second version by John Pye (2012).
8 *)
9 REQUIRE "ivpsystem.a4l";
10 REQUIRE "atoms.a4l";
11 REQUIRE "johnpye/thermo_types.a4c";
12 REQUIRE "solar/tracker.a4l"; (* sun position *)
13 REQUIRE "solar/therminol.a4c"; (* oil properties *)
14 REQUIRE "johnpye/datareader/testtmy3.a4c"; (* weather data reader *)
15
16 (* refinement base, used in the parabolic_trough model... *)
17 MODEL absorber_loss_base;
18 END absorber_loss_base;
19
20 (*
21 Heat loss per metre length of absorber tube, including convective, conductive
22 and radiative losses.
23 *)
24 MODEL absorber_loss(
25 type IS_A symbol_constant;
26 T_i_K WILL_BE temperature;
27 T_o_K WILL_BE temperature;
28 DNI WILL_BE power_per_area;
29 ) REFINES absorber_loss_base;
30
31 T_i, T_o IS_A delta_temperature;
32 T_i = T_i_K - 273.15 {K};
33 T_o = T_o_K - 273.15 {K};
34
35 a[0..3] IS_A real_constant;
36 b[0,1] IS_A real_constant;
37
38 SELECT(type)
39 CASE 'vacuum':
40 (* an intact HCE, evacuated air at 0.0001 Torr *)
41 a[0] :== -2.247372E+01 {W/m^2};
42 a[1] :== 8.374490E-01 {W/m^2/K};
43 a[2] :== 0.00 {W/m^2/K^2};
44 a[3] :== 4.620143E-06 {W/m^2/K^3};
45 b[0] :== 6.983190E-02 {m};
46 b[1] :== 9.312703E-08 {m/K^2};
47 CASE 'hydrogen':
48 (* intact HCE into which hydrogen has diffused to a pressure off 1 Torr *)
49 a[0] :== -2.247372E+01 {W/m^2};
50 a[1] :== 8.374490E-01 {W/m^2/K};
51 a[2] :== 0.00 {W/m^2/K^2};
52 a[3] :== 4.620143E-06 {W/m^2/K^3};
53 b[0] :== 6.983190E-02 {m};
54 b[1] :== 9.312703E-08 {m/K^2};
55 CASE 'air':
56 (* a broken glass envelope; contents will be air at ambient pressure *)
57 a[0] :== -2.247372E+01 {W/m^2};
58 a[1] :== 8.374490E-01 {W/m^2/K};
59 a[2] :== 0.00 {W/m^2/K^2};
60 a[3] :== 4.620143E-06 {W/m^2/K^3};
61 b[0] :== 6.983190E-02 {m};
62 b[1] :== 9.312703E-08 {m/K^2};
63 END SELECT;
64
65 Qd_loss IS_A power_per_length;
66
67 (* FIXME this equation assumes temperatures in degC. T^3 in degC? Bah! *)
68
69 (* heat loss calculated as integral wrt temperature, Patnode eq 2.18. *)
70 Qd_loss * (T_o - T_i) = SUM[a[i]*(T_o^(i+1) - T_i^(i+1))/(i+1) | i IN [0..3]] + DNI * (b[0] + b[1]/3*(T_o^3 - T_i^3));
71 (* NOTE above eq assumes linear temperature rise with position? is that suff valid? *)
72 (* NOTE above eq assumes ambient temperature of 25 C (Patnode sect 2.3.2) -- should adjust for changes in T_amb?? *)
73 (* NOTE also the equation in Lippke 1995 for bare tubes, which has a different form and requires wind speed *)
74 (* NOTE that Lippke says that end loss must be included in the above equation (eq 7, p. 11) *)
75 END absorber_loss;
76
77 MODEL absorber_loss_test;
78 type IS_A symbol_constant;
79 type :== 'vacuum';
80 T_i, T_o IS_A temperature;
81 DNI IS_A power_per_area;
82 abso IS_A absorber_loss(type,T_i,T_o,DNI);
83 Qd_loss ALIASES abso.Qd_loss;
84 METHODS
85 METHOD on_load;
86 FIX DNI, T_i, T_o;
87 DNI := 1000 {W/m^2};
88 T_i := 300 {K} + 273.15 {K};
89 T_o := 400 {K} + 237.15 {K};
90 END on_load;
91 END absorber_loss_test;
92
93
94 (*
95 Model of a parabolic trough field, based on the approach of Patnode, but
96 modified to allow for arbitrary (horizontal) orientation of the collector
97 axis.
98 *)
99 MODEL parabolic_trough;
100 (* field geometry *)
101 W_apert "collector aperture width" IS_A distance;
102 L_spacing "'length of spacing' between troughs" IS_A distance; (* clarification required, assume centre-to-centre? *)
103 L_SCA "length of a single solar collector assembly (SCA)" IS_A distance;
104 N_SCA "total number of solar collector assemblies" IS_A factor;
105 f "focal length of collector" IS_A distance;
106
107 A_field IS_A area;
108 A_field = N_SCA * L_SCA * W_apert;
109
110 (* field performance *)
111 Qdd_abs "solar radiation absorbed by receiver tubes per aperture area" IS_A power_per_area;
112 DNI "direct normal irradiance" IS_A power_per_area;
113 IAM "incidence angle modifier" IS_A factor;
114 eta_shading IS_A fraction;
115 eta_endloss IS_A fraction;
116 eta_field "averaged field efficiency" IS_A fraction;
117 eta_HCE "averaged heat collection element efficiency" IS_A fraction;
118 avail_SF "solar field availability - on-sun portion" IS_A fraction;
119
120 (* tracker and sun position *)
121 sun IS_A solar_tracker_single_horiz;
122 t "local time (standard, not DST correction)" ALIASES sun.t;
123
124 (* constants that define the location -- can we do this better?? *)
125 (* Kramer Junction *)
126 sun.loc.latitude :== 37.21 {deg};
127 sun.loc.longitude :== -117.022 {deg};
128 sun.loc.elevation :== 755 {ft};
129 (* TODO the location should be extracted from the weather data *)
130
131 (* weather data (download your TMY3, see http://ascend4.org/Data_reader) *)
132 dr IS_A tmy3;
133 dr.tmydata.filename :== 'johnpye/datareader/723815TY.csv';
134 t, dr.t ARE_THE_SAME;
135 T_amb ALIASES dr.T;
136 T_amb, sun.T ARE_THE_SAME;
137 p_amb ALIASES dr.p;
138 p_amb, sun.p ARE_THE_SAME;
139 DNI, dr.DNI ARE_THE_SAME;
140
141 (* OPTICAL PERFORMANCE *)
142
143 (* absorbed solar radiation, Patnode eq 2.1. factored the cos(theta) into IAM. *)
144 absheat_eq: Qdd_abs = DNI * IAM * eta_shading * eta_endloss * eta_field * eta_HCE * avail_SF;
145 (* NOTE that eta_field and eta_HCE are given fixed values here, though their
146 components factors are shown in Patnode sect 2.2.5 *)
147
148 (* TODO where is Patnode eq 2.8 ? looks like an error? *)
149
150 (* incidence angle modifier, Patnode eq 2.9 *)
151 (* TODO check... do these values assume angles in degrees? *)
152 IAM * cos(sun.theta) = cos(sun.theta) + 8.84e-4 * sun.theta - 5.369e-5 * sun.theta^2;
153
154 (* row shading (Stuetzle), Patnode eq 2.12, limited to range [0,1] *)
155 eta_shading_1, eta_shading_2 IS_A factor; (* before being normalised to [0,1] *)
156 shading_1: eta_shading_1 = (L_spacing/W_apert) * (cos(sun.zenith)/cos(sun.theta));
157 shading_2: eta_shading_2 = 1. + 0.5*((eta_shading_1 - 1) - abs(eta_shading_1 - 1));
158 shading_3: eta_shading = (eta_shading_2 + abs(eta_shading_2))/2;
159
160 (* end loss (Lippke), Patnode eq 2.13, limited to range [0,1] *)
161 eta_endloss_1, eta_endloss_2 IS_A factor;
162 endloss_1: eta_endloss_1 = 1 - f * tan(sun.theta) / L_SCA;
163 endloss_2: eta_endloss_2 = 1. + 0.5*((eta_endloss_1 - 1) - abs(eta_endloss_1 - 1));
164 endloss_3: eta_endloss = (eta_endloss_2 + abs(eta_endloss_2))/2;
165
166 (* LOSSES FROM HCE *)
167
168 T_i, T_o IS_A temperature;
169 hce_types IS_A set OF symbol_constant;
170 hce_types :== ['air','vacuum','hydrogen'];
171
172 abso[hce_types] IS_A absorber_loss_base;
173 hce_frac[hce_types] IS_A fraction;
174 FOR i IN hce_types CREATE
175 abso[i] IS_REFINED_TO absorber_loss(i, T_i, T_o, DNI);
176 END FOR;
177
178 Qdd_loss_recv "HCE losses per aperture area" IS_A power_per_area;
179 (* receiver heat loss, Patnode eq 2.19 *)
180 Qdd_loss_recv * W_apert = SUM[abso[i].Qd_loss * hce_frac[i] | i IN hce_types];
181
182 (* LOSSES FROM FIELD PIPING *)
183 DT "temperature difference ambient to field piping" IS_A delta_temperature;
184 (* average external temp difference, Patnode eq 2.21 *)
185 T_amb + DT = 0.5 * (T_i + T_o);
186
187 Qdd_loss_pipe "losses from pipework, per solar field aperture area" IS_A power_per_area;
188
189 (* solar field piping loses, Patnode eq 2.20 *)
190 Qdd_loss_pipe = 0.01693{W/m^2/K}*DT - 0.0001683{W/m^2/K^2}*(DT^2) + 0.78e-7{W/m^2/K^3}*(DT^3);
191 (* typically 10 W/m2 or less, apparently *)
192
193 (* NET ENERGY GAIN IN HTF *)
194
195 Vdot_i IS_A volume_rate;
196 Qdd_fluid IS_A power_per_area;
197 (* net absorbed energy, Patnode eq 2.22 *)
198 Qdd_fluid = Qdd_abs - Qdd_loss_pipe - Qdd_loss_recv;
199
200 inlet, outlet IS_A therminol;
201 inlet.T, T_i ARE_THE_SAME;
202 outlet.T, T_o ARE_THE_SAME;
203
204 Q_net IS_A energy_rate;
205 Q_net = Qdd_fluid * A_field;
206
207 (* first-law energy balance, Patnode eq 2.23 *)
208 (outlet.h - inlet.h) * inlet.rho * Vdot_i = Q_net;
209
210 METHODS
211 METHOD specify;
212 RUN sun.specify;
213 FIX L_spacing;
214 FIX W_apert, f, L_SCA, eta_field, eta_HCE, avail_SF;
215
216 FIX inlet.T;
217 FIX N_SCA;
218 FIX Vdot_i;
219 FIX hce_frac[hce_types];
220 FIX t;
221 FREE sun.p, sun.T;
222 END specify;
223
224 METHOD values;
225 L_spacing := 13 {m};
226 W_apert := 4.83 {m};
227 f := 5 {m};
228 L_SCA := 50 {m};
229 N_SCA := 256;
230
231 (* tracker, including sun position and geographical location *)
232 RUN sun.values;
233 sun.offset.tz := -8{h};
234 sun.offset.h := 0;
235 t := 43.5 {d};
236
237 (* fixed field efficiency based on values in Patnode Table 2.1 *)
238 eta_field := 0.857;
239 eta_HCE := 0.832;
240 avail_SF := 1;
241
242 inlet.T := 60{K} + 273.15 {K};
243 T_amb := 30{K} + 273.15 {K};
244 Vdot_i := 400{m^3/hour};
245
246 hce_frac['air'] := 1.0;
247 hce_frac['vacuum'] := 0.0;
248 hce_frac['hydrogen'] := 0.0;
249
250 (* initial guess, needed for solving OK *)
251 T_o := 200 {K} + 273.15{K};
252 END values;
253
254 METHOD on_load;
255 RUN specify;
256 RUN values;
257 END on_load;
258 END parabolic_trough;

john.pye@anu.edu.au
ViewVC Help
Powered by ViewVC 1.1.22