Skip to content

Commit 617eeb0

Browse files
committed
Remove BLAS functions from int/sdirk*.f90 integrators
int/sdirk.f90 int/sdirk4.f90 int/sdirk_adj.f90 - Replaced calls to BLAS functions with pure F90 code (as determined by AI) Signed-off-by: Bob Yantosca <yantosca@seas.harvard.edu>
1 parent b26d88c commit 617eeb0

File tree

3 files changed

+222
-234
lines changed

3 files changed

+222
-234
lines changed

int/sdirk.f90

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,7 @@ MODULE KPP_ROOT_Integrator
2222
USE KPP_ROOT_Global
2323
USE KPP_ROOT_Parameters
2424
USE KPP_ROOT_JacobianSP, ONLY : LU_DIAG
25-
USE KPP_ROOT_LinearAlgebra, ONLY : KppDecomp, KppSolve, Set2zero, &
26-
WLAMCH, WCOPY, WAXPY, &
27-
WSCAL, WADD
25+
USE KPP_ROOT_LinearAlgebra, ONLY : KppDecomp, KppSolve, WLAMCH
2826

2927
IMPLICIT NONE
3028
PUBLIC
@@ -591,17 +589,18 @@ SUBROUTINE SDIRK_Integrator( N,Tinitial,Tfinal,Y,Ierr )
591589
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
592590

593591
!~~~> Starting values for Newton iterations
594-
CALL Set2zero(N,Z(1,istage))
595-
592+
! CALL Set2zero(N,Z(1,istage))
593+
G(1:N) = 0.0_dp
594+
Z(1:N,istage) = 0.0_dp
596595
!~~~> Prepare the loop-independent part of the right-hand side
597-
CALL Set2zero(N,G)
596+
! CALL Set2zero(N,G)
598597
IF (istage > 1) THEN
599598
DO j = 1, istage-1
600599
! Gj(:) = sum_j Theta(i,j)*Zj(:) = H * sum_j A(i,j)*Fun(Zj)
601-
CALL WAXPY(N,rkTheta(istage,j),Z(1,j),1,G,1)
600+
G(1:N) = G(1:N) + rkTheta(istage,j) * Z(1:N,j)
602601
! Zi(:) = sum_j Alpha(i,j)*Zj(:)
603602
IF (StartNewton) THEN
604-
CALL WAXPY(N,rkAlpha(istage,j),Z(1,j),1,Z(1,istage),1)
603+
Z(1:N,istage) = Z(1:N,istage) + rkAlpha(istage,j) * Z(1:N,j)
605604
END IF
606605
END DO
607606
END IF
@@ -613,13 +612,13 @@ SUBROUTINE SDIRK_Integrator( N,Tinitial,Tfinal,Y,Ierr )
613612
NewtonLoop:DO NewtonIter = 1, NewtonMaxit
614613

615614
!~~~> Prepare the loop-dependent part of the right-hand side
616-
CALL WADD(N,Y,Z(1,istage),TMP) ! TMP <- Y + Zi
615+
TMP(1:N) = Y(1:N) + Z(1:N,istage) ! TMP <- Y + Zi
617616
CALL FUN_CHEM(T+rkC(istage)*H,TMP,RHS) ! RHS <- Fun(Y+Zi)
618617
ISTATUS(Nfun) = ISTATUS(Nfun) + 1
619618
! RHS(1:N) = G(1:N) - Z(1:N,istage) + (H*rkGamma)*RHS(1:N)
620-
CALL WSCAL(N, H*rkGamma, RHS, 1)
621-
CALL WAXPY (N, -ONE, Z(1,istage), 1, RHS, 1)
622-
CALL WAXPY (N, ONE, G,1, RHS,1)
619+
RHS(1:N) = RHS(1:N) * (H * rkGamma)
620+
RHS(1:N) = RHS(1:N) - Z(1:N,istage)
621+
RHS(1:N) = RHS(1:N) + G(1:N)
623622

624623
!~~~> Solve the linear system
625624
CALL SDIRK_Solve ( H, N, E, IP, IER, RHS )
@@ -648,7 +647,7 @@ SUBROUTINE SDIRK_Integrator( N,Tinitial,Tfinal,Y,Ierr )
648647
END IF
649648
NewtonIncrementOld = NewtonIncrement
650649
! Update solution: Z(:) <-- Z(:)+RHS(:)
651-
CALL WAXPY(N,ONE,RHS,1,Z(1,istage),1)
650+
Z(1:N,istage) = Z(1:N,istage) + RHS(1:N)
652651

653652
! Check error in Newton iterations
654653
NewtonDone = (NewtonRate*NewtonIncrement <= NewtonTol)
@@ -677,7 +676,7 @@ SUBROUTINE SDIRK_Integrator( N,Tinitial,Tfinal,Y,Ierr )
677676
IF (sdMethod /= BEL) THEN ! All methods but Backward Euler
678677
CALL Set2zero(N,TMP)
679678
DO i = 1,rkS
680-
IF (rkE(i)/=ZERO) CALL WAXPY(N,rkE(i),Z(1,i),1,TMP,1)
679+
IF (rkE(i)/=ZERO) TMP(1:N) = TMP(1:N) + rkE(i) * Z(1:N,i)
681680
END DO
682681

683682
CALL SDIRK_Solve( H, N, E, IP, IER, TMP )
@@ -704,7 +703,7 @@ SUBROUTINE SDIRK_Integrator( N,Tinitial,Tfinal,Y,Ierr )
704703
T = T + H
705704
! Y(:) <-- Y(:) + Sum_j rkD(j)*Z_j(:)
706705
DO i = 1,rkS
707-
IF (rkD(i)/=ZERO) CALL WAXPY(N,rkD(i),Z(1,i),1,Y,1)
706+
IF (rkD(i)/=ZERO) Y(1:N) = Y(1:N) + rkD(i) * Z(1:N,i)
708707
END DO
709708

710709
!~~~> Update scaling coefficients
@@ -918,10 +917,10 @@ SUBROUTINE SDIRK_Solve ( H, N, E, IP, ISING, RHS )
918917
KPP_REAL, INTENT(IN) :: E(LU_NONZERO)
919918
#endif
920919
KPP_REAL, INTENT(INOUT) :: RHS(N)
921-
KPP_REAL :: HGammaInv
922920

923-
HGammaInv = ONE/(H*rkGamma)
924-
CALL WSCAL(N,HGammaInv,RHS,1)
921+
! NOTE: This line reproduces the results of the
922+
! previous WAXPY call (@yantosca, 16 Oct 2025)
923+
RHS(1:N) = RHS(1:N) * (ONE / (H * rkGamma))
925924
#ifdef FULL_ALGEBRA
926925
CALL DGETRS( 'N', N, 1, E, N, IP, RHS, N, ISING )
927926
#else

int/sdirk4.f90

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ MODULE KPP_ROOT_Integrator
1212
USE KPP_ROOT_Global
1313
USE KPP_ROOT_Parameters
1414
USE KPP_ROOT_JacobianSP, ONLY : LU_DIAG
15-
USE KPP_ROOT_LinearAlgebra, ONLY : KppDecomp, KppSolve, Set2zero, &
16-
WLAMCH, WAXPY, WCOPY
15+
USE KPP_ROOT_LinearAlgebra, ONLY : KppDecomp, KppSolve, Set2zero, WLAMCH
1716

1817
IMPLICIT NONE
1918
PUBLIC
@@ -553,11 +552,11 @@ SUBROUTINE SDIRK_Integrator( N,Tinitial,Tfinal,Y,Hmin,Hmax,Hstart, &
553552
NewtonFactor(istage) = MAX(NewtonFactor(istage),Roundoff)**0.8d0
554553

555554
!~~~> STARTING VALUES FOR NEWTON ITERATION
556-
CALL Set2zero(N,G)
557-
CALL Set2zero(N,Z(1,istage))
555+
G(1:N) = 0.0_dp
556+
Z(1:N,istage) = 0.0_dp
558557
IF (istage==1) THEN
559558
IF (FIRST.OR.NewtonReject) THEN
560-
CALL Set2zero(N,Z(1,istage))
559+
Z(1:N,istage) = 0.0_dp
561560
ELSE
562561
W=ONE+rkGamma*H/Hold
563562
DO i=1,N
@@ -567,12 +566,11 @@ SUBROUTINE SDIRK_Integrator( N,Tinitial,Tfinal,Y,Hmin,Hmax,Hstart, &
567566
ELSE
568567
DO j = 1, istage-1
569568
! Gj(:) = sum_j Beta(i,j)*Zj(:) = H * sum_j A(i,j)*Fun(Zj(:))
570-
CALL WAXPY(N,rkBeta(istage,j),Z(1,j),1,G,1)
571-
! CALL WAXPY(N,H*rkA(istage,j),FV(1,j),1,G,1)
569+
G(1:N) = G(1:N) + rkBeta(istage,j) * Z(1:N,j)
572570
! Zi(:) = sum_j Alpha(i,j)*Zj(:)
573-
CALL WAXPY(N,rkAlpha(istage,j),Z(1,j),1,Z(1,istage),1)
571+
Z(1:N,istage) = Z(1:N,istage) + rkAlpha(istage,j) * Z(1:N,j)
574572
END DO
575-
IF (istage==5) CALL WCOPY(N,Z(1,istage),1,Yhat,1) ! Yhat(:) <- Z5(:)
573+
IF (istage==5) Yhat(1:N) = Z(1:N,istage) ! Yhat(:) <- Z5(:)
576574
END IF
577575

578576
!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -597,7 +595,8 @@ SUBROUTINE SDIRK_Integrator( N,Tinitial,Tfinal,Y,Hmin,Hmax,Hstart, &
597595
TMP(1:N) = Y(1:N) + Z(1:N,istage)
598596
CALL FUN_CHEM(T+rkC(istage)*H,TMP,RHS)
599597
TMP(1:N) = G(1:N) - Z(1:N,istage)
600-
CALL WAXPY(N,HGammaInv,TMP,1,RHS,1) ! RHS(:) <- RHS(:) + HGammaInv*(G(:)-Z(:))
598+
! RHS(:) <- RHS(:) + HGammaInv*(G(:)-Z(:))
599+
RHS(1:N) = RHS(1:N) + HGammaInv * TMP(1:N)
601600

602601
!~~~> SOLVE THE LINEAR SYSTEMS
603602
#ifdef FULL_ALGEBRA
@@ -630,8 +629,9 @@ SUBROUTINE SDIRK_Integrator( N,Tinitial,Tfinal,Y,Hmin,Hmax,Hstart, &
630629
END IF
631630
END IF
632631
NewtonErrOld = NewtonErr
633-
CALL WAXPY(N,ONE,RHS,1,Z(1,istage),1) ! Z(:) <-- Z(:)+RHS(:)
634-
632+
! Z(:) <-- Z(:)+RHS(:)
633+
Z(1:N,istage) = Z(1:N,istage) + RHS(1:N)
634+
635635
END DO Newton
636636

637637
!~~> END OF SIMPLIFIED NEWTON ITERATION
@@ -671,13 +671,13 @@ SUBROUTINE SDIRK_Integrator( N,Tinitial,Tfinal,Y,Hmin,Hmax,Hstart, &
671671
Hold=H
672672

673673
!~~~> COEFFICIENTS FOR CONTINUOUS SOLUTION
674-
CALL WAXPY(N,ONE,Z(1,5),1,Y,1) ! Y(:) <-- Y(:)+Z5(:)
675-
CALL WCOPY(N,Z(1,5),1,Yhat,1) ! Yhat <-- Z5
674+
Y(1:N) = Y(1:N) + Z(1:N,5) ! Y(:) <-- Y(:)+Z5(:)
675+
Yhat(1:N) = Z(1:N,5) ! Yhat <-- Z5
676676

677677
DO i=1,4 ! CONTi <-- Sum_j rkD(i,j)*Zj
678-
CALL Set2zero(N,CONT(1,i))
678+
CONT(1:N,i) = 0.0_dp
679679
DO j = 1,5
680-
CALL WAXPY(N,rkD(i,j),Z(1,j),1,CONT(1,i),1)
680+
CONT(1:N,i) = CONT(1:N,i) + rkD(i,j) * Z(1:N,j)
681681
END DO
682682
END DO
683683

@@ -997,11 +997,7 @@ SUBROUTINE JAC_CHEM( T, Y, JV )
997997

998998
#ifdef FULL_ALGEBRA
999999
CALL Jac_SP(Y, FIX, RCONST, JS)
1000-
DO j=1,NVAR
1001-
DO j=1,NVAR
1002-
JV(i,j) = 0.0D0
1003-
END DO
1004-
END DO
1000+
JV(1:NVAR,1:NVAR) = 0.0d0
10051001
DO i=1,LU_NONZERO
10061002
JV(LU_IROW(i),LU_ICOL(i)) = JS(i)
10071003
END DO

0 commit comments

Comments
 (0)