summaryrefslogtreecommitdiff
path: root/Dragon/src/NXTGET.f
diff options
context:
space:
mode:
authorstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
committerstainer_t <thomas.stainer@oecd-nea.org>2025-09-08 13:48:49 +0200
commit7dfcc480ba1e19bd3232349fc733caef94034292 (patch)
tree03ee104eb8846d5cc1a981d267687a729185d3f3 /Dragon/src/NXTGET.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/NXTGET.f')
-rw-r--r--Dragon/src/NXTGET.f422
1 files changed, 422 insertions, 0 deletions
diff --git a/Dragon/src/NXTGET.f b/Dragon/src/NXTGET.f
new file mode 100644
index 0000000..2546f80
--- /dev/null
+++ b/Dragon/src/NXTGET.f
@@ -0,0 +1,422 @@
+*DECK NXTGET
+ SUBROUTINE NXTGET(NSTATE,IPRINT,TITLE,ISTATU,RSTATU,NBSLIN,IQUA10,
+ > IBIHET)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* To read from the input file the NXT: module processing options.
+*
+*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
+* NSTATE dimensions of tracking state vectors.
+*
+*Parameters: input/output
+* IPRINT print level.
+* TITLE execution title.
+* ISTATU integer parameters for tracking:
+* ISTATU( 1) is the number of regions;
+* ISTATU( 2) is the number of unknown;
+* ISTATU( 3) is the leakage flag;
+* ISTATU( 4) is the maximum number of mixture used;
+* ISTATU( 5) is the number of outer surfaces;
+* ISTATU( 6) is the flux anisotropy order;
+* ISTATU( 7) is the solution method used;
+* ISTATU( 8) is the track normalization option;
+* ISTATU( 9) is the type of tracks considered;
+* ISTATU(10) is the CP calculation option;
+* ISTATU(11) is the azimuthal quadrature level;
+* ISTATU(12) is the symmetry option;
+* ISTATU(13) is the polar quadrature type;
+* ISTATU(14) is the polar quadrature level;
+* ISTATU(15) is the azimuthal quadrature type;
+* ISTATU(16) is the number of dimensions;
+* ISTATU(17) is the number of tracking points per line;
+* ISTATU(18) is the maximum length of a track;
+* ISTATU(19) is the total number of tracks;
+* ISTATU(20) is the number of tracks directions;
+* ISTATU(21) line format (by default a short
+* format is considered but the complete format for TLM:
+* can be generated using the keyword LONG);
+* ISTATU(22) is the vectorization option;
+* ISTATU(23) is the tracking flag (-1 MC; 0 NOTR;
+* 1 tracking available).
+* ISTATU(26) is the MERGE flag (0 no merge; 1 MERGMIX).
+* ISTATU(27) is the number of tracks assigned to a OpenMP core.
+* RSTATU real parameters for tracking:
+* RSTATU( 1) is the track length cutoff for
+* exponential functions;
+* RSTATU( 2) is the 1D line or 2D plane
+* quadrature line density;
+* RSTATU( 3) is the corner identification cutoff;
+* RSTATU( 4) is the axial quadrature line density;
+* RSTATU( 5) contains the linear track spacing
+* for general 2--D geometry and for 3--D Cartesian and
+* geometries;
+* RSTATU( 6) is the $X$ cell center;
+* RSTATU( 7) is the $y$ cell center;
+* RSTATU( 8) is the $Z$ cell center;
+* RSTATU(11) is the spatial cutoff factor for tracking;
+* RSTATU(12) is the stopping criterion for flux-current
+* iterations of the interface current method;
+* RSTATU(39) is the minimum volume fraction of the
+* grain in the representative volume for She-Liu-Shi
+* model.
+* NBSLIN maximum number of segments in a single tracking line
+* (computed by default in NXTTCG but limited to 100000
+* elements). This default value can be bypassed using
+* keyword NBSLIN.
+* IQUA10 quadrature parameter for micro-structures in Bihet.
+* IBIHET type of double-heterogeneity method (=1 Sanchez-Pomraning
+* model; =2 Hebert model; =3 She-Liu-Shi model (no shadow);
+* =4 She-Liu-Shi model (with shadow)).
+*
+*Reference:
+* G. Marleau,
+* New Geometries Processing in DRAGON: The NXT: Module,
+* Report IGE-260, Polytechnique Montreal,
+* Montreal, 2005.
+*
+*Comments:
+* Input data is of the form:
+* [ EDIT iprint ]
+* [ TITLE trackt ]
+* [ NBSLIN nbslin ]
+* [ ANIS nanis ]
+* [ { RENO | REND | NORE } ]
+* [ { PISO | PSPC } ]
+* [ { PRIX | PRIY | PRIZ } denspr ]
+* [ { GAUS | CACA | CACB | LCMD | OPP1 | OGAU } npol ]
+* [ { TISO [ { EQW | PNTN | SMS | GAUS | LSN | QRN } ]
+* nangl dens [ densz ] |
+* TSPC [ EQW | MEDI | EQW2 ] nangl dens [ densz ] } ]
+* [ CORN cutofc ]
+* [ CUT cutofx ]
+* [ { SYMM isymm | NOSY } ]
+* [ { NOTR | MC } ]
+* [ MERGMIX ]
+* [ BATCH nbatch ]
+* [ { IC | NOIC } ] [ EPSJ epsj ]
+* [ [ QUAB iqua10 ] [ { SAPO | HEBE | SLSI [frtm] | SLSS [frtm] } ] ]
+* with frtm minimum volume fraction of the grain in the
+* representative volume for She-Liu-Shi model.
+*
+*----------
+*
+ IMPLICIT NONE
+*----
+* Subroutine arguments
+*----
+ INTEGER NSTATE
+ INTEGER IPRINT,IQUA10,IBIHET
+ CHARACTER TITLE*72
+ INTEGER ISTATU(NSTATE)
+ REAL RSTATU(NSTATE)
+ INTEGER NBSLIN
+*----
+* Local parameters
+*----
+ INTEGER IOUT
+ CHARACTER NAMSBR*6
+ PARAMETER (IOUT=6,NAMSBR='NXTGET')
+*----
+* Variables for input via REDGET
+*----
+ INTEGER ITYPLU,INTLIR
+ CHARACTER CARLIR*72
+ REAL REALIR
+ DOUBLE PRECISION DBLLIR
+*----
+* Local variables
+*----
+ INTEGER IRT,IRMXR,NBATCH
+ REAL EPSJ
+*----
+* Initialize default values for IPRINT
+*----
+ IPRINT=1
+ IRT=0
+ IRMXR=0
+ NBATCH=1
+ IBIHET=2
+ IQUA10=5
+ EPSJ=0.5E-5
+*----
+* Get data from input file
+*----
+ 100 CONTINUE
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ 101 CONTINUE
+ IF(ITYPLU .EQ. 10) GO TO 105
+ IF(ITYPLU .NE. 3) CALL XABORT(NAMSBR//
+ >': Read error -- Character variable expected')
+ IF(CARLIR(1:4) .EQ. ';') THEN
+ GO TO 105
+ ELSE IF(CARLIR(1:4) .EQ. 'EDIT') THEN
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF(ITYPLU .NE. 1) CALL XABORT(NAMSBR//
+ > ': Read error -- print level expected after EDIT.')
+ IPRINT=INTLIR
+ ELSE IF(CARLIR(1:4) .EQ. 'TITL') THEN
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF(ITYPLU .NE. 3) CALL XABORT(NAMSBR//
+ > ': Read error -- title expected after TITL.')
+ TITLE=CARLIR
+ ELSE IF(CARLIR(1:4) .EQ. 'ANIS') THEN
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF(ITYPLU .NE. 1) CALL XABORT(NAMSBR//
+ > ': Read error -- anisotropy level expected after ANIS.')
+ IF(INTLIR .LE. 0) WRITE(IOUT,9000) NAMSBR
+ ISTATU(6)=MAX(ISTATU(6),INTLIR)
+ ELSE IF(CARLIR(1:4) .EQ. 'RENO') THEN
+ ISTATU(8)=0
+ ELSE IF(CARLIR(1:4) .EQ. 'REND') THEN
+ ISTATU(8)=-1
+ ELSE IF(CARLIR(1:4) .EQ. 'NORE') THEN
+ ISTATU(8)=1
+ ELSE IF(CARLIR(1:4) .EQ. 'PISO') THEN
+ ISTATU(10)=0
+ ELSE IF(CARLIR(1:4) .EQ. 'PSPC') THEN
+ ISTATU(10)=-1
+ ELSE IF(CARLIR(1:3) .EQ. 'PRI') THEN
+ IF (CARLIR(4:4).EQ.'Z') THEN
+ ISTATU(39)=3
+ ELSEIF (CARLIR(4:4).EQ.'Y') THEN
+ ISTATU(39)=2
+ ELSEIF (CARLIR(4:4).EQ.'X') THEN
+ ISTATU(39)=1
+ ELSE
+ CALL XABORT('NXTGET: INVALID PROJECTION AXIS FOR 3D PRISM.')
+ ENDIF
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF(ITYPLU.NE.2) THEN
+ CALL XABORT('NXTGET: REAL DATA EXPECTED')
+ ELSE
+ RSTATU(40)=1.0/REALIR
+ IF (RSTATU(40).LT.0.0)
+ > CALL XABORT('NXTGET: DELU > 0.0 EXPECTED')
+ ENDIF
+ ELSEIF(CARLIR(1:4) .EQ. 'GAUS') THEN
+ ISTATU(13)=0
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF (ITYPLU.NE.1) GOTO 101
+ ISTATU(14)=MAX(ISTATU(14),INTLIR)
+ ELSEIF(CARLIR(1:4) .EQ. 'CACA') THEN
+ ISTATU(13)=1
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF (ITYPLU.NE.1) GOTO 101
+ ISTATU(14)=MAX(ISTATU(14),INTLIR)
+ ELSEIF(CARLIR(1:4) .EQ. 'CACB') THEN
+ ISTATU(13)=2
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF (ITYPLU.NE.1) GOTO 101
+ ISTATU(14)=MAX(ISTATU(14),INTLIR)
+ ELSEIF(CARLIR(1:4) .EQ. 'LCMD') THEN
+ ISTATU(13)=3
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF (ITYPLU.NE.1) GOTO 101
+ ISTATU(14)=MAX(ISTATU(14),INTLIR)
+ ELSEIF(CARLIR(1:4) .EQ. 'OPP1') THEN
+ ISTATU(13)=4
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF (ITYPLU.NE.1) GOTO 101
+ ISTATU(14)=MAX(ISTATU(14),INTLIR)
+ ELSEIF(CARLIR(1:4) .EQ. 'OGAU') THEN
+ ISTATU(13)=5
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF (ITYPLU.NE.1) GOTO 101
+ ISTATU(14)=MAX(ISTATU(14),INTLIR)
+ ELSE IF(CARLIR(1:4) .EQ. 'TISO' .OR.
+ > CARLIR(1:4) .EQ. 'TSPC' ) THEN
+ ISTATU(9)=0
+ IF(CARLIR(1:4) .EQ. 'TSPC') THEN
+ ISTATU(9)=1
+ ISTATU(10)=-1
+ ENDIF
+*----
+* Azimuthal or 3-D quadrature type
+*----
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF(ITYPLU .EQ. 3) THEN
+ IF(CARLIR(1:4) .EQ. 'EQW') THEN
+ ISTATU(15)=1
+ ELSE IF(CARLIR(1:4) .EQ. 'GAUS') THEN
+ ISTATU(15)=2
+ ELSE IF(CARLIR(1:4) .EQ. 'MEDI') THEN
+ ISTATU(15)=3
+ ELSE IF(CARLIR(1:4) .EQ. 'PNTN') THEN
+ ISTATU(15)=4
+ ELSE IF(CARLIR(1:3) .EQ. 'SMS') THEN
+ ISTATU(15)=5
+ ELSE IF(CARLIR(1:3) .EQ. 'LSN') THEN
+ ISTATU(15)=6
+ ELSE IF(CARLIR(1:3) .EQ. 'QRN') THEN
+ ISTATU(15)=7
+ ELSE IF(CARLIR(1:4) .EQ. 'EQW2') THEN
+ ISTATU(15)=8
+ ELSE
+ CALL XABORT(NAMSBR//':'//CARLIR(1:4)//
+ > ' is an invalid azimuthal or 3D quadrature type')
+ ENDIF
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ ENDIF
+ IF(ITYPLU .EQ. 1) THEN
+ IF(INTLIR .LE. 0) WRITE(IOUT,9001) NAMSBR
+ ISTATU(11)=MAX(ISTATU(11),INTLIR)
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ ENDIF
+ IF(ITYPLU .NE. 2) CALL XABORT(NAMSBR//
+ > ': Real density number expected')
+ RSTATU(2)=REALIR
+ IF(REALIR .LE. 0.0) THEN
+ WRITE(IOUT,9010) NAMSBR
+ RSTATU(2)=1.0
+ ENDIF
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF(ITYPLU .EQ. 2) THEN
+ RSTATU(4)=REALIR
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF(REALIR .LE. 0.0) THEN
+ WRITE(IOUT,9011) NAMSBR
+ RSTATU(4)=1.0
+ ENDIF
+ ENDIF
+ GO TO 101
+ ELSE IF(CARLIR(1:4) .EQ. 'CORN') THEN
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF(ITYPLU .NE. 2) CALL XABORT(NAMSBR//
+ > ': Real value expected for CORN')
+ RSTATU(3)=REALIR
+ IF(REALIR .LT. 0.0) THEN
+ WRITE(IOUT,9012) NAMSBR
+ RSTATU(3)=0.0
+ ENDIF
+ ELSE IF(CARLIR(1:4) .EQ. 'CUT') THEN
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF(ITYPLU .NE. 2) CALL XABORT(NAMSBR//
+ > ': Real value expected for CUT')
+ RSTATU(1)=REALIR
+ IF(REALIR .LT. 0.0) THEN
+ WRITE(IOUT,9013) NAMSBR
+ RSTATU(1)=0.0
+ ENDIF
+ ELSE IF(CARLIR(1:4) .EQ. 'SYMM') THEN
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF(ITYPLU .NE. 1) CALL XABORT(NAMSBR//
+ > ': Integer value expected for SYMM')
+ ISTATU(12)=INTLIR
+ ELSE IF(CARLIR(1:4) .EQ. 'NOSY') THEN
+ ISTATU(12)=0
+ ELSE IF(CARLIR(1:4) .EQ. 'NOTR') THEN
+ ISTATU(23)=0
+ ELSE IF(CARLIR(1:2) .EQ. 'MC') THEN
+ ISTATU(23)=-1
+ ELSE IF(CARLIR(1:4) .EQ. 'TRAK') THEN
+ IRT=1
+ ELSE IF(CARLIR(1:4) .EQ. 'MAXR') THEN
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF(ITYPLU .NE. 1) CALL XABORT(NAMSBR//
+ > ': Integer value expected for MAXR')
+ IRMXR=MAX(INTLIR,1)
+ ELSE IF(CARLIR .EQ. 'NBSLIN') THEN
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF(ITYPLU .NE. 1) CALL XABORT(NAMSBR//
+ > ': Read error -- nbslin value expected.')
+ NBSLIN=MAX(INTLIR,NBSLIN)
+ ELSE IF(CARLIR(1:4) .EQ. 'SCFT') THEN
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF(ITYPLU .NE. 2) CALL XABORT(NAMSBR//
+ > ': Real value expected for SCFT')
+ RSTATU(11)=REALIR
+ IF(REALIR .LT. 0.0) THEN
+ WRITE(IOUT,9012) NAMSBR
+ RSTATU(11)=1.0
+ ENDIF
+ ELSE IF(CARLIR(1:4) .EQ. 'ONEG') THEN
+ ISTATU(22)=0
+ ELSE IF(CARLIR(1:4) .EQ. 'ALLG') THEN
+ ISTATU(22)=1
+ ELSE IF(CARLIR(1:4) .EQ. 'XCLL') THEN
+ ISTATU(22)=2
+ ELSE IF(CARLIR(1:4) .EQ. 'QUAB') THEN
+ CALL REDGET(ITYPLU,IQUA10,REALIR,CARLIR,DBLLIR)
+ IF(ITYPLU .NE. 1) CALL XABORT(NAMSBR//
+ > ': Integer value expected for QUAB')
+ ELSE IF(CARLIR .EQ. 'LONG') THEN
+ ISTATU(21)=1
+ ELSE IF(CARLIR .EQ. 'BATCH') THEN
+ ! number of tracks processed in each OpenMP core (default: =1).
+ CALL REDGET(ITYPLU,NBATCH,REALIR,CARLIR,DBLLIR)
+ IF(ITYPLU .NE. 1) CALL XABORT(NAMSBR//
+ > ': Integer value expected for BATCH')
+ ISTATU(27)=NBATCH
+ ELSE IF(CARLIR(1:4) .EQ. 'SAPO') THEN
+ IBIHET=1
+ ELSE IF(CARLIR(1:4) .EQ. 'HEBE') THEN
+ IBIHET=2
+ ELSE IF(CARLIR(1:4) .EQ. 'SLSI') THEN
+ IBIHET=3
+ RSTATU(39)=0.05
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF (ITYPLU.NE.2) GOTO 101
+ RSTATU(39)=REALIR
+ ELSE IF(CARLIR(1:4) .EQ. 'SLSS') THEN
+ IBIHET=4
+ RSTATU(39)=0.05
+ CALL REDGET(ITYPLU,INTLIR,REALIR,CARLIR,DBLLIR)
+ IF (ITYPLU.NE.2) GOTO 101
+ RSTATU(39)=REALIR
+ ELSE IF(CARLIR(1:7) .EQ. 'MERGMIX') THEN
+ ISTATU(26)=1
+ ELSE IF(CARLIR(1:2) .EQ. 'IC') THEN
+ ISTATU(7)=5
+ ELSE IF(CARLIR(1:4) .EQ. 'NOIC') THEN
+ ISTATU(7)=4
+ ELSE IF(CARLIR(1:4) .EQ. 'EPSJ') THEN
+ CALL REDGET(ITYPLU,INTLIR,EPSJ,CARLIR,DBLLIR)
+ IF(ITYPLU .NE. 2) CALL XABORT(NAMSBR//
+ > ': Real value expected for EPSJ')
+ RSTATU(12)=EPSJ
+ ELSE
+ CALL XABORT(NAMSBR//': Keyword '//TRIM(CARLIR)//' is invalid.')
+ ENDIF
+ GO TO 100
+ 105 CONTINUE
+ IF( ISTATU(9) .EQ. 0) THEN
+ ISTATU(13)=0
+ ENDIF
+*----
+* Processing finished, return
+*----
+ IF(IRT .GT. 0) WRITE(IOUT,9020) NAMSBR
+ IF(IRMXR .GT. 0) WRITE(IOUT,9021) NAMSBR
+ RETURN
+*----
+* Warning formats
+*----
+ 9000 FORMAT(1X,'Warning from ',A6,2X,'Invalid anisotropy level'/
+ >1X,'Use default value : nanis=1')
+ 9001 FORMAT(1X,'Warning from ',A6,2X,'Invalid number of angles'/
+ >1X,'Use default value : nangle=1')
+ 9010 FORMAT(1X,'Warning from ',A6,2X,'Invalid tracking density'/
+ >1X,'Use default value : dens=1.0')
+ 9011 FORMAT(1X,'Warning from ',A6,2X,'Invalid axial tracking density'/
+ >1X,'Use default value : densz=1.0')
+ 9012 FORMAT(1X,'Warning from ',A6,2X,'Invalid corner proximity'/
+ >1X,'Use default value : pcorn=0.0')
+ 9013 FORMAT(1X,'Warning from ',A6,2X,'Invalid exponential cutoff'/
+ >1X,'Use default value : cutofx=0.0')
+ 9020 FORMAT(1X,'Warning from ',A6,1X,'-- Keyword TRAK not used ',
+ >'by module NXT: but kept for compatibility with module EXCELT:')
+ 9021 FORMAT(1X,'Warning from ',A6,1X,'-- Keyword MAXR not used ',
+ >'by module NXT: but kept for compatibility with module EXCELT:')
+ END