From 7dfcc480ba1e19bd3232349fc733caef94034292 Mon Sep 17 00:00:00 2001 From: stainer_t Date: Mon, 8 Sep 2025 13:48:49 +0200 Subject: Initial commit from Polytechnique Montreal --- Dragon/src/NXTIRR.f | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100644 Dragon/src/NXTIRR.f (limited to 'Dragon/src/NXTIRR.f') diff --git a/Dragon/src/NXTIRR.f b/Dragon/src/NXTIRR.f new file mode 100644 index 0000000..7937630 --- /dev/null +++ b/Dragon/src/NXTIRR.f @@ -0,0 +1,132 @@ +*DECK NXTIRR + FUNCTION NXTIRR(XYCAR ,XYPIN ,VOLINT) +* +*---------- +* +*Purpose: +* Compute the volume of intersection between +* a rectangular region and a Cartesian pin. +* centered at the origin. +* +*Copyright: +* Copyright (C) 2005 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): G. Marleau. +* +*Parameters: input +* XYCAR spatial description of the Cartesian region with: +* XYCAR(1) for left face; XYCAR(2) for right face; +* XYCAR(3) for bottom face, XYCAR(4) for top face +* positions. +* XYPIN spatial description of the Cartesian pin region with +* XYPIN(1) for left face; XYPIN(2) for right face; +* XYPIN(3) for bottom face; XYPIN(4) for top face +* positions. +* +*Parameters: output +* NXTIRR type of intersection between Cartesian region and +* annular pin or annular region and Cartesian pin, where: +* =0 means that there is no intersection +* between the two regions; +* = 1 means that the Cartesian region +* is all located inside the Cartesian pin; +* = 2 means that the Cartesian pin +* is all located inside the Cartesian region; +* =-1 means that the intersection between +* the Cartesian region and the Cartesian pin is partial. +* VOLINT 2-D volume of intersection (area) between Cartesian region and +* Cartesian pin. +* +*Reference: +* G. Marleau, +* New Geometries Processing in DRAGON: The NXT: Module, +* Report IGE-260, Polytechnique Montreal, +* Montreal, 2005. +* +*---- +* + IMPLICIT NONE +*---- +* Subroutine arguments +*---- + INTEGER NXTIRR + DOUBLE PRECISION XYCAR(4),XYPIN(4) + DOUBLE PRECISION VOLINT +*---- +* Local parameters +*---- + INTEGER IOUT + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,NAMSBR='NXTIRR') + INTEGER IPRINT + PARAMETER (IPRINT=100) + DOUBLE PRECISION DCUTOF + PARAMETER (DCUTOF=1.0D-8) + DOUBLE PRECISION DZERO + PARAMETER (DZERO=0.0D0) +*---- +* Functions +*---- + INTEGER NXTPRR,ITYPRR +*---- +* Local variables +*---- + INTEGER IFACE + DOUBLE PRECISION VOLCAR,VOLPIN,XYINT(4) + DOUBLE PRECISION DT1,DT2,DT3 +*---- +* Initialize NXTIRR and VOLINT +*---- + IF(IPRINT .GE. 200) THEN + WRITE(IOUT,6000) NAMSBR + WRITE(IOUT,6010) (XYCAR(IFACE),IFACE=1,4) + WRITE(IOUT,6011) (XYPIN(IFACE),IFACE=1,4) + ENDIF + NXTIRR=0 + VOLINT=DZERO + VOLCAR=(XYCAR(2)-XYCAR(1))*(XYCAR(4)-XYCAR(3)) + VOLPIN=(XYPIN(2)-XYPIN(1))*(XYPIN(4)-XYPIN(3)) +*---- +* Find rectangle of intersection between the two rectangles. +*---- + ITYPRR=NXTPRR(XYCAR ,XYPIN ,XYINT ) +*---- +* For cases with intersection, compute volume of intersection +* and type of intersection +*---- + IF(ITYPRR .NE. 0) THEN + VOLINT=(XYINT(2)-XYINT(1))*(XYINT(4)-XYINT(3)) + DT1=ABS(VOLINT-VOLPIN) + DT2=ABS(VOLINT-VOLCAR) + DT3=ABS(VOLINT) + IF(DT1 .LT. DCUTOF) THEN + VOLINT=VOLPIN + NXTIRR=2 + ELSE IF(DT2 .LT. DCUTOF) THEN + VOLINT=VOLCAR + NXTIRR=1 + ELSE IF(DT3 .LT. DCUTOF) THEN + VOLINT=DZERO + NXTIRR=0 + ELSE + NXTIRR=-1 + ENDIF + ENDIF + IF(IPRINT .GE. 200) THEN + WRITE(IOUT,6012) NAMSBR,NXTIRR,VOLINT + WRITE(IOUT,6001) NAMSBR + ENDIF + RETURN +*---- +* Output formats +*---- + 6000 FORMAT('(* Output from --',A6,'-- follows ') + 6001 FORMAT(' Output from --',A6,'-- completed *)') + 6010 FORMAT('XYCAR ={',3(F20.10,','),F20.10,'};') + 6011 FORMAT('XYPIN ={',3(F20.10,','),F20.10,'};') + 6012 FORMAT(A6,'={',I5,',',F20.10,'};') + END -- cgit v1.2.3