Code

1// Copyright 2015 Bo Johansson. All rights reserved
2// Mail: bo(stop)johansson(at)lsn(stop)se
3// Copyright 2015 Bo Johansson. All rights reserved
4// Mail: bo(stop)johansson(at)lsn(stop)se
5
6"use strict;";
7
8var boj = boj || {};
9
10boj.PHS = ( function () {
11 var pdo = boj.par_data_object;
12
13 var air = {};
14 var body = {};
15 var cloth = {};
16 var core = {};
17 var heatex = {};
18 var limit = {};
19 var move = {};
20 var skin = {};
21 var sweat = {};
22
23 var sim_mod;
24 var sim_time;
25
26//015: INITIALISATION
27
28 function var_reset(){
29
30 air.v_air = NaN;
31 air.Tair = NaN;
32 air.Trad = NaN;
33 air.Pw_air = NaN;
34
35 body.accl = NaN;
36 body.Adu = NaN;
37 body.fAdu_rad_aux = NaN;
38 body.fAdu_rad = NaN;
39 body.drink = NaN;
40 body.height = NaN;
41 body.Met = NaN;
42 body.posture = NaN;
43 body.spHeat = NaN;
44 body.Tbm = NaN;
45 body.Tbm_0 = NaN;
46 body.weight = NaN;
47 body.work = NaN;
48
49 cloth.fAcl = NaN;
50 cloth.Ia_st = NaN;
51 cloth.CORcl = NaN;
52 cloth.CORia = NaN;
53 cloth.CORe = NaN;
54 cloth.CORtot = NaN;
55 cloth.Icl_dyn = NaN;
56 cloth.im_dyn = NaN;
57 cloth.Rtdyn = NaN;
58 cloth.fAcl_rad = NaN;
59 cloth.Fr = NaN;
60 cloth.fAref = NaN;
61 cloth.Icl_st = NaN;
62 cloth.im_st = NaN;
63 cloth.Tcl = NaN;
64 cloth.Icl = NaN;
65 cloth.Itot_dyn = NaN;
66 cloth.Itot_st = NaN;
67
68 core.dStoreq = NaN;
69 core.sk_cr_rel = NaN;
70 core.sk_cr_rel_0 = NaN;
71 core.Tcr = NaN;
72 core.Tcr_0 = NaN;
73 core.Tcr_1 = NaN;
74 core.Tcreq_rm_ss = NaN;
75 core.Tcreq_mr_0 = NaN;
76 core.Tcreq_mr = NaN;
77 core.Tcreq_mr_ConstTeq = NaN;
78 core.Trec_0 = NaN;
79 core.Trec = NaN;
80
81 heatex.Hcdyn = NaN;
82 heatex.Hr = NaN;
83 heatex.Conv = NaN;
84 heatex.Rad = NaN;
85 heatex.Eresp = NaN;
86 heatex.Cresp = NaN;
87 heatex.Tresp = NaN;
88 heatex.Z = NaN;
89
90 limit.rec_temp = NaN;
91 limit.sweat_max50 = NaN;
92 limit.sweat_max95 = NaN;
93 limit.water_loss_max50 = NaN;
94 limit.water_loss_max95 = NaN;
95
96 move.v_walk_in = NaN;
97 move.v_air_rel = NaN;
98 move.walk_dir = NaN;
99 move.walk_dir_in = NaN;
100 move.v_walk = NaN;
101
102 sim_mod = NaN;
103 sim_time = NaN;
104
105 skin.Pw_sk = NaN;
106 skin.w_max = NaN;
107 skin.w_req = NaN;
108 skin.w_pre = NaN;
109 skin.Tsk_0 = NaN;
110 skin.Tsk = NaN;
111 skin.ConstTsk = NaN;
112
113 sweat.Emax = NaN;
114 sweat.Epre = NaN;
115 sweat.Ereq = NaN;
116 sweat.SWmax = NaN;
117 sweat.SWpre = NaN;
118 sweat.SWreq = NaN;
119 sweat.SW = NaN;
120 sweat.SWg = NaN;
121 sweat.SWtot = NaN;
122 sweat.SWtotg = NaN;
123 sweat.Eeff_req = NaN;
124 sweat.ConstSW = NaN;
125 sweat.fSWmax_accl = NaN;
126 }
127
128 var par_sim_mod = false;
129
130 var par_spec_sim = [
131//075: [[accl]] = 100; code =100 if acclimatised subject, 0 otherwise
132 [ 'accl', 'int', function(){ return body.accl; },
133 function(val){ body.accl = val === 0 ? 0 : 100;
134 par_sim_mod = true; },
135 { def_val : 100, min : 0, max : 100, unit : '%', symbol : 'accl',
136 descr : 'Acclimatised subject 0 or 100'}
137 ],
138//024: [[Drink]] = 1
139 [ 'drink', 'int', function(){ return body.drink; },
140 function(val){ body.drink = val === 0 ? 0 : 1;
141 par_sim_mod = true; },
142 { def_val : 1, min : 0, max : 1, unit : '', symbol : 'drink',
143 descr : 'May drink freely, 0 or 1'}
144 ],
145//026: [[height]] = 1.8; body height meters
146 [ 'height', 'float', function(){ return body.height; },
147 function(val){ body.height = val; par_sim_mod = true; },
148 { def_val : 1.8, min : 1.5, max : 2.4, dec_nof : 1, unit : 'm', symbol : 'height',
149 descr : 'Body height'}
150 ],
151//025: [[weight]] = 75; body mass kilogrammes
152 [ 'mass', 'float', function(){ return body.weight; },
153 function(val){ body.weight = val; par_sim_mod = true; },
154 { def_val : 75, min : 0, max : 120, dec_nof : 1, unit : 'kg', symbol : 'mass',
155 descr : 'Body mass'}
156 ],
157 // sim_mod = 0 default,
158 // = 1 iso7933 ver. 1,
159 // = 2 iso7933 ver. 2,
160 // = 3 as 1 and modified core_temp_pred,
161 // = 4 as 2 and modified core_temp_pred
162 [ 'sim_mod', 'int', function(){ return sim_mod; },
163 function(val){ sim_mod = val; par_sim_mod = true; },
164 { def_val : 0, min : 0, max : 4, unit : '', symbol : 'sim_mod',
165 descr : 'Simulation model variant'}
166 ]
167 ];
168
169 var par_swarm_sim = pdo.new_par_swarm( 'phs_sim' ).
170 create_parameter( par_spec_sim );
171
172 var par_step_mod = false;
173
174 var par_spec_step = [
175//062: Posture posture = 1 sitting, =2 standing, =3 crouching
176//063: [[posture]] = 2
177 [ 'post', 'int', function(){ return body.posture; },
178 function(val){ body.posture = val; par_step_mod = true; },
179 { def_val : 2, min : 1, max : 3, unit : '', symbol : 'post',
180 descr : '1= sitting, 2= standing, 3= crouching'}
181 ],
182//056: [[Ta]] = 40; air temperature degrees celsius
183 [ 'Tair', 'float', function(){ return air.Tair; },
184 function(val){ air.Tair = val; par_step_mod = true; },
185 { def_val : 40, min : 15, max : 50, dec_nof : 1, unit : 'C', symbol : 'Tair',
186 descr : 'Air temperature'}
187 ],
188//058: [[Pa]] = 2.5; partial water vapour pressure kilopascals
189 [ 'Pw_air', 'float', function(){ return air.Pw_air; },
190 function(val){ air.Pw_air = val; par_step_mod = true; },
191 { def_val : 2.5, min : 0, max : 4.5, dec_nof : 1, unit : 'kPa', symbol : 'Pw_air',
192 descr : 'Partial water vapour pressure'}
193 ],
194//057: [[Tr]] = 40; mean radiant temperature degrees celsius
195 [ 'Trad', 'float', function(){ return air.Trad; },
196 function(val){ air.Trad = val; par_step_mod = true; },
197 { def_val : 40, min : 15, max : 110, dec_nof : 1, unit : 'C', symbol : 'Trad',
198 descr : 'Radiant temperature'}
199 ],
200//059: [[Va]] = .3; air velocity metres per second
201 [ 'v_air', 'float', function(){ return air.v_air; },
202 function(val){air.v_air = val; par_step_mod = true; },
203 { def_val : 0.3, min : 0, max : 3.0, dec_nof : 1, unit : 'm/s', symbol : 'v_air',
204 descr : 'Air velocity'}
205 ],
206//060: [[Met]] = 150; metabolic rate Watts per square meter
207 [ 'Met', 'int', function(){ return body.Met; },
208 function(val){ body.Met = val; par_step_mod = true; },
209 { def_val : 150, min : 100, max : 400, unit : 'W/m2', symbol : 'Met',
210 descr : 'Metabolic energy production'}
211 ],
212//064: [[Icl]] = .5; static thermal insulation clo
213 [ 'Icl', 'float', function(){ return cloth.Icl; },
214 function(val){ cloth.Icl = val; par_step_mod = true; },
215 { def_val : 0.5, min : 0.1 , max : 1.2 , dec_nof : 1, unit : 'clo', symbol : 'Icl',
216 descr : 'Cloth static thermal insulation'}
217 ],
218//065: [[imst]] = .38; static moisture permeability index dimensionless
219 [ 'im_st', 'float', function(){ return cloth.im_st; },
220 function(val){ cloth.im_st = val; par_step_mod = true; },
221 { def_val : 0.38, min : 0, max : 1.0, dec_nof : 2, unit : '', symbol : 'im_st',
222 descr : 'Static moisture permeability index'}
223 ],
224//066: [[Ap]] = .54; fraction of the body surface covered
225 [ 'fAref', 'float', function(){ return cloth.fAref; },
226 function(val){ cloth.fAref = val; par_step_mod = true; },
227 { def_val : 0.54, min : 0, max : 1.0, dec_nof : 2, unit : '', symbol : 'Ap',
228 descr : 'Fraction covered by reflective clothing'}
229 ],
230//067: by the reflective clothing dimensionless
231//068: [[Fr]] = .97; emissivity of the reflective clothing dimensionless
232//069: (by default; Fr=0.97)
233 [ 'Fr', 'float', function(){ return cloth.Fr; },
234 function(val){ cloth.Fr = val; par_step_mod = true; },
235 { def_val : 0.97, min : 0, max : 1.0, dec_nof : 2, unit : '', symbol : 'Fr',
236 descr : 'Emissivity reflective clothing'}
237 ],
238//073: [[defdir]] = 0; code =1 if walking direction entered, 0 otherwise
239//074: [[THETA]] = 0; angle between walking direction and wind direction degrees
240 [ 'walk_dir', 'int', function(){ return move.walk_dir_in; },
241 function(val){ move.walk_dir_in = val; par_step_mod = true; },
242 { def_val : NaN, min : 0, max : 360, unit : 'degree', symbol : 'theta_ww',
243 descr : 'Angel betwen wind and walking direction', may_be_null : true}
244 ],
245//071: [[defspeed]] = 0; code =1 if walking speed entered, 0 otherwise
246//072: [[Walksp]] = 0; walking speed metres per second
247 [ 'v_walk', 'float', function(){ return move.v_walk_in; },
248 function(val){ move.v_walk_in = val; par_step_mod = true; },
249 { def_val : NaN, min : 0, max : 1.2, dec_nof : 1, unit : 'm/s', symbol : 'v_walk',
250 descr : 'Walking speed', may_be_null : true}
251 ],
252//061: [[Work]] = 0; effective mechanical power Watts per square metre
253 [ 'work', 'int', function(){ return body.work; },
254 function(val){ body.work = val; par_step_mod = true; },
255 { def_val : 0, min : 0, max : 200, unit : 'W/m2', symbol : 'body_work',
256 descr : 'Mechanical power'}
257 ]
258 ];
259
260 var par_swarm_step = pdo.new_par_swarm( 'phs_step' ).
261 create_parameter( par_spec_step );
262
263 var branch_reg = {};
264 var flag = 0;
265
266 function branch( id ){
267 if ( branch_reg[ id ]){ branch_reg[ id ] ++; }
268 else { branch_reg[ id ] = 1; }
269 }
270
271 function branch_reset(){
272 var res = JSON.stringify( branch_reg );
273 branch_reg = {};
274 return res;
275 }
276
277 function calc_sim_const(){
278 if ( sim_mod === 0 ) { sim_mod = 1; }
279//027: [[Adu]] = .202 * [[weight]] ^ .425 * [[height]] ^ .725
280 body.Adu = 0.202 * Math.pow( body.weight, 0.425 ) *
281 Math.pow( body.height, 0.725);
282//028: [[spHeat]] = 57.83 * [[weight]] / [[Adu]]
283 body.spHeat = 57.83 * body.weight / body.Adu;
284//254: IF DRINK =0 then [[Dlimloss95]] = [[Dlimloss95]] * 0.6; [[Dlimloss50]] = [[Dlimloss95]]
285 if ( body.drink === 1 ){
286//033: [[Dmax50]] = .075 * [[weight]] * 1000
287 limit.sweat_max50 = 0.075 * body.weight * 1000;
288//034: [[Dmax95]] = .05 * [[weight]] * 1000
289// Dmax50 not used in vba !!
290 limit.sweat_max95 = 0.05 * body.weight * 1000;
291 }
292 else {
293 limit.sweat_max50 = 0.03 * body.weight * 1000;
294 limit.sweat_max95 = 0.03 * body.weight * 1000;
295 }
296//088: IF body.accl < 50 THEN Wmax = .85 ELSE Wmax = 1
297 if ( body.accl < 50 ) { skin.w_max = 0.85; }
298 else { skin.w_max = 1; }
299//---------------------------------------------------------------
300//036: ' EXPONENTIAL AVERAGING CONSTANTS
301//037: ' Core temperature as a function of the metabolic rate; time constant; 10 minutes
302//038: [[ConstTeq]] = EXP(-1 / 10)
303 core.Tcreq_mr_ConstTeq = Math.exp( -1 / 10 );
304
305//039: ' Skin Temperature; time constant; 3 minutes
306//040: [[ConstTsk]] = EXP(-1 / 3)
307 skin.ConstTsk = Math.exp( -1 / 3 );
308//041: ' Sweat rate; time constant; 10 minutes
309//042: [[ConstSW]] = EXP(-1 / 10)
310 sweat.ConstSW = Math.exp( -1 / 10 );
311 par_sim_mod = false;
312 calc_step_const();
313 }
314
315 function calc_step_const(){
316//077: Effective radiating area of the body
317//078: IF [[posture]] = 1 THEN Ardu = .7
318// IF body.posture = 1 THEN Ardu = .7
319//079: IF [[posture]] = 2 THEN Ardu = .77
320// IF body.posture = 2 THEN Ardu = .77
321//080: IF [[posture]] = 3 THEN Ardu = .67
322// IF body.posture = 3 THEN Ardu = .6
323//Effective radiating area of the body
324 var posture = body.posture;
325 if ( posture == 1 ) {body.fAdu_rad = 0.7; }
326 else if ( posture == 2 ) {body.fAdu_rad = 0.77; }
327 else if ( posture == 3 ) {body.fAdu_rad = 0.67; }
328 else {body.fAdu_rad = 0.7; }
329//176:
330//177: [[auxR]] = 5.67E-08 * Ardu
331 body.fAdu_rad_aux = 5.67E-08 * body.fAdu_rad;
332 if ( sim_mod === 1 || sim_mod === 3 ) { // iso7933 ver. 1
333//082: EVALUATION OF THE MAXIMUM SWEAT RATE AS A FUNCTION OF THE METABOLIC RATE
334//083: [[SWmax]] = ([[Met]] - 32) * [[Adu]]
335 sweat.SWmax = (body.Met - 32) * body.Adu;
336//084: IF [[SWmax]] > 400 THEN [[SWmax]] = 400
337 if ( sweat.SWmax > 400 ) { sweat.SWmax = 400; }
338//085: IF [[SWmax]] < 250 THEN [[SWmax]] = 250
339 if ( sweat.SWmax < 250 ) { sweat.SWmax = 250; }
340 }
341 else if ( sim_mod === 2 || sim_mod === 4 ) { // iso7933 modified
342 sweat.SWmax = 400;
343 }
344 else { alert( 'ERROR in calc_step_const ' + sim_mod ); }
345//086: ' For acclimatised subjects (accl=100), the maximum Sweat Rate is greater by 25%
346//087: IF [[accl]] >= 50 THEN [[SWmax]] = [[SWmax]] * 1.25
347 if ( body.accl >= 50 ) { sweat.SWmax = sweat.SWmax * 1.25; }
348//090: ' EQUILIBRIUM CORE TEMPERATURE ASSOCIATED TO THE METABOLIC RATE
349//091: [[Tcreqm]] = .0036 * [[Met]] + 36.6
350 core.Tcreq_rm_ss = 0.0036 * body.Met + 36.6;
351//---------------------------------------------------------------
352//117: ' Static clothing insulation
353//118: [[Iclst]] = [[Icl]] * .155
354 cloth.Icl_st = cloth.Icl * 0.155;
355//119: Clothing area factor
356//120: [[fcl]] = 1 + .3 * [[Icl]]
357 cloth.fAcl = 1 + 0.3 * cloth.Icl;
358//121: Static boundary layer thermal insulation in quiet air
359//122: [[Iast]] = .111
360 cloth.Ia_st = 0.111;
361//123: Total static insulation
362//124: [[Itotst]] = [[Iclst]] + [[Iast]] / [[fcl]]
363//?? Itotst = Icl * 0.155 + 0.111 / fcl: ' Isolement total !!
364 cloth.Itot_st = cloth.Icl_st + cloth.Ia_st / cloth.fAcl;
365//---------------------------------------------------------------
366//126: ' Relative velocities due to air velocity and movements
367//127: IF [[defspeed]] > 0 THEN
368 if ( ! isNaN( move.v_walk_in ) ) {
369 move.v_walk = move.v_walk_in;
370//128: IF [[defdir]] = 1 THEN
371 if ( ! isNaN( move.walk_dir_in ) ){
372//129: Unidirectional walking
373//130: [[Var]] = ABS([[Va]] - [[Walksp]] * COS(3.14159 * [[THETA]] / 180))
374 move.v_air_rel = Math.abs( air.v_air - move.v_walk *
375 Math.cos(3.14159 * move.walk_dir_in / 180));
376 }
377//131: ELSE
378 else {
379//132: Omni-directional walking
380//133: IF [[Va]] < [[Walksp]] THEN [[Var]] = [[Walksp]] ELSE [[Var]] = [[Va]]
381 if ( air.v_air < move.v_walk ) {
382 move.v_air_rel = move.v_walk; }
383 else { move.v_air_rel = air.v_air; }
384//134: END IF
385 }
386 }
387//135: ELSE
388 else {
389//136: Stationary or undefined speed
390//137: [[Walksp]] = .0052 * ([[Met]] - 58); IF [[Walksp]] > .7 THEN [[Walksp]] = .7
391 move.v_walk = 0.0052 * (body.Met - 58);
392 if ( move.v_walk > 0.7) { move.v_walk = 0.7; }
393//138: [[Var]] = [[Va]]
394 move.v_air_rel = air.v_air;
395//139: END IF
396 }
397//---------------------------------------------------------------
398//164: ' Heat exchanges through respiratory convection and evaporation
399//165: ' temperature of the expired air
400//166: [[Texp]] = 28.56 + .115 * [[Ta]] + .641 * [[Pa]]
401 heatex.Tresp =
402 28.56 + 0.115 * air.Tair + 0.641 * air.Pw_air;
403//167: [[Cres]] = .001516 * [[Met]] * ([[Texp]] - [[Ta]])
404 heatex.Cresp =
405 0.001516 * body.Met * (heatex.Tresp - air.Tair);
406//168: [[Eres]] = .00127 * [[Met]] * (59.34 + .53 * [[Ta]] - 11.63 * [[Pa]])
407 heatex.Eresp = 0.00127 * body.Met *
408 (59.34 + 0.53 * air.Tair - 11.63 * air.Pw_air);
409//172: [[Z]] = 3.5 + 5.2 * [[Var]]
410//173: IF [[Var]] > 1 THEN [[Z]] = 8.7 * [[Var]] ^ .6
411 if ( move.v_air_rel > 1 ) {
412 heatex.Z = 8.7 * Math.pow( move.v_air_rel, 0.6 ); }
413 else {heatex.Z = 3.5 + 5.2 * move.v_air_rel; }
414 par_step_mod = false;
415 }
416
417 function reset(){
418 var_reset();
419 }
420
421 function sim_init(){
422//032: [[Dlimtre]] = 0; [[Dlimloss50]] = 0; [[Dlimloss95]] = 0
423 limit.rec_temp = NaN;
424 limit.water_loss_max50 = NaN;
425 limit.water_loss_max95 = NaN;
426//030: [[SWp]] = 0
427 sweat.SWpre = 0;
428//031: [[SWtot]] = 0; [[Tre]] = 36.8; [[Tcr]] = 36.8; [[Tsk]] = 34.1; [[Tcreq]] = 36.8; [[TskTcrwg]] = .3
429 sweat.SWtot = 0;
430 sweat.SWtotg = 0;
431 core.Trec = 36.8;
432 core.Tcr = 36.8;
433 skin.Tsk = 34.1;
434 //body.Tbm = 36.394922930774554;
435 //body.Tbm = 36.4;
436 body.Tbm = 36.39488;
437 core.Tcreq_mr = 36.8;
438 core.sk_cr_rel = 0.3;
439 cloth.Tcl = NaN;
440 sweat.Epre = NaN;
441 sweat.SW = NaN;
442 sweat.SWg = NaN;
443 sweat.SWmax = NaN;
444 sweat.SWreq = NaN;
445 sim_time = 0;
446
447 branch_reset();
448 calc_sim_const();
449 calc_step_const();
450 }
451
452 function step_core_temp_equi_mr(){
453//090: ' EQUILIBRIUM CORE TEMPERATURE ASSOCIATED TO THE METABOLIC RATE
454//091: [[Tcreqm]] = .0036 * [[Met]] + 36.6
455 var Tcreqm = core.Tcreq_rm_ss;
456 var ConstTeq = core.Tcreq_mr_ConstTeq;
457 var val_0 = core.Tcreq_mr_0;
458//092: ' Core temperature at this minute, by exponential averaging
459//093: [[Tcreq]] = [[Tcreq0]] * [[ConstTeq]] + [[Tcreqm]] * (1 - [[ConstTeq]])
460 core.Tcreq_mr = val_0 * ConstTeq + Tcreqm * ( 1 - ConstTeq);
461//094: ' Heat storage associated with this core temperature increase during the last minute
462//095: [[dStoreq]] = [[spHeat]] * ([[Tcreq]] - [[Tcreq0]]) * (1 - [[TskTcrwg0]])
463 core.dStoreq = body.spHeat * (core.Tcreq_mr - val_0) * (1 - core.sk_cr_rel_0);
464 }
465
466//097: ' SKIN TEMPERATURE PREDICTION
467
468 function skin_temp_equilibrium(){
469//098: ' Skin Temperature in equilibrium
470//099: Clothed model
471//100: [[Tskeqcl]] = 12.165 + .02017 * [[Ta]] + .04361 * [[Tr]] + .19354 * [[Pa]] - .25315 * [[Va]]
472//101: [[Tskeqcl]] = [[Tskeqcl]] + .005346 * [[Met]] + .51274 * [[Tre]]
473 var Tskeq_cl = 12.165 + 0.02017 * air.Tair + 0.04361 * air.Trad + 0.19354 * air.Pw_air -
474 0.25315 * air.v_air + 0.005346 * body.Met + 0.51274 * core.Trec;
475//102: Nude model
476//103: [[Tskeqnu]] = 7.191 + .064 * [[Ta]] + .061 * [[Tr]] + .198 * [[Pa]] - .348 * [[Va]]
477//104: [[Tskeqnu]] = [[Tskeqnu]] + .616 * [[Tre]]
478 var Tskeq_nu = 7.191 + 0.064 * air.Tair + 0.061 * air.Trad + 0.198 * air.Pw_air -
479 0.348 * air.v_air + 0.616 * core.Trec;
480 var I_cl = cloth.Icl;
481 if ( I_cl <= 0.2 ) { return Tskeq_nu; }
482 if ( I_cl >= 0.6 ) { return Tskeq_cl; }
483 var Tskeq = Tskeq_nu + 2.5 * ( Tskeq_cl - Tskeq_nu ) * (I_cl - 0.2);
484 return Tskeq;
485 }
486
487 function step_skin_temp(){
488 var Tskeq = skin_temp_equilibrium();
489 var ConstTsk = skin.ConstTsk;
490//110: ' Skin Temperature at this minute, by exponential averaging
491//112: Tsk = Tsk0 * ConstTsk + Tskeq * (1 - ConstTsk)
492 skin.Tsk = skin.Tsk_0 * ConstTsk + Tskeq * ( 1 - ConstTsk);
493//113: ' Saturated water vapour pressure at the surface of the skin
494//114: [[Psk]] = .6105 * EXP(17.27 * [[Tsk]] / ([[Tsk]] + 237.3))
495 skin.Pw_sk = 0.6105 * Math.exp( 17.27 * skin.Tsk / (skin.Tsk + 237.3));
496 }
497//116: ' CLOTHING INFLUENCE ON EXCHANGE COEFFICIENTS
498
499//141: ' Dynamic clothing insulation
500
501 function calc_dynamic_insulation(){
502//142: ' Clothing insulation correction for wind (Var) and walking (Walksp)
503//143: Vaux = [[Var]]; IF [[Var]] > 3 THEN Vaux = 3
504 var Vaux = move.v_air_rel;
505 if ( move.v_air_rel > 3) { Vaux = 3; }
506//144: Waux = [[Walksp]]; IF [[Walksp]] > 1.5 THEN Waux = 1.5
507 var Waux = move.v_walk;
508 if ( move.v_walk > 1.5 ) { Waux = 1.5; }
509//145: [[CORcl]] = 1.044 * EXP((.066 * Vaux - .398) * Vaux + (.094 * Waux - .378) * Waux)
510 cloth.CORcl =
511 1.044 * Math.exp(( 0.066 * Vaux - 0.398 ) * Vaux + ( 0.094 * Waux - 0.378 ) * Waux);
512//146: IF [[CORcl]] > 1 THEN [[CORcl]] = 1
513 if ( cloth.CORcl > 1 ) { cloth.CORcl = 1; }
514//147: [[CORia]] = EXP((.047 * [[Var]] - .472) * [[Var]] + (.117 * Waux - .342) * Waux)
515 cloth.CORia =
516 Math.exp(( 0.047 * move.v_air_rel - 0.472) * move.v_air_rel +
517 ( 0.117 * Waux - 0.342) * Waux);
518//148: IF [[CORia]] > 1 THEN [[CORia]] = 1
519 if ( cloth.CORia > 1 ) { cloth.CORia = 1; }
520//149: [[CORtot]] = [[CORcl]]
521 cloth.CORtot = cloth.CORcl;
522//150: IF [[Icl]] <= .6 THEN [[CORtot]] = ((.6 - [[Icl]]) * [[CORia]] + [[Icl]] * [[CORcl]]) / .6
523 if ( cloth.Icl <= 0.6 ) {
524 cloth.CORtot = (( 0.6 - cloth.Icl) * cloth.CORia +
525 cloth.Icl * cloth.CORcl) / 0.6;
526 }
527//152: [[Itotdyn]] = [[Itotst]] * [[CORtot]]
528 cloth.Itot_dyn =
529 cloth.Itot_st * cloth.CORtot;
530//153: [[IAdyn]] = [[CORia]] * [[Iast]]
531 var IAdyn = cloth.CORia * cloth.Ia_st;
532//154: [[Icldyn]] = [[Itotdyn]] - [[IAdyn]] / [[fcl]]
533 cloth.Icl_dyn = cloth.Itot_dyn - IAdyn / cloth.fAcl;
534
535//156: ' Permeability index
536//157: ' Correction for wind and walking
537//158: [[CORe]] = (2.6 * [[CORtot]] - 6.5) * [[CORtot]] + 4.9
538 cloth.CORe =
539 (2.6 * cloth.CORtot - 6.5) * cloth.CORtot + 4.9;
540//159: imdyn = [[imst]] * [[CORe]]; IF imdyn > .9 THEN imdyn = .9
541 cloth.im_dyn =
542 cloth.im_st * cloth.CORe;
543 if ( cloth.im_dyn > 0.9 ) { cloth.im_dyn = 0.9; }
544//160: ' Dynamic evaporative resistance
545//161: [[Rtdyn]] = [[Itotdyn]] / imdyn / 16.7
546 cloth.Rtdyn =
547 cloth.Itot_dyn / cloth.im_dyn / 16.7;
548 }
549
550//170: ' Mean temperature of the clothing; Tcl
551//171: ' Dynamic convection coefficient
552 function dynamic_convection_coefficient(){
553//174: [[Hcdyn]] = 2.38 * ABS([[Tsk]] - [[Ta]]) ^ .25
554 heatex.Hcdyn =
555 2.38 * Math.pow( Math.abs( skin.Tsk - air.Tair ), 0.25);
556//175: IF [[Z]] > [[Hcdyn]] THEN [[Hcdyn]] = [[Z]]
557 if ( heatex.Z > heatex.Hcdyn ) { heatex.Hcdyn = heatex.Z; }
558//176:
559//177: [[auxR]] = 5.67E-08 * Ardu
560// body.fAdu_rad_aux = 5.67E-08 * body.fAdu_rad;
561//178: [[FclR]] = (1 - [[Ap]]) * .97 + [[Ap]] * [[Fr]]
562 cloth.fAcl_rad = (1 - cloth.fAref) * 0.97 +
563 cloth.fAref * cloth.Fr;
564 }
565
566 function clothing_temp(){
567 var Hcdyn = heatex.Hcdyn;
568 var Trad_K_pow4 = air.Trad + 273;
569 Trad_K_pow4 = Trad_K_pow4 * Trad_K_pow4;
570 Trad_K_pow4 = Trad_K_pow4 * Trad_K_pow4;
571 var Tcl1;
572 var loop = 20;
573
574//179: [[Tcl]] = [[Tr]] + .1
575 cloth.Tcl = air.Trad + 0.1;
576//180: Tcl:
577 while ( loop > 0 ) {
578 loop--;
579//181: ' Radiation coefficient
580//182: [[Hr]] = [[FclR]] * [[auxR]] * (([[Tcl]] + 273) ^ 4 - ([[Tr]] + 273) ^ 4) / ([[Tcl]] - [[Tr]])
581 var Tcl_K_pow4 = cloth.Tcl + 273;
582 Tcl_K_pow4 = Tcl_K_pow4 * Tcl_K_pow4;
583 Tcl_K_pow4 = Tcl_K_pow4 * Tcl_K_pow4;
584 heatex.Hr = cloth.fAcl_rad * body.fAdu_rad_aux *
585 ( Tcl_K_pow4 - Trad_K_pow4 ) / (cloth.Tcl - air.Trad);
586//183: [[Tcl1]] = (([[fcl]] * ([[Hcdyn]] * [[Ta]] + [[Hr]] * [[Tr]]) + [[Tsk]] / [[Icldyn]])) / ([[fcl]] * ([[Hcdyn]] + [[Hr]]) + 1 / [[Icldyn]])
587 Tcl1 =
588 ((cloth.fAcl * (Hcdyn * air.Tair + heatex.Hr * air.Trad) +
589 skin.Tsk / cloth.Icl_dyn)) /
590 (cloth.fAcl *(Hcdyn + heatex.Hr) + 1 / cloth.Icl_dyn);
591//184:
592//185: IF ABS([[Tcl]] - [[Tcl1]]) > .001 THEN
593 if ( Math.abs(cloth.Tcl - Tcl1) > 0.001 ) {
594//186: [[Tcl]] = ([[Tcl]] + [[Tcl1]]) / 2
595 cloth.Tcl = (cloth.Tcl + Tcl1) / 2;
596 }
597 else { return; }
598//187: GOTO Tcl
599//188: END IF
600 }
601 alert( 'clothing_temp overun');
602 }
603
604//163: ' HEAT EXCHANGES
605
606 function calc_heat_exchange(){
607//190: ' Convection and Radiation heat exchanges
608//191: [[Conv]] = [[fcl]] * [[Hcdyn]] * ([[Tcl]] - [[Ta]])
609 heatex.Conv = cloth.fAcl * heatex.Hcdyn * (cloth.Tcl - air.Tair);
610//192: [[Rad]] = [[fcl]] * [[Hr]] * ([[Tcl]] - [[Tr]])
611 heatex.Rad = cloth.fAcl * heatex.Hr * (cloth.Tcl - air.Trad);
612//195: ' Required Evaporation Rate
613//196: [[Ereq]] = [[Met]] - [[dStoreq]] - [[Work]] - [[Cres]] - [[Eres]] - [[Conv]] - [[Rad]]
614 sweat.Ereq = body.Met - core.dStoreq - body.work - heatex.Cresp -
615 heatex.Eresp - heatex.Conv - heatex.Rad;
616 }
617
618//198: ' INTERPRETATION
619 function sweat_rate(){
620//193: ' Maximum Evaporation Rate
621//194: [[Emax]] = ([[Psk]] - [[Pa]]) / [[Rtdyn]]
622 sweat.Emax = (skin.Pw_sk - air.Pw_air) / cloth.Rtdyn;
623//201:
624//202: ' Required Sweat Rate
625//203: ' If no evaporation required; no sweat rate
626//204: IF [[Ereq]] <= 0 THEN [[Ereq]] = 0; [[SWreq]] = 0; GOTO [[SWp]]
627 if ( sweat.Ereq <= 0 ) {
628 sweat.Ereq = 0;
629 sweat.SWreq = 0;
630 //trace branch( 'sr1');
631 }
632//205: ' If evaporation is not possible, sweat rate is maximum
633//206: IF [[Emax]] <= 0 THEN [[Emax]] = 0; [[SWreq]] = [[SWmax]]; GOTO [[SWp]]
634 else if ( sweat.Emax <= 0 ) {
635 sweat.Emax = 0;
636 sweat.SWreq = sweat.SWmax;
637 //trace branch( 'sr2');
638 }
639 else{
640//199: ' Required wettedness
641//200: [[wreq]] = [[Ereq]] / [[Emax]]
642 skin.w_req = sweat.Ereq / sweat.Emax;
643//207: ' If required wettedness greater than 1.7; sweat rate is maximum
644//208: IF [[wreq]] >= 1.7 THEN [[wreq]] = 1.7; [[SWreq]] = [[SWmax]]; GOTO [[SWp]]
645 if ( skin.w_req >= 1.7 ) {
646 skin.w_req = 1.7;
647 sweat.SWreq = sweat.SWmax;
648 //trace branch( 'sr3.1');
649 }
650 else
651 {
652//209: ' Required evaporation efficiency
653//211: IF [[wreq]] > 1 THEN [[Eveff]] = (2 - [[wreq]]) ^ 2 / 2
654 if ( skin.w_req > 1 ) {
655 sweat.Eeff_req = ( 2 - skin.w_req ) * ( 2 - skin.w_req ) / 2;
656 //trace branch( 'sr3.2.1');
657 }
658 else
659 {
660//210: [[Eveff]] = (1 - [[wreq]] ^ 2 / 2)
661 sweat.Eeff_req = 1 - ( skin.w_req * skin.w_req / 2 );
662 //trace branch( 'sr3.2.2');
663 }
664//212: [[SWreq]] = [[Ereq]] / [[Eveff]]
665 sweat.SWreq = sweat.Ereq / sweat.Eeff_req;
666//213: IF [[SWreq]] > [[SWmax]] THEN [[SWreq]] = [[SWmax]]
667 if ( sweat.SWreq > sweat.SWmax ) {
668 sweat.SWreq = sweat.SWmax;
669 //trace branch( 'sr3.2.3');
670 }
671 }
672 }
673//215: SWp;
674//216: ' Predicted Sweat Rate, by exponential averaging
675//217: [[SWp]] = [[SWp]] * [[ConstSW]] + [[SWreq]] * (1 - [[ConstSW]])
676 sweat.SWpre = sweat.SWpre * sweat.ConstSW + sweat.SWreq * (1 - sweat.ConstSW);
677//218: IF [[SWp]] <= 0 THEN [[Ep]] = 0; [[SWp]] = 0; GOTO Storage
678 if ( sweat.SWpre <= 0 ) {
679 sweat.Epre = 0;
680 sweat.SWpre = 0;
681 //trace branch( 'sp1');
682 }
683//219:
684//220: ' Predicted Evaporation Rate
685//221: [[k]] = [[Emax]] / [[SWp]]
686 else {
687 var k = sweat.Emax / sweat.SWpre;
688//222: [[wp]] = 1
689 skin.w_pre = 1;
690//223: IF [[k]] >= .5 THEN [[wp]] = -k + SQR([[k]] * [[k]] + 2)
691 if ( k >= 0.5 ) {
692 skin.w_pre= -k + Math.sqrt( k * k + 2 );
693 //trace branch( 'sp2.1');
694 }
695//224: IF [[wp]] > Wmax THEN [[wp]] = Wmax
696 if ( skin.w_pre > skin.w_max ) {
697 skin.w_pre = skin.w_max;
698 //trace branch( 'sp2.2')
699 }
700//225: [[Ep]] = [[wp]] * [[Emax]]
701 sweat.Epre = skin.w_pre * sweat.Emax;
702 }
703//228: Storage:
704 //trace if ( sim_time <=5 || (sim_time % 40) === 0 ){
705 //trace console.log( JSON.stringify(
706 //trace {time: sim_time, Ereq: sweat.Ereq, Eeff_req: sweat.Eeff_req,
707 //trace SWreq: sweat.SWreq, SWpre: sweat.SWpre, Epre: sweat.Epre }
708 //trace ) + branch_reset() )
709 //trace }
710 }
711
712//231: ' PREDICTION OF THE CORE TEMPERATURE
713
714 function core_temp_pred_std(){
715//227: ' Heat Storage
716//229: [[dStorage]] = [[Ereq]] - [[Ep]] + [[dStoreq]]
717//!255: TotStore = TotStore + dStorage
718 var dStorage = sweat.Ereq - sweat.Epre + core.dStoreq;
719//232: [[Tcr1]] = [[Tcr0]]
720 core.Tcr_1 = core.Tcr_0;
721
722 var loop = 25;
723 while ( loop > 0 ) {
724 loop--;
725//233: TskTcr:
726//234: ' Skin - Core weighting
727//235: [[TskTcrwg]] = .3 - .09 * ([[Tcr1]] - 36.8)
728 core.sk_cr_rel = 0.3 - 0.09 * (core.Tcr_1 - 36.8);
729//236: IF [[TskTcrwg]] > .3 THEN [[TskTcrwg]] = .3
730 if ( core.sk_cr_rel > 0.3 ) { core.sk_cr_rel = 0.3; }
731//237: IF [[TskTcrwg]] < .1 THEN [[TskTcrwg]] = .1
732 if ( core.sk_cr_rel < 0.1 ) { core.sk_cr_rel = 0.1; }
733//238:
734//239: [[Tcr]] = [[dStorage]] / [[spHeat]] + [[Tsk0]] * [[TskTcrwg0]] / 2 - [[Tsk]] * [[TskTcrwg]] / 2
735 core.Tcr = dStorage / body.spHeat + skin.Tsk_0 * core.sk_cr_rel_0 / 2 -
736 skin.Tsk * core.sk_cr_rel / 2;
737//240: [[Tcr]] = ([[Tcr]] + [[Tcr0]] * (1 - [[TskTcrwg0]] / 2)) / (1 - [[TskTcrwg]] / 2)
738 core.Tcr = (core.Tcr + core.Tcr_0 * (1 - core.sk_cr_rel_0 / 2)) /
739 (1 - core.sk_cr_rel / 2);
740//241: IF ABS([[Tcr]] - [[Tcr1]]) > .001 THEN
741 if ( Math.abs(core.Tcr - core.Tcr_1 ) > 0.001 ) {
742//242: [[Tcr1]] = ([[Tcr1]] + [[Tcr]]) / 2; GOTO TskTcr
743 core.Tcr_1 = (core.Tcr_1 + core.Tcr) / 2;
744//243: END IF
745 }
746 else{
747 return;
748 }
749 }
750 alert( 'core_temp_pred_std overun');
751 }
752
753 // part of body having Tcr as mean temperature
754 function core_temp_pred_sk_cr_rel( Tcr ){
755 if ( Tcr < 36.8 ) { return 0.3; }
756 else if (Tcr > 39.0) { return 0.1; }
757 else { return 0.3 - 0.091 * (Tcr - 36.8); }
758 }
759
760 function core_temp_pred_Tcr ( Tbm, Tcr_0, Tsk ){
761 var Tcr = Tbm;
762 var loop = 25;
763 while ( loop > 0 ) {
764 loop--;
765 var sk_cr_rel_0_5 = core_temp_pred_sk_cr_rel( Tcr ) * 0.5;
766 //Tbm_1 = Tcr * ( 1 - sk_cr_rel ) + (Tsk + Tcr)* 0.5 * sk_cr_rel;
767 //Tbm_1 = Tcr - Tcr * sk_cr_rel + Tsk * sk_cr_rel * 0.5 + Tcr * sk_cr_rel * 0.5;
768 //Tbm_1 = Tcr( 1 - sk_cr_rel + sk_cr_rel * 0.5 ) + Tsk * sk_cr_rel * 0.5;
769 //Tbm_1 = Tcr( 1 - sk_cr_rel * 0.5 ) + Tsk * sk_cr_rel * 0.5;
770 Tbm_1 = Tcr * ( 1 - sk_cr_rel_0_5 ) + Tsk * sk_cr_rel_0_5;
771 var diff = Tbm_1 - Tbm;
772 if ( Math.abs( diff ) > 0.001 ) {
773 Tcr = Tcr - diff * 0.5;
774 }
775 else {
776 return Tcr;
777 }
778 }
779 console.error( 'core_temp_pred overun' + sim_time + Tcr );
780 return Tcr;
781 }
782
783 function core_temp_pred(){
784//227: ' Heat Storage
785//229: [[dStorage]] = [[Ereq]] - [[Ep]] + [[dStoreq]]
786 var dStorage = sweat.Ereq - sweat.Epre + core.dStoreq;
787 var dTempStorage = dStorage / body.spHeat;
788 body.Tbm = body.Tbm_0 + dTempStorage;
789 var rv = core_temp_pred_Tcr ( body.Tbm, core.Tcr_0, skin.Tsk );
790 core.Tcr = rv;
791 }
792
793//244:
794//245: ' PREDICTION OF THE RECTAL TEMPERATURE
795 function rect_temp_pred(){
796 var Tre0 = core.Trec_0;
797//246: [[Tre]] = [[Tre0]] + (2 * [[Tcr]] - 1.962 * [[Tre0]] - 1.31) / 9
798 core.Trec = Tre0 + (2 * core.Tcr - 1.962 * Tre0 - 1.31) / 9;
799//247: IF [[Dlimtre]] = 0 AND [[Tre]] >= 38 THEN [[Dlimtre]] = [[time]]
800 if ( ! limit.rec_temp && core.Trec >= 38 ) {
801 limit.rec_temp = sim_time; }
802 }
803
804 function water_loss(){
805//249: ' Total water loss rate during the minute (in W/m2)
806//250: [[SWtot]] = [[SWtot]] + [[SWp]] + [[Eres]]
807 sweat.SW = sweat.SWpre + heatex.Eresp;
808 sweat.SWtot = sweat.SWtot + sweat.SW;
809//251: [[SWtotg]] = [[SWtot]] * 2.67 * [[Adu]] / 1.8 / 60
810 var k_to_g = 2.67 * body.Adu / 1.8 / 60;
811 sweat.SWg = sweat.SW * k_to_g;
812 sweat.SWtotg = sweat.SWtot * k_to_g;
813//252: IF [[Dlimloss50]] = 0 AND [[SWtotg]] >= [[Dmax50]] THEN [[Dlimloss50]] = [[time]]
814 if (! limit.water_loss_max50 && sweat.SWtotg >= limit.sweat_max50 ) {
815 limit.water_loss_max50 = sim_time;
816 }
817//253: IF [[Dlimloss95]] = 0 AND [[SWtotg]] >= [[Dmax95]] THEN [[Dlimloss95]] = [[time]]
818 if ( ! limit.water_loss_max95 && sweat.SWtotg >= limit.sweat_max95 ) {
819 limit.water_loss_max95 = sim_time;
820 }
821 }
822
823 function state(){
824 return {
825 time : sim_time,
826 Tcreq : core.Tcreq_mr,
827 Tsk : skin.Tsk,
828 SWg : sweat.SWg,
829 SWtotg : sweat.SWtotg,
830 Tcr : core.Tcr,
831 Tre : core.Trec,
832 Tcl : cloth.Tcl,
833 SW : sweat.SW,
834 Epre : sweat.Epre,
835 SWreq : sweat.SWreq,
836 SWmax : sweat.SWmax
837 };
838 }
839
840 function time_step(){
841 if ( par_sim_mod ) {
842 alert( 'Simulation parameter changed between steps' );
843 }
844 if ( par_step_mod ){
845 calc_step_const();
846 }
847 sim_time++;
848//047: ' INITIALISATION MIN PER MIN
849//048: [[Tsk0]] = [[Tsk]]; [[Tre0]] = [[Tre]]; [[Tcr0]] = [[Tcr]]; [[Tcreq0]] = [[Tcreq]]; [[TskTcrwg0]] = [[TskTcrwg]]
850 body.Tbm_0 = body.Tbm;
851 core.Trec_0 = core.Trec;
852 core.Tcr_0 = core.Tcr;
853 core.Tcreq_mr_0 = core.Tcreq_mr;
854 core.sk_cr_rel_0 = core.sk_cr_rel;
855 skin.Tsk_0 = skin.Tsk;
856
857 step_core_temp_equi_mr();
858 step_skin_temp();
859 calc_dynamic_insulation();
860 dynamic_convection_coefficient();
861 clothing_temp();
862 calc_heat_exchange();
863 sweat_rate();
864 if ( sim_mod === 1 || sim_mod === 2 ){ // std core_temp_pred
865 core_temp_pred_std();
866 }
867 else { // modified core_temp_pred
868 core_temp_pred();
869 }
870 rect_temp_pred();
871 water_loss();
872
873 return state();
874 }
875
876 function current_result(){
877 return {
878 time : sim_time,
879 Tre : core.Trec,
880 SWtotg : sweat.SWtotg,
881 D_Tre : limit.rec_temp,
882 Dwl50 : limit.water_loss_max50,
883 Dwl95 : limit.water_loss_max95
884 };
885 }
886
887 function sample_get(){
888 var phs_data = {
889 air : air,
890 body : body,
891 cloth : cloth,
892 core : core,
893 heatex : heatex,
894 limit : limit,
895 move : move,
896 skin : skin,
897 sweat : sweat
898 };
899 var vid = [
900 'core:Tcreq_rm_ss', 'core:Tcreq_mr', 'core:dStoreq',
901 'skin:Tsk', 'skin:Pw_sk', 'move:v_air_rel',
902 'cloth:CORcl', 'cloth:CORia', 'cloth:CORtot', 'cloth:Itot_dyn',
903 'cloth:Icl_dyn', 'cloth:CORe', 'cloth:Rtdyn',
904 'heatex:Hcdyn', 'cloth:fAcl_rad', 'cloth:Tcl', 'heatex:Hr',
905 'heatex:Conv', 'heatex:Rad', 'sweat:Ereq', 'sweat:Emax',
906 'skin:w_req', 'sweat:SWpre', 'skin:w_pre', 'sweat:Epre',
907 'core:sk_cr_rel', 'core:Tcr', 'core:Trec',
908 'sweat:SWtot', 'sweat:SWtotg'
909 ];
910
911 var res = {
912 sim_time : sim_time,
913 sim_mod : sim_mod
914 };
915 var idp;
916 var tag;
917 var val;
918
919 vid.map( function(ai) {
920 idp = ai.split( ':' );
921 tag = idp.join( '_' );
922 var val = phs_data;
923 idp.map( function(id){val = val [ id ]; });
924 res[ tag ] = val;
925 } );
926
927 return res;
928 }
929
930 // Reveal public pointers to
931 // private functions and properties
932 return{
933 par_spec_sim : par_spec_sim,
934 par_spec_step : par_spec_step,
935 par_swarm_sim : par_swarm_sim,
936 par_swarm_step : par_swarm_step,
937 reset : reset,
938 sim_init : sim_init,
939 state : state,
940 time_step : time_step,
941 current_result : current_result,
942 sample_get : sample_get
943 };

Index

.169, 260
ConstTeq456, 460, 460
(ConstTeq) time constant, core temperature as a function of the metabolic rate
ConstTsk489, 492, 492
(ConstTsk) skin temperature; time constant; 3 minutes
Hcdyn567, 588, 590
(<lv> )
IAdyn531, 533
(<lv> )
I_cl480, 481, 482, 483
(I_cl) <lv>
JSON.stringify272
Math.abs374, 555, 593, 741, 772
(<func>ABS )
Math.cos375
(<func>COS )
Math.exp303, 307, 310, 495, 511, 516
(<func>EXP )
Math.pow280, 281, 412, 555
(<func>^ )
Math.sqrt692
(<func>SQR )
Tbm760, 761, 771
Tbm_1770, 771
Tcl1571, 587, 593, 595
(<lv> )
Tcl_K_pow4581, 582, 582, 582, 583, 583, 583, 585
Tcr754, 755, 756, 757, 761, 765, 770, 773, 773, 776, 779, 780
Tcr_0760
Tcreqm455, 460
(<lv> )
Trad_K_pow4568, 569, 569, 569, 570, 570, 570, 585
Tre0796, 798, 798
(<lv> )
Tsk760, 770
Tskeq483, 484, 488, 492
(<lv> )
Tskeq_cl473, 482, 483
(<lv> )
Tskeq_nu478, 481, 483, 483
(<lv> )
Vaux504, 505, 511, 511
(<lv> )
Waux507, 508, 511, 511, 517, 517
(<lv> )
ai919
(<lv> )
ai.split920
(() )
air13, 889
({} )
air.Pw_air33, 189, 190, 402, 408, 473, 478, 622
air.Tair31, 183, 184, 402, 405, 408, 473, 478, 555, 588, 609
(Ta) air temperature [C] 15-50
air.Trad32, 195, 196, 473, 478, 568, 575, 585, 588, 611
(Tr) mean radiant temperature [C] 15-110
air.v_air30, 201, 202, 374, 381, 383, 394, 474, 479
(Va) air velocity [m/s] 0-3
alert344, 601, 750, 842
(() )
body14, 890
({} )
body.Adu36, 280, 283, 335, 810
(Adu) DuBois body surface area [m2]
body.Met41, 207, 208, 335, 350, 391, 405, 407, 474, 614
(Met) metabolic rate [W\m2]
body.Tbm44, 436, 788, 789, 850
body.Tbm_045, 788, 850
body.accl35, 132, 133, 297, 347
(accl) acclimatised subject []
body.drink39, 139, 140, 285
(DRINK) ==1 can drink freely
body.fAdu_rad38, 325, 326, 327, 328, 331
(fAdu_rad) effective radiating area of the body []
body.fAdu_rad_aux37, 331, 584
(auxR) = 5.67E-08 * Ardu
body.height40, 146, 147, 281
(height) body height [m]
body.posture42, 177, 178, 324
(posture) == 1 sitting, == 2 standing, == 3 crouching
body.spHeat43, 283, 463, 735, 787
(spHeat)
body.weight46, 152, 153, 280, 283, 287, 290, 293, 294
(weight) body weight [kg]
body.work47, 253, 254, 614
(Work) mechanical power [W\m2]
boj8, 8
({} )
boj.PHS10
({} )
boj.par_data_object11
branch266
branch_reg263, 267, 267, 268, 272, 273
branch_reset271, 447
calc_dynamic_insulation501, 859
(() )
calc_heat_exchange606, 862
(() )
calc_sim_const277, 448
(() )
calc_step_const312, 315, 449, 845
(() )
cloth15, 891
({} )
cloth.CORcl51, 510, 513, 513, 521, 525
(CORcl) correction Icl []
cloth.CORe53, 538, 542
(CORe) correction dynamic permeability index []
cloth.CORia52, 515, 519, 519, 524, 531
(CORia) correction Ia_st []
cloth.CORtot54, 521, 524, 529, 539, 539
(CORtot) correction dynamic clothing insulation []
cloth.Fr59, 233, 234, 563
(FclR) reduction factor radiation heat exchange clothing
cloth.Ia_st50, 360, 364, 531
(Ia_st) static boundary layer thermal insulation in quiet air [?]
cloth.Icl64, 213, 214, 354, 357, 480, 523, 524, 525
(Icl) static clothing insulation [?]
cloth.Icl_dyn55, 533, 589, 590
(Icl_dyn) dynamic clothing insulation [?]
cloth.Icl_st61, 354, 364
(Icl_st) static clothing insulation
cloth.Itot_dyn65, 528, 533, 547
(Itotdyn) total dynamic insulation [m2K/W]
cloth.Itot_st66, 364, 529
(Itotst) total static insulation [m2K/W]
cloth.Rtdyn57, 546, 622
(Rtdyn) dynamic evaporative resistance [?]
cloth.Tcl63, 439, 575, 581, 585, 593, 595, 595, 609, 611, 832
(Tcl) mean temperature of the clothing [C]
cloth.fAcl49, 357, 364, 533, 588, 590, 609, 611
(fAcl) clothing area factor []
cloth.fAcl_rad58, 562, 584
(fAcl_rad) reflective clothing area factor []
cloth.fAref60, 225, 226, 562, 563
(Ap) fraction covered by reflective clothing []
cloth.im_dyn56, 541, 543, 543, 547
(im_dyn) dynamic moisture permeability index []
cloth.im_st62, 219, 220, 542
(im_st) static moisture permeability index []
clothing_temp566, 861
(() )
console.error779
(() )
core16, 892
({} )
core.Tcr71, 432, 735, 738, 738, 741, 743, 790, 798, 830, 852
(Tcr) body core temperature [C]
core.Tcr_072, 720, 738, 789, 852
(Tcr0) body core temperature SoI [C]
core.Tcr_173, 720, 728, 741, 743, 743
(<lv>Tcr1) body core temperature [C]
core.Tcreq_mr76, 437, 460, 463, 826, 853
(Tcreq) core equilibrium temperature at this minute [C]
core.Tcreq_mr_075, 457, 853
(core.Tcreq0) core equilibrium temperature previous minute [C]
core.Tcreq_mr_ConstTeq77, 303, 456
(ConstTeq) time constant Tcreq [/minute]
core.Tcreq_rm_ss74, 350, 455
(Tcreqm) equilibrium core temperature associated to the metabolic rate [C]
core.Trec79, 431, 474, 479, 798, 800, 831, 851, 879
(Trec) rectal temperature this minute [C]
core.Trec_078, 796, 851
(Trec0) rectal temperature previous minute [C]
core.dStoreq68, 463, 614, 718, 786
(dStoreq) heat storage, core temperature increase during this minute [?]
core.sk_cr_rel69, 438, 728, 730, 730, 732, 732, 736, 739, 854
(TskTcrwg) skin - core weighting this minute []
core.sk_cr_rel_070, 463, 735, 738, 854
(TskTcrwg) skin - core weighting previous minute []
core_temp_pred783, 868
(() )
core_temp_pred_Tcr760, 789
core_temp_pred_sk_cr_rel754, 765
core_temp_pred_std714, 865
(() )
create_parameter170, 261
current_result876, 941
dStorage718, 735, 786, 787
(<lv> )
dTempStorage787, 788
(<lv> )
diff771, 772, 773
dynamic_convection_coefficient552, 860
(() )
flag264
heatex17, 893
({} )
heatex.Conv83, 609, 615
(heatex.Conv )
heatex.Cresp86, 404, 614
(heatex.Cresp )
heatex.Eresp85, 407, 615, 807
(heatex.Eresp )
heatex.Hcdyn81, 554, 557, 557, 567, 609
(heatex.Hcdyn )
heatex.Hr82, 584, 588, 590, 611
(heatex.Hr )
heatex.Rad84, 611, 615
(heatex.Rad )
heatex.Tresp87, 401, 405
(heatex.Tresp )
heatex.Z88, 412, 413, 557, 557
(heatex.Z )
id266, 267, 267, 268, 923, 923
(<lv> )
idp915, 920
(<lv> )
idp.join921
(() )
idp.map923
(() )
k687, 691, 692, 692, 692
(<lv> )
k_to_g810, 811, 812
(<lv> )
limit18, 894
({} )
limit.rec_temp90, 423, 800, 801, 881
(limit.rec_temp )
limit.sweat_max5091, 287, 293, 814
(limit.sweat_max50 )
limit.sweat_max9592, 290, 294, 818
(limit.sweat_max95 )
limit.water_loss_max5093, 424, 814, 815, 882
(limit.water_loss_max50 )
limit.water_loss_max9594, 425, 818, 819, 883
(limit.water_loss_max95 )
loop572, 577, 578, 722, 723, 724, 762, 763, 764
(<lv> )
move19, 895
({} )
move.v_air_rel97, 374, 382, 383, 394, 411, 412, 413, 504, 505, 516, 516
(move.v_air_rel )
move.v_walk100, 369, 374, 381, 382, 391, 392, 392, 507, 508
(move.v_walk )
move.v_walk_in96, 247, 248, 368, 369
(move.v_walk_in )
move.walk_dir98
(move.walk_dir )
move.walk_dir_in99, 240, 241, 371, 375
(move.walk_dir_in )
par_sim_mod128, 134, 141, 147, 153, 163, 311, 841
par_spec_sim130, 170, 933
(<lv> )
par_spec_step174, 261, 934
(<lv> )
par_step_mod172, 178, 184, 190, 196, 202, 208, 214, 220, 226, 234, 241, 248, 254, 414, 844
par_swarm_sim169, 935
par_swarm_step260, 936
pdo11
pdo.new_par_swarm169, 260
phs_data888, 922
({} )
posture324, 325, 326, 327
(<lv> )
rect_temp_pred795, 870
(() )
res272, 274, 911, 924, 927
(<lv> )
reset417, 937
(() )
rv789, 790
sample_get887, 942
(() )
sim_init421, 938
(() )
sim_mod23, 102, 162, 163, 278, 278, 332, 332, 341, 341, 344, 864, 864, 913
sim_time24, 103, 445, 779, 801, 815, 819, 825, 847, 878, 912
(() )
sk_cr_rel_0_5765, 770, 770
skin20, 896
({} )
skin.ConstTsk111, 307, 489
(skin.ConstTsk )
skin.Pw_sk105, 495, 622
skin.Tsk110, 433, 492, 495, 495, 555, 589, 736, 789, 827, 855
(skin.Tsk )
skin.Tsk_0109, 492, 735, 855
(skin.Tsk_0 )
skin.w_max106, 297, 298, 696, 697
(skin.w_max )
skin.w_pre108, 689, 692, 696, 697, 701
(skin.w_pre )
skin.w_req107, 642, 645, 646, 654, 655, 655, 661, 661
(skin.w_req )
skin_temp_equilibrium468, 488
(() )
state823, 873, 939
step_core_temp_equi_mr452, 857
(() )
step_skin_temp487, 858
(() )
sweat21, 897
({} )
sweat.ConstSW124, 310, 676, 676
(ConstSW) time constant sweat rate []
sweat.Eeff_req123, 655, 661, 665
(Eeff_req) required evaporation efficiency []
sweat.Emax113, 622, 634, 635, 642, 687, 701
(Emax) maximal evaporation rate [W/m2]
sweat.Epre114, 440, 679, 701, 718, 786, 834
(Epre) predicted evaporation rate [W/m2]
sweat.Ereq115, 614, 627, 628, 642, 665, 718, 786
(Ereq) required evaporation rate [W/m2]
sweat.SW119, 441, 807, 808, 811, 833
(SW) sweat rate [g]
sweat.SWg120, 442, 811, 828
(SWg) sweat rate [W/m2]
sweat.SWmax116, 335, 337, 337, 339, 339, 342, 347, 347, 443, 636, 647, 667, 668, 836
(SWmax) maximum sweat rate as result of the metabolic rate [W/m2]
sweat.SWpre117, 427, 676, 676, 678, 680, 687, 807
(SWpre) predicted sweat rate [W/m2]
sweat.SWreq118, 444, 629, 636, 647, 665, 667, 668, 676, 835
(SWreq) required sweat rate [W/m2]
sweat.SWtot121, 429, 808, 808, 812
(SWtot) total water loss rate during the minutes [W/m2]
sweat.SWtotg122, 430, 812, 814, 818, 829, 880
(SWtotg) total water loss [g]
sweat.fSWmax_accl125
(fSWmax_accl) correction factor to SWmax depending on accl []
sweat_rate619, 863
tag916, 921, 924
(<lv> )
time_step840, 940
(() )
val133, 133, 140, 140, 147, 147, 153, 153, 163, 163, 178, 178, 184, 184, 190, 190, 196, 196, 202, 202, 208, 208, 214, 214, 220, 220, 226, 226, 234, 234, 241, 241, 248, 248, 254, 254, 917, 922, 923, 923, 924
(<lv> )
val_0457, 460, 463
(<lv> )
var_reset28, 418
vid899
(<lv> )
vid.map919
(() )
water_loss804, 871
(() )