@@ -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