Skip to content

Commit eba045e

Browse files
committed
fixed interface bug for gcc10
While the code tests OK with gcc9, it did not work properly with gcc10, likely because the system provided netcdf lib is built with another compiler.
1 parent 20cd483 commit eba045e

File tree

1 file changed

+107
-11
lines changed

1 file changed

+107
-11
lines changed

src/betr/betr_math/ODEMod.F90

Lines changed: 107 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,19 @@ subroutine ode_ebbks1(odefun, extra, y0, nprimeq, neq, t, dt, y, pscal)
5050
real(r8), intent(in) :: dt !time step
5151
real(r8), intent(out) :: y(neq) !return values
5252
real(r8), optional, intent(out) :: pscal !scaling factor
53-
external :: odefun
54-
53+
interface
54+
subroutine odefun(extra, y, dt2, tt, nprimeq, neq, f)
55+
use bshr_kind_mod , only : r8 => shr_kind_r8
56+
use gbetrType , only : gbetr_type
57+
class(gbetr_type), target :: extra
58+
integer, intent(in) :: neq ! number of equations
59+
real(r8), intent(in) :: tt ! time stamp
60+
real(r8), intent(in) :: dt2 ! time stepping
61+
integer, intent(in) :: nprimeq !
62+
real(r8), intent(in) :: y(neq) ! updated state variable
63+
real(r8), intent(out) :: f(neq) ! derivative
64+
end subroutine
65+
end interface
5566
! !LOCAL VARIABLES:
5667
real(r8) :: f(neq)
5768
real(r8) :: pscal_loc
@@ -77,7 +88,19 @@ subroutine ode_ebbks2(odefun, extra, y0, nprimeq, neq, t, dt, y)
7788
real(r8), intent(in) :: dt !time step
7889
real(r8), intent(out) :: y(neq) !return value
7990

80-
external :: odefun
91+
interface
92+
subroutine odefun(extra, y, dt2, tt, nprimeq, neq, f)
93+
use bshr_kind_mod , only : r8 => shr_kind_r8
94+
use gbetrType , only : gbetr_type
95+
class(gbetr_type), target :: extra
96+
integer, intent(in) :: neq ! number of equations
97+
real(r8), intent(in) :: tt ! time stamp
98+
real(r8), intent(in) :: dt2 ! time stepping
99+
integer, intent(in) :: nprimeq !
100+
real(r8), intent(in) :: y(neq) ! updated state variable
101+
real(r8), intent(out) :: f(neq) ! derivative
102+
end subroutine
103+
end interface
81104
! !LOCAL VARIABLES:
82105
real(r8) :: f(neq)
83106
real(r8) :: f1(neq)
@@ -109,9 +132,21 @@ subroutine ode_mbbks1(odefun, extra, y0, nprimeq, neq, t, dt, y, pscal, bstatus)
109132
real(r8), intent(in) :: dt
110133
real(r8), intent(out) :: y(neq)
111134
real(r8), optional, intent(out) :: pscal
135+
interface
136+
subroutine odefun(extra, y, dt2, tt, nprimeq, neq, f)
137+
use bshr_kind_mod , only : r8 => shr_kind_r8
138+
use gbetrType , only : gbetr_type
139+
class(gbetr_type), target :: extra
140+
integer, intent(in) :: neq ! number of equations
141+
real(r8), intent(in) :: tt ! time stamp
142+
real(r8), intent(in) :: dt2 ! time stepping
143+
integer, intent(in) :: nprimeq !
144+
real(r8), intent(in) :: y(neq) ! updated state variable
145+
real(r8), intent(out) :: f(neq) ! derivative
146+
end subroutine
147+
end interface
112148
type(betr_status_type), intent(out) :: bstatus
113149

114-
external :: odefun
115150

116151
! !LOCAL VARIABLES:
117152
real(r8) :: f(neq)
@@ -169,7 +204,19 @@ subroutine ode_mbbks2(odefun, extra, y0, nprimeq, neq, t, dt, y, bstatus)
169204
real(r8), intent(in) :: dt
170205
real(r8), intent(out) :: y(neq)
171206
type(betr_status_type), intent(out) :: bstatus
172-
external :: odefun
207+
interface
208+
subroutine odefun(extra, y, dt2, tt, nprimeq, neq, f)
209+
use bshr_kind_mod , only : r8 => shr_kind_r8
210+
use gbetrType , only : gbetr_type
211+
class(gbetr_type), target :: extra
212+
integer, intent(in) :: neq ! number of equations
213+
real(r8), intent(in) :: tt ! time stamp
214+
real(r8), intent(in) :: dt2 ! time stepping
215+
integer, intent(in) :: nprimeq !
216+
real(r8), intent(in) :: y(neq) ! updated state variable
217+
real(r8), intent(out) :: f(neq) ! derivative
218+
end subroutine
219+
end interface
173220

174221
! !LOCAL VARIABLES:
175222
real(r8) :: f(neq)
@@ -298,7 +345,19 @@ subroutine ode_adapt_mbbks1(odefun, extra, y0, nprimeq, neq, t, dt, y, bstatus)
298345
integer, intent(in) :: nprimeq !
299346
real(r8), intent(out) :: y(neq) ! updated state variable
300347
type(betr_status_type), intent(out) :: bstatus
301-
external :: odefun
348+
interface
349+
subroutine odefun(extra, y, dt2, tt, nprimeq, neq, f)
350+
use bshr_kind_mod , only : r8 => shr_kind_r8
351+
use gbetrType , only : gbetr_type
352+
class(gbetr_type), target :: extra
353+
integer, intent(in) :: neq ! number of equations
354+
real(r8), intent(in) :: tt ! time stamp
355+
real(r8), intent(in) :: dt2 ! time stepping
356+
integer, intent(in) :: nprimeq !
357+
real(r8), intent(in) :: y(neq) ! updated state variable
358+
real(r8), intent(out) :: f(neq) ! derivative
359+
end subroutine
360+
end interface
302361

303362
! !LOCAL VARIABLES:
304363
real(r8) :: yc(neq) !coarse time stepping solution
@@ -538,6 +597,19 @@ subroutine ode_rk4(odefun,extra, y0, neq, t, dt, y )
538597
real(r8), intent(in) :: t
539598
real(r8), intent(in) :: dt
540599
real(r8), intent(out) :: y(neq)
600+
interface
601+
subroutine odefun(extra, y, dt2, tt, neq, f)
602+
use bshr_kind_mod , only : r8 => shr_kind_r8
603+
use gbetrType , only : gbetr_type
604+
class(gbetr_type), target :: extra
605+
integer, intent(in) :: neq ! number of equations
606+
real(r8), intent(in) :: tt ! time stamp
607+
real(r8), intent(in) :: dt2 ! time stepping
608+
real(r8), intent(in) :: y(neq) ! updated state variable
609+
real(r8), intent(out) :: f(neq) ! derivative
610+
end subroutine
611+
end interface
612+
541613
! !LOCAL VARIABLES:
542614
real(r8) :: k1(neq)
543615
real(r8) :: k2(neq)
@@ -546,7 +618,6 @@ subroutine ode_rk4(odefun,extra, y0, neq, t, dt, y )
546618
real(r8) :: kt(neq)
547619
real(r8) :: ti, dt05, a
548620
integer :: n
549-
external :: odefun
550621

551622
ti = t
552623
dt05 = dt * 0.5_r8
@@ -606,12 +677,25 @@ subroutine ode_rk2(odefun, extra, y0, neq, t, dt, y )
606677
real(r8), intent(in) :: t
607678
real(r8), intent(in) :: dt
608679
real(r8), intent(out) :: y(neq)
680+
681+
interface
682+
subroutine odefun(extra, y, dt2, tt, neq, f)
683+
use bshr_kind_mod , only : r8 => shr_kind_r8
684+
use gbetrType , only : gbetr_type
685+
class(gbetr_type), target :: extra
686+
integer, intent(in) :: neq ! number of equations
687+
real(r8), intent(in) :: tt ! time stamp
688+
real(r8), intent(in) :: dt2 ! time stepping
689+
real(r8), intent(in) :: y(neq) ! updated state variable
690+
real(r8), intent(out) :: f(neq) ! derivative
691+
end subroutine
692+
end interface
693+
609694
! !LOCAL VARIABLES:
610695
real(r8) :: k1(neq)
611696
real(r8) :: k2(neq)
612697
real(r8) :: ti, dt05
613698
integer :: n
614-
external :: odefun
615699

616700
ti = t
617701
dt05 = dt * 0.5_r8
@@ -646,7 +730,19 @@ subroutine ode_adapt_ebbks1(odefun, extra, y0, nprimeq, neq, t, dt, y)
646730
integer, intent(in) :: nprimeq !
647731
real(r8), intent(out) :: y(neq) ! updated state variable
648732
external :: odefun
649-
733+
interface
734+
subroutine odefun(extra, y, dt2, tt, nprimeq, neq, f)
735+
use bshr_kind_mod , only : r8 => shr_kind_r8
736+
use gbetrType , only : gbetr_type
737+
class(gbetr_type), target :: extra
738+
integer, intent(in) :: neq ! number of equations
739+
real(r8), intent(in) :: tt ! time stamp
740+
real(r8), intent(in) :: dt2 ! time stepping
741+
integer, intent(in) :: nprimeq !
742+
real(r8), intent(in) :: y(neq) ! updated state variable
743+
real(r8), intent(out) :: f(neq) ! derivative
744+
end subroutine
745+
end interface
650746
! !LOCAL VARIABLES:
651747
real(r8) :: yc(neq) !coarse time stepping solution
652748
real(r8) :: yf(neq) !fine time stepping solution
@@ -676,9 +772,9 @@ subroutine ode_adapt_ebbks1(odefun, extra, y0, nprimeq, neq, t, dt, y)
676772
tt=tt+dt2
677773
y=yc
678774
else
679-
print*,'get coarse grid solution'
775+
! print*,'get coarse grid solution'
680776
call odefun(extra, y, dt2, tt, nprimeq, neq, f)
681-
print*,'ebbks'
777+
! print*,'ebbks'
682778
call ebbks(y, f, nprimeq, neq, dt2, yc, pscal)
683779

684780
!get fine grid solution

0 commit comments

Comments
 (0)