Skip to content

Commit f261965

Browse files
Clean up
1 parent 9f3c0d6 commit f261965

File tree

6 files changed

+88
-30
lines changed

6 files changed

+88
-30
lines changed

examples/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,3 +161,9 @@ if (${BUILD_SHARED_LIBS} AND WIN32)
161161
COMMAND_EXPAND_LISTS
162162
)
163163
endif()
164+
165+
configure_file(
166+
${CMAKE_SOURCE_DIR}/examples/data/friction_data_1.csv
167+
${CMAKE_BINARY_DIR}/examples/friction_data_1.csv
168+
COPYONLY
169+
)

examples/maxwell_fit_example.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ program example
2020
type(plot_data_2d) :: pd1
2121

2222
! Read the data file
23-
call file%read("data/friction_data_1.csv", header_row = 1, status_ok = ok)
23+
call file%read("examples\data\friction_data_1.csv", header_row = 1, status_ok = ok)
2424
if (.not.ok) then
2525
print *, "Could not open file."
2626
stop -1

examples/modified_stribeck_fit_example.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ program example
2020
type(plot_data_2d) :: pd1
2121

2222
! Read the data file
23-
call file%read("data/friction_data_1.csv", header_row = 1, status_ok = ok)
23+
call file%read("examples\data\friction_data_1.csv", header_row = 1, status_ok = ok)
2424
if (.not.ok) then
2525
print *, "Could not open file."
2626
stop -1

src/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,12 @@ target_link_libraries(
103103
${PROJECT_NAME}
104104
PUBLIC
105105
${FERROR_LIBRARIES}
106+
${FSTATS_LIBRARIES}
106107
)
107108
target_link_libraries(
108109
${PROJECT_NAME}
109110
PRIVATE
110111
${LINALG_LIBRARIES}
111-
${FSTATS_LIBRARIES}
112112
${DIFFEQ_LIBRARIES}
113113
${COLLECTIONS_LIBRARIES}
114114
)

src/friction_core.f90

Lines changed: 79 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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

161163
contains
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

Comments
 (0)