Skip to content

Commit d6a0e17

Browse files
committed
use Setfield.jl rather than setproperties
1 parent 10ddb8f commit d6a0e17

4 files changed

Lines changed: 43 additions & 83 deletions

File tree

Project.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9"
99
FluidProperties = "d16f1b92-71d3-42f3-aafa-43e5bb0efda8"
1010
HeatExchange = "720bd838-cdd6-4aad-926b-452b962dce21"
1111
ModelParameters = "4744a3fa-6c31-4707-899e-a3298e4618ad"
12+
Setfield = "efcf1570-3423-57d1-acb7-fd33fddbac46"
1213
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
1314
UnitfulMoles = "999f2bd7-36bf-5ba7-9bc1-c9473aa75374"
1415

@@ -27,6 +28,7 @@ FluidProperties = "0.1"
2728
HeatExchange = "0.1"
2829
ModelParameters = "0.4"
2930
SafeTestsets = "0.1"
31+
Setfield = "1"
3032
Tables = "1"
3133
Test = "1"
3234
Unitful = "1"

src/BiophysicalBehaviour.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ using UnitfulMoles
1212
using BiophysicalGeometry: AbstractBody, shape
1313

1414
using ConstructionBase: getproperties, setproperties
15+
using Setfield: @set
1516

1617
# Organism and traits
1718
export AbstractBehavior,

src/endotherm/homeothermy.jl

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -97,26 +97,15 @@ function thermoregulate(
9797
if insulation_limits.dorsal.step > 0.0 &&
9898
(insulation_limits.dorsal.current + insulation_limits.ventral.current) > 0u"mm"
9999
# Start with erect insulation (set to max)
100-
dorsal_max = ConstructionBase.setproperties(
101-
insulation_limits.dorsal; current=insulation_limits.dorsal.max
102-
)
103-
ventral_max = ConstructionBase.setproperties(
104-
insulation_limits.ventral; current=insulation_limits.ventral.max
105-
)
106-
insulation_limits = InsulationLimits(; dorsal=dorsal_max, ventral=ventral_max)
100+
insulation_limits = @set insulation_limits.dorsal.current = insulation_limits.dorsal.max
101+
insulation_limits = @set insulation_limits.ventral.current = insulation_limits.ventral.max
107102
# Apply to organism with step=0 (just set to max, don't decrement)
108-
zero_step_dorsal = ConstructionBase.setproperties(insulation_limits.dorsal; step=0)
109-
zero_step_ventral = ConstructionBase.setproperties(insulation_limits.ventral; step=0)
110-
zero_step_limits = InsulationLimits(; dorsal=zero_step_dorsal, ventral=zero_step_ventral)
103+
zero_step_limits = @set insulation_limits.dorsal.step = 0.0
104+
zero_step_limits = @set zero_step_limits.ventral.step = 0.0
111105
insulation_limits, organism = piloerect(organism, zero_step_limits)
112106
# Restore original step values
113-
dorsal_with_step = ConstructionBase.setproperties(
114-
insulation_limits.dorsal; step=limits.insulation.dorsal.step
115-
)
116-
ventral_with_step = ConstructionBase.setproperties(
117-
insulation_limits.ventral; step=limits.insulation.ventral.step
118-
)
119-
insulation_limits = InsulationLimits(; dorsal=dorsal_with_step, ventral=ventral_with_step)
107+
insulation_limits = @set insulation_limits.dorsal.step = limits.insulation.dorsal.step
108+
insulation_limits = @set insulation_limits.ventral.step = limits.insulation.ventral.step
120109
end
121110

122111
endotherm_out = solve_metabolic_rate(organism, environment, T_skin, T_insulation)

src/endotherm/thermoregulation.jl

Lines changed: 34 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,8 @@ Reduce insulation depth toward reference values (flatten fur/feathers).
66
Returns updated `InsulationLimits` and `organism`.
77
"""
88
function piloerect(organism::Organism, insulation_limits::InsulationLimits)
9-
phys = organism.traits.physiology
10-
insulation_pars = HeatExchange.insulationpars(phys)
11-
shape_pars = HeatExchange.shapepars(phys)
9+
insulation_pars = HeatExchange.insulationpars(organism)
10+
shape_pars = HeatExchange.shapepars(organism)
1211
fibre_length_dorsal = insulation_pars.dorsal.length
1312
fibre_length_ventral = insulation_pars.ventral.length
1413

@@ -23,17 +22,11 @@ function piloerect(organism::Organism, insulation_limits::InsulationLimits)
2322
)
2423

2524
# Update limits
26-
dorsal_limits′ = setproperties(insulation_limits.dorsal; current=insulation_depth_dorsal)
27-
ventral_limits′ = setproperties(insulation_limits.ventral; current=insulation_depth_ventral)
28-
insulation_limits′ = InsulationLimits(; dorsal=dorsal_limits′, ventral=ventral_limits′)
29-
30-
# Update organism insulation parameters (nested FibreProperties)
31-
dorsal′ = setproperties(insulation_pars.dorsal; depth=insulation_depth_dorsal)
32-
ventral′ = setproperties(insulation_pars.ventral; depth=insulation_depth_ventral)
33-
insulation_pars′ = setproperties(insulation_pars; dorsal=dorsal′, ventral=ventral′)
25+
insulation_limits = @set insulation_limits.dorsal.current = insulation_depth_dorsal
26+
insulation_limits = @set insulation_limits.ventral.current = insulation_depth_ventral
3427

3528
# Compute mean insulation properties
36-
ventral_frac = HeatExchange.radiationpars(phys).ventral_fraction
29+
ventral_frac = HeatExchange.radiationpars(organism).ventral_fraction
3730
mean_insulation_depth = insulation_depth_dorsal * (1 - ventral_frac) +
3831
insulation_depth_ventral * ventral_frac
3932
mean_fibre_diameter = insulation_pars.dorsal.diameter * (1 - ventral_frac) +
@@ -46,12 +39,12 @@ function piloerect(organism::Organism, insulation_limits::InsulationLimits)
4639
fat = BiophysicalGeometry.inner_insulation(organism.body.insulation)
4740
geometry = Body(shape_pars, CompositeInsulation(fur, fat))
4841

49-
# Update organism immutably
50-
phys′ = setproperties(phys; insulation_pars=insulation_pars′)
51-
traits′ = setproperties(organism.traits; physiology=phys′)
52-
organism = setproperties(organism; traits=traits′, body=geometry)
42+
# Update organism
43+
organism = @set organism.traits.physiology.insulation_pars.dorsal.depth = insulation_depth_dorsal
44+
organism = @set organism.traits.physiology.insulation_pars.ventral.depth = insulation_depth_ventral
45+
organism = @set organism.body = geometry
5346

54-
return insulation_limits, organism
47+
return insulation_limits, organism
5548
end
5649

5750
"""
@@ -62,25 +55,24 @@ Increase body shape parameter (uncurl from ball to elongated).
6255
Returns updated `SteppedParameter` and `organism`.
6356
"""
6457
function uncurl(organism::Organism, shape_b_limits::SteppedParameter)
65-
phys = organism.traits.physiology
66-
shape_pars = HeatExchange.shapepars(phys)
58+
shape_pars = HeatExchange.shapepars(organism)
6759

6860
# No meaning to uncurl a sphere
6961
if shape_pars isa Sphere
70-
shape_b_limits = setproperties(shape_b_limits; current=shape_b_limits.max)
71-
return shape_b_limits, organism
62+
shape_b_limits = @set shape_b_limits.current = shape_b_limits.max
63+
return shape_b_limits, organism
7264
end
7365

7466
shape_b = min(shape_b_limits.current + shape_b_limits.step, shape_b_limits.max)
75-
shape_b_limits = setproperties(shape_b_limits; current=shape_b)
67+
shape_b_limits = @set shape_b_limits.current = shape_b
7668

77-
new_shape_pars = setproperties(shape_pars; b=shape_b)
69+
new_shape_pars = @set shape_pars.b = shape_b
7870
fat = BiophysicalGeometry.inner_insulation(organism.body.insulation)
7971
fur = BiophysicalGeometry.outer_insulation(organism.body.insulation)
8072
geometry = Body(new_shape_pars, CompositeInsulation(fur, fat))
81-
organism = setproperties(organism; body=geometry)
73+
organism = @set organism.body = geometry
8274

83-
return shape_b_limits, organism
75+
return shape_b_limits, organism
8476
end
8577

8678
"""
@@ -91,18 +83,12 @@ Increase tissue thermal conductivity (vasodilation).
9183
Returns updated `SteppedParameter` and `organism`.
9284
"""
9385
function vasodilate(organism::Organism, k_flesh_limits::SteppedParameter)
94-
phys = organism.traits.physiology
9586
k_flesh = min(k_flesh_limits.current + k_flesh_limits.step, k_flesh_limits.max)
96-
k_flesh_limits = setproperties(k_flesh_limits; current=k_flesh)
87+
k_flesh_limits = @set k_flesh_limits.current = k_flesh
9788

98-
conduction_pars_internal = setproperties(
99-
HeatExchange.conductionpars_internal(phys); k_flesh
100-
)
101-
phys′ = setproperties(phys; conduction_pars_internal)
102-
traits′ = setproperties(organism.traits; physiology=phys′)
103-
organism′ = setproperties(organism; traits=traits′)
89+
organism = @set organism.traits.physiology.conduction_pars_internal.k_flesh = k_flesh
10490

105-
return k_flesh_limits, organism
91+
return k_flesh_limits, organism
10692
end
10793

10894
"""
@@ -113,23 +99,18 @@ Allow core temperature to rise (hyperthermia).
11399
Returns updated `SteppedParameter`, new Q_minimum, and `organism`.
114100
"""
115101
function hyperthermia(organism::Organism, T_core_limits::SteppedParameter, pant_cost)
116-
phys = organism.traits.physiology
117102
Q_minimum_ref = thermoregulation(organism).Q_minimum_ref
118103
T_core = min(T_core_limits.current + T_core_limits.step, T_core_limits.max)
119-
T_core_limits = setproperties(T_core_limits; current=T_core)
104+
T_core_limits = @set T_core_limits.current = T_core
120105

121-
metabolism = HeatExchange.metabolismpars(phys)
106+
metabolism = HeatExchange.metabolismpars(organism)
122107
q10mult = metabolism.q10^((ustrip(u"K", T_core - T_core_limits.reference)) / 10)
123108
Q_minimum = (Q_minimum_ref + pant_cost) * q10mult
124109

125-
new_metabolism = setproperties(
126-
metabolism; T_core=T_core, Q_metabolism=Q_minimum
127-
)
128-
phys′ = setproperties(phys; metabolism_pars=new_metabolism)
129-
traits′ = setproperties(organism.traits; physiology=phys′)
130-
organism′ = setproperties(organism; traits=traits′)
110+
organism = @set organism.traits.physiology.metabolism_pars.T_core = T_core
111+
organism = @set organism.traits.physiology.metabolism_pars.Q_metabolism = Q_minimum
131112

132-
return T_core_limits, Q_minimum, organism
113+
return T_core_limits, Q_minimum, organism
133114
end
134115

135116
"""
@@ -140,33 +121,24 @@ Increase panting rate for evaporative cooling.
140121
Returns updated `PantingLimits`, new Q_minimum, and `organism`.
141122
"""
142123
function pant(organism::Organism, panting_limits::PantingLimits)
143-
phys = organism.traits.physiology
144124
Q_minimum_ref = thermoregulation(organism).Q_minimum_ref
145125
pant_rate_limits = panting_limits.pant
146126
pant_rate = min(pant_rate_limits.current + pant_rate_limits.step, pant_rate_limits.max)
147127

148128
pant_cost = ((pant_rate - 1) / (pant_rate_limits.max + 1e-6 - 1)) *
149129
(panting_limits.multiplier - 1) * Q_minimum_ref
150130

151-
pant_rate_limits′ = setproperties(pant_rate_limits; current=pant_rate)
152-
panting_limits = setproperties(panting_limits; pant=pant_rate_limits′, cost=pant_cost)
131+
panting_limits = @set panting_limits.pant.current = pant_rate
132+
panting_limits = @set panting_limits.cost = pant_cost
153133

154-
metabolism = HeatExchange.metabolismpars(phys)
134+
metabolism = HeatExchange.metabolismpars(organism)
155135
q10mult = metabolism.q10^((ustrip(u"K", metabolism.T_core - panting_limits.T_core_ref)) / 10)
156136
Q_minimum = (Q_minimum_ref + pant_cost) * q10mult
157137

158-
new_metabolism = setproperties(metabolism; Q_metabolism=Q_minimum)
159-
new_respiration = setproperties(
160-
HeatExchange.respirationpars(phys); pant=pant_rate
161-
)
162-
phys′ = setproperties(phys;
163-
metabolism_pars=new_metabolism,
164-
respiration_pars=new_respiration
165-
)
166-
traits′ = setproperties(organism.traits; physiology=phys′)
167-
organism′ = setproperties(organism; traits=traits′)
138+
organism = @set organism.traits.physiology.metabolism_pars.Q_metabolism = Q_minimum
139+
organism = @set organism.traits.physiology.respiration_pars.pant = pant_rate
168140

169-
return panting_limits, Q_minimum, organism
141+
return panting_limits, Q_minimum, organism
170142
end
171143

172144
"""
@@ -177,14 +149,10 @@ Increase skin wetness for evaporative cooling (sweating).
177149
Returns updated `SteppedParameter` and `organism`.
178150
"""
179151
function sweat(organism::Organism, skin_wetness_limits::SteppedParameter)
180-
phys = organism.traits.physiology
181152
skin_wetness = min(skin_wetness_limits.current + skin_wetness_limits.step, skin_wetness_limits.max)
182-
skin_wetness_limits = setproperties(skin_wetness_limits; current=skin_wetness)
153+
skin_wetness_limits = @set skin_wetness_limits.current = skin_wetness
183154

184-
new_evaporation = setproperties(HeatExchange.evaporationpars(phys); skin_wetness)
185-
phys′ = setproperties(phys; evaporation_pars=new_evaporation)
186-
traits′ = setproperties(organism.traits; physiology=phys′)
187-
organism′ = setproperties(organism; traits=traits′)
155+
organism = @set organism.traits.physiology.evaporation_pars.skin_wetness = skin_wetness
188156

189-
return skin_wetness_limits, organism
157+
return skin_wetness_limits, organism
190158
end

0 commit comments

Comments
 (0)