diff options
Diffstat (limited to 'Dragon/src/SPH.F')
| -rw-r--r-- | Dragon/src/SPH.F | 900 |
1 files changed, 900 insertions, 0 deletions
diff --git a/Dragon/src/SPH.F b/Dragon/src/SPH.F new file mode 100644 index 0000000..abc1c21 --- /dev/null +++ b/Dragon/src/SPH.F @@ -0,0 +1,900 @@ +*DECK SPH + SUBROUTINE SPH(NENTRY,HENTRY,IENTRY,JENTRY,KENTRY) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Superhomogeneisation (SPH) procedure. +* +*Copyright: +* Copyright (C) 2011 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) Edition (L_EDIT), Microlib (L_LIBRARY), +* Macrolib (L_MACROLIB) or Saphyb (L_SAPHYB) object; +* HENTRY(I) I>1 read-only type (Edition (L_EDIT) and/or +* L_MACROLIB and/or L_LIBRARY and/or L_SAPHYB and/or L_TRACK). +* IENTRY type of each LCM object or file: +* =1 LCM memory object; =2 XSM file; =3 sequential binary file; +* =4 sequential ascii file; =6 HDF5 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 +#if defined(HDF5_LIB) + USE hdf5_wrap +#endif /* defined(HDF5_LIB) */ +*---- +* SUBROUTINE ARGUMENTS +*---- + INTEGER NENTRY,IENTRY(NENTRY),JENTRY(NENTRY) + TYPE(C_PTR) KENTRY(NENTRY) + CHARACTER HENTRY(NENTRY)*12 +*---- +* LOCAL VARIABLES +*---- + PARAMETER(NSTATE=40,IOUT=6,MAXISD=400) + INTEGER ISTATE(NSTATE),DIMSAP(50) + CHARACTER CNDOOR*12,HSIGN*12,HSMG*131,TEXT12*12,HEDIT*12, + 1 HEQUI*4,HMASL*4,HEQNAM*80,HFORMAT*132 + LOGICAL LARM,LTEMP,LNEW,LLEAK + REAL REALIR + DOUBLE PRECISION DFLOT + TYPE(C_PTR) IPTRK,IPFLX,IPOUT,IPRHS,IPMICR,IPMACR,IPSAP,IPAPX, + 1 JPMAC,KPMAC,IPEDIT,IPSPH,IPCPO,IPOPT +*---- +* ALLOCATABLE ARRAYS +*---- + REAL, ALLOCATABLE, DIMENSION(:) :: WORK1,WORK2 + REAL, ALLOCATABLE, DIMENSION(:,:) :: SPH2,SPOLD + DOUBLE PRECISION, ALLOCATABLE, DIMENSION(:) :: VARV +*---- +* APEX LOCAL VARIABLES +*---- +#if defined(HDF5_LIB) + LOGICAL LFROM,LMPO + CHARACTER TEXT80*80,RECNAM*80 + CHARACTER(LEN=100), ALLOCATABLE, DIMENSION(:) :: LIST + INTEGER, ALLOCATABLE, DIMENSION(:) :: DIMS_APX + REAL, ALLOCATABLE, DIMENSION(:) :: XVOLM + INTEGER, ALLOCATABLE, DIMENSION(:,:) :: OUPUTID +#endif /* defined(HDF5_LIB) */ +*---- +* PARAMETER VALIDATION. +*---- + IPTRK=C_NULL_PTR + IFTRK=0 + IPFLX=C_NULL_PTR + IPOPT=C_NULL_PTR + IF(NENTRY.EQ.0) CALL XABORT('SPH: MISSING PARAMETERS(1).') + IMIN=1 + ITYPE=0 + IPOUT=KENTRY(1) + IF((IENTRY(1).LE.2).AND.(JENTRY(1).EQ.0)) THEN + IMIN=3 + IF(NENTRY.EQ.1) CALL XABORT('SPH: MISSING PARAMETERS(2).') + IF((IENTRY(2).LE.2).AND.(JENTRY(2).EQ.2)) THEN + IPRHS=KENTRY(2) + ELSE IF((IENTRY(2).EQ.6).AND.(JENTRY(2).EQ.2)) THEN + IPRHS=KENTRY(2) + ITYPE=6 ! Apex file in extraction mode + ELSE + CALL XABORT('SPH: RHS LCM OR HDF5 OBJECT EXPECTED.') + ENDIF + ELSE IF((IENTRY(1).LE.2).AND.(JENTRY(1).EQ.1)) THEN + IMIN=2 + IPRHS=IPOUT + ELSE IF((IENTRY(1).EQ.6).AND.(JENTRY(1).EQ.1)) THEN + ITYPE=6 ! Apex file in modification mode + IMIN=2 + IPRHS=IPOUT + ELSE + CALL XABORT('SPH: LHS LCM OR HDF5 OBJECT EXPECTED.') + ENDIF + IF(ITYPE.EQ.0) THEN + CALL LCMGTC(KENTRY(IMIN-1),'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_EDIT') THEN + ITYPE=1 + ELSE IF(HSIGN.EQ.'L_LIBRARY') THEN + ITYPE=2 + ELSE IF(HSIGN.EQ.'L_MACROLIB') THEN + ITYPE=3 + ELSE IF(HSIGN.EQ.'L_SAPHYB') THEN + ITYPE=4 + ELSE IF(HSIGN.EQ.'L_MULTICOMPO') THEN + ITYPE=5 + ELSE + CALL XABORT('SPH: L_EDIT, L_LIBRARY, L_MACROLIB OR L_SAPHY' + 1 //'B EXPECTED AT FIRST RHS PARAMETER.') + ENDIF + ENDIF + DO 10 I=IMIN,NENTRY + IF((IENTRY(I).LE.2).AND.(JENTRY(I).EQ.2)) THEN + CALL LCMGTC(KENTRY(I),'SIGNATURE',12,HSIGN) + IF(HSIGN.EQ.'L_TRACK') THEN + IPTRK=KENTRY(I) + ELSE IF(HSIGN.EQ.'L_FLUX') THEN + IPFLX=KENTRY(I) + ELSE IF(HSIGN.EQ.'L_OPTIMIZE') THEN + IPOPT=KENTRY(I) + ELSE + HFORMAT='(40HSPH: UNKNOWN TYPE OF PARAMETER(1). NAME=,'// + 1 'A12,11H<--- HSIGN=,A12,5H<---.)' + WRITE(HSMG,HFORMAT) HENTRY(I),HSIGN + CALL XABORT(HSMG) + ENDIF + ELSE IF((IENTRY(I).EQ.3).AND.(JENTRY(I).EQ.2)) THEN + IFTRK=FILUNIT(KENTRY(I)) + ELSE + HFORMAT='(40HSPH: UNKNOWN TYPE OF PARAMETER(2). NAME=,A12,'// + 1 '5H<---.)' + WRITE(HSMG,HFORMAT) HENTRY(I) + CALL XABORT(HSMG) + ENDIF + 10 CONTINUE +*---- +* INITIALIZE OR RECOVER EXISTING SPH STATE-VECTOR +*---- + IF(ITYPE.EQ.1) THEN +* TRY TO RECOVER SPH STATE-VECTOR FROM LAST-EDIT DIRECTORY + CALL LCMGTC(IPRHS,'LAST-EDIT',12,HEDIT) + IF(IPRINT.GT.0) THEN + WRITE(6,'(32H SPH: STEP UP L_EDIT DIRECTORY '',A,5H''(1).)') + 1 HEDIT + ENDIF + IPEDIT=IPRHS + IPMICR=LCMGID(IPEDIT,HEDIT) + IPMACR=LCMGID(IPMICR,'MACROLIB') + CALL LCMLEN(IPMICR,'SIGNATURE',ILONG,ITYLCM) + IF(ILONG.EQ.0) IPMICR=C_NULL_PTR + IPSAP=C_NULL_PTR + IPAPX=C_NULL_PTR + ELSE IF(ITYPE.EQ.2) THEN + IPEDIT=C_NULL_PTR + IPMICR=IPRHS + IPMACR=LCMGID(IPMICR,'MACROLIB') + IPSAP=C_NULL_PTR + IPAPX=C_NULL_PTR + ELSE IF(ITYPE.EQ.3) THEN + IPEDIT=C_NULL_PTR + IPMICR=C_NULL_PTR + IPMACR=IPRHS + IPSAP=C_NULL_PTR + IPAPX=C_NULL_PTR + ELSE IF((ITYPE.EQ.4).OR.(ITYPE.EQ.5)) THEN + IPEDIT=C_NULL_PTR + IPMICR=C_NULL_PTR + IPMACR=C_NULL_PTR + IPSAP=IPRHS + IPAPX=C_NULL_PTR + ELSE IF(ITYPE.EQ.6) THEN + IPEDIT=C_NULL_PTR + IPMICR=C_NULL_PTR + IPMACR=C_NULL_PTR + IPSAP=C_NULL_PTR + IPAPX=IPRHS + ENDIF + ILEN=0 + IF(C_ASSOCIATED(IPMACR)) CALL LCMLEN(IPMACR,'SPH',ILEN,ITYLCM) + IF(ILEN.NE.0) THEN + IPSPH=LCMGID(IPMACR,'SPH') + CALL LCMGET(IPSPH,'STATE-VECTOR',ISTATE) + NSPH=ISTATE(1) + KSPH=ISTATE(2) + MAXIT=ISTATE(3) + MAXNBI=ISTATE(4) + ILHS=ISTATE(5) + IMC=ISTATE(6) + IGRMIN=ISTATE(7) + IGRMAX=ISTATE(8) + IF(NSPH.GE.2) THEN + CALL LCMGTC(IPSPH,'SPH$TRK',12,CNDOOR) + CALL LCMGET(IPSPH,'SPH-EPSILON',EPSPH) + ELSE + CNDOOR=' ' + EPSPH=0.0 + ENDIF + LARM=(NSPH.EQ.4) + ELSE + NSPH=3 + IF(.NOT.C_ASSOCIATED(IPTRK)) NSPH=2 + KSPH=1 + MAXIT=200 + MAXNBI=10 + ILHS=0 + IMC=2 + IGRMIN=1 + IGRMAX=HUGE(IGRMAX) + EPSPH=1.0E-4 + CNDOOR=' ' + LARM=.FALSE. + ENDIF +*---- +* SET CNDOOR, IMC AND NSPH TO CONSISTENT VALUES +*---- + IF((NSPH.GE.2).AND.(C_ASSOCIATED(IPTRK))) THEN + CALL LCMGTC(IPTRK,'SIGNATURE',12,TEXT12) + IF(TEXT12.NE.'L_TRACK') THEN + CALL XABORT('SPH: TRACKING DATA STRUCTURE EXPECTED.') + ENDIF + CALL LCMGTC(IPTRK,'TRACK-TYPE',12,CNDOOR) + IMC=2 + IF(CNDOOR.EQ.'SYBIL') THEN +* SYBIL TRANSPORT-TRANSPORT EQUIVALENCE + NSPH=3 + IF(LARM) NSPH=4 + ELSE IF(CNDOOR.EQ.'NXT') THEN +* NXT TRANSPORT-TRANSPORT EQUIVALENCE + NSPH=3 + IF(IFTRK.EQ.0) CALL XABORT('SPH: MISSING TRACKING FILE') + ELSE IF(CNDOOR.EQ.'EXCELL') THEN +* EXCELL TRANSPORT-TRANSPORT EQUIVALENCE + NSPH=3 + IF(IFTRK.EQ.0) CALL XABORT('SPH: MISSING TRACKING FILE') + ELSE IF(CNDOOR.EQ.'MCCG') THEN +* MCCG TRANSPORT-TRANSPORT EQUIVALENCE + NSPH=4 + IF(IFTRK.EQ.0) CALL XABORT('SPH: MISSING TRACKING FILE') + ELSE IF(CNDOOR.EQ.'SN') THEN +* SN TRANSPORT-TRANSPORT EQUIVALENCE + NSPH=4 + ELSE IF(CNDOOR.EQ.'BIVAC') THEN +* BIVAC TRANSPORT-DIFFUSION EQUIVALENCE + NSPH=4 + IMC=1 + ELSE IF(CNDOOR.EQ.'TRIVAC') THEN +* TRIVAC TRANSPORT-DIFFUSION EQUIVALENCE + NSPH=4 + IMC=1 + ELSE + CALL XABORT('SPH: '//CNDOOR//' IS AN INVALID TRACKING MODU' + > //'LE') + ENDIF + ENDIF +*---- +* SPH DIRECTIVE ANALYSIS +*---- + IPRINT=1 + HEDIT=' ' + HEQUI=' ' + HEQNAM=' ' + ICAL=0 + B2=0.0 + LLEAK=.FALSE. + NALBP=0 + ILUPS=0 + ALLOCATE(SPOLD(1,1)) + 20 CALL REDGET(ITYPLU,INTLIR,REALIR,TEXT12,DFLOT) + IF(ITYPLU.EQ.10) GO TO 50 + IF(ITYPLU.NE.3) CALL XABORT('SPH: READ ERROR - CHARACTER VA' + > //'RIABLE EXPECTED') + 30 IF(TEXT12.EQ.';') THEN + GO TO 50 + ELSE IF(TEXT12.EQ.'EDIT') THEN + CALL REDGET(ITYPLU,IPRINT,REALIR,TEXT12,DFLOT) + IF(ITYPLU.NE.1) CALL XABORT('SPH: READ ERROR - INTEGER' + > //' VARIABLE EXPECTED') + ELSE IF(TEXT12.EQ.'IDEM') THEN + ILHS=0 + ELSE IF(TEXT12.EQ.'MICRO') THEN + IF((ITYPE.EQ.3).OR.(ITYPE.EQ.4)) THEN + CALL XABORT('SPH: UNABLE TO PRODUCE A MICROLIB') + ENDIF + ILHS=2 + ELSE IF(TEXT12.EQ.'MACRO') THEN + ILHS=3 + ELSE IF(TEXT12.EQ.'ASYM') THEN + CALL REDGET(ITYPLU,INTLIR,REALIR,TEXT12,DFLOT) + IF(ITYPLU.NE.1) CALL XABORT('SPH: READ ERROR - INTEGER V' + > //'ARIABLE EXPECTED') + IF(INTLIR.LE.0) CALL XABORT('SPH: INVALID ASYMPTOTIC MIX' + > //'TURE SET') + KSPH=-INTLIR + ELSE IF(TEXT12.EQ.'STD') THEN + KSPH=1 + ELSE IF(TEXT12.EQ.'SELE_ALB') THEN + KSPH=2 + ELSE IF(TEXT12.EQ.'SELE_FD') THEN + KSPH=3 + ELSE IF(TEXT12.EQ.'SELE_EDF') THEN + KSPH=4 + ELSE IF(TEXT12.EQ.'SELE_MWG') THEN + KSPH=6 + ELSE IF(TEXT12.EQ.'STD_FISS') THEN + KSPH=7 + ELSE IF(TEXT12.EQ.'OFF') THEN +* NO SPH CORRECTION PERFORMED + NSPH=0 + KSPH=0 + CNDOOR=' ' + ELSE IF(TEXT12.EQ.'UPS') THEN + ILUPS=1 + ELSE IF(TEXT12.EQ.'SPRD') THEN +* THE SPH FACTORS ARE READ FROM INPUT + NSPH=1 + KSPH=0 + CNDOOR=' ' + CALL REDGET(ITYPLU,NMERGO,REALIR,TEXT12,DFLOT) + IF(ITYPLU.EQ.3) THEN + NSPH=0 + GO TO 30 + ELSE IF(ITYPLU.NE.1) THEN + CALL XABORT('SPH: READ ERROR - INTEGER VARIABLE EXPECTED') + ENDIF + CALL REDGET(ITYPLU,NGCONO,REALIR,TEXT12,DFLOT) + IF(ITYPLU.NE.1) CALL XABORT('SPH: READ ERROR - INTEGER' + > //' VARIABLE EXPECTED') + DEALLOCATE(SPOLD) + ALLOCATE(SPOLD(NMERGO,NGCONO)) + DO I=1,NMERGO + DO J=1,NGCONO + CALL REDGET(ITYPLU,INTLIR,SPOLD(I,J),TEXT12,DFLOT) + IF(ITYPLU.NE.2) CALL XABORT('SPH: READ ERROR - REAL' + > //' VARIABLE EXPECTED') + ENDDO + ENDDO + ELSE IF(TEXT12.EQ.'SPOP') THEN +* THE SPH FACTORS ARE READ FROM A L_OPTIMIZE OBJECT + NSPH=1 + KSPH=0 + CNDOOR=' ' + ISTATE(:NSTATE)=0 + CALL LCMGET(IPOPT,'DEL-STATE',ISTATE) + NGCONO=ISTATE(1) + NMERGO=ISTATE(2) + IMC=ISTATE(4)-2 + NGR1=ISTATE(5) + NGR2=ISTATE(6) + IBM1=ISTATE(7) + IBM2=ISTATE(8) + NALBP=ISTATE(9) + NPERT=(NGR2-NGR1+1)*(NALBP+IBM2-IBM1+1) + DEALLOCATE(SPOLD) + ALLOCATE(SPOLD(NMERGO+NALBP,NGCONO),VARV(NPERT)) + CALL LCMGET(IPOPT,'VAR-VALUE',VARV) + SPOLD(:NMERGO+NALBP,:NGCONO)=1.0 + IPERT=0 + DO IGR=NGR1,NGR2 + DO IBM=IBM1,IBM2 + IPERT=IPERT+1 + SPOLD(IBM,IGR)=REAL(VARV(IPERT)) + ENDDO + DO IAL=1,NALBP + IPERT=IPERT+1 + SPOLD(NMIX+IAL,IGR)=REAL(VARV(IPERT)) + ENDDO + ENDDO + DEALLOCATE(VARV) + IF(IPERT.NE.NPERT) CALL XABORT('SPH: SPOP UPDATE FAILURE.') + ELSE IF(TEXT12.EQ.'HOMO') THEN +* HOMOGENEOUS MACRO CALCULATION (NO ITERATIONS ARE PERFORMED) + NSPH=2 + KSPH=0 + CNDOOR=' ' + ELSE IF(TEXT12.EQ.'ALBS') THEN + NSPH=2 + KSPH=5 + CNDOOR=' ' + ELSE IF(TEXT12.EQ.'PN') THEN + IMC=1 + ELSE IF(TEXT12.EQ.'SN') THEN + IMC=2 + ELSE IF(TEXT12.EQ.'ITER') THEN +* SPH ITERATION MAIN CONTROL PARAMETERS + 40 CALL REDGET(ITYPLU,INTLIR,REALIR,TEXT12,DFLOT) + IF(ITYPLU.EQ.1) THEN + MAXIT=INTLIR + ELSE IF(ITYPLU.EQ.2) THEN + EPSPH=REALIR + ELSE IF(ITYPLU.EQ.3) THEN + GO TO 30 + ENDIF + GO TO 40 + ELSE IF(TEXT12.EQ.'MAXNB') THEN +* SPH ITERATION AUXILIARY CONTROL PARAMETERS + CALL REDGET(ITYPLU,MAXNBI,REALIR,TEXT12,DFLOT) + IF(ITYPLU.NE.1) CALL XABORT('SPH: READ ERROR - INTEGER' + > //' VARIABLE EXPECTED') + ELSE IF(TEXT12.EQ.'BELL') THEN + IF(IMC.NE.2) CALL XABORT('SPH: SN OPTION MANDATORY') + IMC=3 + ELSE IF(TEXT12.EQ.'ARM') THEN + LARM=.TRUE. + ELSE IF(TEXT12.EQ.'STEP') THEN + CALL REDGET(ITYPLU,INTLIR,REALIR,TEXT12,DFLOT) + IF(ITYPLU.NE.3) CALL XABORT('SPH: READ ERROR - CHARACTER' + > //' VARIABLE EXPECTED') + IF(TEXT12.EQ.'UP') THEN + IF((ITYPE.NE.1).AND.(ITYPE.NE.5)) THEN + CALL XABORT('SPH: L_EDIT OR L_MULTICOMPO EXPECTED AT RHS') + ENDIF + CALL REDGET(ITYPLU,INTLIR,REALIR,HEDIT,DFLOT) + IF(ITYPLU.NE.3) CALL XABORT('SPH: READ ERROR - CHARACTER' + > //' VARIABLE EXPECTED') + ELSE IF(TEXT12.EQ.'AT') THEN + IF((ITYPE.NE.4).AND.(ITYPE.NE.5).AND.(ITYPE.NE.6)) THEN + CALL XABORT('SPH: L_SAPHYB, L_MULTICOMPO OR APEX FILE E' + > //'XPECTED AT RHS') + ENDIF + CALL REDGET(ITYPLU,ICAL,REALIR,TEXT12,DFLOT) + IF(ITYPLU.NE.1) CALL XABORT('SPH: READ ERROR - INTEGER' + > //' VARIABLE EXPECTED') + IF(ICAL.LE.0) CALL XABORT('SPH: INVALID VALUE OF ICAL') + ELSE + CALL XABORT('SPH: KEYWORD UP OR AT EXPECTED') + ENDIF + ELSE IF(TEXT12.EQ.'EQUI') THEN + IF((ITYPE.NE.4).AND.(ITYPE.NE.6)) THEN + CALL XABORT('SPH: L_SAPHYB OR APEX FILE EXPECTED AT RHS') + ENDIF + CALL REDGET(ITYPLU,INTLIR,REALIR,HEQNAM,DFLOT) + IF(ITYPLU.NE.3) CALL XABORT('SPH: READ ERROR - CHARACTER' + > //' VARIABLE EXPECTED') + HEQUI=HEQNAM(:4) + ELSE IF(TEXT12.EQ.'LOCNAM') THEN + IF(ITYPE.NE.4) CALL XABORT('SPH: L_SAPHYB EXPECTED AT RHS') + IF(HEQUI.EQ.' ') CALL XABORT('SPH: HEQUI IS NOT DEFINED') + CALL REDGET(ITYPLU,INTLIR,REALIR,HEQNAM,DFLOT) + IF(ITYPLU.NE.3) CALL XABORT('SPH: READ ERROR - CHARACTER' + > //' VARIABLE EXPECTED') + ELSE IF(TEXT12.EQ.'LEAK') THEN + LLEAK=.TRUE. + CALL REDGET(ITYPLU,NITMA,REALIR,TEXT12,DFLOT) + IF(ITYPLU.EQ.3) GO TO 30 + IF(ITYPLU.NE.2) CALL XABORT('SPH: REAL DATA EXPECTED.') + B2=REALIR + ELSE IF(TEXT12.EQ.'GRMIN') THEN + CALL REDGET(ITYPLU,IGRMIN,REALIR,TEXT12,DFLOT) + IF(ITYPLU.NE.1) CALL XABORT('SPH: INTEGER DATA EXPECTED.') + ELSE IF(TEXT12.EQ.'GRMAX') THEN + CALL REDGET(ITYPLU,IGRMAX,REALIR,TEXT12,DFLOT) + IF(ITYPLU.NE.1) CALL XABORT('SPH: INTEGER DATA EXPECTED.') + ELSE + CALL XABORT('SPH: INVALID KEYWORD='//TEXT12) + ENDIF + GO TO 20 +*---- +* RESET TO MICROLIB IN DIRECTORY HEDIT +*---- + 50 IF(ITYPE.EQ.1) THEN + IF(HEDIT.EQ.' ') CALL LCMGTC(IPEDIT,'LAST-EDIT',12,HEDIT) + IF(IPRINT.GT.0) THEN + WRITE(6,'(32H SPH: STEP UP L_EDIT DIRECTORY '',A,5H''(2).)') + 1 HEDIT + ENDIF + CALL LCMLEN(IPEDIT,HEDIT,ILONG,ITYLCM) + IF(ILONG.EQ.0) THEN + CALL LCMLIB(IPEDIT) + CALL XABORT('SPH: MISSING DIRECTORY: '//HEDIT) + ENDIF + IPMICR=LCMGID(IPEDIT,HEDIT) + IPMACR=LCMGID(IPMICR,'MACROLIB') + CALL LCMLEN(IPMICR,'SIGNATURE',ILONG,ITYLCM) + IF(ILONG.EQ.0) IPMICR=C_NULL_PTR + IPSAP=C_NULL_PTR + IPAPX=C_NULL_PTR + ENDIF +*---- +* SET POINTERS TO MACROLIB (IPMACR) AND OUTPUT (IPOUT) LCM OBJECTS +*---- + IF(ILHS.EQ.0) THEN + ILHS2=ITYPE + ELSE + ILHS2=ILHS + ENDIF + IF((C_ASSOCIATED(IPRHS,IPOUT)).AND.(ITYPE.NE.ILHS2)) THEN + IF(ILHS2.EQ.1) THEN + CALL XABORT('SPH: CANNOT EXTRACT AN EDITION OBJECT FROM AN' + > //' OBJECT IN MODIFICATION MODE.') + ELSE IF(ILHS2.EQ.2) THEN + CALL XABORT('SPH: CANNOT EXTRACT A MICROLIB FROM AN OBJECT' + > //' IN MODIFICATION MODE.') + ELSE IF(ILHS2.EQ.3) THEN + CALL XABORT('SPH: CANNOT EXTRACT A MACROLIB FROM AN OBJECT' + > //' IN MODIFICATION MODE.') + ELSE IF(ILHS2.EQ.4) THEN + CALL XABORT('SPH: CANNOT EXTRACT A SAPHYB FROM AN OBJECT I' + > //'N MODIFICATION MODE.') + ELSE IF(ILHS2.EQ.5) THEN + CALL XABORT('SPH: CANNOT EXTRACT A MULTICOMPO FROM AN OBJE' + > //'T IN MODIFICATION MODE.') + ELSE IF(ILHS2.EQ.6) THEN + CALL XABORT('SPH: CANNOT EXTRACT AN HDF FILE FROM AN OBJEC' + > //'T IN MODIFICATION MODE.') + ENDIF + ELSE IF((.NOT.C_ASSOCIATED(IPRHS,IPOUT)).AND.(ILHS2.EQ.1)) THEN + IF(.NOT.C_ASSOCIATED(IPEDIT)) CALL XABORT('SPH: NO EDITION OB' + > //'JECT ON RHS') + CALL LCMEQU(IPEDIT,IPOUT) + IF(IPRINT.GT.0) THEN + WRITE(6,'(32H SPH: STEP UP L_EDIT DIRECTORY '',A,5H''(3).)') + > HEDIT + ENDIF + IPEDIT=IPOUT + IPMICR=LCMGID(IPEDIT,HEDIT) + IPMACR=LCMGID(IPMICR,'MACROLIB') + CALL LCMLEN(IPMICR,'SIGNATURE',ILONG,ITYLCM) + IF(ILONG.EQ.0) IPMICR=C_NULL_PTR + ELSE IF((.NOT.C_ASSOCIATED(IPRHS,IPOUT)).AND.(ILHS2.EQ.2)) THEN + IF(ITYPE.EQ.2) THEN + IF(.NOT.C_ASSOCIATED(IPMICR)) CALL XABORT('SPH: NO MICROLI' + > //'B ON RHS') + CALL LCMEQU(IPMICR,IPOUT) + IPMACR=LCMGID(IPMICR,'MACROLIB') + ELSE IF(ITYPE.EQ.5) THEN + IPMACR=C_NULL_PTR + ELSE + CALL XABORT('SPH: RHS CANNOT BE CONVERTED TO A MICROLIB') + ENDIF + IPEDIT=C_NULL_PTR + IPMICR=IPOUT + ELSE IF((.NOT.C_ASSOCIATED(IPRHS,IPOUT)).AND.(ILHS2.EQ.3)) THEN + IF((ITYPE.NE.4).AND.(ITYPE.NE.5).AND.(ITYPE.NE.6)) THEN + CALL LCMEQU(IPMACR,IPOUT) + ENDIF + IPEDIT=C_NULL_PTR + IPMICR=C_NULL_PTR + IPMACR=IPOUT + ELSE IF((.NOT.C_ASSOCIATED(IPRHS,IPOUT)).AND.(ILHS2.EQ.4)) THEN + IF(.NOT.C_ASSOCIATED(IPSAP)) CALL XABORT('SPH: NO SAPHYB ON R' + > //'HS') + CALL LCMEQU(IPSAP,IPOUT) + IPEDIT=C_NULL_PTR + IPMICR=C_NULL_PTR + IPMACR=C_NULL_PTR + ELSE IF((.NOT.C_ASSOCIATED(IPRHS,IPOUT)).AND.(ILHS2.EQ.5)) THEN + IF(.NOT.C_ASSOCIATED(IPSAP)) CALL XABORT('SPH: NO MULTICOMPO ' + > //'ON RHS') + CALL LCMEQU(IPSAP,IPOUT) + IPEDIT=C_NULL_PTR + IPMICR=C_NULL_PTR + IPMACR=C_NULL_PTR + ELSE IF((.NOT.C_ASSOCIATED(IPRHS,IPOUT)).AND.(ILHS2.EQ.6)) THEN + CALL XABORT('SPH: CANNOT DUPLICATE AN HDF5 FILE') + ENDIF +*---- +* BUILD A MACROLIB IF NEEDED, ASSIGN AND INITIALIZE SPH-FACTOR ARRAY +*---- + ALLOCATE(SPH2(1,1)) + LTEMP=.FALSE. +#if defined(HDF5_LIB) + LMPO=.FALSE. +#endif /* defined(HDF5_LIB) */ + IF(ITYPE.EQ.4) THEN +* A Saphyb is given at RHS + IF(ILHS2.EQ.3) THEN + IPMACR=IPOUT + ELSE IF(ILHS2.EQ.4) THEN + LTEMP=.TRUE. + CALL LCMOP(IPMACR,'*TEMPORARY*',0,1,0) + ELSE + CALL XABORT('SPH: OPTION NOT IMPLEMENTED(1).') + ENDIF + CALL LCMLEN(IPSAP,'DIMSAP',ILENG,ITYLCM) + IF(ILENG.EQ.0) CALL XABORT('SPH: INVALID SAPHYB.') + CALL LCMGET(IPSAP,'DIMSAP',DIMSAP) + NMERGE=DIMSAP(7) ! number of mixtures + NGCOND=DIMSAP(20) ! number of energy groups + DEALLOCATE(SPH2) + ALLOCATE(SPH2(NMERGE,NGCOND)) + HMASL=' ' + CALL SPHSAP(IPSAP,IPMACR,ICAL,IPRINT,HEQUI,HMASL,NMERGE, + > NGCOND,ILUPS,SPH2,B2) + NALBP=0 ! no albedo correction + ELSE IF(ITYPE.EQ.5) THEN +* A Multicompo is given at RHS + IF(ILHS2.EQ.2) THEN + IPMICR=IPOUT + ELSE IF((ILHS2.EQ.3).OR.(ILHS2.EQ.5)) THEN + LTEMP=.TRUE. + CALL LCMOP(IPMICR,'*TEMPORARY*',0,1,0) + ELSE + CALL XABORT('SPH: OPTION NOT IMPLEMENTED(2).') + ENDIF + IF(HEDIT.EQ.' ') HEDIT='default' + IF(IPRINT.GT.0) THEN + HFORMAT='(38H SPH: STEP UP L_MULTICOMPO DIRECTORY '',A,'// + > '2H''.)' + WRITE(6,HFORMAT) HEDIT + ENDIF + IPCPO=LCMGID(IPSAP,HEDIT) + CALL LCMLEN(IPCPO,'STATE-VECTOR',ILENG,ITYLCM) + IF(ILENG.EQ.0) CALL XABORT('SPH: INVALID MULTICOMPO.') + CALL LCMGET(IPCPO,'STATE-VECTOR',ISTATE) + NMERGE=ISTATE(1) ! number of mixtures + NGCOND=ISTATE(2) ! number of energy groups + MAXISO=MAXISD*NMERGE + CALL SPHCPO(MAXISO,IPMICR,IPCPO,NMERGE,NGCOND,IPRINT,ICAL, + > ILUPS,B2) + IPMACR=LCMGID(IPMICR,'MACROLIB') + IF(ILHS2.EQ.3) CALL LCMEQU(IPMACR,IPOUT) + DEALLOCATE(SPH2) + ALLOCATE(SPH2(NMERGE,NGCOND)) + SPH2(:NMERGE,:NGCOND)=1.0 + NALBP=0 ! no albedo correction + ELSE IF(ITYPE.EQ.6) THEN +* An Apex or MPO file is given at RHS +#if defined(HDF5_LIB) + IF(ILHS2.EQ.3) THEN + IPMACR=IPOUT + ELSE + LTEMP=.TRUE. + CALL LCMOP(IPMACR,'*TEMPORARY*',0,1,0) + ENDIF + LMPO=hdf5_group_exists(IPAPX,"/contents/") + IF(LMPO) THEN + ! A MPO file is found at RHS + ! Find the (multigroup mesh, output geometry) couple + IF(HEDIT.EQ.' ') HEDIT='output_0' + CALL hdf5_read_data(IPAPX,"/energymesh/NENERGYMESH",NENERG) + CALL hdf5_read_data(IPAPX,"/geometry/NGEOMETRY",NGEOME) + CALL hdf5_read_data(IPAPX,"/output/OUPUTID",OUPUTID) + READ(HEDIT,'(7X,I2)') ID + ID_G=0 + ID_E=0 + DO I=1,NGEOME + DO J=1,NENERG + IF(OUPUTID(J,I).EQ.ID) THEN + ID_G=I-1 + ID_E=J-1 + GO TO 55 + ENDIF + ENDDO + ENDDO + CALL XABORT('SPH: no ID found in /output/OUPUTID.') + 55 WRITE(RECNAM,'(23H/energymesh/energymesh_,I0)') ID_E + IF(IPRINT.GT.1) THEN + HFORMAT='(/39H SPH: Process MPO multiparameter file o'// + > '9Hn output=,A,13h calculation=,I5)' + WRITE(IOUT,HFORMAT) TRIM(HEDIT),ICAL + WRITE(IOUT,'(21H SPH: energy group=,A)') TRIM(RECNAM) + ENDIF + CALL hdf5_read_data(IPAPX,TRIM(RECNAM)//"/ENERGY",WORK1) + NGCOND=SIZE(WORK1,1)-1 + DO IGR=1,NGCOND+1 + WORK1(IGR)=WORK1(IGR)/1.0E-6 + ENDDO + CALL LCMPUT(IPMACR,'ENERGY',NGCOND+1,2,WORK1) + DEALLOCATE(WORK1,OUPUTID) + WRITE(RECNAM,'(19H/geometry/geometry_,I0,1H/)') ID_G + IF(IPRINT.GT.1) THEN + WRITE(IOUT,'(21H SPH: geometry group=,A)') TRIM(RECNAM) + ENDIF + CALL hdf5_read_data(IPAPX,TRIM(RECNAM)//"NZONE",NMERGE) + CALL hdf5_read_data(IPAPX,TRIM(RECNAM)//"ZONEVOLUME",XVOLM) + ! + DEALLOCATE(SPH2) + ALLOCATE(SPH2(NMERGE,NGCOND)) + HMASL=' ' + CALL SPHMPO(IPAPX,IPMACR,ICAL,IPRINT,HEQNAM,HMASL,NMERGE, + > NALBP,NGCOND,HEDIT,XVOLM,ILUPS,SPH2,B2) + DEALLOCATE(XVOLM) + ELSE + ! An Apex file is found at RHS + NMERGE=1 + IF(hdf5_group_exists(IPAPX,"/physconst/")) THEN + CALL hdf5_get_shape(IPAPX,"/physconst/ENRGS",DIMS_APX) + ELSE IF(hdf5_group_exists(IPAPX,"/physco001/")) THEN + CALL hdf5_get_shape(IPAPX,"/physc001/ENRGS",DIMS_APX) + ELSE + CALL XABORT('SPH: GROUP physconst NOT FOUND IN HDF5 FILE') + ENDIF + NGCOND=DIMS_APX(1)-1 + CALL hdf5_list_groups(IPAPX, "calc 1", LIST) + DO I=1,SIZE(LIST) + IF(LIST(I)(:2).EQ.'xs') THEN + READ(LIST(I),'(2X,I8)') II + NMERGE=MAX(II,NMERGE) + ENDIF + ENDDO + DEALLOCATE(LIST) + DEALLOCATE(SPH2) + ALLOCATE(SPH2(NMERGE,NGCOND)) + LFROM=(NMERGE.GT.1) + CALL SPHAPX(IPAPX,IPMACR,ICAL,IPRINT,HEQNAM,NMERGE,NGCOND, + > LFROM,ILUPS,SPH2,B2) + ENDIF + NALBP=0 ! no albedo correction +#else + CALL XABORT('SPH: THE HDF5 API IS NOT AVAILABLE(1)') +#endif /* defined(HDF5_LIB) */ + ELSE +* A Edition/Microlib/Macrolib is given at RHS + CALL LCMGET(IPMACR,'STATE-VECTOR',ISTATE) + NGCOND=ISTATE(1) + NMERGE=ISTATE(2) + NALBP=ISTATE(8) + DEALLOCATE(SPH2) + ALLOCATE(SPH2(NMERGE+NALBP,NGCOND)) + SPH2(:NMERGE+NALBP,:NGCOND)=1.0 + ENDIF + IF(IGRMIN.GT.NGCOND) CALL XABORT('SPH: IGRMIN OVERFLOW.') + IGRMAX=MIN(IGRMAX,NGCOND) +*---- +* STORE SPH-RELATED INFORMATION +*---- + IF(NSPH.GT.0) THEN + IF(.NOT.C_ASSOCIATED(IPMACR)) CALL XABORT('SPH: MISSING MACRO' + > //'LIB.') + IPSPH=LCMDID(IPMACR,'SPH') + IF(NSPH.GE.2) THEN + CALL LCMPTC(IPSPH,'SPH$TRK',12,CNDOOR) + CALL LCMPUT(IPSPH,'SPH-EPSILON',1,2,EPSPH) + ENDIF + ISTATE(:NSTATE)=0 + ISTATE(1)=NSPH + ISTATE(2)=KSPH + ISTATE(3)=MAXIT + ISTATE(4)=MAXNBI + ISTATE(5)=ILHS + ISTATE(6)=IMC + ISTATE(7)=IGRMIN + ISTATE(8)=IGRMAX + CALL LCMPUT(IPSPH,'STATE-VECTOR',NSTATE,1,ISTATE) + IF(IPRINT.GT.0) WRITE(IOUT,200) (ISTATE(I),I=1,8),EPSPH,CNDOOR + ENDIF +*---- +* COMPUTE SPH FACTORS +*---- + IF(NSPH.EQ.1) THEN + IF(NMERGE+NALBP.NE.NMERGO) CALL XABORT('SPH: INVALID NUMBER OF' + > //' REGIONS AFTER SPRD.') + IF(NGCOND.NE.NGCONO) CALL XABORT('SPH: INVALID NUMBER OF GROUP' + > //'S AFTER SPRD.') + SPH2(:NMERGE+NALBP,:NGCOND)=SPOLD(:NMERGE+NALBP,:NGCOND) + ELSE IF(NSPH.GE.2) THEN + CALL LCMLEN(IPMACR,'SPH',ILONG,ITYLCM) + IF(ILONG.EQ.0) THEN + CALL LCMLIB(IPMACR) + CALL XABORT('SPH: NO SPH DIRECTORY AVAILABLE.') + ENDIF + CALL SPHDRV(IPTRK,IFTRK,IPMACR,IPFLX,IPRINT,IMC,NGCOND,NMERGE, + > NALBP,IGRMIN,IGRMAX,SPH2) + ENDIF + DEALLOCATE(SPOLD) +*---- +* APPLY SPH CORRECTION +*---- + IF((ILHS2.LE.3).AND.(.NOT.C_ASSOCIATED(IPMICR))) THEN +* Correction of Macrolib information + CALL LCMGET(IPMACR,'STATE-VECTOR',ISTATE) + NIFISS=ISTATE(4) + NED=ISTATE(5) + CALL SPHCMA(IPMACR,IPRINT,IMC,NMERGE,NGCOND,NIFISS,NED,NALBP, + > SPH2) + ELSE IF(ILHS2.LE.3) THEN +* Correction of Microlib information + CALL LCMGET(IPMICR,'STATE-VECTOR',ISTATE) + NISOT=ISTATE(2) + NL=ISTATE(4) + NED=ISTATE(13) + NDEL=ISTATE(19) + NW=MAX(1,ISTATE(25)) + ISTATE(25)=NW + CALL LCMPUT(IPMICR,'STATE-VECTOR',NSTATE,1,ISTATE) + CALL SPHCMI(IPMICR,IPRINT,IMC,NMERGE,NISOT,NGCOND,NL,NW,NED, + > NDEL,NALBP,SPH2) + ELSE IF((ILHS2.EQ.4).AND.(HEQUI.NE.' ')) THEN +*---- +* STORE A NEW SET OF SPH FACTORS IN THE SAPHYB +*---- + LNEW=(.NOT.C_ASSOCIATED(IPRHS,IPOUT)) + CALL SPHSTO(IPOUT,ICAL,IPRINT,LNEW,HEQUI,HEQNAM,NMERGE,NGCOND, + > SPH2) + ELSE IF(ILHS2.EQ.5) THEN +*---- +* APPLY A NEW SET OF SPH FACTORS IN THE MULTICOMPO +*---- + IPCPO=LCMGID(IPOUT,HEDIT) + CALL SPHSCO(IPCPO,ICAL,IPRINT,IMC,NMERGE,NGCOND,SPH2) + ELSE IF((ILHS2.EQ.6).AND.(HEQNAM.NE.' ')) THEN +*---- +* STORE A NEW SET OF SPH FACTORS IN THE APEX OR MPO FILE +*---- +#if defined(HDF5_LIB) + LNEW=(.NOT.C_ASSOCIATED(IPRHS,IPOUT)) + ALLOCATE(WORK1(NGCOND)) + IF(LMPO) THEN + CALL SPHSTM(IPAPX,ICAL,IPRINT,LNEW,HEQNAM,HEDIT,NMERGE,NGCOND, + > SPH2) + ELSE + IF(NMERGE.EQ.1) THEN + WRITE(TEXT80,'(4Hcalc,I8,14H/xs/MEDIA_SPH/)') ICAL + WORK1(:NGCOND)=SPH2(IBM,:NGCOND) + CALL hdf5_create_group(IPAPX,TRIM(TEXT80)) + CALL hdf5_write_data(IPAPX,TRIM(TEXT80)//HEQNAM,WORK1) + ELSE + DO IBM=1,NMERGE + WRITE(TEXT80,'(4Hcalc,I8,3H/xs,I8,11H/MEDIA_SPH/)') ICAL, + > IBM + WORK1(:NGCOND)=SPH2(IBM,:NGCOND) + CALL hdf5_create_group(IPAPX,TRIM(TEXT80)) + CALL hdf5_write_data(IPAPX,TRIM(TEXT80)//HEQNAM,WORK1) + ENDDO + ENDIF + ENDIF + DEALLOCATE(WORK1) +#else + CALL XABORT('SPH: THE HDF5 API IS NOT AVAILABLE(2)') +#endif /* defined(HDF5_LIB) */ + ENDIF +*---- +* RELEASE MEMORY ALLOCATED FOR MACROLIB/MICROLIB AND SPH FACTORS +*---- + IF((C_ASSOCIATED(IPMICR)).AND.LTEMP) THEN + CALL LCMCL(IPMICR,2) + ELSE IF(LTEMP) THEN + CALL LCMCL(IPMACR,2) + ENDIF + DEALLOCATE(SPH2) +*---- +* INCLUDE LEAKAGE IN THE MACROLIB (USED ONLY FOR NON-REGRESSION TESTS) +*---- + IF(LLEAK) THEN + IF(ILHS2.EQ.1) THEN + CALL LCMLEN(IPOUT,HEDIT,ILONG,ITYLCM) + IF(ILONG.EQ.0) THEN + CALL LCMLIB(IPEDIT) + CALL XABORT('SPH: MISSING DIRECTORY: '//HEDIT) + ENDIF + IPMICR=LCMGID(IPOUT,HEDIT) + IPMACR=LCMGID(IPMICR,'MACROLIB') + ELSE IF(ILHS2.EQ.2) THEN + IPMACR=LCMGID(IPOUT,'MACROLIB') + ELSE IF(ILHS2.EQ.3) THEN + IPMACR=IPOUT + ELSE + CALL XABORT('SPH: LHS MACROLIB EXPECTED WITH LEAK OPTION.') + ENDIF + CALL LCMGET(IPMACR,'STATE-VECTOR',ISTATE) + NGRP=ISTATE(1) + NMIX=ISTATE(2) + JPMAC=LCMGID(IPMACR,'GROUP') + ALLOCATE(WORK1(NMIX),WORK2(NMIX)) + DO 70 IGR=1,NGRP + KPMAC=LCMGIL(JPMAC,IGR) + CALL LCMGET(KPMAC,'NTOT0',WORK1) + CALL LCMGET(KPMAC,'DIFF',WORK2) + DO 60 IBM=1,NMIX + WORK1(IBM)=WORK1(IBM)+B2*WORK2(IBM) + 60 CONTINUE + CALL LCMPUT(KPMAC,'NTOT0',NMIX,2,WORK1) + 70 CONTINUE + DEALLOCATE(WORK2,WORK1) + B2=0.0 + CALL LCMPUT(IPMACR,'B2 B1HOM',1,2,B2) + ENDIF + IF((IPRINT.GT.5).AND.(ITYPE.LE.5)) CALL LCMLIB(IPOUT) + RETURN +* + 200 FORMAT(/20H SPH-RELATED OPTIONS/1X,19(1H-)/ + 1 7H NSPH ,I8,47H (=0: NO SPH CORRECTION; =1: READ SPH FACTORS, + 2 32H; >1: TYPE OF MACRO-CALCULATION)/ + 3 7H KSPH ,I8,47H (<0: ASYMPTOTIC SPH NORMALIZATION; =1: AVERA, + 4 60HGE FLUX; >1: SELENGUT NORMALIZATION; =7: AVERAGE FLUX IN FIS, + 5 11HSILE ZONES)/ + 6 7H MAXIT ,I8,37H (MAXIMUM NUMBER OF SPH ITERATIONS)/ + 7 7H MAXNBI,I8,47H (MAXIMUM NUMBER OF BAD ITERATIONS BEFORE ABO, + 8 6HRTING)/ + 9 7H ILHS ,I8,47H (=0/1/2/3: PRODUCE A RHS-TYPE/EDITION/MICROL, + 1 19HIB/MACROLIB AT LHS)/ + 2 7H IMC ,I8,47H (=1/2/3: PN-TYPE/SN-PIJ-MOC-TYPE CORRECTION/, + 3 32HPIJ-TYPE WITH BELL ACCELERATION)/ + 4 7H IGRMIN,I8,27H (FIRST GROUP TO PROCESS)/ + 5 7H IGRMAX,I8,26H (LAST GROUP TO PROCESS)/ + 6 7H EPSPH ,1P,E8.1,26H (CONVERGENCE CRITERION)/ + 7 8H CNDOOR ,A8,37H (MACRO-CALCULATION TRACKING MODULE)) + END |
