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 /Dragon/src/NXTVCC.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/NXTVCC.f')
| -rw-r--r-- | Dragon/src/NXTVCC.f | 467 |
1 files changed, 467 insertions, 0 deletions
diff --git a/Dragon/src/NXTVCC.f b/Dragon/src/NXTVCC.f new file mode 100644 index 0000000..12caf4b --- /dev/null +++ b/Dragon/src/NXTVCC.f @@ -0,0 +1,467 @@ +*DECK NXTVCC + SUBROUTINE NXTVCC(IPRINT,NDIM ,IDIRCX,MXMESH,MAXSUR,MAXREG, + > MESH ,DMESH ,NBSUR ,NBREG ,INDXSR,SURVOL) +* +*---------- +* +*Purpose: +* Compute the volume of each region for a mixed annular/Cartesian +* 2-D or 3-D geometry using the NXT tracking procedure. +* +*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 +* IPRINT print level. +* NDIM dimension of problem. +* IDIRCX the direction of the first axis of an annular geometry +* assuming the axis are in a cyclic rotation. +* A negative value means that the external boundary is +* annular while a positive boundary implies that the +* external boundaries are Cartesian. +* MXMESH maximum number of spatial subdivision in +* $R$ and $X$, $Y$ or $Z$. +* MAXSUR maximum number of surfaces in the geometry. +* MAXREG maximum number of regions in the geometry. +* MESH effective number of spatial subdivision in $R$ +* and $X$, $Y$ or $Z$. +* DMESH spatial description of the cylinder. +* +*Parameters: output +* NBSUR number of surfaces in the geometry. +* NBREG number of regions in the geometry. +* INDXSR local indexing of surfaces/regions. +* SURVOL area/volume of regions. +* +*Reference: +* G. Marleau, +* New Geometries Processing in DRAGON: The NXT: Module, +* Report IGE-260, Polytechnique Montreal, +* Montreal, 2005. +* +*Comments: +* 1- Contents of IDIRCX: +* IDIRCX Annulus in 2-D plane Cylinder directions in 3-D +* +/- 1 (x,y) z +* +/- 2 (y,z) x +* +/- 3 (z,x) y +* 2- Contents of the DMESH array: +* mesh in $X$ is x(i)=DMESH(i,1) for i=0,MESH(1); +* mesh in $Y$ is y(j)=DMESH(j,2) for j=0,MESH(2); +* mesh in $Z$ is z(k)=DMESH(k,3) for k=0,MESH(3); +* if(IDIRC = 1) then +* ->annular regions in the $X-Y$ plane +* centre of cylinder in (x,y)=(DMESH(-1,1),DMESH(-1,2)) +* radius of shells r(l)=DMESH(l,4), l=1,MESH(4) +* else if(IDIRC = 2) then +* ->annular regions in the $Y-Z$ plane +* centre of cylinder in (y,z)=(DMESH(-1,2),DMESH(-1,3)) +* radius of shells r(l)=DMESH(l,4), l=1,MESH(4) +* else if(IDIRC = 3) then +* ->annular regions in the $Z-X$ plane +* centre of cylinder in (z,x)=(DMESH(-1,3),DMESH(-1,1)) +* radius of shells r(l)=DMESH(l,4), l=1,MESH(4) +* endif +* 3- Contents of the INDXSR array: +* For i>0 +* INDXSR(1,i)= ix is the $X$ location of region i +* INDXSR(2,i)= iy is the $Y$ location of region i +* INDXSR(3,i)= iz is the $Z$ location of region i +* INDXSR(4,i)= ir is the $R$ location of region i. +* INDXSR(5,i)= not used. +* For i<0 +* INDXSR(1,i)= ix is the $X$ location of surface i +* INDXSR(2,i)= iy is the $Y$ location of surface i +* INDXSR(3,i)= iz is the $Z$ location of surface i +* INDXSR(4,i)= ir is the $R$ location of surface i. +* INDXSR(5,i)= not used. +* with INDXSR(n,i)=-1 for surface associated with +* location 0 in direction n. +* with INDXSR(n,i)=-2 for surface associated with +* location MESH(n) in direction n. +* Note that for radial regions INDXSR(n,i)=-1 does not +* exists. +* +*---------- +* + IMPLICIT NONE +*---- +* Subroutine arguments +*---- + INTEGER IPRINT,NDIM,IDIRCX,MXMESH,MAXSUR,MAXREG + INTEGER MESH(4) + DOUBLE PRECISION DMESH(-1:MXMESH,4) + INTEGER NBSUR,NBREG,INDXSR(5,-MAXSUR:MAXREG) + DOUBLE PRECISION SURVOL(-MAXSUR:MAXREG) +*---- +* Local parameters +*---- + INTEGER IOUT + CHARACTER NAMSBR*6 + PARAMETER (IOUT=6,NAMSBR='NXTVCC') + INTEGER MAXDIM + PARAMETER (MAXDIM=4) + DOUBLE PRECISION DCUTOF + PARAMETER (DCUTOF=1.0D-8) + DOUBLE PRECISION DZERO,DONE,DTWO + PARAMETER (DZERO=0.0D0,DONE=1.0D0,DTWO=2.0D0) +*---- +* Functions +*---- + DOUBLE PRECISION XDRCST,PI + INTEGER NXTIRA,ITYIRA + DOUBLE PRECISION VOLINT +*---- +* Local variables +*---- + INTEGER NBVCAR,ID,IDG,IDIR(MAXDIM), + > NM(MAXDIM),IDM(MAXDIM) + INTEGER IDIRC,IDGP1,IDGP2,IDGPP,NBSCAR,NSKPI,NSKPF + INTEGER NBSURT,NBREGT,NRP1 + INTEGER ISURTF,ISURBF,ISURTI,ISURBI,IS,IN,IVOLF,IVOLI + INTEGER IR,IX,IY,IZ,IXYZ,ISURTN,ISURBN,ILVI,ILVT,IOF + INTEGER IDX,IDY,IDZ,IDR,NOFSUR + DOUBLE PRECISION XYCAR(4),POSANN(0:2),DZ + INTEGER IPRNT2 +*---- +* Data +*---- + CHARACTER CDIR(MAXDIM)*1 + SAVE CDIR + DATA CDIR /'X','Y','Z','R'/ +*---- +* Prepare radial and axial loops over spatial directions +* as a function of IDIRC and NDIM. +*---- + DZ=DONE + IDIRC=ABS(IDIRCX) + IF(IDIRC .EQ. 1) THEN + IDX=1 + IDY=2 + IDZ=3 + ELSE IF(IDIRC .EQ. 2) THEN + IDX=2 + IDY=3 + IDZ=1 + ELSE + IDX=3 + IDY=1 + IDZ=2 + ENDIF + IDR=4 + IPRNT2=IPRINT/2 + PI=XDRCST('Pi',' ') + IF(NDIM .EQ. 1) CALL XABORT(NAMSBR// + >': Only 2-D and 3-D problems permitted') + SURVOL(-MAXSUR:MAXREG)=DZERO +*---- +* Prepare loops over spatial directions as a function +* of IDIRC and NDIM. +* Compute number of Cartesian surfaces. +*---- + NBVCAR=1 + DO 100 ID=1,NDIM + IDG=MOD(IDIRC+ID-2,3)+1 + IDIR(ID)=IDG + NM(IDG)=MESH(IDG) + NBVCAR=NBVCAR*NM(IDG) + IDM(IDG)=1 + 100 CONTINUE + DO 101 ID=NDIM+1,3 + IDG=MOD(IDIRC+ID-2,3)+1 + IDIR(ID)=IDG + NM(IDG)=1 + IDM(IDG)=0 + 101 CONTINUE + IDG=4 + IDIR(4)=IDG + NM(IDG)=MESH(IDG) + IDM(IDG)=1 + NBREG=NBVCAR*NM(IDG) + NRP1=NM(4) + IF(IDIRCX .GT. 0) THEN + NRP1=NRP1+1 + NBREG=NBREG+NBVCAR + ENDIF + IDGP1=IDIR(1) + IDGP2=IDIR(2) + IDGPP=IDIR(3) + IF(MAXREG .LT. NBREG) CALL XABORT(NAMSBR// + >': Insufficient space to store region volumes') +*---- +* Compute number of Cartesian surfaces +* 1- Surface parallel to cylinder axis +*---- + IF(IDIRCX .GT. 0) THEN + NBSCAR=0 + NBSUR=0 + DO 102 ID=1,2 + IDG=IDIR(ID) + NBSCAR=NBSCAR+2*NBVCAR/NM(IDG) + NBSUR=NBSUR+2*NBVCAR/NM(IDG) + 102 CONTINUE + ELSE + NBSUR=0 + NBSCAR=0 + ENDIF +*---- +* 2- Surface normal to cylinder axis (if any) +*---- + NSKPI=0 + NSKPF=0 + DO 103 ID=3,NDIM + IDG=IDIR(ID) + NSKPI=NBVCAR/NM(IDG) + NSKPF=NM(4)*NSKPI + IF(IDIRCX .GT. 0) THEN + NSKPF=NSKPF+NSKPI + ENDIF + NBSCAR=NBSCAR+2*NSKPI + NBSUR=NBSUR+2*NSKPF + 103 CONTINUE + IF(MAXSUR .LT. NBSUR) CALL XABORT(NAMSBR// + >': Insufficient space to store surface areas') +*---- +* Print mesh if required +*---- + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6000) NAMSBR + WRITE(IOUT,6002) 'CENTER'//CDIR(IDGP1)//CDIR(IDGP2) + WRITE(IOUT,6006) (DMESH(-1,IDIR(ID)),ID=1,2) + WRITE(IOUT,6003) + WRITE(IOUT,6002) 'RADIAL' + WRITE(IOUT,6006) (DMESH(IR,4),IR=1,MESH(4)) + WRITE(IOUT,6003) + DO 600 ID=1,NDIM + IDG=IDIR(ID) + WRITE(IOUT,6002) 'MESH'//CDIR(IDG) + WRITE(IOUT,6006) (DMESH(IXYZ,IDG),IXYZ=0,NM(IDG)) + WRITE(IOUT,6003) + 600 CONTINUE + ENDIF + NOFSUR=NBSUR + IF(IDIRCX .GT. 0) THEN +*---- +* Compute volumes and surfaces associated with +* Cartesian regions. +*---- + CALL NXTVCA(IPRNT2,NDIM ,IDIRC ,MXMESH, + > NBSCAR,NBVCAR,MESH ,DMESH , + > NBSURT,NBREGT, + > INDXSR(1,-NBSCAR),SURVOL(-NBSCAR)) +*---- +* For 3-D case, displace Cartesian surfaces towards +* the end of SURVOL leaving space for the possible +* annular sub-surfaces. +*---- + IF(NDIM .EQ. 3) THEN + ISURTF=NBSUR + ISURTI=NBSURT + IF(IDIRC .GT. 1) THEN +*---- +* Displace Z faces +*---- + DO IZ=1,2 + DO IY=1,NM(2) + DO IX=1,NM(1) + SURVOL(-ISURTF)=SURVOL(-ISURTI) + SURVOL(-ISURTI)=DZERO + DO IN=1,5 + INDXSR(IN,-ISURTF)=INDXSR(IN,-ISURTI) + INDXSR(IN,-ISURTI)=0 + ENDDO + ISURTF=ISURTF-1 + ISURTI=ISURTI-1 + ENDDO + ENDDO + ENDDO + ENDIF + IF(IDIRC .EQ. 2) THEN +*---- +* Displace Y faces +*---- + DO IY=1,2 + DO IX=1,NM(1) + DO IZ=1,NM(3) + SURVOL(-ISURTF)=SURVOL(-ISURTI) + SURVOL(-ISURTI)=DZERO + DO IN=1,5 + INDXSR(IN,-ISURTF)=INDXSR(IN,-ISURTI) + INDXSR(IN,-ISURTI)=0 + ENDDO + ISURTF=ISURTF-1 + ISURTI=ISURTI-1 + ENDDO + ENDDO + ENDDO + ENDIF +*---- +* Displace (X (2), Y (3) , or Z (1)) and leave space for annular +*---- + NOFSUR=ISURTF + DO IS=NSKPI,1,-1 + SURVOL(-ISURTF)=SURVOL(-ISURTI) + SURVOL(-ISURTI)=DZERO + DO IN=1,5 + INDXSR(IN,-ISURTF)=INDXSR(IN,-ISURTI) + INDXSR(IN,-ISURTI)=0 + ENDDO + ISURTF=ISURTF-NRP1 + ISURTI=ISURTI-1 + ENDDO + DO IS=NSKPI,1,-1 + SURVOL(-ISURTF)=SURVOL(-ISURTI) + SURVOL(-ISURTI)=DZERO + DO IN=1,5 + INDXSR(IN,-ISURTF)=INDXSR(IN,-ISURTI) + INDXSR(IN,-ISURTI)=0 + ENDDO + ISURTF=ISURTF-NRP1 + ISURTI=ISURTI-1 + ENDDO + ENDIF +*---- +* Displace Cartesian volumes towards the end of vector +* SURVOL leaving space for the possible annular sub-regions. +*---- + IVOLF=NBREG + DO IVOLI=NBREGT,1,-1 + SURVOL(IVOLF)=SURVOL(IVOLI) + SURVOL(IVOLI)=DZERO + DO IN=1,5 + INDXSR(IN,IVOLF)=INDXSR(IN,IVOLI) + INDXSR(IN,IVOLI)=0 + ENDDO + IVOLF=IVOLF-NRP1 + ENDDO + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6002) 'SurVol' + WRITE(IOUT,6005) (ILVT,(INDXSR(IR,ILVT),IR=1,5),SURVOL(ILVT), + > ILVT=-NBSUR,NBREG) + WRITE(IOUT,6003) + ENDIF + ENDIF +*---- +* Loop over radial regions for Cartesian/annular region +* intersection. +*---- + ISURTF=NOFSUR-NSKPF+1 + ISURBF=NOFSUR-2*NSKPF+1 + DO 120 IR=NM(4),1,-1 + POSANN(0)=DMESH(IR,4) + POSANN(1)=DMESH(-1,IDGP1) + POSANN(2)=DMESH(-1,IDGP2) +*---- +* Loop over second normal direction +*---- + DO 121 IY=1,NM(IDGP2) + XYCAR(3)=DMESH(IY-1,IDGP2) + XYCAR(4)=DMESH(IY,IDGP2) +*---- +* Loop over first normal direction +*---- + DO 122 IX=1,NM(IDGP1) + XYCAR(1)=DMESH(IX-1,IDGP1) + XYCAR(2)=DMESH(IX,IDGP1) +*---- +* Rectangle/annular region intersection +*---- + ITYIRA=NXTIRA(XYCAR,POSANN,VOLINT) + IF(ITYIRA .NE. 0) THEN + IF(NDIM .EQ. 3) THEN +*---- +* For 3-D problem when +* rectangle and annular regions intersect: +* Correct top and bottom surfaces +*---- + ISURTI=ISURTF+NRP1*(IX-1+NM(IDGP1)*(IY-1)) + ISURBI=ISURBF+NRP1*(IX-1+NM(IDGP1)*(IY-1)) + ISURTN=ISURTI+IR-1 + ISURTI=ISURTI+IR + ISURBN=ISURBI+IR-1 + ISURBI=ISURBI+IR + IF(IR .NE. NM(4) .OR. IDIRCX .GT. 0) THEN + SURVOL(-ISURTI)=SURVOL(-ISURTI)-VOLINT + SURVOL(-ISURBI)=SURVOL(-ISURBI)-VOLINT + ENDIF + SURVOL(-ISURTN)=VOLINT + SURVOL(-ISURBN)=VOLINT + INDXSR(IDX,-ISURTN)=IX + INDXSR(IDX,-ISURBN)=IX + INDXSR(IDY,-ISURTN)=IY + INDXSR(IDY,-ISURBN)=IY + INDXSR(IDZ,-ISURTN)=-2 + INDXSR(IDZ,-ISURBN)=-1 + INDXSR(IDR,-ISURTN)=IR + INDXSR(IDR,-ISURBN)=IR + ENDIF +*---- +* 2- Volumes +*---- + DO 124 IZ=1,NM(IDGPP) + IF(IDIRC .EQ. 1) THEN + IOF=NRP1*(IX-1+NM(IDGP1)*((IY-1)+(IZ-1)*NM(IDGP2))) + ELSE IF(IDIRC .EQ. 2) THEN + IOF=NRP1*(IZ-1+NM(IDGPP)*((IX-1)+(IY-1)*NM(IDGP1))) + ELSE + IOF=NRP1*(IY-1+NM(IDGP2)*((IZ-1)+(IX-1)*NM(IDGPP))) + ENDIF + ILVT=IR+IOF + ILVI=ILVT+1 + DZ=DONE + IF(IDM(IDGPP) .EQ. 1) + > DZ=DMESH(IZ,IDGPP)-DMESH(IZ-1,IDGPP) + IF(IR .NE. NM(4) .OR. IDIRCX .GT. 0) THEN + SURVOL(ILVI)=SURVOL(ILVI)-VOLINT*DZ + ENDIF + SURVOL(ILVT)=VOLINT*DZ + INDXSR(IDX,ILVT)=IX + INDXSR(IDY,ILVT)=IY + INDXSR(IDZ,ILVT)=IZ + INDXSR(IDR,ILVT)=IR + 124 CONTINUE + ENDIF + 122 CONTINUE + 121 CONTINUE + 120 CONTINUE + IF(IDIRCX .LT. 0) THEN +*---- +* Add radial surfaces +*---- + ISURTN=NBSUR + DO 130 IZ=1,NM(IDGPP) + ISURTN=ISURTN+1 + IF(IDM(IDGPP) .EQ. 1) DZ=DMESH(IZ,IDGPP)-DMESH(IZ-1,IDGPP) + SURVOL(-ISURTN)=DZ*DTWO*PI*DMESH(NM(4),4) + INDXSR(IDX,-ISURTN)=0 + INDXSR(IDY,-ISURTN)=0 + INDXSR(IDZ,-ISURTN)=IZ + INDXSR(IDR,-ISURTN)=-2 + 130 CONTINUE + NBSUR=ISURTN + ENDIF + IF(IPRINT .GE. 100) THEN + WRITE(IOUT,6002) 'SurVol' + WRITE(IOUT,6005) (ILVT,(INDXSR(IR,ILVT),IR=1,5),SURVOL(ILVT), + > ILVT=-NBSUR,NBREG) + WRITE(IOUT,6003) + WRITE(IOUT,6001) NAMSBR + ENDIF + RETURN +*---- +* Output formats +*---- + 6000 FORMAT('(* Output from --',A6,'-- follows ') + 6001 FORMAT(' Output from --',A6,'-- completed *)') + 6002 FORMAT(A12,'={') + 6003 FORMAT('};') + 6005 FORMAT((6(I10,','),D20.10,:,',')) + 6006 FORMAT(4(F20.10,:,',')) + END |
