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/EDIJO3.f | |
Initial commit from Polytechnique Montreal
Diffstat (limited to 'Dragon/src/EDIJO3.f')
| -rw-r--r-- | Dragon/src/EDIJO3.f | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/Dragon/src/EDIJO3.f b/Dragon/src/EDIJO3.f new file mode 100644 index 0000000..d5faa8c --- /dev/null +++ b/Dragon/src/EDIJO3.f @@ -0,0 +1,160 @@ +*DECK EDIJO3 + SUBROUTINE EDIJO3(IPMAC2,IPTRK1,IPFLUX,IPRINT,NGCOND,IGCOND) +* +*----------------------------------------------------------------------- +* +*Purpose: +* Recover ALBS information from last component of unknown array for use +* with SPH equivalence techniques. Multicell surfacic compatible +* version. It is activated with ARM keyword in ASM: module. +* +*Copyright: +* Copyright (C) 2025 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 +* IPMAC2 pointer to condensed macrolib information (L_MACROLIB +* signature) built by EDI:. +* IPTRK1 pointer to the reference tracking object. +* IPFLUX pointer to the reference solution (L_FLUX signature). +* IPRINT print index. +* NGCOND number of condensed groups. +* IGCOND limit of condensed groups. +* +*----------------------------------------------------------------------- +* + USE GANLIB +*---- +* SUBROUTINE ARGUMENTS +*---- + TYPE(C_PTR) IPMAC2,IPTRK1,IPFLUX + INTEGER IPRINT,NGCOND,IGCOND(NGCOND) +*---- +* LOCAL VARIABLES +*---- + PARAMETER (NSTATE=40) + TYPE(C_PTR) JPFLUX + INTEGER ISTATE(NSTATE) + CHARACTER CDOOR*12 +*---- +* ALLOCATABLE ARRAYS +*---- + INTEGER, ALLOCATABLE, DIMENSION(:) :: NMC_SURF,IFR,MIX,INUM,IGEN + REAL, ALLOCATABLE, DIMENSION(:) :: ALB,SUR,WORKD + REAL, ALLOCATABLE, DIMENSION(:,:) :: OUTG +*---- +* RECOVER FLUX OBJECT INFORMATION +*---- + CALL LCMGET(IPFLUX,'STATE-VECTOR',ISTATE) + NUNKNO=ISTATE(2) + ILEAK=ISTATE(7) +*---- +* RECOVER TRACKING INFORMATION +*---- + CALL LCMGTC(IPTRK1,'TRACK-TYPE',12,CDOOR) + CALL LCMGET(IPTRK1,'STATE-VECTOR',ISTATE) + IF((CDOOR.NE.'EXCELL').OR.(ISTATE(7).NE.5)) THEN + CALL XABORT('EDIJO3: MULTICELL SURFACIC OPTION NOT ACTIVATED.') + ENDIF + NREG=ISTATE(1) + NUNKNO=ISTATE(2)+ISTATE(28) + NMACRO=ISTATE(24) + IF(NMACRO.EQ.0) CALL XABORT('EDIJO3: NO MACRO GEOMETRIES.') + NMCEL=NMACRO + NMERGE=NMACRO + ALLOCATE(IGEN(NMERGE),INUM(NMCEL),NMC_SURF(NMACRO+1)) + DO IK=1,NMERGE + IGEN(IK)=IK + ENDDO + DO IK=1,NMCEL + INUM(IK)=IK + ENDDO + IF(NMACRO.EQ.0) CALL XABORT('EDIJO3: MACRO OPTION IS MANDATORY.') + CALL LCMGET(IPTRK1,'NMC_SURF',NMC_SURF) + NMIX=NMC_SURF(NMACRO+1) + NIFR=NMC_SURF(NMACRO+1) + ALLOCATE(IFR(NIFR),ALB(NIFR),MIX(NMIX),SUR(NMIX)) + CALL LCMGET(IPTRK1,'IFR',IFR) + CALL LCMGET(IPTRK1,'ALB',ALB) + CALL LCMGET(IPTRK1,'MIX',MIX) + CALL LCMGET(IPTRK1,'SUR',SUR) +*---- +* COMPUTE THE OUTGOING CURRENT +*---- + ALLOCATE(OUTG(NGCOND,2)) + IGRFIN=0 + CALL LCMSIX(IPMAC2,'ADF',1) + DO 70 IGRCD=1,NGCOND + OUTG(IGRCD,:2)=0.0 + IGRDEB=IGRFIN+1 + IGRFIN=IGCOND(IGRCD) + CALL LCMLEN(IPFLUX,'FLUX',ILON,ITYLCM) + IF(ILON.EQ.0) CALL XABORT('EDIJO3: MISSING FLUX INFO(1).') + JPFLUX=LCMGID(IPFLUX,'FLUX') + DO 60 IGR=IGRDEB,IGRFIN + CALL LCMLEL(JPFLUX,IGR,ILCMLN,ITYLCM) + IF(ILCMLN.EQ.0) CALL XABORT('EDIJO3: MISSING FLUX INFO(2).') + IF(ILEAK.LE.5) THEN + IF(ILCMLN.NE.NUNKNO) CALL XABORT('EDIJO3: ARM KEYWORD MUST B' + 1 //'E SET IN ASM: MODULE(1).') + ALLOCATE(WORKD(NUNKNO)) + ELSE IF(ILEAK.EQ.6) THEN + IF(ILCMLN.NE.2*NUNKNO) CALL XABORT('EDIJO3: ARM KEYWORD MUST' + 1 //' BE SET IN ASM: MODULE(2).') + ALLOCATE(WORKD(2*NUNKNO)) + ELSE + CALL XABORT('EDIJO3: INVALID TYPE OF LEAKAGE.') + ENDIF + CALL LCMGDL(JPFLUX,IGR,WORKD) + OUTC1=0.0 + OUTC2=0.0 + SURT=0.0 + DO 50 ICEL=1,NMCEL + IKK=INUM(ICEL) + IKG=IGEN(IKK) + IF(IKK.EQ.0) GO TO 50 + J3=NMC_SURF(IKG+1)-NMC_SURF(IKG) + IT=0 + DO IK=1,IKK-1 + IT=IT+(NMC_SURF(IGEN(IK)+1)-NMC_SURF(IGEN(IK))) + ENDDO + IS=0 + DO IK=1,ICEL-1 + IS=IS+(NMC_SURF(IGEN(INUM(IK))+1)-NMC_SURF(IGEN(INUM(IK)))) + ENDDO + DO 40 JC=1,J3 + IF((MIX(IT+JC).EQ.IFR(IS+JC)).AND.(SUR(IS).NE.0.0)) THEN + J1=IFR(IS+JC) + OUTC1=OUTC1+WORKD(NREG+J1)*SUR(IS+JC) + OUTC2=OUTC2+WORKD(NREG+J1)*SUR(IS+JC)*ALB(IS+JC) + SURT=SURT+SUR(IS+JC) + ENDIF + 40 CONTINUE + 50 CONTINUE + DEALLOCATE(NMC_SURF,INUM,IGEN) + DEALLOCATE(SUR,MIX,ALB,IFR) + OUTG(IGRCD,1)=OUTG(IGRCD,1)+OUTC1/SURT + OUTG(IGRCD,2)=OUTG(IGRCD,2)+OUTC2/SURT + DEALLOCATE(WORKD) + 60 CONTINUE + 70 CONTINUE + CALL LCMPUT(IPMAC2,'ALBS00',NGCOND*2,2,OUTG) + IF(IPRINT.GT.3) THEN + WRITE(6,900) (OUTG(IGR,1),IGR=1,NGCOND) + WRITE(6,910) (OUTG(IGR,2),IGR=1,NGCOND) + WRITE(6,'(/)') + ENDIF + CALL LCMSIX(IPMAC2,' ',2) + DEALLOCATE(OUTG) + RETURN +* + 900 FORMAT(/49H EDIJO3: OUT-CURRENTS (4J-/S) PER MACRO-GROUP ARE/ + > (1X,1P,10E13.5)) + 910 FORMAT(/49H EDIJO3: IN-CURRENTS (4J+/S) PER MACRO-GROUP ARE/ + > (1X,1P,10E13.5)) + END |
