Source code for the minimum distance between two rods: Difference between revisions
Jump to navigation
Jump to search
Carl McBride (talk | contribs) (New page: {{Source}} The following is the FORTRAN source code for the calculation of the minimum distance between two rods in three dimensions. For full details see Ref. 1. C SUBROUTINE TO EVALUA...) |
Carl McBride (talk | contribs) m (Added spaces to shift code to column 7 from column 6) |
||
Line 1: | Line 1: | ||
The following is the FORTRAN source code for the calculation of the minimum distance between two rods in three dimensions. For full details see Ref. 1. | The following is the FORTRAN source code for the calculation of the minimum distance between two rods in three dimensions. For full details see Ref. 1. | ||
Line 10: | Line 9: | ||
C XL2D2= HALF OF THE LENGTH OF ROD2 | C XL2D2= HALF OF THE LENGTH OF ROD2 | ||
C RO2 = SQUARE OF THE SHORTEST DISTANCE BETWEEN THE TWO RODS | C RO2 = SQUARE OF THE SHORTEST DISTANCE BETWEEN THE TWO RODS | ||
SUBROUTINE SDM(R12,U1,U2,XL1D2,XL2D2,RO2) | |||
DIMENSION R12(3),U1(3),U2(3) | |||
C ***************** | C ***************** | ||
C STEP 1 | C STEP 1 | ||
C SETTING TO ITS VALUE SOME VARIABLES | C SETTING TO ITS VALUE SOME VARIABLES | ||
R122=R12(1)**2+R12(2)**2+R12(3)**2 | |||
R12EU1=R12(1)*U1(1)+R12(2)*U1(2)+R12(3)*U1(3) | |||
R12EU2=R12(1)*U2(1)+R12(2)*U2(2)+R12(3)*U2(3) | |||
U1EU2=U1(1)*U2(1)+U1(2)*U2(2)+U1(3)*U2(3) | |||
CC=1.-U1EU2**2 | |||
C CHECKING WHETHER THE RODS ARE OR NOT PARALLEL | C CHECKING WHETHER THE RODS ARE OR NOT PARALLEL | ||
IF (CC.LT.1.E-6) THEN | |||
IF (R12EU1.NE.0.) THEN | IF (R12EU1.NE.0.) THEN | ||
XLANDA=SIGN(XL1D2,R12EU1) | XLANDA=SIGN(XL1D2,R12EU1) | ||
Line 30: | Line 29: | ||
GO TO 20 | GO TO 20 | ||
ENDIF | ENDIF | ||
ENDIF | |||
C EVALUATION OF XLANDA PRIMA AND XMU PRIMA | C EVALUATION OF XLANDA PRIMA AND XMU PRIMA | ||
XLANDA=(R12EU1-U1EU2*R12EU2)/CC | |||
XMU=(-R12EU2+U1EU2*R12EU1)/CC | |||
C END OF STEP 1 OF THE ALGORITHM | C END OF STEP 1 OF THE ALGORITHM | ||
C ****************************** | C ****************************** | ||
Line 39: | Line 38: | ||
C CHECKING WHETHER (XLANDA PRIMA,XMUPRIMA) BELONGS TO THE | C CHECKING WHETHER (XLANDA PRIMA,XMUPRIMA) BELONGS TO THE | ||
C RECTANGLE DEFINED BY THE TWO SEGMENTS IN THE XLANDA,XMU SPACE | C RECTANGLE DEFINED BY THE TWO SEGMENTS IN THE XLANDA,XMU SPACE | ||
IF ((ABS(XLANDA).LE.XL1D2).AND.(ABS(XMU).LE.XL2D2)) GO TO 20 | |||
C END OF STEP 2 OF THE ALGORITHM | C END OF STEP 2 OF THE ALGORITHM | ||
C ********************************* | C ********************************* | ||
AUXI1=ABS(XLANDA)-XL1D2 | |||
AUXI2=ABS(XMU)-XL2D2 | |||
C ********************** | C ********************** | ||
C STEP 3 | C STEP 3 | ||
Line 82: | Line 81: | ||
C SPACE WHERE STANDS THE SHORTEST DISTANCE BETWEEN THE SEGMENTS | C SPACE WHERE STANDS THE SHORTEST DISTANCE BETWEEN THE SEGMENTS | ||
C EVALUATION OF THE SHORTEST DISTANCE | C EVALUATION OF THE SHORTEST DISTANCE | ||
20 RO2=R122+XLANDA**2+XMU**2-2.*XLANDA*XMU*U1EU2 | |||
1 +2.*XMU*R12EU2-2.*XLANDA*R12EU1 | |||
C END OF STEP 5 | C END OF STEP 5 | ||
C ********************** | C ********************** | ||
RETURN | |||
END | |||
==References== | ==References== | ||
#[http://dx.doi.org/10.1016/0097-8485(94)80023-5 Carlos Vega and Santiago Lago "A fast algorithm to evaluate the shortest distance between rods", Computers & Chemistry '''18''' pp. 55-59 (1994)] | #[http://dx.doi.org/10.1016/0097-8485(94)80023-5 Carlos Vega and Santiago Lago "A fast algorithm to evaluate the shortest distance between rods", Computers & Chemistry '''18''' pp. 55-59 (1994)] | ||
{{Source}} | |||
[[category: Fortran code]] |
Revision as of 13:33, 14 January 2009
The following is the FORTRAN source code for the calculation of the minimum distance between two rods in three dimensions. For full details see Ref. 1.
C SUBROUTINE TO EVALUATE THE SHORTEST DISTANCE BETWEEN TWO RODS C OF DIFFERENT LENGTH C R12= VECTOR CONNECTING THE GEOMETRICAL CENTERS OF THE TWO RODS C U1 = UNITARY VECTOR DEFINIG THE ORIENTATION OF ROD1 C U2 = UNITARY VECTOR DEFINIG THE ORIENTATION OF ROD2 C XL1D2= HALF OF THE LENGTH OF ROD1 C XL2D2= HALF OF THE LENGTH OF ROD2 C RO2 = SQUARE OF THE SHORTEST DISTANCE BETWEEN THE TWO RODS SUBROUTINE SDM(R12,U1,U2,XL1D2,XL2D2,RO2) DIMENSION R12(3),U1(3),U2(3) C ***************** C STEP 1 C SETTING TO ITS VALUE SOME VARIABLES R122=R12(1)**2+R12(2)**2+R12(3)**2 R12EU1=R12(1)*U1(1)+R12(2)*U1(2)+R12(3)*U1(3) R12EU2=R12(1)*U2(1)+R12(2)*U2(2)+R12(3)*U2(3) U1EU2=U1(1)*U2(1)+U1(2)*U2(2)+U1(3)*U2(3) CC=1.-U1EU2**2 C CHECKING WHETHER THE RODS ARE OR NOT PARALLEL IF (CC.LT.1.E-6) THEN IF (R12EU1.NE.0.) THEN XLANDA=SIGN(XL1D2,R12EU1) GO TO 10 ELSE XLANDA=0. XMU=0. GO TO 20 ENDIF ENDIF C EVALUATION OF XLANDA PRIMA AND XMU PRIMA XLANDA=(R12EU1-U1EU2*R12EU2)/CC XMU=(-R12EU2+U1EU2*R12EU1)/CC C END OF STEP 1 OF THE ALGORITHM C ****************************** C STEP 2 C CHECKING WHETHER (XLANDA PRIMA,XMUPRIMA) BELONGS TO THE C RECTANGLE DEFINED BY THE TWO SEGMENTS IN THE XLANDA,XMU SPACE IF ((ABS(XLANDA).LE.XL1D2).AND.(ABS(XMU).LE.XL2D2)) GO TO 20 C END OF STEP 2 OF THE ALGORITHM C ********************************* AUXI1=ABS(XLANDA)-XL1D2 AUXI2=ABS(XMU)-XL2D2 C ********************** C STEP 3 C ASIGNEMENT OF THE SIDE OF THE SQUARE WHERE THE SHORTEST DISTANCE C BETWEEN THE RODS STANDS IF ( AUXI1.GT.AUXI2) THEN XLANDA=SIGN(XL1D2,XLANDA) C END OF STEP 3 C ********************** C STEP 4 C LOOKING FOR THE LOCAL MINIMA OF THE LINE WHICH CONTAINS C THE SELECTED SIDE OF THE SQUARE 10 XMU=XLANDA*U1EU2-R12EU2 C IF THE LOCAL MINIMUM DOES NOT BELONG TO THE SIDE OF THE SQUARE C THEN GIVE US THE NEAREST CORNER OF THE SQUARE ON THE STUDIED LINE IF ( ABS(XMU).GT.XL2D2) XMU=SIGN(XL2D2,XMU) C END OF STEP 4 C ************************ C STEP 3 C ASIGNEMENT OF THE SIDE OF THE SQUARE WHERE THE SHORTEST DISTANCE C BETWEEN THE RODS STANDS ELSE XMU=SIGN(XL2D2,XMU) C END OF STEP 3 C ********************** C STEP 4 C LOOKING FOR THE LOCAL MINIMA OF THE LINE WHICH CONTAINS C THE SELECTED SIDE OF THE SQUARE XLANDA=XMU*U1EU2+R12EU1 C IF THE LOCAL MINIMUM DOES NOT BELONG TO THE SIDE OF THE SQUARE C THEN GIVE US THE NEAREST CORNER OF THE SQUARE ON THE STUDIED LINE IF ( ABS(XLANDA).GT.XL1D2) XLANDA=SIGN(XL1D2,XLANDA) ENDIF C END OF STEP 4 C *********************** C STEP 5 C ONCE WE KNOW THE COORDINATES (XLANDA,XMU) IN THE XLANDA,XMU C SPACE WHERE STANDS THE SHORTEST DISTANCE BETWEEN THE SEGMENTS C EVALUATION OF THE SHORTEST DISTANCE 20 RO2=R122+XLANDA**2+XMU**2-2.*XLANDA*XMU*U1EU2 1 +2.*XMU*R12EU2-2.*XLANDA*R12EU1 C END OF STEP 5 C ********************** RETURN END
References
This page contains computer source code. If you intend to compile and use this code you must check for yourself the validity of the code. Please read the SklogWiki disclaimer. |