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 link to C version of the code.) |
||
(One intermediate revision by the same user not shown) | |||
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>[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)]</ref>. This code has also been [[Rev. source code for the minimum distance between two rods in C |implemented in C]]. | |||
The following is the FORTRAN source code for the calculation of the minimum distance between two rods in three dimensions. For full details see | |||
C SUBROUTINE TO EVALUATE THE SHORTEST DISTANCE BETWEEN TWO RODS | C SUBROUTINE TO EVALUATE THE SHORTEST DISTANCE BETWEEN TWO RODS | ||
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/> | |||
{{Source}} | |||
[[category: Fortran code]] |
Latest revision as of 13:32, 9 March 2011
The following is the FORTRAN source code for the calculation of the minimum distance between two rods in three dimensions. For full details see [1]. This code has also been implemented in C.
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[edit]
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. |