diff options
| author | stainer_t <thomas.stainer@oecd-nea.org> | 2025-09-08 13:48:49 +0200 |
|---|---|---|
| committer | stainer_t <thomas.stainer@oecd-nea.org> | 2025-09-08 13:48:49 +0200 |
| commit | 7dfcc480ba1e19bd3232349fc733caef94034292 (patch) | |
| tree | 03ee104eb8846d5cc1a981d267687a729185d3f3 /Utilib/src/MSRLUS.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Utilib/src/MSRLUS.f')
| -rw-r--r-- | Utilib/src/MSRLUS.f | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/Utilib/src/MSRLUS.f b/Utilib/src/MSRLUS.f new file mode 100644 index 0000000..3b25713 --- /dev/null +++ b/Utilib/src/MSRLUS.f @@ -0,0 +1,98 @@ +*DECK MSRLUS + SUBROUTINE MSRLUS(LFORW,N,LC,IM,MCU,JU,ILUDF,ILUCF,XIN,XOUT) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Solve LU y = x where LU is stored in the "L\U-I" form in MSR format. +* Can be use "in-place" i.e. XOUT=XIN. +* +*Copyright: +* Copyright (C) 2002 Ecole Polytechnique de Montreal +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public +* License as published by the Free Software Foundation; either +* version 2.1 of the License, or (at your option) any later version +* +*Author(s): R. Le Tellier +* +*Parameters: input +* LFORW flag set to .false. to transpose the coefficient matrix. +* N order of the system. +* LC dimension of IM. +* IM elements of row i in MCU(IM(i):IM(i+1)-1) +* MCU +* JU MCU(JU(i):IM(i+1)) corresponds to U. +* MCU(IM(i)+1:JU(i)-1) correspond to L. +* ILUDF diagonal elements of U (inversed diagonal). +* ILUCF non-diagonal elements of L and U. +* XIN input vector x. +* +*Parameters: output +* XOUT output vector y. +* +*----------------------------------------------------------------------- +* + IMPLICIT NONE +*--- +* SUBROUTINE ARGUMENTS +*--- + INTEGER N,LC,IM(N+1),MCU(LC),JU(N) + REAL ILUDF(N),ILUCF(LC) + DOUBLE PRECISION XIN(N),XOUT(N) + LOGICAL LFORW +*--- +* LOCAL VARIABLES +*--- + INTEGER I,J,IJ + IF(LFORW) THEN +*--- +* FORWARD SOLVE +*--- + DO I=1,N + XOUT(I)=XIN(I) + DO IJ=IM(I)+1,JU(I)-1 + J=MCU(IJ) + IF ((J.GT.0).AND.(J.LE.N)) XOUT(I)=XOUT(I) + 1 -ILUCF(IJ)*XOUT(J) + ENDDO + ENDDO +*--- +* BACKWARD SOLVE +*--- + DO I=N,1,-1 + DO IJ=JU(I),IM(I+1) + J=MCU(IJ) + IF ((J.GT.0).AND.(J.LE.N)) XOUT(I)=XOUT(I) + 1 -ILUCF(IJ)*XOUT(J) + ENDDO + XOUT(I)=ILUDF(I)*XOUT(I) + ENDDO + ELSE +*--- +* FORWARD SOLVE (TRANSPOSED LINEAR SYSTEM) +*--- + DO I=1,N + XOUT(I)=XIN(I) + ENDDO + DO I=1,N + DO IJ=JU(I),IM(I+1) + J=MCU(IJ) + IF ((J.GT.0).AND.(J.LE.N)) XOUT(J)=XOUT(J) + 1 -ILUDF(I)*ILUCF(IJ)*XOUT(I) + ENDDO + ENDDO +*--- +* BACKWARD SOLVE (TRANSPOSED LINEAR SYSTEM) +*--- + DO I=N,1,-1 + DO IJ=IM(I)+1,JU(I)-1 + J=MCU(IJ) + IF ((J.GT.0).AND.(J.LE.N)) XOUT(J)=XOUT(J) + 1 -ILUCF(IJ)*XOUT(I) + ENDDO + ENDDO + ENDIF +* + RETURN + END |
