summaryrefslogtreecommitdiff
path: root/Dragon/src/ASM.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/ASM.f
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/ASM.f')
-rw-r--r--Dragon/src/ASM.f335
1 files changed, 335 insertions, 0 deletions
diff --git a/Dragon/src/ASM.f b/Dragon/src/ASM.f
new file mode 100644
index 0000000..1e3b68c
--- /dev/null
+++ b/Dragon/src/ASM.f
@@ -0,0 +1,335 @@
+*DECK ASM
+ SUBROUTINE ASM(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Multigroup assembly operator for system matrices.
+*
+*Copyright:
+* Copyright (C) 2002 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): A. Hebert
+*
+*Parameters: input/output
+* NENTRY number of LCM objects or files used by the operator.
+* HENTRY name of each LCM object or file:
+* HENTRY(1): create or modification type(L_PIJ);
+* HENTRY(2): read-only type(L_MACROLIB or L_LIBRARY);
+* HENTRY(3): read-only type(L_TRACK);
+* HENTRY(4): optional read-only sequential binary tracking file.
+* IENTRY type of each LCM object or file:
+* =1 LCM memory object; =2 XSM file; =3 sequential binary file;
+* =4 sequential ascii file.
+* JENTRY access of each LCM object or file:
+* =0 the LCM object or file is created;
+* =1 the LCM object or file is open for modifications;
+* =2 the LCM object or file is open in read-only mode.
+* KENTRY LCM object address or file unit number.
+*
+*-----------------------------------------------------------------------
+*
+ USE GANLIB
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY)
+ TYPE(C_PTR) KENTRY(NENTRY)
+ CHARACTER HENTRY(NENTRY)*12
+*----
+* LOCAL VARIABLES
+*----
+ PARAMETER (NSTATE=40,IOUT=6)
+ CHARACTER TEXT4*4,HSIGN*12,TEXT12*12,HSMG*131,CDOOR*12,
+ 1 TITRE*72
+ DOUBLE PRECISION DFLOTT
+ LOGICAL LEAKSW,LNORM,LALBS,LDIFF,LADJ
+ INTEGER IGP(NSTATE),IPAR(NSTATE),IPP(NSTATE),NALBP
+ TYPE(C_PTR) IPSYS,IPTRK,IPMACR
+ INTEGER, ALLOCATABLE, DIMENSION(:) :: MAT,IDL
+ REAL, ALLOCATABLE, DIMENSION(:) :: VOL
+*----
+* PARAMETER VALIDATION
+*----
+ IF(NENTRY.LE.2) CALL XABORT('ASM: THREE PARAMETERS EXPECTED.')
+ IF((IENTRY(1).NE.1).AND.(IENTRY(1).NE.2)) CALL XABORT('ASM: LC'
+ 1 //'M OBJECT EXPECTED AT LHS.')
+ IF((JENTRY(1).NE.0).AND.(JENTRY(1).NE.1)) CALL XABORT('ASM: EN'
+ 1 //'TRY IN CREATE OR MODIFICATION MODE EXPECTED.')
+ IF((JENTRY(2).NE.2).OR.((IENTRY(2).NE.1).AND.(IENTRY(2).NE.2)))
+ 1 CALL XABORT('ASM: LCM OBJECT IN READ-ONLY MODE EXPECTED AT FI'
+ 2 //'RST RHS.')
+ IF((JENTRY(3).NE.2).OR.((IENTRY(3).NE.1).AND.(IENTRY(3).NE.2)))
+ 1 CALL XABORT('ASM: LCM OBJECT IN READ-ONLY MODE EXPECTED AT SE'
+ 2 //'COND RHS.')
+ CALL LCMGTC(KENTRY(3),'SIGNATURE',12,HSIGN)
+ IF(HSIGN.NE.'L_TRACK') THEN
+ TEXT12=HENTRY(3)
+ CALL XABORT('ASM: SIGNATURE OF '//TEXT12//' IS '//HSIGN//
+ 1 '. L_TRACK EXPECTED.')
+ ENDIF
+ CALL LCMGTC(KENTRY(3),'TRACK-TYPE',12,CDOOR)
+ HSIGN='L_PIJ'
+ IPSYS=KENTRY(1)
+ IPMACR=KENTRY(2)
+ IPTRK=KENTRY(3)
+ CALL LCMPTC(IPSYS,'SIGNATURE',12,HSIGN)
+ TEXT12=HENTRY(2)
+ CALL LCMPTC(IPSYS,'LINK.MACRO',12,TEXT12)
+ TEXT12=HENTRY(3)
+ CALL LCMPTC(IPSYS,'LINK.TRACK',12,TEXT12)
+ CALL LCMPTC(IPSYS,'TRACK-TYPE',12,CDOOR)
+*----
+* RECOVER TABULATED FUNCTIONS
+*----
+ CALL XDRTA2
+*----
+* RECOVER TRACKING FILE INFORMATION
+*----
+ IF(NENTRY.LT.4) THEN
+ IFTRAK=0
+ ELSE
+ TEXT12=HENTRY(4)
+ IF(IENTRY(4).EQ.3) THEN
+ IF(JENTRY(4).NE.2) CALL XABORT('ASM: BINARY TRACKING FILE NA'
+ 1 //'MED '//TEXT12//' IS NOT IN REAL-ONLY MODE.')
+ IFTRAK=FILUNIT(KENTRY(4))
+ ENDIF
+ ENDIF
+*----
+* RECOVER GENERAL TRACKING INFORMATION
+*----
+ CALL LCMGET(IPTRK,'STATE-VECTOR',IGP)
+ NREG=IGP(1)
+ NUN=IGP(2)
+ LEAKSW=IGP(3).EQ.0
+ IBFP=0
+ IF(CDOOR.EQ.'MCCG') THEN
+* SET ANISOTROPY LEVEL FOR WITHIN-GROUP SCATTERING XS.
+ NANI=IGP(6)
+ ELSE IF((CDOOR.EQ.'BIVAC').OR.(CDOOR.EQ.'SN')) THEN
+* SET ANISOTROPY LEVEL FOR TOTAL AND WITHIN-GROUP SCATTERING XS.
+ NANI=MAX(1,IGP(16))
+ IF(CDOOR.EQ.'SN') IBFP=IGP(31)
+ ELSE IF(CDOOR.EQ.'TRIVAC') THEN
+* SET ANISOTROPY LEVEL FOR TOTAL AND WITHIN-GROUP SCATTERING XS.
+ NANI=MAX(1,IGP(32))
+ ELSE
+ NANI=1
+ ENDIF
+ IF(CDOOR.EQ.'MCCG') THEN
+ CALL LCMLEN(IPTRK,'KEYFLX',LKFL,ITYLCM)
+ NFUNL=LKFL/NREG
+ ELSE
+ NFUNL=1
+ ENDIF
+ ALLOCATE(MAT(NREG),VOL(NREG),IDL(NREG*NFUNL))
+ CALL LCMLEN(IPTRK,'MATCOD',ILNLCM,ITYLCM)
+ IF(ILNLCM.NE.NREG) THEN
+ CALL XABORT( 'ASM: INCOMPATIBLE NUMBER OF REGIONS')
+ ENDIF
+ CALL LCMGET(IPTRK,'MATCOD',MAT)
+ CALL LCMGET(IPTRK,'VOLUME',VOL)
+ CALL LCMGET(IPTRK,'KEYFLX',IDL)
+ CALL LCMLEN(IPTRK,'TITLE',LENGT,ITYLCM)
+ IF(LENGT.GT.0) THEN
+ CALL LCMGTC(IPTRK,'TITLE',72,TITRE)
+ ELSE
+ TITRE='*** NO TITLE PROVIDED ***'
+ ENDIF
+*----
+* RECOVER MACROLIB PARAMETERS
+*----
+ CALL LCMGTC(IPMACR,'SIGNATURE',12,HSIGN)
+ IF(HSIGN.EQ.'L_LIBRARY') THEN
+ CALL LCMSIX(IPMACR,'MACROLIB',1)
+ ELSE IF(HSIGN.NE.'L_MACROLIB') THEN
+ TEXT12=HENTRY(2)
+ CALL XABORT('ASM: SIGNATURE OF '//TEXT12//' IS '//HSIGN//
+ 1 '. L_MACROLIB EXPECTED.')
+ ENDIF
+ CALL LCMGET(IPMACR,'STATE-VECTOR',IPAR)
+ NGRP=IPAR(1)
+ MAXMIX=IPAR(2)
+ ITRANC=IPAR(6)
+ NALBP=IPAR(8)
+ LDIFF=IPAR(9).EQ.1
+ NW=IPAR(10)
+ LADJ=IPAR(13).EQ.1
+ IF(IGP(4).GT.MAXMIX) THEN
+ WRITE(HSMG,'(45HASM: THE NUMBER OF MIXTURES IN THE TRACKING (,
+ 1 I5,55H) IS GREATER THAN THE NUMBER OF MIXTURES IN THE MACROLI,
+ 2 3HB (,I5,2H).)') IGP(4),MAXMIX
+ CALL XABORT(HSMG)
+ ENDIF
+*
+ ITPIJ=1
+ LNORM=.FALSE.
+ LALBS=.FALSE.
+ IPHASE=2
+ ISTRM=1
+ KNORM=4
+ IF(JENTRY(1).EQ.1) THEN
+ CALL LCMGTC(KENTRY(1),'SIGNATURE',12,HSIGN)
+ IF(HSIGN.NE.'L_PIJ') THEN
+ TEXT12=HENTRY(1)
+ CALL XABORT('ASM: SIGNATURE OF '//TEXT12//' IS '//HSIGN//
+ 1 '. L_PIJ EXPECTED.')
+ ENDIF
+ CALL LCMGET(KENTRY(1),'STATE-VECTOR',IPP)
+ IF((IPP(8).NE.NGRP).OR.(IPP(9).NE.NUN)) THEN
+ WRITE(HSMG,'(36HASM: INCONSISTENT NUMBER OF GROUPS (,I3,
+ 1 3H VS,I4,15H) OR UNKNOWNS (,I5,3H VS,I8,2H).)') IPP(8),
+ 2 NGRP,IPP(9),NUN
+ CALL XABORT(HSMG)
+ ENDIF
+ ITPIJ=IPP(1)
+ LNORM=IPP(2).EQ.0
+ LALBS=IPP(3).EQ.0
+ IPHASE=IPP(5)
+ ISTRM=IPP(6)
+ KNORM=IPP(7)
+ ELSE IF(JENTRY(1).NE.0) THEN
+ CALL XABORT('ASM: NO LHS OBJECT.')
+ ENDIF
+ IMPX=1
+ NANIST=NANI
+ 15 CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT)
+ IF(INDIC.EQ.10) GO TO 40
+ 20 IF(INDIC.NE.3) CALL XABORT('ASM: CHARACTER DATA EXPECTED(1).')
+ IF(TEXT4.EQ.'EDIT') THEN
+ CALL REDGET(INDIC,IMPX,FLOTT,TEXT4,DFLOTT)
+ IF(INDIC.NE.1) CALL XABORT('ASM: INTEGER DATA EXPECTED(1).')
+ ELSE IF(TEXT4.EQ.'PNOR') THEN
+ CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT)
+ IF(INDIC.NE.3) CALL XABORT('ASM: CHARACTER DATA EXPECTED(2).')
+ IF(TEXT4.EQ.'NONE') THEN
+ KNORM=0
+ ELSE IF(TEXT4.EQ.'GELB') THEN
+ KNORM=1
+ ELSE IF(TEXT4.EQ.'DIAG') THEN
+ KNORM=2
+ ELSE IF(TEXT4.EQ.'NONL') THEN
+ KNORM=3
+ ELSE IF(TEXT4.EQ.'HELI') THEN
+ KNORM=4
+ ELSE
+ GO TO 20
+ ENDIF
+ ELSE IF(TEXT4.EQ.'ARM') THEN
+ IPHASE=1
+ ELSE IF(TEXT4(1:3).EQ.'PIJ') THEN
+ IPHASE=2
+ IF(TEXT4(4:4).EQ.'K') THEN
+ IF(CDOOR.EQ.'EXCELL') THEN
+ ISTRM=3
+ ITPIJ=ITPIJ+2
+ NANI=MAX(2,NANI)
+ NANIST=NANI
+ ELSE
+ WRITE(IOUT,6300) CDOOR
+ ENDIF
+ ENDIF
+ 30 CALL REDGET(INDIC,NITMA,FLOTT,TEXT4,DFLOTT)
+ IF(INDIC.NE.3) CALL XABORT('ASM: CHARACTER DATA EXPECTED(3).')
+ IF(TEXT4.EQ.'NORM') THEN
+ LNORM=.TRUE.
+ ELSE IF(TEXT4.EQ.'ALBS') THEN
+ LALBS=.TRUE.
+ IF(.NOT.LEAKSW) THEN
+ CALL XABORT('ASM: INVALID BOUNDARY CONDITIONS. THE ALBS '
+ 1 //'OPTION REQUIRES SOME BOUNDARY LEAKAGE.')
+ ENDIF
+ ELSE
+ GO TO 20
+ ENDIF
+ GO TO 30
+ ELSE IF(TEXT4.EQ.'SKIP') THEN
+ ITPIJ=ITPIJ+1
+ ELSE IF(TEXT4.EQ.'ECCO') THEN
+ ISTRM=2
+ NANI=MAX(2,NANI)
+ NANIST=NANI
+ ELSE IF(TEXT4.EQ.'HETE') THEN
+ ISTRM=3
+ NANIST=MAX(2,NANI)
+ ELSE IF(TEXT4.EQ.';') THEN
+ GO TO 40
+ ELSE
+ CALL XABORT('ASM: '//TEXT4//' IS AN INVALID KEY WORD.')
+ ENDIF
+ GO TO 15
+*----
+* CHECK FOR THE ANISOTROPY SETTINGS COHERENCE
+*----
+ 40 IF((ITRANC.NE.0).AND.(NANI.GT.1).AND.(ISTRM.EQ.1)) THEN
+ WRITE(IOUT,6400) CDOOR,NANI
+ ITRANC=0
+ ENDIF
+ IF((IMPX.GE.1).AND.(NW.GT.0)) THEN
+ WRITE (IOUT,'(/44H ASM: A LEAKAGE CORRECTION IS PERFORMED (NW=,
+ 1 I2,2H).)') NW
+ ENDIF
+*----
+* STORE PIJ PARAMETERS
+*----
+ IPP(:NSTATE)=0
+ IPP(1)=ITPIJ
+ IPP(2)=1
+ IF(LNORM) IPP(2)=0
+ IPP(3)=1
+ IF(LALBS) IPP(3)=0
+ IPP(5)=IPHASE
+ IPP(6)=ISTRM
+ IPP(7)=KNORM
+ IPP(8)=NGRP
+ IPP(9)=NUN
+ IPP(10)=MAXMIX
+ IPP(11)=NANI
+ IF(LDIFF) IPP(12)=1
+ IPP(13)=IBFP
+ CALL LCMPUT(IPSYS,'STATE-VECTOR',NSTATE,1,IPP)
+*----
+* BUILD COLLISION PROBABILITIES
+*----
+ CALL ASMDRV(IPSYS,IPTRK,IPMACR,IFTRAK,CDOOR,IMPX,NGRP,MAXMIX,
+ 1 NREG,NANI,NANIST,NW,MAT,VOL,LEAKSW,ITRANC,LDIFF,IBFP,TITRE,
+ 2 ITPIJ,LNORM.OR.LALBS,IPHASE,ISTRM,KNORM,NALBP)
+*
+ IF(IMPX.GE.5) CALL LCMLIB(IPSYS)
+*----
+* RELEASE GENERAL TRACKING INFORMATION
+*----
+ DEALLOCATE(IDL,VOL,MAT)
+ CALL LCMSIX(IPMACR,' ',0)
+ IF(IMPX.GE.1) THEN
+ WRITE (IOUT,6040)IMPX,(IPP(I),I=1,3),(IPP(I),I=5,13)
+ WRITE (IOUT,'(5H DOOR,13X,1H(,A,1H))') CDOOR
+ ENDIF
+ RETURN
+*
+ 6300 FORMAT(//' *** WARNING: OPTION PIJK IS INVALID FOR DOOR = ',
+ > A12/' OPTION PIJ USED INSTEAD')
+ 6400 FORMAT(//' *** WARNING: DOOR ',A12,'IS USED WITH AN ANISOTROPY',
+ > ' LEVEL FROM L_TRACK =',I2,' AND WITH A TRANSPORT CORRECTION S',
+ > 'ET IN LIB:.'/15X,'--> THE TRANSPORT CORRECTION IS DISABLED.'/)
+ 6040 FORMAT(/8H OPTIONS/8H -------/
+ 1 7H IMPX ,I8,30H (0=NO PRINT/1=SHORT/2=MORE)/
+ 2 7H ITPIJ ,I8,30H (1=WIJ/2=PIJ/3=WIJK/4=PIJK)/
+ 3 7H LNORM ,I8,34H (0=NORMALIZE PIJ TO 1/1=DO NOT)/
+ 4 7H LALBS ,I8,36H (0=RECOVER AND SAVE WIS/1=DO NOT)/
+ 5 7H IPHASE,I8,43H (1=GENERAL FLUX SOLUTION/2=PIJ APPROACH)/
+ 6 7H ISTRM ,I8,44H (1=HOMO BN OR NO LEAKAGE/2=ECCO/3=TIBERE)/
+ 7 7H KNORM ,I8,46H (0=NO/1=GELBARD/2=DIAGONAL/3=NON-LINEAR/4=H,
+ 8 6HELIOS)/
+ 9 7H NGRP ,I8,21H (NUMBER OF GROUPS)/
+ 1 7H NUN ,I8,23H (NUMBER OF UNKNOWNS)/
+ 2 7H NBMIX ,I8,23H (NUMBER OF MIXTURES)/
+ 3 7H NANI ,I8,44H (NUMBER OF LEGENDRE ORDERS SCATTERING XS)/
+ 4 7H IDIFF ,I8,47H (0/1: DIFFUSION COEFFICIENTS ABSENT/PRESENT)/
+ 5 7H IBFP ,I8,44H (0/1/2: FOKKER-PLANCK SOLUTION OFF/ON/ON))
+ END