Skip to content

Commit 3de658c

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 <[email protected]>
1 parent b26d88c commit 3de658c

File tree

3 files changed

+221
-235
lines changed

3 files changed

+221
-235
lines changed

int/sdirk.f90

Lines changed: 16 additions & 19 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,16 @@ 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+
G(1:N) = 0.0_dp
593+
Z(1:N,istage) = 0.0_dp
596594
!~~~> Prepare the loop-independent part of the right-hand side
597-
CALL Set2zero(N,G)
598595
IF (istage > 1) THEN
599596
DO j = 1, istage-1
600597
! 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)
598+
G(1:N) = G(1:N) + rkTheta(istage,j) * Z(1:N,j)
602599
! Zi(:) = sum_j Alpha(i,j)*Zj(:)
603600
IF (StartNewton) THEN
604-
CALL WAXPY(N,rkAlpha(istage,j),Z(1,j),1,Z(1,istage),1)
601+
Z(1:N,istage) = Z(1:N,istage) + rkAlpha(istage,j) * Z(1:N,j)
605602
END IF
606603
END DO
607604
END IF
@@ -613,13 +610,13 @@ SUBROUTINE SDIRK_Integrator( N,Tinitial,Tfinal,Y,Ierr )
613610
NewtonLoop:DO NewtonIter = 1, NewtonMaxit
614611

615612
!~~~> Prepare the loop-dependent part of the right-hand side
616-
CALL WADD(N,Y,Z(1,istage),TMP) ! TMP <- Y + Zi
613+
TMP(1:N) = Y(1:N) + Z(1:N,istage) ! TMP <- Y + Zi
617614
CALL FUN_CHEM(T+rkC(istage)*H,TMP,RHS) ! RHS <- Fun(Y+Zi)
618615
ISTATUS(Nfun) = ISTATUS(Nfun) + 1
619616
! 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)
617+
RHS(1:N) = RHS(1:N) * (H * rkGamma)
618+
RHS(1:N) = RHS(1:N) - Z(1:N,istage)
619+
RHS(1:N) = RHS(1:N) + G(1:N)
623620

624621
!~~~> Solve the linear system
625622
CALL SDIRK_Solve ( H, N, E, IP, IER, RHS )
@@ -648,7 +645,7 @@ SUBROUTINE SDIRK_Integrator( N,Tinitial,Tfinal,Y,Ierr )
648645
END IF
649646
NewtonIncrementOld = NewtonIncrement
650647
! Update solution: Z(:) <-- Z(:)+RHS(:)
651-
CALL WAXPY(N,ONE,RHS,1,Z(1,istage),1)
648+
Z(1:N,istage) = Z(1:N,istage) + RHS(1:N)
652649

653650
! Check error in Newton iterations
654651
NewtonDone = (NewtonRate*NewtonIncrement <= NewtonTol)
@@ -675,9 +672,9 @@ SUBROUTINE SDIRK_Integrator( N,Tinitial,Tfinal,Y,Ierr )
675672
ISTATUS(Nstp) = ISTATUS(Nstp) + 1
676673

677674
IF (sdMethod /= BEL) THEN ! All methods but Backward Euler
678-
CALL Set2zero(N,TMP)
675+
TMP(1:N) = 0.0_dp
679676
DO i = 1,rkS
680-
IF (rkE(i)/=ZERO) CALL WAXPY(N,rkE(i),Z(1,i),1,TMP,1)
677+
IF (rkE(i)/=ZERO) TMP(1:N) = TMP(1:N) + rkE(i) * Z(1:N,i)
681678
END DO
682679

683680
CALL SDIRK_Solve( H, N, E, IP, IER, TMP )
@@ -704,7 +701,7 @@ SUBROUTINE SDIRK_Integrator( N,Tinitial,Tfinal,Y,Ierr )
704701
T = T + H
705702
! Y(:) <-- Y(:) + Sum_j rkD(j)*Z_j(:)
706703
DO i = 1,rkS
707-
IF (rkD(i)/=ZERO) CALL WAXPY(N,rkD(i),Z(1,i),1,Y,1)
704+
IF (rkD(i)/=ZERO) Y(1:N) = Y(1:N) + rkD(i) * Z(1:N,i)
708705
END DO
709706

710707
!~~~> Update scaling coefficients
@@ -918,10 +915,10 @@ SUBROUTINE SDIRK_Solve ( H, N, E, IP, ISING, RHS )
918915
KPP_REAL, INTENT(IN) :: E(LU_NONZERO)
919916
#endif
920917
KPP_REAL, INTENT(INOUT) :: RHS(N)
921-
KPP_REAL :: HGammaInv
922918

923-
HGammaInv = ONE/(H*rkGamma)
924-
CALL WSCAL(N,HGammaInv,RHS,1)
919+
! NOTE: This line reproduces the results of the
920+
! previous WAXPY call (@yantosca, 16 Oct 2025)
921+
RHS(1:N) = RHS(1:N) * (ONE / (H * rkGamma))
925922
#ifdef FULL_ALGEBRA
926923
CALL DGETRS( 'N', N, 1, E, N, IP, RHS, N, ISING )
927924
#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)