|
20 | 20 | !%%% (5) WLAMCH_ADD %%% |
21 | 21 | !%%% (6) SET2ZERO %%% |
22 | 22 | !%%% (7) WADD %%% |
| 23 | +!%%% (8) WDOT %%% |
23 | 24 | !%%% %%% |
24 | 25 | !%%% @yantosca, 17 Oct 2025 %%% |
25 | 26 | !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% |
26 | 27 |
|
27 | | -!-------------------------------------------------------------- |
28 | | - KPP_REAL FUNCTION WDOT (N, DX, incX, DY, incY) |
29 | | -!-------------------------------------------------------------- |
30 | | -! dot produce: wdot = x(1:N)*y(1:N) |
31 | | -! only for incX=incY=1 |
32 | | -! after BLAS |
33 | | -! replace this by the function from the optimized BLAS implementation: |
34 | | -! CALL SDOT(N,X,1,Y,1) or CALL DDOT(N,X,1,Y,1) |
35 | | -!-------------------------------------------------------------- |
36 | | -! USE messy_mecca_kpp_Precision |
37 | | -!-------------------------------------------------------------- |
38 | | - IMPLICIT NONE |
39 | | - INTEGER :: N, incX, incY |
40 | | - KPP_REAL :: DX(N), DY(N) |
41 | | - |
42 | | - INTEGER :: i, IX, IY, M, MP1, NS |
43 | | - |
44 | | - WDOT = 0.0D0 |
45 | | - IF (N .LE. 0) RETURN |
46 | | - IF (incX .EQ. incY) IF (incX-1) 5,20,60 |
47 | | -! |
48 | | -! Code for unequal or nonpositive increments. |
49 | | -! |
50 | | - 5 IX = 1 |
51 | | - IY = 1 |
52 | | - IF (incX .LT. 0) IX = (-N+1)*incX + 1 |
53 | | - IF (incY .LT. 0) IY = (-N+1)*incY + 1 |
54 | | - DO i = 1,N |
55 | | - WDOT = WDOT + DX(IX)*DY(IY) |
56 | | - IX = IX + incX |
57 | | - IY = IY + incY |
58 | | - END DO |
59 | | - RETURN |
60 | | -! |
61 | | -! Code for both increments equal to 1. |
62 | | -! |
63 | | -! Clean-up loop so remaining vector length is a multiple of 5. |
64 | | -! |
65 | | - 20 M = MOD(N,5) |
66 | | - IF (M .EQ. 0) GO TO 40 |
67 | | - DO i = 1,M |
68 | | - WDOT = WDOT + DX(i)*DY(i) |
69 | | - END DO |
70 | | - IF (N .LT. 5) RETURN |
71 | | - 40 MP1 = M + 1 |
72 | | - DO i = MP1,N,5 |
73 | | - WDOT = WDOT + DX(i)*DY(i) + DX(i+1)*DY(i+1) + DX(i+2)*DY(i+2) + & |
74 | | - DX(i+3)*DY(i+3) + DX(i+4)*DY(i+4) |
75 | | - END DO |
76 | | - RETURN |
77 | | -! |
78 | | -! Code for equal, positive, non-unit increments. |
79 | | -! |
80 | | - 60 NS = N*incX |
81 | | - DO i = 1,NS,incX |
82 | | - WDOT = WDOT + DX(i)*DY(i) |
83 | | - END DO |
84 | | - |
85 | | - END FUNCTION WDOT |
86 | | - |
87 | 28 | !-------------------------------------------------------------- |
88 | 29 | SUBROUTINE WGEFA(N,A,Ipvt,info) |
89 | 30 | !-------------------------------------------------------------- |
@@ -203,14 +144,14 @@ SUBROUTINE WGESL(Trans,N,A,Ipvt,b) |
203 | 144 |
|
204 | 145 | ! first solve trans(U)*y = b |
205 | 146 | DO k = 1, n |
206 | | - t = WDOT(k-1,a(1,k),1,b(1),1) |
| 147 | + t = DOT_PRODUCT( a(1:k-1, k), b(1:k-1) ) |
207 | 148 | b(k) = (b(k) - t)/a(k,k) |
208 | 149 | END DO |
209 | 150 | ! now solve trans(L)*x = y |
210 | 151 | IF (n >= 2) THEN |
211 | 152 | DO kb = 1, n-1 |
212 | 153 | k = n - kb |
213 | | - b(k) = b(k) + WDOT(n-k,a(k+1,k),1,b(k+1),1) |
| 154 | + b(k) = b(k) + DOT_PRODUCT( a(k+1:n, k), b(k+1:n) ) |
214 | 155 | l = Ipvt(k) |
215 | 156 | IF (l /= k) THEN |
216 | 157 | t = b(l); b(l) = b(k); b(k) = t |
|
0 commit comments