@@ -145,18 +145,20 @@ pure function friction_integer_query(this) result(rst)
145145
146146! ------------------------------------------------------------------------------
147147 ! Variables specific to the fitting process
148- real (real64), pointer , dimension (:) :: t_
149- real (real64), pointer , dimension (:) :: x_
150- real (real64), pointer , dimension (:) :: v_
151- real (real64), pointer , dimension (:) :: f_
152- real (real64), pointer , dimension (:) :: n_
153- real (real64), pointer , dimension (:) :: initstate_
154- type (fitpack_curve), pointer :: xinterp_
155- type (fitpack_curve), pointer :: vinterp_
156- type (fitpack_curve), pointer :: ninterp_
157- type (ode_container), pointer :: mdl_
158- class(friction_model), pointer :: fmdl_
159- class(ode_integrator), pointer :: integrate_
148+ type fit_data
149+ real (real64), pointer , dimension (:) :: t
150+ real (real64), pointer , dimension (:) :: x
151+ real (real64), pointer , dimension (:) :: v
152+ real (real64), pointer , dimension (:) :: f
153+ real (real64), pointer , dimension (:) :: n
154+ real (real64), pointer , dimension (:) :: initstate
155+ type (fitpack_curve), pointer :: xinterp
156+ type (fitpack_curve), pointer :: vinterp
157+ type (fitpack_curve), pointer :: ninterp
158+ type (ode_container), pointer :: mdl
159+ class(friction_model), pointer :: fmdl
160+ class(ode_integrator), pointer :: integrate
161+ end type
160162
161163contains
162164! ------------------------------------------------------------------------------
@@ -170,9 +172,24 @@ subroutine fit_fcn(x, p, f, stop_, args)
170172
171173 ! Local Variables
172174 integer (int32) :: i, n, npts
175+ real (real64), pointer , dimension (:) :: t_, x_, v_, n_, f_
176+ class(friction_model), pointer :: fmdl_
173177
174178 ! Initialization
175- n = size (x)
179+ n = size (x)
180+ if (.not. present (args)) then
181+ stop_ = .true.
182+ return
183+ end if
184+ select type (args)
185+ class is (fit_data)
186+ t_ = > args% t
187+ x_ = > args% x
188+ v_ = > args% v
189+ n_ = > args% n
190+ f_ = > args% f
191+ fmdl_ = > args% fmdl
192+ end select
176193 npts = n - fmdl_% get_constraint_equation_count()
177194
178195 ! Assign the model parameters
@@ -205,9 +222,29 @@ subroutine internal_var_fit_fcn(x, p, f, stop_, args)
205222 ! Local Variables
206223 integer (int32) :: i, n, npts
207224 real (real64), allocatable , dimension (:,:) :: dzdt
225+ real (real64), pointer , dimension (:) :: t_, x_, v_, n_, f_, initstate_
226+ class(friction_model), pointer :: fmdl_
227+ class(ode_integrator), pointer :: integrate_
228+ type (ode_container), pointer :: mdl_
208229
209230 ! Initialization
210231 n = size (x)
232+ if (.not. present (args)) then
233+ stop_ = .true.
234+ return
235+ end if
236+ select type (args)
237+ class is (fit_data)
238+ t_ = > args% t
239+ x_ = > args% x
240+ v_ = > args% v
241+ n_ = > args% n
242+ f_ = > args% f
243+ initstate_ = > args% initstate
244+ fmdl_ = > args% fmdl
245+ integrate_ = > args% integrate
246+ mdl_ = > args% mdl
247+ end select
211248 npts = n - fmdl_% get_constraint_equation_count()
212249
213250 ! Assign the model parameters
@@ -243,6 +280,20 @@ subroutine internal_state_odes(t, z, dzdt, args)
243280
244281 ! Local Variables
245282 real (real64) :: x, v, n
283+ type (fitpack_curve), pointer :: xinterp_, vinterp_, ninterp_
284+ class(friction_model), pointer :: fmdl_
285+
286+ ! Initialization
287+ if (.not. present (args)) then
288+ return
289+ end if
290+ select type (args)
291+ class is (fit_data)
292+ xinterp_ = > args% xinterp
293+ vinterp_ = > args% vinterp
294+ ninterp_ = > args% ninterp
295+ fmdl_ = > args% fmdl
296+ end select
246297
247298 ! Interpolate to obtain the position, velocity, and normal force values
248299 ! corresponding to time t
@@ -334,6 +385,7 @@ subroutine fmdl_fit(this, t, x, v, f, n, weights, maxp, minp, &
334385 type (fitpack_curve), target :: xinterp, vinterp, ninterp
335386 type (rosenbrock), target :: def_integrator
336387 type (ode_container), target :: mdl
388+ type (fit_data) :: args
337389
338390 ! Initialization
339391 if (present (err)) then
@@ -345,9 +397,9 @@ subroutine fmdl_fit(this, t, x, v, f, n, weights, maxp, minp, &
345397 nparams = this% parameter_count()
346398 np = npts + this% get_constraint_equation_count()
347399 if (present (integrator)) then
348- integrate_ = > integrator
400+ args % integrate = > integrator
349401 else
350- integrate_ = > def_integrator
402+ args % integrate = > def_integrator
351403 end if
352404
353405 ! Input Checking
@@ -407,12 +459,12 @@ subroutine fmdl_fit(this, t, x, v, f, n, weights, maxp, minp, &
407459 end if
408460
409461 ! Assign pointers
410- t_ (1 :npts) = > t
411- x_ (1 :npts) = > x
412- v_ (1 :npts) = > v
413- f_ (1 :npts) = > f
414- n_ (1 :npts) = > n
415- fmdl_ = > this
462+ args % t (1 :npts) = > t
463+ args % x (1 :npts) = > x
464+ args % v (1 :npts) = > v
465+ args % f (1 :npts) = > f
466+ args % n (1 :npts) = > n
467+ args % fmdl = > this
416468
417469 ! Compute the fit
418470 if (this% has_internal_state()) then
@@ -433,19 +485,19 @@ subroutine fmdl_fit(this, t, x, v, f, n, weights, maxp, minp, &
433485 if (flag /= 0 ) go to 30
434486
435487 ! Assign pointers
436- mdl_ = > mdl
437- initstate_ = > initstate
438- xinterp_ = > xinterp
439- vinterp_ = > vinterp
440- ninterp_ = > ninterp
488+ args % mdl = > mdl
489+ args % initstate = > initstate
490+ args % xinterp = > xinterp
491+ args % vinterp = > vinterp
492+ args % ninterp = > ninterp
441493 else
442494 fcn = > fit_fcn
443495 end if
444496
445497 call nonlinear_least_squares(fcn, tptr, fptr, params, fmodptr, residptr, &
446498 weights = weights, maxp = maxp, minp = minp, alpha = alpha, &
447499 controls = controls, settings = settings, info = info, stats = stats, &
448- err = errmgr)
500+ args = args, err = errmgr)
449501 if (errmgr% has_error_occurred()) return
450502 call this% from_array(params)
451503
0 commit comments