diff --git a/bifacial_radiance/data/gencumsky/gencumulativesky b/bifacial_radiance/data/gencumsky/gencumulativesky new file mode 100755 index 00000000..c5d07744 Binary files /dev/null and b/bifacial_radiance/data/gencumsky/gencumulativesky differ diff --git a/bifacial_radiance/data/module.json b/bifacial_radiance/data/module.json index 9d10643e..f75b3954 100644 --- a/bifacial_radiance/data/module.json +++ b/bifacial_radiance/data/module.json @@ -1,4 +1,22 @@ { + "PVmod": { + "bifi": 1, + "glass": false, + "modulefile": "objects/PVmod.rad", + "modulematerial": "black", + "numpanels": 1, + "offsetfromaxis": 0, + "scenex": 2.01, + "sceney": 1.0, + "scenez": 0.1, + "text": "! genbox black PVmod 2 1 0.02 | xform -t -1.0 -0.5 0 -a 1 -t 0 1.0 0", + "x": 2, + "xgap": 0.01, + "y": 1, + "ygap": 0.0, + "z": 0.02, + "zgap": 0.1 + }, "PrismSolar-Bi60": { "bifi": 1, "cellModule": { diff --git a/bifacial_radiance/main.py b/bifacial_radiance/main.py index 0f87c542..2e34c56a 100644 --- a/bifacial_radiance/main.py +++ b/bifacial_radiance/main.py @@ -2720,7 +2720,7 @@ def analysis1axis(self, trackerdict=None, singleindex=None, accuracy='low', customname=None, modWanted=None, rowWanted=None, sensorsy=9, sensorsx=1, modscanfront = None, modscanback = None, relative=False, - debug=False ): + debug=False, sensorsground=None): """ Loop through trackerdict and runs linescans for each scene and scan in there. @@ -2827,13 +2827,22 @@ def analysis1axis(self, trackerdict=None, singleindex=None, accuracy='low', try: # look for missing data analysis = AnalysisObj(octfile,name) name = '1axis_%s%s'%(index,customname,) - frontscanind, backscanind = analysis.moduleAnalysis(scene=scene, modWanted=m, - rowWanted=r, - sensorsy=sensorsy, - sensorsx=sensorsx, - modscanfront=modscanfront, modscanback=modscanback, - relative=relative, debug=debug) - analysis.analysis(octfile=octfile,name=name,frontscan=frontscanind,backscan=backscanind,accuracy=accuracy) + if sensorsground is not None: + frontscanind, backscanind, groundscanid = analysis.moduleAnalysis(scene=scene, modWanted=m, + rowWanted=r, + sensorsy=sensorsy, + sensorsx=sensorsx, + modscanfront=modscanfront, modscanback=modscanback, + relative=relative, debug=debug, sensorsground=sensorsground) + analysis.analysis(octfile=octfile,name=name,frontscan=groundscanid,backscan=backscanind,accuracy=accuracy) + else: + frontscanind, backscanind = analysis.moduleAnalysis(scene=scene, modWanted=m, + rowWanted=r, + sensorsy=sensorsy, + sensorsx=sensorsx, + modscanfront=modscanfront, modscanback=modscanback, + relative=relative, debug=debug) + analysis.analysis(octfile=octfile,name=name,frontscan=frontscanind,backscan=backscanind,accuracy=accuracy) Results['AnalysisObj']=analysis except Exception as e: # problem with file. TODO: only catch specific error types here. warnings.warn('Index: {}. Problem with file. Error: {}. Skipping'.format(index,e), Warning) @@ -4326,7 +4335,7 @@ def _irrPlot(self, octfile, linepts, mytitle=None, plotflag=None, return(out) - def _saveResults(self, data=None, reardata=None, savefile=None, RGB = False): + def _saveResults(self, data=None, reardata=None, savefile=None, RGB = False, savekey = None): """ Function to save output from _irrPlot If rearvals is passed in, back ratio is saved @@ -4355,6 +4364,9 @@ def _saveResults(self, data=None, reardata=None, savefile=None, RGB = False): data_sub = {key:data[key] for key in ['x', 'y', 'z', 'mattype', 'Wm2','r', 'g', 'b' ]} else: data_sub = {key:data[key] for key in ['x', 'y', 'z', 'mattype','Wm2' ]} + + if savekey is None: + savekey = '' df = pd.DataFrame(data_sub) df = df.rename(columns={'Wm2':'Wm2Front'}) @@ -4378,7 +4390,7 @@ def _saveResults(self, data=None, reardata=None, savefile=None, RGB = False): df = df.rename(columns={'Wm2Front':'Wm2Back','mattype':'rearMat'}) # set attributes of analysis to equal columns of df for col in df.columns: - setattr(self, col, list(df[col])) + setattr(self, savekey+col, list(df[col])) # only save a subset df = df.drop(columns=['rearX','rearY','backRatio'], errors='ignore') df.to_csv(os.path.join("results", savefile), sep = ',', @@ -4794,11 +4806,12 @@ def _checkSensors(sensors): groundsensorspacing = pitch / (sensorsground - 1) groundscan['xstart'] = x1 groundscan['ystart'] = y1 - groundscan['zstart'] = 0.05 # Set it 5 cm from the ground. - groundscan['xinc'] = groundsensorspacing * np.sin(azimuth) - groundscan['yinc'] = groundsensorspacing * (-1 * np.cos(azimuth)) + groundscan['zstart'] = 0.05 + groundscan['xinc'] = groundsensorspacing * np.sin((azimuth)*dtor) + groundscan['yinc'] = groundsensorspacing * np.cos((azimuth)*dtor) + groundscan['zinc'] = 0 + groundscan['Nx'] = 1 groundscan['Ny'] = sensorsground - groundscan['Nz'] = 0 groundscan['orient'] = '0 0 -1' return frontscan2, backscan2, groundscan @@ -5001,14 +5014,15 @@ def analysis(self, octfile, name, frontscan, backscan, linepts = self._linePtsMakeDict(backscan) backDict = self._irrPlot(octfile, linepts, name+'_Back', plotflag=plotflag, accuracy=accuracy) + # don't save if _irrPlot returns an empty file. if frontDict is not None: if len(frontDict['Wm2']) != len(backDict['Wm2']): self.Wm2Front = np.mean(frontDict['Wm2']) self.Wm2Back = np.mean(backDict['Wm2']) self.backRatio = self.Wm2Back / (self.Wm2Front + .001) - self._saveResults(frontDict, reardata=None, savefile='irr_%s.csv'%(name+'_Front'), RGB=RGB) - self._saveResults(data=None, reardata=backDict, savefile='irr_%s.csv'%(name+'_Back'), RGB=RGB) + self._saveResults(frontDict, reardata=None, savefile='irr_%s.csv'%(name+'_Front'), RGB=RGB, savekey = 'front') + self._saveResults(data=None, reardata=backDict, savefile='irr_%s.csv'%(name+'_Back'), RGB=RGB, savekey = 'back') else: self._saveResults(frontDict, backDict,'irr_%s.csv'%(name), RGB=RGB)