Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer, | intent(in) | :: | J | |||
integer, | intent(in) | :: | LFLAG | |||
real(kind=r64), | intent(in) | :: | PDROP | |||
integer, | intent(in) | :: | I | |||
integer, | intent(in) | :: | N | |||
integer, | intent(in) | :: | M | |||
real(kind=r64), | intent(out) | :: | F(2) | |||
real(kind=r64), | intent(out) | :: | DF(2) | |||
integer, | intent(out) | :: | NF |
Nodes of different colours represent the following:
Solid arrows point from a procedure to one which it calls. Dashed arrows point from an interface to procedures which implement that interface. This could include the module procedures in a generic interface or the implementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are given different colours to make them easier to distinguish in large graphs.
Nodes of different colours represent the following:
Solid arrows point from a procedure to one which it calls. Dashed arrows point from an interface to procedures which implement that interface. This could include the module procedures in a generic interface or the implementation in a submodule of an interface in a parent module. Where possible, edges connecting nodes are given different colours to make them easier to distinguish in large graphs.
SUBROUTINE AFEHEX(J,LFLAG,PDROP,I,N,M,F,DF,NF)
! SUBROUTINE INFORMATION:
! AUTHOR George Walton
! DATE WRITTEN Extracted from AIRNET
! MODIFIED Lixing Gu, 2/1/04
! Revised the subroutine to meet E+ needs
! MODIFIED Lixing Gu, 1/18/09
!
! RE-ENGINEERED na
! PURPOSE OF THIS SUBROUTINE:
! This subroutine solves airflow for a heat exchanger component
! METHODOLOGY EMPLOYED:
! na
! REFERENCES:
! na
! USE STATEMENTS:
! na
IMPLICIT NONE ! Enforce explicit typing of all variables in this routine
! SUBROUTINE ARGUMENT DEFINITIONS:
INTEGER, INTENT(IN) :: J ! Component number
INTEGER, INTENT(IN) :: LFLAG ! Initialization flag.If = 1, use laminar relationship
REAL(r64), INTENT(IN) :: PDROP ! Total pressure drop across a component (P1 - P2) [Pa]
INTEGER, INTENT(IN) :: I ! Linkage number
INTEGER, INTENT(IN) :: N ! Node 1 number
INTEGER, INTENT(IN) :: M ! Node 2 number
INTEGER, INTENT(OUT) :: NF ! Number of flows, either 1 or 2
REAL(r64), INTENT(OUT) :: F(2) ! Airflow through the component [kg/s]
REAL(r64), INTENT(OUT) :: DF(2) ! Partial derivative: DF/DP
! SUBROUTINE PARAMETER DEFINITIONS:
! na
! INTERFACE BLOCK SPECIFICATIONS
! na
! DERIVED TYPE DEFINITIONS
! na
! SUBROUTINE LOCAL VARIABLE DECLARATIONS:
REAL(r64) A0, A1, A2, B, C, D, EPS, S2, CDM, FL, FT, FTT, RE
INTEGER CompNum
REAL(r64) ed, ld, g, AA1, rough,area,InitLamCoef,LamDynCoef,LamFriCoef,TurDynCoef
DATA C,EPS / 0.868589d0, 0.001d0 /
DATA rough/0.0001d0/
DATA InitLamCoef,LamDynCoef,LamFriCoef,TurDynCoef/128.0d0,64.0d0,0.0001d0,0.0001d0/
! FLOW:
! Get component properties
CompNum = AirflowNetworkCompData(J)%TypeNum
ed = Rough/DisSysCompHXData(CompNum)%D
area = (DisSysCompHXData(CompNum)%D)**2*PI
ld = DisSysCompHXData(CompNum)%L/DisSysCompHXData(CompNum)%D
g = 1.14d0 - 0.868589d0*LOG(ed)
AA1 = g
NF = 1
IF(LFLAG.EQ.1) THEN
! Initialization by linear relation.
IF(PDROP.GE.0.0d0) THEN
DF(1) = (2.d0*RHOZ(N)*area*DisSysCompHXData(CompNum)%D)/(VISCZ(N)*InitLamCoef*ld)
ELSE
DF(1) = (2.d0*RHOZ(M)*Area*DisSysCompHXData(CompNum)%D)/(VISCZ(M)*InitLamCoef*ld)
END IF
F(1) = -DF(1)*PDROP
ELSE
! Standard calculation.
IF(PDROP.GE.0.0d0) THEN
! Flow in positive direction.
! Laminar flow coefficient !=0
IF(LamFriCoef.GE.0.001d0) THEN
A2 = LamFriCoef/(2.0d0*RHOZ(N)*Area*Area)
A1 = (VISCZ(N)*LamDynCoef*ld)/(2.d0*RHOZ(N)*Area*DisSysCompHXData(CompNum)%D)
A0 = -PDROP
CDM = SQRT(A1*A1-4.d0*A2*A0)
FL = (CDM-A1)/(2.d0*A2)
CDM = 1.0d0/CDM
ELSE
CDM = (2.d0*RHOZ(N)*Area*DisSysCompHXData(CompNum)%D)/(VISCZ(N)*LamDynCoef*ld)
FL = CDM*PDROP
END IF
RE = FL*DisSysCompHXData(CompNum)%D/(VISCZ(N)*Area)
! Turbulent flow; test when Re>10.
IF(RE.GE.10.0d0) THEN
S2 = SQRT(2.d0*RHOZ(N)*PDROP)*Area
FTT = S2 / SQRT(ld/g**2+TurDynCoef)
DO
FT = FTT
B = (9.3d0*VISCZ(N)*Area)/(FT*Rough)
D = 1.0d0 + g*B
g = g - (g-AA1+C*LOG(D))/(1.0d0+C*B/D)
FTT = S2 / SQRT(ld/g**2+TurDynCoef)
IF(ABS(FTT-FT)/FTT .LT. EPS) EXIT
ENDDO
FT = FTT
ELSE
FT = FL
END IF
ELSE
! Flow in negative direction.
! Laminar flow coefficient !=0
IF(LamFriCoef.GE.0.001d0) THEN
A2 = LamFriCoef/(2.d0*RHOZ(M)*Area*Area)
A1 = (VISCZ(M)*LamDynCoef*ld)/(2.d0*RHOZ(M)*Area*DisSysCompHXData(CompNum)%D)
A0 = PDROP
CDM = SQRT(A1*A1-4.d0*A2*A0)
FL = -(CDM-A1)/(2.d0*A2)
CDM = 1.0d0/CDM
ELSE
CDM = (2.d0*RHOZ(M)*Area*DisSysCompHXData(CompNum)%D)/(VISCZ(M)*LamDynCoef*ld)
FL = CDM*PDROP
END IF
RE = -FL*DisSysCompHXData(CompNum)%D/(VISCZ(M)*Area)
! Turbulent flow; test when Re>10.
IF(RE.GE.10.d0) THEN
S2 = SQRT(-2.d0*RHOZ(M)*PDROP)*Area
FTT = S2 / SQRT(ld/g**2+TurDynCoef)
DO
FT = FTT
B = (9.3d0*VISCZ(M)*Area)/(FT*Rough)
D = 1.0d0 + g*B
g = g - (g-AA1+C*LOG(D))/(1.0d0+C*B/D)
FTT = S2 / SQRT(ld/g**2+TurDynCoef)
IF(ABS(FTT-FT)/FTT .LT. EPS) EXIT
ENDDO
FT = -FTT
ELSE
FT = FL
END IF
END IF
! Select laminar or turbulent flow.
IF(ABS(FL).LE.ABS(FT)) THEN
F(1) = FL
DF(1) = CDM
ELSE
F(1) = FT
DF(1) = 0.5d0*FT/PDROP
END IF
END IF
RETURN
END SUBROUTINE AFEHEX