Skip to content

Commit 56966aa

Browse files
committed
Factor duplicated temperature-interval selection into st_select_interval (#40)
Cuts the 11 copies of the same 6-line loop in thermo.f90 down to one shared helper. (cherry picked from commit cd3904b)
1 parent e88676b commit 56966aa

1 file changed

Lines changed: 38 additions & 77 deletions

File tree

source/thermo.f90

Lines changed: 38 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -128,24 +128,35 @@ pure subroutine st_get_valid_temperature_range(self, T_min, T_max)
128128
end if
129129
end subroutine
130130

131+
elemental function st_select_interval(self, T) result(idx)
132+
!! Select the index of the temperature-fit interval containing T
133+
class(SpeciesThermo), intent(in) :: self
134+
real(dp), intent(in) :: T
135+
integer :: idx
136+
integer :: i
137+
138+
idx = 1
139+
do i = 1,self%num_intervals
140+
if (T > self%T_fit(i, 1)) then
141+
idx = i
142+
end if
143+
end do
144+
145+
end function
146+
131147
elemental function st_calc_cv(self, T) result(cv)
132148
class(SpeciesThermo), intent(in) :: self
133149
real(dp), intent(in) :: T
134150
real(dp) :: cv
135-
integer :: i, idx
151+
integer :: idx
136152

137153
if (.not. allocated(self%fits)) then
138154
cv = 0.0d0
139155
return
140156
end if
141157

142158
! Select temperature range
143-
idx = 1
144-
do i = 1,self%num_intervals
145-
if (T > self%T_fit(i, 1)) then
146-
idx = i
147-
end if
148-
end do
159+
idx = st_select_interval(self, T)
149160

150161
! Evaluate selected fit
151162
cv = self%fits(idx)%calc_cv(T)
@@ -156,20 +167,15 @@ elemental function st_calc_cp(self, T) result(cp)
156167
class(SpeciesThermo), intent(in) :: self
157168
real(dp), intent(in) :: T
158169
real(dp) :: cp
159-
integer :: i, idx
170+
integer :: idx
160171

161172
if (.not. allocated(self%fits)) then
162173
cp = 0.0d0
163174
return
164175
end if
165176

166177
! Select temperature range
167-
idx = 1
168-
do i = 1,self%num_intervals
169-
if (T > self%T_fit(i, 1)) then
170-
idx = i
171-
end if
172-
end do
178+
idx = st_select_interval(self, T)
173179

174180
! Evaluate selected fit
175181
cp = self%fits(idx)%calc_cp(T)
@@ -180,20 +186,15 @@ elemental function st_calc_energy(self, T) result(u_R)
180186
class(SpeciesThermo), intent(in) :: self
181187
real(dp), intent(in) :: T
182188
real(dp) :: u_R
183-
integer :: i, idx
189+
integer :: idx
184190

185191
if (.not. allocated(self%fits)) then
186192
u_R = self%calc_enthalpy(T) - T
187193
return
188194
end if
189195

190196
! Select temperature range
191-
idx = 1
192-
do i = 1,self%num_intervals
193-
if (T > self%T_fit(i, 1)) then
194-
idx = i
195-
end if
196-
end do
197+
idx = st_select_interval(self, T)
197198

198199
! Evaluate selected fit
199200
u_R = self%fits(idx)%calc_energy(T, log(T))
@@ -204,17 +205,12 @@ elemental function st_calc_enthalpy(self, T) result(h_R)
204205
class(SpeciesThermo), intent(in) :: self
205206
real(dp), intent(in) :: T
206207
real(dp) :: h_R
207-
integer :: i, idx
208+
integer :: idx
208209

209210
if (allocated(self%fits)) then
210211

211212
! Select temperature range
212-
idx = 1
213-
do i = 1,self%num_intervals
214-
if (T > self%T_fit(i, 1)) then
215-
idx = i
216-
end if
217-
end do
213+
idx = st_select_interval(self, T)
218214

219215
! Evaluate selected fit
220216
h_R = self%fits(idx)%calc_enthalpy(T, log(T))
@@ -229,20 +225,15 @@ elemental function st_calc_entropy(self, T) result(s_R)
229225
class(SpeciesThermo), intent(in) :: self
230226
real(dp), intent(in) :: T
231227
real(dp) :: s_R
232-
integer :: i, idx
228+
integer :: idx
233229

234230
if (.not. allocated(self%fits)) then
235231
s_R = 0.0d0
236232
return
237233
end if
238234

239235
! Select temperature range
240-
idx = 1
241-
do i = 1,self%num_intervals
242-
if (T > self%T_fit(i, 1)) then
243-
idx = i
244-
end if
245-
end do
236+
idx = st_select_interval(self, T)
246237

247238
! Evaluate selected fit
248239
s_R = self%fits(idx)%calc_entropy(T, log(T))
@@ -253,20 +244,15 @@ elemental function st_calc_gibbs_energy(self, T) result(g)
253244
class(SpeciesThermo), intent(in) :: self
254245
real(dp), intent(in) :: T
255246
real(dp) :: g
256-
integer :: i, idx
247+
integer :: idx
257248

258249
if (.not. allocated(self%fits)) then
259250
g = self%calc_enthalpy(T)
260251
return
261252
end if
262253

263254
! Select temperature range
264-
idx = 1
265-
do i = 1,self%num_intervals
266-
if (T > self%T_fit(i, 1)) then
267-
idx = i
268-
end if
269-
end do
255+
idx = st_select_interval(self, T)
270256

271257
! Evaluate selected fit
272258
g = self%fits(idx)%calc_gibbs_energy(T, log(T))
@@ -306,15 +292,10 @@ elemental function st_calc_dcv_dT(self, T) result(dcv_dT)
306292
class(SpeciesThermo), intent(in) :: self
307293
real(dp), intent(in) :: T
308294
real(dp) :: dcv_dT
309-
integer :: i, idx
295+
integer :: idx
310296

311297
! Select temperature range
312-
idx = 1
313-
do i = 1,self%num_intervals
314-
if (T > self%T_fit(i, 1)) then
315-
idx = i
316-
end if
317-
end do
298+
idx = st_select_interval(self, T)
318299

319300
! Evaluate selected fit
320301
dcv_dT = self%fits(idx)%calc_dcv_dT(T)
@@ -325,15 +306,10 @@ elemental function st_calc_dcp_dT(self, T) result(dcp_dT)
325306
class(SpeciesThermo), intent(in) :: self
326307
real(dp), intent(in) :: T
327308
real(dp) :: dcp_dT
328-
integer :: i, idx
309+
integer :: idx
329310

330311
! Select temperature range
331-
idx = 1
332-
do i = 1,self%num_intervals
333-
if (T > self%T_fit(i, 1)) then
334-
idx = i
335-
end if
336-
end do
312+
idx = st_select_interval(self, T)
337313

338314
! Evaluate selected fit
339315
dcp_dT = self%fits(idx)%calc_dcp_dT(T)
@@ -344,15 +320,10 @@ elemental function st_calc_denergy_dT(self, T) result(du_dT)
344320
class(SpeciesThermo), intent(in) :: self
345321
real(dp), intent(in) :: T
346322
real(dp) :: du_dT
347-
integer :: i, idx
323+
integer :: idx
348324

349325
! Select temperature range
350-
idx = 1
351-
do i = 1,self%num_intervals
352-
if (T > self%T_fit(i, 1)) then
353-
idx = i
354-
end if
355-
end do
326+
idx = st_select_interval(self, T)
356327

357328
! Evaluate selected fit
358329
du_dT = self%fits(idx)%calc_denergy_dT(T)
@@ -363,15 +334,10 @@ elemental function st_calc_denthalpy_dT(self, T) result(dh_dT)
363334
class(SpeciesThermo), intent(in) :: self
364335
real(dp), intent(in) :: T
365336
real(dp) :: dh_dT
366-
integer :: i, idx
337+
integer :: idx
367338

368339
! Select temperature range
369-
idx = 1
370-
do i = 1,self%num_intervals
371-
if (T > self%T_fit(i, 1)) then
372-
idx = i
373-
end if
374-
end do
340+
idx = st_select_interval(self, T)
375341

376342
! Evaluate selected fit
377343
dh_dT = self%fits(idx)%calc_denthalpy_dT(T)
@@ -382,15 +348,10 @@ elemental function st_calc_dentropy_dT(self, T) result(ds_dT)
382348
class(SpeciesThermo), intent(in) :: self
383349
real(dp), intent(in) :: T
384350
real(dp) :: ds_dT
385-
integer :: i, idx
351+
integer :: idx
386352

387353
! Select temperature range
388-
idx = 1
389-
do i = 1,self%num_intervals
390-
if (T > self%T_fit(i, 1)) then
391-
idx = i
392-
end if
393-
end do
354+
idx = st_select_interval(self, T)
394355

395356
! Evaluate selected fit
396357
ds_dT = self%fits(idx)%calc_dentropy_dT(T)

0 commit comments

Comments
 (0)