REAL FUNCTION MINCI1 (N, XX) C Minimum distance of one selected circle from all C possible neighbors and the enclosing container circle of radius 1 C C Author: Hugo Pfoertner http://www.pfoertner.org/ C C History of changes C Jan 6 2006 Single precision, ignore small circles C Nov 25 2005 Avoid square roots in loops C Oct 14 2005 Double precision C Apr 21 2005 Adapted to sphere in sphere problem C parameter ( ONE=1.0, VLARGE=1.0E35 ) REAL XX(N) INTEGER N C N <= 2*MM must hold PARAMETER ( MM=50 ) REAL X(MM), Y(MM) COMMON /COORD/ MSTART, M, X, Y C Number of considered circle COMMON /TARGET/ NTARGT C COPY VARIABLE VECTOR TO COMMON BLOCK C X(NTARGT) = XX(1) Y(NTARGT) = XX(2) C C DETERMINE MINIMUM OF MUTUAL DISTANCES BETWEEN CIRCLES AND C DISTANCE TO ENCLOSING CONTAINER SPHERE C C Weighted MINIMUM DISTANCE FROM CONTAINER CIRCLE DMIN = (ONE - SQRT ( X(NTARGT)**2 + Y(NTARGT)**2 )) & / FLOAT(NTARGT) C Weighted MINIMUM DISTANCE FROM OTHER CIRCLES DMS = VLARGE IF ( NTARGT .GT. 1 ) THEN DO 10 I = 1, NTARGT-1 D = ((X(I)-X(NTARGT))**2 + (Y(I)-Y(NTARGT))**2) & / (FLOAT(NTARGT+I))**2 DMS = MIN ( DMS, D ) 10 CONTINUE ENDIF IF ( NTARGT .LT. M ) THEN DO 20 I = NTARGT+1, M D = ((X(I)-X(NTARGT))**2 + (Y(I)-Y(NTARGT))**2) & / (FLOAT(NTARGT+I))**2 DMS = MIN ( DMS, D ) 20 CONTINUE ENDIF DMIN = MIN ( DMIN, SQRT(DMS) ) 100 CONTINUE C FOR USE IN MINIMIZATION PROGRAM SET OUTPUT NEGATIVE MINCI1 = - DMIN RETURN END