def improvedDCcalc(epwFile, materialFile, geometryFiles, pointsFile, folderForCalculations, outputIllFilePath, reinhartPatches=1, calcDict={ 'skyVectors': True, 'DirectDCCoeff': True, 'DCCoeff': True, 'DirectSun': True }): """ Args: epwFile: Epw file path. materialFile: Path for a single material file. geometryFiles: One or more geometry files. pointsFile: Path for poitns file folderForCalculations: Folder for storing intermediate files. outputIllFilePath: reinhartPatches: Default is 1. calcDict: This is useful for selectively running different parts of the simulation. Returns: """ #a sad logging hack statusMsg = lambda msg: "\n%s:%s\n%s\n" % (time.ctime(), msg, "*~" * 25) weaFilePath = os.path.join( folderForCalculations, os.path.splitext(os.path.split(epwFile)[1])[0] + '.wea') weaFile = Epw2wea(epwFile=epwFile, outputWeaFile=weaFilePath) weaFile.execute() #Calculate complete sky matrix. skyMatrix = os.path.join(folderForCalculations, 'skyMatrix.mtx') gendayParam = GendaymtxParameters() gendayParam.skyDensity = reinhartPatches genday = Gendaymtx(weaFile=weaFilePath, outputName=skyMatrix) genday.gendaymtxParameters = gendayParam if calcDict['skyVectors']: print(genday.toRadString()) genday.execute() #Calculate direct only matrix. skyMatrixDirect = os.path.join(folderForCalculations, 'skyMatrixDirect.mtx') gendayParam = GendaymtxParameters() gendayParam.skyDensity = reinhartPatches gendayParam.onlyDirect = True genday = Gendaymtx(weaFile=weaFilePath, outputName=skyMatrixDirect) genday.gendaymtxParameters = gendayParam if calcDict['skyVectors']: print(genday.toRadString()) genday.execute() skyDomeFile = os.path.join(folderForCalculations, 'rfluxSky.rad') dcCoeffMatrix = os.path.join(folderForCalculations, 'dc.mtx') dcCoeffMatrixDirect = os.path.join(folderForCalculations, 'dcDirect.mtx') sceneData = [materialFile] #Append if single, extend if multiple if isinstance(geometryFiles, basestring): sceneData.append(geometryFiles) elif isinstance(geometryFiles, (tuple, list)): sceneData.extend(geometryFiles) # Step2: Generate daylight coefficients for normal sky-matrix using rfluxmtx. rfluxPara = RfluxmtxParameters() rfluxPara.irradianceCalc = True rfluxPara.ambientAccuracy = 0.1 rfluxPara.ambientDivisions = 20000 rfluxPara.ambientBounces = 5 rfluxPara.limitWeight = 1E-7 rfluxPara.ambientResolution = 10000 rflux = Rfluxmtx() rflux.sender = '-' skyFile = rflux.defaultSkyGround(skyDomeFile, skyType='r%s' % reinhartPatches) rflux.receiverFile = skyDomeFile rflux.rfluxmtxParameters = rfluxPara rflux.radFiles = sceneData rflux.samplingRaysCount = 1 rflux.pointsFile = pointsFile rflux.outputMatrix = dcCoeffMatrix if calcDict['DCCoeff']: rflux.execute() tempIll = os.path.join(folderForCalculations, 'temp.ill') ill = os.path.join(folderForCalculations, 'Illuminance.ill') dct = Dctimestep() dct.daylightCoeffSpec = dcCoeffMatrix dct.skyVectorFile = skyMatrix dct.outputFile = tempIll if calcDict['DCCoeff']: dct.execute() mtx2Param = RmtxopParameters() mtx2Param.outputFormat = 'a' mtx2Param.combineValues = (47.4, 119.9, 11.6) mtx2Param.transposeMatrix = True mtx2 = Rmtxop(matrixFiles=[tempIll], outputFile=ill) mtx2.rmtxopParameters = mtx2Param if calcDict['DCCoeff']: mtx2.execute() # Step3: Generate direct daylight coefficients for normal sky-matrix using rfluxmtx. rfluxPara = RfluxmtxParameters() rfluxPara.irradianceCalc = True rfluxPara.ambientAccuracy = 0.01 rfluxPara.ambientDivisions = 20000 rfluxPara.ambientBounces = 1 rfluxPara.limitWeight = 1E-7 rfluxPara.ambientResolution = 10000 rflux = Rfluxmtx() rflux.sender = '-' skyFile = rflux.defaultSkyGround(skyDomeFile, skyType='r%s' % reinhartPatches) rflux.receiverFile = skyDomeFile rflux.rfluxmtxParameters = rfluxPara rflux.radFiles = sceneData rflux.samplingRaysCount = 1 rflux.pointsFile = pointsFile rflux.outputMatrix = dcCoeffMatrixDirect if calcDict['DirectDCCoeff']: rflux.execute() tempDirectIll = os.path.join(folderForCalculations, 'tempDirect.ill') illDirect = os.path.join(folderForCalculations, 'IlluminanceDirect.ill') dct = Dctimestep() dct.daylightCoeffSpec = dcCoeffMatrixDirect dct.skyVectorFile = skyMatrixDirect dct.outputFile = tempDirectIll if calcDict['DCCoeff']: dct.execute() mtx2Param = RmtxopParameters() mtx2Param.outputFormat = 'a' mtx2Param.combineValues = (47.4, 119.9, 11.6) mtx2Param.transposeMatrix = True mtx2 = Rmtxop(matrixFiles=[tempDirectIll], outputFile=illDirect) mtx2.rmtxopParameters = mtx2Param if calcDict['DirectDCCoeff']: mtx2.execute() solarDiscPath = os.path.join(folderForCalculations, 'solarDiscs.rad') sunListPath = os.path.join(folderForCalculations, 'sunList.txt') sunMatrixPath = os.path.join(folderForCalculations, 'sunMatrix.mtx') #Calculate direct only ill files. directSunIll = os.path.join(folderForCalculations, 'directSunIll.ill') if calcDict['DirectSun']: sunOnlyIll = calcDirectIlluminance( epwFile=epwFile, solarDiscPath=solarDiscPath, sunListPath=sunListPath, sunMatrixPath=sunMatrixPath, materialFile=materialFile, geometryFiles=geometryFiles, pointsFile=pointsFile, folderForCalculations=folderForCalculations, outputIllFilePath=directSunIll) #Instantiate matrices for subtraction and addition. finalMatrix = Rmtxop() #std. dc matrix. dcMatrix = RmtxopMatrix() dcMatrix.matrixFile = ill #direct dc matrix. -1 indicates that this one is being subtracted from dc matrix. dcDirectMatrix = RmtxopMatrix() dcDirectMatrix.matrixFile = illDirect dcDirectMatrix.scalarFactors = [-1] #Sun coefficient matrix. sunCoeffMatrix = RmtxopMatrix() sunCoeffMatrix.matrixFile = directSunIll #combine the matrices together. Sequence is extremely important finalMatrix.rmtxopMatrices = [dcMatrix, dcDirectMatrix, sunCoeffMatrix] finalMatrix.outputFile = outputIllFilePath #Done! finalMatrix.execute() return outputIllFilePath
def improvedDCcalc(epwFile, materialFile, geometryFiles, pointsFile, folderForCalculations, outputIllFilePath, glazingGeometry=None, reinhartPatches=1, ambBounces=5, ambDiv=5000, limitWt=0.0002, calcDict={ 'skyVectors': True, 'DirectDCCoeff': True, 'DCCoeff': True, 'DirectSun': True }, cleanUpTempFiles=True): """ Args: epwFile: Epw file path. materialFile: Path for a single material file. geometryFiles: One or more geometry files. pointsFile: Path for poitns file folderForCalculations: Folder for storing intermediate files. outputIllFilePath: reinhartPatches: Default is 1. calcDict: This is useful for selectively running different parts of the simulation. ambBounces: Ambient bounces. Defaults to 5 ambDiv: Ambient divisions. Defaults to 5000. limitWt: Limit weight. Defaults to 0.0002 cleanUpTempFiles: Delete all the temporary files that were created during the calculations. Returns: The path of the illuminance file generated through the calculations. """ # a sad logging hack statusMsg = lambda msg: "\n%s:%s\n%s\n" % (time.ctime(), msg, "*~" * 25) blackMaterial = "void plastic black 0 0 5 0 0 0 0 0" if limitWt > (1 / ambDiv): warnings.warn( "The value for limitWt(%s) should be set to a value equal to or " "less (%s) which is 1/ambDiv(%s)" % (limitWt, 1 / ambDiv, ambDiv)) # crate a tempfolder inside the folderForCalculations. tmpFolder = os.path.join(folderForCalculations, 'tmp') if not os.path.exists(tmpFolder): os.mkdir(tmpFolder) weaFilePath = os.path.join( tmpFolder, os.path.splitext(os.path.split(epwFile)[1])[0] + '.wea') weaFile = Epw2wea(epwFile=epwFile, outputWeaFile=weaFilePath) weaFile.execute() # Calculate complete sky matrix. skyMatrix = os.path.join(tmpFolder, 'skyMatrix.mtx') gendayParam = GendaymtxParameters() gendayParam.skyDensity = reinhartPatches genday = Gendaymtx(weaFile=weaFilePath, outputName=skyMatrix) genday.gendaymtxParameters = gendayParam if calcDict['skyVectors']: print(genday.toRadString()) genday.execute() # Calculate direct only matrix. skyMatrixDirect = os.path.join(tmpFolder, 'skyMatrixDirect.mtx') gendayParam = GendaymtxParameters() gendayParam.skyDensity = reinhartPatches gendayParam.onlyDirect = True genday = Gendaymtx(weaFile=weaFilePath, outputName=skyMatrixDirect) genday.gendaymtxParameters = gendayParam if calcDict['skyVectors']: print(genday.toRadString()) genday.execute() skyDomeFile = os.path.join(tmpFolder, 'rfluxSky.rad') dcCoeffMatrix = os.path.join(tmpFolder, 'dc.mtx') dcCoeffMatrixDirect = os.path.join(tmpFolder, 'dcDirect.mtx') blackMaterial = os.path.join(tmpFolder, 'black.mat') with open(blackMaterial, 'w') as blackMat: blackMat.write("void plastic black 0 0 5 0 0 0 0 0") sceneData = [materialFile] sceneDataBlack = [blackMaterial] geometryData = [] # Append if single, extend if multiple if isinstance(geometryFiles, basestring): geometryData.append(geometryFiles) elif isinstance(geometryFiles, (tuple, list)): geometryData.extend(geometryFiles) sceneData = sceneData + geometryData xfrPara = XformParameters() xfrPara.modReplace = 'black' # Note: Xform has this thing it only works well if the paths are absolute. blackGeometry = os.path.join(tmpFolder, 'blackGeometry.rad') xfr = Xform() xfr.xformParameters = xfrPara xfr.radFile = geometryData xfr.outputFile = blackGeometry xfr.execute() # Material file added in the end with the assumption that the material props for the # glazing are defined in the material file. As Radiance parses scene data in a # strictly linear fashion, even if the material for glazing is defined inside # the glazing geometry, it will still be fine. sceneDataBlack = sceneDataBlack + [blackGeometry] + [materialFile] if isinstance(glazingGeometry, basestring): sceneData.append(glazingGeometry) sceneDataBlack.append(glazingGeometry) elif isinstance(glazingGeometry, (tuple, list)): sceneData.extend(glazingGeometry) sceneDataBlack.extend(glazingGeometry) # Step2: Generate daylight coefficients for normal sky-matrix using rfluxmtx. rfluxPara = RfluxmtxParameters() rfluxPara.irradianceCalc = True rfluxPara.ambientDivisions = ambDiv rfluxPara.ambientBounces = ambBounces rfluxPara.limitWeight = limitWt rflux = Rfluxmtx() rflux.sender = '-' skyFile = rflux.defaultSkyGround(skyDomeFile, skyType='r%s' % reinhartPatches) rflux.receiverFile = skyDomeFile rflux.rfluxmtxParameters = rfluxPara rflux.radFiles = sceneData rflux.samplingRaysCount = 1 rflux.pointsFile = pointsFile rflux.outputMatrix = dcCoeffMatrix if calcDict['DCCoeff']: print(rflux.toRadString()) rflux.execute() tempIll = os.path.join(tmpFolder, 'temp.ill') ill = os.path.join(tmpFolder, 'Illuminance.ill') dct = Dctimestep() dct.daylightCoeffSpec = dcCoeffMatrix dct.skyVectorFile = skyMatrix dct.outputFile = tempIll if calcDict['DCCoeff']: print(dct.toRadString()) dct.execute() mtx2Param = RmtxopParameters() mtx2Param.outputFormat = 'a' mtx2Param.combineValues = (47.4, 119.9, 11.6) mtx2Param.transposeMatrix = True mtx2 = Rmtxop(matrixFiles=[tempIll], outputFile=ill) mtx2.rmtxopParameters = mtx2Param if calcDict['DCCoeff']: mtx2.execute() # Step3: Generate direct daylight coefficients for normal sky-matrix using rfluxmtx. rfluxPara = RfluxmtxParameters() rfluxPara.irradianceCalc = True rfluxPara.ambientDivisions = ambDiv rfluxPara.ambientBounces = 1 rfluxPara.limitWeight = limitWt rflux = Rfluxmtx() rflux.sender = '-' skyFile = rflux.defaultSkyGround(skyDomeFile, skyType='r%s' % reinhartPatches) rflux.receiverFile = skyDomeFile rflux.rfluxmtxParameters = rfluxPara rflux.radFiles = sceneDataBlack rflux.samplingRaysCount = 1 rflux.pointsFile = pointsFile rflux.outputMatrix = dcCoeffMatrixDirect if calcDict['DirectDCCoeff']: rflux.execute() tempDirectIll = os.path.join(tmpFolder, 'tempDirect.ill') illDirect = os.path.join(tmpFolder, 'IlluminanceDirect.ill') dct = Dctimestep() dct.daylightCoeffSpec = dcCoeffMatrixDirect dct.skyVectorFile = skyMatrixDirect dct.outputFile = tempDirectIll if calcDict['DCCoeff']: dct.execute() mtx2Param = RmtxopParameters() mtx2Param.outputFormat = 'a' mtx2Param.combineValues = (47.4, 119.9, 11.6) mtx2Param.transposeMatrix = True mtx2 = Rmtxop(matrixFiles=[tempDirectIll], outputFile=illDirect) mtx2.rmtxopParameters = mtx2Param if calcDict['DirectDCCoeff']: mtx2.execute() solarDiscPath = os.path.join(tmpFolder, 'solarDiscs.rad') sunListPath = os.path.join(tmpFolder, 'sunList.txt') sunMatrixPath = os.path.join(tmpFolder, 'sunMatrix.mtx') # Calculate direct only ill files. directSunIll = os.path.join(tmpFolder, 'directSunIll.ill') if calcDict['DirectSun']: calcDirectIlluminance(epwFile=epwFile, solarDiscPath=solarDiscPath, sunListPath=sunListPath, sunMatrixPath=sunMatrixPath, materialFile=blackMaterial, geometryFiles=sceneDataBlack, pointsFile=pointsFile, folderForCalculations=folderForCalculations, outputIllFilePath=directSunIll) # Instantiate matrices for subtraction and addition. finalMatrix = Rmtxop() # std. dc matrix. dcMatrix = RmtxopMatrix() dcMatrix.matrixFile = ill # direct dc matrix. -1 indicates that this one is being subtracted from dc matrix. dcDirectMatrix = RmtxopMatrix() dcDirectMatrix.matrixFile = illDirect dcDirectMatrix.scalarFactors = [-1] # Sun coefficient matrix. sunCoeffMatrix = RmtxopMatrix() sunCoeffMatrix.matrixFile = directSunIll # combine the matrices together. Sequence is extremely important finalMatrix.rmtxopMatrices = [dcMatrix, dcDirectMatrix, sunCoeffMatrix] finalMatrix.outputFile = outputIllFilePath # Done! finalMatrix.execute() return outputIllFilePath