/[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 2624 - (show annotations) (download) (as text)
Tue May 15 23:02:57 2012 UTC (7 years, 5 months ago) by jpye
File MIME type: text/x-ascend
File size: 6177 byte(s)
Receiver moved to separate file, fixed error in Qd_loss equation.
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 REQUIRE "solar/trough_receiver.a4c";
16
17 (*
18 Model of a parabolic trough field, based on the approach of Patnode, but
19 modified to allow for arbitrary (horizontal) orientation of the collector
20 axis.
21 *)
22 MODEL parabolic_trough;
23 (* field geometry *)
24 W_apert "collector aperture width" IS_A distance;
25 L_spacing "'length of spacing' between troughs" IS_A distance; (* clarification required, assume centre-to-centre? *)
26 L_SCA "length of a single solar collector assembly (SCA)" IS_A distance;
27 N_SCA "total number of solar collector assemblies" IS_A factor;
28 f "focal length of collector" IS_A distance;
29
30 A_field IS_A area;
31 A_field = N_SCA * L_SCA * W_apert;
32
33 (* field performance *)
34 Qdd_abs "solar radiation absorbed by receiver tubes per aperture area" IS_A power_per_area;
35 DNI "direct normal irradiance" IS_A power_per_area;
36 IAM "incidence angle modifier" IS_A factor;
37 eta_shading IS_A fraction;
38 eta_endloss IS_A fraction;
39 eta_field "averaged field efficiency" IS_A fraction;
40 eta_HCE "averaged heat collection element efficiency" IS_A fraction;
41 avail_SF "solar field availability - on-sun portion" IS_A fraction;
42
43 (* tracker and sun position *)
44 sun IS_A solar_tracker_single_horiz;
45 t "local time (standard, not DST correction)" ALIASES sun.t;
46
47 (* constants that define the location -- can we do this better?? *)
48 (* Kramer Junction *)
49 sun.loc.latitude :== 37.21 {deg};
50 sun.loc.longitude :== -117.022 {deg};
51 sun.loc.elevation :== 755 {ft};
52 (* TODO the location should be extracted from the weather data *)
53
54 (* weather data (download your TMY3, see http://ascend4.org/Data_reader) *)
55 dr IS_A tmy3;
56 dr.tmydata.filename :== 'johnpye/datareader/723815TY.csv';
57 t, dr.t ARE_THE_SAME;
58 T_amb ALIASES dr.T;
59 T_amb, sun.T ARE_THE_SAME;
60 p_amb ALIASES dr.p;
61 p_amb, sun.p ARE_THE_SAME;
62 DNI, dr.DNI ARE_THE_SAME;
63
64 (* OPTICAL PERFORMANCE *)
65
66 (* absorbed solar radiation, Patnode eq 2.1. factored the cos(theta) into IAM. *)
67 absheat_eq: Qdd_abs = DNI * IAM * eta_shading * eta_endloss * eta_field * eta_HCE * avail_SF;
68 (* NOTE that eta_field and eta_HCE are given fixed values here, though their
69 components factors are shown in Patnode sect 2.2.5 *)
70
71 (* TODO where is Patnode eq 2.8 ? looks like an error? *)
72
73 (* incidence angle modifier, Patnode eq 2.9 *)
74 (* TODO check... do these values assume angles in degrees? *)
75 IAM * cos(sun.theta) = cos(sun.theta) + 8.84e-4 * sun.theta - 5.369e-5 * sun.theta^2;
76
77 (* row shading (Stuetzle), Patnode eq 2.12, limited to range [0,1] *)
78 eta_shading_1, eta_shading_2 IS_A factor; (* before being normalised to [0,1] *)
79 shading_1: eta_shading_1 = (L_spacing/W_apert) * (cos(sun.zenith)/cos(sun.theta));
80 shading_2: eta_shading_2 = 1. + 0.5*((eta_shading_1 - 1) - abs(eta_shading_1 - 1));
81 shading_3: eta_shading = (eta_shading_2 + abs(eta_shading_2))/2;
82
83 (* end loss (Lippke), Patnode eq 2.13, limited to range [0,1] *)
84 eta_endloss_1, eta_endloss_2 IS_A factor;
85 endloss_1: eta_endloss_1 = 1 - f * tan(sun.theta) / L_SCA;
86 endloss_2: eta_endloss_2 = 1. + 0.5*((eta_endloss_1 - 1) - abs(eta_endloss_1 - 1));
87 endloss_3: eta_endloss = (eta_endloss_2 + abs(eta_endloss_2))/2;
88
89 (* LOSSES FROM HCE *)
90
91 T_i, T_o IS_A temperature;
92 hce_types IS_A set OF symbol_constant;
93 hce_types :== ['air','vacuum','hydrogen'];
94
95 recv[hce_types] IS_A receiver_loss_base;
96 hce_frac[hce_types] IS_A fraction;
97 FOR i IN hce_types CREATE
98 recv[i] IS_REFINED_TO receiver_loss_integ(i, T_i, T_o, DNI);
99 END FOR;
100
101 Qdd_loss_recv "HCE losses per aperture area" IS_A power_per_area;
102 (* receiver heat loss, Patnode eq 2.19 *)
103 Qdd_loss_recv * W_apert = SUM[recv[i].Qd_loss * hce_frac[i] | i IN hce_types];
104
105 (* LOSSES FROM FIELD PIPING *)
106 DT "temperature difference ambient to field piping" IS_A delta_temperature;
107 (* average external temp difference, Patnode eq 2.21 *)
108 T_amb + DT = 0.5 * (T_i + T_o);
109
110 Qdd_loss_pipe "losses from pipework, per solar field aperture area" IS_A power_per_area;
111
112 (* solar field piping loses, Patnode eq 2.20 *)
113 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);
114 (* typically 10 W/m2 or less, apparently *)
115
116 (* NET ENERGY GAIN IN HTF *)
117
118 Vdot_i IS_A volume_rate;
119 Qdd_fluid IS_A power_per_area;
120 (* net absorbed energy, Patnode eq 2.22 *)
121 Qdd_fluid = Qdd_abs - Qdd_loss_pipe - Qdd_loss_recv;
122
123 inlet, outlet IS_A therminol;
124 inlet.T, T_i ARE_THE_SAME;
125 outlet.T, T_o ARE_THE_SAME;
126
127 Q_net IS_A energy_rate;
128 Q_net = Qdd_fluid * A_field;
129
130 (* first-law energy balance, Patnode eq 2.23 *)
131 (outlet.h - inlet.h) * inlet.rho * Vdot_i = Q_net;
132
133 METHODS
134 METHOD specify;
135 RUN sun.specify;
136 FIX L_spacing;
137 FIX W_apert, f, L_SCA, eta_field, eta_HCE, avail_SF;
138
139 FIX inlet.T;
140 FIX N_SCA;
141 FIX Vdot_i;
142 FIX hce_frac[hce_types];
143 FIX t;
144 FREE sun.p, sun.T;
145 END specify;
146
147 METHOD values;
148 L_spacing := 13 {m};
149 W_apert := 4.83 {m};
150 f := 5 {m};
151 L_SCA := 50 {m};
152 N_SCA := 256;
153
154 (* tracker, including sun position and geographical location *)
155 RUN sun.values;
156 sun.offset.tz := -8{h};
157 sun.offset.h := 0;
158 t := 43.5 {d};
159
160 (* fixed field efficiency based on values in Patnode Table 2.1 *)
161 eta_field := 0.857;
162 eta_HCE := 0.832;
163 avail_SF := 1;
164
165 inlet.T := 60{K} + 273.15 {K};
166 T_amb := 30{K} + 273.15 {K};
167 Vdot_i := 400{m^3/hour};
168
169 hce_frac['air'] := 0.0;
170 hce_frac['vacuum'] := 1.0;
171 hce_frac['hydrogen'] := 0.0;
172
173 (* initial guess, needed for solving OK *)
174 T_o := 200 {K} + 273.15{K};
175 END values;
176
177 METHOD on_load;
178 RUN specify;
179 RUN values;
180 END on_load;
181 END parabolic_trough;

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