Nodes of different colours represent the following:
Solid arrows point from a parent (sub)module to the submodule which is descended from it. Dashed arrows point from a module being used to the module or program unit using it. Where possible, edges connecting nodes are given different colours to make them easier to distinguish in large graphs.
!! Write Header lines for report
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
integer, | intent(in) | :: | RptType |
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 DetailsForSurfaces(RptType)
! SUBROUTINE INFORMATION:
! AUTHOR Linda Lawrie
! DATE WRITTEN February 2002
! MODIFIED na
! RE-ENGINEERED na
! PURPOSE OF THIS SUBROUTINE:
! This subroutine provides an optional detailed surface report
! for each surface in the input file.
! METHODOLOGY EMPLOYED:
! na
! REFERENCES:
! na
! USE STATEMENTS:
USE DataPrecisionGlobals
USE DataHeatBalance
USE DataSurfaces
USE DataGlobals, ONLY: NumOfZones,OutputFileInits
USE General, ONLY: RoundSigDigits,TrimSigDigits
USE ScheduleManager, ONLY: GetScheduleName,GetScheduleMinValue,GetScheduleMaxValue
IMPLICIT NONE ! Enforce explicit typing of all variables in this routine
! SUBROUTINE ARGUMENT DEFINITIONS:
INTEGER, INTENT(IN) :: RptType ! (1=Vertices only, 10=Details only, 11=Details with vertices)
! SUBROUTINE PARAMETER DEFINITIONS:
CHARACTER(len=*), PARAMETER, DIMENSION(1:9) :: ConvCoeffCalcs=(/'ASHRAESimple ', &
'ASHRAETARP ', &
'CeilingDiffuser ', &
'TrombeWall ', &
'TARP ', &
'MoWitt ', &
'DOE-2 ', &
'BLAST ', &
'AdaptiveConvectionAlgorithm'/)
! INTERFACE BLOCK SPECIFICATIONS
! na
! DERIVED TYPE DEFINITIONS
! na
! SUBROUTINE LOCAL VARIABLE DECLARATIONS:
integer unit ! Unit number on which to write file
integer surf ! Loop variable for surfaces
integer vert ! Loop counter
integer zonenum ! Loop counter
character(len=MaxNameLength) :: BaseSurfName
character(len=MaxNameLength) :: ConstructionName
character(len=MaxNameLength) :: scheduleName
CHARACTER(len=32) :: IntConvCoeffCalc
CHARACTER(len=32) :: ExtConvCoeffCalc
REAL(r64) :: NominalUwithConvCoeffs
CHARACTER(len=32) :: cNominalU
CHARACTER(len=32) :: cNominalUwithConvCoeffs
CHARACTER(len=32) :: cSchedMin
CHARACTER(len=32) :: cSchedMax
CHARACTER(len=3) :: SolarDiffusing
integer fd
character(len=MaxNameLength) :: AlgoName
logical :: isWithConvCoefValid
if (totsurfaces > 0 .and. .not. allocated(surface)) then
! no error needed, probably in end processing, just return
return
endif
unit=OutputFileInits
!!!! Write Header lines for report
if (RptType == 10) then ! Details only
write(unit,700)
write(unit,701,advance='No')
write(unit,7011)
write(unit,702,advance='No')
write(unit,7021)
elseif (RptType == 11) then ! Details with Vertices
write(unit,700,advance='No')
write(unit,710)
write(unit,701,advance='No')
write(unit,7011,advance='No')
write(unit,707)
write(unit,702,advance='No')
write(unit,7021,advance='No')
write(unit,708)
else ! Vertices only
write(unit,700,advance='No')
write(unit,710)
write(unit,701,advance='No')
write(unit,7012,advance='No')
write(unit,707)
write(unit,702,advance='No')
write(unit,708)
endif
! Do just "detached" shading first
do surf=1,totsurfaces
if (Surface(surf)%Zone /= 0) EXIT
enddo
if ((surf-1) > 0) then
write(unit,703) 'Shading_Surfaces','Number of Shading Surfaces',surf-1
do surf=1,totsurfaces
if (Surface(surf)%Zone /= 0) EXIT
AlgoName = 'None'
write(unit,704,advance='No') 'Shading',trim(Surface(surf)%Name),trim(cSurfaceClass(Surface(surf)%class)), &
trim(Surface(surf)%BaseSurfName), TRIM(AlgoName)
if (RptType == 10) then
if (Surface(surf)%SchedShadowSurfIndex > 0) then
scheduleName=GetScheduleName(Surface(surf)%SchedShadowSurfIndex)
cSchedMin=RoundSigDigits(GetScheduleMinValue(Surface(surf)%SchedShadowSurfIndex),2)
cSchedMax=RoundSigDigits(GetScheduleMaxValue(Surface(surf)%SchedShadowSurfIndex),2)
else
scheduleName=' '
cSchedMin='0.0'
cSchedMax='0.0'
endif
write(unit,7044,advance='No') trim(scheduleName),trim(cSchedMin),trim(cSchedMax),' ', &
trim(RoundSigDigits(Surface(surf)%Area,2)),trim(RoundSigDigits(Surface(surf)%GrossArea,2)), &
trim(RoundSigDigits(Surface(surf)%NetAreaShadowCalc,2)), &
trim(RoundSigDigits(Surface(surf)%Azimuth,2)),trim(RoundSigDigits(Surface(surf)%Tilt,2)), &
trim(RoundSigDigits(Surface(surf)%Width,2)),trim(RoundSigDigits(Surface(surf)%Height,2))
write(unit,7061) trim(TrimSigDigits(Surface(surf)%Sides))
elseif (RptType == 1) then
write(unit,7042,advance='No') trim(TrimSigDigits(Surface(surf)%Sides))
else
if (Surface(surf)%SchedShadowSurfIndex > 0) then
scheduleName=GetScheduleName(Surface(surf)%SchedShadowSurfIndex)
cSchedMin=RoundSigDigits(GetScheduleMinValue(Surface(surf)%SchedShadowSurfIndex),2)
cSchedMax=RoundSigDigits(GetScheduleMaxValue(Surface(surf)%SchedShadowSurfIndex),2)
else
scheduleName=' '
cSchedMin='0.0'
cSchedMax='0.0'
endif
write(unit,7044,advance='No') trim(scheduleName),trim(cSchedMin),trim(cSchedMax),' ', &
trim(RoundSigDigits(Surface(surf)%Area,2)),trim(RoundSigDigits(Surface(surf)%GrossArea,2)), &
trim(RoundSigDigits(Surface(surf)%NetAreaShadowCalc,2)), &
trim(RoundSigDigits(Surface(surf)%Azimuth,2)),trim(RoundSigDigits(Surface(surf)%Tilt,2)), &
trim(RoundSigDigits(Surface(surf)%Width,2)),trim(RoundSigDigits(Surface(surf)%Height,2))
write(unit,7061,advance='No') trim(TrimSigDigits(Surface(surf)%Sides))
endif
if (RptType == 10) CYCLE
do vert=1,Surface(surf)%Sides
if (vert /= Surface(Surf)%Sides) then
write(unit,709,advance='No') trim(RoundSigDigits(Surface(surf)%vertex(vert)%x,2)), &
trim(RoundSigDigits(Surface(surf)%vertex(vert)%y,2)), &
trim(RoundSigDigits(Surface(surf)%vertex(vert)%z,2))
else
write(unit,709) trim(RoundSigDigits(Surface(surf)%vertex(vert)%x,2)), &
trim(RoundSigDigits(Surface(surf)%vertex(vert)%y,2)), &
trim(RoundSigDigits(Surface(surf)%vertex(vert)%z,2))
endif
enddo
! This shouldn't happen with shading surface -- always have vertices
if (Surface(surf)%Sides == 0) write(unit,711)
enddo
endif
do zonenum=1,NumOfZones
write(unit,703) 'Zone_Surfaces',TRIM(Zone(zonenum)%Name),(Zone(zonenum)%SurfaceLast-Zone(zonenum)%SurfaceFirst+1)
do surf=1,totsurfaces
if (Surface(surf)%Zone /= zonenum) CYCLE
SolarDiffusing=' '
if (RptType == 10 .or. RptType == 11) then ! Details and Details with Vertices
if (Surface(surf)%BaseSurf == surf) then
BaseSurfName=' '
else
BaseSurfName=Surface(surf)%BaseSurfName
endif
SELECT CASE (Surface(surf)%HeatTransferAlgorithm)
CASE (HeatTransferModel_None)
AlgoName = 'None'
CASE (HeatTransferModel_CTF)
AlgoName = 'CTF - ConductionTransferFunction'
CASE (HeatTransferModel_CondFD)
AlgoName = 'CondFD - ConductionFiniteDifference'
CASE (HeatTransferModel_EMPD)
AlgoName = 'EMPD - MoisturePenetrationDepthConductionTransferFunction'
CASE (HeatTransferModel_HAMT)
AlgoName = 'HAMT - CombinedHeatAndMoistureFiniteElement'
CASE (HeatTransferModel_Window5)
AlgoName = 'Window5 Detailed Fenestration'
CASE (HeatTransferModel_ComplexFenestration)
AlgoName = 'Window7 Complex Fenestration'
CASE (HeatTransferModel_TDD)
AlgoName = 'Tubular Daylighting Device'
END SELECT
! Default Convection Coefficient Calculation Algorithms
IntConvCoeffCalc=ConvCoeffCalcs(Zone(zonenum)%InsideConvectionAlgo)
ExtConvCoeffCalc=ConvCoeffCalcs(Zone(zonenum)%OutsideConvectionAlgo)
write(unit,704,advance='No') 'HeatTransfer',trim(Surface(surf)%Name),trim(cSurfaceClass(Surface(surf)%class)), &
trim(BaseSurfName), trim(AlgoName)
! NOTE - THIS CODE IS REPEATED IN SurfaceGeometry.F90 IN SetupZoneGeometry
! Calculate Nominal U-value with convection/film coefficients for reporting by adding on
! prescribed R-values for interior and exterior convection coefficients as found in ASHRAE 90.1-2004, Appendix A
if (Surface(surf)%Construction > 0 .and. Surface(surf)%Construction <= TotConstructs) THEN
NominalUwithConvCoeffs = ComputeNominalUwithConvCoeffs(surf,isWithConvCoefValid)
ConstructionName=Construct(Surface(surf)%Construction)%Name
IF (isWithConvCoefValid) THEN
cNominalUwithConvCoeffs=RoundSigDigits(NominalUwithConvCoeffs,3)
ELSE
cNominalUwithConvCoeffs = '[invalid]'
END IF
IF ((Surface(surf)%class == SurfaceClass_Window) .OR. (Surface(surf)%class == SurfaceClass_TDD_Dome)) THEN
! SurfaceClass_Window also covers glass doors and TDD:Diffusers
cNominalU='N/A'
IF (SurfaceWindow(surf)%SolarDiffusing) THEN
SolarDiffusing='Yes'
ELSE
SolarDiffusing='No'
ENDIF
ELSE
cNominalU=RoundSigDigits(NominalU(Surface(surf)%Construction),3)
END IF
else
CNominalUwithConvCoeffs = '**'
CNominalU = '**'
ConstructionName='**invalid**'
endif
write(unit,7041,advance='No')trim(ConstructionName),trim(cNominalU),trim(cNominalUwithConvCoeffs),trim(SolarDiffusing), &
trim(RoundSigDigits(Surface(surf)%Area,2)),trim(RoundSigDigits(Surface(surf)%GrossArea,2)), &
trim(RoundSigDigits(Surface(surf)%NetAreaShadowCalc,2)), &
trim(RoundSigDigits(Surface(surf)%Azimuth,2)),trim(RoundSigDigits(Surface(surf)%Tilt,2)), &
trim(RoundSigDigits(Surface(surf)%Width,2)),trim(RoundSigDigits(Surface(surf)%Height,2)), &
trim(RoundSigDigits(Surface(surf)%Reveal,2))
if (Surface(surf)%IntConvCoeff > 0) THEN
SELECT CASE (UserIntConvectionCoeffs(Surface(surf)%IntConvCoeff)%OverrideType)
CASE ( ConvCoefValue)
IntConvCoeffCalc='User Supplied Value'
CASE ( ConvCoefSchedule )
IntConvCoeffCalc='User Supplied Schedule'
CASE (ConvCoefUserCurve)
ExtConvCoeffCalc='User Supplied Curve'
CASE (ConvCoefSpecifiedModel)
ExtConvCoeffCalc='User Specified Model'
END SELECT
elseif (Surface(surf)%IntConvCoeff < 0) THEN ! not in use yet.
IntConvCoeffCalc=ConvCoeffCalcs(ABS(Surface(surf)%IntConvCoeff))
endif
if (Surface(surf)%ExtConvCoeff > 0) THEN
SELECT CASE (UserExtConvectionCoeffs(Surface(surf)%ExtConvCoeff)%OverrideType)
CASE (ConvCoefValue)
ExtConvCoeffCalc='User Supplied Value'
CASE (ConvCoefSchedule)
ExtConvCoeffCalc='User Supplied Schedule'
CASE (ConvCoefUserCurve)
ExtConvCoeffCalc='User Supplied Curve'
CASE (ConvCoefSpecifiedModel)
ExtConvCoeffCalc='User Specified Model'
END SELECT
elseif (Surface(surf)%ExtConvCoeff < 0) THEN
ExtConvCoeffCalc=ConvCoeffCalcs(ABS(Surface(surf)%ExtConvCoeff))
endif
if (Surface(surf)%extboundcond == ExternalEnvironment) then
write(unit,705,advance='No') 'ExternalEnvironment'
write(unit,705,advance='No') trim(ExtConvCoeffCalc)
write(unit,705,advance='No') trim(IntConvCoeffCalc)
elseif (Surface(surf)%extboundcond == Ground) then
write(unit,705,advance='No') 'Ground'
write(unit,705,advance='No') 'N/A-Ground'
write(unit,705,advance='No') trim(IntConvCoeffCalc)
elseif (Surface(surf)%extboundcond == GroundFCfactorMethod) then
write(unit,705,advance='No') 'FCGround'
write(unit,705,advance='No') 'N/A-FCGround'
write(unit,705,advance='No') trim(IntConvCoeffCalc)
elseif (Surface(surf)%extboundcond == OtherSideCoefNoCalcExt .or. Surface(surf)%extboundcond == OtherSideCoefCalcExt) then
write(unit,705,advance='No') TRIM(OSC(Surface(surf)%OSCPtr)%Name)
write(unit,705,advance='No') 'N/A-OSC'
write(unit,705,advance='No') trim(IntConvCoeffCalc)
elseif (Surface(surf)%extboundcond == OtherSideCondModeledExt) then
write(unit,705,advance='No') TRIM(OSCM(Surface(surf)%OSCMPtr)%Name)
write(unit,705,advance='No') 'N/A-OSCM'
write(unit,705,advance='No') trim(IntConvCoeffCalc)
else
write(unit,705,advance='No') trim(Surface(surf)%ExtBoundCondName)
write(unit,705,advance='No') 'Other/Same Surface Int Conv'
write(unit,705,advance='No') trim(IntConvCoeffCalc)
endif
if (Surface(surf)%ExtSolar) then
write(unit,705,advance='No') 'SunExposed'
else
write(unit,705,advance='No') 'NoSun'
endif
if (Surface(surf)%ExtWind) then
write(unit,705,advance='No') 'WindExposed'
else
write(unit,705,advance='No') 'NoWind'
endif
if (RptType == 10) then
write(unit,706) trim(RoundSigDigits(Surface(surf)%ViewFactorGround,2)), &
trim(RoundSigDigits(Surface(surf)%ViewFactorSky,2)), &
trim(RoundSigDigits(Surface(surf)%ViewFactorGroundIR,2)), &
trim(RoundSigDigits(Surface(surf)%ViewFactorSkyIR,2)), &
trim(TrimSigDigits(Surface(surf)%Sides))
else
write(unit,706,advance='No') trim(RoundSigDigits(Surface(surf)%ViewFactorGround,2)), &
trim(RoundSigDigits(Surface(surf)%ViewFactorSky,2)), &
trim(RoundSigDigits(Surface(surf)%ViewFactorGroundIR,2)), &
trim(RoundSigDigits(Surface(surf)%ViewFactorSkyIR,2)), &
trim(TrimSigDigits(Surface(surf)%Sides))
do vert=1,Surface(surf)%Sides
if (vert /= Surface(Surf)%Sides) then
write(unit,709,advance='No') trim(RoundSigDigits(Surface(surf)%vertex(vert)%x,2)), &
trim(RoundSigDigits(Surface(surf)%vertex(vert)%y,2)), &
trim(RoundSigDigits(Surface(surf)%vertex(vert)%z,2))
else
write(unit,709) trim(RoundSigDigits(Surface(surf)%vertex(vert)%x,2)), &
trim(RoundSigDigits(Surface(surf)%vertex(vert)%y,2)), &
trim(RoundSigDigits(Surface(surf)%vertex(vert)%z,2))
endif
enddo
IF (Surface(surf)%Sides == 0) write(unit,711)
endif
! if window, report frame/divider as appropriate
if (Surface(surf)%FrameDivider > 0) then
fd=Surface(surf)%FrameDivider
if (FrameDivider(fd)%FrameWidth > 0.0d0) then
SELECT CASE (Surface(surf)%HeatTransferAlgorithm)
CASE (HeatTransferModel_None)
AlgoName = 'None'
CASE (HeatTransferModel_CTF)
AlgoName = 'CTF - ConductionTransferFunction'
CASE (HeatTransferModel_CondFD)
AlgoName = 'CondFD - ConductionFiniteDifference'
CASE (HeatTransferModel_EMPD)
AlgoName = 'EMPD - MoisturePenetrationDepthConductionTransferFunction'
CASE (HeatTransferModel_HAMT)
AlgoName = 'HAMT - CombinedHeatAndMoistureFiniteElement'
CASE (HeatTransferModel_Window5)
AlgoName = 'Window5 Detailed Fenestration'
CASE (HeatTransferModel_ComplexFenestration)
AlgoName = 'Window7 Complex Fenestration'
CASE (HeatTransferModel_TDD)
AlgoName = 'Tubular Daylighting Device'
END SELECT
write(unit,704,advance='No') 'Frame/Divider',trim(FrameDivider(fd)%Name),'Frame',trim(Surface(surf)%Name) &
, trim(AlgoName)
write(unit,7045) trim(RoundSigDigits(SurfaceWindow(surf)%FrameArea,2)), &
trim(RoundSigDigits(SurfaceWindow(surf)%FrameArea/Surface(surf)%Multiplier,2)),'*','N/A','N/A', &
trim(RoundSigDigits(FrameDivider(fd)%FrameWidth,2)),'N/A'
endif
if (FrameDivider(fd)%DividerWidth > 0.0d0) then
if (FrameDivider(fd)%DividerType == DividedLite) then
write(unit,704,advance='No') 'Frame/Divider',trim(FrameDivider(fd)%Name), &
'Divider:DividedLite',trim(Surface(surf)%Name)
else
write(unit,704,advance='No') 'Frame/Divider',trim(FrameDivider(fd)%Name), &
'Divider:Suspended',trim(Surface(surf)%Name)
endif
write(unit,7045) trim(RoundSigDigits(SurfaceWindow(surf)%DividerArea,2)), &
trim(RoundSigDigits(SurfaceWindow(surf)%DividerArea/Surface(surf)%Multiplier,2)),'*','N/A','N/A', &
trim(RoundSigDigits(FrameDivider(fd)%DividerWidth,2)),'N/A'
endif
endif
else ! RptType=1 Vertices only
if (Surface(surf)%BaseSurf == surf) then
BaseSurfName=' '
else
BaseSurfName=Surface(surf)%BaseSurfName
endif
SELECT CASE (Surface(surf)%HeatTransferAlgorithm)
CASE (HeatTransferModel_None)
AlgoName = 'None'
CASE (HeatTransferModel_CTF)
AlgoName = 'CTF - ConductionTransferFunction'
CASE (HeatTransferModel_CondFD)
AlgoName = 'CondFD - ConductionFiniteDifference'
CASE (HeatTransferModel_EMPD)
AlgoName = 'EMPD - MoisturePenetrationDepthConductionTransferFunction'
CASE (HeatTransferModel_HAMT)
AlgoName = 'HAMT - CombinedHeatAndMoistureFiniteElement'
CASE (HeatTransferModel_Window5)
AlgoName = 'Window5 Detailed Fenestration'
CASE (HeatTransferModel_ComplexFenestration)
AlgoName = 'Window7 Complex Fenestration'
CASE (HeatTransferModel_TDD)
AlgoName = 'Tubular Daylighting Device'
END SELECT
write(unit,704,advance='No') 'HeatTransfer',trim(Surface(surf)%Name),trim(cSurfaceClass(Surface(surf)%class)), &
trim(BaseSurfName), trim(AlgoName)
write(unit,7042,advance='No') trim(TrimSigDigits(Surface(surf)%Sides))
do vert=1,Surface(surf)%Sides
if (vert /= Surface(Surf)%Sides) then
write(unit,709,advance='No') trim(RoundSigDigits(Surface(surf)%vertex(vert)%x,2)), &
trim(RoundSigDigits(Surface(surf)%vertex(vert)%y,2)), &
trim(RoundSigDigits(Surface(surf)%vertex(vert)%z,2))
else
write(unit,709) trim(RoundSigDigits(Surface(surf)%vertex(vert)%x,2)), &
trim(RoundSigDigits(Surface(surf)%vertex(vert)%y,2)), &
trim(RoundSigDigits(Surface(surf)%vertex(vert)%z,2))
endif
enddo
IF (Surface(surf)%Sides == 0) write(unit,711)
endif
enddo ! surfaces
enddo ! zones
700 format('! <Zone/Shading Surfaces>,<Zone Name>/#Shading Surfaces,# Surfaces')
701 format('! <HeatTransfer/Shading/Frame/Divider_Surface>,Surface Name,Surface Class,Base Surface,Heat Transfer Algorithm')
7011 format(',Construction/Transmittance Schedule,Nominal U (w/o film coefs)/Min Schedule Value,', &
'Nominal U (with film coefs)/Max Schedule Value,Solar Diffusing,', &
'Area (Net),Area (Gross),Area (Sunlit Calc),Azimuth,Tilt,~Width,~Height,Reveal,', &
'<ExtBoundCondition>,<ExtConvCoeffCalc>,<IntConvCoeffCalc>,<SunExposure>,<WindExposure>,', &
'ViewFactorToGround,ViewFactorToSky,ViewFactorToGround-IR,ViewFactorToSky-IR,#Sides')
7012 format(',#Sides')
702 format('! <Units>,,,,')
7021 format(',{W/m2-K}/{},{W/m2-K}/{},{},{m2},{m2},{m2},{deg},{deg},{m},{m},{m},,,,,,,,,,')
7022 format(',')
703 format(A,',',A,',',I5)
704 format(A,'_Surface,',A,',',A,',',A,',',A)
7041 format(',',A,',',A,',',A,',',A,',',A,',',A,',',A,',',A,',',A,',',2(A,','),A)
7042 format(',',A)
7044 format(',',A,',',A,',',A,',',A,',',A,',',A,',',A,',',A,',',A,',',2(A,','))
7045 format(',,,,,',A,',',A,',',A,',',A,',',A,',',A,',',A)
705 format(',',A)
706 format(4(',',A),',',A)
7061 format(',,,,,,,,,,',A)
707 format(',{Vertex 1},,,{Vertex 2},,,{Vertex 3},,,{Vertex 4},,,{etc}')
708 format(4(',X {m},Y {m},Z {m}'))
709 format(3(',',A))
710 format(', Vertices are shown starting at Upper-Left-Corner => Counter-Clockwise => World Coordinates')
711 format(1X)
RETURN
END SUBROUTINE DetailsForSurfaces