From 1e9df25c0744cf3c4d031c440c8dbfd8dd81a735 Mon Sep 17 00:00:00 2001 From: "David P. Chassin" Date: Thu, 29 Jun 2023 07:50:29 -0700 Subject: [PATCH 01/34] Update version.h Signed-off-by: David P. Chassin --- source/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/version.h b/source/version.h index 27552ba76..863af9c9b 100644 --- a/source/version.h +++ b/source/version.h @@ -11,7 +11,7 @@ #define REV_MAJOR 4 #define REV_MINOR 3 -#define REV_PATCH 2 +#define REV_PATCH 3 #ifdef HAVE_CONFIG_H #include "config.h" From d9269db22f2156e5e8cf333bce393932f2b2342a Mon Sep 17 00:00:00 2001 From: "David P. Chassin" Date: Mon, 3 Jul 2023 11:15:57 -0700 Subject: [PATCH 02/34] Add support for accessing ISO New England hourly market data (#1307) Signed-off-by: David P. Chassin --- cloud/websites/docs.gridlabd.us/index.html | 18 +- tools/Makefile.mk | 1 + tools/autotest/.gitignore | 2 + tools/autotest/test_isone.glm | 21 ++ tools/autotest/test_isone_record.csv | 25 ++ tools/isone.py | 288 +++++++++++++++++++++ 6 files changed, 343 insertions(+), 12 deletions(-) create mode 100644 tools/autotest/.gitignore create mode 100644 tools/autotest/test_isone.glm create mode 100644 tools/autotest/test_isone_record.csv create mode 100644 tools/isone.py diff --git a/cloud/websites/docs.gridlabd.us/index.html b/cloud/websites/docs.gridlabd.us/index.html index 9ed34b289..fef43042b 100644 --- a/cloud/websites/docs.gridlabd.us/index.html +++ b/cloud/websites/docs.gridlabd.us/index.html @@ -1,15 +1,9 @@ - - - + + + + +Redirecting to http://docs.arras-energy.org/index.html?owner=arras-energy&project=gridlabd... + \ No newline at end of file diff --git a/tools/Makefile.mk b/tools/Makefile.mk index dfa7366d0..14b4ef87d 100644 --- a/tools/Makefile.mk +++ b/tools/Makefile.mk @@ -13,6 +13,7 @@ dist_pkgdata_DATA += tools/gridlabd-editor.png dist_pkgdata_DATA += tools/gridlabd-editor.py dist_pkgdata_DATA += tools/insights.py dist_pkgdata_DATA += tools/install.py +dist_pkgdata_DATA += tools/isone.py dist_pkgdata_DATA += tools/market_data.py dist_pkgdata_DATA += tools/mdb_info.py dist_pkgdata_DATA += tools/market_model.py diff --git a/tools/autotest/.gitignore b/tools/autotest/.gitignore new file mode 100644 index 000000000..312a30e9d --- /dev/null +++ b/tools/autotest/.gitignore @@ -0,0 +1,2 @@ +test_isone.csv +test_isone_opt.glm diff --git a/tools/autotest/test_isone.glm b/tools/autotest/test_isone.glm new file mode 100644 index 000000000..20fb36441 --- /dev/null +++ b/tools/autotest/test_isone.glm @@ -0,0 +1,21 @@ +#python -m isone -d=smd/ME -s=2020-03-01 -e=2020-03-01 -c=test_isone.csv -g=test_isone_opt.glm +module tape +{ + csv_header_type NAME; +} +#include "test_isone_opt.glm" +object recorder +{ + parent isone; + file "test_isone_record.csv"; + property "DA_Demand,RT_Demand,DA_LMP,DA_EC,DA_CC,DA_MLC,RT_LMP,RT_EC,RT_CC,RT_MLC,Dry_Bulb,Dew_Point"; + interval 1h; +} +clock { + timezone ${ISONE_TIMEZONE}; + starttime ${ISONE_STARTDATE}; + stoptime ${ISONE_STOPDATE}; +} +#ifexists "../test_isone_record.csv" +#on_exit 0 diff ../test_isone_record.csv test_isone_record.csv > gridlabd.diff +#endif diff --git a/tools/autotest/test_isone_record.csv b/tools/autotest/test_isone_record.csv new file mode 100644 index 000000000..414517050 --- /dev/null +++ b/tools/autotest/test_isone_record.csv @@ -0,0 +1,25 @@ +timestamp,DA_Demand,RT_Demand,DA_LMP,DA_EC,DA_CC,DA_MLC,RT_LMP,RT_EC,RT_CC,RT_MLC,Dry_Bulb,Dew_Point +2020-03-01 00:00:00 EST,+847,+1177.36,+20.28,+20.34,-0.17,+0.11,+16.21,+16.07,+0,+0.14,+19,+5 +2020-03-01 01:00:00 EST,+840.8,+1152.96,+19.16,+19.22,-0.15,+0.09,+16.33,+16.2,+0,+0.13,+18,+6 +2020-03-01 02:00:00 EST,+855.1,+1138.74,+17.52,+17.62,-0.13,+0.03,+15.64,+15.56,+0,+0.08,+18,+5 +2020-03-01 03:00:00 EST,+838.6,+1144.65,+17.73,+17.8,-0.14,+0.07,+15.21,+15.14,+0,+0.07,+18,+5 +2020-03-01 04:00:00 EST,+852.2,+1167.67,+18.3,+18.38,-0.13,+0.05,+15.26,+15.19,+0,+0.07,+17,+5 +2020-03-01 05:00:00 EST,+914.7,+1209.67,+19.12,+19.16,-0.13,+0.09,+13.21,+13.15,+0,+0.06,+17,+5 +2020-03-01 06:00:00 EST,+912.1,+1277.46,+18.72,+18.72,-0.07,+0.07,+16.09,+15.94,+0,+0.15,+17,+5 +2020-03-01 07:00:00 EST,+1017.2,+1337.71,+18.34,+18.11,-0.04,+0.27,+14.3,+14.1,+0,+0.2,+19,+6 +2020-03-01 08:00:00 EST,+1122,+1401.55,+17.95,+17.59,+0,+0.36,+13.48,+13.28,+0,+0.2,+23,+7 +2020-03-01 09:00:00 EST,+1027,+1411.46,+16.49,+16.31,-0.02,+0.2,+13.94,+13.74,+0,+0.2,+27,+8 +2020-03-01 10:00:00 EST,+999.9,+1438.49,+14.8,+14.83,+0,-0.03,+15.96,+15.78,+0,+0.18,+28,+6 +2020-03-01 11:00:00 EST,+956.6,+1425.79,+13.67,+13.79,-0.02,-0.1,+11.46,+11.35,+0,+0.11,+30,+7 +2020-03-01 12:00:00 EST,+902.7,+1398.41,+12.82,+13.08,-0.13,-0.13,+12.5,+12.41,+0,+0.09,+32,+8 +2020-03-01 13:00:00 EST,+896.3,+1370.73,+12.75,+13.02,-0.12,-0.15,+11.81,+11.75,+0,+0.06,+32,+7 +2020-03-01 14:00:00 EST,+883.2,+1348.15,+12.66,+12.97,-0.12,-0.19,+12.61,+12.56,+0,+0.05,+34,+7 +2020-03-01 15:00:00 EST,+1013.1,+1383.17,+13.49,+13.68,-0.12,-0.07,+14.08,+13.96,+0,+0.12,+35,+8 +2020-03-01 16:00:00 EST,+1117.8,+1460.34,+16.51,+16.48,-0.11,+0.14,+21.35,+21.15,+0,+0.2,+34,+7 +2020-03-01 17:00:00 EST,+1206.7,+1531.06,+19.58,+19.61,-0.13,+0.1,+21.93,+21.74,+0,+0.19,+32,+7 +2020-03-01 18:00:00 EST,+1239,+1563.54,+25.89,+25.92,-0.18,+0.15,+30.69,+30.34,+0,+0.35,+29,+8 +2020-03-01 19:00:00 EST,+1160,+1516.67,+20.82,+20.95,-0.18,+0.05,+24.05,+23.85,+0,+0.2,+27,+8 +2020-03-01 20:00:00 EST,+1120.6,+1467.12,+17.55,+17.75,-0.13,-0.07,+21.78,+21.63,+0,+0.15,+26,+8 +2020-03-01 21:00:00 EST,+984.8,+1361.46,+16.71,+16.87,-0.14,-0.02,+16.71,+16.57,+0,+0.14,+25,+8 +2020-03-01 22:00:00 EST,+942.1,+1264.5,+16.54,+16.69,-0.16,+0.01,+18.14,+17.99,+0,+0.15,+24,+8 +2020-03-01 23:00:00 EST,+872.2,+1218.99,+16.79,+16.94,-0.14,-0.01,+25.65,+25.27,+0,+0.38,+22,+8 diff --git a/tools/isone.py b/tools/isone.py new file mode 100644 index 000000000..f7b8b71a8 --- /dev/null +++ b/tools/isone.py @@ -0,0 +1,288 @@ +"""ISO New England data access module + +Syntax: gridlabd isone OPTIONS ... + +Options: + -d|--dataset=DATASET/SUBSET Download data from the specified dataset + (and subset, default is `smd/ISO NE CA`) + -c|--csv=FILENAME Save CSV data to the specified file + (default is /dev/stdout) + -C|--CLASS=CLASSNAME Specify the GLM class name (default is + `isone`) + -e|--end=YEAR|STOPDATE Download data ending on the specified year + or date (last month default) + -f|--freshen Freshen the data cache + -g|--glm=FILENAME Save GLM data to the specified file + (default is /dev/null) + -l|--list Output a list of available sheets in dataset + -N|--NAME=OBJECTNAME Specify the GLM object name (default is + `isone`) + -s|--start=YEAR|STARTDATE Download data starting on the specified + year or date (last month by default) + -y|--year[=YEAR] Download data for the specified year + (current year by default) + +Currently the only supported dataset is `smd`. The valid subsets depend on the +dataset and year. See https://www.iso-ne.com/isoexpress/web/reports/load-and-demand/-/tree/zone-info +for more information. +""" + +import sys, os +import datetime +import pandas +import requests +import traceback + +EXECNAME = os.path.splitext(os.path.basename(sys.argv[0]))[0] +DATASET = "smd" +CSVFILE = "/dev/stdout" +GLMFILE = None +CLASSNAME = "isone" +OBJNAME = "isone" +STARTDATE = None +STOPDATE = None +CACHEDIR = "/usr/local/opt/gridlabd/current/share/gridlabd/isone.d/" \ + if not "GLD_ETC" in os.environ else os.path.join(os.environ['GLD_ETC'],"isone") +DATEFORMAT = "%Y-%m-%d" +FLOATFORMAT = "%.2f" +FRESHEN = False +VERBOSE = False +QUIET = False +DEBUG = False + +E_OK = 0 +E_SYNTAX = 1 +E_INVALID = 2 +E_FAILED = 3 + +def error(msg,code=None): + if not QUIET: + print(f"ERROR [{EXECNAME}]: {msg}",flush=True,file=sys.stderr) + if not code is None: + exit(code) + +def verbose(msg): + if VERBOSE: + print(f"VERBOSE [{EXECNAME}]: {msg}",flush=True,file=sys.stderr) + +def get_year(year=None,dataset=None): + """Get data from a year + :param year: int - the starting date in DATEFORMAT + :return: pandas.DataFrame - the requested dataset + :return: list - list of available subsets (if dataset is None) + """ + if year == None: + year = datetime.datetime.now().year + verbose(f"setting to default year '{year}'") + assert(type(year)==int) + if dataset == None: + dataset = DATASET + verbose(f"setting to default dataset '{dataset}'") + specs = dataset.split("/") + cachefile = os.path.join(CACHEDIR,f"{specs[0]}_{year}.xlsx") + if FRESHEN or not os.path.exists(cachefile): + verbose(f"creating cache directory '{CACHEDIR}'") + os.makedirs(CACHEDIR,exist_ok=True) + try: + url = f"https://www.iso-ne.com/static-assets/documents/{year}/02/{year}_{specs[0]}_hourly.xlsx" + verbose(f"downloading data from '{url}'") + req = requests.get(url) + if req.status_code == 200: + verbose(f"saving data to '{cachefile}'") + with open(cachefile,"wb") as xls: + xls.write(req.content) + else: + error(f"unable to download data from '{url}' (HTTP code {req.status_code})",E_FAILED) + except Exception as err: + error(f"unable to get data from '{url}' ({err})",E_FAILED) + if len(specs) > 1: + verbose(f"loading '{specs[1]}' from '{cachefile}'") + return pandas.read_excel(cachefile,sheet_name=specs[1],index_col=[0,1],parse_dates=[0]) + else: + verbose(f"loading data from '{cachefile}'") + return pandas.read_excel(cachefile,sheet_name=None) + +def get_data(startdate=None,stopdate=None,dataset=None): + """Get data from a date range + :param startdate: str - the starting date in DATEFORMAT + :param stopdate: str - the stopping date in DATEFORMAT + :param dataset: str - the dataset/subset specification + :return: pandas.DataFrame - the requested data + """ + if startdate == None: + startdate = datetime.datetime(year=datetime.datetime.now().year) + else: + startdate = datetime.datetime.strptime(startdate,DATEFORMAT) + if startdate == None: + stopdate = datetime.datetime.now() + else: + stopdate = datetime.datetime.strptime(stopdate,DATEFORMAT) + if startdate > stopdate: + error("startdate is after stopdate",E_INVALID) + data = [] + for year in range(startdate.year,stopdate.year+1): + data.append(get_year(year,dataset)) + data = pandas.concat(data) + maxdate = min(data.index.get_level_values(0).max(),stopdate) + return data.loc[pandas.date_range(startdate,maxdate)] + +def fix_timestamps(df): + """Fix timestamp in dataframe + :param data: pandas.DataFrame - data to fix + :return: pandas.DataFrame - fixed data + """ + df['timestamp'] = [x[0] + datetime.timedelta(hours = int(x[1])-1) for x in list(df.index)] + return df.set_index('timestamp') + +if __name__ == "__main__": + if len(sys.argv) == 1: + for line in __doc__.split("\n"): + if line.startswith("Syntax: "): + print(line,file=sys.stderr) + exit(E_SYNTAX) + elif sys.argv[1] in ["-h","--help","help"]: + print(__doc__) + exit(E_OK) + for arg in sys.argv[1:]: + spec = arg.split("=") + if len(spec) == 1: + token = arg + value = None + elif len(spec) == 2: + token = spec[0] + value = spec[1] + else: + token = spec[0] + value = "=".join(spec[1:]) + + if token in ["-v","--verbose"]: + VERBOSE = True + elif token in ["-q","--quiet"]: + QUIET = True + elif token in ["--debug"]: + DEBUG = True + + # -d|--dataset=DATASET/SUBSET Download data from the specified dataset + # (and subset, default is `smd/ISO NE CA`) + elif token in ["-d","--dataset"]: + if value: + DATASET = value + else: + error("dataset not specified",E_SYNTAX) + + # -c|--csv=FILENAME Save CSV data to the specified file + # (default is /dev/stdout) + elif token in ["-c","--csv"]: + if value: + CSVFILE = value + else: + error("csvfile not specified",E_SYNTAX) + + # -C|--CLASS=CLASSNAME Specify the GLM class name (default is + # `isone`) + elif token in ["-C","--CLASS"]: + if value: + CLASSNAME = value + else: + error("class name not specified",E_SYNTAX) + + # -e|--end=YEAR|STOPDATE Download data ending on the specified year + # or date (last month default) + elif token in ["-e","--end"]: + if value: + try: + STOPDATE = int(value) + except: + STOPDATE = value + + # -f|--freshen Freshen the data cache + elif token in ["-f","--freshen"]: + FRESHEN = True + + # -g|--glm=FILENAME save GLM data to the specified file + # (default is /dev/null) + elif token in ["-g","--glm"]: + if value: + GLMFILE = value + else: + error("GLM name not specified",E_SYNTAX) + + # -l|--list output a list of available datasets + elif token in ["-l","--list"]: + print("\n".join(get_year(value)),file=sys.stdout) + exit(E_OK) + + # -N|--NAME=OBJECTNAME specify the GLM object name (default is + # `isone`) + elif token in ["-N","--NAME"]: + if value: + OBJNAME = value + else: + error("object name not specified",E_SYNTAX) + + # -s|--start=YEAR|STARTDATE download data starting on the specified + # year or date (last month by default) + elif token in ["-s","--start"]: + if value: + try: + STARTDATE = str(int(value)) + except: + STARTDATE = value + + # -y|--year[=YEAR] download data for the specified year + # (current year by default) + elif token in ["-y","--year"]: + if value: + try: + STARTDATE = value + "-01-01" + STOPDATE = value + "-12-31" + except: + error(f"year '{value}' is invalid",E_INVALID) + else: + error("year not specified",E_SYNTAX) + + # invalid argument + else: + error(f"argument '{arg}' is not recognized",E_SYNTAX) + + try: + data = get_data(STARTDATE,STOPDATE) + + if GLMFILE: + if CSVFILE.startswith("/dev/"): + error(f"CSV file '{CSVFILE}' must be a regular file",E_INVALID) + + # classinfo = CLASSNAME.split(".") + + properties = "\n ".join([f'double {x};' for x in data.columns]) + with open(GLMFILE,"w") as glm: + glm.write(f"""// created by '{' '.join(sys.argv)}' at {datetime.datetime.now()} +class {CLASSNAME} +{{ + {properties} +}} +module tape; +object {CLASSNAME} +{{ + name {OBJNAME}; + object player + {{ + file "{CSVFILE}"; + property "{','.join(data.columns)}"; + }}; +}} +#define ISONE_TIMEZONE=EST+5EDT +#define ISONE_STARTDATE={data.index.get_level_values(0).min()} +#define ISONE_STOPDATE={data.index.get_level_values(0).max()+datetime.timedelta(days=1)} +""") + + fix_timestamps(data).to_csv(CSVFILE,float_format=FLOATFORMAT,header=(GLMFILE is None)) + + exit(E_OK) + except SystemExit as err: + exit(err.code) + except: + e_type,e_value,e_trace = sys.exc_info() + if DEBUG: + traceback.print_tb(e_trace) + error(f"{e_value} ({e_type.__name__} exception)",E_FAILED) From ac8685f47b026a245c0c5f4ec684ed3229072df4 Mon Sep 17 00:00:00 2001 From: "David P. Chassin" Date: Sun, 9 Jul 2023 09:48:51 -0500 Subject: [PATCH 03/34] Add wheel install (#1310) * Update Makefile.mk * Update Python.md --- docs/Module/Python.md | 10 +++++++++- python/Makefile.mk | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/Module/Python.md b/docs/Module/Python.md index 29ba8c2c1..68ddba0dd 100644 --- a/docs/Module/Python.md +++ b/docs/Module/Python.md @@ -2,7 +2,14 @@ # Synopsis -Python 3.6 or greater: +Installation: +~~~ +python3.10 -m venv myenv +. myenv/bin/activate +python3 -m pip install $(gridlabd --version=install)/share/gridlabd/*.whl +~~~ + +Python 3.10: ~~~ >>> import gridlabd >>> gridlabd.title() @@ -256,6 +263,7 @@ Saves the full model to the file. The currently supported formats are `.glm`, ` The following model is `test.glm`: ~~~ module test; + #set suppress_repeat_messages=FALSE clock { starttime '2018-01-01 00:00:00'; stoptime '2018-01-01 01:00:00'; diff --git a/python/Makefile.mk b/python/Makefile.mk index b4dbcd9d9..df8b86006 100644 --- a/python/Makefile.mk +++ b/python/Makefile.mk @@ -12,6 +12,8 @@ $(PYPKG)-$(PYTHONVERSION).tar.gz: $(top_srcdir)/python/dist/gridlabd-$(PYTHONVER @cp $(top_srcdir)/python/dist/gridlabd-$(PYTHONVERSION)*.{tar.gz,whl} $(PYENV)/lib/python$(PYVER)/site-packages python-install: $(PYPKG)-$(PYTHONVERSION).dist-info + @mkdir -p $(datadir)/$(PACKAGE)/ + @cp $(PYPKG)-$(PYTHONVERSION)-*.whl $(datadir)/$(PACKAGE)/ $(PYPKG)-$(PYTHONVERSION).dist-info: $(PYPKG)-$(PYTHONVERSION).tar.gz @echo "installing gridlabd-$(PYTHONVERSION)..." From 88fe6ce96cb2e91628027621c2e5f56589c72ddd Mon Sep 17 00:00:00 2001 From: "David P. Chassin" Date: Mon, 10 Jul 2023 16:25:19 -0500 Subject: [PATCH 04/34] Add shell subcommand (#1312) * Add shell subcommand * Update Python.md * Update Shell.md * Update Shell.md * Update Python.md * Update Shell.md * Add support for shell options --- docs/Module/Python.md | 15 +++++++----- docs/Subcommand/Shell.md | 51 ++++++++++++++++++++++++++++++++++++++++ source/gridlabd.in | 7 +++++- source/gridlabd.m4sh | 10 ++++++-- 4 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 docs/Subcommand/Shell.md diff --git a/docs/Module/Python.md b/docs/Module/Python.md index 68ddba0dd..689b61886 100644 --- a/docs/Module/Python.md +++ b/docs/Module/Python.md @@ -2,14 +2,15 @@ # Synopsis -Installation: +GridLAB-D Python venv: ~~~ -python3.10 -m venv myenv +gridlabd shell +python$PYTHON_VER -m venv myenv . myenv/bin/activate -python3 -m pip install $(gridlabd --version=install)/share/gridlabd/*.whl +python3 -m pip install $GLD_ETC/*.whl ~~~ -Python 3.10: +Python 3: ~~~ >>> import gridlabd >>> gridlabd.title() @@ -316,7 +317,7 @@ bash$ python3 2018-01-01 00:50:00 UTC,0.251099 2018-01-01 00:55:00 UTC,2.778129 2018-01-01 01:00:00 UTC,0.603100 - 4362511024 + 0 >>> quit() ~~~ The following example records all house temperature when the model commit if performed: @@ -399,4 +400,6 @@ The first few lines of output are in `house.csv`: # See also -* [[/Python subcommand]] +* [[/Module/Python]] +* [[/Subcommand/Shell]] + diff --git a/docs/Subcommand/Shell.md b/docs/Subcommand/Shell.md new file mode 100644 index 000000000..753c05f0a --- /dev/null +++ b/docs/Subcommand/Shell.md @@ -0,0 +1,51 @@ +[[/Subcommand/Shell]] -- Open GridLAB-D shell environment + +# Synopsis + +Shell: + +~~~ +sh$ gridlabd shell [OPTIONS ...] +~~~ + +# Description + +The `shell` subcommand opens a shell in the GridLAB-D environment. The shell used is the one currently running as specified by the `SHELL` environment variable. This can be used to run Python with the active python `venv` used for GridLAB-D, or to create a new Python virtual environment in which gridlabd can be run. The options are the same as for the shell current being used. + +The following environment variables are set in the shell environment: + +- `CCFLAGS`: C-compiler flags +- `CFLAGS`: C-compiler flags +- `CPPFLAGS`: C++ compiler flags +- `CXXFLAGS`: C++ compiler flags +- `GLD_BIN`: binary folder +- `GLD_ETC`: shared files folder +- `GLD_INC`: include files folder +- `GLD_LIB`: library folder +- `GLD_VER`: version folder +- `GLPATH`: GridLAB-D file search path +- `INCLUDE`: C-compiler include flags +- `LDFLAGS`: linker flags +- `LIB`: linker library path +- `PYCCFLAGS`: python C-compiler flags +- `PYLDFLAGS`: Python linker flags +- `PYTHON_CONFIG` python config executable name +- `PYTHON_VER`: python version number (major.minor) +- `PYTHONPATH`: Python search path +- `VIRTUAL_ENV`: Python virtual environment path +- `VIRTUAL_ENV_PROMPT`: Python virtual environment prompt + +# Example + +The following commands open a GridLAB-D shell environment and create a Python virtual environment in which GridLAB-D is installed + +~~~ +gridlabd shell +python$PYTHON_VER -m venv myenv +. myenv/bin/activate +python3 -m pip install $GLD_ETC/*.whl +~~~ + +# See also + +* [[/Subcommand/Python]] diff --git a/source/gridlabd.in b/source/gridlabd.in index 18cfecd59..2208869f3 100644 --- a/source/gridlabd.in +++ b/source/gridlabd.in @@ -265,7 +265,7 @@ as_nop=as_fn_nop ## -------------------- ## -REALPATH=$(python3 -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' $0); +REALPATH=$(python3 -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' $0); export GLD_BIN=$(dirname $REALPATH) PREFIX=$(dirname $GLD_BIN) export GLD_ETC=$PREFIX/share/gridlabd @@ -390,6 +390,11 @@ then : . ${GLD_ETC}/gridlabd.rc fi +if test x$1 = xshell +then : + shift 1; $SHELL $@; exit $? +fi + if test -f "${GLD_ETC}/$1.py" then : export PYTHONPATH=$GLD_ETC; python3 -m "$@" ; exit $? diff --git a/source/gridlabd.m4sh b/source/gridlabd.m4sh index ccc737a6b..167b23717 100644 --- a/source/gridlabd.m4sh +++ b/source/gridlabd.m4sh @@ -1,7 +1,7 @@ dnl run "autom4te -l m4sh gridlabd.m4sh > gridlabd.in" AS_INIT -REALPATH=$(python3 -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' $0); +REALPATH=$(python3 -c 'import os, sys; print(os.path.realpath(sys.argv[[1]]))' $0); export GLD_BIN=$(dirname $REALPATH) PREFIX=$(dirname $GLD_BIN) export GLD_ETC=$PREFIX/share/gridlabd @@ -78,10 +78,12 @@ fi ############################################################################### # Python Configuration Data and Flags ############################################################################### +PY_OS="$(uname -s)" + . $GLD_BIN/activate export PYTHON_VER=$(python3 --version | cut -f2 -d' ' | cut -f1-2 -d.) -export PYTHON_CONFIG="$GLD_BIN/activate/python$PYTHON_VER-config" +export PYTHON_CONFIG="python$PYTHON_VER-config" export PYCCFLAGS="$($PYTHON_CONFIG --cflags)" export INCLUDE="-I$GLD_ETC -I$GLD_VER/include -I/usr/include" export CFLAGS="${INCLUDE} ${PYCCFLAGS} ${CFLAGS}" @@ -120,6 +122,10 @@ AS_IF([test -f "${GLD_ETC}/gridlabd.rc"], [. ${GLD_ETC}/gridlabd.rc], []) +AS_IF([test x$1 = xshell], + [shift 1; $SHELL $@; exit $?], + []) + AS_IF([test -f "${GLD_ETC}/$1.py"], [export PYTHONPATH=$GLD_ETC; python3 -m "$@" ; exit $?], []) From c7dcf6f08e4c43e160653f629d0280b8fa76d9ce Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Wed, 12 Jul 2023 08:10:14 -0700 Subject: [PATCH 05/34] Update Pole.md Signed-off-by: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> --- docs/Module/Powerflow/Pole.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/Module/Powerflow/Pole.md b/docs/Module/Powerflow/Pole.md index b4b808fb0..9e854b57e 100644 --- a/docs/Module/Powerflow/Pole.md +++ b/docs/Module/Powerflow/Pole.md @@ -95,7 +95,7 @@ Year the pole was installed. double repair_time[h]; ~~~ -Time required to repair or replace the pole after failure. +Time required to repair or replace the pole after failure. Includes time to identify the failure and reach the site. ### `wind_speed` @@ -162,7 +162,7 @@ Constant c of the pole stress polynomial function. double susceptibility[pu*s/m]; ~~~ -Susceptibility of pole to wind stress (derivative of pole stress w.r.t wind speed). +Susceptibility of pole to wind stress (derivative of pole stress with respect to wind speed). ### `total_moment` @@ -184,7 +184,7 @@ The total moment on the pole. double pole_moment[ft*lb]; ~~~ -The moment of the pole. +The moment of the pole. ### `pole_moment_nowind` @@ -192,7 +192,7 @@ The moment of the pole. double pole_moment_nowind[ft*lb]; ~~~ -The moment of the pole without wind. +The moment of the pole without wind, due to its weight and tilt. ### `equipment_moment` From ae165db4ec7bd143e4ad1b38079cd0e9c2560532 Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Wed, 12 Jul 2023 08:38:08 -0700 Subject: [PATCH 06/34] Increased the level of detail used to descibe the pole attributes Signed-off-by: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> --- docs/Module/Powerflow/Pole.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/Module/Powerflow/Pole.md b/docs/Module/Powerflow/Pole.md index 9e854b57e..86bfaab8e 100644 --- a/docs/Module/Powerflow/Pole.md +++ b/docs/Module/Powerflow/Pole.md @@ -130,7 +130,7 @@ The wind gusts at the location of the pole. This is automatically set is the double pole_stress[pu]; ~~~ -Ratio of actual stress to critical stress. +Ratio of actual stress to critical stress. When this reaches 1.0 or higher, the pole failes. ### `pole_stress_polynomial_a` @@ -170,7 +170,7 @@ Susceptibility of pole to wind stress (derivative of pole stress with respect to double total_moment[ft*lb]; ~~~ -The total moment on the pole. +The total moment on the pole. Calculated by summing each (vector) moment considered. ### `resisting_moment` @@ -178,6 +178,8 @@ The total moment on the pole. double resisting_moment[ft*lb]; ~~~ +Maximum moment the pole can withstand before snapping. This is calculated based on the fiber strength of the wood species and the pole diameter where it is supported - either at ground line or where guy wire(s) are attached. + ### `pole_moment` ~~~ From 473a00c339c045f1fd247ed69bc01e55e1b0c700 Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Wed, 12 Jul 2023 13:32:27 -0700 Subject: [PATCH 07/34] Create reading-the-code.md Signed-off-by: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> --- docs/Developer/reading-the-code.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 docs/Developer/reading-the-code.md diff --git a/docs/Developer/reading-the-code.md b/docs/Developer/reading-the-code.md new file mode 100644 index 000000000..072f26f20 --- /dev/null +++ b/docs/Developer/reading-the-code.md @@ -0,0 +1,3 @@ +# C++ code files + +Variables whose names start with 'PT_' are pointers. From 2853541d4d17bb6447c76d2b5459533cfc631a60 Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Wed, 12 Jul 2023 13:59:46 -0700 Subject: [PATCH 08/34] minor grammer edit Signed-off-by: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> --- docs/User manual/2 - Designing GridLAB-D Models/2 - Modules.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/User manual/2 - Designing GridLAB-D Models/2 - Modules.md b/docs/User manual/2 - Designing GridLAB-D Models/2 - Modules.md index dee009e0d..fa8098f06 100644 --- a/docs/User manual/2 - Designing GridLAB-D Models/2 - Modules.md +++ b/docs/User manual/2 - Designing GridLAB-D Models/2 - Modules.md @@ -31,7 +31,7 @@ In addition, modules generally should be able to implement the following It turns out that implementing these capabilities is not as easy as it at first seems. In particular, the synchronization has typically been one of the most challenging concepts for programmers to understand. Given -the amount of time spend in sync calls, it is recommended that +the amount of time spent in sync calls, it is recommended that considerable time and effort be put into its design. = Basic Synchronization = From 30ed0f1add13592fcbb823ebcc6459d9b9fb0f9f Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Wed, 12 Jul 2023 14:21:35 -0700 Subject: [PATCH 09/34] Added link for one of the See Also resources Signed-off-by: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> --- docs/Module/Powerflow/Pole.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Module/Powerflow/Pole.md b/docs/Module/Powerflow/Pole.md index 86bfaab8e..2c70345e2 100644 --- a/docs/Module/Powerflow/Pole.md +++ b/docs/Module/Powerflow/Pole.md @@ -254,6 +254,6 @@ The pole reaches end of life status based on a degradation rate that is defined # See also -* [[/Module/Powerflow/Pole_configuration]] +* [[/Module/Powerflow/Pole_configuration]](https://github.com/arras-energy/gridlabd/blob/master/docs/Module/Powerflow/Pole_configuration.md) * [Pole Loading Model](https://source.gridlabd.us/raw/master/module/powerflow/docs/pole_loading.pdf) * [Pole Degradation Model](https://www.sciencedirect.com/science/article/pii/S0167473005000457) From 69f9e15de8a77f070b3b7e406608f0839c9d2791 Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Wed, 12 Jul 2023 14:45:03 -0700 Subject: [PATCH 10/34] Update Pole.md Signed-off-by: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> --- docs/Module/Powerflow/Pole.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Module/Powerflow/Pole.md b/docs/Module/Powerflow/Pole.md index 2c70345e2..01ed2f01d 100644 --- a/docs/Module/Powerflow/Pole.md +++ b/docs/Module/Powerflow/Pole.md @@ -250,7 +250,7 @@ Guy wire attachment height. The pole failure model is described in [Pole Loading Model](https://source.gridlabd.us/raw/master/module/powerflow/docs/pole_loading.pdf). -The pole reaches end of life status based on a degradation rate that is defined by minimum shell thickness of 2". See [Pole Degradation Model](https://www.sciencedirect.com/science/article/pii/S0167473005000457) details. +[Out of date, change this:] The pole reaches end of life status based on a degradation rate that is defined by minimum shell thickness of 2". See [Pole Degradation Model](https://www.sciencedirect.com/science/article/pii/S0167473005000457) details. # See also From 9bd7a558789a83536d3e50c2bb31c4cf8166dcb3 Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Wed, 12 Jul 2023 15:08:37 -0700 Subject: [PATCH 11/34] Update Pole.md Signed-off-by: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> --- docs/Module/Powerflow/Pole.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Module/Powerflow/Pole.md b/docs/Module/Powerflow/Pole.md index 01ed2f01d..cc812d8c5 100644 --- a/docs/Module/Powerflow/Pole.md +++ b/docs/Module/Powerflow/Pole.md @@ -170,7 +170,7 @@ Susceptibility of pole to wind stress (derivative of pole stress with respect to double total_moment[ft*lb]; ~~~ -The total moment on the pole. Calculated by summing each (vector) moment considered. +The total moment on the pole. A vector sum of each moment considered. ### `resisting_moment` From 8a924ed2f37f9895c8c232433ff92a05551ddfc0 Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Thu, 13 Jul 2023 11:34:26 -0700 Subject: [PATCH 12/34] Update pole.cpp Signed-off-by: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> --- module/powerflow/pole.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/powerflow/pole.cpp b/module/powerflow/pole.cpp index a55eae17b..08cf69d02 100644 --- a/module/powerflow/pole.cpp +++ b/module/powerflow/pole.cpp @@ -57,7 +57,7 @@ pole::pole(MODULE *mod) oclass->trl = TRL_PROTOTYPE; if ( gl_publish_variable(oclass, - PT_enumeration, "status", get_pole_status_offset(), + PT_enumeration, "status", get_pole_status_offset(), PT_KEYWORD, "OK", (enumeration)PS_OK, PT_KEYWORD, "FAILED", (enumeration)PS_FAILED, PT_DEFAULT, "OK", From 7c351ad336097404042ce71cf6934ec1001672d1 Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Thu, 13 Jul 2023 11:42:14 -0700 Subject: [PATCH 13/34] Added an indication of what's required Signed-off-by: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> --- docs/Module/Powerflow/Pole.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/Module/Powerflow/Pole.md b/docs/Module/Powerflow/Pole.md index cc812d8c5..d3468501f 100644 --- a/docs/Module/Powerflow/Pole.md +++ b/docs/Module/Powerflow/Pole.md @@ -9,8 +9,8 @@ object pole tilt_angle "0 deg"; tilt_direction 0 deg"; weather ""; - configuration ""; - install_year "1970"; + configuration ""; * + install_year "1970"; * repair_time "24 h"; wind_speed 0.0 m/s; wind_direction 0.0 deg; @@ -33,6 +33,9 @@ object pole } ~~~ +\* Starred attributes are required. + + # Description The pole object models poles in powerflow network. The current pole object models pole failure by overstress at the base the pole from wind pressure on the equipment, wire, and tilt. The model does not model failures from ice loading on the lines or from foundation failure. From 5124250d6056c8c9ac5be4fb2b803e40cd256955 Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Thu, 13 Jul 2023 14:45:36 -0700 Subject: [PATCH 14/34] Made the verbage more consistent for the definition of pole_stress Signed-off-by: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> --- docs/Module/Powerflow/Pole.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Module/Powerflow/Pole.md b/docs/Module/Powerflow/Pole.md index d3468501f..d486e9506 100644 --- a/docs/Module/Powerflow/Pole.md +++ b/docs/Module/Powerflow/Pole.md @@ -133,7 +133,7 @@ The wind gusts at the location of the pole. This is automatically set is the double pole_stress[pu]; ~~~ -Ratio of actual stress to critical stress. When this reaches 1.0 or higher, the pole failes. +Ratio of actual (applied) moment to resisting moment (highest the pole can handle). When this reaches 1.0 or higher, the pole failes. ### `pole_stress_polynomial_a` From 35170ad1a3c33aa5cfe1fcc972e0dd2f2db8d2a6 Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Fri, 14 Jul 2023 11:11:15 -0700 Subject: [PATCH 15/34] Added more descriptive comments Signed-off-by: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> --- module/powerflow/pole.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/module/powerflow/pole.cpp b/module/powerflow/pole.cpp index 08cf69d02..bcf8fad48 100644 --- a/module/powerflow/pole.cpp +++ b/module/powerflow/pole.cpp @@ -341,18 +341,21 @@ int pole::init(OBJECT *parent) verbose("tilt_direction = %g deg",tilt_direction); // effective pole height + // height above the ground minus guy wire height (how far it extends without support, a.k.a. from where it would snap) height = config->pole_length - config->pole_depth - guy_height; verbose("height = %g ft",height); // calculation resisting moment + // diameter at effective pole height, using linear interpolation from pole top diameter and ground diameter + // diameter = top diameter + height difference from top * (change in diameter / change in height) double diameter = config->top_diameter - + height/(config->pole_length - config->pole_depth) - *(config->ground_diameter-config->top_diameter); + + height*(config->ground_diameter-config->top_diameter) + /(config->pole_length - config->pole_depth); resisting_moment = 0.008186 - * config->strength_factor_250b_wood - * config->fiber_strength - * ( diameter * diameter * diameter); + * config->strength_factor_250b_wood // decreases the rated material strength by a safety factor to account for uncertainty. + * config->fiber_strength // max stress that can be applied at a point in the material (psi) + * ( diameter * diameter * diameter); // diameter cubed verbose("resisting_moment = %.0f ft*lb (not aged)",resisting_moment); // pole moment per unit of wind pressure From 57b0205c393a78dd0e61c7bc29b1058c7ea89020 Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Sun, 16 Jul 2023 10:25:00 -0700 Subject: [PATCH 16/34] Update pole.cpp Signed-off-by: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> --- module/powerflow/pole.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/powerflow/pole.cpp b/module/powerflow/pole.cpp index bcf8fad48..fff0c07fc 100644 --- a/module/powerflow/pole.cpp +++ b/module/powerflow/pole.cpp @@ -523,7 +523,7 @@ TIMESTAMP pole::postsync(TIMESTAMP t0) //// double effective_moment = resisting_moment * (1+config->wind_overdesign); double wind_pressure_failure = sqrt( effective_moment*effective_moment - (wire_weight+equipment_weight+pole_moment)*(wire_weight+equipment_weight+pole_moment)) - / (pole_moment_nowind+equipment_moment_nowind+wire_moment_nowind); // ignore wiree_tension + / (pole_moment_nowind+equipment_moment_nowind+wire_moment_nowind); // ignore wire_tension critical_wind_speed = sqrt(wind_pressure_failure / (0.00256 * 2.24 * 2.24)); verbose("wind_pressure_failure = %g psf (overdesighn facter = %g)",wind_pressure_failure,config->wind_overdesign); // unit: pounds per square foot verbose("critical_wind_speed = %g m/s",critical_wind_speed); From 8dfb1c82b53f0ca12caee090e2cae71a9d3fa352 Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Sun, 16 Jul 2023 10:27:56 -0700 Subject: [PATCH 17/34] Added a question of mine in the comments Signed-off-by: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> --- module/powerflow/pole.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/powerflow/pole.cpp b/module/powerflow/pole.cpp index fff0c07fc..baefb566d 100644 --- a/module/powerflow/pole.cpp +++ b/module/powerflow/pole.cpp @@ -151,7 +151,7 @@ pole::pole(MODULE *mod) PT_OUTPUT, PT_DESCRIPTION, "wire moment due to conductor weight", - PT_double, "wire_moment_x[ft*lb]", get_wire_moment_x_offset(), + PT_double, "wire_moment_x[ft*lb]", get_wire_moment_x_offset(), // when I search for this, I get no results. What does it do? where is it defined? I want to add the ice loading in the same place as where the wire moment is being calculated in the absence of ice loading. Also why the word "offset"? PT_OUTPUT, PT_DESCRIPTION, "wire moment in x-axis due to tension and wind load", From c3b072571ab5c3aaf4ba4118735f8c771aa45201 Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Fri, 21 Jul 2023 13:49:57 -0700 Subject: [PATCH 18/34] Improved documentation and readability Added to documentation and inline comments. Renamed a couple variables from alpha and beta to pole_tilt and pole_tilt_dir for readability. Added code to make temperature data availible in pole.cpp --- docs/Developer/reading-the-code.md | 13 +++++++- docs/Module/Powerflow/Pole_mount.md | 10 +++++++ module/powerflow/pole.cpp | 46 ++++++++++++++++++++++------- module/powerflow/pole.h | 1 + module/powerflow/pole_mount.cpp | 39 +++++++++++++----------- source/gridlabd.h | 9 ++++++ source/object.h | 2 ++ 7 files changed, 91 insertions(+), 29 deletions(-) diff --git a/docs/Developer/reading-the-code.md b/docs/Developer/reading-the-code.md index 072f26f20..85b60dd2f 100644 --- a/docs/Developer/reading-the-code.md +++ b/docs/Developer/reading-the-code.md @@ -1,3 +1,14 @@ # C++ code files -Variables whose names start with 'PT_' are pointers. +The 'PT_' preffix for variable names means "Property Type". + +oclass means object class +pclass means parent class + +## get__offset() +These functions return offsets in memory location. Every object attribute is listed sequentially in memory (I believe in the order that they are declared?). This function returns the difference in the memory address of an attribute from the start of the object in memory. It's defined by a macro, `GL_ATOMIC(type, attribute name)` which generates a callable function specific to every attribute it's applied to. + +The code looks like this: +`static inline size_t get_##X##_offset(void) { return (char*)&(defaults->X)-(char*)defaults; };` + +`defaults` is a class attribute, a pointer to an object of the same type as the class it's a part of. Say we are looking at the `pole` class. `defaults` will be a pointer to a pole object. Confusingly, `defaults` is never inititialized to anything beyond NULL. How does this work? Back when this program was written in C, `defaults` pointed to a chunk of memory holding an object with all attributes initilized to default values. In C you could create a new object by simply copying this memory chunk. In C++ you need to declare all the attributes within an object, not just the object itself. The old method of setting defaults stopped working, so it's done differently now. The `defaults` pointer was retained as an attribute in the class declaration. The get offset function uses it for pointer math, finding the differences in memory location between the start of an object and all of it's attributes. Because a class declaration includes the type of all attributes, the compiler can figure out how much space they will take up in memory. (In C++ all types have a fixed size.) 'defaults' never needs to be initialized. \ No newline at end of file diff --git a/docs/Module/Powerflow/Pole_mount.md b/docs/Module/Powerflow/Pole_mount.md index e991adc23..af64f4fd5 100644 --- a/docs/Module/Powerflow/Pole_mount.md +++ b/docs/Module/Powerflow/Pole_mount.md @@ -51,6 +51,16 @@ object pole } ~~~ +## Properties + +### `direction` + +~~~ + double direction; +~~~ + +Direction from pole centerline at which equipment is mounted in degrees. + # See also * [[/Module/Powerflow/Pole.md]] diff --git a/module/powerflow/pole.cpp b/module/powerflow/pole.cpp index baefb566d..0705eea99 100644 --- a/module/powerflow/pole.cpp +++ b/module/powerflow/pole.cpp @@ -40,9 +40,10 @@ CLASS *pole::oclass = NULL; CLASS *pole::pclass = NULL; pole *pole::defaults = NULL; -static char32 wind_speed_name = "wind_speed"; -static char32 wind_dir_name = "wind_dir"; +static char32 wind_speed_name = "wind_speed"; // The name that a user writting glm code should use for +static char32 wind_dir_name = "wind_dir"; // the data (I should double check that this is true). static char32 wind_gust_name = "wind_gust"; +static char32 temperature_name = "temperature"; // Fahrenheit static double default_repair_time = 24.0; static bool stop_on_pole_failure = false; @@ -57,7 +58,7 @@ pole::pole(MODULE *mod) oclass->trl = TRL_PROTOTYPE; if ( gl_publish_variable(oclass, - PT_enumeration, "status", get_pole_status_offset(), + PT_enumeration, "status", get_pole_status_offset(), // the offset in memory location, where to find the data PT_KEYWORD, "OK", (enumeration)PS_OK, PT_KEYWORD, "FAILED", (enumeration)PS_FAILED, PT_DEFAULT, "OK", @@ -151,7 +152,7 @@ pole::pole(MODULE *mod) PT_OUTPUT, PT_DESCRIPTION, "wire moment due to conductor weight", - PT_double, "wire_moment_x[ft*lb]", get_wire_moment_x_offset(), // when I search for this, I get no results. What does it do? where is it defined? I want to add the ice loading in the same place as where the wire moment is being calculated in the absence of ice loading. Also why the word "offset"? + PT_double, "wire_moment_x[ft*lb]", get_wire_moment_x_offset(), PT_OUTPUT, PT_DESCRIPTION, "wire moment in x-axis due to tension and wind load", @@ -201,10 +202,10 @@ double wind_gust_cdf(double wind_ratio) return w; } -void pole::reset_commit_accumulators() -{ +void pole::reset_commit_accumulators() // Called "accumulators" because multiple threads can +{ // add to them. equipment_moment_nowind = 0.0; - wire_load_nowind = 0.0; + wire_load_nowind = 0.0; // Updated in pole_mount sync, not used anywhere else in this file wire_moment_nowind = 0.0; pole_moment = 0.0; pole_moment_wind = 0.0; @@ -219,7 +220,7 @@ void pole::reset_commit_accumulators() void pole::reset_sync_accumulators() { - wire_wind = 0.0; + wire_wind = 0.0; // moment due to wind load on wires } int pole::create(void) @@ -242,7 +243,8 @@ int pole::create(void) wind_speed_ref = NULL; wind_direction_ref = NULL; wind_gusts_ref = NULL; - return 1; + temp_ref = NULL; + return 1; } int pole::init(OBJECT *parent) @@ -324,6 +326,15 @@ int pole::init(OBJECT *parent) { verbose("wind_gusts = %g m/s (ref '%s')", wind_gusts, weather->name); } + + temp_ref = new gld_property(weather,(const char*) temperature_name); + if ( ! temp_ref->is_valid() ) + { + warning("weather data does not include %s, using local wind %s data only",(const char*)temperature_name,"temperature"); + delete temp_ref; + temp_ref = NULL; + } + } // tilt @@ -386,6 +397,11 @@ TIMESTAMP pole::precommit(TIMESTAMP t0) { wind_gusts = wind_gusts_ref->get_double(); } + // temperature + if ( temp_ref ) + { + temperature = temp_ref->get_double(); + } height = config->pole_length - config->pole_depth - guy_height; double diameter = config->top_diameter + height*(config->ground_diameter-config->top_diameter)/(config->pole_length-config->pole_depth); @@ -493,7 +509,17 @@ TIMESTAMP pole::postsync(TIMESTAMP t0) //// double pole_moment_y = pole_moment_wind*sin(wind_direction*PI/180)+pole_moment*sin(tilt_angle/180*PI); verbose("pole_moment_x = %g ft*lb (moment in x-axis)", pole_moment_x); verbose("pole_moment_y = %g ft*lb (moment in y-axis)", pole_moment_y); - + // Total moment on a pole results from + // wind pressure on the pole, + // the conductors attached to the pole, + // and the equipment mounted on the pole. + // Plus a transverse (perpendicular to the wires) load due to an angle + // in the conductors on the pole. + + // - wire moment covers tension, wind and weight of the lines + // - equipment moment covers gravitational load (equipment weight, + // pole tilt) and wind load (based on cross-sectional area of equipment) + // - pole moment covers pole weight and the wind on the pole total_moment = sqrt( (wire_moment_x+equipment_moment_x+pole_moment_x)*(wire_moment_x+equipment_moment_x+pole_moment_x) + (wire_moment_y+equipment_moment_y+pole_moment_y)*(wire_moment_y+equipment_moment_y+pole_moment_y)); diff --git a/module/powerflow/pole.h b/module/powerflow/pole.h index 538e8c7af..9c6a96fe9 100644 --- a/module/powerflow/pole.h +++ b/module/powerflow/pole.h @@ -66,6 +66,7 @@ class pole : public gld_object gld_property *wind_speed_ref; gld_property *wind_direction_ref; gld_property *wind_gusts_ref; + gld_property *temp_ref; private: void reset_commit_accumulators(); void reset_sync_accumulators(); diff --git a/module/powerflow/pole_mount.cpp b/module/powerflow/pole_mount.cpp index 00efdfd94..18c84372d 100644 --- a/module/powerflow/pole_mount.cpp +++ b/module/powerflow/pole_mount.cpp @@ -92,6 +92,7 @@ int pole_mount::create(void) int pole_mount::init(OBJECT *parent) { + // Input validation if ( my()->parent == NULL || ! get_parent()->isa("pole") ) { error("pole_mount must have a pole as parent object"); @@ -151,7 +152,7 @@ int pole_mount::init(OBJECT *parent) config->phaseN_conductor ? config->phaseN_conductor->name : "(NA)"); pole *mount = OBJECTDATA(my()->parent,pole); pole_configuration *pole_config = OBJECTDATA(mount->get_configuration(),pole_configuration); - double alpha = mount->get_tilt_angle()*PI/180; + double pole_tilt = mount->get_tilt_angle()*PI/180; double D1 = pole_config->top_diameter/12; double D0 = pole_config->ground_diameter/12; double H = pole_config->pole_length - pole_config->pole_depth; @@ -165,7 +166,7 @@ int pole_mount::init(OBJECT *parent) (conductor[2]?conductor[2]->get_cable_weight():0.0) + (conductor[3]?conductor[3]->get_cable_weight():0.0) ) * pole_spacing / 2; verbose("cable weight = %g lbs (half)",weight); - if (alpha == 0.0) + if (pole_tilt == 0.0) { // when the pole is not tilted, the weight moment is cable_weight*radius line_moment_weight = pole_config->overload_factor_vertical * ( @@ -192,7 +193,7 @@ int pole_mount::init(OBJECT *parent) conductor[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) + radius_N*(conductor[0]?conductor[0]->get_cable_weight()+0.39744*PI*( conductor[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) - ) * cos(alpha) + ( + ) * cos(pole_tilt) + ( (spacing->distance_AtoE-mount->get_guy_height())*(conductor[0]?conductor[0]->get_cable_weight()+0.39744*PI*( conductor[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) +(spacing->distance_BtoE-mount->get_guy_height())*(conductor[0]?conductor[0]->get_cable_weight()+0.39744*PI*( @@ -201,7 +202,7 @@ int pole_mount::init(OBJECT *parent) conductor[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) +(spacing->distance_NtoE-mount->get_guy_height())*(conductor[0]?conductor[0]->get_cable_weight()+0.39744*PI*( conductor[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) - ) * sin(alpha)) * pole_spacing / 2; // 1/2 works for poles at the same elevation level + ) * sin(pole_tilt)) * pole_spacing / 2; // 1/2 works for poles at the same elevation level } verbose("line_moment_weight = %g ft*lb (due to the weight of conductor and ice)",line_moment_weight); double transverse_load_nowind = 1 * ( @@ -214,7 +215,7 @@ int pole_mount::init(OBJECT *parent) line_load_nowind = transverse_load_nowind * pole_spacing; verbose("line_load_nowind = %g lb (wind load is 1 lb/sf)",line_load_nowind); // everything below the guyed height is ignored - line_moment_nowind = 1 * pole_spacing * cos(alpha) * pole_config->overload_factor_transverse_wire * ( + line_moment_nowind = 1 * pole_spacing * cos(pole_tilt) * pole_config->overload_factor_transverse_wire * ( (spacing->distance_AtoE-mount->get_guy_height()) * (conductor[0]?conductor[0]->cable_diameter+2*line->get_ice_thickness():0.0) + (spacing->distance_BtoE-mount->get_guy_height()) * (conductor[1]?conductor[1]->cable_diameter+2*line->get_ice_thickness():0.0) + (spacing->distance_CtoE-mount->get_guy_height()) * (conductor[2]?conductor[2]->cable_diameter+2*line->get_ice_thickness():0.0) + @@ -226,7 +227,7 @@ int pole_mount::init(OBJECT *parent) + (conductor[2]?conductor[2]->get_cable_strength():0.0) + (conductor[3]?conductor[3]->get_cable_strength():0.0); verbose("strength = %g lb", strength); - line_moment_tension = pole_config->overload_factor_transverse_wire * cos(alpha) * ( + line_moment_tension = pole_config->overload_factor_transverse_wire * cos(pole_tilt) * ( (spacing->distance_AtoE-mount->get_guy_height()) * (conductor[0]?conductor[0]->get_cable_strength():0.0) + (spacing->distance_BtoE-mount->get_guy_height()) * (conductor[1]?conductor[1]->get_cable_strength():0.0) + (spacing->distance_CtoE-mount->get_guy_height()) * (conductor[2]?conductor[2]->get_cable_strength():0.0) + @@ -239,15 +240,15 @@ int pole_mount::init(OBJECT *parent) verbose("equipment = %s",get_equipment()->name); pole *mount = OBJECTDATA(my()->parent,pole); pole_configuration *pole_config = OBJECTDATA(mount->get_configuration(),pole_configuration); - double alpha = mount->get_tilt_angle()*PI/180; + double pole_tilt = mount->get_tilt_angle()*PI/180; verbose("equipment area = %g sf",area); verbose("equipment weight = %g lbs",weight); // the first term is contributed by the weight perpendicular to the pole and the second term is weight moment - equipment_offset = (height-mount->get_guy_height())*sin(alpha)+offset*cos(alpha); + equipment_offset = (height-mount->get_guy_height())*sin(pole_tilt)+offset*cos(pole_tilt); verbose("equipment_offset = %g (measured in ft)",equipment_offset); equipment_moment_weight = weight * equipment_offset * pole_config->overload_factor_vertical; verbose("equipment_moment_weight = %g ft*lb",equipment_moment_weight); - equipment_load_nowind = 1 * area * cos(alpha); + equipment_load_nowind = 1 * area * cos(pole_tilt); verbose("equipment_load_nowind = %g lb (wind load is 1 lb/sf)",equipment_load_nowind); equipment_moment_nowind = (height-mount->get_guy_height())*pole_config->overload_factor_transverse_general*equipment_load_nowind; verbose("equipment_moment_nowind = %g ft*lb (wind load is 1 lb/sf)", equipment_moment_nowind); @@ -314,9 +315,9 @@ TIMESTAMP pole_mount::sync(TIMESTAMP t0) { // - pole_mount update moment accumulators pole *mount = OBJECTDATA(my()->parent,pole); - double alpha = mount->get_tilt_angle()*PI/180; - double beta = mount->get_tilt_direction()*PI/180; - double theta = direction*PI/180; + double pole_tilt = mount->get_tilt_angle()*PI/180; + double pole_tilt_dir = mount->get_tilt_direction()*PI/180; + double theta = direction*PI/180; // direction from pole centerline at which equipment is mounted. if ( mount->recalc ) { verbose("%s recalculation flag set",my()->parent->name); @@ -324,6 +325,8 @@ TIMESTAMP pole_mount::sync(TIMESTAMP t0) verbose("pole_mount wind_speed = %g m/s",wind_speed); if ( equipment_is_line ) { + // line_moment_nowind represents the components of the equation for moment on the + // pole due to wind other than the wind itself (i.e. cross-sectional area * torque radius) line_moment_wind = line_moment_nowind * wind_pressure * abs(sin((wind_direction-direction)*PI/180)); verbose("line_moment_wind = %g ft*lb",line_moment_wind); // the line moment due to wind mount->set_wire_wind(mount->get_wire_wind() + line_moment_wind ); // moment due to wind load on wires @@ -333,10 +336,10 @@ TIMESTAMP pole_mount::sync(TIMESTAMP t0) mount->set_wire_tension(mount->get_wire_tension() + line_moment_tension); // moment due to conductor tension double x = ( line_moment_tension + line_moment_wind ) * cos(theta); double y = ( line_moment_tension + line_moment_wind ) * sin(theta); - if ( alpha > 0.0 ) + if ( pole_tilt > 0.0 ) { - x += line_moment_weight * cos(beta); - y += line_moment_weight * sin(beta); + x += line_moment_weight * cos(pole_tilt_dir); + y += line_moment_weight * sin(pole_tilt_dir); } else { @@ -355,10 +358,10 @@ TIMESTAMP pole_mount::sync(TIMESTAMP t0) verbose("equipment_moment_wind = %g ft*lb",equipment_moment_wind); double x = equipment_moment_wind * cos(wind_direction*PI/180); double y = equipment_moment_wind * sin(wind_direction*PI/180); - if ( alpha > 0.0 ) + if ( pole_tilt > 0.0 ) { - x += equipment_moment_weight * cos(beta); - y += equipment_moment_weight * sin(beta); + x += equipment_moment_weight * cos(pole_tilt_dir); + y += equipment_moment_weight * sin(pole_tilt_dir); } else { diff --git a/source/gridlabd.h b/source/gridlabd.h index a3bb96547..bc36e9bf8 100644 --- a/source/gridlabd.h +++ b/source/gridlabd.h @@ -2583,6 +2583,7 @@ class gld_keyword // Define: GL_ATOMIC(,) // Define an atomic property (e.g., int, double, etc) +// Defines methods for that property, to get the memory address, read and write with optional locks // // Methods: // size_t get__offset(void) - return the address of the value @@ -2597,6 +2598,7 @@ class gld_keyword // void init_(void) - initialize the value to the default // void init_( value) - initialize the value #define GL_ATOMIC(T,X) protected: T X; public: \ + // An explanantion of the get offset function and defaults is in docs>Developer>reading-the-code.md static inline size_t get_##X##_offset(void) { return (char*)&(defaults->X)-(char*)defaults; }; \ inline T get_##X(void) { return X; }; \ inline gld_property get_##X##_property(void) { return gld_property(my(),#X); }; \ @@ -2753,6 +2755,13 @@ class gld_object // Method: my // Returns: reference the object header + // OBJECT is a user-defined type. `this` is a keyword, a pointer to the + // class instance that this function `my` is being called from. + // The class of this instance must inherit from OBJECT, because otherwise + // it would not be possible to typecast a pointer to this instance to + // type OBJECT. Subtracting 1 from the memory address means that it + // moves to the memory location to the preceeding OBJECT. (To work correctly, + // this requires that objects of type OBJECT are stored sequentially in memory.) inline OBJECT *my() { return (((OBJECT*)this)-1); } public: diff --git a/source/object.h b/source/object.h index 32d920abf..3d3584b12 100644 --- a/source/object.h +++ b/source/object.h @@ -512,6 +512,8 @@ const char* object_get_header_string(OBJECT *obj, const char *item, char *buffer #define object_parent(X) ((X)?(X)->parent:NULL) /**< get the parent of the object */ #define object_rank(X) ((X)?(X)->name:-1) /**< get the rank of the object */ +// If X is a valid pointer (not NULL), moves the following memory location and +// typecasts to a pointer of type `T`. #define OBJECTDATA(X,T) ((T*)((X)?((X)+1):NULL)) /**< get the object data structure */ #define GETADDR(O,P) ((O)?((void*)((char*)((O)+1)+(unsigned int64)((P)->addr))):NULL) /**< get the addr of an object's property */ #define OBJECTHDR(X) ((X)?(((OBJECT*)X)-1):NULL) /**< get the header from the object's data structure */ From d06cc494f7fc505a993b43b0afc1c27a00ef6a8c Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Wed, 2 Aug 2023 15:56:59 -0700 Subject: [PATCH 19/34] Improved readability, edited equation to calc moment on pole face Improved variable names, added functions to pole.cpp to avoid repeat calculations in different places, removed cos(pole_tilt) factor in calculation of moment due to wind on pole face, increased descriptiveness of documentation in pole.md, added code comments that explain calculations being made --- converters/autotest/test_csvgeodata2kml.csv | 2 +- .../autotest/test_xls-spida2csv-geodata.csv | 2 +- .../autotest/test_xls-spida2csv-network.csv | 2 +- converters/mdb-cyme2glm.py | 2 +- converters/xls-spida2csv-geodata.py | 4 +- docs/Converters/Import/Table_data.md | 2 +- docs/Module/Generators/Solar.md | 6 +- docs/Module/Powerflow/Pole.md | 33 ++- docs/Utilities/Create_poles.md | 4 +- .../climate/autotest/test_cloud_tmy3_opt.glm | 2 +- .../test_singleHouseSolarInverter.glm | 2 +- .../autotest/test_central_dg_control.glm | 4 +- .../test_solar_climate_default_playerval.glm | 2 +- .../autotest/test_solar_orientation.glm | 8 +- .../autotest/test_solar_output_efficiency.glm | 2 +- .../autotest/test_solar_shading.glm | 2 +- .../generators/autotest/test_solar_tilt.glm | 4 +- module/generators/solar.cpp | 20 +- module/generators/solar.h | 2 +- .../autotest/test_IEEE_13_pole_opt.glm | 2 +- .../autotest/test_IEEE_13_pole_output.csv | 2 +- module/powerflow/autotest/test_pole.csv | 2 +- module/powerflow/autotest/test_pole.glm | 6 +- module/powerflow/autotest/test_pole_NR.glm | 10 +- module/powerflow/autotest/test_pole_err.glm | 4 +- module/powerflow/pole.cpp | 117 ++++++---- module/powerflow/pole.h | 14 +- module/powerflow/pole_mount.cpp | 201 ++++++++++-------- module/powerflow/pole_mount.h | 14 +- python/external/nreca/Configuration.py | 2 +- .../Sid_New/Sid_add_glm_object_dictionary.py | 4 +- .../nreca/add_glm_object_dictionary.py | 4 +- .../external/pnnl/Inverter_Function_File.py | 28 +-- .../Inverter_add_glm_object_dictionary.py | 4 +- python/external/pnnl/Sid_PNNL_Solar.py | 28 +-- .../pnnl/Sid_add_glm_object_dictionary.py | 6 +- source/object.h | 12 +- tools/autotest/test_create_poles.csv | 2 +- tools/autotest/test_create_poles_opt.glm | 142 ++++++------- tools/autotest/test_pole_analysis_opt.glm | 10 +- tools/create_poles.py | 6 +- tools/pole_analysis.py | 86 ++++---- 42 files changed, 432 insertions(+), 379 deletions(-) diff --git a/converters/autotest/test_csvgeodata2kml.csv b/converters/autotest/test_csvgeodata2kml.csv index 018bc5d69..bc35677bd 100644 --- a/converters/autotest/test_csvgeodata2kml.csv +++ b/converters/autotest/test_csvgeodata2kml.csv @@ -1,4 +1,4 @@ -class,pole_length,pole_depth,ground_diameter,fiber_strength,name,tilt_angle,tilt_direction,latitude,longitude,configuration,weather,flags +class,pole_length,pole_depth,ground_diameter,fiber_strength,name,tilt_degree,tilt_direction,latitude,longitude,configuration,weather,flags pole_configuration,40.0 ft,5.5 ft,9.87 in,8000 psi,pole_configuration_267462S,,,,,,, pole_configuration,50.0 ft,7.5 ft,,8000 psi,pole_configuration_280565E,,,,,,, pole_configuration,45.0 ft,6.5 ft,12.41 in,8000 psi,pole_configuration_306771E,,,,,,, diff --git a/converters/autotest/test_xls-spida2csv-geodata.csv b/converters/autotest/test_xls-spida2csv-geodata.csv index 1c7cd6b83..8d5f1dde4 100644 --- a/converters/autotest/test_xls-spida2csv-geodata.csv +++ b/converters/autotest/test_xls-spida2csv-geodata.csv @@ -1,4 +1,4 @@ -class,pole_length,pole_depth,ground_diameter,fiber_strength,name,tilt_angle,tilt_direction,latitude,longitude,configuration,wind_speed,flags +class,pole_length,pole_depth,ground_diameter,fiber_strength,name,tilt_degree,tilt_direction,latitude,longitude,configuration,wind_speed,flags pole_configuration,40.0 ft,5.5 ft,9.87 in,8000 psi,pole_configuration_267462S,,,,,,, pole_configuration,50.0 ft,7.5 ft,12.18 in,8000 psi,pole_configuration_280565E,,,,,,, pole_configuration,45.0 ft,6.5 ft,12.41 in,8000 psi,pole_configuration_306771E,,,,,,, diff --git a/converters/autotest/test_xls-spida2csv-network.csv b/converters/autotest/test_xls-spida2csv-network.csv index eb64f0c3d..f8bf40b8d 100644 --- a/converters/autotest/test_xls-spida2csv-network.csv +++ b/converters/autotest/test_xls-spida2csv-network.csv @@ -1,4 +1,4 @@ -class,pole_length,pole_depth,ground_diameter,fiber_strength,name,tilt_angle,tilt_direction,latitude,longitude,configuration,wind_speed,flags,equipment,parent,height,direction,pole_spacing,// cable_type,offset,area,weight,// equipment_type,phases,bustype,nominal_voltage,diameter,resistance,strength,distance_AE,conductor_A,spacing,from,to,length,connect_type,install_type,power_rating,primary_voltage,secondary_voltage,reactance +class,pole_length,pole_depth,ground_diameter,fiber_strength,name,tilt_degree,tilt_direction,latitude,longitude,configuration,wind_speed,flags,equipment,parent,height,direction,pole_spacing,// cable_type,offset,area,weight,// equipment_type,phases,bustype,nominal_voltage,diameter,resistance,strength,distance_AE,conductor_A,spacing,from,to,length,connect_type,install_type,power_rating,primary_voltage,secondary_voltage,reactance pole_configuration,40.0 ft,5.5 ft,9.87 in,8000 psi,pole_configuration_267462S,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, pole_configuration,50.0 ft,7.5 ft,12.18 in,8000 psi,pole_configuration_280565E,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, pole_configuration,45.0 ft,6.5 ft,12.41 in,8000 psi,pole_configuration_306771E,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, diff --git a/converters/mdb-cyme2glm.py b/converters/mdb-cyme2glm.py index 7f1e63233..21824bd70 100644 --- a/converters/mdb-cyme2glm.py +++ b/converters/mdb-cyme2glm.py @@ -2226,7 +2226,7 @@ def add_photovoltaic(self, photovoltaic_id, photovoltaic, version, **kwargs): "panel_type": "MULTI_CRYSTAL_SILICON", "efficiency": panel_efficiency, "area": panel_area, - "tilt_angle": "45", + "tilt_degree": "45", "orientation_azimuth": "180", "orientation": "FIXED_AXIS", } diff --git a/converters/xls-spida2csv-geodata.py b/converters/xls-spida2csv-geodata.py index 8df42b1bd..8fa9c7b07 100644 --- a/converters/xls-spida2csv-geodata.py +++ b/converters/xls-spida2csv-geodata.py @@ -93,7 +93,7 @@ def convert(input_file, output_file, options={}): # Rename columns to its corresponding column name in Gridlabd. # I believe class in the file is referring to grade, so it is renamed. - df_current_sheet.rename(columns = {np.nan : 'name', 'Lean Angle': 'tilt_angle', + df_current_sheet.rename(columns = {np.nan : 'name', 'Lean Angle': 'tilt_degree', 'Lean Direction': 'tilt_direction', 'Effective Allowable Stress': 'fiber_strength',\ 'Length' : 'pole_length', 'GLC' : 'ground_diameter', 'AGL' : 'pole_depth',\ 'Class': "grade"}, inplace=True) # for sec data @@ -104,7 +104,7 @@ def convert(input_file, output_file, options={}): # Split the dataframe based on properties of pole_config and pole_library. df_pole_config = df_current_sheet[['pole_length', 'pole_depth', 'ground_diameter', 'fiber_strength']].copy() - df_pole_library = df_current_sheet[['tilt_angle', 'tilt_direction', 'latitude', 'longitude']].copy() + df_pole_library = df_current_sheet[['tilt_degree', 'tilt_direction', 'latitude', 'longitude']].copy() # Specify class of the properties. df_pole_config.loc[:,'class'] = 'powerflow.pole_configuration' diff --git a/docs/Converters/Import/Table_data.md b/docs/Converters/Import/Table_data.md index c3390eb73..234814395 100644 --- a/docs/Converters/Import/Table_data.md +++ b/docs/Converters/Import/Table_data.md @@ -8,7 +8,7 @@ This converter allows for any arbitrary object to be imported via CSV-formatted Any arbitrary objects can be listed in a CSV file and convertered to GLM-formatted object. The table format is as below : -class | name | tilt_angle | tilt_direction | weather | configuration | equipment_area | equipment_height | install_year | repair_time | latitude | longitude | phases | nominal_voltage | tmyfile +class | name | tilt_degree | tilt_direction | weather | configuration | equipment_area | equipment_height | install_year | repair_time | latitude | longitude | phases | nominal_voltage | tmyfile --- | --- | --- | --- |--- |--- |--- |--- |--- |--- |--- |--- |--- |--- |--- powerflow.pole | pole1 | 5 deg | 270 | weather | WOOD-C-45/5 | | | 1990 | 1 h | 37.4275 | 122.1697 | ABC | 12470 powerflow.pole | pole2 | 8 deg | 270 | weather | WOOD-C-45/5 | | | 2000 | 8 h | 37.127 | 122.1646 | ABC | 12470 diff --git a/docs/Module/Generators/Solar.md b/docs/Module/Generators/Solar.md index 37514d3d5..d7c6117da 100644 --- a/docs/Module/Generators/Solar.md +++ b/docs/Module/Generators/Solar.md @@ -40,7 +40,7 @@ class solar { complex VA_Out[VA]; object weather; double shading_factor[pu]; - double tilt_angle[deg]; + double tilt_degree[deg]; double orientation_azimuth[deg]; bool latitude_angle_fix; enumeration {DEFAULT=0,FIXED_AXIS=1,ONE_AXIS=2,TWO_AXIS=3,AZIMUTH_AXIS=4}orientation; @@ -239,9 +239,9 @@ Reference to a climate object from which temperature, humidity, and solar flux a double shading_factor[pu] ~~~ Shading factor for scaling solar power to the array. -### tilt_angle +### tilt_degree ~~~ -double tilt_angle[deg] +double tilt_degree[deg] ~~~ Tilt angle of PV array. ### orientation_azimuth diff --git a/docs/Module/Powerflow/Pole.md b/docs/Module/Powerflow/Pole.md index d486e9506..01cc66b9c 100644 --- a/docs/Module/Powerflow/Pole.md +++ b/docs/Module/Powerflow/Pole.md @@ -6,7 +6,7 @@ object pole { status "OK"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction 0 deg"; weather ""; configuration ""; * @@ -23,9 +23,9 @@ object pole total_moment "0 ft*lb"; resisting_moment "0 ft*lb"; pole_moment "0 ft*lb"; - pole_moment_nowind "0 ft*lb"; + pole_moment_per_wind "0 ft*lb"; equipment_moment "0 ft*lb"; - equipment_moment_nowind "0 ft*lb"; + equipment_moment_per_wind "0 ft*lb"; critical_wind_speed "0 m/s"; wire_moment "0 ft*lb"; wire_tension "0 ft*lb"; @@ -52,10 +52,10 @@ Generally, any link object in a powerflow model can be mounted on a pole by crea The status of the pole. -### `tilt_angle` +### `tilt_degree` ~~~ - double tilt_angle[deg]; + double tilt_degree[deg]; ~~~ The tilt angle of the pole. @@ -173,7 +173,8 @@ Susceptibility of pole to wind stress (derivative of pole stress with respect to double total_moment[ft*lb]; ~~~ -The total moment on the pole. A vector sum of each moment considered. +The total moment on the pole. This results from wind loads, gravitational loads, and potentially a transverse (perpendicular to the wires) load due to an angle in the conductors. There is wind pressure on the pole itself, the conductors attached to the pole, and the equipment mounted on the pole. Wind on equipment is usually much less signinficant than wind on the conductors. There are also gravitaional loads based on the pole tilt, it's weight and that of the mounted equipment and lines. + ### `resisting_moment` @@ -189,15 +190,15 @@ Maximum moment the pole can withstand before snapping. This is calculated based double pole_moment[ft*lb]; ~~~ -The moment of the pole. +Moment on the pole due to it's own weight and tilt. -### `pole_moment_nowind` +### `pole_moment_per_wind` ~~~ - double pole_moment_nowind[ft*lb]; + double pole_moment_per_wind[ft*lb]; ~~~ -The moment of the pole without wind, due to its weight and tilt. + The components of the equation for moment due to wind on the pole, except for wind pressure, i.e. moment per unit wind pressure. Accounts for the pole's cross-sectional area (for calculating the force of wind on the pole) and height (torque raduis). ### `equipment_moment` @@ -205,17 +206,15 @@ The moment of the pole without wind, due to its weight and tilt. double equipment_moment[ft*lb]; ~~~ -The moment of the equipment. +Moments on the pole due to gravitational load (equipment weight, pole tilt) and wind load (based on cross-sectional area of equipment). -### `equipment_moment_nowind` +### `equipment_moment_per_wind` ~~~ - double equipment_moment_nowind[ft*lb]; + double equipment_moment_per_wind[ft*lb]; ~~~ -The moment of the equipment without wind. - -The resisting moment on the pole. + The components of the equation for moment due to wind on equipment, all except the wind pressure, i.e. moment per unit wind pressure. ### `critical_wind_speed` @@ -231,7 +230,7 @@ Wind speed at pole failure. double wire_moment[ft*lb]; ~~~ -Wire moment due to conductor weight. +Moments due to line tension, weight, and wind on the lines. ### `wire_tension` diff --git a/docs/Utilities/Create_poles.md b/docs/Utilities/Create_poles.md index 594e7148b..56bafcfa3 100644 --- a/docs/Utilities/Create_poles.md +++ b/docs/Utilities/Create_poles.md @@ -59,7 +59,7 @@ on using libraries. Some network models include latitude and longitude information. When this information is present, the line length information checked. If there is a discrepancy between these, a warning is printed and the latitude/longitude information is used. The `--ignore_length` option will suppress this -warning. The `--ignore_location` warning will cause the model to use the line length data instead. +warning. The `--ignore_location` option will cause the model to use the line length data instead. The `--include_network` adds a `#include "FILENAME"` directive in the output to ensure that the resulting GLM file contains all the objects required to run the simulation, e.g., @@ -85,7 +85,7 @@ Pole and pole_mount objects are created with the following default properties: * pole - install_year: 2000 - - tilt_angle: 0 deg + - tilt_degree: 0 deg - tilt_direction: 0 deg * pole_mount height: 40 ft diff --git a/module/climate/autotest/test_cloud_tmy3_opt.glm b/module/climate/autotest/test_cloud_tmy3_opt.glm index ad4fc09bc..dfbf64d50 100644 --- a/module/climate/autotest/test_cloud_tmy3_opt.glm +++ b/module/climate/autotest/test_cloud_tmy3_opt.glm @@ -72,7 +72,7 @@ object solar { phases CS; parent DHHL_3_inv; area 141.76 ft^2; - tilt_angle 90.0; + tilt_degree 90.0; efficiency 0.05; orientation_azimuth 180; //equator-facing (South) orientation DEFAULT; diff --git a/module/climate/autotest/test_singleHouseSolarInverter.glm b/module/climate/autotest/test_singleHouseSolarInverter.glm index 35073e6e4..47d4af233 100644 --- a/module/climate/autotest/test_singleHouseSolarInverter.glm +++ b/module/climate/autotest/test_singleHouseSolarInverter.glm @@ -1258,7 +1258,7 @@ object solar { name DHHL_3_PV; parent DHHL_3_inv; area 141.76 ft^2; - tilt_angle 90.0; + tilt_degree 90.0; efficiency 0.05; orientation_azimuth 180; //equator-facing (South) orientation DEFAULT; diff --git a/module/generators/autotest/test_central_dg_control.glm b/module/generators/autotest/test_central_dg_control.glm index 79fea5f8d..713c849ed 100644 --- a/module/generators/autotest/test_central_dg_control.glm +++ b/module/generators/autotest/test_central_dg_control.glm @@ -706,7 +706,7 @@ object solar { // player files are used instead of climate object //weather "WA-Yakima"; rated_power 40.0 kVA; area 29.6296 m^2; - tilt_angle 45.0; + tilt_degree 45.0; efficiency 0.135; orientation_azimuth 180.0; //equator-facing (South) orientation FIXED_AXIS; @@ -751,7 +751,7 @@ object solar { // player files are used instead of climate object //weather "WA-Yakima"; rated_power 50.0 kVA; area 29.6296 m^2; - tilt_angle 45.0; + tilt_degree 45.0; efficiency 0.135; orientation_azimuth 180.0; //equator-facing (South) orientation FIXED_AXIS; diff --git a/module/generators/autotest/test_solar_climate_default_playerval.glm b/module/generators/autotest/test_solar_climate_default_playerval.glm index 673c83e25..a1b7801bc 100644 --- a/module/generators/autotest/test_solar_climate_default_playerval.glm +++ b/module/generators/autotest/test_solar_climate_default_playerval.glm @@ -57,7 +57,7 @@ object solar { // player files are used instead of climate object //weather "WA-Yakima"; rated_power 4.0 kVA; area 29.6296 m^2; - tilt_angle 45.0; + tilt_degree 45.0; efficiency 0.135; orientation_azimuth 180.0; //equator-facing (South) orientation FIXED_AXIS; diff --git a/module/generators/autotest/test_solar_orientation.glm b/module/generators/autotest/test_solar_orientation.glm index af17d9bdf..024499e47 100644 --- a/module/generators/autotest/test_solar_orientation.glm +++ b/module/generators/autotest/test_solar_orientation.glm @@ -75,7 +75,7 @@ object solar { weather "CA-Chino"; rated_power 4.0 kVA; area 29.6296 m^2; - tilt_angle 45.0; + tilt_degree 45.0; efficiency 0.135; orientation_azimuth 180.0; //equator-facing (South) orientation FIXED_AXIS; @@ -111,7 +111,7 @@ object solar { weather "CA-Chino"; rated_power 4.0 kVA; area 29.6296 m^2; - tilt_angle 45.0; + tilt_degree 45.0; efficiency 0.135; orientation_azimuth 270; //West orientation FIXED_AXIS; @@ -134,7 +134,7 @@ object solar { weather "CA-Chino"; rated_power 4.0 kVA; area 29.6296 m^2; - tilt_angle 45.0; + tilt_degree 45.0; efficiency 0.135; orientation_azimuth 0.0; //North orientation FIXED_AXIS; @@ -157,7 +157,7 @@ object solar { weather "CA-Chino"; rated_power 4.0 kVA; area 29.6296 m^2; - tilt_angle 45.0; + tilt_degree 45.0; efficiency 0.135; orientation_azimuth 90; //East orientation FIXED_AXIS; diff --git a/module/generators/autotest/test_solar_output_efficiency.glm b/module/generators/autotest/test_solar_output_efficiency.glm index 98bce73e2..7b48b014c 100644 --- a/module/generators/autotest/test_solar_output_efficiency.glm +++ b/module/generators/autotest/test_solar_output_efficiency.glm @@ -123,7 +123,7 @@ object solar { weather "CA-Chino"; rated_power 4.0 kVA; area 29.6296 m^2; - tilt_angle 45.0; + tilt_degree 45.0; efficiency 0.135; orientation_azimuth 180.0; //south orientation FIXED_AXIS; diff --git a/module/generators/autotest/test_solar_shading.glm b/module/generators/autotest/test_solar_shading.glm index 2a773541d..9e75334d5 100644 --- a/module/generators/autotest/test_solar_shading.glm +++ b/module/generators/autotest/test_solar_shading.glm @@ -96,7 +96,7 @@ object solar { weather "CA-Chino"; rated_power 4.0 kVA; area 29.6296 m^2; - tilt_angle 45.0; + tilt_degree 45.0; efficiency 0.135; shading_factor shading_value*1.0; //use daily shading schedule orientation_azimuth 180.0; //equator-facing (South) diff --git a/module/generators/autotest/test_solar_tilt.glm b/module/generators/autotest/test_solar_tilt.glm index eb893e0c3..b636528e0 100644 --- a/module/generators/autotest/test_solar_tilt.glm +++ b/module/generators/autotest/test_solar_tilt.glm @@ -67,7 +67,7 @@ object solar { weather "CA-Chino"; rated_power 4.0 kVA; area 29.6296 m^2; - tilt_angle 90.0; + tilt_degree 90.0; efficiency 0.135; orientation_azimuth 180; //equator-facing (South) orientation FIXED_AXIS; @@ -98,7 +98,7 @@ object solar { weather "CA-Chino"; rated_power 4.0 kVA; area 29.6296 m^2; - tilt_angle 20.0; + tilt_degree 20.0; efficiency 0.135; orientation_azimuth 180; //South orientation FIXED_AXIS; diff --git a/module/generators/solar.cpp b/module/generators/solar.cpp index c0e122375..46ebf5712 100644 --- a/module/generators/solar.cpp +++ b/module/generators/solar.cpp @@ -108,7 +108,7 @@ solar::solar(MODULE *module) PT_object, "weather", PADDR(weather), PT_double, "shading_factor[pu]", PADDR(shading_factor), PT_DEFAULT,"1 pu", PT_DESCRIPTION, "Shading factor for scaling solar power to the array", - PT_double, "tilt_angle[deg]", PADDR(tilt_angle), PT_DEFAULT,"45 deg", PT_DESCRIPTION, "Tilt angle of PV array", + PT_double, "tilt_degree[deg]", PADDR(tilt_degree), PT_DEFAULT,"45 deg", PT_DESCRIPTION, "Tilt angle of PV array", PT_double, "orientation_azimuth[deg]", PADDR(orientation_azimuth), PT_DEFAULT,"180 deg", PT_DESCRIPTION, "Facing direction of the PV array", PT_bool, "latitude_angle_fix", PADDR(fix_angle_lat), PT_DEFAULT,"FALSE", PT_DESCRIPTION, "Fix tilt angle to installation latitude value", @@ -328,25 +328,25 @@ int solar::init_climate() if (obj->latitude < 0) //Southern hemisphere { //Get the latitude from the climate file - tilt_angle = -obj->latitude; + tilt_degree = -obj->latitude; } else //Northern { //Get the latitude from the climate file - tilt_angle = obj->latitude; + tilt_degree = obj->latitude; } } //Check the tilt angle for absurdity - if (tilt_angle < 0) + if (tilt_degree < 0) { - GL_THROW("Invalid tilt_angle - tilt must be between 0 and 90 degrees"); + GL_THROW("Invalid tilt_degree - tilt must be between 0 and 90 degrees"); /* TROUBLESHOOT A negative tilt angle was specified. This implies the array is under the ground and will not receive any meaningful solar irradiation. Please correct the tilt angle and try again. */ } - else if (tilt_angle > 90.0) + else if (tilt_degree > 90.0) { GL_THROW("Invalid tilt angle - values above 90 degrees are unsupported!"); /* TROUBLESHOOT @@ -856,19 +856,19 @@ TIMESTAMP solar::sync(TIMESTAMP t0, TIMESTAMP t1) { if (weather == NULL) { - Insolation = shading_factor*(*pSolarD) + *pSolarH + *pSolarG*(1 - cos(tilt_angle))*(*pAlbedo)/2.0; + Insolation = shading_factor*(*pSolarD) + *pSolarH + *pSolarG*(1 - cos(tilt_degree))*(*pAlbedo)/2.0; } else { - ret_value = ((int64 (*)(OBJECT *, double, double, double, double, double *))(*calc_solar_radiation))(weather, RAD(tilt_angle), obj->latitude, obj->longitude, shading_factor, &Insolation); + ret_value = ((int64 (*)(OBJECT *, double, double, double, double, double *))(*calc_solar_radiation))(weather, RAD(tilt_degree), obj->latitude, obj->longitude, shading_factor, &Insolation); } break; } case FIXED_AXIS: // NOTE that this means FIXED, stationary. There is no AXIS at all. FIXED_AXIS is known as Single Axis Tracking by some, so the term is misleading. { //Snag solar insolation - prorate by shading (direct axis) - uses model selected earlier - ret_value = ((int64 (*)(OBJECT *, double, double, double, double, double, double *))(*calc_solar_radiation))(weather,RAD(tilt_angle),RAD(orientation_azimuth_corrected),obj->latitude,obj->longitude,shading_factor,&Insolation); - //ret_value = ((int64 (*)(OBJECT *, double, double, double, double *))(*calc_solar_radiation))(weather,tilt_angle,orientation_azimuth_corrected,shading_factor,&Insolation); + ret_value = ((int64 (*)(OBJECT *, double, double, double, double, double, double *))(*calc_solar_radiation))(weather,RAD(tilt_degree),RAD(orientation_azimuth_corrected),obj->latitude,obj->longitude,shading_factor,&Insolation); + //ret_value = ((int64 (*)(OBJECT *, double, double, double, double *))(*calc_solar_radiation))(weather,tilt_degree,orientation_azimuth_corrected,shading_factor,&Insolation); //Make sure it worked if (ret_value == 0) diff --git a/module/generators/solar.h b/module/generators/solar.h index 9ca09a5a3..8b9cfe6e1 100644 --- a/module/generators/solar.h +++ b/module/generators/solar.h @@ -72,7 +72,7 @@ class solar : public gld_object double module_Tcoeff; //Maximum power temperature coefficient double shading_factor; //Shading factor - double tilt_angle; //Installation tilt angle + double tilt_degree; //Installation tilt angle double orientation_azimuth; //published Orientation of the array bool fix_angle_lat; //Fix tilt angle to latitude (replicates NREL SAM function) double soiling_factor; //Soiling factor to be applied - makes user specifiable diff --git a/module/powerflow/autotest/test_IEEE_13_pole_opt.glm b/module/powerflow/autotest/test_IEEE_13_pole_opt.glm index 910a0864f..40f295f30 100644 --- a/module/powerflow/autotest/test_IEEE_13_pole_opt.glm +++ b/module/powerflow/autotest/test_IEEE_13_pole_opt.glm @@ -36,7 +36,7 @@ object climate { object multi_recorder { file "test_IEEE13_pole_output.csv"; - property weather:wind_speed, n633:wind_pressure, n633:resisting_moment, n633:total_moment, n633:pole_status, n633:tilt_angle, n633:pole_stress; + property weather:wind_speed, n633:wind_pressure, n633:resisting_moment, n633:total_moment, n633:pole_status, n633:tilt_degree, n633:pole_stress; interval -1; } object pole_configuration diff --git a/module/powerflow/autotest/test_IEEE_13_pole_output.csv b/module/powerflow/autotest/test_IEEE_13_pole_output.csv index 32589c482..f275f56e6 100644 --- a/module/powerflow/autotest/test_IEEE_13_pole_output.csv +++ b/module/powerflow/autotest/test_IEEE_13_pole_output.csv @@ -1,4 +1,4 @@ -timestamp,weather:wind_speed, p633:resisting_moment, p633:total_moment, p633:status, p633:tilt_angle, p633:pole_stress +timestamp,weather:wind_speed, p633:resisting_moment, p633:total_moment, p633:status, p633:tilt_degree, p633:pole_stress 2020-07-01 00:00:00 EDT,+0.5,+16651.4,+0,OK,+0,+0 2020-07-01 01:00:00 EDT,+1,+16651.4,+1.26358,OK,+0,+7.58845e-05 2020-07-01 02:00:00 EDT,+1.2,+16651.4,+5.05432,OK,+0,+0.000303538 diff --git a/module/powerflow/autotest/test_pole.csv b/module/powerflow/autotest/test_pole.csv index a4a7fc3df..67f54f5d8 100644 --- a/module/powerflow/autotest/test_pole.csv +++ b/module/powerflow/autotest/test_pole.csv @@ -1,4 +1,4 @@ -timestamp,weather:wind_speed, weather:wind_dir,pole1:tilt_angle, pole1:tilt_direction,pole1:pole_stress, pole1:total_moment, pole1:resisting_moment,pole1:susceptibility, pole1:status,device1:status,pole2:tilt_angle, pole2:tilt_direction,pole2:pole_stress, pole2:total_moment, pole2:resisting_moment,pole2:susceptibility, pole2:status,device2:status +timestamp,weather:wind_speed, weather:wind_dir,pole1:tilt_degree, pole1:tilt_direction,pole1:pole_stress, pole1:total_moment, pole1:resisting_moment,pole1:susceptibility, pole1:status,device1:status,pole2:tilt_degree, pole2:tilt_direction,pole2:pole_stress, pole2:total_moment, pole2:resisting_moment,pole2:susceptibility, pole2:status,device2:status 2020-01-01 00:00:00 PST,+3.1,+160,+5,+270,+0.0253352,+1563.75,+61722.3,+82.4413,OK,OK,+8,+180,+0.0172462,+1064.48,+61722.3,+191.518,OK,OK 2020-01-01 01:00:00 PST,+0,+0,+5,+270,+0.0253352,+1563.75,+61722.3,+82.4413,OK,OK,+8,+180,+0.0172462,+1064.48,+61722.3,+191.518,OK,OK 2020-01-01 02:00:00 PST,+0,+0,+5,+270,+0.0256613,+1583.87,+61722.3,+0,OK,OK,+8,+180,+0.0177696,+1096.78,+61722.3,+0,OK,OK diff --git a/module/powerflow/autotest/test_pole.glm b/module/powerflow/autotest/test_pole.glm index d96902635..b9a1db51b 100644 --- a/module/powerflow/autotest/test_pole.glm +++ b/module/powerflow/autotest/test_pole.glm @@ -118,7 +118,7 @@ object pole { name pole1; weather weather; configuration "WOOD-C-45/5"; - tilt_angle 5 deg; + tilt_degree 5 deg; tilt_direction 270; install_year 1990; object pole_mount { @@ -143,7 +143,7 @@ object pole { name pole2; weather weather; configuration "WOOD-C-45/5"; - tilt_angle 8 deg; + tilt_degree 8 deg; tilt_direction 180; install_year 2000; object pole_mount @@ -183,7 +183,7 @@ object multi_recorder { interval 3600; property "weather:wind_speed, weather:wind_dir"; #for POLE in ${FIND class=pole} - property "${POLE}:tilt_angle, ${POLE}:tilt_direction"; + property "${POLE}:tilt_degree, ${POLE}:tilt_direction"; property "${POLE}:pole_stress, ${POLE}:total_moment, ${POLE}:resisting_moment"; property "${POLE}:susceptibility, ${POLE}:status"; property "${POLE/pole/device}:status"; diff --git a/module/powerflow/autotest/test_pole_NR.glm b/module/powerflow/autotest/test_pole_NR.glm index cc2fb0687..8fa32b851 100644 --- a/module/powerflow/autotest/test_pole_NR.glm +++ b/module/powerflow/autotest/test_pole_NR.glm @@ -341,7 +341,7 @@ object pole { name p633; weather weather; configuration "WOOD-C-45/5"; - tilt_angle 5 deg; + tilt_degree 5 deg; tilt_direction 270; } @@ -357,7 +357,7 @@ object pole { name p630; weather weather; configuration "WOOD-C-45/5"; - tilt_angle 5 deg; + tilt_degree 5 deg; tilt_direction 270; } @@ -373,7 +373,7 @@ object pole { name p632; weather weather; configuration "WOOD-C-45/5"; - tilt_angle 5 deg; + tilt_degree 5 deg; tilt_direction 270; } @@ -399,7 +399,7 @@ object pole { name p680; weather weather; configuration "WOOD-C-45/5"; - tilt_angle 5 deg; + tilt_degree 5 deg; tilt_direction 270; } @@ -416,7 +416,7 @@ object pole { name p684; weather weather; configuration "WOOD-C-45/5"; - tilt_angle 5 deg; + tilt_degree 5 deg; tilt_direction 270; } diff --git a/module/powerflow/autotest/test_pole_err.glm b/module/powerflow/autotest/test_pole_err.glm index 08bcc4b4e..dc63f9ddf 100644 --- a/module/powerflow/autotest/test_pole_err.glm +++ b/module/powerflow/autotest/test_pole_err.glm @@ -80,7 +80,7 @@ object pole { name pole1; weather weather; configuration "WOOD-C-45/5"; - tilt_angle 20 deg; + tilt_degree 20 deg; tilt_direction 180; install_year 1990; object pole_mount @@ -93,7 +93,7 @@ object pole { name pole2; weather weather; configuration "WOOD-C-45/5"; - tilt_angle 8 deg; + tilt_degree 8 deg; tilt_direction 270; install_year 2000; object pole_mount diff --git a/module/powerflow/pole.cpp b/module/powerflow/pole.cpp index 0705eea99..ce27d5767 100644 --- a/module/powerflow/pole.cpp +++ b/module/powerflow/pole.cpp @@ -56,6 +56,7 @@ pole::pole(MODULE *mod) if ( oclass == NULL ) throw "unable to register class pole"; oclass->trl = TRL_PROTOTYPE; + // Pulling from .glm file: if ( gl_publish_variable(oclass, PT_enumeration, "status", get_pole_status_offset(), // the offset in memory location, where to find the data @@ -64,7 +65,7 @@ pole::pole(MODULE *mod) PT_DEFAULT, "OK", PT_DESCRIPTION, "pole status", - PT_double, "tilt_angle[deg]", get_tilt_angle_offset(), + PT_double, "tilt_degree[deg]", get_tilt_degree_offset(), PT_DEFAULT, "0.0 deg", PT_DESCRIPTION, "tilt angle of pole from the centerline", @@ -128,7 +129,7 @@ pole::pole(MODULE *mod) PT_OUTPUT, PT_DESCRIPTION, "the moment of the pole", - PT_double, "pole_moment_nowind[ft*lb]", get_pole_moment_nowind_offset(), + PT_double, "pole_moment_per_wind[ft*lb]", get_pole_moment_per_wind_offset(), PT_OUTPUT, PT_DESCRIPTION, "the moment of the pole without wind", @@ -140,7 +141,7 @@ pole::pole(MODULE *mod) PT_OUTPUT, PT_DESCRIPTION, "the moment of the equipment weight", - PT_double, "equipment_moment_nowind[ft*lb]", get_equipment_moment_nowind_offset(), + PT_double, "equipment_moment_per_wind[ft*lb]", get_equipment_moment_per_wind_offset(), PT_OUTPUT, PT_DESCRIPTION, "the moment of the equipment without wind", @@ -202,11 +203,48 @@ double wind_gust_cdf(double wind_ratio) return w; } +// effective pole height: +// height above the ground minus guy wire height (how far it extends without support, a.k.a. from where it would snap) +double pole::calc_height() { + return config->pole_length - config->pole_depth - guy_height; +} + +// diameter at effective pole height, using linear interpolation from pole top diameter and ground diameter +// diameter = top diameter + height difference from top * (change in diameter / change in height) +double pole::calc_diameter() { + return config->top_diameter + + height*(config->ground_diameter-config->top_diameter) + /(config->pole_length - config->pole_depth); +} + +// pole_moment_per_wind is calculated in multiple places. +// Making a function that does that calculation avoids repeat code, allowing the +// details of the calculation to be changed in just one place and reducing the +// likelihood of bugs. +// pole moment per unit of wind pressure +// Equation comes from Pole Loading Model, pdf linked in docs. +// moment = force * radius +// Pole moment = wind pressure * cross-sectional area * height from supported point +// Calculated by approximating the pole's cross sectional area as a very tall trapezoid (diameter at the bottom +// is larger than that at the top). Integrating to sum up the contribution to moment from every slice +// of area at a given height gives: +// pole moment = 1/6 W H^2 (D_base + 2*D_top) +// where W = wind pressure, dropped from the equation to be multiplied in later +// H = pole height +// D = diameter at the supported base and at the top +// * 1/12 to convert diameter from inches to feet +// * Overload capacity factor which increases the modeled force on the pole. +// For reliability, the National Electrical Safety Code requires that these overload factors +// be used when calculating the maximum force a pole must withstand. +double pole::calc_pole_moment_per_wind() { + return 1/6 * height * height * (diameter + 2*config->top_diameter)/12 * config->overload_factor_transverse_general; +} + void pole::reset_commit_accumulators() // Called "accumulators" because multiple threads can { // add to them. - equipment_moment_nowind = 0.0; - wire_load_nowind = 0.0; // Updated in pole_mount sync, not used anywhere else in this file - wire_moment_nowind = 0.0; + equipment_moment_per_wind = 0.0; + wire_load_per_wind = 0.0; // Updated in pole_mount sync, not used anywhere else in this file + wire_moment_per_wind = 0.0; pole_moment = 0.0; pole_moment_wind = 0.0; equipment_moment = 0.0; @@ -230,6 +268,7 @@ int pole::create(void) config = NULL; last_wind_speed = 0.0; last_wind_speed = 0.0; + diameter = 0.0; down_time = TS_NEVER; current_hollow_diameter = 0.0; total_moment = 0.0; @@ -237,7 +276,7 @@ int pole::create(void) pole_stress = 0.0; critical_wind_speed = 0.0; susceptibility = 0.0; - pole_moment_nowind = 0.0; + pole_moment_per_wind = 0.0; reset_commit_accumulators(); reset_sync_accumulators(); wind_speed_ref = NULL; @@ -338,40 +377,36 @@ int pole::init(OBJECT *parent) } // tilt - if ( tilt_angle < 0 || tilt_angle > 90 ) + if ( tilt_degree < 0 || tilt_degree > 90 ) { error("pole tilt angle is not between and 0 and 90 degrees"); return 0; } - verbose("tilt_angle = %g deg",tilt_angle); + verbose("tilt_degree = %g deg",tilt_degree); if ( tilt_direction < 0 || tilt_direction >= 360 ) { error("pole tilt direction is not between 0 and 360 degrees"); - return 0; + return 0; // Why not just take the tilt_direction modulo 360? } verbose("tilt_direction = %g deg",tilt_direction); // effective pole height // height above the ground minus guy wire height (how far it extends without support, a.k.a. from where it would snap) - height = config->pole_length - config->pole_depth - guy_height; + height = calc_height(); verbose("height = %g ft",height); + + // diameter at effective pole height + diameter = calc_diameter(); - // calculation resisting moment - // diameter at effective pole height, using linear interpolation from pole top diameter and ground diameter - // diameter = top diameter + height difference from top * (change in diameter / change in height) - double diameter = config->top_diameter - + height*(config->ground_diameter-config->top_diameter) - /(config->pole_length - config->pole_depth); - + // calculation resisting moment resisting_moment = 0.008186 * config->strength_factor_250b_wood // decreases the rated material strength by a safety factor to account for uncertainty. * config->fiber_strength // max stress that can be applied at a point in the material (psi) * ( diameter * diameter * diameter); // diameter cubed verbose("resisting_moment = %.0f ft*lb (not aged)",resisting_moment); - // pole moment per unit of wind pressure - pole_moment_nowind = height * height * (diameter+2*config->top_diameter)/72 * config->overload_factor_transverse_general * cos(tilt_angle/180*PI); - verbose("pole_moment_nowind = %g ft*lb (wind load is 1 lb/sf)",pole_moment_nowind); + pole_moment_per_wind = calc_pole_moment_per_wind(); + verbose("pole_moment_per_wind = %g ft*lb (wind load is 1 lb/sf)",pole_moment_per_wind); // check install year if ( install_year > gl_globalclock ) @@ -402,9 +437,8 @@ TIMESTAMP pole::precommit(TIMESTAMP t0) { temperature = temp_ref->get_double(); } - height = config->pole_length - config->pole_depth - guy_height; - double diameter = config->top_diameter - + height*(config->ground_diameter-config->top_diameter)/(config->pole_length-config->pole_depth); + height = calc_height(); // effective pole height (length of unsupported pole) + diameter = calc_diameter(); // diameter at effective pole height double t0_year = 1970 + (int)(t0/86400/365.24); double age = t0_year - install_year; if ( age > 0 && config->degradation_rate > 0 ) @@ -430,7 +464,7 @@ TIMESTAMP pole::precommit(TIMESTAMP t0) if ( pole_status == PS_FAILED && (gl_globalclock-down_time)/3600.0 > repair_time ) { verbose("pole repair time has arrived"); - tilt_angle = 0.0; + tilt_degree = 0.0; tilt_direction = 0.0; pole_status = PS_OK; install_year = 1970 + (unsigned int)(t0/86400/365.24); @@ -450,24 +484,23 @@ TIMESTAMP pole::precommit(TIMESTAMP t0) wind_pressure = 0.00256 * (2.24*wind_speed) * (2.24*wind_speed); // 2.24 account for m/s to mph conversion verbose("wind_pressure = %g psf",wind_pressure); // unit: pounds per square foot - if ( tilt_angle > 0.0 ) + if ( tilt_degree > 0.0 ) { const double D1 = config->top_diameter/12; const double D0 = (diameter-current_hollow_diameter)/12; - const double rho = config->material_density; - pole_moment += 0.125 * rho * PI * height * height * sin(tilt_angle/180*PI) * ((D0+D1)*(D0+D1)/6 + D1*D1/3); + const double density = config->material_density; + pole_moment += 0.125 * density * PI * height * height * sin(tilt_degree/180*PI) * ((D0+D1)*(D0+D1)/6 + D1*D1/3); } verbose("pole_moment = %g ft*lb (tilt moment)",pole_moment); // TODO: this needs to be moved to commit in order to consider equipment and wire wind susceptibility - pole_moment_nowind = height * height * (diameter+2*config->top_diameter)/72 - * config->overload_factor_transverse_general * cos(tilt_angle/180*PI); - verbose("pole_moment_nowind = %g ft*lb (wind load is 1 lb/sf)",pole_moment_nowind); + pole_moment_per_wind = calc_pole_moment_per_wind(); + verbose("pole_moment_per_wind = %g ft*lb (wind load is 1 lb/sf)",pole_moment_per_wind); last_wind_speed = wind_speed; if ( wind_pressure > 0.0 ) { - pole_moment_wind = wind_pressure * pole_moment_nowind; + pole_moment_wind = wind_pressure * pole_moment_per_wind; verbose("pole_moment_wind = %g ft*lb",pole_moment_wind); } @@ -504,9 +537,10 @@ TIMESTAMP pole::postsync(TIMESTAMP t0) //// verbose("equipment_moment_x = %g ft*lb (moment in x-axis)", equipment_moment_x); verbose("equipment_moment_y = %g ft*lb (moment in y-axis)", equipment_moment_y); - - double pole_moment_x = pole_moment_wind*cos(wind_direction*PI/180)+pole_moment*cos(tilt_angle/180*PI); - double pole_moment_y = pole_moment_wind*sin(wind_direction*PI/180)+pole_moment*sin(tilt_angle/180*PI); + // Adds x-components of moments due to wind on pole and pole weight, tilt. + // Then does the same for y. + double pole_moment_x = pole_moment_wind*cos(wind_direction*PI/180)+pole_moment*cos(tilt_direction/180*PI); + double pole_moment_y = pole_moment_wind*sin(wind_direction*PI/180)+pole_moment*sin(tilt_direction/180*PI); verbose("pole_moment_x = %g ft*lb (moment in x-axis)", pole_moment_x); verbose("pole_moment_y = %g ft*lb (moment in y-axis)", pole_moment_y); // Total moment on a pole results from @@ -515,8 +549,8 @@ TIMESTAMP pole::postsync(TIMESTAMP t0) //// // and the equipment mounted on the pole. // Plus a transverse (perpendicular to the wires) load due to an angle // in the conductors on the pole. - - // - wire moment covers tension, wind and weight of the lines + + // - wire moment covers tension, wind on, and weight of the lines // - equipment moment covers gravitational load (equipment weight, // pole tilt) and wind load (based on cross-sectional area of equipment) // - pole moment covers pole weight and the wind on the pole @@ -538,8 +572,9 @@ TIMESTAMP pole::postsync(TIMESTAMP t0) //// verbose("pole_stress = %g %%\n",pole_stress*100); if ( wind_speed > 0.0 ) // d(total_moment)/d(wind_speed) - // susceptibility = 2*(pole_moment+equipment_moment+wire_wind)/resisting_moment/(wind_speed)/(0.00256)/(2.24); - susceptibility = (cos(wind_direction*PI/180) + sin(wind_direction*PI/180)) * (pole_moment_nowind+equipment_moment_nowind+wire_moment_nowind) * ( + // susceptibility = 2*(pole_moment+equipment_moment+ + )/resisting_moment/(wind_speed)/(0.00256)/(2.24); + susceptibility = (cos(wind_direction*PI/180) + sin(wind_direction*PI/180)) * (pole_moment_per_wind+equipment_moment_per_wind+wire_moment_per_wind) * ( (wire_moment_x+equipment_moment_x+pole_moment_x) + (wire_moment_y+equipment_moment_y+pole_moment_y) ) * (0.00256*2*2.24*wind_speed*2.24) / total_moment; else @@ -549,7 +584,7 @@ TIMESTAMP pole::postsync(TIMESTAMP t0) //// double effective_moment = resisting_moment * (1+config->wind_overdesign); double wind_pressure_failure = sqrt( effective_moment*effective_moment - (wire_weight+equipment_weight+pole_moment)*(wire_weight+equipment_weight+pole_moment)) - / (pole_moment_nowind+equipment_moment_nowind+wire_moment_nowind); // ignore wire_tension + / (pole_moment_per_wind+equipment_moment_per_wind+wire_moment_per_wind); // ignore wire_tension critical_wind_speed = sqrt(wind_pressure_failure / (0.00256 * 2.24 * 2.24)); verbose("wind_pressure_failure = %g psf (overdesighn facter = %g)",wind_pressure_failure,config->wind_overdesign); // unit: pounds per square foot verbose("critical_wind_speed = %g m/s",critical_wind_speed); @@ -570,7 +605,7 @@ TIMESTAMP pole::postsync(TIMESTAMP t0) //// // // M = a * V^2 + b * V + c // // TODO - // pole_stress_polynomial_a = pole_moment_nowind + equipment_moment_nowind + wire_moment_nowind; + // pole_stress_polynomial_a = pole_moment_per_wind + equipment_moment_per_wind + wire_moment_per_wind; // pole_stress_polynomial_b = 0.0; // pole_stress_polynomial_c = wire_tension; diff --git a/module/powerflow/pole.h b/module/powerflow/pole.h index 9c6a96fe9..a3d6db538 100644 --- a/module/powerflow/pole.h +++ b/module/powerflow/pole.h @@ -25,7 +25,7 @@ class pole : public gld_object GL_ATOMIC(enumeration, pole_status); enum {FT_UNKNOWN=0, FT_FOUNDATION=1, FT_BASE=2, FT_MIDDLE=3, FT_TOP=4}; GL_ATOMIC(enumeration, failure_type); - GL_ATOMIC(double, tilt_angle); + GL_ATOMIC(double, tilt_degree); GL_ATOMIC(double, tilt_direction); GL_ATOMIC(object, configuration); GL_ATOMIC(double, degradation_rate); @@ -36,20 +36,20 @@ class pole : public gld_object GL_ATOMIC(double, wind_direction); GL_ATOMIC(double, wind_gusts); GL_ATOMIC(double, pole_moment); // (see Section D) - GL_ATOMIC(double, pole_moment_nowind); // wire moment without the wind component for wind speed at failure calc + GL_ATOMIC(double, pole_moment_per_wind); // wire moment without the wind component for wind speed at failure calc GL_ATOMIC(double, pole_moment_wind); GL_ATOMIC(double, resisting_moment); // (see Section B) GL_ATOMIC(double, equipment_moment); // (see Section E) GL_ATOMIC(double, equipment_weight); // (see Section E) - GL_ATOMIC(double, equipment_moment_nowind); // wire moment without the wind component for wind speed at failure calc + GL_ATOMIC(double, equipment_moment_per_wind); // wire moment without the wind component for wind speed at failure calc GL_ATOMIC(double, wire_wind); // (see Section F) - GL_ATOMIC(double, wire_load_nowind); // wire moment without the wind component for wind speed at failure calc + GL_ATOMIC(double, wire_load_per_wind); // wire moment without the wind component for wind speed at failure calc GL_ATOMIC(double, wire_weight); // (see Section F) GL_ATOMIC(double, wire_moment_x); // wire moment in x-axis due to tension and wind load GL_ATOMIC(double, wire_moment_y); // wire moment in y-axis due to tension and wind load GL_ATOMIC(double, equipment_moment_x); // equipment moment in x-axis due to wind load GL_ATOMIC(double, equipment_moment_y); // equipment moment in y-axis due to wind load - GL_ATOMIC(double, wire_moment_nowind); // wire moment without the wind component for wind speed at failure calc + GL_ATOMIC(double, wire_moment_per_wind); // wire moment without the wind component for wind speed at failure calc GL_ATOMIC(double, wind_pressure); // (see Section D) GL_ATOMIC(double, wire_tension); // (see Section G) GL_ATOMIC(double, pole_stress); // ratio of total to resisting moment @@ -70,10 +70,14 @@ class pole : public gld_object private: void reset_commit_accumulators(); void reset_sync_accumulators(); + double calc_height(); + double calc_diameter(); + double calc_pole_moment_per_wind(); private: class pole_configuration *config; double last_wind_speed; TIMESTAMP down_time; + double diameter; // diameter at effective pole height, using linear interpolation from pole top diameter and ground diameter public: double height; // effective pole height for moment calculations bool recalc; // flag for recalculation diff --git a/module/powerflow/pole_mount.cpp b/module/powerflow/pole_mount.cpp index 18c84372d..d1445287f 100644 --- a/module/powerflow/pole_mount.cpp +++ b/module/powerflow/pole_mount.cpp @@ -140,7 +140,9 @@ int pole_mount::init(OBJECT *parent) verbose("line_configuration = %s",line->configuration ? line->configuration->name : "(NA)"); class line_spacing *spacing = OBJECTDATA(config->line_spacing,class line_spacing); verbose("line_spacing = %s",config->line_spacing ? config->line_spacing->name : "(NA)"); - class overhead_line_conductor *conductor[] = { + // An array containing the 3 phases and neutral line connected to the pole. + // If a pole does not have a given line connected to it, that will be NULL in the array. ?? Double Check this. + class overhead_line_conductor *conductors[] = { OBJECTDATA(config->phaseA_conductor,class overhead_line_conductor), OBJECTDATA(config->phaseB_conductor,class overhead_line_conductor), OBJECTDATA(config->phaseC_conductor,class overhead_line_conductor), @@ -152,87 +154,98 @@ int pole_mount::init(OBJECT *parent) config->phaseN_conductor ? config->phaseN_conductor->name : "(NA)"); pole *mount = OBJECTDATA(my()->parent,pole); pole_configuration *pole_config = OBJECTDATA(mount->get_configuration(),pole_configuration); - double pole_tilt = mount->get_tilt_angle()*PI/180; + double pole_tilt = mount->get_tilt_degree()*PI/180; double D1 = pole_config->top_diameter/12; double D0 = pole_config->ground_diameter/12; - double H = pole_config->pole_length - pole_config->pole_depth; + double H = pole_config->pole_length - pole_config->pole_depth; // height above ground + // E means Earth, so distance_#toE means distance from that wire to the ground in feet: double radius_A = D0 - spacing->distance_AtoE *(D0-D1)/H; double radius_B = D0 - spacing->distance_BtoE *(D0-D1)/H; double radius_C = D0 - spacing->distance_CtoE *(D0-D1)/H; double radius_N = D0 - spacing->distance_NtoE *(D0-D1)/H; + // The sum of the weights of all the conductors on the pole. + // Uses the ternary operator (condition ? execute_on_true : execute_on_false) + // to check if each conductor exists, uses the weight if so, zero if not. weight = ( - (conductor[0]?conductor[0]->get_cable_weight():0.0) + - (conductor[1]?conductor[1]->get_cable_weight():0.0) + - (conductor[2]?conductor[2]->get_cable_weight():0.0) + - (conductor[3]?conductor[3]->get_cable_weight():0.0) ) * pole_spacing / 2; + (conductors[0]?conductors[0]->get_cable_weight():0.0) + // cable_weight is in lbs/ft + (conductors[1]?conductors[1]->get_cable_weight():0.0) + + (conductors[2]?conductors[2]->get_cable_weight():0.0) + + (conductors[3]?conductors[3]->get_cable_weight():0.0) ) * pole_spacing / 2; verbose("cable weight = %g lbs (half)",weight); if (pole_tilt == 0.0) { // when the pole is not tilted, the weight moment is cable_weight*radius - line_moment_weight = pole_config->overload_factor_vertical * ( - radius_A*(conductor[0]?conductor[0]->get_cable_weight() + - 0.39744*PI*(conductor[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) + - radius_B*(conductor[1]?conductor[1]->get_cable_weight() + - 0.39744*PI*(conductor[1]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) + - radius_C * (conductor[2]?conductor[2]->get_cable_weight() + - 0.39744*PI*(conductor[2]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) + - radius_N * (conductor[3]?conductor[3]->get_cable_weight() + - 0.39744*PI*(conductor[3]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) + wire_moment_weight = pole_config->overload_factor_vertical * ( + radius_A*(conductors[0]?conductors[0]->get_cable_weight() + + 0.39744*PI* (conductors[0]->cable_diameter + line->get_ice_thickness()) *line->get_ice_thickness():0.0) + + radius_B*(conductors[1]?conductors[1]->get_cable_weight() + + 0.39744*PI*(conductors[1]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) + + radius_C * (conductors[2]?conductors[2]->get_cable_weight() + + 0.39744*PI*(conductors[2]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) + + radius_N * (conductors[3]?conductors[3]->get_cable_weight() + + 0.39744*PI*(conductors[3]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) ) * pole_spacing / 2; // 1/2 works for poles at the same elevation level, 0.39744 is ice density in lbs/in2ft } else { // when the pole is tilted, the weight moment is part of cable_weight*radius and cable_weight*mount_hight // everything below the guyed height is IGNORED for now - line_moment_weight = pole_config->overload_factor_vertical * (( - radius_A*(conductor[0]?conductor[0]->get_cable_weight()+0.39744*PI*( - conductor[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) - + radius_B*(conductor[0]?conductor[0]->get_cable_weight()+0.39744*PI*( - conductor[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) - + radius_C*(conductor[0]?conductor[0]->get_cable_weight()+0.39744*PI*( - conductor[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) - + radius_N*(conductor[0]?conductor[0]->get_cable_weight()+0.39744*PI*( - conductor[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) + wire_moment_weight = pole_config->overload_factor_vertical * (( + radius_A*(conductors[0]?conductors[0]->get_cable_weight()+0.39744*PI*( + conductors[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) + + radius_B*(conductors[0]?conductors[0]->get_cable_weight()+0.39744*PI*( + conductors[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) + + radius_C*(conductors[0]?conductors[0]->get_cable_weight()+0.39744*PI*( + conductors[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) + + radius_N*(conductors[0]?conductors[0]->get_cable_weight()+0.39744*PI*( + conductors[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) ) * cos(pole_tilt) + ( - (spacing->distance_AtoE-mount->get_guy_height())*(conductor[0]?conductor[0]->get_cable_weight()+0.39744*PI*( - conductor[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) - +(spacing->distance_BtoE-mount->get_guy_height())*(conductor[0]?conductor[0]->get_cable_weight()+0.39744*PI*( - conductor[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) - +(spacing->distance_CtoE-mount->get_guy_height())*(conductor[0]?conductor[0]->get_cable_weight()+0.39744*PI*( - conductor[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) - +(spacing->distance_NtoE-mount->get_guy_height())*(conductor[0]?conductor[0]->get_cable_weight()+0.39744*PI*( - conductor[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) + (spacing->distance_AtoE-mount->get_guy_height())*(conductors[0]?conductors[0]->get_cable_weight()+0.39744*PI*( + conductors[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) + +(spacing->distance_BtoE-mount->get_guy_height())*(conductors[0]?conductors[0]->get_cable_weight()+0.39744*PI*( + conductors[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) + +(spacing->distance_CtoE-mount->get_guy_height())*(conductors[0]?conductors[0]->get_cable_weight()+0.39744*PI*( + conductors[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) + +(spacing->distance_NtoE-mount->get_guy_height())*(conductors[0]?conductors[0]->get_cable_weight()+0.39744*PI*( + conductors[0]->cable_diameter+line->get_ice_thickness())*line->get_ice_thickness():0.0) ) * sin(pole_tilt)) * pole_spacing / 2; // 1/2 works for poles at the same elevation level } - verbose("line_moment_weight = %g ft*lb (due to the weight of conductor and ice)",line_moment_weight); - double transverse_load_nowind = 1 * ( - (conductor[0]?conductor[0]->cable_diameter+2*line->get_ice_thickness():0.0) + - (conductor[1]?conductor[1]->cable_diameter+2*line->get_ice_thickness():0.0) + - (conductor[2]?conductor[2]->cable_diameter+2*line->get_ice_thickness():0.0) + - (conductor[3]?conductor[3]->cable_diameter+2*line->get_ice_thickness():0.0) + verbose("wire_moment_weight = %g ft*lb (due to the weight of conductors and ice)",wire_moment_weight); + double transverse_load_per_wind = 1 * ( + (conductors[0]?conductors[0]->cable_diameter+2*line->get_ice_thickness():0.0) + + (conductors[1]?conductors[1]->cable_diameter+2*line->get_ice_thickness():0.0) + + (conductors[2]?conductors[2]->cable_diameter+2*line->get_ice_thickness():0.0) + + (conductors[3]?conductors[3]->cable_diameter+2*line->get_ice_thickness():0.0) ) / 12; // unit transverse load on cables when wind load is 1 lb/ft^2 - verbose("transverse_load_nowind = %g lb/ft (wind load is 1 lb/sf)",transverse_load_nowind); - line_load_nowind = transverse_load_nowind * pole_spacing; - verbose("line_load_nowind = %g lb (wind load is 1 lb/sf)",line_load_nowind); - // everything below the guyed height is ignored - line_moment_nowind = 1 * pole_spacing * cos(pole_tilt) * pole_config->overload_factor_transverse_wire * ( - (spacing->distance_AtoE-mount->get_guy_height()) * (conductor[0]?conductor[0]->cable_diameter+2*line->get_ice_thickness():0.0) + - (spacing->distance_BtoE-mount->get_guy_height()) * (conductor[1]?conductor[1]->cable_diameter+2*line->get_ice_thickness():0.0) + - (spacing->distance_CtoE-mount->get_guy_height()) * (conductor[2]?conductor[2]->cable_diameter+2*line->get_ice_thickness():0.0) + - (spacing->distance_NtoE-mount->get_guy_height()) * (conductor[3]?conductor[3]->cable_diameter+2*line->get_ice_thickness():0.0) - ) / 12; - verbose("load_moment_nowind = %g ft*lb (wind load is 1 lb/sf)", line_moment_nowind); - strength = (conductor[0]?conductor[0]->get_cable_strength():0.0) - + (conductor[1]?conductor[1]->get_cable_strength():0.0) - + (conductor[2]?conductor[2]->get_cable_strength():0.0) - + (conductor[3]?conductor[3]->get_cable_strength():0.0); + verbose("transverse_load_per_wind = %g lb/ft (wind load is 1 lb/sf)",transverse_load_per_wind); + line_load_per_wind = transverse_load_per_wind * pole_spacing; + verbose("line_load_per_wind = %g lb (wind load is 1 lb/sf)",line_load_per_wind); + // Moment on the pole due to wind on wires = wind pressure * wire_moment_per_wind + // wire_moment_per_wind = wind cross section * height * fractional component of wind force that acts to increase pole tilt + // for every conductor attached. + // wind cross section = wire length * conductor diameter + 2 * ice radius + // wire length (wind span) is approximated as pole_spacing + // The greater the pole tilt, the smaller the component of wind force oriented perpendicular to the pole, + // pulling it down. Hence: cos(pole_tilt). + // Heights are calculated from above guy height. + wire_moment_per_wind = 1 * pole_spacing * cos(pole_tilt) * pole_config->overload_factor_transverse_wire * ( + (spacing->distance_AtoE - mount->get_guy_height()) * (conductors[0]?conductors[0]->cable_diameter+2*line->get_ice_thickness():0.0) + + (spacing->distance_BtoE - mount->get_guy_height()) * (conductors[1]?conductors[1]->cable_diameter+2*line->get_ice_thickness():0.0) + + (spacing->distance_CtoE - mount->get_guy_height()) * (conductors[2]?conductors[2]->cable_diameter+2*line->get_ice_thickness():0.0) + + (spacing->distance_NtoE - mount->get_guy_height()) * (conductors[3]?conductors[3]->cable_diameter+2*line->get_ice_thickness():0.0) + ) / 12; // Unit conversion because cable diameter and ice thickness is in inches. + verbose("load_moment_per_wind = %g ft*lb (wind load is 1 lb/sf)", wire_moment_per_wind); + strength = (conductors[0]?conductors[0]->get_cable_strength():0.0) + + (conductors[1]?conductors[1]->get_cable_strength():0.0) + + (conductors[2]?conductors[2]->get_cable_strength():0.0) + + (conductors[3]?conductors[3]->get_cable_strength():0.0); verbose("strength = %g lb", strength); - line_moment_tension = pole_config->overload_factor_transverse_wire * cos(pole_tilt) * ( - (spacing->distance_AtoE-mount->get_guy_height()) * (conductor[0]?conductor[0]->get_cable_strength():0.0) + - (spacing->distance_BtoE-mount->get_guy_height()) * (conductor[1]?conductor[1]->get_cable_strength():0.0) + - (spacing->distance_CtoE-mount->get_guy_height()) * (conductor[2]?conductor[2]->get_cable_strength():0.0) + - (spacing->distance_NtoE-mount->get_guy_height()) * (conductor[3]?conductor[3]->get_cable_strength():0.0)); - verbose("line_moment_tension = %g ft*lb (moments due to line tension)",line_moment_tension); // moment due to conductor tension + wire_moment_tension = pole_config->overload_factor_transverse_wire * cos(pole_tilt) * ( + (spacing->distance_AtoE - mount->get_guy_height()) * (conductors[0]?conductors[0]->get_cable_strength():0.0) + + (spacing->distance_BtoE - mount->get_guy_height()) * (conductors[1]?conductors[1]->get_cable_strength():0.0) + + (spacing->distance_CtoE - mount->get_guy_height()) * (conductors[2]?conductors[2]->get_cable_strength():0.0) + + (spacing->distance_NtoE - mount->get_guy_height()) * (conductors[3]?conductors[3]->get_cable_strength():0.0)); + verbose("wire_moment_tension = %g ft*lb (moments due to line tension)",wire_moment_tension); // moment due to conductors tension } else { @@ -240,18 +253,18 @@ int pole_mount::init(OBJECT *parent) verbose("equipment = %s",get_equipment()->name); pole *mount = OBJECTDATA(my()->parent,pole); pole_configuration *pole_config = OBJECTDATA(mount->get_configuration(),pole_configuration); - double pole_tilt = mount->get_tilt_angle()*PI/180; + double pole_tilt = mount->get_tilt_degree()*PI/180; verbose("equipment area = %g sf",area); verbose("equipment weight = %g lbs",weight); // the first term is contributed by the weight perpendicular to the pole and the second term is weight moment - equipment_offset = (height-mount->get_guy_height())*sin(pole_tilt)+offset*cos(pole_tilt); + equipment_offset = (height - mount->get_guy_height()) * sin(pole_tilt) + offset*cos(pole_tilt); verbose("equipment_offset = %g (measured in ft)",equipment_offset); equipment_moment_weight = weight * equipment_offset * pole_config->overload_factor_vertical; verbose("equipment_moment_weight = %g ft*lb",equipment_moment_weight); - equipment_load_nowind = 1 * area * cos(pole_tilt); - verbose("equipment_load_nowind = %g lb (wind load is 1 lb/sf)",equipment_load_nowind); - equipment_moment_nowind = (height-mount->get_guy_height())*pole_config->overload_factor_transverse_general*equipment_load_nowind; - verbose("equipment_moment_nowind = %g ft*lb (wind load is 1 lb/sf)", equipment_moment_nowind); + equipment_load_per_wind = 1 * area * cos(pole_tilt); + verbose("equipment_load_per_wind = %g lb (wind load is 1 lb/sf)",equipment_load_per_wind); + equipment_moment_per_wind = (height-mount->get_guy_height())*pole_config->overload_factor_transverse_general*equipment_load_per_wind; + verbose("equipment_moment_per_wind = %g ft*lb (wind load is 1 lb/sf)", equipment_moment_per_wind); } return 1; } @@ -286,18 +299,18 @@ TIMESTAMP pole_mount::precommit(TIMESTAMP t0) if ( equipment_is_line ) { verbose("line weight = %g lbs",weight); - verbose("line_moment_weight = %g ft*lb (due to the weight of conductor and ice)",line_moment_weight); + verbose("wire_moment_weight = %g ft*lb (due to the weight of conductors and ice)",wire_moment_weight); verbose("line strength = %g lb", strength); - verbose("line_moment_tension = %g ft*lb (moments due to line tension)", line_moment_tension); // moment due to conductor tension - verbose("line_load_nowind = %g lb",line_load_nowind); - verbose("load_moment_nowind = %g ft*lb (wind load is 1 lb/sf)", line_moment_nowind); + verbose("wire_moment_tension = %g ft*lb (moments due to line tension)", wire_moment_tension); // moment due to conductors tension + verbose("line_load_per_wind = %g lb",line_load_per_wind); + verbose("load_moment_per_wind = %g ft*lb (wind load is 1 lb/sf)", wire_moment_per_wind); } else { verbose("equipment weight = %g lbs",weight); - verbose("equipment_moment_weight = %g ft*lb (due to the weight of conductor and ice)",equipment_moment_weight); - verbose("equipment_load_nowind = %g lb",equipment_load_nowind); - verbose("equipment_moment_nowind = %g ft*lb (wind load is 1 lb/sf)", equipment_moment_nowind); + verbose("equipment_moment_weight = %g ft*lb (due to the weight of conductors and ice)",equipment_moment_weight); + verbose("equipment_load_per_wind = %g lb",equipment_load_per_wind); + verbose("equipment_moment_per_wind = %g ft*lb (wind load is 1 lb/sf)", equipment_moment_per_wind); } return TS_NEVER; } @@ -315,9 +328,9 @@ TIMESTAMP pole_mount::sync(TIMESTAMP t0) { // - pole_mount update moment accumulators pole *mount = OBJECTDATA(my()->parent,pole); - double pole_tilt = mount->get_tilt_angle()*PI/180; + double pole_tilt = mount->get_tilt_degree()*PI/180; double pole_tilt_dir = mount->get_tilt_direction()*PI/180; - double theta = direction*PI/180; // direction from pole centerline at which equipment is mounted. + double mount_dir = direction*PI/180; // direction from pole centerline at which equipment is mounted. if ( mount->recalc ) { verbose("%s recalculation flag set",my()->parent->name); @@ -325,26 +338,26 @@ TIMESTAMP pole_mount::sync(TIMESTAMP t0) verbose("pole_mount wind_speed = %g m/s",wind_speed); if ( equipment_is_line ) { - // line_moment_nowind represents the components of the equation for moment on the - // pole due to wind other than the wind itself (i.e. cross-sectional area * torque radius) - line_moment_wind = line_moment_nowind * wind_pressure * abs(sin((wind_direction-direction)*PI/180)); - verbose("line_moment_wind = %g ft*lb",line_moment_wind); // the line moment due to wind - mount->set_wire_wind(mount->get_wire_wind() + line_moment_wind ); // moment due to wind load on wires - mount->set_wire_load_nowind(mount->get_wire_load_nowind() + line_load_nowind); - mount->set_wire_weight(mount->get_wire_weight() + line_moment_weight); // moment due to conductor weight - mount->set_wire_moment_nowind(mount->get_wire_moment_nowind() + line_moment_nowind); - mount->set_wire_tension(mount->get_wire_tension() + line_moment_tension); // moment due to conductor tension - double x = ( line_moment_tension + line_moment_wind ) * cos(theta); - double y = ( line_moment_tension + line_moment_wind ) * sin(theta); + // wire_moment_per_wind represents the moment on the pole due to wind on the lines per unit wind pressure + // (i.e. cross-sectional area * torque radius) + wire_moment_wind = wire_moment_per_wind * wind_pressure * abs(sin((wind_direction-direction)*PI/180)); + verbose("wire_moment_wind = %g ft*lb",wire_moment_wind); + mount->set_wire_wind(mount->get_wire_wind() + wire_moment_wind ); // moment due to wind load on wires + mount->set_wire_load_per_wind(mount->get_wire_load_per_wind() + line_load_per_wind); + mount->set_wire_weight(mount->get_wire_weight() + wire_moment_weight); // moment due to conductors weight + mount->set_wire_moment_per_wind(mount->get_wire_moment_per_wind() + wire_moment_per_wind); + mount->set_wire_tension(mount->get_wire_tension() + wire_moment_tension); // moment due to conductors tension + double x = ( wire_moment_tension + wire_moment_wind ) * cos(mount_dir); + double y = ( wire_moment_tension + wire_moment_wind ) * sin(mount_dir); if ( pole_tilt > 0.0 ) { - x += line_moment_weight * cos(pole_tilt_dir); - y += line_moment_weight * sin(pole_tilt_dir); + x += wire_moment_weight * cos(pole_tilt_dir); + y += wire_moment_weight * sin(pole_tilt_dir); } else { - x += line_moment_weight * cos(theta); - y += line_moment_weight * sin(theta); + x += wire_moment_weight * cos(mount_dir); + y += wire_moment_weight * sin(mount_dir); } verbose("wire moment (tension, wind and weight) x = %g ft*lb",x); verbose("wire moment (tension, wind and weight) y = %g ft*lb",y); @@ -353,8 +366,8 @@ TIMESTAMP pole_mount::sync(TIMESTAMP t0) } else { - mount->set_equipment_moment_nowind(mount->get_equipment_moment_nowind()+equipment_moment_nowind); - equipment_moment_wind = wind_pressure*equipment_moment_nowind; + mount->set_equipment_moment_per_wind(mount->get_equipment_moment_per_wind()+equipment_moment_per_wind); + equipment_moment_wind = wind_pressure*equipment_moment_per_wind; verbose("equipment_moment_wind = %g ft*lb",equipment_moment_wind); double x = equipment_moment_wind * cos(wind_direction*PI/180); double y = equipment_moment_wind * sin(wind_direction*PI/180); @@ -365,8 +378,8 @@ TIMESTAMP pole_mount::sync(TIMESTAMP t0) } else { - x += equipment_moment_weight * cos(theta); - y += equipment_moment_weight * sin(theta); + x += equipment_moment_weight * cos(mount_dir); + y += equipment_moment_weight * sin(mount_dir); } verbose("equipment_moment_wind x = %g ft*lb",x); verbose("equipment_moment_wind y = %g ft*lb",y); diff --git a/module/powerflow/pole_mount.h b/module/powerflow/pole_mount.h index 2b9a0a834..7c277ac83 100644 --- a/module/powerflow/pole_mount.h +++ b/module/powerflow/pole_mount.h @@ -28,17 +28,17 @@ class pole_mount : public gld_object private: double equipment_moment_weight; double equipment_moment_wind; - double equipment_moment_nowind; - double equipment_load_nowind; + double equipment_moment_per_wind; + double equipment_load_per_wind; gld_property *pole_status; gld_property *equipment_status; bool equipment_is_line; double strength; - double line_moment_weight; - double line_moment_wind; - double line_moment_nowind; - double line_moment_tension; - double line_load_nowind; + double wire_moment_weight; + double wire_moment_wind; + double wire_moment_per_wind; + double wire_moment_tension; + double line_load_per_wind; double equipment_offset; public: pole_mount(MODULE *); diff --git a/python/external/nreca/Configuration.py b/python/external/nreca/Configuration.py index 7a6404858..becad6608 100644 --- a/python/external/nreca/Configuration.py +++ b/python/external/nreca/Configuration.py @@ -763,7 +763,7 @@ def ConfigurationFunc(config_file, classification=None): '', #12 # efficiency [unit] -- set by panel type selection if not set here: '', #13 # area [sf] -- default is 323 #TODO: should they be allowed to change this since it's figured out according to load size? '', #14 # shading_factor -- default is 1 (no shading) - '20', #15 # tilt_angle -- default is 45 degrees + '20', #15 # tilt_degree -- default is 45 degrees '', #16 # orientation_azimuth -- default is 0 (equator facing) '', #17 # latitude_angle_fix (TRUE|FALSE) -- default is false (this fixes tilt angle to regions latitude as determined by the included climate info 'FIXED_AXIS'] #18 # orientation (FIXED|DEFAULT) -- default is DEFAULT, which means tracking diff --git a/python/external/nreca/Sid_New/Sid_add_glm_object_dictionary.py b/python/external/nreca/Sid_New/Sid_add_glm_object_dictionary.py index e91347f37..fa662e83c 100644 --- a/python/external/nreca/Sid_New/Sid_add_glm_object_dictionary.py +++ b/python/external/nreca/Sid_New/Sid_add_glm_object_dictionary.py @@ -546,7 +546,7 @@ def create_glm_object_dictionary(glm_dict,glm_object,glm_parameters): # 31 : 'Rated_kVA' # 32 : 'weather' # 33 : 'shading_factor' - # 34 : 'tilt_angle' + # 34 : 'tilt_degree' # 35 : 'orientation_azimuth' # 36 : 'latitude_angle_fix' # 37 : 'orientation' @@ -930,7 +930,7 @@ def create_object(glm_props, obj): 'csvreader' : ['name','groupid','filename','timefmt','timezone','comments'], #'inverter' : ['name','groupid','parent','generator_status','generator_mode','inverter_type','four_quadrant_control_mode','coupling_inductance_type','control_mode_switch','V_In','I_In','power_factor','P_Out','Q_Out','use_multipoint_efficiency','inverter_manufacturer','maximum_dc_power','maximum_dc_voltage','minimum_dc_power','c_o','c_1','c_2','c_3','nominal_frequency','initial_inverter_frequency','PLL_measured_frequency','nominal_VRMSLG','measured_VRMSLL','coupling_L1','coupling_L2','coupling_C','constant_PQ_KPPLL','constant_PQ_KIPLL','constant_PQ_KPP','constant_PQ_KIP','constant_PQ_KPQ','constant_PQ_KIQ','constant_PQ_T_MeasP','constant_PQ_T_MeasQ','constant_PQ_T_MeasV','constant_PQ_TPRefFilter','constant_PQ_TQRefFilter','constant_PQ_vt_max_angle_ref','constant_PQ_vt_min_angle_ref','constant_PQ_vt_max_mag_ref','constant_PQ_vt_min_mag_ref','droop_PQ_KPPLL','droop_PQ_KIPLL','droop_PQ_KPP','droop_PQ_KIP','droop_PQ_KPQ','droop_PQ_KIQ','droop_PQ_T_MeasP','droop_PQ_T_MeasQ','droop_PQ_T_MeasV','droop_PQ_TPRefFilter','droop_PQ_TQRefFilter','droop_PQ_vt_max_angle_ref','droop_PQ_vt_min_angle_ref','droop_PQ_vt_max_mag_ref','droop_PQ_vt_min_mag_ref','droop_P1','droop_P2','droop_Q1','droop_Q2','droop_f1','droop_f2','droop_V1','droop_V2','islanded_state','comments'], 'inverter' : ['name','parent','generator_status','generator_mode','inverter_type','power_factor', 'rated_power'], - #'solar' : ['name','groupid','parent','generator_status','generator_mode','panel_type','power_type','INSTALLATION_TYPE','SOLAR_TILT_MODEL','SOLAR_POWER_MODEL','a_coeff','b_coeff','dT_coeff','T_coeff','NOCT','Tmodule','Tambient','wind_speed','ambient_temperature','Insolation','Rinternal','Rated_Insolation','Pmax_temp_coeff','Voc_temp_coeff','V_Max','Voc_Max','Voc','efficiency','area','soiling','derating','Rated_kVA','weather','shading_factor','tilt_angle','orientation_azimuth','latitude_angle_fix','orientation','phases','comments'], + #'solar' : ['name','groupid','parent','generator_status','generator_mode','panel_type','power_type','INSTALLATION_TYPE','SOLAR_TILT_MODEL','SOLAR_POWER_MODEL','a_coeff','b_coeff','dT_coeff','T_coeff','NOCT','Tmodule','Tambient','wind_speed','ambient_temperature','Insolation','Rinternal','Rated_Insolation','Pmax_temp_coeff','Voc_temp_coeff','V_Max','Voc_Max','Voc','efficiency','area','soiling','derating','Rated_kVA','weather','shading_factor','tilt_degree','orientation_azimuth','latitude_angle_fix','orientation','phases','comments'], 'solar' : ['name','parent','generator_status','generator_mode','panel_type', 'area', 'efficiency'], 'auction' : ['name','groupid','type','unit','period','latency','market_id','price_cap','special_mode','statistic_mode','fixed_price','fixed_quantity','capacity_reference_object','capacity_reference_property','capacity_reference_bid_price','capacity_reference_bid_quantity','max_capacity_reference_bid_quantity','init_price','init_stdev','future_mean_price','use_future_mean_price','margin_mode','warmup','transaction_log_file','curve_log_file','curve_log_info','comments'], 'controller' : ['name','groupid','simple_mode','bid_mode','use_override','control_mode','resolve_mode','ramp_low','ramp_high','range_low','range_high','target','setpoint','demand','load','total','market','state','avg_target','std_target','base_setpoint','period','slider_setting','slider_setting_heat','slider_setting_cool','override','heating_range_high','heating_range_low','heating_ramp_high','heating_ramp_low','cooling_range_high','cooling_range_low','cooling_ramp_high','cooling_ramp_low','heating_base_setpoint','cooling_base_setpoint','deadband','heating_setpoint','heating_demand','cooling_setpoint','cooling_demand','sliding_time_delay','use_predictive_bidding','comments'], diff --git a/python/external/nreca/add_glm_object_dictionary.py b/python/external/nreca/add_glm_object_dictionary.py index 9d0e6d6d6..51a545cca 100644 --- a/python/external/nreca/add_glm_object_dictionary.py +++ b/python/external/nreca/add_glm_object_dictionary.py @@ -546,7 +546,7 @@ def create_glm_object_dictionary(glm_dict,glm_object,glm_parameters): # 31 : 'Rated_kVA' # 32 : 'weather' # 33 : 'shading_factor' - # 34 : 'tilt_angle' + # 34 : 'tilt_degree' # 35 : 'orientation_azimuth' # 36 : 'latitude_angle_fix' # 37 : 'orientation' @@ -928,7 +928,7 @@ def create_object(glm_props, obj): 'climate' : ['name','groupid','temperature','tmyfile','interpolate','comments'], 'csvreader' : ['name','groupid','filename','timefmt','timezone','comments'], 'inverter' : ['name','groupid','parent','generator_status','generator_mode','inverter_type','four_quadrant_control_mode','coupling_inductance_type','control_mode_switch','V_In','I_In','power_factor','P_Out','Q_Out','use_multipoint_efficiency','inverter_manufacturer','maximum_dc_power','maximum_dc_voltage','minimum_dc_power','c_o','c_1','c_2','c_3','nominal_frequency','initial_inverter_frequency','PLL_measured_frequency','nominal_VRMSLG','measured_VRMSLL','coupling_L1','coupling_L2','coupling_C','constant_PQ_KPPLL','constant_PQ_KIPLL','constant_PQ_KPP','constant_PQ_KIP','constant_PQ_KPQ','constant_PQ_KIQ','constant_PQ_T_MeasP','constant_PQ_T_MeasQ','constant_PQ_T_MeasV','constant_PQ_TPRefFilter','constant_PQ_TQRefFilter','constant_PQ_vt_max_angle_ref','constant_PQ_vt_min_angle_ref','constant_PQ_vt_max_mag_ref','constant_PQ_vt_min_mag_ref','droop_PQ_KPPLL','droop_PQ_KIPLL','droop_PQ_KPP','droop_PQ_KIP','droop_PQ_KPQ','droop_PQ_KIQ','droop_PQ_T_MeasP','droop_PQ_T_MeasQ','droop_PQ_T_MeasV','droop_PQ_TPRefFilter','droop_PQ_TQRefFilter','droop_PQ_vt_max_angle_ref','droop_PQ_vt_min_angle_ref','droop_PQ_vt_max_mag_ref','droop_PQ_vt_min_mag_ref','droop_P1','droop_P2','droop_Q1','droop_Q2','droop_f1','droop_f2','droop_V1','droop_V2','islanded_state','comments'], - 'solar' : ['name','groupid','parent','generator_status','generator_mode','panel_type','power_type','INSTALLATION_TYPE','SOLAR_TILT_MODEL','SOLAR_POWER_MODEL','a_coeff','b_coeff','dT_coeff','T_coeff','NOCT','Tmodule','Tambient','wind_speed','ambient_temperature','Insolation','Rinternal','Rated_Insolation','Pmax_temp_coeff','Voc_temp_coeff','V_Max','Voc_Max','Voc','efficiency','area','soiling','derating','Rated_kVA','weather','shading_factor','tilt_angle','orientation_azimuth','latitude_angle_fix','orientation','phases','comments'], + 'solar' : ['name','groupid','parent','generator_status','generator_mode','panel_type','power_type','INSTALLATION_TYPE','SOLAR_TILT_MODEL','SOLAR_POWER_MODEL','a_coeff','b_coeff','dT_coeff','T_coeff','NOCT','Tmodule','Tambient','wind_speed','ambient_temperature','Insolation','Rinternal','Rated_Insolation','Pmax_temp_coeff','Voc_temp_coeff','V_Max','Voc_Max','Voc','efficiency','area','soiling','derating','Rated_kVA','weather','shading_factor','tilt_degree','orientation_azimuth','latitude_angle_fix','orientation','phases','comments'], 'auction' : ['name','groupid','type','unit','period','latency','market_id','price_cap','special_mode','statistic_mode','fixed_price','fixed_quantity','capacity_reference_object','capacity_reference_property','capacity_reference_bid_price','capacity_reference_bid_quantity','max_capacity_reference_bid_quantity','init_price','init_stdev','future_mean_price','use_future_mean_price','margin_mode','warmup','transaction_log_file','curve_log_file','curve_log_info','comments'], 'controller' : ['name','groupid','simple_mode','bid_mode','use_override','control_mode','resolve_mode','ramp_low','ramp_high','range_low','range_high','target','setpoint','demand','load','total','market','state','avg_target','std_target','base_setpoint','period','slider_setting','slider_setting_heat','slider_setting_cool','override','heating_range_high','heating_range_low','heating_ramp_high','heating_ramp_low','cooling_range_high','cooling_range_low','cooling_ramp_high','cooling_ramp_low','heating_base_setpoint','cooling_base_setpoint','deadband','heating_setpoint','heating_demand','cooling_setpoint','cooling_demand','sliding_time_delay','use_predictive_bidding','comments'], 'passive_controller' : ['name','groupid','control_mode','dlc_mode','input_state','input_setpoint','input_chained','sensitivity','period','expectation_prop','expectation_obj','setpoint_prop','state_prop','observation_obj','observation_prop','mean_observation_prop','stdev_observation_prop','cycle_length','base_setpoint','ramp_high','ramp_low','range_high','range_low','critical_day','two_tier_cpp','daily_elasticity','sub_elasticity_first_second','sub_elasticity_first_third','second_tier_hours','first_tier_hours','first_tier_price','second_tier_price','third_tier_price','linearize_elasticity','price_offset','pool_pump_model','base_duty_cycle','distribution_type','comfort_level','cycle_length_off','cycle_length_on','comments'], diff --git a/python/external/pnnl/Inverter_Function_File.py b/python/external/pnnl/Inverter_Function_File.py index 48d01d7cb..f3cca3260 100644 --- a/python/external/pnnl/Inverter_Function_File.py +++ b/python/external/pnnl/Inverter_Function_File.py @@ -107,7 +107,7 @@ def PV_residential_allocation(feeder_name, sorted_triplex, penetration_kVA, trip if orientation_azimuth<360 and orientation_azimuth > 0: break - tilt_angle = random.choice(range(1,40)) + tilt_degree = random.choice(range(1,40)) if '6' in sorted_triplex['FALSE'].keys(): @@ -164,7 +164,7 @@ def PV_residential_allocation(feeder_name, sorted_triplex, penetration_kVA, trip if sorted_triplex[care][bin_no] == []: del sorted_triplex[care][bin_no] - solar_installation_data.append([tri_meter, PV_residential_weights[care][bin_no]['size'], tilt_angle, orientation_azimuth, triplex_meter_data[tri_meter][0]]) + solar_installation_data.append([tri_meter, PV_residential_weights[care][bin_no]['size'], tilt_degree, orientation_azimuth, triplex_meter_data[tri_meter][0]]) installed_capacity += PV_residential_weights[care][bin_no]['size'] @@ -461,15 +461,15 @@ def residential_solar_create(solar_installation_data, triplex_meter_data, V_1, Q efficiency = [0.2] rated_power_solar = [0] # Rated_kVA = [0] - tilt_angle = [i[2]] + tilt_degree = [i[2]] orientation_azimuth = [i[3]] - if tilt_angle[0] == 0: + if tilt_degree[0] == 0: de_rate_value = 0.89 - if tilt_angle[0] > 0 and tilt_angle[0] <= 15: + if tilt_degree[0] > 0 and tilt_degree[0] <= 15: if orientation_azimuth >0 and orientation_azimuth <= 112.5: de_rate_value = 0.88 if orientation_azimuth > 112.5 and orientation_azimuth <= 157.5: @@ -481,7 +481,7 @@ def residential_solar_create(solar_installation_data, triplex_meter_data, V_1, Q if orientation_azimuth > 247.5: de_rate_value = 0.97 - if tilt_angle[0] > 15 and tilt_angle[0] <= 30: + if tilt_degree[0] > 15 and tilt_degree[0] <= 30: if orientation_azimuth >0 and orientation_azimuth <= 112.5: de_rate_value = 0.84 if orientation_azimuth > 112.5 and orientation_azimuth <= 157.5: @@ -493,7 +493,7 @@ def residential_solar_create(solar_installation_data, triplex_meter_data, V_1, Q if orientation_azimuth > 247.5: de_rate_value = 0.84 - if tilt_angle[0] > 30 and tilt_angle[0] <= 45: + if tilt_degree[0] > 30 and tilt_degree[0] <= 45: if orientation_azimuth >0 and orientation_azimuth <= 112.5: de_rate_value = 0.78 if orientation_azimuth > 112.5 and orientation_azimuth <= 157.5: @@ -505,7 +505,7 @@ def residential_solar_create(solar_installation_data, triplex_meter_data, V_1, Q if orientation_azimuth > 247.5: de_rate_value = 0.78 - if tilt_angle[0] > 45 and tilt_angle[0] <= 60: + if tilt_degree[0] > 45 and tilt_degree[0] <= 60: if orientation_azimuth >0 and orientation_azimuth <= 112.5: de_rate_value = 0.7 if orientation_azimuth > 112.5 and orientation_azimuth <= 157.5: @@ -517,7 +517,7 @@ def residential_solar_create(solar_installation_data, triplex_meter_data, V_1, Q if orientation_azimuth > 247.5: de_rate_value = 0.70 - if tilt_angle[0] > 60 and tilt_angle[0] <= 90: + if tilt_degree[0] > 60 and tilt_degree[0] <= 90: if orientation_azimuth >0 and orientation_azimuth <= 112.5: de_rate_value = 0.52 if orientation_azimuth > 112.5 and orientation_azimuth <= 157.5: @@ -535,7 +535,7 @@ def residential_solar_create(solar_installation_data, triplex_meter_data, V_1, Q orientation = ['FIXED_AXIS'] - glm_parameters = solar_name + SOLAR_POWER_MODEL + parent + generator_status + generator_mode + panel_type + efficiency + rated_power_solar + tilt_angle + orientation_azimuth + orientation + phases + glm_parameters = solar_name + SOLAR_POWER_MODEL + parent + generator_status + generator_mode + panel_type + efficiency + rated_power_solar + tilt_degree + orientation_azimuth + orientation + phases solar_dict = Inverter_add_glm_object_dictionary.create_glm_object_dictionary(solar_dict, 'solar', glm_parameters) @@ -584,11 +584,11 @@ def com_solar_create(com_solar_installation_data, com_meter_data, V_1, Q_1,V_2,Q panel_type = ['SINGLE_CRYSTAL_SILICON'] efficiency = [0.2] rated_power_com_solar = [str(i[1]) + ' kW'] - tilt_angle = [0] + tilt_degree = [0] orientation_azimuth = [0] orientation = ['FIXED_AXIS'] - glm_parameters = solar_name + SOLAR_POWER_MODEL + parent + generator_status + generator_mode + panel_type + efficiency + rated_power_com_solar + tilt_angle + orientation_azimuth + orientation + phases + glm_parameters = solar_name + SOLAR_POWER_MODEL + parent + generator_status + generator_mode + panel_type + efficiency + rated_power_com_solar + tilt_degree + orientation_azimuth + orientation + phases com_solar_dict = Inverter_add_glm_object_dictionary.create_glm_object_dictionary(solar_dict, 'solar', glm_parameters) @@ -1339,7 +1339,7 @@ def PV_residential_allocation_UNIFORM(feeder_name, sorted_triplex, penetration_k if orientation_azimuth<360 and orientation_azimuth > 0: break - tilt_angle = random.choice(range(1,40)) + tilt_degree = random.choice(range(1,40)) care = random.choice(care_choices) bin_no = random.choice(bin_no_choices) @@ -1356,7 +1356,7 @@ def PV_residential_allocation_UNIFORM(feeder_name, sorted_triplex, penetration_k del sorted_triplex[care][bin_no] - solar_installation_data.append([tri_meter, PV_residential_weights[care][bin_no]['size'], tilt_angle, orientation_azimuth, triplex_meter_data[tri_meter]]) + solar_installation_data.append([tri_meter, PV_residential_weights[care][bin_no]['size'], tilt_degree, orientation_azimuth, triplex_meter_data[tri_meter]]) installed_capacity += PV_residential_weights[care][bin_no]['size'] diff --git a/python/external/pnnl/Inverter_add_glm_object_dictionary.py b/python/external/pnnl/Inverter_add_glm_object_dictionary.py index 58deed313..cffeb8438 100644 --- a/python/external/pnnl/Inverter_add_glm_object_dictionary.py +++ b/python/external/pnnl/Inverter_add_glm_object_dictionary.py @@ -546,7 +546,7 @@ def create_glm_object_dictionary(glm_dict,glm_object,glm_parameters): # 31 : 'Rated_kVA' # 32 : 'weather' # 33 : 'shading_factor' - # 34 : 'tilt_angle' + # 34 : 'tilt_degree' # 35 : 'orientation_azimuth' # 36 : 'latitude_angle_fix' # 37 : 'orientation' @@ -959,7 +959,7 @@ def create_object(glm_props, obj): 'csvreader' : ['name','groupid','filename','timefmt','timezone','comments'], #'inverter' : ['name','parent','inverter_type', 'four_quadrant_control_mode', 'generator_status', 'generator_mode','rated_power', 'inverter_efficiency', 'V1', 'Q1', 'V2', 'Q2', 'V3', 'Q3', 'V4', 'Q4'], 'inverter' : ['name','parent','inverter_type', 'four_quadrant_control_mode', 'generator_status', 'generator_mode','rated_power', 'inverter_efficiency', 'V1', 'Q1', 'V2', 'Q2', 'V3', 'Q3', 'V4', 'Q4', 'V_base', 'phases'], - 'solar' : ['name','SOLAR_POWER_MODEL', 'parent','generator_status','generator_mode','panel_type','efficiency','rated_power','tilt_angle','orientation_azimuth','orientation','phases'], + 'solar' : ['name','SOLAR_POWER_MODEL', 'parent','generator_status','generator_mode','panel_type','efficiency','rated_power','tilt_degree','orientation_azimuth','orientation','phases'], 'auction' : ['name','groupid','type','unit','period','latency','market_id','price_cap','special_mode','statistic_mode','fixed_price','fixed_quantity','capacity_reference_object','capacity_reference_property','capacity_reference_bid_price','capacity_reference_bid_quantity','max_capacity_reference_bid_quantity','init_price','init_stdev','future_mean_price','use_future_mean_price','margin_mode','warmup','transaction_log_file','curve_log_file','curve_log_info','comments'], 'controller' : ['name','groupid','simple_mode','bid_mode','use_override','control_mode','resolve_mode','ramp_low','ramp_high','range_low','range_high','target','setpoint','demand','load','total','market','state','avg_target','std_target','base_setpoint','period','slider_setting','slider_setting_heat','slider_setting_cool','override','heating_range_high','heating_range_low','heating_ramp_high','heating_ramp_low','cooling_range_high','cooling_range_low','cooling_ramp_high','cooling_ramp_low','heating_base_setpoint','cooling_base_setpoint','deadband','heating_setpoint','heating_demand','cooling_setpoint','cooling_demand','sliding_time_delay','use_predictive_bidding','comments'], 'passive_controller' : ['name','groupid','control_mode','dlc_mode','input_state','input_setpoint','input_chained','sensitivity','period','expectation_prop','expectation_obj','setpoint_prop','state_prop','observation_obj','observation_prop','mean_observation_prop','stdev_observation_prop','cycle_length','base_setpoint','ramp_high','ramp_low','range_high','range_low','critical_day','two_tier_cpp','daily_elasticity','sub_elasticity_first_second','sub_elasticity_first_third','second_tier_hours','first_tier_hours','first_tier_price','second_tier_price','third_tier_price','linearize_elasticity','price_offset','pool_pump_model','base_duty_cycle','distribution_type','comfort_level','cycle_length_off','cycle_length_on','comments'], diff --git a/python/external/pnnl/Sid_PNNL_Solar.py b/python/external/pnnl/Sid_PNNL_Solar.py index 4239065c8..4cd4f5756 100644 --- a/python/external/pnnl/Sid_PNNL_Solar.py +++ b/python/external/pnnl/Sid_PNNL_Solar.py @@ -104,7 +104,7 @@ def PV_residential_allocation(feeder_name, sorted_triplex, penetration_kVA, trip if orientation_azimuth<360 and orientation_azimuth > 0: break - tilt_angle = random.choice(range(1,40)) + tilt_degree = random.choice(range(1,40)) if '6' in sorted_triplex['FALSE'].keys(): @@ -161,7 +161,7 @@ def PV_residential_allocation(feeder_name, sorted_triplex, penetration_kVA, trip if sorted_triplex[care][bin_no] == []: del sorted_triplex[care][bin_no] - solar_installation_data.append([tri_meter, PV_residential_weights[care][bin_no]['size'], tilt_angle, orientation_azimuth, triplex_meter_data[tri_meter]]) + solar_installation_data.append([tri_meter, PV_residential_weights[care][bin_no]['size'], tilt_degree, orientation_azimuth, triplex_meter_data[tri_meter]]) installed_capacity += PV_residential_weights[care][bin_no]['size'] @@ -454,15 +454,15 @@ def residential_solar_create(solar_installation_data, triplex_meter_data): efficiency = [0.2] rated_power_solar = [0] # Rated_kVA = [0] - tilt_angle = [i[2]] + tilt_degree = [i[2]] orientation_azimuth = [i[3]] - if tilt_angle[0] == 0: + if tilt_degree[0] == 0: de_rate_value = 0.89 - if tilt_angle[0] > 0 and tilt_angle[0] <= 15: + if tilt_degree[0] > 0 and tilt_degree[0] <= 15: if orientation_azimuth >0 and orientation_azimuth <= 112.5: de_rate_value = 0.88 if orientation_azimuth > 112.5 and orientation_azimuth <= 157.5: @@ -474,7 +474,7 @@ def residential_solar_create(solar_installation_data, triplex_meter_data): if orientation_azimuth > 247.5: de_rate_value = 0.97 - if tilt_angle[0] > 15 and tilt_angle[0] <= 30: + if tilt_degree[0] > 15 and tilt_degree[0] <= 30: if orientation_azimuth >0 and orientation_azimuth <= 112.5: de_rate_value = 0.84 if orientation_azimuth > 112.5 and orientation_azimuth <= 157.5: @@ -486,7 +486,7 @@ def residential_solar_create(solar_installation_data, triplex_meter_data): if orientation_azimuth > 247.5: de_rate_value = 0.84 - if tilt_angle[0] > 30 and tilt_angle[0] <= 45: + if tilt_degree[0] > 30 and tilt_degree[0] <= 45: if orientation_azimuth >0 and orientation_azimuth <= 112.5: de_rate_value = 0.78 if orientation_azimuth > 112.5 and orientation_azimuth <= 157.5: @@ -498,7 +498,7 @@ def residential_solar_create(solar_installation_data, triplex_meter_data): if orientation_azimuth > 247.5: de_rate_value = 0.78 - if tilt_angle[0] > 45 and tilt_angle[0] <= 60: + if tilt_degree[0] > 45 and tilt_degree[0] <= 60: if orientation_azimuth >0 and orientation_azimuth <= 112.5: de_rate_value = 0.7 if orientation_azimuth > 112.5 and orientation_azimuth <= 157.5: @@ -510,7 +510,7 @@ def residential_solar_create(solar_installation_data, triplex_meter_data): if orientation_azimuth > 247.5: de_rate_value = 0.70 - if tilt_angle[0] > 60 and tilt_angle[0] <= 90: + if tilt_degree[0] > 60 and tilt_degree[0] <= 90: if orientation_azimuth >0 and orientation_azimuth <= 112.5: de_rate_value = 0.52 if orientation_azimuth > 112.5 and orientation_azimuth <= 157.5: @@ -528,7 +528,7 @@ def residential_solar_create(solar_installation_data, triplex_meter_data): orientation = ['FIXED_AXIS'] - glm_parameters = solar_name + SOLAR_POWER_MODEL + parent + generator_status + generator_mode + panel_type + efficiency + rated_power_solar + tilt_angle + orientation_azimuth + orientation + glm_parameters = solar_name + SOLAR_POWER_MODEL + parent + generator_status + generator_mode + panel_type + efficiency + rated_power_solar + tilt_degree + orientation_azimuth + orientation solar_dict = Sid_add_glm_object_dictionary.create_glm_object_dictionary(solar_dict, 'solar', glm_parameters) @@ -575,11 +575,11 @@ def com_solar_create(com_solar_installation_data, com_meter_data): panel_type = ['SINGLE_CRYSTAL_SILICON'] efficiency = [0.2] rated_power_com_solar = [str(i[1]) + ' kW'] - tilt_angle = [0] + tilt_degree = [0] orientation_azimuth = [0] orientation = ['FIXED_AXIS'] - glm_parameters = solar_name + SOLAR_POWER_MODEL + parent + generator_status + generator_mode + panel_type + efficiency + rated_power_com_solar + tilt_angle + orientation_azimuth + orientation + glm_parameters = solar_name + SOLAR_POWER_MODEL + parent + generator_status + generator_mode + panel_type + efficiency + rated_power_com_solar + tilt_degree + orientation_azimuth + orientation com_solar_dict = Sid_add_glm_object_dictionary.create_glm_object_dictionary(solar_dict, 'solar', glm_parameters) @@ -1226,7 +1226,7 @@ def PV_residential_allocation_UNIFORM(feeder_name, sorted_triplex, penetration_k if orientation_azimuth<360 and orientation_azimuth > 0: break - tilt_angle = random.choice(range(1,40)) + tilt_degree = random.choice(range(1,40)) care = random.choice(care_choices) bin_no = random.choice(bin_no_choices) @@ -1243,7 +1243,7 @@ def PV_residential_allocation_UNIFORM(feeder_name, sorted_triplex, penetration_k del sorted_triplex[care][bin_no] - solar_installation_data.append([tri_meter, PV_residential_weights[care][bin_no]['size'], tilt_angle, orientation_azimuth, triplex_meter_data[tri_meter]]) + solar_installation_data.append([tri_meter, PV_residential_weights[care][bin_no]['size'], tilt_degree, orientation_azimuth, triplex_meter_data[tri_meter]]) installed_capacity += PV_residential_weights[care][bin_no]['size'] diff --git a/python/external/pnnl/Sid_add_glm_object_dictionary.py b/python/external/pnnl/Sid_add_glm_object_dictionary.py index 62009c348..89b41799b 100644 --- a/python/external/pnnl/Sid_add_glm_object_dictionary.py +++ b/python/external/pnnl/Sid_add_glm_object_dictionary.py @@ -546,7 +546,7 @@ def create_glm_object_dictionary(glm_dict,glm_object,glm_parameters): # 31 : 'Rated_kVA' # 32 : 'weather' # 33 : 'shading_factor' - # 34 : 'tilt_angle' + # 34 : 'tilt_degree' # 35 : 'orientation_azimuth' # 36 : 'latitude_angle_fix' # 37 : 'orientation' @@ -960,8 +960,8 @@ def create_object(glm_props, obj): #'inverter' : ['name','groupid','parent','generator_status','generator_mode','inverter_type','four_quadrant_control_mode','coupling_inductance_type','control_mode_switch','V_In','I_In','power_factor','P_Out','Q_Out','use_multipoint_efficiency','inverter_manufacturer','maximum_dc_power','maximum_dc_voltage','minimum_dc_power','c_o','c_1','c_2','c_3','nominal_frequency','initial_inverter_frequency','PLL_measured_frequency','nominal_VRMSLG','measured_VRMSLL','coupling_L1','coupling_L2','coupling_C','constant_PQ_KPPLL','constant_PQ_KIPLL','constant_PQ_KPP','constant_PQ_KIP','constant_PQ_KPQ','constant_PQ_KIQ','constant_PQ_T_MeasP','constant_PQ_T_MeasQ','constant_PQ_T_MeasV','constant_PQ_TPRefFilter','constant_PQ_TQRefFilter','constant_PQ_vt_max_angle_ref','constant_PQ_vt_min_angle_ref','constant_PQ_vt_max_mag_ref','constant_PQ_vt_min_mag_ref','droop_PQ_KPPLL','droop_PQ_KIPLL','droop_PQ_KPP','droop_PQ_KIP','droop_PQ_KPQ','droop_PQ_KIQ','droop_PQ_T_MeasP','droop_PQ_T_MeasQ','droop_PQ_T_MeasV','droop_PQ_TPRefFilter','droop_PQ_TQRefFilter','droop_PQ_vt_max_angle_ref','droop_PQ_vt_min_angle_ref','droop_PQ_vt_max_mag_ref','droop_PQ_vt_min_mag_ref','droop_P1','droop_P2','droop_Q1','droop_Q2','droop_f1','droop_f2','droop_V1','droop_V2','islanded_state','comments'], #'inverter' : ['name','parent','generator_status','inverter_type','four_quadrant_control_mode','power_factor', 'rated_power'], 'inverter' : ['name','parent','generator_mode','generator_status','inverter_efficiency','inverter_type','power_factor', 'rated_power'], - #'solar' : ['name','groupid','parent','generator_status','generator_mode','panel_type','power_type','INSTALLATION_TYPE','SOLAR_TILT_MODEL','SOLAR_POWER_MODEL','a_coeff','b_coeff','dT_coeff','T_coeff','NOCT','Tmodule','Tambient','wind_speed','ambient_temperature','Insolation','Rinternal','Rated_Insolation','Pmax_temp_coeff','Voc_temp_coeff','V_Max','Voc_Max','Voc','efficiency','area','soiling','derating','Rated_kVA','weather','shading_factor','tilt_angle','orientation_azimuth','latitude_angle_fix','orientation','phases','comments'], - 'solar' : ['name','SOLAR_POWER_MODEL', 'parent','generator_status','generator_mode','panel_type','efficiency','rated_power','tilt_angle','orientation_azimuth','orientation'], + #'solar' : ['name','groupid','parent','generator_status','generator_mode','panel_type','power_type','INSTALLATION_TYPE','SOLAR_TILT_MODEL','SOLAR_POWER_MODEL','a_coeff','b_coeff','dT_coeff','T_coeff','NOCT','Tmodule','Tambient','wind_speed','ambient_temperature','Insolation','Rinternal','Rated_Insolation','Pmax_temp_coeff','Voc_temp_coeff','V_Max','Voc_Max','Voc','efficiency','area','soiling','derating','Rated_kVA','weather','shading_factor','tilt_degree','orientation_azimuth','latitude_angle_fix','orientation','phases','comments'], + 'solar' : ['name','SOLAR_POWER_MODEL', 'parent','generator_status','generator_mode','panel_type','efficiency','rated_power','tilt_degree','orientation_azimuth','orientation'], 'auction' : ['name','groupid','type','unit','period','latency','market_id','price_cap','special_mode','statistic_mode','fixed_price','fixed_quantity','capacity_reference_object','capacity_reference_property','capacity_reference_bid_price','capacity_reference_bid_quantity','max_capacity_reference_bid_quantity','init_price','init_stdev','future_mean_price','use_future_mean_price','margin_mode','warmup','transaction_log_file','curve_log_file','curve_log_info','comments'], 'controller' : ['name','groupid','simple_mode','bid_mode','use_override','control_mode','resolve_mode','ramp_low','ramp_high','range_low','range_high','target','setpoint','demand','load','total','market','state','avg_target','std_target','base_setpoint','period','slider_setting','slider_setting_heat','slider_setting_cool','override','heating_range_high','heating_range_low','heating_ramp_high','heating_ramp_low','cooling_range_high','cooling_range_low','cooling_ramp_high','cooling_ramp_low','heating_base_setpoint','cooling_base_setpoint','deadband','heating_setpoint','heating_demand','cooling_setpoint','cooling_demand','sliding_time_delay','use_predictive_bidding','comments'], 'passive_controller' : ['name','groupid','control_mode','dlc_mode','input_state','input_setpoint','input_chained','sensitivity','period','expectation_prop','expectation_obj','setpoint_prop','state_prop','observation_obj','observation_prop','mean_observation_prop','stdev_observation_prop','cycle_length','base_setpoint','ramp_high','ramp_low','range_high','range_low','critical_day','two_tier_cpp','daily_elasticity','sub_elasticity_first_second','sub_elasticity_first_third','second_tier_hours','first_tier_hours','first_tier_price','second_tier_price','third_tier_price','linearize_elasticity','price_offset','pool_pump_model','base_duty_cycle','distribution_type','comfort_level','cycle_length_off','cycle_length_on','comments'], diff --git a/source/object.h b/source/object.h index 3d3584b12..c87d304a4 100644 --- a/source/object.h +++ b/source/object.h @@ -512,12 +512,14 @@ const char* object_get_header_string(OBJECT *obj, const char *item, char *buffer #define object_parent(X) ((X)?(X)->parent:NULL) /**< get the parent of the object */ #define object_rank(X) ((X)?(X)->name:-1) /**< get the rank of the object */ -// If X is a valid pointer (not NULL), moves the following memory location and -// typecasts to a pointer of type `T`. -#define OBJECTDATA(X,T) ((T*)((X)?((X)+1):NULL)) /**< get the object data structure */ + +// OBJECTDATA(X,T): If X is a valid pointer (not NULL), moves to the memory location of the next object +// (assuming the next one is the same type) and typecasts to a pointer of type `T`. The given pointer +// should point to the object hear, the returned one should be the object data structure. +#define OBJECTDATA(X,T) ((T*)((X)?((X)+1):NULL)) /**< get a pointer to the object data structure given a pointer to the header*/ #define GETADDR(O,P) ((O)?((void*)((char*)((O)+1)+(unsigned int64)((P)->addr))):NULL) /**< get the addr of an object's property */ -#define OBJECTHDR(X) ((X)?(((OBJECT*)X)-1):NULL) /**< get the header from the object's data structure */ -#define THISOBJECTHDR (((OBJECT*)this)-1) +#define OBJECTHDR(X) ((X)?(((OBJECT*)X)-1):NULL) /**< get the header from the given object's data structure */ +#define THISOBJECTHDR (((OBJECT*)this)-1) /**< get the header from this object's data structure */ #define MY (((OBJECT*)this)-1) #define MYPARENT (MY->parent) /**< get the parent from the object's data structure */ diff --git a/tools/autotest/test_create_poles.csv b/tools/autotest/test_create_poles.csv index 1f4e1e05c..838df059b 100644 --- a/tools/autotest/test_create_poles.csv +++ b/tools/autotest/test_create_poles.csv @@ -1,3 +1,3 @@ -name,install_year,tilt_angle,tilt_dir +name,install_year,tilt_degree,tilt_dir overhead_line1,2010,2 deg,45 deg overhead_line2,2010,1 deg,135 deg diff --git a/tools/autotest/test_create_poles_opt.glm b/tools/autotest/test_create_poles_opt.glm index 925e54cce..335e00db6 100644 --- a/tools/autotest/test_create_poles_opt.glm +++ b/tools/autotest/test_create_poles_opt.glm @@ -6,7 +6,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -59,7 +59,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -90,7 +90,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -110,7 +110,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -163,7 +163,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2010"; - tilt_angle "2 deg"; + tilt_degree "2 deg"; tilt_direction "0 deg"; object pole_mount { @@ -183,7 +183,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2010"; - tilt_angle "2 deg"; + tilt_degree "2 deg"; tilt_direction "0 deg"; object pole_mount { @@ -203,7 +203,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2010"; - tilt_angle "2 deg"; + tilt_degree "2 deg"; tilt_direction "0 deg"; object pole_mount { @@ -223,7 +223,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2010"; - tilt_angle "2 deg"; + tilt_degree "2 deg"; tilt_direction "0 deg"; object pole_mount { @@ -243,7 +243,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2010"; - tilt_angle "1 deg"; + tilt_degree "1 deg"; tilt_direction "0 deg"; object pole_mount { @@ -274,7 +274,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2010"; - tilt_angle "1 deg"; + tilt_degree "1 deg"; tilt_direction "0 deg"; object pole_mount { @@ -294,7 +294,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2010"; - tilt_angle "1 deg"; + tilt_degree "1 deg"; tilt_direction "0 deg"; object pole_mount { @@ -314,7 +314,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2010"; - tilt_angle "1 deg"; + tilt_degree "1 deg"; tilt_direction "0 deg"; object pole_mount { @@ -334,7 +334,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -354,7 +354,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -374,7 +374,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -394,7 +394,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -414,7 +414,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -434,7 +434,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -454,7 +454,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -474,7 +474,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -494,7 +494,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -514,7 +514,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -534,7 +534,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -554,7 +554,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -574,7 +574,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -594,7 +594,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -614,7 +614,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -634,7 +634,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -654,7 +654,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -674,7 +674,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -694,7 +694,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -714,7 +714,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -734,7 +734,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -754,7 +754,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -774,7 +774,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -794,7 +794,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -814,7 +814,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -845,7 +845,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -865,7 +865,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -885,7 +885,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -905,7 +905,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -925,7 +925,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -945,7 +945,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -965,7 +965,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -985,7 +985,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1005,7 +1005,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1025,7 +1025,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1045,7 +1045,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1065,7 +1065,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1085,7 +1085,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1105,7 +1105,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1125,7 +1125,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1145,7 +1145,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1165,7 +1165,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1185,7 +1185,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1205,7 +1205,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1225,7 +1225,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1245,7 +1245,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1265,7 +1265,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1285,7 +1285,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1305,7 +1305,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1325,7 +1325,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1345,7 +1345,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1365,7 +1365,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1396,7 +1396,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1416,7 +1416,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1436,7 +1436,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1456,7 +1456,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1476,7 +1476,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1496,7 +1496,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { @@ -1516,7 +1516,7 @@ object pole configuration "WOOD-EC-45/4"; weather "example"; install_year "2000"; - tilt_angle "0 deg"; + tilt_degree "0 deg"; tilt_direction "0 deg"; object pole_mount { diff --git a/tools/autotest/test_pole_analysis_opt.glm b/tools/autotest/test_pole_analysis_opt.glm index fea593c1d..3a3d79a03 100644 --- a/tools/autotest/test_pole_analysis_opt.glm +++ b/tools/autotest/test_pole_analysis_opt.glm @@ -39,7 +39,7 @@ object pole_configuration { } object pole { name "pole_267462S"; - tilt_angle 1.1 deg; + tilt_degree 1.1 deg; tilt_direction 10 deg; // latitude 34.4002833340685; // longitude "-116.962349732192"; @@ -48,7 +48,7 @@ object pole { } object pole { name "pole_280565E"; - tilt_angle 5.0 deg; + tilt_degree 5.0 deg; tilt_direction 30.0 deg; latitude 33.9459351039498; longitude "-117.896961270715"; @@ -58,7 +58,7 @@ object pole { } object pole { name "pole_306771E"; - tilt_angle 0 deg; + tilt_degree 0 deg; tilt_direction 0 deg; latitude 33.5318268108841; longitude "-117.767614658085"; @@ -67,7 +67,7 @@ object pole { } object pole { name "pole_311032S"; - tilt_angle 0 deg; + tilt_degree 0 deg; tilt_direction 0 deg; latitude 33.84445388; longitude "-117.28241728"; @@ -76,7 +76,7 @@ object pole { } object pole { name "pole_312148E"; - tilt_angle 0 deg; + tilt_degree 0 deg; tilt_direction 0 deg; latitude 36.1926329370634; longitude "-119.158966357457"; diff --git a/tools/create_poles.py b/tools/create_poles.py index 997f4c7b6..37921897b 100644 --- a/tools/create_poles.py +++ b/tools/create_poles.py @@ -114,7 +114,7 @@ * pole - install_year: 2000 - - tilt_angle: 0 deg + - tilt_degree: 0 deg - tilt_direction: 0 deg * pole_mount height: 40 ft @@ -132,7 +132,7 @@ column and the property values in columns using the property name. For example, - name,install_year,tilt_angle + name,install_year,tilt_degree overhead_line1,2010,0 overhead_line2,2010,0 overhead_line3,2010,0 @@ -220,7 +220,7 @@ def syntax(code=None): properties = { "pole" : dict( install_year = "2000", - tilt_angle = "0 deg", + tilt_degree = "0 deg", tilt_direction = "0 deg", ), "pole_mount" : dict( diff --git a/tools/pole_analysis.py b/tools/pole_analysis.py index f0060d644..286303a08 100644 --- a/tools/pole_analysis.py +++ b/tools/pole_analysis.py @@ -148,7 +148,7 @@ def syntax(code=None): "pole_length" : 45, # in ft "pole_depth" : 4.5, # in ft "guy_height" : 0.0, # in ft - "tilt_angle" : 0.0, # in degree + "tilt_degree" : 0.0, # in degree "tilt_direction" : 0.0, # in degree "fiber_strength" : 8000.0, # in psi "material_density" : 35.0, # in lbs/sf3 @@ -205,64 +205,64 @@ def pole_diameter(g_diameter,t_diameter,h,H): x_diameter = g_diameter - h*(g_diameter-t_diameter)/H return x_diameter -def reactions_PW(g_diameter,t_diameter,height,density,tilt_angle,tilt_direction): +def reactions_PW(g_diameter,t_diameter,height,density,tilt_degree,tilt_direction): # reactions due to pole weight and pole tilt - pole_weight = density*sin(pi*tilt_angle/180)*pi\ + pole_weight = density*sin(pi*tilt_degree/180)*pi\ *(g_diameter**2+g_diameter*t_diameter+t_diameter**2)*height/(3*4) xV = -pole_weight*cos(pi*tilt_direction/180) yV = -pole_weight*sin(pi*tilt_direction/180) (g_diameter/(g_diameter-t_diameter)-height*sqrt(g_diameter/(2*(g_diameter-t_diameter)))) return xV, yV -def reactions_CT(strength,tilt_angle,heading_direction): +def reactions_CT(strength,tilt_degree,heading_direction): # reactions due to cable tension - cable_tension = strength*cos(pi*tilt_angle/180) + cable_tension = strength*cos(pi*tilt_degree/180) xV = -cable_tension*cos(pi*heading_direction/180) yV = -cable_tension*sin(pi*heading_direction/180) return xV, yV -def reactions_CW(g_diameter,t_diameter,height,weight,gP,zP,tilt_angle,tilt_direction,offset_direction): +def reactions_CW(g_diameter,t_diameter,height,weight,gP,zP,tilt_degree,tilt_direction,offset_direction): # reactions due to cable weight x_diameter = pole_diameter(g_diameter,t_diameter,zP,height) x_radius = x_diameter/2 cable_weight_moment = weight*x_radius - if tilt_angle == 0: + if tilt_degree == 0: xV = -cable_weight_moment*cos(pi*offset_direction/180)/(zP-gP) yV = -cable_weight_moment*sin(pi*offset_direction/180)/(zP-gP) else: - xyV = -(weight*sin(pi*tilt_angle/180)+cable_weight_moment*cos(pi*tilt_angle/180)/(zP-gP)) + xyV = -(weight*sin(pi*tilt_degree/180)+cable_weight_moment*cos(pi*tilt_degree/180)/(zP-gP)) xV = xyV*cos(pi*tilt_direction/180) yV = xyV*sin(pi*tilt_direction/180) return xV, yV -def reactions_EW(weight,gP,zP,offset,tilt_angle,tilt_direction,offset_direction): +def reactions_EW(weight,gP,zP,offset,tilt_degree,tilt_direction,offset_direction): # reactions due to equiption weight equipment_weight_moment = weight*offset - if tilt_angle == 0: + if tilt_degree == 0: xV = -equipment_weight_moment*cos(pi*offset_direction/180)/(zP-gP) yV = -equipment_weight_moment*sin(pi*offset_direction/180)/(zP-gP) else: - xyV = -(weight*sin(pi*tilt_angle/180)+equipment_weight_moment*cos(pi*tilt_angle/180)/(zP-gP)) + xyV = -(weight*sin(pi*tilt_degree/180)+equipment_weight_moment*cos(pi*tilt_degree/180)/(zP-gP)) xV = xyV*cos(pi*tilt_direction/180) yV = xyV*sin(pi*tilt_direction/180) return xV, yV -def reactions_WP(wind_presure,wind_direction,g_diameter,t_diameter,height,tilt_angle): +def reactions_WP(wind_presure,wind_direction,g_diameter,t_diameter,height,tilt_degree): # reactions due to wind loads (in lbs/ft2) on pole - wind_load = wind_presure*height**2*(g_diameter+2*t_diameter)*cos(pi*tilt_angle/180)/72 + wind_load = wind_presure*height**2*(g_diameter+2*t_diameter)*cos(pi*tilt_degree/180)/72 xV = -wind_load*cos(pi*wind_direction/180) yV = -wind_load*sin(pi*wind_direction/180) return xV, yV -def reactions_WC(wind_presure,wind_direction,cable_area,tilt_angle,heading_direction): +def reactions_WC(wind_presure,wind_direction,cable_area,tilt_degree,heading_direction): # reactions due to wind loads (in lbs/ft2) on cable - wind_load = wind_presure*cable_area*abs(sin(pi*(wind_direction-heading_direction)/180))*cos(pi*tilt_angle/180) + wind_load = wind_presure*cable_area*abs(sin(pi*(wind_direction-heading_direction)/180))*cos(pi*tilt_degree/180) xV = -wind_load*cos(pi*heading_direction/180) yV = -wind_load*sin(pi*heading_direction/180) return xV, yV -def reactions_WE(wind_presure,wind_direction,equipment_area,tilt_angle): - wind_load = wind_presure*equipment_area*cos(pi*tilt_angle/180) +def reactions_WE(wind_presure,wind_direction,equipment_area,tilt_degree): + wind_load = wind_presure*equipment_area*cos(pi*tilt_degree/180) xV = -wind_load*cos(pi*wind_direction/180) yV = -wind_load*sin(pi*wind_direction/180) return xV, yV @@ -313,7 +313,7 @@ def shear_moment_WC(xV,yV,zP,gP,Z): yMoment[i] = ymoment return xShear, yShear, xMoment, yMoment -def shear_moment_WP(wind_presure,wind_direction,gP,Z,g_diameter,t_diameter,height,tilt_angle): +def shear_moment_WP(wind_presure,wind_direction,gP,Z,g_diameter,t_diameter,height,tilt_degree): #Cycle through the structure and calculate the shear force and bending moment at each point xShear = np.zeros(len(Z)) #Initialise a container to hold all shear force data for equipment weight yShear = np.zeros(len(Z)) #Initialise a container to hold all shear force data for equipment weight @@ -323,8 +323,8 @@ def shear_moment_WP(wind_presure,wind_direction,gP,Z,g_diameter,t_diameter,heigh if x >= gP: x = x - gP x_diameter = pole_diameter(g_diameter,t_diameter,x,height) - shear = -wind_presure*(t_diameter+x_diameter)*(height-x)*cos(pi*tilt_angle/180)/2 - moment = wind_presure*cos(pi*tilt_angle/180)*(height**2*(g_diameter+2*t_diameter)/72 \ + shear = -wind_presure*(t_diameter+x_diameter)*(height-x)*cos(pi*tilt_degree/180)/2 + moment = wind_presure*cos(pi*tilt_degree/180)*(height**2*(g_diameter+2*t_diameter)/72 \ + x*(x_diameter*(x-height)-height*t_diameter - x**2*(g_diameter-t_diameter)/(3*height))/24) else: shear = 0.0 @@ -405,7 +405,7 @@ def shear_moment_CT(xV,yV,zP,gP,Z,heading_direction): yMoment[i] = ymoment return xShear, yShear, xMoment, yMoment -def shear_moment_PW(g_diameter,t_diameter,gP,Z,height,density,tilt_angle,tilt_direction): +def shear_moment_PW(g_diameter,t_diameter,gP,Z,height,density,tilt_degree,tilt_direction): #Cycle through the structure and calculate the shear force and bending moment at each point xShear = np.zeros(len(Z)) #Initialise a container to hold all shear force data for pole weight yShear = np.zeros(len(Z)) #Initialise a container to hold all shear force data for pole weight @@ -415,9 +415,9 @@ def shear_moment_PW(g_diameter,t_diameter,gP,Z,height,density,tilt_angle,tilt_di if x >= gP: x = x - gP x_diameter = pole_diameter(g_diameter,t_diameter,x,height) - pole_weight = density*sin(pi*tilt_angle/180)*pi*(x_diameter**2+x_diameter*t_diameter+t_diameter**2)\ + pole_weight = density*sin(pi*tilt_degree/180)*pi*(x_diameter**2+x_diameter*t_diameter+t_diameter**2)\ *(height-x)/(3*4*12*12) - pole_weight_moment = density*sin(pi*tilt_angle/180)*pi*\ + pole_weight_moment = density*sin(pi*tilt_degree/180)*pi*\ (g_diameter**2*(height**2-x**2)/(2*4)+(g_diameter-t_diameter)**2*(height**4-x**4)/(4*4*height**2)\ -2*g_diameter*(g_diameter-t_diameter)*(height**3-x**3)/(3*4*height))/(12*12) else: @@ -543,8 +543,8 @@ def main(inputfile,**options): data = model["objects"][name] if "class" in data.keys() and data["class"] == "pole": poles[name] = pole_data_template.copy() - if "tilt_angle" in data.keys(): - poles[name]["tilt_angle"] = float(data["tilt_angle"].split()[0]) + if "tilt_degree" in data.keys(): + poles[name]["tilt_degree"] = float(data["tilt_degree"].split()[0]) if "tilt_direction" in data.keys(): poles[name]["tilt_direction"] = float(data["tilt_direction"].split()[0]) config_name = data["configuration"] @@ -631,7 +631,7 @@ def main(inputfile,**options): t_diameter = pole_data['top_diameter'] g_diameter = pole_diameter(pole_data['ground_diameter'],t_diameter,guy_height,pole_length) density = pole_data['material_density'] - tilt_angle = pole_data['tilt_angle'] + tilt_degree = pole_data['tilt_degree'] tilt_direction = pole_data['tilt_direction'] delta_height = pole_length/segment_dives Z = np.arange(0, pole_length + delta_height, delta_height) #Range of z-coordinates @@ -645,13 +645,13 @@ def main(inputfile,**options): strength_factor_250b_wood = pole_data["strength_factor_250b_wood"] ## pole weight - xV, yV = reactions_PW(g_diameter,t_diameter,height,density,tilt_angle,tilt_direction) + xV, yV = reactions_PW(g_diameter,t_diameter,height,density,tilt_degree,tilt_direction) xV = xV * overload_factor_vertical # consider overload factor yV = yV * overload_factor_vertical PW_record = np.append(PW_record, [np.array([xV, yV])], axis=0) reactions[0] = reactions[0] + xV reactions[1] = reactions[1] + yV - xShear, yShear, xMoment, yMoment = shear_moment_PW(g_diameter,t_diameter,guy_height,Z,height,density,tilt_angle,\ + xShear, yShear, xMoment, yMoment = shear_moment_PW(g_diameter,t_diameter,guy_height,Z,height,density,tilt_degree,\ tilt_direction) xShearForce = np.append(xShearForce, [xShear], axis=0) #Store shear force record for pole weight yShearForce = np.append(yShearForce, [yShear], axis=0) #Store shear force record for pole weight @@ -670,7 +670,7 @@ def main(inputfile,**options): offset_direction = mount_data["direction"] ## cable tension if guy_height < zP: - xV, yV = reactions_CT(strength,tilt_angle,heading_direction) + xV, yV = reactions_CT(strength,tilt_degree,heading_direction) xV = xV * overload_factor_transverse_wire yV = yV * overload_factor_transverse_wire else: @@ -686,7 +686,7 @@ def main(inputfile,**options): yBendingMoment = np.append(yBendingMoment, [yMoment], axis=0) #Store bending moment for cable tension ## cable weight if guy_height < zP: - xV, yV = reactions_CW(g_diameter,t_diameter,height,weight,guy_height,zP,tilt_angle,tilt_direction,\ + xV, yV = reactions_CW(g_diameter,t_diameter,height,weight,guy_height,zP,tilt_degree,tilt_direction,\ offset_direction) xV = xV * overload_factor_vertical yV = yV * overload_factor_vertical @@ -708,7 +708,7 @@ def main(inputfile,**options): offset_direction = mount_data["offset_direction"] offset = mount_data["offset"] if guy_height < zP: - xV, yV = reactions_EW(weight,guy_height,zP,offset,tilt_angle,tilt_direction,offset_direction) + xV, yV = reactions_EW(weight,guy_height,zP,offset,tilt_degree,tilt_direction,offset_direction) xV = xV * overload_factor_vertical yV = yV * overload_factor_vertical else: @@ -742,14 +742,14 @@ def main(inputfile,**options): xAnalysisBendingMoment = np.empty([0,len(Z)]) #Bending moment at each data point yAnalysisBendingMoment = np.empty([0,len(Z)]) #Bending moment at each data point ## wind load on pole - xV, yV = reactions_WP(wind_presure,wind_direction,g_diameter,t_diameter,height,tilt_angle) + xV, yV = reactions_WP(wind_presure,wind_direction,g_diameter,t_diameter,height,tilt_degree) xV = xV * overload_factor_transverse_general yV = yV * overload_factor_transverse_general WP_record = np.append(WP_record, [np.array([xV, yV])], axis=0) reactions[0] = reactions[0] + xV reactions[1] = reactions[1] + yV xShear, yShear, xMoment, yMoment = shear_moment_WP(wind_presure,wind_direction,guy_height,Z,g_diameter,\ - t_diameter,height,tilt_angle) + t_diameter,height,tilt_degree) xAnalysisShearForce = np.append(xAnalysisShearForce, [xShear],axis=0) #Store shear force record for pole wind load yAnalysisShearForce = np.append(yAnalysisShearForce, [yShear],axis=0) #Store shear force record for pole wind load xAnalysisBendingMoment = np.append(xAnalysisBendingMoment,[xMoment], axis=0) #Store bending moment for pole wind load @@ -762,7 +762,7 @@ def main(inputfile,**options): * mount_data["pole_spacing"] # in ft2 heading_direction = mount_data["direction"] zP = mount_data["height"] - xV, yV = reactions_WC(wind_presure,wind_direction,cable_area,tilt_angle,heading_direction) + xV, yV = reactions_WC(wind_presure,wind_direction,cable_area,tilt_degree,heading_direction) xV = xV * overload_factor_transverse_general yV = yV * overload_factor_transverse_general WC_record = np.append(WC_record, [np.array([xV, yV])], axis=0) @@ -776,7 +776,7 @@ def main(inputfile,**options): else: equipment_area = mount_data["area"] # in ft2 zP = mount_data["height"] - xV, yV = reactions_WE(wind_presure,wind_direction,equipment_area,tilt_angle) + xV, yV = reactions_WE(wind_presure,wind_direction,equipment_area,tilt_degree) xV = xV * overload_factor_transverse_general yV = yV * overload_factor_transverse_general WE_record = np.append(WE_record, [np.array([xV, yV])], axis=0) @@ -826,14 +826,14 @@ def main(inputfile,**options): yAnalysisBendingMoment = np.empty([0,len(Z)]) #Bending moment at each data point wind_presure = 0.00256*(2.24*wind_speed)**2 #2.24 account for m/s to mph conversion, in lb/ft2 ## wind load on pole - xV, yV = reactions_WP(wind_presure,wind_direction,g_diameter,t_diameter,height,tilt_angle) + xV, yV = reactions_WP(wind_presure,wind_direction,g_diameter,t_diameter,height,tilt_degree) xV = xV * overload_factor_transverse_general yV = yV * overload_factor_transverse_general WP_record = np.append(WP_record, [np.array([xV, yV])], axis=0) reactions[0] = reactions[0] + xV reactions[1] = reactions[1] + yV xShear, yShear, xMoment, yMoment = shear_moment_WP(wind_presure,wind_direction,guy_height,Z,g_diameter,\ - t_diameter,height,tilt_angle) + t_diameter,height,tilt_degree) xAnalysisShearForce = np.append(xAnalysisShearForce, [xShear],axis=0) #Store shear force record for pole wind load yAnalysisShearForce = np.append(yAnalysisShearForce, [yShear],axis=0) #Store shear force record for pole wind load xAnalysisBendingMoment = np.append(xAnalysisBendingMoment,[xMoment], axis=0) #Store bending moment for pole wind load @@ -846,7 +846,7 @@ def main(inputfile,**options): * mount_data["pole_spacing"] # in ft2 heading_direction = mount_data["direction"] zP = mount_data["height"] - xV, yV = reactions_WC(wind_presure,wind_direction,cable_area,tilt_angle,heading_direction) + xV, yV = reactions_WC(wind_presure,wind_direction,cable_area,tilt_degree,heading_direction) xV = xV * overload_factor_transverse_general yV = yV * overload_factor_transverse_general WC_record = np.append(WC_record, [np.array([xV, yV])], axis=0) @@ -860,7 +860,7 @@ def main(inputfile,**options): else: equipment_area = mount_data["area"] # in ft2 zP = mount_data["height"] - xV, yV = reactions_WE(wind_presure,wind_direction,equipment_area,tilt_angle) + xV, yV = reactions_WE(wind_presure,wind_direction,equipment_area,tilt_degree) xV = xV * overload_factor_transverse_general yV = yV * overload_factor_transverse_general WE_record = np.append(WE_record, [np.array([xV, yV])], axis=0) @@ -900,14 +900,14 @@ def main(inputfile,**options): wind_direction = DEFAULT_WIND_DIRECTION wind_presure = 0.00256*(2.24*wind_speed)**2 #2.24 account for m/s to mph conversion, in lb/ft2 ## wind load on pole - xV, yV = reactions_WP(wind_presure,wind_direction,g_diameter,t_diameter,height,tilt_angle) + xV, yV = reactions_WP(wind_presure,wind_direction,g_diameter,t_diameter,height,tilt_degree) xV = xV * overload_factor_transverse_general yV = yV * overload_factor_transverse_general WP_record = np.append(WP_record, [np.array([xV, yV])], axis=0) reactions[0] = reactions[0] + xV reactions[1] = reactions[1] + yV xShear, yShear, xMoment, yMoment = shear_moment_WP(wind_presure,wind_direction,guy_height,Z,g_diameter,\ - t_diameter,height,tilt_angle) + t_diameter,height,tilt_degree) xShearForce = np.append(xShearForce, [xShear], axis=0) #Store shear force record for pole wind load yShearForce = np.append(yShearForce, [yShear], axis=0) #Store shear force record for pole wind load xBendingMoment = np.append(xBendingMoment, [xMoment], axis=0) #Store bending moment for pole wind load @@ -920,7 +920,7 @@ def main(inputfile,**options): * mount_data["pole_spacing"] # in ft2 heading_direction = mount_data["direction"] zP = mount_data["height"] - xV, yV = reactions_WC(wind_presure,wind_direction,cable_area,tilt_angle,heading_direction) + xV, yV = reactions_WC(wind_presure,wind_direction,cable_area,tilt_degree,heading_direction) xV = xV * overload_factor_transverse_general yV = yV * overload_factor_transverse_general WC_record = np.append(WC_record, [np.array([xV, yV])], axis=0) @@ -934,7 +934,7 @@ def main(inputfile,**options): else: equipment_area = mount_data["area"] # in ft2 zP = mount_data["height"] - xV, yV = reactions_WE(wind_presure,wind_direction,equipment_area,tilt_angle) + xV, yV = reactions_WE(wind_presure,wind_direction,equipment_area,tilt_degree) xV = xV * overload_factor_transverse_general yV = yV * overload_factor_transverse_general WE_record = np.append(WE_record, [np.array([xV, yV])], axis=0) From c3928b999df5150cfe620908af95e3623fa8877c Mon Sep 17 00:00:00 2001 From: "David P. Chassin" Date: Thu, 29 Jun 2023 07:50:29 -0700 Subject: [PATCH 20/34] Update version.h Signed-off-by: David P. Chassin Signed-off-by: David P. Chassin --- source/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/version.h b/source/version.h index 27552ba76..863af9c9b 100644 --- a/source/version.h +++ b/source/version.h @@ -11,7 +11,7 @@ #define REV_MAJOR 4 #define REV_MINOR 3 -#define REV_PATCH 2 +#define REV_PATCH 3 #ifdef HAVE_CONFIG_H #include "config.h" From ec11733c918a08d8e9609cefc14a7af1349e42a4 Mon Sep 17 00:00:00 2001 From: "David P. Chassin" Date: Mon, 3 Jul 2023 11:15:57 -0700 Subject: [PATCH 21/34] Add support for accessing ISO New England hourly market data (#1307) Signed-off-by: David P. Chassin Signed-off-by: David P. Chassin --- cloud/websites/docs.gridlabd.us/index.html | 18 +- tools/Makefile.mk | 1 + tools/autotest/.gitignore | 2 + tools/autotest/test_isone.glm | 21 ++ tools/autotest/test_isone_record.csv | 25 ++ tools/isone.py | 288 +++++++++++++++++++++ 6 files changed, 343 insertions(+), 12 deletions(-) create mode 100644 tools/autotest/.gitignore create mode 100644 tools/autotest/test_isone.glm create mode 100644 tools/autotest/test_isone_record.csv create mode 100644 tools/isone.py diff --git a/cloud/websites/docs.gridlabd.us/index.html b/cloud/websites/docs.gridlabd.us/index.html index 9ed34b289..fef43042b 100644 --- a/cloud/websites/docs.gridlabd.us/index.html +++ b/cloud/websites/docs.gridlabd.us/index.html @@ -1,15 +1,9 @@ - - - + + + + +Redirecting to http://docs.arras-energy.org/index.html?owner=arras-energy&project=gridlabd... + \ No newline at end of file diff --git a/tools/Makefile.mk b/tools/Makefile.mk index dfa7366d0..14b4ef87d 100644 --- a/tools/Makefile.mk +++ b/tools/Makefile.mk @@ -13,6 +13,7 @@ dist_pkgdata_DATA += tools/gridlabd-editor.png dist_pkgdata_DATA += tools/gridlabd-editor.py dist_pkgdata_DATA += tools/insights.py dist_pkgdata_DATA += tools/install.py +dist_pkgdata_DATA += tools/isone.py dist_pkgdata_DATA += tools/market_data.py dist_pkgdata_DATA += tools/mdb_info.py dist_pkgdata_DATA += tools/market_model.py diff --git a/tools/autotest/.gitignore b/tools/autotest/.gitignore new file mode 100644 index 000000000..312a30e9d --- /dev/null +++ b/tools/autotest/.gitignore @@ -0,0 +1,2 @@ +test_isone.csv +test_isone_opt.glm diff --git a/tools/autotest/test_isone.glm b/tools/autotest/test_isone.glm new file mode 100644 index 000000000..20fb36441 --- /dev/null +++ b/tools/autotest/test_isone.glm @@ -0,0 +1,21 @@ +#python -m isone -d=smd/ME -s=2020-03-01 -e=2020-03-01 -c=test_isone.csv -g=test_isone_opt.glm +module tape +{ + csv_header_type NAME; +} +#include "test_isone_opt.glm" +object recorder +{ + parent isone; + file "test_isone_record.csv"; + property "DA_Demand,RT_Demand,DA_LMP,DA_EC,DA_CC,DA_MLC,RT_LMP,RT_EC,RT_CC,RT_MLC,Dry_Bulb,Dew_Point"; + interval 1h; +} +clock { + timezone ${ISONE_TIMEZONE}; + starttime ${ISONE_STARTDATE}; + stoptime ${ISONE_STOPDATE}; +} +#ifexists "../test_isone_record.csv" +#on_exit 0 diff ../test_isone_record.csv test_isone_record.csv > gridlabd.diff +#endif diff --git a/tools/autotest/test_isone_record.csv b/tools/autotest/test_isone_record.csv new file mode 100644 index 000000000..414517050 --- /dev/null +++ b/tools/autotest/test_isone_record.csv @@ -0,0 +1,25 @@ +timestamp,DA_Demand,RT_Demand,DA_LMP,DA_EC,DA_CC,DA_MLC,RT_LMP,RT_EC,RT_CC,RT_MLC,Dry_Bulb,Dew_Point +2020-03-01 00:00:00 EST,+847,+1177.36,+20.28,+20.34,-0.17,+0.11,+16.21,+16.07,+0,+0.14,+19,+5 +2020-03-01 01:00:00 EST,+840.8,+1152.96,+19.16,+19.22,-0.15,+0.09,+16.33,+16.2,+0,+0.13,+18,+6 +2020-03-01 02:00:00 EST,+855.1,+1138.74,+17.52,+17.62,-0.13,+0.03,+15.64,+15.56,+0,+0.08,+18,+5 +2020-03-01 03:00:00 EST,+838.6,+1144.65,+17.73,+17.8,-0.14,+0.07,+15.21,+15.14,+0,+0.07,+18,+5 +2020-03-01 04:00:00 EST,+852.2,+1167.67,+18.3,+18.38,-0.13,+0.05,+15.26,+15.19,+0,+0.07,+17,+5 +2020-03-01 05:00:00 EST,+914.7,+1209.67,+19.12,+19.16,-0.13,+0.09,+13.21,+13.15,+0,+0.06,+17,+5 +2020-03-01 06:00:00 EST,+912.1,+1277.46,+18.72,+18.72,-0.07,+0.07,+16.09,+15.94,+0,+0.15,+17,+5 +2020-03-01 07:00:00 EST,+1017.2,+1337.71,+18.34,+18.11,-0.04,+0.27,+14.3,+14.1,+0,+0.2,+19,+6 +2020-03-01 08:00:00 EST,+1122,+1401.55,+17.95,+17.59,+0,+0.36,+13.48,+13.28,+0,+0.2,+23,+7 +2020-03-01 09:00:00 EST,+1027,+1411.46,+16.49,+16.31,-0.02,+0.2,+13.94,+13.74,+0,+0.2,+27,+8 +2020-03-01 10:00:00 EST,+999.9,+1438.49,+14.8,+14.83,+0,-0.03,+15.96,+15.78,+0,+0.18,+28,+6 +2020-03-01 11:00:00 EST,+956.6,+1425.79,+13.67,+13.79,-0.02,-0.1,+11.46,+11.35,+0,+0.11,+30,+7 +2020-03-01 12:00:00 EST,+902.7,+1398.41,+12.82,+13.08,-0.13,-0.13,+12.5,+12.41,+0,+0.09,+32,+8 +2020-03-01 13:00:00 EST,+896.3,+1370.73,+12.75,+13.02,-0.12,-0.15,+11.81,+11.75,+0,+0.06,+32,+7 +2020-03-01 14:00:00 EST,+883.2,+1348.15,+12.66,+12.97,-0.12,-0.19,+12.61,+12.56,+0,+0.05,+34,+7 +2020-03-01 15:00:00 EST,+1013.1,+1383.17,+13.49,+13.68,-0.12,-0.07,+14.08,+13.96,+0,+0.12,+35,+8 +2020-03-01 16:00:00 EST,+1117.8,+1460.34,+16.51,+16.48,-0.11,+0.14,+21.35,+21.15,+0,+0.2,+34,+7 +2020-03-01 17:00:00 EST,+1206.7,+1531.06,+19.58,+19.61,-0.13,+0.1,+21.93,+21.74,+0,+0.19,+32,+7 +2020-03-01 18:00:00 EST,+1239,+1563.54,+25.89,+25.92,-0.18,+0.15,+30.69,+30.34,+0,+0.35,+29,+8 +2020-03-01 19:00:00 EST,+1160,+1516.67,+20.82,+20.95,-0.18,+0.05,+24.05,+23.85,+0,+0.2,+27,+8 +2020-03-01 20:00:00 EST,+1120.6,+1467.12,+17.55,+17.75,-0.13,-0.07,+21.78,+21.63,+0,+0.15,+26,+8 +2020-03-01 21:00:00 EST,+984.8,+1361.46,+16.71,+16.87,-0.14,-0.02,+16.71,+16.57,+0,+0.14,+25,+8 +2020-03-01 22:00:00 EST,+942.1,+1264.5,+16.54,+16.69,-0.16,+0.01,+18.14,+17.99,+0,+0.15,+24,+8 +2020-03-01 23:00:00 EST,+872.2,+1218.99,+16.79,+16.94,-0.14,-0.01,+25.65,+25.27,+0,+0.38,+22,+8 diff --git a/tools/isone.py b/tools/isone.py new file mode 100644 index 000000000..f7b8b71a8 --- /dev/null +++ b/tools/isone.py @@ -0,0 +1,288 @@ +"""ISO New England data access module + +Syntax: gridlabd isone OPTIONS ... + +Options: + -d|--dataset=DATASET/SUBSET Download data from the specified dataset + (and subset, default is `smd/ISO NE CA`) + -c|--csv=FILENAME Save CSV data to the specified file + (default is /dev/stdout) + -C|--CLASS=CLASSNAME Specify the GLM class name (default is + `isone`) + -e|--end=YEAR|STOPDATE Download data ending on the specified year + or date (last month default) + -f|--freshen Freshen the data cache + -g|--glm=FILENAME Save GLM data to the specified file + (default is /dev/null) + -l|--list Output a list of available sheets in dataset + -N|--NAME=OBJECTNAME Specify the GLM object name (default is + `isone`) + -s|--start=YEAR|STARTDATE Download data starting on the specified + year or date (last month by default) + -y|--year[=YEAR] Download data for the specified year + (current year by default) + +Currently the only supported dataset is `smd`. The valid subsets depend on the +dataset and year. See https://www.iso-ne.com/isoexpress/web/reports/load-and-demand/-/tree/zone-info +for more information. +""" + +import sys, os +import datetime +import pandas +import requests +import traceback + +EXECNAME = os.path.splitext(os.path.basename(sys.argv[0]))[0] +DATASET = "smd" +CSVFILE = "/dev/stdout" +GLMFILE = None +CLASSNAME = "isone" +OBJNAME = "isone" +STARTDATE = None +STOPDATE = None +CACHEDIR = "/usr/local/opt/gridlabd/current/share/gridlabd/isone.d/" \ + if not "GLD_ETC" in os.environ else os.path.join(os.environ['GLD_ETC'],"isone") +DATEFORMAT = "%Y-%m-%d" +FLOATFORMAT = "%.2f" +FRESHEN = False +VERBOSE = False +QUIET = False +DEBUG = False + +E_OK = 0 +E_SYNTAX = 1 +E_INVALID = 2 +E_FAILED = 3 + +def error(msg,code=None): + if not QUIET: + print(f"ERROR [{EXECNAME}]: {msg}",flush=True,file=sys.stderr) + if not code is None: + exit(code) + +def verbose(msg): + if VERBOSE: + print(f"VERBOSE [{EXECNAME}]: {msg}",flush=True,file=sys.stderr) + +def get_year(year=None,dataset=None): + """Get data from a year + :param year: int - the starting date in DATEFORMAT + :return: pandas.DataFrame - the requested dataset + :return: list - list of available subsets (if dataset is None) + """ + if year == None: + year = datetime.datetime.now().year + verbose(f"setting to default year '{year}'") + assert(type(year)==int) + if dataset == None: + dataset = DATASET + verbose(f"setting to default dataset '{dataset}'") + specs = dataset.split("/") + cachefile = os.path.join(CACHEDIR,f"{specs[0]}_{year}.xlsx") + if FRESHEN or not os.path.exists(cachefile): + verbose(f"creating cache directory '{CACHEDIR}'") + os.makedirs(CACHEDIR,exist_ok=True) + try: + url = f"https://www.iso-ne.com/static-assets/documents/{year}/02/{year}_{specs[0]}_hourly.xlsx" + verbose(f"downloading data from '{url}'") + req = requests.get(url) + if req.status_code == 200: + verbose(f"saving data to '{cachefile}'") + with open(cachefile,"wb") as xls: + xls.write(req.content) + else: + error(f"unable to download data from '{url}' (HTTP code {req.status_code})",E_FAILED) + except Exception as err: + error(f"unable to get data from '{url}' ({err})",E_FAILED) + if len(specs) > 1: + verbose(f"loading '{specs[1]}' from '{cachefile}'") + return pandas.read_excel(cachefile,sheet_name=specs[1],index_col=[0,1],parse_dates=[0]) + else: + verbose(f"loading data from '{cachefile}'") + return pandas.read_excel(cachefile,sheet_name=None) + +def get_data(startdate=None,stopdate=None,dataset=None): + """Get data from a date range + :param startdate: str - the starting date in DATEFORMAT + :param stopdate: str - the stopping date in DATEFORMAT + :param dataset: str - the dataset/subset specification + :return: pandas.DataFrame - the requested data + """ + if startdate == None: + startdate = datetime.datetime(year=datetime.datetime.now().year) + else: + startdate = datetime.datetime.strptime(startdate,DATEFORMAT) + if startdate == None: + stopdate = datetime.datetime.now() + else: + stopdate = datetime.datetime.strptime(stopdate,DATEFORMAT) + if startdate > stopdate: + error("startdate is after stopdate",E_INVALID) + data = [] + for year in range(startdate.year,stopdate.year+1): + data.append(get_year(year,dataset)) + data = pandas.concat(data) + maxdate = min(data.index.get_level_values(0).max(),stopdate) + return data.loc[pandas.date_range(startdate,maxdate)] + +def fix_timestamps(df): + """Fix timestamp in dataframe + :param data: pandas.DataFrame - data to fix + :return: pandas.DataFrame - fixed data + """ + df['timestamp'] = [x[0] + datetime.timedelta(hours = int(x[1])-1) for x in list(df.index)] + return df.set_index('timestamp') + +if __name__ == "__main__": + if len(sys.argv) == 1: + for line in __doc__.split("\n"): + if line.startswith("Syntax: "): + print(line,file=sys.stderr) + exit(E_SYNTAX) + elif sys.argv[1] in ["-h","--help","help"]: + print(__doc__) + exit(E_OK) + for arg in sys.argv[1:]: + spec = arg.split("=") + if len(spec) == 1: + token = arg + value = None + elif len(spec) == 2: + token = spec[0] + value = spec[1] + else: + token = spec[0] + value = "=".join(spec[1:]) + + if token in ["-v","--verbose"]: + VERBOSE = True + elif token in ["-q","--quiet"]: + QUIET = True + elif token in ["--debug"]: + DEBUG = True + + # -d|--dataset=DATASET/SUBSET Download data from the specified dataset + # (and subset, default is `smd/ISO NE CA`) + elif token in ["-d","--dataset"]: + if value: + DATASET = value + else: + error("dataset not specified",E_SYNTAX) + + # -c|--csv=FILENAME Save CSV data to the specified file + # (default is /dev/stdout) + elif token in ["-c","--csv"]: + if value: + CSVFILE = value + else: + error("csvfile not specified",E_SYNTAX) + + # -C|--CLASS=CLASSNAME Specify the GLM class name (default is + # `isone`) + elif token in ["-C","--CLASS"]: + if value: + CLASSNAME = value + else: + error("class name not specified",E_SYNTAX) + + # -e|--end=YEAR|STOPDATE Download data ending on the specified year + # or date (last month default) + elif token in ["-e","--end"]: + if value: + try: + STOPDATE = int(value) + except: + STOPDATE = value + + # -f|--freshen Freshen the data cache + elif token in ["-f","--freshen"]: + FRESHEN = True + + # -g|--glm=FILENAME save GLM data to the specified file + # (default is /dev/null) + elif token in ["-g","--glm"]: + if value: + GLMFILE = value + else: + error("GLM name not specified",E_SYNTAX) + + # -l|--list output a list of available datasets + elif token in ["-l","--list"]: + print("\n".join(get_year(value)),file=sys.stdout) + exit(E_OK) + + # -N|--NAME=OBJECTNAME specify the GLM object name (default is + # `isone`) + elif token in ["-N","--NAME"]: + if value: + OBJNAME = value + else: + error("object name not specified",E_SYNTAX) + + # -s|--start=YEAR|STARTDATE download data starting on the specified + # year or date (last month by default) + elif token in ["-s","--start"]: + if value: + try: + STARTDATE = str(int(value)) + except: + STARTDATE = value + + # -y|--year[=YEAR] download data for the specified year + # (current year by default) + elif token in ["-y","--year"]: + if value: + try: + STARTDATE = value + "-01-01" + STOPDATE = value + "-12-31" + except: + error(f"year '{value}' is invalid",E_INVALID) + else: + error("year not specified",E_SYNTAX) + + # invalid argument + else: + error(f"argument '{arg}' is not recognized",E_SYNTAX) + + try: + data = get_data(STARTDATE,STOPDATE) + + if GLMFILE: + if CSVFILE.startswith("/dev/"): + error(f"CSV file '{CSVFILE}' must be a regular file",E_INVALID) + + # classinfo = CLASSNAME.split(".") + + properties = "\n ".join([f'double {x};' for x in data.columns]) + with open(GLMFILE,"w") as glm: + glm.write(f"""// created by '{' '.join(sys.argv)}' at {datetime.datetime.now()} +class {CLASSNAME} +{{ + {properties} +}} +module tape; +object {CLASSNAME} +{{ + name {OBJNAME}; + object player + {{ + file "{CSVFILE}"; + property "{','.join(data.columns)}"; + }}; +}} +#define ISONE_TIMEZONE=EST+5EDT +#define ISONE_STARTDATE={data.index.get_level_values(0).min()} +#define ISONE_STOPDATE={data.index.get_level_values(0).max()+datetime.timedelta(days=1)} +""") + + fix_timestamps(data).to_csv(CSVFILE,float_format=FLOATFORMAT,header=(GLMFILE is None)) + + exit(E_OK) + except SystemExit as err: + exit(err.code) + except: + e_type,e_value,e_trace = sys.exc_info() + if DEBUG: + traceback.print_tb(e_trace) + error(f"{e_value} ({e_type.__name__} exception)",E_FAILED) From 265940aafa70e98ba53372722bc56f492407fb76 Mon Sep 17 00:00:00 2001 From: "David P. Chassin" Date: Sun, 9 Jul 2023 09:48:51 -0500 Subject: [PATCH 22/34] Add wheel install (#1310) * Update Makefile.mk * Update Python.md Signed-off-by: David P. Chassin --- docs/Module/Python.md | 10 +++++++++- python/Makefile.mk | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/Module/Python.md b/docs/Module/Python.md index 29ba8c2c1..68ddba0dd 100644 --- a/docs/Module/Python.md +++ b/docs/Module/Python.md @@ -2,7 +2,14 @@ # Synopsis -Python 3.6 or greater: +Installation: +~~~ +python3.10 -m venv myenv +. myenv/bin/activate +python3 -m pip install $(gridlabd --version=install)/share/gridlabd/*.whl +~~~ + +Python 3.10: ~~~ >>> import gridlabd >>> gridlabd.title() @@ -256,6 +263,7 @@ Saves the full model to the file. The currently supported formats are `.glm`, ` The following model is `test.glm`: ~~~ module test; + #set suppress_repeat_messages=FALSE clock { starttime '2018-01-01 00:00:00'; stoptime '2018-01-01 01:00:00'; diff --git a/python/Makefile.mk b/python/Makefile.mk index b4dbcd9d9..df8b86006 100644 --- a/python/Makefile.mk +++ b/python/Makefile.mk @@ -12,6 +12,8 @@ $(PYPKG)-$(PYTHONVERSION).tar.gz: $(top_srcdir)/python/dist/gridlabd-$(PYTHONVER @cp $(top_srcdir)/python/dist/gridlabd-$(PYTHONVERSION)*.{tar.gz,whl} $(PYENV)/lib/python$(PYVER)/site-packages python-install: $(PYPKG)-$(PYTHONVERSION).dist-info + @mkdir -p $(datadir)/$(PACKAGE)/ + @cp $(PYPKG)-$(PYTHONVERSION)-*.whl $(datadir)/$(PACKAGE)/ $(PYPKG)-$(PYTHONVERSION).dist-info: $(PYPKG)-$(PYTHONVERSION).tar.gz @echo "installing gridlabd-$(PYTHONVERSION)..." From c4599e4536e915fbce2411e85d99f14d22e2560e Mon Sep 17 00:00:00 2001 From: "David P. Chassin" Date: Mon, 10 Jul 2023 16:25:19 -0500 Subject: [PATCH 23/34] Add shell subcommand (#1312) * Add shell subcommand * Update Python.md * Update Shell.md * Update Shell.md * Update Python.md * Update Shell.md * Add support for shell options Signed-off-by: David P. Chassin --- docs/Module/Python.md | 15 +++++++----- docs/Subcommand/Shell.md | 51 ++++++++++++++++++++++++++++++++++++++++ source/gridlabd.in | 7 +++++- source/gridlabd.m4sh | 10 ++++++-- 4 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 docs/Subcommand/Shell.md diff --git a/docs/Module/Python.md b/docs/Module/Python.md index 68ddba0dd..689b61886 100644 --- a/docs/Module/Python.md +++ b/docs/Module/Python.md @@ -2,14 +2,15 @@ # Synopsis -Installation: +GridLAB-D Python venv: ~~~ -python3.10 -m venv myenv +gridlabd shell +python$PYTHON_VER -m venv myenv . myenv/bin/activate -python3 -m pip install $(gridlabd --version=install)/share/gridlabd/*.whl +python3 -m pip install $GLD_ETC/*.whl ~~~ -Python 3.10: +Python 3: ~~~ >>> import gridlabd >>> gridlabd.title() @@ -316,7 +317,7 @@ bash$ python3 2018-01-01 00:50:00 UTC,0.251099 2018-01-01 00:55:00 UTC,2.778129 2018-01-01 01:00:00 UTC,0.603100 - 4362511024 + 0 >>> quit() ~~~ The following example records all house temperature when the model commit if performed: @@ -399,4 +400,6 @@ The first few lines of output are in `house.csv`: # See also -* [[/Python subcommand]] +* [[/Module/Python]] +* [[/Subcommand/Shell]] + diff --git a/docs/Subcommand/Shell.md b/docs/Subcommand/Shell.md new file mode 100644 index 000000000..753c05f0a --- /dev/null +++ b/docs/Subcommand/Shell.md @@ -0,0 +1,51 @@ +[[/Subcommand/Shell]] -- Open GridLAB-D shell environment + +# Synopsis + +Shell: + +~~~ +sh$ gridlabd shell [OPTIONS ...] +~~~ + +# Description + +The `shell` subcommand opens a shell in the GridLAB-D environment. The shell used is the one currently running as specified by the `SHELL` environment variable. This can be used to run Python with the active python `venv` used for GridLAB-D, or to create a new Python virtual environment in which gridlabd can be run. The options are the same as for the shell current being used. + +The following environment variables are set in the shell environment: + +- `CCFLAGS`: C-compiler flags +- `CFLAGS`: C-compiler flags +- `CPPFLAGS`: C++ compiler flags +- `CXXFLAGS`: C++ compiler flags +- `GLD_BIN`: binary folder +- `GLD_ETC`: shared files folder +- `GLD_INC`: include files folder +- `GLD_LIB`: library folder +- `GLD_VER`: version folder +- `GLPATH`: GridLAB-D file search path +- `INCLUDE`: C-compiler include flags +- `LDFLAGS`: linker flags +- `LIB`: linker library path +- `PYCCFLAGS`: python C-compiler flags +- `PYLDFLAGS`: Python linker flags +- `PYTHON_CONFIG` python config executable name +- `PYTHON_VER`: python version number (major.minor) +- `PYTHONPATH`: Python search path +- `VIRTUAL_ENV`: Python virtual environment path +- `VIRTUAL_ENV_PROMPT`: Python virtual environment prompt + +# Example + +The following commands open a GridLAB-D shell environment and create a Python virtual environment in which GridLAB-D is installed + +~~~ +gridlabd shell +python$PYTHON_VER -m venv myenv +. myenv/bin/activate +python3 -m pip install $GLD_ETC/*.whl +~~~ + +# See also + +* [[/Subcommand/Python]] diff --git a/source/gridlabd.in b/source/gridlabd.in index 18cfecd59..2208869f3 100644 --- a/source/gridlabd.in +++ b/source/gridlabd.in @@ -265,7 +265,7 @@ as_nop=as_fn_nop ## -------------------- ## -REALPATH=$(python3 -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' $0); +REALPATH=$(python3 -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' $0); export GLD_BIN=$(dirname $REALPATH) PREFIX=$(dirname $GLD_BIN) export GLD_ETC=$PREFIX/share/gridlabd @@ -390,6 +390,11 @@ then : . ${GLD_ETC}/gridlabd.rc fi +if test x$1 = xshell +then : + shift 1; $SHELL $@; exit $? +fi + if test -f "${GLD_ETC}/$1.py" then : export PYTHONPATH=$GLD_ETC; python3 -m "$@" ; exit $? diff --git a/source/gridlabd.m4sh b/source/gridlabd.m4sh index ccc737a6b..167b23717 100644 --- a/source/gridlabd.m4sh +++ b/source/gridlabd.m4sh @@ -1,7 +1,7 @@ dnl run "autom4te -l m4sh gridlabd.m4sh > gridlabd.in" AS_INIT -REALPATH=$(python3 -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' $0); +REALPATH=$(python3 -c 'import os, sys; print(os.path.realpath(sys.argv[[1]]))' $0); export GLD_BIN=$(dirname $REALPATH) PREFIX=$(dirname $GLD_BIN) export GLD_ETC=$PREFIX/share/gridlabd @@ -78,10 +78,12 @@ fi ############################################################################### # Python Configuration Data and Flags ############################################################################### +PY_OS="$(uname -s)" + . $GLD_BIN/activate export PYTHON_VER=$(python3 --version | cut -f2 -d' ' | cut -f1-2 -d.) -export PYTHON_CONFIG="$GLD_BIN/activate/python$PYTHON_VER-config" +export PYTHON_CONFIG="python$PYTHON_VER-config" export PYCCFLAGS="$($PYTHON_CONFIG --cflags)" export INCLUDE="-I$GLD_ETC -I$GLD_VER/include -I/usr/include" export CFLAGS="${INCLUDE} ${PYCCFLAGS} ${CFLAGS}" @@ -120,6 +122,10 @@ AS_IF([test -f "${GLD_ETC}/gridlabd.rc"], [. ${GLD_ETC}/gridlabd.rc], []) +AS_IF([test x$1 = xshell], + [shift 1; $SHELL $@; exit $?], + []) + AS_IF([test -f "${GLD_ETC}/$1.py"], [export PYTHONPATH=$GLD_ETC; python3 -m "$@" ; exit $?], []) From e1bbfddc4a00e3d9f0c55eaf508a86dac7c0470d Mon Sep 17 00:00:00 2001 From: Alyona Teyber Date: Thu, 13 Jul 2023 18:07:58 -0700 Subject: [PATCH 24/34] Update Geodata.md (#1314) Signed-off-by: Alyona Teyber Co-authored-by: David P. Chassin Signed-off-by: David P. Chassin --- docs/Subcommand/Geodata.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Subcommand/Geodata.md b/docs/Subcommand/Geodata.md index 60296536b..688ab9f82 100644 --- a/docs/Subcommand/Geodata.md +++ b/docs/Subcommand/Geodata.md @@ -167,7 +167,7 @@ You must subscribe to the TrafficView service to use this dataset. The following command obtains the distance between two locations: ~~~ -% gridlabd geodata -d -D distance location 37.4150,-122.2056 37.3880,-122.2884 +% gridlabd geodata merge -d -D distance location 37.4150,-122.2056 37.3880,-122.2884 latitude,longitude,distance 37.415,-122.2056,0.0 37.388,-122.2884,7906.193731232153 @@ -176,7 +176,7 @@ latitude,longitude,distance The following command obtains the coordinates for the points between two locations at 1 km resolution: ~~~ -% gridlabd geodata -d -D distance location 37.4150,-122.2056 37.3880,-122.2884 -r 1000 +% gridlabd geodata merge -d -D distance location 37.4150,-122.2056 37.3880,-122.2884 -r 1000 latitude,longitude,distance 37.415,-122.2056,0.0 37.41158495593229,-122.21607280180764,1000.0 From e0c538a77695b526883516fa3d1eb73aa63c2612 Mon Sep 17 00:00:00 2001 From: Alyona Teyber Date: Fri, 28 Jul 2023 15:19:17 -0700 Subject: [PATCH 25/34] Fix create_meters.py implementation (#1321) Signed-off-by: Alyona Teyber Signed-off-by: David P. Chassin --- tools/create_meters.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/create_meters.py b/tools/create_meters.py index e9c14b598..8c14a4828 100644 --- a/tools/create_meters.py +++ b/tools/create_meters.py @@ -145,7 +145,7 @@ def fix_parent(parent,name,oclass): if pclass and pclass == oclass.replace('load','node'): # change node to meter - nclass = pclass.replace('load','meter') + nclass = pclass.replace('node','meter') set_data(parent,'class',nclass) else: @@ -293,4 +293,4 @@ def main(args): }, } - main(arg) \ No newline at end of file + main(arg) From cf6901e0be78756bd6a780779b8dc4a4f02d42cc Mon Sep 17 00:00:00 2001 From: "David P. Chassin" Date: Mon, 31 Jul 2023 07:35:04 -0700 Subject: [PATCH 26/34] Update README.md (#1315) Signed-off-by: David P. Chassin --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b7995b687..550b59408 100644 --- a/README.md +++ b/README.md @@ -30,13 +30,13 @@ The preferred method for running HiPAS GridLAB-D is to download the master image Once you have installed docker, you may issue the following commands to run GridLAB-D at the command line: ~~~ -docker run -it -v $PWD:/model arras-energy/gridlabd:latest gridlabd -W /model [LOADOPTIONS] [FILENAME.EXT] [RUNOPTIONS] +docker run -it -v $PWD:/model lfenergy/arras:latest gridlabd -W /model [LOADOPTIONS] [FILENAME.EXT] [RUNOPTIONS] ~~~ On many systems, an alias can be used to make this a simple command that resembles the command you would normally issue to run a host-based installation: ~~~ -alias gridlabd='docker run -it -v $PWD:/tmp arras-energy/gridlabd:latest gridlabd' +alias gridlabd='docker run -it -v $PWD:/tmp lfenergy/arras:latest gridlabd' ~~~ Note that this alias will interfere with any host-based installation. You may use the `gridlabd docker` command to manage the use of docker images concurrently with host-based installations. From 20f26259406a6cd9d3497628494a96733b9c63d2 Mon Sep 17 00:00:00 2001 From: "David P. Chassin" Date: Mon, 31 Jul 2023 16:17:45 -0700 Subject: [PATCH 27/34] Add group tool (#1319) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Release chiba-02 (#1298) - Fixed help script for subcommands and tools - Update CYME converter to resolve new issues (#1299) - Fix diesel torque unit (#1301) - Fix metar2glm (#1302) Signed-off-by: David P. Chassin * Update version.h Signed-off-by: David P. Chassin * Add support for accessing ISO New England hourly market data (#1307) Signed-off-by: David P. Chassin * Add group tool Signed-off-by: David P. Chassin * Update group.py Signed-off-by: David P. Chassin * Update group.py Signed-off-by: David P. Chassin * Update group.py Signed-off-by: David P. Chassin * Update group.py Signed-off-by: David P. Chassin * Update group.py Signed-off-by: David P. Chassin * Update group.py Signed-off-by: David P. Chassin * Update group.py Signed-off-by: David P. Chassin * Create test_group_assets_opt.glm Signed-off-by: David P. Chassin * Create test_group_network_opt.glm Signed-off-by: David P. Chassin * Add wheel install (#1310) * Update Makefile.mk * Update Python.md Signed-off-by: David P. Chassin * Add shell subcommand (#1312) * Add shell subcommand * Update Python.md * Update Shell.md * Update Shell.md * Update Python.md * Update Shell.md * Add support for shell options Signed-off-by: David P. Chassin * Update Geodata.md (#1314) Signed-off-by: Alyona Teyber Co-authored-by: David P. Chassin Signed-off-by: David P. Chassin * Fixed group Signed-off-by: David P. Chassin * Update test_group_assets_opt.glm * Update test_group_assets_opt.glm * Update test_group_assets_opt.glm * Bump pillow from 9.0.1 to 9.3.0 in /converters (#1224) Bumps [pillow](https://github.com/python-pillow/Pillow) from 9.0.1 to 9.3.0. - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/9.0.1...9.3.0) --- updated-dependencies: - dependency-name: pillow dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Signed-off-by: David P. Chassin * Release 4.3.1 (chiba-1) (#1145) * Remove gldcore (again) * Update version.h * Change version to 4.3.1 (chiba-1) and fix resulting autotest errors * Add Windows gridlabd.bat to README * Fixing typo in cooling_cop units (#1152) * Add support for module template folder (#1159) * Add support for module template folder * Add support for blocking load of module template files * Update gridlabd-template * Update gridlabd-geodata (#1153) * Remove deprecated variables (#1151) * Fix bad autotest timezones * Fix generators module deprecated properties * Update recorder.cpp * Fix powerflow deprecations * Fix market deprecations * Fix autotests with deprecated usage * Fix powerflow autotests * Fix reliability autotests * Fix source autotest * Fix powerflow autotest failures * Update triplex_node.cpp * Add missing powerflow switch autotests (#1156) * Add switch tests * Update powerflow switch coordinator autotest * Change slacgismo to hipas (#1155) * Fix build folder (#1154) * Update main.cpp (#1147) * Add powerflow violation detection (#1164) * Update property.cpp * Add module global variable and node property to set voltage violation threshold * Add default continuous and emergency ratings * Add DER voltage fluctuation test implementation to powerflow now * Update docs * Add node voltage violation watch test * Fix node voltage fluctuation DER test * Create test_node_voltage_fluctuation.glm * Update powerflow_object.cpp * Rename test_node_voltage_violation * Add powerflow commits for all links * Add test_link_overcurrent to powerflow module * Add actual voltage values to violation reports * Fix current violation detection * Fix voltage fluctuation checks * Fix timezones in violation tests * Update test_node_voltage_fluctuation.csv * Fix incorrect timezone usage in violation record * Update test results * Fix switch_coordinator precommit definition * Fix violation counter * Update gridlabd-version (#1166) * Add support for spidacalc equipment (#1160) * Create test_xls-spida2csv-network.csv * Create test_xls-spida2csv-network.glm * Update xls-spida2csv-geodata.py * Update xls-spida2csv-geodata.py Co-authored-by: David P. Chassin Co-authored-by: Alyona Teyber * Add service_level flag to powerflow meters (#1162) * Add is_critical flag to powerflow meter * Update Meter.md * Change to service_level instead of is_critical Co-authored-by: Alyona Teyber * Fix python solver (#1058) * Update solver_py.cpp * Update solver_py.cpp * Added numpy array creation support * Implement MLE solver bus mapping * Fix busdata mapping errors * Change output to dataframe for improved readability * Update test_IEEE_13_MLE.glm * Update setup-Linux-amzn-2.sh * Create setup-Linux-ubuntu-20.sh * Update setup-Linux-ubuntu-20.sh * Update setup-Linux-ubuntu-20.sh * Update setup-Darwin-20.sh * Update setup-Linux-ubuntu-20.sh * Update version.sh * Update setup-Linux-amzn-2.sh * Update setup-Linux-ubuntu-20.sh * Update solver_py.cpp * Update test_IEEE_13_MLE.glm * Update solver_py.cpp * Update solver_py.cpp * Update solver_nr.cpp * Update solver_py.cpp * Fix python solver copyback NR initialization error * Update solver_nr.cpp * Update solver_nr.cpp * Fix NR profiler formatting * Create Solver_profile_csv.md * Update solver_nr.cpp Co-authored-by: Alyona Teyber * Fix voltage violation detection implementation errors (#1170) * Update gridlabd-version * Fix missing voltage_fluctuation_threshold global in powerflow * Fixes to variable names * Fix voltage violation logic * Add hosting capacity documentation * Add DER_violation_test global * Fix child node voltage fluctuation test Co-authored-by: Alyona Teyber * Update nsrdb_weather.py (#1168) Co-authored-by: Alyona Teyber * Add fire danger tool (#1146) * Create fire_danger.py * Update Makefile.mk * Update fire_danger.py * Update fire_danger.py * Update fire_danger.py * Update fire_danger.py * Update fire_danger.py * Update fire_danger.py * Update fire_danger.py * Update fire_danger.py * Add show option to fire_danger tool * Update fire_danger.py * Update requirements.txt * Adding geodata_firerisk package * Modified unit test & general clean up * Rename geodata_fireRisk.py to geodata_firerisk.py * Create Fire_danger.md * Add fire_danger autotest and documentation Co-authored-by: ktehranchi <83722342+ktehranchi@users.noreply.github.com> Co-authored-by: Alyona Teyber * Update gridlabd-version * Add fire incident report tool (#1143) * Add fire report tool * Update setup.py * Update fire_report.py * Update fire_report.py * Update fire_report.py * Create Fire_report.md * Create test_fire_report.csv * Create test_fire_report.glm * Update fire_report.py * Update fire_report.py * Update geodata_vegetation.py * Update geodata_vegetation.py * Update Fire_report.md Co-authored-by: Fuhong Xie Co-authored-by: Alyona Teyber * Update gridlabd-version * Update gridlabd-version * Develop fix voltage violation detection (#1173) * Update gridlabd-version * Fix missing voltage_fluctuation_threshold global in powerflow * Fixes to variable names * Fix voltage violation logic * Add hosting capacity documentation * Add DER_violation_test global * Fix child node voltage fluctuation test * Update node.cpp * Update Dockerfile * Update load.cpp (#1177) * Add missing default fuse replacement time (#1176) * Fix copyright dates/info on splash screen * Update version number in docs * Update json2md.py * Update load.cpp * Update market documentation * Update node.cpp * Add support for reverse geocode (#1182) * Add airport lookup (#1181) * Add meteostat tool (#1180) * Add session 1 tutorials (#1185) * Add session 1 tutorials * Update Resources.md * Update tutorial landing page * Update Makefile.mk * Update tutorial player * Update to use library.csv data * Update Makefile.mk * Update and rename Datetime.md to Timestamp.md * Update load.cpp * Fix meteostat autotest * Update load.cpp * Update object.cpp * Update gridlabd-template * Update gridlabd-template * Create README.md * Fix meteostat autotest * Update gridlabd-template * Stop meteostat instability from causing autotest failures * Fix class event handlers (#1192) * Add xlsx-workbook2csv-table converter (#1191) * Add 'read_dlp' tool (#1188) * Add setup for version.gridlabd.us server (#1178) * Update library.csv * Update gridlabd-template * Fix node undervoltage violation limit (#1199) * Update node.cpp * Update node.cpp * Update Node.md * Removing print statement from test_class_event_handler.py Co-authored-by: Alyona Teyber * Update python.cpp * Update object.cpp * Fix sprintf vulnerabilities (#1195) * Fix core sprintf vulnerabilities * Update climate.cpp * Fix battery module * Fix market module * Fix powerflow module * Fix revenue module * Fix tape module * Update test_table2glm.glm * Update test_table2glm_noclass.glm * Update test_assert.glm * Fix tape flush validation procedure * Update convert.cpp * Update test_class_event_handler.py * Update climate.h * Fix improper use of return value from snprintf * Finished fixing the sprintf problems. * Update test_assert.glm * Update assert.cpp * Update test_assert.glm * Update gridlabd.h * Update assert.cpp Co-authored-by: Alyona Teyber * Enhance pole analysis (#1186) * Create test_xls-spida2csv-network.csv * Create test_xls-spida2csv-network.glm * Update xls-spida2csv-geodata.py * Update xls-spida2csv-geodata.py * Update xls-spida2csv-geodata.py * Update pole.cpp * Update pole.h * Update pole_configuration.cpp * Update pole_configuration.h * Update pole_mount.cpp * Update pole_mount.h * Update pole.cpp * Update pole.h * Update pole_mount.cpp * Update pole_mount.h * Update test_pole.csv * Update pole.cpp * Update pole_mount.cpp * Update pole_mount.h * Update Makefile.mk * Create pole_analysis.py * Update pole_analysis.py * Create test_pole_analysis.glm * Create test_pole_analysis_opt.csv * Create test_pole_analysis_opt.glm * Update pole_analysis.py * Update pole_analysis.py * Fixed Pandas read_excel xlsx issue * Fix pandas version across all requirements.txt * Changed autotests affected by pandas rounding Co-authored-by: David P. Chassin Co-authored-by: Mitchell Victoriano * Update Meter.md (#1207) * Updating docker image base (#1208) * Update Dockerfile * Update develop.yml * Update master.yml * Fix expansions for loader (#1206) * Update load.cpp * Create Expansion.md Co-authored-by: David P. Chassin * Update requirements.txt (#1209) * Update requirements.txt * Upgrading to py 3.9.6 * Updating base from slacgismo to hipas for github actions * Upgrade shapely * Develop fix template load errors (#1215) * Update README.md (#1217) * Update README.md * Update README.md * Update README.md Co-authored-by: Alyona Teyber * Fix deferred initialization in python on_init event handlers (#1219) * Update object.cpp * Update python.cpp * Update README.md * Update LICENSE * Fiona requirements.py update (#1222) * Fix json error in version output (#1223) * Fix tmy32glm (#1229) * Update requirements.txt * Update tmy32glm.py * Add gridlabd-model subcommand (#1230) * Add gridlabd-model subcommand * Add validation test * Add create_meters tool (#1226) * Fix 'gridlabd help' command output * Pole module fixes for validation (#1221) * Fix subcommand and tool help data * Update fit_filter.py * Update gridlabd-job * Fix json save (#1235) * Add global variable initialization support * Fix json globals to include initial value * Add support for fast install (#1017) * adjusted subcommand syntax due to unknown autoscan error * tested restoring relevant shebang line * adjusted script call method * readjusted remaining subcommands * reversed missed changes * test variable useage * adjusted shell subcommands python to use GLD_BIN variable for path * Adjusted setup to track version build in each versions directory * Updated build script for easier maintenance, readability, and error checking * Updated Python Version to 3.9.13 to see if patch fixes occasional build bugs * adjusted make commands for potential fix in script python build * potential make fix * added check to see if requirements is installing correctly * changed test * changed platform.h to error if PYTHON_EXEC is undefined * adjusted python build to properly overwrite top bin links on new sourcebuild * adjusted python hashbang for testing * tweaked configure.ac * added PYTHON_EXEC to CFLAGS * updated configure, added check test notices * adjusted variables and declaration order in configure * changed to correct variable * updated exec call * Restored original hashbang point to opt/gridlabd/bin/python3 * additional python adjustments * adjusted reference to python3-config location * adjusted variable call in python3 script * added echo to check output of various variables * testing alternative variable * adjusted variable call * updated python makefile variables * updated reference format for variable * adjusted variables again * adjusted additional variables * more adjustments * tweaked makefile * testing variables * further tests * corrected syntax * fixed additional makefile python references * fixed another hardcoded python reference * testing define * adjusted calling command for python selector script * appropriate replacement for python hashbang * Implemented fix for variable python execution path * added missed exec line in convert * Corrected autotests to use version specific python version * corrected more improper python references * Final tweaks for dynamic python implementation. * fully finished code cleanup for darwin installers * updated missed improper python3 call format * Cleaned up debian installers to use new variable system for faster script updates * Minor version adjustments for packages in debian, updated ubuntu install script * Updated documentation and made minor edits * various tweaks * added installs for docker containers, adjusted ldconfig for linux * updated m4sh file to dynamically adjust between linux and darwin python installs * bugfix * fixed minor typo * tweaked test * updated linux images to only build from docker containers * removed unused variable * minor tweak to install-dev * updated reference to find docker if in docker container * added -r for cp, and rm for system files * updated build-image to remove all default libraries from saved libs * tweaked libraries linux fast install * added link to /usr/local/bin for current gridlabd executable * ensured g++ is installed for debian docker * added autoconf build for debian 9 docker * update ubuntu 20 install * tweaks * updated pandas version * Updated install.sh script for web install to include latest updates from dev * removed test output to prevent adding to repository * created readme for fast-install * updated readme, tweaked scripts * Updated install to allow user to submit version for fast install * added flags section to readme * adjusted autoconf version * minor adjustments to update autoconf version used in actions runner * adjusted syntax * added install for sudo package on runner * attempting with apt-get instead of apt * potential fix for github actions * modified actions to use ubuntu container * adjusted apt install order to circumvent tzdata location issue * modified tzdata install line * potential tzdata workaround * potential workaround for git repository issue * fix git repo owner issue on runner * adjusted linux scripts for fast builds using a prepared container * testing container for faster builds * removed environment updates as not used in new container * minor tweaks to enable faster builds * adjusted check path for doxygen so test can actually work * updated monterey x86 installer * updated chown command for site packages * added missing logic to make home/temp directory * Added check for $USER variable to exist, to work around docker container bug * updated fast install scripts with potential fix for python package issues * added potential script for ubuntu 22 * minor tweak * Adjusted chown for all gridlabd package dirs * Added link to /usr/local/bin for installed gridlabd * removed 22 * readd with permissions * fixed minor missed element from build-aux * fixed openssl install on arm to use arm Configure * Added checks to update ownership for install in case of multi-user computers. * Change file permissions/update readme * Removed line from develop workflow due to fixed bug * homebrew deprecated old install command, replaced * testing * adjusted * brought install up to date with install-dev * corrected a pair of bugs in the install script. * minor tweak to optimize build image script * Removed unnecessary extra install script * Directory overhaul and major variable additions * added creation of directory * updated m4sh * fixed minor structural issue * fixed variable * reorganized declarations * adjusted definition method for vars * reformatted to fix char and char const concat * updated strcat for gld var * adjusted syntax * restructured getenv again * adjusted var * changed to braces? * adjusted braces * potential fix * other fix? * adjusted again * adjustment * use getenv without std * other method * wild fix attempt * this hurts * maybe? * maybe? * new version * test * added braces * mirror potential fix * hmmm * test * now? pls? * chance? * try * hum? * hoh? * new try * hmm * giving up after this * updated method for quick test * updated install-dev, added brace * more directory updates * tried removing the -1 for testing * adjusted char types * additional char type mod * removed the * * ugh * adjusted char type * this? * i * minor adjust * PLEASE * test more fixes * and awaaaaaay we go! * additionals * test configname fix * probably wont work * this wont work * test fixies * potential billing library fix * test * revert * mayhaps * revert * adjusted script find function for ca-certs * corrected ca-cert install to account for package version updates * potential fix for module implementation * test fix test for cert.pem * change to -f * corrected implementation in powerflow * theoretical fix to gridlabd version subcommand * corrected link typo in install.sh * test * changed basename to dirname * potential fix install.sh * changed from os.environ to os.getenv * corrected python string syntax * fixed remaining string needing f" * fix path issue * added updated cert check to all darwin installs * fixed bug in change to fast install image build * final fix install-dev * bringing install.sh current with dev * fixed build image for linux * syntax correction * adjust name * potential fix to image build script bug on docker systems * updated ldconfig command install-dev * updated chown to default to root when user undefined * adjusted fast install and build image to separate system libs from package libs * made minor adjustments to scripts * added procps to docker fast install. changed default branch for dev install to develop. * updated readme documentation * fixed mismatch * updated docs, added -r to mac cp commands * test variable passthrough to subshell * retest * test with export * Added prefix support to script install * potential fix install for configure * adjusted directory issue with prefix settings * testing configure update * corrected syntax * fixed minor bug * adjusted variables for dynamic use * potential configure fix * corrected non-variable line in fire danger test * adjusted darwin cp command to darwin standards * updated install.md instructions * updated cloud documentation * fixed typo * tweaked configure.ac to set minimum default python as 3.9 * removed link to python pymalloc * updated ca-cert check to account for multiple directories available at one time * adjusted unnecessary basename * updated installation scripts to clean out unecessary code, package missing dependencies in intel macs * link gettext to lib for dependency resolution * updated install to match dev, and et defaults appropriately * added error check to build image to exit out and prevent strange bugs if version does not exist when run * added ownership update to install script * tweaked command for install and tweaked message for post-install user actions * updated installer scripts * added extra ownership line to ensure smooth install * tweaked install script * tweaked install script * Added a couple tweaks for m1 install and version.sh bug * Update requirements.txt Added pymysql to requirements per the TESS API tech transfer to-do list. * added automated clean before install script runs Co-authored-by: Thistleman Co-authored-by: Duncan Ragsdale <88173870+Thistleman@users.noreply.github.com> * Update load.cpp (#1239) Co-authored-by: Alyona Teyber * Add install tool (#1237) * Add gridlabd install tool * Update Makefile.mk * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py Co-authored-by: Alyona Teyber * Update cmdarg.cpp (#1211) Co-authored-by: Alyona Teyber * Develop update dockerbase (#1245) * Updating base image to an ubuntu based image * Update Dockerfile * Revert "Merge branch 'develop' into develop-fix-help" This reverts commit 675cbb17784958716e0ea0aabbf2f994696ce8ab, reversing changes made to 2f0faab2346d8fae6f19572ad965149bcb324bea. * Bump ipython from 7.31.1 to 8.10.0 in /module/resilience/docs (#1249) * Bump pillow from 9.0.1 to 9.3.0 in /converters (#1224) Bumps [pillow](https://github.com/python-pillow/Pillow) from 9.0.1 to 9.3.0. - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/9.0.1...9.3.0) --- updated-dependencies: - dependency-name: pillow dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump ipython from 7.31.1 to 8.10.0 in /module/resilience/docs Bumps [ipython](https://github.com/ipython/ipython) from 7.31.1 to 8.10.0. - [Release notes](https://github.com/ipython/ipython/releases) - [Commits](https://github.com/ipython/ipython/compare/7.31.1...8.10.0) --- updated-dependencies: - dependency-name: ipython dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Cleaning up double-entered requirements * More dependency clean up * Update test_fire_danger.tif --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Alyona Teyber * Fix ICA violation test speed issues (#1183) * Move node violation scan from sync to commit * Update node.cpp * Add check to avoid unneeded bus voltage fluctuation tests --------- Co-authored-by: Alyona Teyber * Fix error message when branch is not found in repo (#1214) * Fix error message when branch is not found in repo * Update gridlabd-template * Pole module fixes for validation (#1221) * Fix json save (#1235) * Add global variable initialization support * Fix json globals to include initial value * Add support for fast install (#1017) * adjusted subcommand syntax due to unknown autoscan error * tested restoring relevant shebang line * adjusted script call method * readjusted remaining subcommands * reversed missed changes * test variable useage * adjusted shell subcommands python to use GLD_BIN variable for path * Adjusted setup to track version build in each versions directory * Updated build script for easier maintenance, readability, and error checking * Updated Python Version to 3.9.13 to see if patch fixes occasional build bugs * adjusted make commands for potential fix in script python build * potential make fix * added check to see if requirements is installing correctly * changed test * changed platform.h to error if PYTHON_EXEC is undefined * adjusted python build to properly overwrite top bin links on new sourcebuild * adjusted python hashbang for testing * tweaked configure.ac * added PYTHON_EXEC to CFLAGS * updated configure, added check test notices * adjusted variables and declaration order in configure * changed to correct variable * updated exec call * Restored original hashbang point to opt/gridlabd/bin/python3 * additional python adjustments * adjusted reference to python3-config location * adjusted variable call in python3 script * added echo to check output of various variables * testing alternative variable * adjusted variable call * updated python makefile variables * updated reference format for variable * adjusted variables again * adjusted additional variables * more adjustments * tweaked makefile * testing variables * further tests * corrected syntax * fixed additional makefile python references * fixed another hardcoded python reference * testing define * adjusted calling command for python selector script * appropriate replacement for python hashbang * Implemented fix for variable python execution path * added missed exec line in convert * Corrected autotests to use version specific python version * corrected more improper python references * Final tweaks for dynamic python implementation. * fully finished code cleanup for darwin installers * updated missed improper python3 call format * Cleaned up debian installers to use new variable system for faster script updates * Minor version adjustments for packages in debian, updated ubuntu install script * Updated documentation and made minor edits * various tweaks * added installs for docker containers, adjusted ldconfig for linux * updated m4sh file to dynamically adjust between linux and darwin python installs * bugfix * fixed minor typo * tweaked test * updated linux images to only build from docker containers * removed unused variable * minor tweak to install-dev * updated reference to find docker if in docker container * added -r for cp, and rm for system files * updated build-image to remove all default libraries from saved libs * tweaked libraries linux fast install * added link to /usr/local/bin for current gridlabd executable * ensured g++ is installed for debian docker * added autoconf build for debian 9 docker * update ubuntu 20 install * tweaks * updated pandas version * Updated install.sh script for web install to include latest updates from dev * removed test output to prevent adding to repository * created readme for fast-install * updated readme, tweaked scripts * Updated install to allow user to submit version for fast install * added flags section to readme * adjusted autoconf version * minor adjustments to update autoconf version used in actions runner * adjusted syntax * added install for sudo package on runner * attempting with apt-get instead of apt * potential fix for github actions * modified actions to use ubuntu container * adjusted apt install order to circumvent tzdata location issue * modified tzdata install line * potential tzdata workaround * potential workaround for git repository issue * fix git repo owner issue on runner * adjusted linux scripts for fast builds using a prepared container * testing container for faster builds * removed environment updates as not used in new container * minor tweaks to enable faster builds * adjusted check path for doxygen so test can actually work * updated monterey x86 installer * updated chown command for site packages * added missing logic to make home/temp directory * Added check for $USER variable to exist, to work around docker container bug * updated fast install scripts with potential fix for python package issues * added potential script for ubuntu 22 * minor tweak * Adjusted chown for all gridlabd package dirs * Added link to /usr/local/bin for installed gridlabd * removed 22 * readd with permissions * fixed minor missed element from build-aux * fixed openssl install on arm to use arm Configure * Added checks to update ownership for install in case of multi-user computers. * Change file permissions/update readme * Removed line from develop workflow due to fixed bug * homebrew deprecated old install command, replaced * testing * adjusted * brought install up to date with install-dev * corrected a pair of bugs in the install script. * minor tweak to optimize build image script * Removed unnecessary extra install script * Directory overhaul and major variable additions * added creation of directory * updated m4sh * fixed minor structural issue * fixed variable * reorganized declarations * adjusted definition method for vars * reformatted to fix char and char const concat * updated strcat for gld var * adjusted syntax * restructured getenv again * adjusted var * changed to braces? * adjusted braces * potential fix * other fix? * adjusted again * adjustment * use getenv without std * other method * wild fix attempt * this hurts * maybe? * maybe? * new version * test * added braces * mirror potential fix * hmmm * test * now? pls? * chance? * try * hum? * hoh? * new try * hmm * giving up after this * updated method for quick test * updated install-dev, added brace * more directory updates * tried removing the -1 for testing * adjusted char types * additional char type mod * removed the * * ugh * adjusted char type * this? * i * minor adjust * PLEASE * test more fixes * and awaaaaaay we go! * additionals * test configname fix * probably wont work * this wont work * test fixies * potential billing library fix * test * revert * mayhaps * revert * adjusted script find function for ca-certs * corrected ca-cert install to account for package version updates * potential fix for module implementation * test fix test for cert.pem * change to -f * corrected implementation in powerflow * theoretical fix to gridlabd version subcommand * corrected link typo in install.sh * test * changed basename to dirname * potential fix install.sh * changed from os.environ to os.getenv * corrected python string syntax * fixed remaining string needing f" * fix path issue * added updated cert check to all darwin installs * fixed bug in change to fast install image build * final fix install-dev * bringing install.sh current with dev * fixed build image for linux * syntax correction * adjust name * potential fix to image build script bug on docker systems * updated ldconfig command install-dev * updated chown to default to root when user undefined * adjusted fast install and build image to separate system libs from package libs * made minor adjustments to scripts * added procps to docker fast install. changed default branch for dev install to develop. * updated readme documentation * fixed mismatch * updated docs, added -r to mac cp commands * test variable passthrough to subshell * retest * test with export * Added prefix support to script install * potential fix install for configure * adjusted directory issue with prefix settings * testing configure update * corrected syntax * fixed minor bug * adjusted variables for dynamic use * potential configure fix * corrected non-variable line in fire danger test * adjusted darwin cp command to darwin standards * updated install.md instructions * updated cloud documentation * fixed typo * tweaked configure.ac to set minimum default python as 3.9 * removed link to python pymalloc * updated ca-cert check to account for multiple directories available at one time * adjusted unnecessary basename * updated installation scripts to clean out unecessary code, package missing dependencies in intel macs * link gettext to lib for dependency resolution * updated install to match dev, and et defaults appropriately * added error check to build image to exit out and prevent strange bugs if version does not exist when run * added ownership update to install script * tweaked command for install and tweaked message for post-install user actions * updated installer scripts * added extra ownership line to ensure smooth install * tweaked install script * tweaked install script * Added a couple tweaks for m1 install and version.sh bug * Update requirements.txt Added pymysql to requirements per the TESS API tech transfer to-do list. * added automated clean before install script runs Co-authored-by: Thistleman Co-authored-by: Duncan Ragsdale <88173870+Thistleman@users.noreply.github.com> * Update load.cpp (#1239) Co-authored-by: Alyona Teyber * Add install tool (#1237) * Add gridlabd install tool * Update Makefile.mk * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py Co-authored-by: Alyona Teyber * Update cmdarg.cpp (#1211) Co-authored-by: Alyona Teyber * Develop update dockerbase (#1245) * Updating base image to an ubuntu based image * Update Dockerfile * Bump ipython from 7.31.1 to 8.10.0 in /module/resilience/docs (#1249) * Bump pillow from 9.0.1 to 9.3.0 in /converters (#1224) Bumps [pillow](https://github.com/python-pillow/Pillow) from 9.0.1 to 9.3.0. - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/9.0.1...9.3.0) --- updated-dependencies: - dependency-name: pillow dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump ipython from 7.31.1 to 8.10.0 in /module/resilience/docs Bumps [ipython](https://github.com/ipython/ipython) from 7.31.1 to 8.10.0. - [Release notes](https://github.com/ipython/ipython/releases) - [Commits](https://github.com/ipython/ipython/compare/7.31.1...8.10.0) --- updated-dependencies: - dependency-name: ipython dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Cleaning up double-entered requirements * More dependency clean up * Update test_fire_danger.tif --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Alyona Teyber * Fix ICA violation test speed issues (#1183) * Move node violation scan from sync to commit * Update node.cpp * Add check to avoid unneeded bus voltage fluctuation tests --------- Co-authored-by: Alyona Teyber * Reverting unwanted commit to develop 9f68226 --------- Signed-off-by: dependabot[bot] Co-authored-by: Alyona Teyber Co-authored-by: Thistleman Co-authored-by: Duncan Ragsdale <88173870+Thistleman@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Resetting to develop-add-ductbank branch due to merge issues (#1254) * Add link to ductbank from underground lines * Add ductbank to underground line class * Update underground_line.cpp * Add cable temp calcs * Ductbank work in progress * Update Ductbank model.ipynb * Update Ductbank model.ipynb * Ductbank implementation substantially complete * Update Ductbank.md * Update test_ductbank_1of6.glm * Create test_ductbank_2of6.glm * Update test_ductbank.glm * Update Ductbank model.ipynb * Create ductbank.py * Update Underground_line_conductor.md * Update Underground_line.md * Update Ductbank.md * Create box3x2.png * Create Ductbank model reduction.ipynb * Update ductbank work * Update ductbank model reduction docs --------- Co-authored-by: David P. Chassin * Develop add aws install (#1255) * tested restoring relevant shebang line * adjusted script call method * readjusted remaining subcommands * reversed missed changes * test variable useage * adjusted shell subcommands python to use GLD_BIN variable for path * Adjusted setup to track version build in each versions directory * Updated build script for easier maintenance, readability, and error checking * Updated Python Version to 3.9.13 to see if patch fixes occasional build bugs * adjusted make commands for potential fix in script python build * potential make fix * added check to see if requirements is installing correctly * changed test * changed platform.h to error if PYTHON_EXEC is undefined * adjusted python build to properly overwrite top bin links on new sourcebuild * adjusted python hashbang for testing * tweaked configure.ac * added PYTHON_EXEC to CFLAGS * updated configure, added check test notices * adjusted variables and declaration order in configure * changed to correct variable * updated exec call * Restored original hashbang point to opt/gridlabd/bin/python3 * additional python adjustments * adjusted reference to python3-config location * adjusted variable call in python3 script * added echo to check output of various variables * testing alternative variable * adjusted variable call * updated python makefile variables * updated reference format for variable * adjusted variables again * adjusted additional variables * more adjustments * tweaked makefile * testing variables * further tests * corrected syntax * fixed additional makefile python references * fixed another hardcoded python reference * testing define * adjusted calling command for python selector script * appropriate replacement for python hashbang * Implemented fix for variable python execution path * added missed exec line in convert * Corrected autotests to use version specific python version * corrected more improper python references * Final tweaks for dynamic python implementation. * fully finished code cleanup for darwin installers * updated missed improper python3 call format * Cleaned up debian installers to use new variable system for faster script updates * Minor version adjustments for packages in debian, updated ubuntu install script * Updated documentation and made minor edits * various tweaks * added installs for docker containers, adjusted ldconfig for linux * updated m4sh file to dynamically adjust between linux and darwin python installs * bugfix * fixed minor typo * tweaked test * updated linux images to only build from docker containers * removed unused variable * minor tweak to install-dev * updated reference to find docker if in docker container * added -r for cp, and rm for system files * updated build-image to remove all default libraries from saved libs * tweaked libraries linux fast install * added link to /usr/local/bin for current gridlabd executable * ensured g++ is installed for debian docker * added autoconf build for debian 9 docker * update ubuntu 20 install * tweaks * updated pandas version * Updated install.sh script for web install to include latest updates from dev * removed test output to prevent adding to repository * created readme for fast-install * updated readme, tweaked scripts * Updated install to allow user to submit version for fast install * added flags section to readme * adjusted autoconf version * minor adjustments to update autoconf version used in actions runner * adjusted syntax * added install for sudo package on runner * attempting with apt-get instead of apt * potential fix for github actions * modified actions to use ubuntu container * adjusted apt install order to circumvent tzdata location issue * modified tzdata install line * potential tzdata workaround * potential workaround for git repository issue * fix git repo owner issue on runner * adjusted linux scripts for fast builds using a prepared container * testing container for faster builds * removed environment updates as not used in new container * minor tweaks to enable faster builds * adjusted check path for doxygen so test can actually work * updated monterey x86 installer * updated chown command for site packages * added missing logic to make home/temp directory * Added check for $USER variable to exist, to work around docker container bug * updated fast install scripts with potential fix for python package issues * added potential script for ubuntu 22 * minor tweak * Adjusted chown for all gridlabd package dirs * Added link to /usr/local/bin for installed gridlabd * removed 22 * readd with permissions * fixed minor missed element from build-aux * fixed openssl install on arm to use arm Configure * Added checks to update ownership for install in case of multi-user computers. * Change file permissions/update readme * Removed line from develop workflow due to fixed bug * homebrew deprecated old install command, replaced * testing * adjusted * brought install up to date with install-dev * corrected a pair of bugs in the install script. * minor tweak to optimize build image script * Removed unnecessary extra install script * Directory overhaul and major variable additions * added creation of directory * updated m4sh * fixed minor structural issue * fixed variable * reorganized declarations * adjusted definition method for vars * reformatted to fix char and char const concat * updated strcat for gld var * adjusted syntax * restructured getenv again * adjusted var * changed to braces? * adjusted braces * potential fix * other fix? * adjusted again * adjustment * use getenv without std * other method * wild fix attempt * this hurts * maybe? * maybe? * new version * test * added braces * mirror potential fix * hmmm * test * now? pls? * chance? * try * hum? * hoh? * new try * hmm * giving up after this * updated method for quick test * updated install-dev, added brace * more directory updates * tried removing the -1 for testing * adjusted char types * additional char type mod * removed the * * ugh * adjusted char type * this? * i * minor adjust * PLEASE * test more fixes * and awaaaaaay we go! * additionals * test configname fix * probably wont work * this wont work * test fixies * potential billing library fix * test * revert * mayhaps * revert * adjusted script find function for ca-certs * corrected ca-cert install to account for package version updates * potential fix for module implementation * test fix test for cert.pem * change to -f * corrected implementation in powerflow * theoretical fix to gridlabd version subcommand * corrected link typo in install.sh * test * changed basename to dirname * potential fix install.sh * changed from os.environ to os.getenv * corrected python string syntax * fixed remaining string needing f" * fix path issue * added updated cert check to all darwin installs * fixed bug in change to fast install image build * final fix install-dev * bringing install.sh current with dev * fixed build image for linux * syntax correction * adjust name * potential fix to image build script bug on docker systems * updated ldconfig command install-dev * updated chown to default to root when user undefined * adjusted fast install and build image to separate system libs from package libs * made minor adjustments to scripts * added procps to docker fast install. changed default branch for dev install to develop. * updated readme documentation * fixed mismatch * updated docs, added -r to mac cp commands * test variable passthrough to subshell * retest * test with export * Added prefix support to script install * potential fix install for configure * adjusted directory issue with prefix settings * testing configure update * corrected syntax * fixed minor bug * adjusted variables for dynamic use * potential configure fix * corrected non-variable line in fire danger test * adjusted darwin cp command to darwin standards * updated install.md instructions * updated cloud documentation * fixed typo * tweaked configure.ac to set minimum default python as 3.9 * removed link to python pymalloc * updated ca-cert check to account for multiple directories available at one time * adjusted unnecessary basename * updated installation scripts to clean out unecessary code, package missing dependencies in intel macs * link gettext to lib for dependency resolution * updated install to match dev, and et defaults appropriately * added error check to build image to exit out and prevent strange bugs if version does not exist when run * added ownership update to install script * tweaked command for install and tweaked message for post-install user actions * updated installer scripts * added extra ownership line to ensure smooth install * tweaked install script * tweaked install script * Added a couple tweaks for m1 install and version.sh bug * Update requirements.txt Added pymysql to requirements per the TESS API tech transfer to-do list. * added automated clean before install script runs --------- Co-authored-by: Thistleman Co-authored-by: Duncan Ragsdale <88173870+Thistleman@users.noreply.github.com> * Restoring missing commits (#1256) * Move node violation scan from sync to commit * Update node.cpp * Add check to avoid unneeded bus voltage fluctuation tests --------- Co-authored-by: David P. Chassin Co-authored-by: David P. Chassin * Add ductbank thermal model (#1257) * Add link to ductbank from underground lines * Add ductbank to underground line class * Update underground_line.cpp * Add cable temp calcs * Ductbank work in progress * Update Ductbank model.ipynb * Update Ductbank model.ipynb * Ductbank implementation substantially complete * Update Ductbank.md * Update test_ductbank_1of6.glm * Create test_ductbank_2of6.glm * Update test_ductbank.glm * Update Ductbank model.ipynb * Create ductbank.py * Update Underground_line_conductor.md * Update Underground_line.md * Update Ductbank.md * Create box3x2.png * Create Ductbank model reduction.ipynb * Update ductbank work * Update ductbank model reduction docs --------- Co-authored-by: David P. Chassin * Update vegetation geodata package to include contact (#1205) * Add vege contact Add the vege contact model * Update geodata_vegetation.py start to add strike model * Update geodata_vegetation.py Add a single tree strike function * Update geodata_vegetation.py Update the tree strike model consider tree numbers * Block template load of non-GLM files when module is loaded * Fix missing filename and bad line numbering when loading template GLM files * Update geodata_powerline.py Add vegetation contact and tree strike model * Update geodata_vegetation.py Recover the vegetation file --------- Co-authored-by: Alyona Teyber * Updating documentation to reflect config.csv converter use (#1259) * Add json2glm converter options to ignore the clock (#1233) * Add create_meters tool * Update create_meters.py * Update create_meters.py * Update load.cpp * Adding no clock option for json2glm * Update load.cpp * Update globals.cpp * Update globals.cpp * Update gridlabd-convert * Update json2glm.py * Update json2glm.py * Update load.cpp * Fixed meter creation issues * Update node.cpp * Fixing merge error * Update json2glm.py * Adding documentation * Update ieee13-meters.glm --------- Co-authored-by: David P. Chassin Co-authored-by: David P. Chassin * Add cyme converter (#1204) * Create test_xls-spida2csv-network.csv * Create test_xls-spida2csv-network.glm * Update xls-spida2csv-geodata.py * Update xls-spida2csv-geodata.py * Update xls-spida2csv-geodata.py * Update pole.cpp * Update pole.h * Update pole_configuration.cpp * Update pole_configuration.h * Update pole_mount.cpp * Update pole_mount.h * Update pole.cpp * Update pole.h * Update pole_mount.cpp * Update pole_mount.h * Update test_pole.csv * Update pole.cpp * Update pole_mount.cpp * Update pole_mount.h * Update Makefile.mk * Create pole_analysis.py * Update pole_analysis.py * Update json2png.py * Update Mdb_files.md * Update mdb-cyme2glm.py * Update mdb2glm.py * change test case IEEE-13-cyme to IEEE-13-cyme-object * add testcase for cyme converter Add autotest case for converter from CYME MDB to gridlabd GLM network * Update Mdb_files.md * Added options to MDB converter doc * Fixed small errors * Updated requirements txt for cyme converter * Removed duplicate dependency --------- Co-authored-by: Fuhong Xie Co-authored-by: David P. Chassin Co-authored-by: Alyona Teyber Co-authored-by: Mitchell Victoriano Co-authored-by: Mitchell Victoriano Co-authored-by: Mitchell Victoriano <47313912+MitchellAV@users.noreply.github.com> * Develop implement venv (#1253) * potential venv test 1 * corrected typos * additional modifications * modified routing * tweaked config test fix * testing fix * tweaked more * potential path fix for use with venv * refined pythonpath * debian 11 test version * fix for instance where home temp folder does not exist * testing change * adjusted pathing * fixed ldconfig * fixed * test using system python * tweaked script * fixed incorrect variable * tweak * uncommented python build * added exports for library paths to test build on debian * bugfixes and typo corrections * fixed typos for initial setup * corrected run order * added /usr/local to paths * test flags * potential loader fix * testing fix * tweaked syntax for intended meaning * adjusted c reference to bindir * Fixed m4sh python3 config reference * moved debian process to config.ac * adjusted command scripts * tweak for logging directory * fixed command * YEAST * tweaking commands * modified scripts * tweaked script for errors * adjusted prefix checks * tweaked script * adjusted configure script * testing rewrites * adjusted script * adjusted config.ac and linux build scripts for new process * removed case format due to bug with configure * removed -q flag from grep command for conditional tests * potential fix for version check bug * adjusted host_os check due to aarch64 particularities * testing * test this * more testing * alternative implementation * added missing ")" * bug/typo * testing alternate implementation * testing alternate implementation * updated for POSIX shell * testing * removed testing syntax checks * removed unnecessary code that occasionally wiped cloned directory * potential m1 setup venv * m1 install setup * adjusted config * potential fix * added venv support for mac * fixed reference in script * tweaks * fixed make system * retest tweaked fix * Create setup-Darwin-22.sh * testing * try 3 * fixed makefile.am * Update setup-Linux-debian-11.sh (#1269) * Update setup-Linux-debian-11.sh * Update setup-Linux-debian-10.sh * Update setup-Linux-debian-9.sh * Update setup-Linux-ubuntu-22.sh * Update setup-Linux-ubuntu-20.sh * Update setup-Linux-ubuntu-18.sh * Update setup-Linux-ubuntu-16.sh * Update setup-Linux-debian-11.sh (#1270) * Update setup-Linux-debian-11.sh * Update setup-Linux-debian-10.sh * Update setup-Linux-debian-9.sh * Update setup-Linux-ubuntu-22.sh * Update setup-Linux-ubuntu-20.sh * Update setup-Linux-ubuntu-18.sh * Update setup-Linux-ubuntu-16.sh * fixed arm brew rference in intel * Update develop.yml * Update develop.yml * Update develop.yml --------- Co-authored-by: Alyona Teyber * Update python.cpp (#1261) * Update unitfile.txt (#1263) * Fix issue with CYME converter for CYME 9 Rev 6 MDB files (#1271) * Create test_xls-spida2csv-network.csv * Create test_xls-spida2csv-network.glm * Update xls-spida2csv-geodata.py * Update xls-spida2csv-geodata.py * Update xls-spida2csv-geodata.py * Update pole.cpp * Update pole.h * Update pole_configuration.cpp * Update pole_configuration.h * Update pole_mount.cpp * Update pole_mount.h * Update pole.cpp * Update pole.h * Update pole_mount.cpp * Update pole_mount.h * Update test_pole.csv * Update pole.cpp * Update pole_mount.cpp * Update pole_mount.h * Update Makefile.mk * Create pole_analysis.py * Update pole_analysis.py * Update json2png.py * Update Mdb_files.md * Update mdb-cyme2glm.py * Update mdb2glm.py * change test case IEEE-13-cyme to IEEE-13-cyme-object * add testcase for cyme converter Add autotest case for converter from CYME MDB to gridlabd GLM network * Update Mdb_files.md * Added options to MDB converter doc * Fixed small errors * Updated requirements txt for cyme converter * Removed duplicate dependency --------- Co-authored-by: Fuhong Xie Co-authored-by: David P. Chassin Co-authored-by: Alyona Teyber Co-authored-by: Mitchell Victoriano * Fixing test_datasets.glm (#1267) * Update geodata_powerline.py * Update geodata_powerline.py * Update README.md Identify US Government Right per the original GridLAB-D license. * Update user manuals (#862) Co-authored-by: Alyona Teyber * Fix date/time handling in create_players tool (#1236) Co-authored-by: David P. Chassin * (#1277) Added additional check and errors for non-SPCT transformers that are connected to triplex_node objects, or have an "S" phase. (#1281) Migration of fix from gridlabd issue 1432 * Fix build warnings (#1279) * Fix warnings on Mac * Fix dg control error * Fix linux warning in source * Fixed incorrect buffer format limits * Fixed module warnings on linux * Update requirements * Update configure.ac * Update requirements.txt * Fix validation errors * Fix python config * Move configure commands that change environment to makefile * Fix makefile * Update gridlabd.in * Fix python clean * Update test_plot.png * Update makefiles * Update requirements.txt * Update requirements process * Added python requirements for alternate systems * Charge Darwin ARM64 requirements filename * Move python os/cpu requirements to python folder * Update version.sh * Add Darwin 19 python requirements * Add requirements.txt generator * Update develop.yml * Update version.sh * Update develop.yml * Update requirements-debian11-x86_64.txt * Delete requirements.txt * Update .gitignore * Remove static requirements * Update makefile to build requirements.txt * Update develop.yml * Move requirements.csv to python folder * Update python venv support * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update requirements.csv * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update Makefile.am * Update Makefile.am * Update Makefile.am * Update develop.yml * Update Makefile.am * Update develop.yml * Update develop.yml * Update develop.yml * fixed setuptools install * testing required installs before requirements can be run in batch.... * testing complete format import * if this works, I will cry inside * testing changing gdal version based on newer API available for debian 11 * testing unpinned raserio install * fixed rasterio, required newer version compatible with python3.10 * adjusted version * Move explicit pip installs to requirements.csv * Update requirements.py * Update requirements.py * Update requirements.csv * Fix test_fire_report autotest * Update develop.yml * Update Makefile.am * Fix Darwin 20 validation errors * Update gridlabd-plot * Update create_player.py * Update fit_filter.py * Update test_fit_filter_opt.glm * Update Makefile.am * Update market_model.py * Update test_market_model_opt.glm * Update requirements.csv * Update requirements.csv * Update README.md * Update README.md * Update requirements.py * Fix source error * Fix filename buffer overruns * Update Makefile.mk * Update metrics_collector_writer.cpp * Update requirements.csv * Update Makefile.am * Update Makefile.am * Update requirements.csv * Update requirements.py * Update requirements.py * Update requirements.py * Update requirements.csv * Update requirements.py * Update requirements.csv * Update requirements.py * Update develop.yml * Update Makefile.mk * Fix python-install * Update requirements.py * Update Makefile.am * Update Makefile.mk * Update Makefile.am * Update Makefile.mk * Update Makefile.mk * Update Makefile.mk * Update Makefile.mk * Update Makefile.mk * Update globals.cpp * Update globals.cpp * Update globals.cpp * Update Makefile.mk * Update globals.cpp * Update globals.cpp * Update cmdarg.cpp * Update gridlabd.m4sh * Update gridlabd.in * Fix pythonpath * Update globals.cpp * Update globals.cpp * Update globals.cpp * Fix pythonpath initialization * Update globals.cpp * Update requirements.csv * Update gridlabd.m4sh * Update gridlabd.in * Update globals.cpp --------- Co-authored-by: Duncan Ragsdale <127135808+Stanford-CVX-group@users.noreply.github.com> * Add advanced load model class to powerflow (#1216) * Add building class to powerflow * Add inputs to building * Simplify model * Update building implementation * Update building * Add building autotest * Fix main gridlabd build error from python setup * Add building subcommand * Update gridlabd-building * Update gridlabd-building * Update building subcommand and docs * Update gridlabd-building * Update Building.md * Update Building.md * Update Building.md * Update Building.md * Update building.h * Add jama125 * Add tnt126 * Work progress on building load model * Create tnt.h * Initial general building load model working * Update test_building.glm * Add building load autotest * Update building.h * Update Building.md * Update Building.md * Update Building.md * Update Building.md * Update test_building.glm * Update test_building.csv * Add power factor/fractions for phases * Update test_building.glm * Update building.cpp * Link weather to building loads * Create test_building_loadshapes.csv * Update building.cpp * Update meter interval implementation * Update test_building_10.glm * Create test_building_tmy.glm * Update building.cpp * Update gridlabd.h * Update building.cpp * Update test_building_tmy.glm * Create test_building_tmy.csv * Update tnt_array2d.h * Update tnt_cmat.h * Update building.cpp * Update building autotests * Update gridlabd.h * Update Makefile.mk * Create building_defaults.csv * Update building.h * Update building.cpp * Update test_building_1.glm * Update test_building_1.csv * Create .gitignore * Update building.h * Add CEUS loadshape data * Create .gitignore * Delete ceus_loadshapes.csv * Update README.md * Update README.md * Update data files * Add loadshape reader * Update building.cpp * Update loadshape * Fix loader error reporting of filename and line number * Update loadshape data * Update building docs * Update building model * Update loadshapes for Btu to kWh conversion of gas enduses * Add electrification and correct ZIP component units * Update building.cpp * Add occupancy support * Delete ceus_loadshapes 2.csv * Remove HVAC from enduse loadshape data * Update load calcs * Fixed electric heating flag * Finish occupancy model * Fix schedule * Stub in dynamic solver * Create .gitignore * Update Building.md * Update Building.md * Add PV export limits * Update autotests for power factor correction * Add support for energy storage and release * Add VAR controllers to support common DER interconnection standards * Update documentation * Finalize autotests * Code cleanup * Add industrial load model * Fix industrial module autotest conflicts with powerflow module * Create Advanced loads.md * Update Advanced loads.md * Add public_service loads * Update advanced load docs * Add agricultural loads * Update advanced loads * Update Advanced_loads.md * Update Public_service.md * Update public service code and autotest * Add house model for performance comparison to building model * Complete agricultural load implementation and autotesting * Update public_service.h * Update Agricultural.md * Start work on enduse load composition data * Update configure.ac * Update Building model.ipynb * Update Enduse load composition.ipynb * Update Enduse load composition.ipynb * Update building_defaults.csv * Change building_defaults.csv to provide thermal properties per unit floor area * Fix object_isa for buildings are detected as loads * Update object.cpp * Fix load update function for new loads * Add building data validation scripts and images * Correct CEUS gas loadshapes * Update resstock data * Update test_building_1.csv --------- Co-authored-by: Alyona Teyber * Add loaddata subcommand (#1272) * Create get_resstock.py * Create gridlabd-loaddata * Delete get_resstock.py * Update gridlabd-loaddata * Update gridlabd-loaddata * Update gridlabd-loaddata * Update Makefile.mk * Add autotest for loaddata * Update gridlabd-loaddata * Create Loaddata.md * Update to docs and glm output * Add docs * Add create_schedule tool (#1278) * Fix setup/build/install scripts (#1282) * Update gridlabd.h * Update setup.cpp * Update property.h * Update Makefile.am * Update Linux-ubuntu-20.sh * Create Linux-ubuntu-22.sh * Update Linux-ubuntu-22.sh * Update Linux-ubuntu-20.sh * Update Makefile.am * Update Makefile.am * Update README.md * Update Makefile.am * Update configure.ac * Add install folder * Update tape_plot.cpp * Update controller.cpp * Update tape_plot.cpp * Create Linux-debian-11.sh * Create debian-11.sh * Update Linux-debian-11.sh * Update Linux-ubuntu-20.sh * Update Linux-ubuntu-22.sh * Update setup.sh * Update setup.sh * Update README.md * Change to GRIDLABD_ORIGIN usage * Update setup.sh * Add no-cache option to curl calls * Work on fast install * Work progress on linux install images * Update Makefile.am * Work progress * Update build_number * Work progress * Work progress * Work progress * Update Linux.sh * Update Linux.sh * Update Linux.sh * Update Linux.sh * Update Darwin.sh * Update create.sh * Update Makefile.am * Update setup-dev.sh * Update Makefile.am * Update Makefile.am * Update Makefile.am * Update Makefile.am * Update version.sh * Update requirements.py * Update Makefile.am * Update build_number * Update Makefile.am * Update Makefile.am * Update build_number * Update Makefile.am * Update README.md * Update install.sh * Update ubuntu_22-x86_64.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Clean up root folder * More cleanup * Update install.sh * Update install.sh * Update build.sh * Update setup.sh * Update install.sh * Update README.md * Update build.sh * Update README.md * Update Makefile.am * Update build_number * Update Makefile.am * Update ubuntu_20-x86_64.sh * Update Makefile.am * Create ubuntu_20.sh * Update ubuntu_22.sh * Update Makefile.am * Update README.md * Change ~/.venv/gridlabd to ~/.gridlabd * work update * Update version.sh * Fix version name * Fix macos build on ventura * Fix additional ventura build errors * Update ubuntu_22-x86_64.sh * Update ubuntu_20-x86_64.sh * Update configure.ac * Fix python3.10-config link * Update configure.ac * Update Makefile.am * Update README.md * Work progress * Update setup scripts * Fix setup filename * Update darwin_22-x86_64.sh * Update setup.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update frequency_gen.cpp * Create darwin_20-x86_64.sh * Create darwin_21-x86_64.sh * Update ubuntu_20-x86_64.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update init.cpp * Update install.sh * Install script update * Update Makefile.am * Update Makefile.am * Fix system target links * Update setup scripts * Update setup scripts * Update scripts * Update scripts * Update build.sh * Update installer * Update .gitignore * Delete config.cache * Update README.md * Remove old setup scripts * Update README.md * Update README.md * Fix setup issues * Update build and setup help and options * Update Makefile.am * Update README.md * Update Linux.sh * Update build.sh * Update build.sh * Changed all instances of "hipas" to "slacgismo" in preparation for transfer to LF Energy * Update setup.sh * Update Makefile.am * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update workflows to use new setup/build process * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update workflows * Fix tnt_126 warnings * Fix tools/test_create_schedule.py * Update .gitignore * Update .gitignore * Reorganize .gitignore * Fix brackets in tnt_126 fortran headers * Undo erroneous namespace updates * Cosmetic updates * Documentation updates * Create README.md * Update .giti… * Fix repo name (#1296) * Remove gldcore (again) * Update version.h * Change version to 4.3.1 (chiba-1) and fix resulting autotest errors * Add Windows gridlabd.bat to README * Fixing typo in cooling_cop units (#1152) * Add support for module template folder (#1159) * Add support for module template folder * Add support for blocking load of module template files * Update gridlabd-template * Update gridlabd-geodata (#1153) * Remove deprecated variables (#1151) * Fix bad autotest timezones * Fix generators module deprecated properties * Update recorder.cpp * Fix powerflow deprecations * Fix market deprecations * Fix autotests with deprecated usage * Fix powerflow autotests * Fix reliability autotests * Fix source autotest * Fix powerflow autotest failures * Update triplex_node.cpp * Add missing powerflow switch autotests (#1156) * Add switch tests * Update powerflow switch coordinator autotest * Change slacgismo to hipas (#1155) * Fix build folder (#1154) * Update main.cpp (#1147) * Add powerflow violation detection (#1164) * Update property.cpp * Add module global variable and node property to set voltage violation threshold * Add default continuous and emergency ratings * Add DER voltage fluctuation test implementation to powerflow now * Update docs * Add node voltage violation watch test * Fix node voltage fluctuation DER test * Create test_node_voltage_fluctuation.glm * Update powerflow_object.cpp * Rename test_node_voltage_violation * Add powerflow commits for all links * Add test_link_overcurrent to powerflow module * Add actual voltage values to violation reports * Fix current violation detection * Fix voltage fluctuation checks * Fix timezones in violation tests * Update test_node_voltage_fluctuation.csv * Fix incorrect timezone usage in violation record * Update test results * Fix switch_coordinator precommit definition * Fix violation counter * Update gridlabd-version (#1166) * Add support for spidacalc equipment (#1160) * Create test_xls-spida2csv-network.csv * Create test_xls-spida2csv-network.glm * Update xls-spida2csv-geodata.py * Update xls-spida2csv-geodata.py Co-authored-by: David P. Chassin Co-authored-by: Alyona Teyber * Add service_level flag to powerflow meters (#1162) * Add is_critical flag to powerflow meter * Update Meter.md * Change to service_level instead of is_critical Co-authored-by: Alyona Teyber * Fix python solver (#1058) * Update solver_py.cpp * Update solver_py.cpp * Added numpy array creation support * Implement MLE solver bus mapping * Fix busdata mapping errors * Change output to dataframe for improved readability * Update test_IEEE_13_MLE.glm * Update setup-Linux-amzn-2.sh * Create setup-Linux-ubuntu-20.sh * Update setup-Linux-ubuntu-20.sh * Update setup-Linux-ubuntu-20.sh * Update setup-Darwin-20.sh * Update setup-Linux-ubuntu-20.sh * Update version.sh * Update setup-Linux-amzn-2.sh * Update setup-Linux-ubuntu-20.sh * Update solver_py.cpp * Update test_IEEE_13_MLE.glm * Update solver_py.cpp * Update solver_py.cpp * Update solver_nr.cpp * Update solver_py.cpp * Fix python solver copyback NR initialization error * Update solver_nr.cpp * Update solver_nr.cpp * Fix NR profiler formatting * Create Solver_profile_csv.md * Update solver_nr.cpp Co-authored-by: Alyona Teyber * Fix voltage violation detection implementation errors (#1170) * Update gridlabd-version * Fix missing voltage_fluctuation_threshold global in powerflow * Fixes to variable names * Fix voltage violation logic * Add hosting capacity documentation * Add DER_violation_test global * Fix child node voltage fluctuation test Co-authored-by: Alyona Teyber * Update nsrdb_weather.py (#1168) Co-authored-by: Alyona Teyber * Add fire danger tool (#1146) * Create fire_danger.py * Update Makefile.mk * Update fire_danger.py * Update fire_danger.py * Update fire_danger.py * Update fire_danger.py * Update fire_danger.py * Update fire_danger.py * Update fire_danger.py * Update fire_danger.py * Add show option to fire_danger tool * Update fire_danger.py * Update requirements.txt * Adding geodata_firerisk package * Modified unit test & general clean up * Rename geodata_fireRisk.py to geodata_firerisk.py * Create Fire_danger.md * Add fire_danger autotest and documentation Co-authored-by: ktehranchi <83722342+ktehranchi@users.noreply.github.com> Co-authored-by: Alyona Teyber * Update gridlabd-version * Add fire incident report tool (#1143) * Add fire report tool * Update setup.py * Update fire_report.py * Update fire_report.py * Update fire_report.py * Create Fire_report.md * Create test_fire_report.csv * Create test_fire_report.glm * Update fire_report.py * Update fire_report.py * Update geodata_vegetation.py * Update geodata_vegetation.py * Update Fire_report.md Co-authored-by: Fuhong Xie Co-authored-by: Alyona Teyber * Update gridlabd-version * Update gridlabd-version * Develop fix voltage violation detection (#1173) * Update gridlabd-version * Fix missing voltage_fluctuation_threshold global in powerflow * Fixes to variable names * Fix voltage violation logic * Add hosting capacity documentation * Add DER_violation_test global * Fix child node voltage fluctuation test * Update node.cpp * Update Dockerfile * Update load.cpp (#1177) * Add missing default fuse replacement time (#1176) * Fix copyright dates/info on splash screen * Update version number in docs * Update json2md.py * Update load.cpp * Update market documentation * Update node.cpp * Add support for reverse geocode (#1182) * Add airport lookup (#1181) * Add meteostat tool (#1180) * Add session 1 tutorials (#1185) * Add session 1 tutorials * Update Resources.md * Update tutorial landing page * Update Makefile.mk * Update tutorial player * Update to use library.csv data * Update Makefile.mk * Update and rename Datetime.md to Timestamp.md * Update load.cpp * Fix meteostat autotest * Update load.cpp * Update object.cpp * Update gridlabd-template * Update gridlabd-template * Create README.md * Fix meteostat autotest * Update gridlabd-template * Stop meteostat instability from causing autotest failures * Fix class event handlers (#1192) * Add xlsx-workbook2csv-table converter (#1191) * Add 'read_dlp' tool (#1188) * Add setup for version.gridlabd.us server (#1178) * Update library.csv * Update gridlabd-template * Fix node undervoltage violation limit (#1199) * Update node.cpp * Update node.cpp * Update Node.md * Removing print statement from test_class_event_handler.py Co-authored-by: Alyona Teyber * Update python.cpp * Update object.cpp * Fix sprintf vulnerabilities (#1195) * Fix core sprintf vulnerabilities * Update climate.cpp * Fix battery module * Fix market module * Fix powerflow module * Fix revenue module * Fix tape module * Update test_table2glm.glm * Update test_table2glm_noclass.glm * Update test_assert.glm * Fix tape flush validation procedure * Update convert.cpp * Update test_class_event_handler.py * Update climate.h * Fix improper use of return value from snprintf * Finished fixing the sprintf problems. * Update test_assert.glm * Update assert.cpp * Update test_assert.glm * Update gridlabd.h * Update assert.cpp Co-authored-by: Alyona Teyber * Enhance pole analysis (#1186) * Create test_xls-spida2csv-network.csv * Create test_xls-spida2csv-network.glm * Update xls-spida2csv-geodata.py * Update xls-spida2csv-geodata.py * Update xls-spida2csv-geodata.py * Update pole.cpp * Update pole.h * Update pole_configuration.cpp * Update pole_configuration.h * Update pole_mount.cpp * Update pole_mount.h * Update pole.cpp * Update pole.h * Update pole_mount.cpp * Update pole_mount.h * Update test_pole.csv * Update pole.cpp * Update pole_mount.cpp * Update pole_mount.h * Update Makefile.mk * Create pole_analysis.py * Update pole_analysis.py * Create test_pole_analysis.glm * Create test_pole_analysis_opt.csv * Create test_pole_analysis_opt.glm * Update pole_analysis.py * Update pole_analysis.py * Fixed Pandas read_excel xlsx issue * Fix pandas version across all requirements.txt * Changed autotests affected by pandas rounding Co-authored-by: David P. Chassin Co-authored-by: Mitchell Victoriano * Update Meter.md (#1207) * Updating docker image base (#1208) * Update Dockerfile * Update develop.yml * Update master.yml * Fix expansions for loader (#1206) * Update load.cpp * Create Expansion.md Co-authored-by: David P. Chassin * Update requirements.txt (#1209) * Update requirements.txt * Upgrading to py 3.9.6 * Updating base from slacgismo to hipas for github actions * Upgrade shapely * Develop fix template load errors (#1215) * Update README.md (#1217) * Update README.md * Update README.md * Update README.md Co-authored-by: Alyona Teyber * Fix deferred initialization in python on_init event handlers (#1219) * Update object.cpp * Update python.cpp * Update README.md * Update LICENSE * Fiona requirements.py update (#1222) * Fix json error in version output (#1223) * Fix tmy32glm (#1229) * Update requirements.txt * Update tmy32glm.py * Add gridlabd-model subcommand (#1230) * Add gridlabd-model subcommand * Add validation test * Add create_meters tool (#1226) * Fix 'gridlabd help' command output * Pole module fixes for validation (#1221) * Fix subcommand and tool help data * Update fit_filter.py * Update gridlabd-job * Fix json save (#1235) * Add global variable initialization support * Fix json globals to include initial value * Add support for fast install (#1017) * adjusted subcommand syntax due to unknown autoscan error * tested restoring relevant shebang line * adjusted script call method * readjusted remaining subcommands * reversed missed changes * test variable useage * adjusted shell subcommands python to use GLD_BIN variable for path * Adjusted setup to track version build in each versions directory * Updated build script for easier maintenance, readability, and error checking * Updated Python Version to 3.9.13 to see if patch fixes occasional build bugs * adjusted make commands for potential fix in script python build * potential make fix * added check to see if requirements is installing correctly * changed test * changed platform.h to error if PYTHON_EXEC is undefined * adjusted python build to properly overwrite top bin links on new sourcebuild * adjusted python hashbang for testing * tweaked configure.ac * added PYTHON_EXEC to CFLAGS * updated configure, added check test notices * adjusted variables and declaration order in configure * changed to correct variable * updated exec call * Restored original hashbang point to opt/gridlabd/bin/python3 * additional python adjustments * adjusted reference to python3-config location * adjusted variable call in python3 script * added echo to check output of various variables * testing alternative variable * adjusted variable call * updated python makefile variables * updated reference format for variable * adjusted variables again * adjusted additional variables * more adjustments * tweaked makefile * testing variables * further tests * corrected syntax * fixed additional makefile python references * fixed another hardcoded python reference * testing define * adjusted calling command for python selector script * appropriate replacement for python hashbang * Implemented fix for variable python execution path * added missed exec line in convert * Corrected autotests to use version specific python version * corrected more improper python references * Final tweaks for dynamic python implementation. * fully finished code cleanup for darwin installers * updated missed improper python3 call format * Cleaned up debian installers to use new variable system for faster script updates * Minor version adjustments for packages in debian, updated ubuntu install script * Updated documentation and made minor edits * various tweaks * added installs for docker containers, adjusted ldconfig for linux * updated m4sh file to dynamically adjust between linux and darwin python installs * bugfix * fixed minor typo * tweaked test * updated linux images to only build from docker containers * removed unused variable * minor tweak to install-dev * updated reference to find docker if in docker container * added -r for cp, and rm for system files * updated build-image to remove all default libraries from saved libs * tweaked libraries linux fast install * added link to /usr/local/bin for current gridlabd executable * ensured g++ is installed for debian docker * added autoconf build for debian 9 docker * update ubuntu 20 install * tweaks * updated pandas version * Updated install.sh script for web install to include latest updates from dev * removed test output to prevent adding to repository * created readme for fast-install * updated readme, tweaked scripts * Updated install to allow user to submit version for fast install * added flags section to readme * adjusted autoconf version * minor adjustments to update autoconf version used in actions runner * adjusted syntax * added install for sudo package on runner * attempting with apt-get instead of apt * potential fix for github actions * modified actions to use ubuntu container * adjusted apt install order to circumvent tzdata location issue * modified tzdata install line * potential tzdata workaround * potential workaround for git repository issue * fix git repo owner issue on runner * adjusted linux scripts for fast builds using a prepared container * testing container for faster builds * removed environment updates as not used in new container * minor tweaks to enable faster builds * adjusted check path for doxygen so test can actually work * updated monterey x86 installer * updated chown command for site packages * added missing logic to make home/temp directory * Added check for $USER variable to exist, to work around docker container bug * updated fast install scripts with potential fix for python package issues * added potential script for ubuntu 22 * minor tweak * Adjusted chown for all gridlabd package dirs * Added link to /usr/local/bin for installed gridlabd * removed 22 * readd with permissions * fixed minor missed element from build-aux * fixed openssl install on arm to use arm Configure * Added checks to update ownership for install in case of multi-user computers. * Change file permissions/update readme * Removed line from develop workflow due to fixed bug * homebrew deprecated old install command, replaced * testing * adjusted * brought install up to date with install-dev * corrected a pair of bugs in the install script. * minor tweak to optimize build image script * Removed unnecessary extra install script * Directory overhaul and major variable additions * added creation of directory * updated m4sh * fixed minor structural issue * fixed variable * reorganized declarations * adjusted definition method for vars * reformatted to fix char and char const concat * updated strcat for gld var * adjusted syntax * restructured getenv again * adjusted var * changed to braces? * adjusted braces * potential fix * other fix? * adjusted again * adjustment * use getenv without std * other method * wild fix attempt * this hurts * maybe? * maybe? * new version * test * added braces * mirror potential fix * hmmm * test * now? pls? * chance? * try * hum? * hoh? * new try * hmm * giving up after this * updated method for quick test * updated install-dev, added brace * more directory updates * tried removing the -1 for testing * adjusted char types * additional char type mod * removed the * * ugh * adjusted char type * this? * i * minor adjust * PLEASE * test more fixes * and awaaaaaay we go! * additionals * test configname fix * probably wont work * this wont work * test fixies * potential billing library fix * test * revert * mayhaps * revert * adjusted script find function for ca-certs * corrected ca-cert install to account for package version updates * potential fix for module implementation * test fix test for cert.pem * change to -f * corrected implementation in powerflow * theoretical fix to gridlabd version subcommand * corrected link typo in install.sh * test * changed basename to dirname * potential fix install.sh * changed from os.environ to os.getenv * corrected python string syntax * fixed remaining string needing f" * fix path issue * added updated cert check to all darwin installs * fixed bug in change to fast install image build * final fix install-dev * bringing install.sh current with dev * fixed build image for linux * syntax correction * adjust name * potential fix to image build script bug on docker systems * updated ldconfig command install-dev * updated chown to default to root when user undefined * adjusted fast install and build image to separate system libs from package libs * made minor adjustments to scripts * added procps to docker fast install. changed default branch for dev install to develop. * updated readme documentation * fixed mismatch * updated docs, added -r to mac cp commands * test variable passthrough to subshell * retest * test with export * Added prefix support to script install * potential fix install for configure * adjusted directory issue with prefix settings * testing configure update * corrected syntax * fixed minor bug * adjusted variables for dynamic use * potential configure fix * corrected non-variable line in fire danger test * adjusted darwin cp command to darwin standards * updated install.md instructions * updated cloud documentation * fixed typo * tweaked configure.ac to set minimum default python as 3.9 * removed link to python pymalloc * updated ca-cert check to account for multiple directories available at one time * adjusted unnecessary basename * updated installation scripts to clean out unecessary code, package missing dependencies in intel macs * link gettext to lib for dependency resolution * updated install to match dev, and et defaults appropriately * added error check to build image to exit out and prevent strange bugs if version does not exist when run * added ownership update to install script * tweaked command for install and tweaked message for post-install user actions * updated installer scripts * added extra ownership line to ensure smooth install * tweaked install script * tweaked install script * Added a couple tweaks for m1 install and version.sh bug * Update requirements.txt Added pymysql to requirements per the TESS API tech transfer to-do list. * added automated clean before install script runs Co-authored-by: Thistleman Co-authored-by: Duncan Ragsdale <88173870+Thistleman@users.noreply.github.com> * Update load.cpp (#1239) Co-authored-by: Alyona Teyber * Add install tool (#1237) * Add gridlabd install tool * Update Makefile.mk * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py Co-authored-by: Alyona Teyber * Update cmdarg.cpp (#1211) Co-authored-by: Alyona Teyber * Develop update dockerbase (#1245) * Updating base image to an ubuntu based image * Update Dockerfile * Revert "Merge branch 'develop' into develop-fix-help" This reverts commit 675cbb17784958716e0ea0aabbf2f994696ce8ab, reversing changes made to 2f0faab2346d8fae6f19572ad965149bcb324bea. * Bump ipython from 7.31.1 to 8.10.0 in /module/resilience/docs (#1249) * Bump pillow from 9.0.1 to 9.3.0 in /converters (#1224) Bumps [pillow](https://github.com/python-pillow/Pillow) from 9.0.1 to 9.3.0. - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/9.0.1...9.3.0) --- updated-dependencies: - dependency-name: pillow dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump ipython from 7.31.1 to 8.10.0 in /module/resilience/docs Bumps [ipython](https://github.com/ipython/ipython) from 7.31.1 to 8.10.0. - [Release notes](https://github.com/ipython/ipython/releases) - [Commits](https://github.com/ipython/ipython/compare/7.31.1...8.10.0) --- updated-dependencies: - dependency-name: ipython dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Cleaning up double-entered requirements * More dependency clean up * Update test_fire_danger.tif --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Alyona Teyber * Fix ICA violation test speed issues (#1183) * Move node violation scan from sync to commit * Update node.cpp * Add check to avoid unneeded bus voltage fluctuation tests --------- Co-authored-by: Alyona Teyber * Fix error message when branch is not found in repo (#1214) * Fix error message when branch is not found in repo * Update gridlabd-template * Pole module fixes for validation (#1221) * Fix json save (#1235) * Add global variable initialization support * Fix json globals to include initial value * Add support for fast install (#1017) * adjusted subcommand syntax due to unknown autoscan error * tested restoring relevant shebang line * adjusted script call method * readjusted remaining subcommands * reversed missed changes * test variable useage * adjusted shell subcommands python to use GLD_BIN variable for path * Adjusted setup to track version build in each versions directory * Updated build script for easier maintenance, readability, and error checking * Updated Python Version to 3.9.13 to see if patch fixes occasional build bugs * adjusted make commands for potential fix in script python build * potential make fix * added check to see if requirements is installing correctly * changed test * changed platform.h to error if PYTHON_EXEC is undefined * adjusted python build to properly overwrite top bin links on new sourcebuild * adjusted python hashbang for testing * tweaked configure.ac * added PYTHON_EXEC to CFLAGS * updated configure, added check test notices * adjusted variables and declaration order in configure * changed to correct variable * updated exec call * Restored original hashbang point to opt/gridlabd/bin/python3 * additional python adjustments * adjusted reference to python3-config location * adjusted variable call in python3 script * added echo to check output of various variables * testing alternative variable * adjusted variable call * updated python makefile variables * updated reference format for variable * adjusted variables again * adjusted additional variables * more adjustments * tweaked makefile * testing variables * further tests * corrected syntax * fixed additional makefile python references * fixed another hardcoded python reference * testing define * adjusted calling command for python selector script * appropriate replacement for python hashbang * Implemented fix for variable python execution path * added missed exec line in convert * Corrected autotests to use version specific python version * corrected more improper python references * Final tweaks for dynamic python implementation. * fully finished code cleanup for darwin installers * updated missed improper python3 call format * Cleaned up debian installers to use new variable system for faster script updates * Minor version adjustments for packages in debian, updated ubuntu install script * Updated documentation and made minor edits * various tweaks * added installs for docker containers, adjusted ldconfig for linux * updated m4sh file to dynamically adjust between linux and darwin python installs * bugfix * fixed minor typo * tweaked test * updated linux images to only build from docker containers * removed unused variable * minor tweak to install-dev * updated reference to find docker if in docker container * added -r for cp, and rm for system files * updated build-image to remove all default libraries from saved libs * tweaked libraries linux fast install * added link to /usr/local/bin for current gridlabd executable * ensured g++ is installed for debian docker * added autoconf build for debian 9 docker * update ubuntu 20 install * tweaks * updated pandas version * Updated install.sh script for web install to include latest updates from dev * removed test output to prevent adding to repository * created readme for fast-install * updated readme, tweaked scripts * Updated install to allow user to submit version for fast install * added flags section to readme * adjusted autoconf version * minor adjustments to update autoconf version used in actions runner * adjusted syntax * added install for sudo package on runner * attempting with apt-get instead of apt * potential fix for github actions * modified actions to use ubuntu container * adjusted apt install order to circumvent tzdata location issue * modified tzdata install line * potential tzdata workaround * potential workaround for git repository issue * fix git repo owner issue on runner * adjusted linux scripts for fast builds using a prepared container * testing container for faster builds * removed environment updates as not used in new container * minor tweaks to enable faster builds * adjusted check path for doxygen so test can actually work * updated monterey x86 installer * updated chown command for site packages * added missing logic to make home/temp directory * Added check for $USER variable to exist, to work around docker container bug * updated fast install scripts with potential fix for python package issues * added potential script for ubuntu 22 * minor tweak * Adjusted chown for all gridlabd package dirs * Added link to /usr/local/bin for installed gridlabd * removed 22 * readd with permissions * fixed minor missed element from build-aux * fixed openssl install on arm to use arm Configure * Added checks to update ownership for install in case of multi-user computers. * Change file permissions/update readme * Removed line from develop workflow due to fixed bug * homebrew deprecated old install command, replaced * testing * adjusted * brought install up to date with install-dev * corrected a pair of bugs in the install script. * minor tweak to optimize build image script * Removed unnecessary extra install script * Directory overhaul and major variable additions * added creation of directory * updated m4sh * fixed minor structural issue * fixed variable * reorganized declarations * adjusted definition method for vars * reformatted to fix char and char const concat * updated strcat for gld var * adjusted syntax * restructured getenv again * adjusted var * changed to braces? * adjusted braces * potential fix * other fix? * adjusted again * adjustment * use getenv without std * other method * wild fix attempt * this hurts * maybe? * maybe? * new version * test * added braces * mirror potential fix * hmmm * test * now? pls? * chance? * try * hum? * hoh? * new try * hmm * giving up after this * updated method for quick test * updated install-dev, added brace * more directory updates * tried removing the -1 for testing * adjusted char types * additional char type mod * removed the * * ugh * adjusted char type * this? * i * minor adjust * PLEASE * test more fixes * and awaaaaaay we go! * additionals * test configname fix * probably wont work * this wont work * test fixies * potential billing library fix * test * revert * mayhaps * revert * adjusted script find function for ca-certs * corrected ca-cert install to account for package version updates * potential fix for module implementation * test fix test for cert.pem * change to -f * corrected implementation in powerflow * theoretical fix to gridlabd version subcommand * corrected link typo in install.sh * test * changed basename to dirname * potential fix install.sh * changed from os.environ to os.getenv * corrected python string syntax * fixed remaining string needing f" * fix path issue * added updated cert check to all darwin installs * fixed bug in change to fast install image build * final fix install-dev * bringing install.sh current with dev * fixed build image for linux * syntax correction * adjust name * potential fix to image build script bug on docker systems * updated ldconfig command install-dev * updated chown to default to root when user undefined * adjusted fast install and build image to separate system libs from package libs * made minor adjustments to scripts * added procps to docker fast install. changed default branch for dev install to develop. * updated readme documentation * fixed mismatch * updated docs, added -r to mac cp commands * test variable passthrough to subshell * retest * test with export * Added prefix support to script install * potential fix install for configure * adjusted directory issue with prefix settings * testing configure update * corrected syntax * fixed minor bug * adjusted variables for dynamic use * potential configure fix * corrected non-variable line in fire danger test * adjusted darwin cp command to darwin standards * updated install.md instructions * updated cloud documentation * fixed typo * tweaked configure.ac to set minimum default python as 3.9 * removed link to python pymalloc * updated ca-cert check to account for multiple directories available at one time * adjusted unnecessary basename * updated installation scripts to clean out unecessary code, package missing dependencies in intel macs * link gettext to lib for dependency resolution * updated install to match dev, and et defaults appropriately * added error check to build image to exit out and prevent strange bugs if version does not exist when run * added ownership update to install script * tweaked command for install and tweaked message for post-install user actions * updated installer scripts * added extra ownership line to ensure smooth install * tweaked install script * tweaked install script * Added a couple tweaks for m1 install and version.sh bug * Update requirements.txt Added pymysql to requirements per the TESS API tech transfer to-do list. * added automated clean before install script runs Co-authored-by: Thistleman Co-authored-by: Duncan Ragsdale <88173870+Thistleman@users.noreply.github.com> * Update load.cpp (#1239) Co-authored-by: Alyona Teyber * Add install tool (#1237) * Add gridlabd install tool * Update Makefile.mk * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py * Update install.py Co-authored-by: Alyona Teyber * Update cmdarg.cpp (#1211) Co-authored-by: Alyona Teyber * Develop update dockerbase (#1245) * Updating base image to an ubuntu based image * Update Dockerfile * Bump ipython from 7.31.1 to 8.10.0 in /module/resilience/docs (#1249) * Bump pillow from 9.0.1 to 9.3.0 in /converters (#1224) Bumps [pillow](https://github.com/python-pillow/Pillow) from 9.0.1 to 9.3.0. - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/9.0.1...9.3.0) --- updated-dependencies: - dependency-name: pillow dependency-type: direct:production ... Signed-off-by: dependabot[bot] Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Bump ipython from 7.31.1 to 8.10.0 in /module/resilience/docs Bumps [ipython](https://github.com/ipython/ipython) from 7.31.1 to 8.10.0. - [Release notes](https://github.com/ipython/ipython/releases) - [Commits](https://github.com/ipython/ipython/compare/7.31.1...8.10.0) --- updated-dependencies: - dependency-name: ipython dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Cleaning up double-entered requirements * More dependency clean up * Update test_fire_danger.tif --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Alyona Teyber * Fix ICA violation test speed issues (#1183) * Move node violation scan from sync to commit * Update node.cpp * Add check to avoid unneeded bus voltage fluctuation tests --------- Co-authored-by: Alyona Teyber * Reverting unwanted commit to develop 9f68226 --------- Signed-off-by: dependabot[bot] Co-authored-by: Alyona Teyber Co-authored-by: Thistleman Co-authored-by: Duncan Ragsdale <88173870+Thistleman@users.noreply.github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * Resetting to develop-add-ductbank branch due to merge issues (#1254) * Add link to ductbank from underground lines * Add ductbank to underground line class * Update underground_line.cpp * Add cable temp calcs * Ductbank work in progress * Update Ductbank model.ipynb * Update Ductbank model.ipynb * Ductbank implementation substantially complete * Update Ductbank.md * Update test_ductbank_1of6.glm * Create test_ductbank_2of6.glm * Update test_ductbank.glm * Update Ductbank model.ipynb * Create ductbank.py * Update Underground_line_conductor.md * Update Underground_line.md * Update Ductbank.md * Create box3x2.png * Create Ductbank model reduction.ipynb * Update ductbank work * Update ductbank model reduction docs --------- Co-authored-by: David P. Chassin * Develop add aws install (#1255) * tested restoring relevant shebang line * adjusted script call method * readjusted remaining subcommands * reversed missed changes * test variable useage * adjusted shell subcommands python to use GLD_BIN variable for path * Adjusted setup to track version build in each versions directory * Updated build script for easier maintenance, readability, and error checking * Updated Python Version to 3.9.13 to see if patch fixes occasional build bugs * adjusted make commands for potential fix in script python build * potential make fix * added check to see if requirements is installing correctly * changed test * changed platform.h to error if PYTHON_EXEC is undefined * adjusted python build to properly overwrite top bin links on new sourcebuild * adjusted python hashbang for testing * tweaked configure.ac * added PYTHON_EXEC to CFLAGS * updated configure, added check test notices * adjusted variables and declaration order in configure * changed to correct variable * updated exec call * Restored original hashbang point to opt/gridlabd/bin/python3 * additional python adjustments * adjusted reference to python3-config location * adjusted variable call in python3 script * added echo to check output of various variables * testing alternative variable * adjusted variable call * updated python makefile variables * updated reference format for variable * adjusted variables again * adjusted additional variables * more adjustments * tweaked makefile * testing variables * further tests * corrected syntax * fixed additional makefile python references * fixed another hardcoded python reference * testing define * adjusted calling command for python selector script * appropriate replacement for python hashbang * Implemented fix for variable python execution path * added missed exec line in convert * Corrected autotests to use version specific python version * corrected more improper python references * Final tweaks for dynamic python implementation. * fully finished code cleanup for darwin installers * updated missed improper python3 call format * Cleaned up debian installers to use new variable system for faster script updates * Minor version adjustments for packages in debian, updated ubuntu install script * Updated documentation and made minor edits * various tweaks * added installs for docker containers, adjusted ldconfig for linux * updated m4sh file to dynamically adjust between linux and darwin python installs * bugfix * fixed minor typo * tweaked test * updated linux images to only build from docker containers * removed unused variable * minor tweak to install-dev * updated reference to find docker if in docker container * added -r for cp, and rm for system files * updated build-image to remove all default libraries from saved libs * tweaked libraries linux fast install * added link to /usr/local/bin for current gridlabd executable * ensured g++ is installed for debian docker * added autoconf build for debian 9 docker * update ubuntu 20 install * tweaks * updated pandas version * Updated install.sh script for web install to include latest updates from dev * removed test output to prevent adding to repository * created readme for fast-install * updated readme, tweaked scripts * Updated install to allow user to submit version for fast install * added flags section to readme * adjusted autoconf version * minor adjustments to update autoconf version used in actions runner * adjusted syntax * added install for sudo package on runner * attempting with apt-get instead of apt * potential fix for github actions * modified actions to use ubuntu container * adjusted apt install order to circumvent tzdata location issue * modified tzdata install line * potential tzdata workaround * potential workaround for git repository issue * fix git repo owner issue on runner * adjusted linux scripts for fast builds using a prepared container * testing container for faster builds * removed environment updates as not used in new container * minor tweaks to enable faster builds * adjusted check path for doxygen so test can actually work * updated monterey x86 installer * updated chown command for site packages * added missing logic to make home/temp directory * Added check for $USER variable to exist, to work around docker container bug * updated fast install scripts with potential fix for python package issues * added potential script for ubuntu 22 * minor tweak * Adjusted chown for all gridlabd package dirs * Added link to /usr/local/bin for installed gridlabd * removed 22 * readd with permissions * fixed minor missed element from build-aux * fixed openssl install on arm to use arm Configure * Added checks to update ownership for install in case of multi-user computers. * Change file permissions/update readme * Removed line from develop workflow due to fixed bug * homebrew deprecated old install command, replaced * testing * adjusted * brought install up to date with install-dev * corrected a pair of bugs in the install script. * minor tweak to optimize build image script * Removed unnecessary extra install script * Directory overhaul and major variable additions * added creation of directory * updated m4sh * fixed minor structural issue * fixed variable * reorganized declarations * adjusted definition method for vars * reformatted to fix char and char const concat * updated strcat for gld var * adjusted syntax * restructured getenv again * adjusted var * changed to braces? * adjusted braces * potential fix * other fix? * adjusted again * adjustment * use getenv without std * other method * wild fix attempt * this hurts * maybe? * maybe? * new version * test * added braces * mirror potential fix * hmmm * test * now? pls? * chance? * try * hum? * hoh? * new try * hmm * giving up after this * updated method for quick test * updated install-dev, added brace * more directory updates * tried removing the -1 for testing * adjusted char types * additional char type mod * removed the * * ugh * adjusted char type * this? * i * minor adjust * PLEASE * test more fixes * and awaaaaaay we go! * additionals * test configname fix * probably wont work * this wont work * test fixies * potential billing library fix * test * revert * mayhaps * revert * adjusted script find function for ca-certs * corrected ca-cert install to account for package version updates * potential fix for module implementation * test fix test for cert.pem * change to -f * corrected implementation in powerflow * theoretical fix to gridlabd version subcommand * corrected link typo in install.sh * test * changed basename to dirname * potential fix install.sh * changed from os.environ to os.getenv * corrected python string syntax * fixed remaining string needing f" * fix path issue * added updated cert check to all darwin installs * fixed bug in change to fast install image build * final fix install-dev * bringing install.sh current with dev * fixed build image for linux * syntax correction * adjust name * potential fix to image build script bug on docker systems * updated ldconfig command install-dev * updated chown to default to root when user undefined * adjusted fast install and build image to separate system libs from package libs * made minor adjustments to scripts * added procps to docker fast install. changed default branch for dev install to develop. * updated readme documentation * fixed mismatch * updated docs, added -r to mac cp commands * test variable passthrough to subshell * retest * test with export * Added prefix support to script install * potential fix install for configure * adjusted directory issue with prefix settings * testing configure update * corrected syntax * fixed minor bug * adjusted variables for dynamic use * potential configure fix * corrected non-variable line in fire danger test * adjusted darwin cp command to darwin standards * updated install.md instructions * updated cloud documentation * fixed typo * tweaked configure.ac to set minimum default python as 3.9 * removed link to python pymalloc * updated ca-cert check to account for multiple directories available at one time * adjusted unnecessary basename * updated installation scripts to clean out unecessary code, package missing dependencies in intel macs * link gettext to lib for dependency resolution * updated install to match dev, and et defaults appropriately * added error check to build image to exit out and prevent strange bugs if version does not exist when run * added ownership update to install script * tweaked command for install and tweaked message for post-install user actions * updated installer scripts * added extra ownership line to ensure smooth install * tweaked install script * tweaked install script * Added a couple tweaks for m1 install and version.sh bug * Update requirements.txt Added pymysql to requirements per the TESS API tech transfer to-do list. * added automated clean before install script runs --------- Co-authored-by: Thistleman Co-authored-by: Duncan Ragsdale <88173870+Thistleman@users.noreply.github.com> * Restoring missing commits (#1256) * Move node violation scan from sync to commit * Update node.cpp * Add check to avoid unneeded bus voltage fluctuation tests --------- Co-authored-by: David P. Chassin Co-authored-by: David P. Chassin * Add ductbank thermal model (#1257) * Add link to ductbank from underground lines * Add ductbank to underground line class * Update underground_line.cpp * Add cable temp calcs * Ductbank work in progress * Update Ductbank model.ipynb * Update Ductbank model.ipynb * Ductbank implementation substantially complete * Update Ductbank.md * Update test_ductbank_1of6.glm * Create test_ductbank_2of6.glm * Update test_ductbank.glm * Update Ductbank model.ipynb * Create ductbank.py * Update Underground_line_conductor.md * Update Underground_line.md * Update Ductbank.md * Create box3x2.png * Create Ductbank model reduction.ipynb * Update ductbank work * Update ductbank model reduction docs --------- Co-authored-by: David P. Chassin * Update vegetation geodata package to include contact (#1205) * Add vege contact Add the vege contact model * Update geodata_vegetation.py start to add strike model * Update geodata_vegetation.py Add a single tree strike function * Update geodata_vegetation.py Update the tree strike model consider tree numbers * Block template load of non-GLM files when module is loaded * Fix missing filename and bad line numbering when loading template GLM files * Update geodata_powerline.py Add vegetation contact and tree strike model * Update geodata_vegetation.py Recover the vegetation file --------- Co-authored-by: Alyona Teyber * Updating documentation to reflect config.csv converter use (#1259) * Add json2glm converter options to ignore the clock (#1233) * Add create_meters tool * Update create_meters.py * Update create_meters.py * Update load.cpp * Adding no clock option for json2glm * Update load.cpp * Update globals.cpp * Update globals.cpp * Update gridlabd-convert * Update json2glm.py * Update json2glm.py * Update load.cpp * Fixed meter creation issues * Update node.cpp * Fixing merge error * Update json2glm.py * Adding documentation * Update ieee13-meters.glm --------- Co-authored-by: David P. Chassin Co-authored-by: David P. Chassin * Add cyme converter (#1204) * Create test_xls-spida2csv-network.csv * Create test_xls-spida2csv-network.glm * Update xls-spida2csv-geodata.py * Update xls-spida2csv-geodata.py * Update xls-spida2csv-geodata.py * Update pole.cpp * Update pole.h * Update pole_configuration.cpp * Update pole_configuration.h * Update pole_mount.cpp * Update pole_mount.h * Update pole.cpp * Update pole.h * Update pole_mount.cpp * Update pole_mount.h * Update test_pole.csv * Update pole.cpp * Update pole_mount.cpp * Update pole_mount.h * Update Makefile.mk * Create pole_analysis.py * Update pole_analysis.py * Update json2png.py * Update Mdb_files.md * Update mdb-cyme2glm.py * Update mdb2glm.py * change test case IEEE-13-cyme to IEEE-13-cyme-object * add testcase for cyme converter Add autotest case for converter from CYME MDB to gridlabd GLM network * Update Mdb_files.md * Added options to MDB converter doc * Fixed small errors * Updated requirements txt for cyme converter * Removed duplicate dependency --------- Co-authored-by: Fuhong Xie Co-authored-by: David P. Chassin Co-authored-by: Alyona Teyber Co-authored-by: Mitchell Victoriano Co-authored-by: Mitchell Victoriano Co-authored-by: Mitchell Victoriano <47313912+MitchellAV@users.noreply.github.com> * Develop implement venv (#1253) * potential venv test 1 * corrected typos * additional modifications * modified routing * tweaked config test fix * testing fix * tweaked more * potential path fix for use with venv * refined pythonpath * debian 11 test version * fix for instance where home temp folder does not exist * testing change * adjusted pathing * fixed ldconfig * fixed * test using system python * tweaked script * fixed incorrect variable * tweak * uncommented python build * added exports for library paths to test build on debian * bugfixes and typo corrections * fixed typos for initial setup * corrected run order * added /usr/local to paths * test flags * potential loader fix * testing fix * tweaked syntax for intended meaning * adjusted c reference to bindir * Fixed m4sh python3 config reference * moved debian process to config.ac * adjusted command scripts * tweak for logging directory * fixed command * YEAST * tweaking commands * modified scripts * tweaked script for errors * adjusted prefix checks * tweaked script * adjusted configure script * testing rewrites * adjusted script * adjusted config.ac and linux build scripts for new process * removed case format due to bug with configure * removed -q flag from grep command for conditional tests * potential fix for version check bug * adjusted host_os check due to aarch64 particularities * testing * test this * more testing * alternative implementation * added missing ")" * bug/typo * testing alternate implementation * testing alternate implementation * updated for POSIX shell * testing * removed testing syntax checks * removed unnecessary code that occasionally wiped cloned directory * potential m1 setup venv * m1 install setup * adjusted config * potential fix * added venv support for mac * fixed reference in script * tweaks * fixed make system * retest tweaked fix * Create setup-Darwin-22.sh * testing * try 3 * fixed makefile.am * Update setup-Linux-debian-11.sh (#1269) * Update setup-Linux-debian-11.sh * Update setup-Linux-debian-10.sh * Update setup-Linux-debian-9.sh * Update setup-Linux-ubuntu-22.sh * Update setup-Linux-ubuntu-20.sh * Update setup-Linux-ubuntu-18.sh * Update setup-Linux-ubuntu-16.sh * Update setup-Linux-debian-11.sh (#1270) * Update setup-Linux-debian-11.sh * Update setup-Linux-debian-10.sh * Update setup-Linux-debian-9.sh * Update setup-Linux-ubuntu-22.sh * Update setup-Linux-ubuntu-20.sh * Update setup-Linux-ubuntu-18.sh * Update setup-Linux-ubuntu-16.sh * fixed arm brew rference in intel * Update develop.yml * Update develop.yml * Update develop.yml --------- Co-authored-by: Alyona Teyber * Update python.cpp (#1261) * Update unitfile.txt (#1263) * Fix issue with CYME converter for CYME 9 Rev 6 MDB files (#1271) * Create test_xls-spida2csv-network.csv * Create test_xls-spida2csv-network.glm * Update xls-spida2csv-geodata.py * Update xls-spida2csv-geodata.py * Update xls-spida2csv-geodata.py * Update pole.cpp * Update pole.h * Update pole_configuration.cpp * Update pole_configuration.h * Update pole_mount.cpp * Update pole_mount.h * Update pole.cpp * Update pole.h * Update pole_mount.cpp * Update pole_mount.h * Update test_pole.csv * Update pole.cpp * Update pole_mount.cpp * Update pole_mount.h * Update Makefile.mk * Create pole_analysis.py * Update pole_analysis.py * Update json2png.py * Update Mdb_files.md * Update mdb-cyme2glm.py * Update mdb2glm.py * change test case IEEE-13-cyme to IEEE-13-cyme-object * add testcase for cyme converter Add autotest case for converter from CYME MDB to gridlabd GLM network * Update Mdb_files.md * Added options to MDB converter doc * Fixed small errors * Updated requirements txt for cyme converter * Removed duplicate dependency --------- Co-authored-by: Fuhong Xie Co-authored-by: David P. Chassin Co-authored-by: Alyona Teyber Co-authored-by: Mitchell Victoriano * Fixing test_datasets.glm (#1267) * Update geodata_powerline.py * Update geodata_powerline.py * Update README.md Identify US Government Right per the original GridLAB-D license. * Update user manuals (#862) Co-authored-by: Alyona Teyber * Fix date/time handling in create_players tool (#1236) Co-authored-by: David P. Chassin * (#1277) Added additional check and errors for non-SPCT transformers that are connected to triplex_node objects, or have an "S" phase. (#1281) Migration of fix from gridlabd issue 1432 * Fix build warnings (#1279) * Fix warnings on Mac * Fix dg control error * Fix linux warning in source * Fixed incorrect buffer format limits * Fixed module warnings on linux * Update requirements * Update configure.ac * Update requirements.txt * Fix validation errors * Fix python config * Move configure commands that change environment to makefile * Fix makefile * Update gridlabd.in * Fix python clean * Update test_plot.png * Update makefiles * Update requirements.txt * Update requirements process * Added python requirements for alternate systems * Charge Darwin ARM64 requirements filename * Move python os/cpu requirements to python folder * Update version.sh * Add Darwin 19 python requirements * Add requirements.txt generator * Update develop.yml * Update version.sh * Update develop.yml * Update requirements-debian11-x86_64.txt * Delete requirements.txt * Update .gitignore * Remove static requirements * Update makefile to build requirements.txt * Update develop.yml * Move requirements.csv to python folder * Update python venv support * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update requirements.csv * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update Makefile.am * Update Makefile.am * Update Makefile.am * Update develop.yml * Update Makefile.am * Update develop.yml * Update develop.yml * Update develop.yml * fixed setuptools install * testing required installs before requirements can be run in batch.... * testing complete format import * if this works, I will cry inside * testing changing gdal version based on newer API available for debian 11 * testing unpinned raserio install * fixed rasterio, required newer version compatible with python3.10 * adjusted version * Move explicit pip installs to requirements.csv * Update requirements.py * Update requirements.py * Update requirements.csv * Fix test_fire_report autotest * Update develop.yml * Update Makefile.am * Fix Darwin 20 validation errors * Update gridlabd-plot * Update create_player.py * Update fit_filter.py * Update test_fit_filter_opt.glm * Update Makefile.am * Update market_model.py * Update test_market_model_opt.glm * Update requirements.csv * Update requirements.csv * Update README.md * Update README.md * Update requirements.py * Fix source error * Fix filename buffer overruns * Update Makefile.mk * Update metrics_collector_writer.cpp * Update requirements.csv * Update Makefile.am * Update Makefile.am * Update requirements.csv * Update requirements.py * Update requirements.py * Update requirements.py * Update requirements.csv * Update requirements.py * Update requirements.csv * Update requirements.py * Update develop.yml * Update Makefile.mk * Fix python-install * Update requirements.py * Update Makefile.am * Update Makefile.mk * Update Makefile.am * Update Makefile.mk * Update Makefile.mk * Update Makefile.mk * Update Makefile.mk * Update Makefile.mk * Update globals.cpp * Update globals.cpp * Update globals.cpp * Update Makefile.mk * Update globals.cpp * Update globals.cpp * Update cmdarg.cpp * Update gridlabd.m4sh * Update gridlabd.in * Fix pythonpath * Update globals.cpp * Update globals.cpp * Update globals.cpp * Fix pythonpath initialization * Update globals.cpp * Update requirements.csv * Update gridlabd.m4sh * Update gridlabd.in * Update globals.cpp --------- Co-authored-by: Duncan Ragsdale <127135808+Stanford-CVX-group@users.noreply.github.com> * Add advanced load model class to powerflow (#1216) * Add building class to powerflow * Add inputs to building * Simplify model * Update building implementation * Update building * Add building autotest * Fix main gridlabd build error from python setup * Add building subcommand * Update gridlabd-building * Update gridlabd-building * Update building subcommand and docs * Update gridlabd-building * Update Building.md * Update Building.md * Update Building.md * Update Building.md * Update building.h * Add jama125 * Add tnt126 * Work progress on building load model * Create tnt.h * Initial general building load model working * Update test_building.glm * Add building load autotest * Update building.h * Update Building.md * Update Building.md * Update Building.md * Update Building.md * Update test_building.glm * Update test_building.csv * Add power factor/fractions for phases * Update test_building.glm * Update building.cpp * Link weather to building loads * Create test_building_loadshapes.csv * Update building.cpp * Update meter interval implementation * Update test_building_10.glm * Create test_building_tmy.glm * Update building.cpp * Update gridlabd.h * Update building.cpp * Update test_building_tmy.glm * Create test_building_tmy.csv * Update tnt_array2d.h * Update tnt_cmat.h * Update building.cpp * Update building autotests * Update gridlabd.h * Update Makefile.mk * Create building_defaults.csv * Update building.h * Update building.cpp * Update test_building_1.glm * Update test_building_1.csv * Create .gitignore * Update building.h * Add CEUS loadshape data * Create .gitignore * Delete ceus_loadshapes.csv * Update README.md * Update README.md * Update data files * Add loadshape reader * Update building.cpp * Update loadshape * Fix loader error reporting of filename and line number * Update loadshape data * Update building docs * Update building model * Update loadshapes for Btu to kWh conversion of gas enduses * Add electrification and correct ZIP component units * Update building.cpp * Add occupancy support * Delete ceus_loadshapes 2.csv * Remove HVAC from enduse loadshape data * Update load calcs * Fixed electric heating flag * Finish occupancy model * Fix schedule * Stub in dynamic solver * Create .gitignore * Update Building.md * Update Building.md * Add PV export limits * Update autotests for power factor correction * Add support for energy storage and release * Add VAR controllers to support common DER interconnection standards * Update documentation * Finalize autotests * Code cleanup * Add industrial load model * Fix industrial module autotest conflicts with powerflow module * Create Advanced loads.md * Update Advanced loads.md * Add public_service loads * Update advanced load docs * Add agricultural loads * Update advanced loads * Update Advanced_loads.md * Update Public_service.md * Update public service code and autotest * Add house model for performance comparison to building model * Complete agricultural load implementation and autotesting * Update public_service.h * Update Agricultural.md * Start work on enduse load composition data * Update configure.ac * Update Building model.ipynb * Update Enduse load composition.ipynb * Update Enduse load composition.ipynb * Update building_defaults.csv * Change building_defaults.csv to provide thermal properties per unit floor area * Fix object_isa for buildings are detected as loads * Update object.cpp * Fix load update function for new loads * Add building data validation scripts and images * Correct CEUS gas loadshapes * Update resstock data * Update test_building_1.csv --------- Co-authored-by: Alyona Teyber * Add loaddata subcommand (#1272) * Create get_resstock.py * Create gridlabd-loaddata * Delete get_resstock.py * Update gridlabd-loaddata * Update gridlabd-loaddata * Update gridlabd-loaddata * Update Makefile.mk * Add autotest for loaddata * Update gridlabd-loaddata * Create Loaddata.md * Update to docs and glm output * Add docs * Add create_schedule tool (#1278) * Fix setup/build/install scripts (#1282) * Update gridlabd.h * Update setup.cpp * Update property.h * Update Makefile.am * Update Linux-ubuntu-20.sh * Create Linux-ubuntu-22.sh * Update Linux-ubuntu-22.sh * Update Linux-ubuntu-20.sh * Update Makefile.am * Update Makefile.am * Update README.md * Update Makefile.am * Update configure.ac * Add install folder * Update tape_plot.cpp * Update controller.cpp * Update tape_plot.cpp * Create Linux-debian-11.sh * Create debian-11.sh * Update Linux-debian-11.sh * Update Linux-ubuntu-20.sh * Update Linux-ubuntu-22.sh * Update setup.sh * Update setup.sh * Update README.md * Change to GRIDLABD_ORIGIN usage * Update setup.sh * Add no-cache option to curl calls * Work on fast install * Work progress on linux install images * Update Makefile.am * Work progress * Update build_number * Work progress * Work progress * Work progress * Update Linux.sh * Update Linux.sh * Update Linux.sh * Update Linux.sh * Update Darwin.sh * Update create.sh * Update Makefile.am * Update setup-dev.sh * Update Makefile.am * Update Makefile.am * Update Makefile.am * Update Makefile.am * Update version.sh * Update requirements.py * Update Makefile.am * Update build_number * Update Makefile.am * Update Makefile.am * Update build_number * Update Makefile.am * Update README.md * Update install.sh * Update ubuntu_22-x86_64.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Clean up root folder * More cleanup * Update install.sh * Update install.sh * Update build.sh * Update setup.sh * Update install.sh * Update README.md * Update build.sh * Update README.md * Update Makefile.am * Update build_number * Update Makefile.am * Update ubuntu_20-x86_64.sh * Update Makefile.am * Create ubuntu_20.sh * Update ubuntu_22.sh * Update Makefile.am * Update README.md * Change ~/.venv/gridlabd to ~/.gridlabd * work update * Update version.sh * Fix version name * Fix macos build on ventura * Fix additional ventura build errors * Update ubuntu_22-x86_64.sh * Update ubuntu_20-x86_64.sh * Update configure.ac * Fix python3.10-config link * Update configure.ac * Update Makefile.am * Update README.md * Work progress * Update setup scripts * Fix setup filename * Update darwin_22-x86_64.sh * Update setup.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update darwin_22-x86_64.sh * Update frequency_gen.cpp * Create darwin_20-x86_64.sh * Create darwin_21-x86_64.sh * Update ubuntu_20-x86_64.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update init.cpp * Update install.sh * Install script update * Update Makefile.am * Update Makefile.am * Fix system target links * Update setup scripts * Update setup scripts * Update scripts * Update scripts * Update build.sh * Update installer * Update .gitignore * Delete config.cache * Update README.md * Remove old setup scripts * Update README.md * Update README.md * Fix setup issues * Update build and setup help and options * Update Makefile.am * Update README.md * Update Linux.sh * Update build.sh * Update build.sh * Changed all instances of "hipas" to "slacgismo" in preparation for transfer to LF Energy * Update setup.sh * Update Makefile.am * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update install.sh * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update workflows to use new setup/build process * Update develop.yml * Update develop.yml * Update develop.yml * Update develop.yml * Update workflows * Fix tnt_126 warnings * Fix tools/test_create_schedule.py * Update .gitignore * Update .gitignore * Reorganize .gitignore * Fix brackets in tnt_126 fortran headers * Undo erroneous namespace updates * Cosmetic updates * Documentation updates * Create README.md * Update .gitignore * D… * Release chiba-02 (#1298) - Fixed help script for subcommands and tools - Update CYME converter to resolve new issues (#1299) - Fix diesel torque unit (#1301) - Fix metar2glm (#1302) Signed-off-by: David P. Chassin * Update version.h Signed-off-by: David P. Chassin * Add support for accessing ISO New England hourly market data (#1307) Signed-off-by: David P. Chassin * Add group tool Signed-off-by: David P. Chassin * Update group.py Signed-off-by: David P. Chassin * Update group.py Signed-off-by: David P. Chassin * Update group.py Signed-off-by: David P. Chassin * Update group.py Signed-off-by: David P. Chassin * Update group.py Signed-off-by: David P. Chassin * Update group.py Signed-off-by: David P. Chassin * Update group.py Signed-off-by: David P. Chassin * Create test_group_assets_opt.glm Signed-off-by: David P. Chassin * Create test_group_network_opt.glm Signed-off-by: David P. Chassin * Add wheel install (#1310) * Update Makefile.mk * Update Python.md Signed-off-by: David P. Chassin * Add shell subcommand (#1312) * Add shell subcommand * Update Python.md * Update Shell.md * Update Shell.md * Update Python.md * Update Shell.md * Add support for shell options Signed-off-by: David P. Chassin * Update Geodata.md (#1314) Signed-off-by: Alyona Teyber Co-authored-by: David P. Chassin Signed-off-by: David P. Chassin * Fixed group Signed-off-by: David P. Chassin * Update test_group_assets_opt.glm Signed-off-by: David P. Chassin * Fix numerous edge cases * Fix group autotest * Add support for swingbus and isolated python variables. * Update group.py * Update group.py * Update group.py --------- Signed-off-by: David P. Chassin Signed-off-by: Alyona Teyber Signed-off-by: dependabot[bot] Signed-off-by: David P. Chassin Co-authored-by: Alyona Teyber Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Fuhong Xie Co-authored-by: ktehranchi <83722342+ktehranchi@users.noreply.github.com> Co-authored-by: johnsonhsiung <47260592+johnsonhsiung@users.noreply.github.com> Co-authored-by: Mitchell Victoriano Co-authored-by: Thistleman Co-authored-by: Duncan Ragsdale <88173870+Thistleman@users.noreply.github.com> Co-authored-by: Xiaochu Wang <98920916+xwang78su@users.noreply.github.com> Co-authored-by: Fuhong Xie Co-authored-by: Mitchell Victoriano Co-authored-by: Mitchell Victoriano <47313912+MitchellAV@users.noreply.github.com> Co-authored-by: Frank Tuffner Co-authored-by: Duncan Ragsdale <127135808+Stanford-CVX-group@users.noreply.github.com> Signed-off-by: David P. Chassin --- tools/Makefile.mk | 1 + tools/autotest/.gitignore | 1 + tools/autotest/test_group.glm | 16 + tools/autotest/test_group_assets_opt.glm | 9756 +++++++++++++++++++++ tools/autotest/test_group_modify_opt.glm | 1244 +++ tools/autotest/test_group_network_opt.glm | 3087 +++++++ tools/group.py | 453 + 7 files changed, 14558 insertions(+) create mode 100644 tools/autotest/test_group.glm create mode 100644 tools/autotest/test_group_assets_opt.glm create mode 100644 tools/autotest/test_group_modify_opt.glm create mode 100644 tools/autotest/test_group_network_opt.glm create mode 100644 tools/group.py diff --git a/tools/Makefile.mk b/tools/Makefile.mk index 14b4ef87d..89cefc030 100644 --- a/tools/Makefile.mk +++ b/tools/Makefile.mk @@ -11,6 +11,7 @@ dist_pkgdata_DATA += tools/fire_danger.py dist_pkgdata_DATA += tools/fit_filter.py dist_pkgdata_DATA += tools/gridlabd-editor.png dist_pkgdata_DATA += tools/gridlabd-editor.py +dist_pkgdata_DATA += tools/group.py dist_pkgdata_DATA += tools/insights.py dist_pkgdata_DATA += tools/install.py dist_pkgdata_DATA += tools/isone.py diff --git a/tools/autotest/.gitignore b/tools/autotest/.gitignore index 312a30e9d..3dfb3b2d8 100644 --- a/tools/autotest/.gitignore +++ b/tools/autotest/.gitignore @@ -1,2 +1,3 @@ test_isone.csv test_isone_opt.glm +pole_configuration.glm diff --git a/tools/autotest/test_group.glm b/tools/autotest/test_group.glm new file mode 100644 index 000000000..75ecbe6d0 --- /dev/null +++ b/tools/autotest/test_group.glm @@ -0,0 +1,16 @@ +#ifexist ../test_group_network_opt.glm +#define DIR=.. +#endif + +#include "${DIR:-.}/test_group_network_opt.glm" +#include "${DIR:-.}/test_group_assets_opt.glm" + +#resolve now +#write test_group.json + +#python -m group -i=test_group.json --modify --force -o=test_group_modify_opt.glm +#include "test_group_modify_opt.glm" + +#ifexist ../test_group_modify_opt.glm +#on_exit 0 diff -I '^[#/].*' ../test_group_modify_opt.glm test_group_modify_opt.glm > gridlabd.diff +#endif diff --git a/tools/autotest/test_group_assets_opt.glm b/tools/autotest/test_group_assets_opt.glm new file mode 100644 index 000000000..59735b82e --- /dev/null +++ b/tools/autotest/test_group_assets_opt.glm @@ -0,0 +1,9756 @@ +// automatically generated model from command `/usr/local/opt/gridlabd/4.3.3-230727-develop_add_group_tool-darwin_22-x86_64/share/gridlabd/create_poles.py 123.glm --spacing=100 --pole_type=WOOD-EC-45/4 --weather=example --ignore_location --output=IEEE123_poles.glm` on 2023-07-27 15:54:55 +clock +{ + starttime "2000-01-01 00:00:00"; + stoptime "2000-02-01 00:00:00"; +} +class weather +{ + double temperature[degF]; + double wind_speed[mph]; + double wind_dir[deg]; +} + +object weather +{ + name "example"; +} + +#system curl -sL https://library.gridlabd.us/US/CA/SLAC/pole_configuration.glm > pole_configuration.glm +#include "pole_configuration.glm" + +object pole +{ + name "pole_node_6101"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_trans6101to610"; + equipment "trans6101to610"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_150"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_reg150to15001"; + equipment "reg150to15001"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_9"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_reg9to901"; + equipment "reg9to901"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line8to9_load_9"; + equipment "line8to9"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_25"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_reg25to2501"; + equipment "reg25to2501"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line23to25_node_25"; + equipment "line23to25"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line25to28_node_25"; + equipment "line25to28"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_160"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_reg160to16001"; + equipment "reg160to16001"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_13"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_sw13to152"; + equipment "sw13to152"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line8to13_node_13"; + equipment "line8to13"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line13to34_node_13"; + equipment "line13to34"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line13to18_node_13"; + equipment "line13to18"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_18"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_sw18to135"; + equipment "sw18to135"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line13to18_node_18"; + equipment "line13to18"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line18to19_node_18"; + equipment "line18to19"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line18to21_node_18"; + equipment "line18to21"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_54"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_sw54to94"; + equipment "sw54to94"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line53to54_node_54"; + equipment "line53to54"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line54to55_node_54"; + equipment "line54to55"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line54to57_node_54"; + equipment "line54to57"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_60"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_sw60to160"; + equipment "sw60to160"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line57to60_load_60"; + equipment "line57to60"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line60to61_load_60"; + equipment "line60to61"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_61"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_sw61to6101"; + equipment "sw61to6101"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line60to61_node_61"; + equipment "line60to61"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_97"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_sw97to197"; + equipment "sw97to197"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line67to97_node_97"; + equipment "line67to97"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line97to98_node_97"; + equipment "line97to98"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_151"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_sw151to300"; + equipment "sw151to300"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line51to151_node_151"; + equipment "line51to151"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_15001"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_sw15001to149"; + equipment "sw15001to149"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} + +object pole +{ + name "pole_load_1"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line1to2_load_1"; + equipment "line1to2"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line1to3_load_1"; + equipment "line1to3"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line1to7_load_1"; + equipment "line1to7"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line149to1_load_1"; + equipment "line149to1"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line1to2_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line1to2_100"; + equipment "line1to2"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_2"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line1to2_load_2"; + equipment "line1to2"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line1to3_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line1to3_100"; + equipment "line1to3"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line1to3_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line1to3_200"; + equipment "line1to3"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_3"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line1to3_node_3"; + equipment "line1to3"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line3to4_node_3"; + equipment "line3to4"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line3to5_node_3"; + equipment "line3to5"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line1to7_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line1to7_100"; + equipment "line1to7"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line1to7_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line1to7_200"; + equipment "line1to7"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_7"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line1to7_load_7"; + equipment "line1to7"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line7to8_load_7"; + equipment "line7to8"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line3to4_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line3to4_100"; + equipment "line3to4"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_4"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line3to4_load_4"; + equipment "line3to4"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line3to5_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line3to5_100"; + equipment "line3to5"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line3to5_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line3to5_200"; + equipment "line3to5"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line3to5_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line3to5_300"; + equipment "line3to5"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_5"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line3to5_load_5"; + equipment "line3to5"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line5to6_load_5"; + equipment "line5to6"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line5to6_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line5to6_100"; + equipment "line5to6"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line5to6_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line5to6_200"; + equipment "line5to6"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_6"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line5to6_load_6"; + equipment "line5to6"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line7to8_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line7to8_100"; + equipment "line7to8"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_8"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line7to8_node_8"; + equipment "line7to8"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line8to12_node_8"; + equipment "line8to12"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line8to9_node_8"; + equipment "line8to9"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line8to13_node_8"; + equipment "line8to13"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line8to12_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line8to12_100"; + equipment "line8to12"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line8to12_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line8to12_200"; + equipment "line8to12"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_12"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line8to12_load_12"; + equipment "line8to12"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line8to9_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line8to9_100"; + equipment "line8to9"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line8to9_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line8to9_200"; + equipment "line8to9"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line8to13_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line8to13_100"; + equipment "line8to13"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line8to13_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line8to13_200"; + equipment "line8to13"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_901"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line901to14_node_901"; + equipment "line901to14"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line901to14_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line901to14_100"; + equipment "line901to14"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line901to14_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line901to14_200"; + equipment "line901to14"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line901to14_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line901to14_300"; + equipment "line901to14"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line901to14_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line901to14_400"; + equipment "line901to14"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_14"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line901to14_node_14"; + equipment "line901to14"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line14to11_node_14"; + equipment "line14to11"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line14to10_node_14"; + equipment "line14to10"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line13to34_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line13to34_100"; + equipment "line13to34"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_34"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line13to34_load_34"; + equipment "line13to34"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line34to15_load_34"; + equipment "line34to15"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line13to18_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line13to18_100"; + equipment "line13to18"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line13to18_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line13to18_200"; + equipment "line13to18"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line13to18_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line13to18_300"; + equipment "line13to18"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line13to18_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line13to18_400"; + equipment "line13to18"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line13to18_500"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line13to18_500"; + equipment "line13to18"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line13to18_600"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line13to18_600"; + equipment "line13to18"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line13to18_700"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line13to18_700"; + equipment "line13to18"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line13to18_800"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line13to18_800"; + equipment "line13to18"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line14to11_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line14to11_100"; + equipment "line14to11"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line14to11_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line14to11_200"; + equipment "line14to11"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_11"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line14to11_load_11"; + equipment "line14to11"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line14to10_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line14to10_100"; + equipment "line14to10"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line14to10_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line14to10_200"; + equipment "line14to10"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_10"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line14to10_load_10"; + equipment "line14to10"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_15"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line15to16_node_15"; + equipment "line15to16"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line15to17_node_15"; + equipment "line15to17"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line34to15_node_15"; + equipment "line34to15"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line15to16_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line15to16_100"; + equipment "line15to16"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line15to16_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line15to16_200"; + equipment "line15to16"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line15to16_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line15to16_300"; + equipment "line15to16"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_16"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line15to16_load_16"; + equipment "line15to16"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line15to17_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line15to17_100"; + equipment "line15to17"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line15to17_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line15to17_200"; + equipment "line15to17"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line15to17_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line15to17_300"; + equipment "line15to17"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_17"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line15to17_load_17"; + equipment "line15to17"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line18to19_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line18to19_100"; + equipment "line18to19"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line18to19_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line18to19_200"; + equipment "line18to19"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_19"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line18to19_load_19"; + equipment "line18to19"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line19to20_load_19"; + equipment "line19to20"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line18to21_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line18to21_100"; + equipment "line18to21"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line18to21_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line18to21_200"; + equipment "line18to21"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_21"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line18to21_node_21"; + equipment "line18to21"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line21to22_node_21"; + equipment "line21to22"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line21to23_node_21"; + equipment "line21to23"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line19to20_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line19to20_100"; + equipment "line19to20"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line19to20_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line19to20_200"; + equipment "line19to20"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line19to20_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line19to20_300"; + equipment "line19to20"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_20"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line19to20_load_20"; + equipment "line19to20"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line21to22_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line21to22_100"; + equipment "line21to22"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line21to22_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line21to22_200"; + equipment "line21to22"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line21to22_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line21to22_300"; + equipment "line21to22"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line21to22_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line21to22_400"; + equipment "line21to22"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line21to22_500"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line21to22_500"; + equipment "line21to22"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_22"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line21to22_load_22"; + equipment "line21to22"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line21to23_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line21to23_100"; + equipment "line21to23"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line21to23_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line21to23_200"; + equipment "line21to23"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_23"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line21to23_node_23"; + equipment "line21to23"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line23to24_node_23"; + equipment "line23to24"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line23to25_node_23"; + equipment "line23to25"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line23to24_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line23to24_100"; + equipment "line23to24"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line23to24_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line23to24_200"; + equipment "line23to24"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line23to24_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line23to24_300"; + equipment "line23to24"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line23to24_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line23to24_400"; + equipment "line23to24"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line23to24_500"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line23to24_500"; + equipment "line23to24"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_24"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line23to24_load_24"; + equipment "line23to24"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line23to25_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line23to25_100"; + equipment "line23to25"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line23to25_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line23to25_200"; + equipment "line23to25"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_2501"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line2501to26_node_2501"; + equipment "line2501to26"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line2501to26_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line2501to26_100"; + equipment "line2501to26"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line2501to26_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line2501to26_200"; + equipment "line2501to26"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line2501to26_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line2501to26_300"; + equipment "line2501to26"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_26"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line2501to26_node_26"; + equipment "line2501to26"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line26to27_node_26"; + equipment "line26to27"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line26to31_node_26"; + equipment "line26to31"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line25to28_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line25to28_100"; + equipment "line25to28"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_28"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line25to28_load_28"; + equipment "line25to28"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line28to29_load_28"; + equipment "line28to29"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line26to27_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line26to27_100"; + equipment "line26to27"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line26to27_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line26to27_200"; + equipment "line26to27"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_27"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line26to27_node_27"; + equipment "line26to27"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line27to33_node_27"; + equipment "line27to33"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line26to31_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line26to31_100"; + equipment "line26to31"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line26to31_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line26to31_200"; + equipment "line26to31"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_31"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line26to31_load_31"; + equipment "line26to31"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line31to32_load_31"; + equipment "line31to32"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line27to33_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line27to33_100"; + equipment "line27to33"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line27to33_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line27to33_200"; + equipment "line27to33"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line27to33_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line27to33_300"; + equipment "line27to33"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line27to33_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line27to33_400"; + equipment "line27to33"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_33"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line27to33_load_33"; + equipment "line27to33"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line28to29_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line28to29_100"; + equipment "line28to29"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line28to29_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line28to29_200"; + equipment "line28to29"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_29"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line28to29_load_29"; + equipment "line28to29"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line29to30_load_29"; + equipment "line29to30"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line29to30_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line29to30_100"; + equipment "line29to30"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line29to30_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line29to30_200"; + equipment "line29to30"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line29to30_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line29to30_300"; + equipment "line29to30"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_30"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line29to30_load_30"; + equipment "line29to30"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line30to250_load_30"; + equipment "line30to250"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line30to250_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line30to250_100"; + equipment "line30to250"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line31to32_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line31to32_100"; + equipment "line31to32"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line31to32_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line31to32_200"; + equipment "line31to32"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_32"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line31to32_load_32"; + equipment "line31to32"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_35"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line35to36_load_35"; + equipment "line35to36"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line35to40_load_35"; + equipment "line35to40"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line135to35_load_35"; + equipment "line135to35"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line35to36_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line35to36_100"; + equipment "line35to36"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line35to36_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line35to36_200"; + equipment "line35to36"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line35to36_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line35to36_300"; + equipment "line35to36"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line35to36_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line35to36_400"; + equipment "line35to36"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line35to36_500"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line35to36_500"; + equipment "line35to36"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line35to36_600"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line35to36_600"; + equipment "line35to36"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_36"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line35to36_node_36"; + equipment "line35to36"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line36to37_node_36"; + equipment "line36to37"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line36to38_node_36"; + equipment "line36to38"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line35to40_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line35to40_100"; + equipment "line35to40"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line35to40_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line35to40_200"; + equipment "line35to40"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_40"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line35to40_node_40"; + equipment "line35to40"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line40to41_node_40"; + equipment "line40to41"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line40to42_node_40"; + equipment "line40to42"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line36to37_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line36to37_100"; + equipment "line36to37"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line36to37_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line36to37_200"; + equipment "line36to37"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_37"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line36to37_load_37"; + equipment "line36to37"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line36to38_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line36to38_100"; + equipment "line36to38"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line36to38_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line36to38_200"; + equipment "line36to38"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_38"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line36to38_load_38"; + equipment "line36to38"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line38to39_load_38"; + equipment "line38to39"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line38to39_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line38to39_100"; + equipment "line38to39"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line38to39_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line38to39_200"; + equipment "line38to39"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line38to39_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line38to39_300"; + equipment "line38to39"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_39"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line38to39_load_39"; + equipment "line38to39"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line40to41_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line40to41_100"; + equipment "line40to41"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line40to41_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line40to41_200"; + equipment "line40to41"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line40to41_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line40to41_300"; + equipment "line40to41"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_41"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line40to41_load_41"; + equipment "line40to41"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line40to42_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line40to42_100"; + equipment "line40to42"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line40to42_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line40to42_200"; + equipment "line40to42"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_42"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line40to42_load_42"; + equipment "line40to42"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line42to43_load_42"; + equipment "line42to43"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line42to44_load_42"; + equipment "line42to44"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line42to43_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line42to43_100"; + equipment "line42to43"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line42to43_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line42to43_200"; + equipment "line42to43"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line42to43_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line42to43_300"; + equipment "line42to43"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line42to43_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line42to43_400"; + equipment "line42to43"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_43"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line42to43_load_43"; + equipment "line42to43"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line42to44_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line42to44_100"; + equipment "line42to44"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_44"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line42to44_node_44"; + equipment "line42to44"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line44to45_node_44"; + equipment "line44to45"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line44to47_node_44"; + equipment "line44to47"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line44to45_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line44to45_100"; + equipment "line44to45"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_45"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line44to45_load_45"; + equipment "line44to45"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line45to46_load_45"; + equipment "line45to46"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line44to47_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line44to47_100"; + equipment "line44to47"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line44to47_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line44to47_200"; + equipment "line44to47"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_47"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line44to47_load_47"; + equipment "line44to47"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line47to48_load_47"; + equipment "line47to48"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line47to49_load_47"; + equipment "line47to49"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line45to46_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line45to46_100"; + equipment "line45to46"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line45to46_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line45to46_200"; + equipment "line45to46"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_46"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line45to46_load_46"; + equipment "line45to46"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line47to48_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line47to48_100"; + equipment "line47to48"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_48"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line47to48_load_48"; + equipment "line47to48"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line47to49_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line47to49_100"; + equipment "line47to49"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line47to49_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line47to49_200"; + equipment "line47to49"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_49"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line47to49_load_49"; + equipment "line47to49"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line49to50_load_49"; + equipment "line49to50"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line49to50_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line49to50_100"; + equipment "line49to50"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line49to50_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line49to50_200"; + equipment "line49to50"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_50"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line49to50_load_50"; + equipment "line49to50"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line50to51_load_50"; + equipment "line50to51"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line50to51_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line50to51_100"; + equipment "line50to51"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line50to51_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line50to51_200"; + equipment "line50to51"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_51"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line50to51_load_51"; + equipment "line50to51"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line51to151_load_51"; + equipment "line51to151"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line51to151_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line51to151_100"; + equipment "line51to151"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line51to151_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line51to151_200"; + equipment "line51to151"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line51to151_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line51to151_300"; + equipment "line51to151"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line51to151_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line51to151_400"; + equipment "line51to151"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_52"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line52to53_load_52"; + equipment "line52to53"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line152to52_load_52"; + equipment "line152to52"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line52to53_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line52to53_100"; + equipment "line52to53"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_53"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line52to53_load_53"; + equipment "line52to53"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line53to54_load_53"; + equipment "line53to54"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line53to54_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line53to54_100"; + equipment "line53to54"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line54to55_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line54to55_100"; + equipment "line54to55"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line54to55_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line54to55_200"; + equipment "line54to55"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_55"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line54to55_load_55"; + equipment "line54to55"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line55to56_load_55"; + equipment "line55to56"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line54to57_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line54to57_100"; + equipment "line54to57"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line54to57_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line54to57_200"; + equipment "line54to57"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line54to57_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line54to57_300"; + equipment "line54to57"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_57"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line54to57_node_57"; + equipment "line54to57"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line57to58_node_57"; + equipment "line57to58"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line57to60_node_57"; + equipment "line57to60"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line55to56_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line55to56_100"; + equipment "line55to56"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line55to56_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line55to56_200"; + equipment "line55to56"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_56"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line55to56_load_56"; + equipment "line55to56"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line57to58_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line57to58_100"; + equipment "line57to58"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line57to58_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line57to58_200"; + equipment "line57to58"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_58"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line57to58_load_58"; + equipment "line57to58"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line58to59_load_58"; + equipment "line58to59"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line57to60_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line57to60_100"; + equipment "line57to60"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line57to60_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line57to60_200"; + equipment "line57to60"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line57to60_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line57to60_300"; + equipment "line57to60"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line57to60_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line57to60_400"; + equipment "line57to60"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line57to60_500"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line57to60_500"; + equipment "line57to60"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line57to60_600"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line57to60_600"; + equipment "line57to60"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line57to60_700"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line57to60_700"; + equipment "line57to60"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line58to59_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line58to59_100"; + equipment "line58to59"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line58to59_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line58to59_200"; + equipment "line58to59"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_59"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line58to59_load_59"; + equipment "line58to59"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line60to61_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line60to61_100"; + equipment "line60to61"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line60to61_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line60to61_200"; + equipment "line60to61"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line60to61_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line60to61_300"; + equipment "line60to61"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line60to61_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line60to61_400"; + equipment "line60to61"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line60to61_500"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line60to61_500"; + equipment "line60to61"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_67"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line67to68_node_67"; + equipment "line67to68"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line67to72_node_67"; + equipment "line67to72"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line67to97_node_67"; + equipment "line67to97"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line16001to67_node_67"; + equipment "line16001to67"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line67to68_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line67to68_100"; + equipment "line67to68"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_68"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line67to68_load_68"; + equipment "line67to68"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line68to69_load_68"; + equipment "line68to69"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line67to72_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line67to72_100"; + equipment "line67to72"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line67to72_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line67to72_200"; + equipment "line67to72"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_72"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line67to72_node_72"; + equipment "line67to72"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line72to73_node_72"; + equipment "line72to73"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line72to76_node_72"; + equipment "line72to76"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line67to97_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line67to97_100"; + equipment "line67to97"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line67to97_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line67to97_200"; + equipment "line67to97"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line68to69_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line68to69_100"; + equipment "line68to69"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line68to69_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line68to69_200"; + equipment "line68to69"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_69"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line68to69_load_69"; + equipment "line68to69"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line69to70_load_69"; + equipment "line69to70"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line69to70_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line69to70_100"; + equipment "line69to70"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line69to70_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line69to70_200"; + equipment "line69to70"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line69to70_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line69to70_300"; + equipment "line69to70"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_70"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line69to70_load_70"; + equipment "line69to70"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line70to71_load_70"; + equipment "line70to71"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line70to71_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line70to71_100"; + equipment "line70to71"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line70to71_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line70to71_200"; + equipment "line70to71"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_71"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line70to71_load_71"; + equipment "line70to71"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line72to73_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line72to73_100"; + equipment "line72to73"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line72to73_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line72to73_200"; + equipment "line72to73"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_73"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line72to73_load_73"; + equipment "line72to73"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line73to74_load_73"; + equipment "line73to74"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line72to76_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line72to76_100"; + equipment "line72to76"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_76"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line72to76_load_76"; + equipment "line72to76"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line76to77_load_76"; + equipment "line76to77"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line76to86_load_76"; + equipment "line76to86"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line73to74_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line73to74_100"; + equipment "line73to74"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line73to74_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line73to74_200"; + equipment "line73to74"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line73to74_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line73to74_300"; + equipment "line73to74"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_74"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line73to74_load_74"; + equipment "line73to74"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line74to75_load_74"; + equipment "line74to75"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line74to75_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line74to75_100"; + equipment "line74to75"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line74to75_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line74to75_200"; + equipment "line74to75"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line74to75_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line74to75_300"; + equipment "line74to75"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_75"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line74to75_load_75"; + equipment "line74to75"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line76to77_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line76to77_100"; + equipment "line76to77"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line76to77_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line76to77_200"; + equipment "line76to77"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line76to77_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line76to77_300"; + equipment "line76to77"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_77"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line76to77_load_77"; + equipment "line76to77"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line77to78_load_77"; + equipment "line77to78"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line76to86_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line76to86_100"; + equipment "line76to86"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line76to86_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line76to86_200"; + equipment "line76to86"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line76to86_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line76to86_300"; + equipment "line76to86"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line76to86_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line76to86_400"; + equipment "line76to86"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line76to86_500"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line76to86_500"; + equipment "line76to86"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line76to86_600"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line76to86_600"; + equipment "line76to86"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_86"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line76to86_load_86"; + equipment "line76to86"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line86to87_load_86"; + equipment "line86to87"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_78"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line77to78_node_78"; + equipment "line77to78"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line78to79_node_78"; + equipment "line78to79"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line78to80_node_78"; + equipment "line78to80"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line78to79_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line78to79_100"; + equipment "line78to79"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line78to79_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line78to79_200"; + equipment "line78to79"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_79"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line78to79_load_79"; + equipment "line78to79"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line78to80_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line78to80_100"; + equipment "line78to80"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line78to80_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line78to80_200"; + equipment "line78to80"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line78to80_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line78to80_300"; + equipment "line78to80"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line78to80_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line78to80_400"; + equipment "line78to80"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_80"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line78to80_load_80"; + equipment "line78to80"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line80to81_load_80"; + equipment "line80to81"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line80to81_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line80to81_100"; + equipment "line80to81"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line80to81_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line80to81_200"; + equipment "line80to81"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line80to81_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line80to81_300"; + equipment "line80to81"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line80to81_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line80to81_400"; + equipment "line80to81"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_81"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line80to81_node_81"; + equipment "line80to81"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line81to82_node_81"; + equipment "line81to82"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line81to84_node_81"; + equipment "line81to84"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line81to82_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line81to82_100"; + equipment "line81to82"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line81to82_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line81to82_200"; + equipment "line81to82"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_82"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line81to82_load_82"; + equipment "line81to82"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line82to83_load_82"; + equipment "line82to83"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line81to84_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line81to84_100"; + equipment "line81to84"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line81to84_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line81to84_200"; + equipment "line81to84"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line81to84_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line81to84_300"; + equipment "line81to84"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line81to84_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line81to84_400"; + equipment "line81to84"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line81to84_500"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line81to84_500"; + equipment "line81to84"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line81to84_600"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line81to84_600"; + equipment "line81to84"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_84"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line81to84_load_84"; + equipment "line81to84"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line84to85_load_84"; + equipment "line84to85"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line82to83_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line82to83_100"; + equipment "line82to83"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line82to83_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line82to83_200"; + equipment "line82to83"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_83"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line82to83_load_83"; + equipment "line82to83"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line84to85_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line84to85_100"; + equipment "line84to85"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line84to85_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line84to85_200"; + equipment "line84to85"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line84to85_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line84to85_300"; + equipment "line84to85"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line84to85_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line84to85_400"; + equipment "line84to85"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_85"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line84to85_load_85"; + equipment "line84to85"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line86to87_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line86to87_100"; + equipment "line86to87"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line86to87_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line86to87_200"; + equipment "line86to87"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line86to87_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line86to87_300"; + equipment "line86to87"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line86to87_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line86to87_400"; + equipment "line86to87"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_87"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line86to87_load_87"; + equipment "line86to87"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line87to88_load_87"; + equipment "line87to88"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line87to89_load_87"; + equipment "line87to89"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line87to88_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line87to88_100"; + equipment "line87to88"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_88"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line87to88_load_88"; + equipment "line87to88"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line87to89_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line87to89_100"; + equipment "line87to89"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line87to89_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line87to89_200"; + equipment "line87to89"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_89"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line87to89_node_89"; + equipment "line87to89"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line89to90_node_89"; + equipment "line89to90"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line89to91_node_89"; + equipment "line89to91"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line89to90_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line89to90_100"; + equipment "line89to90"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line89to90_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line89to90_200"; + equipment "line89to90"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_90"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line89to90_load_90"; + equipment "line89to90"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line89to91_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line89to91_100"; + equipment "line89to91"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line89to91_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line89to91_200"; + equipment "line89to91"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_91"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line89to91_node_91"; + equipment "line89to91"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line91to92_node_91"; + equipment "line91to92"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line91to93_node_91"; + equipment "line91to93"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line91to92_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line91to92_100"; + equipment "line91to92"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line91to92_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line91to92_200"; + equipment "line91to92"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_92"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line91to92_load_92"; + equipment "line91to92"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line91to93_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line91to93_100"; + equipment "line91to93"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line91to93_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line91to93_200"; + equipment "line91to93"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_93"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line91to93_node_93"; + equipment "line91to93"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line93to94_node_93"; + equipment "line93to94"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line93to95_node_93"; + equipment "line93to95"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line93to94_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line93to94_100"; + equipment "line93to94"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line93to94_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line93to94_200"; + equipment "line93to94"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_94"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line93to94_load_94"; + equipment "line93to94"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line93to95_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line93to95_100"; + equipment "line93to95"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line93to95_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line93to95_200"; + equipment "line93to95"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line95to96_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line95to96_100"; + equipment "line95to96"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_96"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line95to96_load_96"; + equipment "line95to96"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line97to98_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line97to98_100"; + equipment "line97to98"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line97to98_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line97to98_200"; + equipment "line97to98"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_98"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line97to98_load_98"; + equipment "line97to98"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line98to99_load_98"; + equipment "line98to99"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line98to99_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line98to99_100"; + equipment "line98to99"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line98to99_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line98to99_200"; + equipment "line98to99"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line98to99_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line98to99_300"; + equipment "line98to99"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line98to99_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line98to99_400"; + equipment "line98to99"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line98to99_500"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line98to99_500"; + equipment "line98to99"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_99"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line98to99_load_99"; + equipment "line98to99"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line99to100_load_99"; + equipment "line99to100"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line99to100_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line99to100_100"; + equipment "line99to100"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line99to100_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line99to100_200"; + equipment "line99to100"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line99to100_load_100"; + equipment "line99to100"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line100to450_load_100"; + equipment "line100to450"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line100to450_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line100to450_100"; + equipment "line100to450"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line100to450_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line100to450_200"; + equipment "line100to450"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line100to450_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line100to450_300"; + equipment "line100to450"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line100to450_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line100to450_400"; + equipment "line100to450"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line100to450_500"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line100to450_500"; + equipment "line100to450"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line100to450_600"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line100to450_600"; + equipment "line100to450"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line100to450_700"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line100to450_700"; + equipment "line100to450"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_101"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line101to102_node_101"; + equipment "line101to102"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line101to105_node_101"; + equipment "line101to105"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line197to101_node_101"; + equipment "line197to101"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line101to102_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line101to102_100"; + equipment "line101to102"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line101to102_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line101to102_200"; + equipment "line101to102"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_102"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line101to102_load_102"; + equipment "line101to102"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line102to103_load_102"; + equipment "line102to103"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line101to105_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line101to105_100"; + equipment "line101to105"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line101to105_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line101to105_200"; + equipment "line101to105"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_105"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line101to105_node_105"; + equipment "line101to105"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line105to106_node_105"; + equipment "line105to106"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line105to108_node_105"; + equipment "line105to108"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line102to103_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line102to103_100"; + equipment "line102to103"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line102to103_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line102to103_200"; + equipment "line102to103"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line102to103_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line102to103_300"; + equipment "line102to103"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_103"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line102to103_load_103"; + equipment "line102to103"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line103to104_load_103"; + equipment "line103to104"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line103to104_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line103to104_100"; + equipment "line103to104"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line103to104_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line103to104_200"; + equipment "line103to104"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line103to104_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line103to104_300"; + equipment "line103to104"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line103to104_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line103to104_400"; + equipment "line103to104"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line103to104_500"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line103to104_500"; + equipment "line103to104"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line103to104_600"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line103to104_600"; + equipment "line103to104"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_104"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line103to104_load_104"; + equipment "line103to104"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line105to106_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line105to106_100"; + equipment "line105to106"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line105to106_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line105to106_200"; + equipment "line105to106"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_106"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line105to106_load_106"; + equipment "line105to106"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line106to107_load_106"; + equipment "line106to107"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line105to108_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line105to108_100"; + equipment "line105to108"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line105to108_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line105to108_200"; + equipment "line105to108"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line105to108_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line105to108_300"; + equipment "line105to108"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_108"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line105to108_node_108"; + equipment "line105to108"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line108to109_node_108"; + equipment "line108to109"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line108to300_node_108"; + equipment "line108to300"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line106to107_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line106to107_100"; + equipment "line106to107"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line106to107_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line106to107_200"; + equipment "line106to107"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line106to107_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line106to107_300"; + equipment "line106to107"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line106to107_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line106to107_400"; + equipment "line106to107"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line106to107_500"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line106to107_500"; + equipment "line106to107"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_107"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line106to107_load_107"; + equipment "line106to107"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line108to109_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line108to109_100"; + equipment "line108to109"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line108to109_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line108to109_200"; + equipment "line108to109"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line108to109_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line108to109_300"; + equipment "line108to109"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line108to109_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line108to109_400"; + equipment "line108to109"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_109"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line108to109_load_109"; + equipment "line108to109"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line109to110_load_109"; + equipment "line109to110"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line108to300_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line108to300_100"; + equipment "line108to300"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line108to300_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line108to300_200"; + equipment "line108to300"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line108to300_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line108to300_300"; + equipment "line108to300"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line108to300_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line108to300_400"; + equipment "line108to300"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line108to300_500"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line108to300_500"; + equipment "line108to300"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line108to300_600"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line108to300_600"; + equipment "line108to300"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line108to300_700"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line108to300_700"; + equipment "line108to300"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line108to300_800"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line108to300_800"; + equipment "line108to300"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line108to300_900"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line108to300_900"; + equipment "line108to300"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line109to110_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line109to110_100"; + equipment "line109to110"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line109to110_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line109to110_200"; + equipment "line109to110"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_110"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line109to110_node_110"; + equipment "line109to110"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line110to111_node_110"; + equipment "line110to111"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line110to112_node_110"; + equipment "line110to112"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line110to111_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line110to111_100"; + equipment "line110to111"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line110to111_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line110to111_200"; + equipment "line110to111"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line110to111_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line110to111_300"; + equipment "line110to111"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line110to111_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line110to111_400"; + equipment "line110to111"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line110to111_500"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line110to111_500"; + equipment "line110to111"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_111"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line110to111_load_111"; + equipment "line110to111"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line110to112_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line110to112_100"; + equipment "line110to112"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_112"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line110to112_load_112"; + equipment "line110to112"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line112to113_load_112"; + equipment "line112to113"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line112to113_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line112to113_100"; + equipment "line112to113"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line112to113_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line112to113_200"; + equipment "line112to113"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line112to113_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line112to113_300"; + equipment "line112to113"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line112to113_400"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line112to113_400"; + equipment "line112to113"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line112to113_500"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line112to113_500"; + equipment "line112to113"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_113"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line112to113_load_113"; + equipment "line112to113"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; + object pole_mount + { + name "mount_line113to114_load_113"; + equipment "line113to114"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line113to114_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line113to114_100"; + equipment "line113to114"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line113to114_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line113to114_200"; + equipment "line113to114"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line113to114_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line113to114_300"; + equipment "line113to114"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_load_114"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line113to114_load_114"; + equipment "line113to114"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_135"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line135to35_node_135"; + equipment "line135to35"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line135to35_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line135to35_100"; + equipment "line135to35"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line135to35_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line135to35_200"; + equipment "line135to35"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line135to35_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line135to35_300"; + equipment "line135to35"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_149"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line149to1_node_149"; + equipment "line149to1"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line149to1_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line149to1_100"; + equipment "line149to1"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line149to1_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line149to1_200"; + equipment "line149to1"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line149to1_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line149to1_300"; + equipment "line149to1"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_152"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line152to52_node_152"; + equipment "line152to52"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line152to52_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line152to52_100"; + equipment "line152to52"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line152to52_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line152to52_200"; + equipment "line152to52"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line152to52_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line152to52_300"; + equipment "line152to52"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_16001"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line16001to67_node_16001"; + equipment "line16001to67"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line16001to67_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line16001to67_100"; + equipment "line16001to67"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line16001to67_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line16001to67_200"; + equipment "line16001to67"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line16001to67_300"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line16001to67_300"; + equipment "line16001to67"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_node_197"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line197to101_node_197"; + equipment "line197to101"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line197to101_100"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line197to101_100"; + equipment "line197to101"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} +object pole +{ + name "pole_line197to101_200"; + configuration "WOOD-EC-45/4"; + weather "example"; + install_year "2000"; + tilt_angle "0 deg"; + tilt_direction "0 deg"; + object pole_mount + { + name "mount_line197to101_200"; + equipment "line197to101"; + pole_spacing "100.0 ft"; + height "40 ft"; + offset "0 ft"; + area "0 sf"; + direction "0 deg"; + weight "0 lb"; + }; +} diff --git a/tools/autotest/test_group_modify_opt.glm b/tools/autotest/test_group_modify_opt.glm new file mode 100644 index 000000000..26c55b505 --- /dev/null +++ b/tools/autotest/test_group_modify_opt.glm @@ -0,0 +1,1244 @@ +// generated by /usr/local/opt/gridlabd/4.3.3-230729-develop_add_group_tool-darwin_22-x86_64/share/gridlabd/group.py -i=test_group.json --modify --force -o=test_group_modify_opt.glm at 2023-07-29 10:35:54.839295 +#begin python +groups = {'island_1': ['node_3', 'node_8', 'node_13', 'node_14', 'node_15', 'node_18', 'node_21', 'node_23', 'node_25', 'node_26', 'node_27', 'node_149', 'node_250', 'node_901', 'node_2501', 'load_1', 'load_2', 'load_4', 'load_5', 'load_6', 'load_7', 'load_9', 'load_10', 'load_11', 'load_12', 'load_16', 'load_17', 'load_19', 'load_20', 'load_22', 'load_24', 'load_28', 'load_29', 'load_30', 'load_31', 'load_32', 'load_33', 'load_34', 'line1to2', 'line1to3', 'line1to7', 'line3to4', 'line3to5', 'line5to6', 'line7to8', 'line8to12', 'line8to9', 'line8to13', 'line901to14', 'line13to34', 'line13to18', 'line14to11', 'line14to10', 'line15to16', 'line15to17', 'line18to19', 'line18to21', 'line19to20', 'line21to22', 'line21to23', 'line23to24', 'line23to25', 'line2501to26', 'line25to28', 'line26to27', 'line26to31', 'line27to33', 'line28to29', 'line29to30', 'line30to250', 'line31to32', 'line34to15', 'line149to1', 'reg9to901', 'reg25to2501', 'pole_load_9', 'mount_reg9to901', 'mount_line8to9_load_9', 'pole_node_25', 'mount_reg25to2501', 'mount_line23to25_node_25', 'mount_line25to28_node_25', 'mount_line8to13_node_13', 'mount_line13to34_node_13', 'mount_line13to18_node_13', 'mount_line13to18_node_18', 'mount_line18to19_node_18', 'mount_line18to21_node_18', 'pole_load_1', 'mount_line1to2_load_1', 'mount_line1to3_load_1', 'mount_line1to7_load_1', 'mount_line149to1_load_1', 'pole_line1to2_100', 'mount_line1to2_100', 'pole_load_2', 'mount_line1to2_load_2', 'pole_line1to3_100', 'mount_line1to3_100', 'pole_line1to3_200', 'mount_line1to3_200', 'pole_node_3', 'mount_line1to3_node_3', 'mount_line3to4_node_3', 'mount_line3to5_node_3', 'pole_line1to7_100', 'mount_line1to7_100', 'pole_line1to7_200', 'mount_line1to7_200', 'pole_load_7', 'mount_line1to7_load_7', 'mount_line7to8_load_7', 'pole_line3to4_100', 'mount_line3to4_100', 'pole_load_4', 'mount_line3to4_load_4', 'pole_line3to5_100', 'mount_line3to5_100', 'pole_line3to5_200', 'mount_line3to5_200', 'pole_line3to5_300', 'mount_line3to5_300', 'pole_load_5', 'mount_line3to5_load_5', 'mount_line5to6_load_5', 'pole_line5to6_100', 'mount_line5to6_100', 'pole_line5to6_200', 'mount_line5to6_200', 'pole_load_6', 'mount_line5to6_load_6', 'pole_line7to8_100', 'mount_line7to8_100', 'pole_node_8', 'mount_line7to8_node_8', 'mount_line8to12_node_8', 'mount_line8to9_node_8', 'mount_line8to13_node_8', 'pole_line8to12_100', 'mount_line8to12_100', 'pole_line8to12_200', 'mount_line8to12_200', 'pole_load_12', 'mount_line8to12_load_12', 'pole_line8to9_100', 'mount_line8to9_100', 'pole_line8to9_200', 'mount_line8to9_200', 'pole_line8to13_100', 'mount_line8to13_100', 'pole_line8to13_200', 'mount_line8to13_200', 'pole_node_901', 'mount_line901to14_node_901', 'pole_line901to14_100', 'mount_line901to14_100', 'pole_line901to14_200', 'mount_line901to14_200', 'pole_line901to14_300', 'mount_line901to14_300', 'pole_line901to14_400', 'mount_line901to14_400', 'pole_node_14', 'mount_line901to14_node_14', 'mount_line14to11_node_14', 'mount_line14to10_node_14', 'pole_line13to34_100', 'mount_line13to34_100', 'pole_load_34', 'mount_line13to34_load_34', 'mount_line34to15_load_34', 'pole_line13to18_100', 'mount_line13to18_100', 'pole_line13to18_200', 'mount_line13to18_200', 'pole_line13to18_300', 'mount_line13to18_300', 'pole_line13to18_400', 'mount_line13to18_400', 'pole_line13to18_500', 'mount_line13to18_500', 'pole_line13to18_600', 'mount_line13to18_600', 'pole_line13to18_700', 'mount_line13to18_700', 'pole_line13to18_800', 'mount_line13to18_800', 'pole_line14to11_100', 'mount_line14to11_100', 'pole_line14to11_200', 'mount_line14to11_200', 'pole_load_11', 'mount_line14to11_load_11', 'pole_line14to10_100', 'mount_line14to10_100', 'pole_line14to10_200', 'mount_line14to10_200', 'pole_load_10', 'mount_line14to10_load_10', 'pole_node_15', 'mount_line15to16_node_15', 'mount_line15to17_node_15', 'mount_line34to15_node_15', 'pole_line15to16_100', 'mount_line15to16_100', 'pole_line15to16_200', 'mount_line15to16_200', 'pole_line15to16_300', 'mount_line15to16_300', 'pole_load_16', 'mount_line15to16_load_16', 'pole_line15to17_100', 'mount_line15to17_100', 'pole_line15to17_200', 'mount_line15to17_200', 'pole_line15to17_300', 'mount_line15to17_300', 'pole_load_17', 'mount_line15to17_load_17', 'pole_line18to19_100', 'mount_line18to19_100', 'pole_line18to19_200', 'mount_line18to19_200', 'pole_load_19', 'mount_line18to19_load_19', 'mount_line19to20_load_19', 'pole_line18to21_100', 'mount_line18to21_100', 'pole_line18to21_200', 'mount_line18to21_200', 'pole_node_21', 'mount_line18to21_node_21', 'mount_line21to22_node_21', 'mount_line21to23_node_21', 'pole_line19to20_100', 'mount_line19to20_100', 'pole_line19to20_200', 'mount_line19to20_200', 'pole_line19to20_300', 'mount_line19to20_300', 'pole_load_20', 'mount_line19to20_load_20', 'pole_line21to22_100', 'mount_line21to22_100', 'pole_line21to22_200', 'mount_line21to22_200', 'pole_line21to22_300', 'mount_line21to22_300', 'pole_line21to22_400', 'mount_line21to22_400', 'pole_line21to22_500', 'mount_line21to22_500', 'pole_load_22', 'mount_line21to22_load_22', 'pole_line21to23_100', 'mount_line21to23_100', 'pole_line21to23_200', 'mount_line21to23_200', 'pole_node_23', 'mount_line21to23_node_23', 'mount_line23to24_node_23', 'mount_line23to25_node_23', 'pole_line23to24_100', 'mount_line23to24_100', 'pole_line23to24_200', 'mount_line23to24_200', 'pole_line23to24_300', 'mount_line23to24_300', 'pole_line23to24_400', 'mount_line23to24_400', 'pole_line23to24_500', 'mount_line23to24_500', 'pole_load_24', 'mount_line23to24_load_24', 'pole_line23to25_100', 'mount_line23to25_100', 'pole_line23to25_200', 'mount_line23to25_200', 'pole_node_2501', 'mount_line2501to26_node_2501', 'pole_line2501to26_100', 'mount_line2501to26_100', 'pole_line2501to26_200', 'mount_line2501to26_200', 'pole_line2501to26_300', 'mount_line2501to26_300', 'pole_node_26', 'mount_line2501to26_node_26', 'mount_line26to27_node_26', 'mount_line26to31_node_26', 'pole_line25to28_100', 'mount_line25to28_100', 'pole_load_28', 'mount_line25to28_load_28', 'mount_line28to29_load_28', 'pole_line26to27_100', 'mount_line26to27_100', 'pole_line26to27_200', 'mount_line26to27_200', 'pole_node_27', 'mount_line26to27_node_27', 'mount_line27to33_node_27', 'pole_line26to31_100', 'mount_line26to31_100', 'pole_line26to31_200', 'mount_line26to31_200', 'pole_load_31', 'mount_line26to31_load_31', 'mount_line31to32_load_31', 'pole_line27to33_100', 'mount_line27to33_100', 'pole_line27to33_200', 'mount_line27to33_200', 'pole_line27to33_300', 'mount_line27to33_300', 'pole_line27to33_400', 'mount_line27to33_400', 'pole_load_33', 'mount_line27to33_load_33', 'pole_line28to29_100', 'mount_line28to29_100', 'pole_line28to29_200', 'mount_line28to29_200', 'pole_load_29', 'mount_line28to29_load_29', 'mount_line29to30_load_29', 'pole_line29to30_100', 'mount_line29to30_100', 'pole_line29to30_200', 'mount_line29to30_200', 'pole_line29to30_300', 'mount_line29to30_300', 'pole_load_30', 'mount_line29to30_load_30', 'mount_line30to250_load_30', 'pole_line30to250_100', 'mount_line30to250_100', 'pole_line31to32_100', 'mount_line31to32_100', 'pole_line31to32_200', 'mount_line31to32_200', 'pole_load_32', 'mount_line31to32_load_32', 'pole_node_149', 'mount_line149to1_node_149', 'pole_line149to1_100', 'mount_line149to1_100', 'pole_line149to1_200', 'mount_line149to1_200', 'pole_line149to1_300', 'mount_line149to1_300'], 'island_7': ['substation_meter'], 'island_8': ['node_36', 'node_40', 'node_44', 'node_135', 'node_151', 'load_35', 'load_37', 'load_38', 'load_39', 'load_41', 'load_42', 'load_43', 'load_45', 'load_46', 'load_47', 'load_48', 'load_49', 'load_50', 'load_51', 'line35to36', 'line35to40', 'line36to37', 'line36to38', 'line38to39', 'line40to41', 'line40to42', 'line42to43', 'line42to44', 'line44to45', 'line44to47', 'line45to46', 'line47to48', 'line47to49', 'line49to50', 'line50to51', 'line51to151', 'line135to35', 'mount_line51to151_node_151', 'pole_load_35', 'mount_line35to36_load_35', 'mount_line35to40_load_35', 'mount_line135to35_load_35', 'pole_line35to36_100', 'mount_line35to36_100', 'pole_line35to36_200', 'mount_line35to36_200', 'pole_line35to36_300', 'mount_line35to36_300', 'pole_line35to36_400', 'mount_line35to36_400', 'pole_line35to36_500', 'mount_line35to36_500', 'pole_line35to36_600', 'mount_line35to36_600', 'pole_node_36', 'mount_line35to36_node_36', 'mount_line36to37_node_36', 'mount_line36to38_node_36', 'pole_line35to40_100', 'mount_line35to40_100', 'pole_line35to40_200', 'mount_line35to40_200', 'pole_node_40', 'mount_line35to40_node_40', 'mount_line40to41_node_40', 'mount_line40to42_node_40', 'pole_line36to37_100', 'mount_line36to37_100', 'pole_line36to37_200', 'mount_line36to37_200', 'pole_load_37', 'mount_line36to37_load_37', 'pole_line36to38_100', 'mount_line36to38_100', 'pole_line36to38_200', 'mount_line36to38_200', 'pole_load_38', 'mount_line36to38_load_38', 'mount_line38to39_load_38', 'pole_line38to39_100', 'mount_line38to39_100', 'pole_line38to39_200', 'mount_line38to39_200', 'pole_line38to39_300', 'mount_line38to39_300', 'pole_load_39', 'mount_line38to39_load_39', 'pole_line40to41_100', 'mount_line40to41_100', 'pole_line40to41_200', 'mount_line40to41_200', 'pole_line40to41_300', 'mount_line40to41_300', 'pole_load_41', 'mount_line40to41_load_41', 'pole_line40to42_100', 'mount_line40to42_100', 'pole_line40to42_200', 'mount_line40to42_200', 'pole_load_42', 'mount_line40to42_load_42', 'mount_line42to43_load_42', 'mount_line42to44_load_42', 'pole_line42to43_100', 'mount_line42to43_100', 'pole_line42to43_200', 'mount_line42to43_200', 'pole_line42to43_300', 'mount_line42to43_300', 'pole_line42to43_400', 'mount_line42to43_400', 'pole_load_43', 'mount_line42to43_load_43', 'pole_line42to44_100', 'mount_line42to44_100', 'pole_node_44', 'mount_line42to44_node_44', 'mount_line44to45_node_44', 'mount_line44to47_node_44', 'pole_line44to45_100', 'mount_line44to45_100', 'pole_load_45', 'mount_line44to45_load_45', 'mount_line45to46_load_45', 'pole_line44to47_100', 'mount_line44to47_100', 'pole_line44to47_200', 'mount_line44to47_200', 'pole_load_47', 'mount_line44to47_load_47', 'mount_line47to48_load_47', 'mount_line47to49_load_47', 'pole_line45to46_100', 'mount_line45to46_100', 'pole_line45to46_200', 'mount_line45to46_200', 'pole_load_46', 'mount_line45to46_load_46', 'pole_line47to48_100', 'mount_line47to48_100', 'pole_load_48', 'mount_line47to48_load_48', 'pole_line47to49_100', 'mount_line47to49_100', 'pole_line47to49_200', 'mount_line47to49_200', 'pole_load_49', 'mount_line47to49_load_49', 'mount_line49to50_load_49', 'pole_line49to50_100', 'mount_line49to50_100', 'pole_line49to50_200', 'mount_line49to50_200', 'pole_load_50', 'mount_line49to50_load_50', 'mount_line50to51_load_50', 'pole_line50to51_100', 'mount_line50to51_100', 'pole_line50to51_200', 'mount_line50to51_200', 'pole_load_51', 'mount_line50to51_load_51', 'mount_line51to151_load_51', 'pole_line51to151_100', 'mount_line51to151_100', 'pole_line51to151_200', 'mount_line51to151_200', 'pole_line51to151_300', 'mount_line51to151_300', 'pole_line51to151_400', 'mount_line51to151_400', 'pole_node_135', 'mount_line135to35_node_135', 'pole_line135to35_100', 'mount_line135to35_100', 'pole_line135to35_200', 'mount_line135to35_200', 'pole_line135to35_300', 'mount_line135to35_300'], 'island_9': ['node_54', 'node_57', 'node_61', 'node_152', 'load_52', 'load_53', 'load_55', 'load_56', 'load_58', 'load_59', 'load_60', 'load_62', 'load_63', 'load_64', 'load_65', 'load_66', 'line52to53', 'line53to54', 'line54to55', 'line54to57', 'line55to56', 'line57to58', 'line57to60', 'line58to59', 'line60to61', 'line60to62', 'line62to63', 'line63to64', 'line64to65', 'line65to66', 'line152to52', 'mount_line53to54_node_54', 'mount_line54to55_node_54', 'mount_line54to57_node_54', 'mount_line57to60_load_60', 'mount_line60to61_load_60', 'mount_line60to61_node_61', 'pole_load_52', 'mount_line52to53_load_52', 'mount_line152to52_load_52', 'pole_line52to53_100', 'mount_line52to53_100', 'pole_load_53', 'mount_line52to53_load_53', 'mount_line53to54_load_53', 'pole_line53to54_100', 'mount_line53to54_100', 'pole_line54to55_100', 'mount_line54to55_100', 'pole_line54to55_200', 'mount_line54to55_200', 'pole_load_55', 'mount_line54to55_load_55', 'mount_line55to56_load_55', 'pole_line54to57_100', 'mount_line54to57_100', 'pole_line54to57_200', 'mount_line54to57_200', 'pole_line54to57_300', 'mount_line54to57_300', 'pole_node_57', 'mount_line54to57_node_57', 'mount_line57to58_node_57', 'mount_line57to60_node_57', 'pole_line55to56_100', 'mount_line55to56_100', 'pole_line55to56_200', 'mount_line55to56_200', 'pole_load_56', 'mount_line55to56_load_56', 'pole_line57to58_100', 'mount_line57to58_100', 'pole_line57to58_200', 'mount_line57to58_200', 'pole_load_58', 'mount_line57to58_load_58', 'mount_line58to59_load_58', 'pole_line57to60_100', 'mount_line57to60_100', 'pole_line57to60_200', 'mount_line57to60_200', 'pole_line57to60_300', 'mount_line57to60_300', 'pole_line57to60_400', 'mount_line57to60_400', 'pole_line57to60_500', 'mount_line57to60_500', 'pole_line57to60_600', 'mount_line57to60_600', 'pole_line57to60_700', 'mount_line57to60_700', 'pole_line58to59_100', 'mount_line58to59_100', 'pole_line58to59_200', 'mount_line58to59_200', 'pole_load_59', 'mount_line58to59_load_59', 'pole_line60to61_100', 'mount_line60to61_100', 'pole_line60to61_200', 'mount_line60to61_200', 'pole_line60to61_300', 'mount_line60to61_300', 'pole_line60to61_400', 'mount_line60to61_400', 'pole_line60to61_500', 'mount_line60to61_500', 'pole_node_152', 'mount_line152to52_node_152', 'pole_line152to52_100', 'mount_line152to52_100', 'pole_line152to52_200', 'mount_line152to52_200', 'pole_line152to52_300', 'mount_line152to52_300'], 'island_10': ['node_67', 'node_72', 'node_78', 'node_81', 'node_89', 'node_91', 'node_93', 'node_97', 'node_160', 'node_450', 'node_16001', 'load_68', 'load_69', 'load_70', 'load_71', 'load_73', 'load_74', 'load_75', 'load_76', 'load_77', 'load_79', 'load_80', 'load_82', 'load_83', 'load_84', 'load_85', 'load_86', 'load_87', 'load_88', 'load_90', 'load_92', 'load_94', 'load_95', 'load_96', 'load_98', 'load_99', 'load_100', 'line67to68', 'line67to72', 'line67to97', 'line68to69', 'line69to70', 'line70to71', 'line72to73', 'line72to76', 'line73to74', 'line74to75', 'line76to77', 'line76to86', 'line77to78', 'line78to79', 'line78to80', 'line80to81', 'line81to82', 'line81to84', 'line82to83', 'line84to85', 'line86to87', 'line87to88', 'line87to89', 'line89to90', 'line89to91', 'line91to92', 'line91to93', 'line93to94', 'line93to95', 'line95to96', 'line97to98', 'line98to99', 'line99to100', 'line100to450', 'line16001to67', 'reg160to16001', 'pole_node_160', 'mount_reg160to16001', 'mount_line67to97_node_97', 'mount_line97to98_node_97', 'pole_node_67', 'mount_line67to68_node_67', 'mount_line67to72_node_67', 'mount_line67to97_node_67', 'mount_line16001to67_node_67', 'pole_line67to68_100', 'mount_line67to68_100', 'pole_load_68', 'mount_line67to68_load_68', 'mount_line68to69_load_68', 'pole_line67to72_100', 'mount_line67to72_100', 'pole_line67to72_200', 'mount_line67to72_200', 'pole_node_72', 'mount_line67to72_node_72', 'mount_line72to73_node_72', 'mount_line72to76_node_72', 'pole_line67to97_100', 'mount_line67to97_100', 'pole_line67to97_200', 'mount_line67to97_200', 'pole_line68to69_100', 'mount_line68to69_100', 'pole_line68to69_200', 'mount_line68to69_200', 'pole_load_69', 'mount_line68to69_load_69', 'mount_line69to70_load_69', 'pole_line69to70_100', 'mount_line69to70_100', 'pole_line69to70_200', 'mount_line69to70_200', 'pole_line69to70_300', 'mount_line69to70_300', 'pole_load_70', 'mount_line69to70_load_70', 'mount_line70to71_load_70', 'pole_line70to71_100', 'mount_line70to71_100', 'pole_line70to71_200', 'mount_line70to71_200', 'pole_load_71', 'mount_line70to71_load_71', 'pole_line72to73_100', 'mount_line72to73_100', 'pole_line72to73_200', 'mount_line72to73_200', 'pole_load_73', 'mount_line72to73_load_73', 'mount_line73to74_load_73', 'pole_line72to76_100', 'mount_line72to76_100', 'pole_load_76', 'mount_line72to76_load_76', 'mount_line76to77_load_76', 'mount_line76to86_load_76', 'pole_line73to74_100', 'mount_line73to74_100', 'pole_line73to74_200', 'mount_line73to74_200', 'pole_line73to74_300', 'mount_line73to74_300', 'pole_load_74', 'mount_line73to74_load_74', 'mount_line74to75_load_74', 'pole_line74to75_100', 'mount_line74to75_100', 'pole_line74to75_200', 'mount_line74to75_200', 'pole_line74to75_300', 'mount_line74to75_300', 'pole_load_75', 'mount_line74to75_load_75', 'pole_line76to77_100', 'mount_line76to77_100', 'pole_line76to77_200', 'mount_line76to77_200', 'pole_line76to77_300', 'mount_line76to77_300', 'pole_load_77', 'mount_line76to77_load_77', 'mount_line77to78_load_77', 'pole_line76to86_100', 'mount_line76to86_100', 'pole_line76to86_200', 'mount_line76to86_200', 'pole_line76to86_300', 'mount_line76to86_300', 'pole_line76to86_400', 'mount_line76to86_400', 'pole_line76to86_500', 'mount_line76to86_500', 'pole_line76to86_600', 'mount_line76to86_600', 'pole_load_86', 'mount_line76to86_load_86', 'mount_line86to87_load_86', 'pole_node_78', 'mount_line77to78_node_78', 'mount_line78to79_node_78', 'mount_line78to80_node_78', 'pole_line78to79_100', 'mount_line78to79_100', 'pole_line78to79_200', 'mount_line78to79_200', 'pole_load_79', 'mount_line78to79_load_79', 'pole_line78to80_100', 'mount_line78to80_100', 'pole_line78to80_200', 'mount_line78to80_200', 'pole_line78to80_300', 'mount_line78to80_300', 'pole_line78to80_400', 'mount_line78to80_400', 'pole_load_80', 'mount_line78to80_load_80', 'mount_line80to81_load_80', 'pole_line80to81_100', 'mount_line80to81_100', 'pole_line80to81_200', 'mount_line80to81_200', 'pole_line80to81_300', 'mount_line80to81_300', 'pole_line80to81_400', 'mount_line80to81_400', 'pole_node_81', 'mount_line80to81_node_81', 'mount_line81to82_node_81', 'mount_line81to84_node_81', 'pole_line81to82_100', 'mount_line81to82_100', 'pole_line81to82_200', 'mount_line81to82_200', 'pole_load_82', 'mount_line81to82_load_82', 'mount_line82to83_load_82', 'pole_line81to84_100', 'mount_line81to84_100', 'pole_line81to84_200', 'mount_line81to84_200', 'pole_line81to84_300', 'mount_line81to84_300', 'pole_line81to84_400', 'mount_line81to84_400', 'pole_line81to84_500', 'mount_line81to84_500', 'pole_line81to84_600', 'mount_line81to84_600', 'pole_load_84', 'mount_line81to84_load_84', 'mount_line84to85_load_84', 'pole_line82to83_100', 'mount_line82to83_100', 'pole_line82to83_200', 'mount_line82to83_200', 'pole_load_83', 'mount_line82to83_load_83', 'pole_line84to85_100', 'mount_line84to85_100', 'pole_line84to85_200', 'mount_line84to85_200', 'pole_line84to85_300', 'mount_line84to85_300', 'pole_line84to85_400', 'mount_line84to85_400', 'pole_load_85', 'mount_line84to85_load_85', 'pole_line86to87_100', 'mount_line86to87_100', 'pole_line86to87_200', 'mount_line86to87_200', 'pole_line86to87_300', 'mount_line86to87_300', 'pole_line86to87_400', 'mount_line86to87_400', 'pole_load_87', 'mount_line86to87_load_87', 'mount_line87to88_load_87', 'mount_line87to89_load_87', 'pole_line87to88_100', 'mount_line87to88_100', 'pole_load_88', 'mount_line87to88_load_88', 'pole_line87to89_100', 'mount_line87to89_100', 'pole_line87to89_200', 'mount_line87to89_200', 'pole_node_89', 'mount_line87to89_node_89', 'mount_line89to90_node_89', 'mount_line89to91_node_89', 'pole_line89to90_100', 'mount_line89to90_100', 'pole_line89to90_200', 'mount_line89to90_200', 'pole_load_90', 'mount_line89to90_load_90', 'pole_line89to91_100', 'mount_line89to91_100', 'pole_line89to91_200', 'mount_line89to91_200', 'pole_node_91', 'mount_line89to91_node_91', 'mount_line91to92_node_91', 'mount_line91to93_node_91', 'pole_line91to92_100', 'mount_line91to92_100', 'pole_line91to92_200', 'mount_line91to92_200', 'pole_load_92', 'mount_line91to92_load_92', 'pole_line91to93_100', 'mount_line91to93_100', 'pole_line91to93_200', 'mount_line91to93_200', 'pole_node_93', 'mount_line91to93_node_93', 'mount_line93to94_node_93', 'mount_line93to95_node_93', 'pole_line93to94_100', 'mount_line93to94_100', 'pole_line93to94_200', 'mount_line93to94_200', 'pole_load_94', 'mount_line93to94_load_94', 'pole_line93to95_100', 'mount_line93to95_100', 'pole_line93to95_200', 'mount_line93to95_200', 'pole_line95to96_100', 'mount_line95to96_100', 'pole_load_96', 'mount_line95to96_load_96', 'pole_line97to98_100', 'mount_line97to98_100', 'pole_line97to98_200', 'mount_line97to98_200', 'pole_load_98', 'mount_line97to98_load_98', 'mount_line98to99_load_98', 'pole_line98to99_100', 'mount_line98to99_100', 'pole_line98to99_200', 'mount_line98to99_200', 'pole_line98to99_300', 'mount_line98to99_300', 'pole_line98to99_400', 'mount_line98to99_400', 'pole_line98to99_500', 'mount_line98to99_500', 'pole_load_99', 'mount_line98to99_load_99', 'mount_line99to100_load_99', 'pole_line99to100_100', 'mount_line99to100_100', 'pole_line99to100_200', 'mount_line99to100_200', 'pole_load_100', 'mount_line99to100_load_100', 'mount_line100to450_load_100', 'pole_line100to450_100', 'mount_line100to450_100', 'pole_line100to450_200', 'mount_line100to450_200', 'pole_line100to450_300', 'mount_line100to450_300', 'pole_line100to450_400', 'mount_line100to450_400', 'pole_line100to450_500', 'mount_line100to450_500', 'pole_line100to450_600', 'mount_line100to450_600', 'pole_line100to450_700', 'mount_line100to450_700', 'pole_node_16001', 'mount_line16001to67_node_16001', 'pole_line16001to67_100', 'mount_line16001to67_100', 'pole_line16001to67_200', 'mount_line16001to67_200', 'pole_line16001to67_300', 'mount_line16001to67_300'], 'island_11': ['node_101', 'node_105', 'node_108', 'node_110', 'node_197', 'node_300', 'load_102', 'load_103', 'load_104', 'load_106', 'load_107', 'load_109', 'load_111', 'load_112', 'load_113', 'load_114', 'line101to102', 'line101to105', 'line102to103', 'line103to104', 'line105to106', 'line105to108', 'line106to107', 'line108to109', 'line108to300', 'line109to110', 'line110to111', 'line110to112', 'line112to113', 'line113to114', 'line197to101', 'pole_node_101', 'mount_line101to102_node_101', 'mount_line101to105_node_101', 'mount_line197to101_node_101', 'pole_line101to102_100', 'mount_line101to102_100', 'pole_line101to102_200', 'mount_line101to102_200', 'pole_load_102', 'mount_line101to102_load_102', 'mount_line102to103_load_102', 'pole_line101to105_100', 'mount_line101to105_100', 'pole_line101to105_200', 'mount_line101to105_200', 'pole_node_105', 'mount_line101to105_node_105', 'mount_line105to106_node_105', 'mount_line105to108_node_105', 'pole_line102to103_100', 'mount_line102to103_100', 'pole_line102to103_200', 'mount_line102to103_200', 'pole_line102to103_300', 'mount_line102to103_300', 'pole_load_103', 'mount_line102to103_load_103', 'mount_line103to104_load_103', 'pole_line103to104_100', 'mount_line103to104_100', 'pole_line103to104_200', 'mount_line103to104_200', 'pole_line103to104_300', 'mount_line103to104_300', 'pole_line103to104_400', 'mount_line103to104_400', 'pole_line103to104_500', 'mount_line103to104_500', 'pole_line103to104_600', 'mount_line103to104_600', 'pole_load_104', 'mount_line103to104_load_104', 'pole_line105to106_100', 'mount_line105to106_100', 'pole_line105to106_200', 'mount_line105to106_200', 'pole_load_106', 'mount_line105to106_load_106', 'mount_line106to107_load_106', 'pole_line105to108_100', 'mount_line105to108_100', 'pole_line105to108_200', 'mount_line105to108_200', 'pole_line105to108_300', 'mount_line105to108_300', 'pole_node_108', 'mount_line105to108_node_108', 'mount_line108to109_node_108', 'mount_line108to300_node_108', 'pole_line106to107_100', 'mount_line106to107_100', 'pole_line106to107_200', 'mount_line106to107_200', 'pole_line106to107_300', 'mount_line106to107_300', 'pole_line106to107_400', 'mount_line106to107_400', 'pole_line106to107_500', 'mount_line106to107_500', 'pole_load_107', 'mount_line106to107_load_107', 'pole_line108to109_100', 'mount_line108to109_100', 'pole_line108to109_200', 'mount_line108to109_200', 'pole_line108to109_300', 'mount_line108to109_300', 'pole_line108to109_400', 'mount_line108to109_400', 'pole_load_109', 'mount_line108to109_load_109', 'mount_line109to110_load_109', 'pole_line108to300_100', 'mount_line108to300_100', 'pole_line108to300_200', 'mount_line108to300_200', 'pole_line108to300_300', 'mount_line108to300_300', 'pole_line108to300_400', 'mount_line108to300_400', 'pole_line108to300_500', 'mount_line108to300_500', 'pole_line108to300_600', 'mount_line108to300_600', 'pole_line108to300_700', 'mount_line108to300_700', 'pole_line108to300_800', 'mount_line108to300_800', 'pole_line108to300_900', 'mount_line108to300_900', 'pole_line109to110_100', 'mount_line109to110_100', 'pole_line109to110_200', 'mount_line109to110_200', 'pole_node_110', 'mount_line109to110_node_110', 'mount_line110to111_node_110', 'mount_line110to112_node_110', 'pole_line110to111_100', 'mount_line110to111_100', 'pole_line110to111_200', 'mount_line110to111_200', 'pole_line110to111_300', 'mount_line110to111_300', 'pole_line110to111_400', 'mount_line110to111_400', 'pole_line110to111_500', 'mount_line110to111_500', 'pole_load_111', 'mount_line110to111_load_111', 'pole_line110to112_100', 'mount_line110to112_100', 'pole_load_112', 'mount_line110to112_load_112', 'mount_line112to113_load_112', 'pole_line112to113_100', 'mount_line112to113_100', 'pole_line112to113_200', 'mount_line112to113_200', 'pole_line112to113_300', 'mount_line112to113_300', 'pole_line112to113_400', 'mount_line112to113_400', 'pole_line112to113_500', 'mount_line112to113_500', 'pole_load_113', 'mount_line112to113_load_113', 'mount_line113to114_load_113', 'pole_line113to114_100', 'mount_line113to114_100', 'pole_line113to114_200', 'mount_line113to114_200', 'pole_line113to114_300', 'mount_line113to114_300', 'pole_load_114', 'mount_line113to114_load_114', 'pole_node_197', 'mount_line197to101_node_197', 'pole_line197to101_100', 'mount_line197to101_100', 'pole_line197to101_200', 'mount_line197to101_200'], 'island_2': ['node_150', 'node_15001', 'reg150to15001', 'pole_node_150', 'mount_reg150to15001'], 'island_12': ['node_610', 'node_6101', 'trans6101to610', 'pole_node_6101', 'mount_trans6101to610'], 'island_13': ['cap_83'], 'island_14': ['cap_88'], 'island_15': ['cap_90'], 'island_16': ['cap_92'], 'island_3': ['node_251'], 'island_4': ['node_350'], 'island_5': ['node_451'], 'island_6': ['node_195']} +controls = {'sw13to152': ['island_1', 'island_9'], 'sw18to135': ['island_1', 'island_8'], 'sw54to94': ['island_9', 'island_10'], 'sw60to160': ['island_9', 'island_10'], 'sw61to6101': ['island_9', 'island_12'], 'sw97to197': ['island_10', 'island_11'], 'sw151to300': ['island_8', 'island_11'], 'sw15001to149': ['island_2', 'island_1'], 'sw250to251': ['island_1', 'island_3'], 'sw300to350': ['island_11', 'island_4'], 'sw450to451': ['island_10', 'island_5'], 'sw95to195': ['island_10', 'island_6']} +swingbus = {'island_1': ['node_14'], 'island_2': ['node_150'], 'island_3': ['node_251'], 'island_4': ['node_350'], 'island_5': ['node_451'], 'island_6': ['node_195']} +isolated = ['island_7', 'island_8', 'island_9', 'island_10', 'island_11', 'island_12', 'island_13', 'island_14', 'island_15', 'island_16'] +#end + +modify node_3.groupid 'island_1'; +modify node_8.groupid 'island_1'; +modify node_13.groupid 'island_1'; +modify node_14.groupid 'island_1'; +modify substation_meter.groupid 'island_7'; +modify node_15.groupid 'island_1'; +modify node_18.groupid 'island_1'; +modify node_21.groupid 'island_1'; +modify node_23.groupid 'island_1'; +modify node_25.groupid 'island_1'; +modify node_26.groupid 'island_1'; +modify node_27.groupid 'island_1'; +modify node_36.groupid 'island_8'; +modify node_40.groupid 'island_8'; +modify node_44.groupid 'island_8'; +modify node_54.groupid 'island_9'; +modify node_57.groupid 'island_9'; +modify node_61.groupid 'island_9'; +modify node_67.groupid 'island_10'; +modify node_72.groupid 'island_10'; +modify node_78.groupid 'island_10'; +modify node_81.groupid 'island_10'; +modify node_89.groupid 'island_10'; +modify node_91.groupid 'island_10'; +modify node_93.groupid 'island_10'; +modify node_97.groupid 'island_10'; +modify node_101.groupid 'island_11'; +modify node_105.groupid 'island_11'; +modify node_108.groupid 'island_11'; +modify node_110.groupid 'island_11'; +modify node_135.groupid 'island_8'; +modify node_149.groupid 'island_1'; +modify node_150.groupid 'island_2'; +modify node_151.groupid 'island_8'; +modify node_152.groupid 'island_9'; +modify node_160.groupid 'island_10'; +modify node_197.groupid 'island_11'; +modify node_250.groupid 'island_1'; +modify node_300.groupid 'island_11'; +modify node_450.groupid 'island_10'; +modify node_610.groupid 'island_12'; +modify node_901.groupid 'island_1'; +modify node_2501.groupid 'island_1'; +modify node_6101.groupid 'island_12'; +modify node_15001.groupid 'island_2'; +modify node_16001.groupid 'island_10'; +modify load_1.groupid 'island_1'; +modify load_2.groupid 'island_1'; +modify load_4.groupid 'island_1'; +modify load_5.groupid 'island_1'; +modify load_6.groupid 'island_1'; +modify load_7.groupid 'island_1'; +modify load_9.groupid 'island_1'; +modify load_10.groupid 'island_1'; +modify load_11.groupid 'island_1'; +modify load_12.groupid 'island_1'; +modify load_16.groupid 'island_1'; +modify load_17.groupid 'island_1'; +modify load_19.groupid 'island_1'; +modify load_20.groupid 'island_1'; +modify load_22.groupid 'island_1'; +modify load_24.groupid 'island_1'; +modify load_28.groupid 'island_1'; +modify load_29.groupid 'island_1'; +modify load_30.groupid 'island_1'; +modify load_31.groupid 'island_1'; +modify load_32.groupid 'island_1'; +modify load_33.groupid 'island_1'; +modify load_34.groupid 'island_1'; +modify load_35.groupid 'island_8'; +modify load_37.groupid 'island_8'; +modify load_38.groupid 'island_8'; +modify load_39.groupid 'island_8'; +modify load_41.groupid 'island_8'; +modify load_42.groupid 'island_8'; +modify load_43.groupid 'island_8'; +modify load_45.groupid 'island_8'; +modify load_46.groupid 'island_8'; +modify load_47.groupid 'island_8'; +modify load_48.groupid 'island_8'; +modify load_49.groupid 'island_8'; +modify load_50.groupid 'island_8'; +modify load_51.groupid 'island_8'; +modify load_52.groupid 'island_9'; +modify load_53.groupid 'island_9'; +modify load_55.groupid 'island_9'; +modify load_56.groupid 'island_9'; +modify load_58.groupid 'island_9'; +modify load_59.groupid 'island_9'; +modify load_60.groupid 'island_9'; +modify load_62.groupid 'island_9'; +modify load_63.groupid 'island_9'; +modify load_64.groupid 'island_9'; +modify load_65.groupid 'island_9'; +modify load_66.groupid 'island_9'; +modify load_68.groupid 'island_10'; +modify load_69.groupid 'island_10'; +modify load_70.groupid 'island_10'; +modify load_71.groupid 'island_10'; +modify load_73.groupid 'island_10'; +modify load_74.groupid 'island_10'; +modify load_75.groupid 'island_10'; +modify load_76.groupid 'island_10'; +modify load_77.groupid 'island_10'; +modify load_79.groupid 'island_10'; +modify load_80.groupid 'island_10'; +modify load_82.groupid 'island_10'; +modify load_83.groupid 'island_10'; +modify load_84.groupid 'island_10'; +modify load_85.groupid 'island_10'; +modify load_86.groupid 'island_10'; +modify load_87.groupid 'island_10'; +modify load_88.groupid 'island_10'; +modify load_90.groupid 'island_10'; +modify load_92.groupid 'island_10'; +modify load_94.groupid 'island_10'; +modify load_95.groupid 'island_10'; +modify load_96.groupid 'island_10'; +modify load_98.groupid 'island_10'; +modify load_99.groupid 'island_10'; +modify load_100.groupid 'island_10'; +modify load_102.groupid 'island_11'; +modify load_103.groupid 'island_11'; +modify load_104.groupid 'island_11'; +modify load_106.groupid 'island_11'; +modify load_107.groupid 'island_11'; +modify load_109.groupid 'island_11'; +modify load_111.groupid 'island_11'; +modify load_112.groupid 'island_11'; +modify load_113.groupid 'island_11'; +modify load_114.groupid 'island_11'; +modify line1to2.groupid 'island_1'; +modify line1to3.groupid 'island_1'; +modify line1to7.groupid 'island_1'; +modify line3to4.groupid 'island_1'; +modify line3to5.groupid 'island_1'; +modify line5to6.groupid 'island_1'; +modify line7to8.groupid 'island_1'; +modify line8to12.groupid 'island_1'; +modify line8to9.groupid 'island_1'; +modify line8to13.groupid 'island_1'; +modify line901to14.groupid 'island_1'; +modify line13to34.groupid 'island_1'; +modify line13to18.groupid 'island_1'; +modify line14to11.groupid 'island_1'; +modify line14to10.groupid 'island_1'; +modify line15to16.groupid 'island_1'; +modify line15to17.groupid 'island_1'; +modify line18to19.groupid 'island_1'; +modify line18to21.groupid 'island_1'; +modify line19to20.groupid 'island_1'; +modify line21to22.groupid 'island_1'; +modify line21to23.groupid 'island_1'; +modify line23to24.groupid 'island_1'; +modify line23to25.groupid 'island_1'; +modify line2501to26.groupid 'island_1'; +modify line25to28.groupid 'island_1'; +modify line26to27.groupid 'island_1'; +modify line26to31.groupid 'island_1'; +modify line27to33.groupid 'island_1'; +modify line28to29.groupid 'island_1'; +modify line29to30.groupid 'island_1'; +modify line30to250.groupid 'island_1'; +modify line31to32.groupid 'island_1'; +modify line34to15.groupid 'island_1'; +modify line35to36.groupid 'island_8'; +modify line35to40.groupid 'island_8'; +modify line36to37.groupid 'island_8'; +modify line36to38.groupid 'island_8'; +modify line38to39.groupid 'island_8'; +modify line40to41.groupid 'island_8'; +modify line40to42.groupid 'island_8'; +modify line42to43.groupid 'island_8'; +modify line42to44.groupid 'island_8'; +modify line44to45.groupid 'island_8'; +modify line44to47.groupid 'island_8'; +modify line45to46.groupid 'island_8'; +modify line47to48.groupid 'island_8'; +modify line47to49.groupid 'island_8'; +modify line49to50.groupid 'island_8'; +modify line50to51.groupid 'island_8'; +modify line51to151.groupid 'island_8'; +modify line52to53.groupid 'island_9'; +modify line53to54.groupid 'island_9'; +modify line54to55.groupid 'island_9'; +modify line54to57.groupid 'island_9'; +modify line55to56.groupid 'island_9'; +modify line57to58.groupid 'island_9'; +modify line57to60.groupid 'island_9'; +modify line58to59.groupid 'island_9'; +modify line60to61.groupid 'island_9'; +modify line60to62.groupid 'island_9'; +modify line62to63.groupid 'island_9'; +modify line63to64.groupid 'island_9'; +modify line64to65.groupid 'island_9'; +modify line65to66.groupid 'island_9'; +modify line67to68.groupid 'island_10'; +modify line67to72.groupid 'island_10'; +modify line67to97.groupid 'island_10'; +modify line68to69.groupid 'island_10'; +modify line69to70.groupid 'island_10'; +modify line70to71.groupid 'island_10'; +modify line72to73.groupid 'island_10'; +modify line72to76.groupid 'island_10'; +modify line73to74.groupid 'island_10'; +modify line74to75.groupid 'island_10'; +modify line76to77.groupid 'island_10'; +modify line76to86.groupid 'island_10'; +modify line77to78.groupid 'island_10'; +modify line78to79.groupid 'island_10'; +modify line78to80.groupid 'island_10'; +modify line80to81.groupid 'island_10'; +modify line81to82.groupid 'island_10'; +modify line81to84.groupid 'island_10'; +modify line82to83.groupid 'island_10'; +modify line84to85.groupid 'island_10'; +modify line86to87.groupid 'island_10'; +modify line87to88.groupid 'island_10'; +modify line87to89.groupid 'island_10'; +modify line89to90.groupid 'island_10'; +modify line89to91.groupid 'island_10'; +modify line91to92.groupid 'island_10'; +modify line91to93.groupid 'island_10'; +modify line93to94.groupid 'island_10'; +modify line93to95.groupid 'island_10'; +modify line95to96.groupid 'island_10'; +modify line97to98.groupid 'island_10'; +modify line98to99.groupid 'island_10'; +modify line99to100.groupid 'island_10'; +modify line100to450.groupid 'island_10'; +modify line101to102.groupid 'island_11'; +modify line101to105.groupid 'island_11'; +modify line102to103.groupid 'island_11'; +modify line103to104.groupid 'island_11'; +modify line105to106.groupid 'island_11'; +modify line105to108.groupid 'island_11'; +modify line106to107.groupid 'island_11'; +modify line108to109.groupid 'island_11'; +modify line108to300.groupid 'island_11'; +modify line109to110.groupid 'island_11'; +modify line110to111.groupid 'island_11'; +modify line110to112.groupid 'island_11'; +modify line112to113.groupid 'island_11'; +modify line113to114.groupid 'island_11'; +modify line135to35.groupid 'island_8'; +modify line149to1.groupid 'island_1'; +modify line152to52.groupid 'island_9'; +modify line16001to67.groupid 'island_10'; +modify line197to101.groupid 'island_11'; +modify trans6101to610.groupid 'island_12'; +modify reg150to15001.groupid 'island_2'; +modify reg9to901.groupid 'island_1'; +modify reg25to2501.groupid 'island_1'; +modify reg160to16001.groupid 'island_10'; +modify sw13to152.groupid 'control'; +modify sw18to135.groupid 'control'; +modify sw54to94.groupid 'control'; +modify sw60to160.groupid 'control'; +modify sw61to6101.groupid 'control'; +modify sw97to197.groupid 'control'; +modify sw151to300.groupid 'control'; +modify sw15001to149.groupid 'control'; +modify cap_83.groupid 'island_13'; +modify cap_88.groupid 'island_14'; +modify cap_90.groupid 'island_15'; +modify cap_92.groupid 'island_16'; +modify node_251.groupid 'island_3'; +modify node_350.groupid 'island_4'; +modify node_451.groupid 'island_5'; +modify node_195.groupid 'island_6'; +modify sw250to251.groupid 'control'; +modify sw300to350.groupid 'control'; +modify sw450to451.groupid 'control'; +modify sw95to195.groupid 'control'; +modify pole_node_6101.groupid 'island_12'; +modify mount_trans6101to610.groupid 'island_12'; +modify pole_node_150.groupid 'island_2'; +modify mount_reg150to15001.groupid 'island_2'; +modify pole_load_9.groupid 'island_1'; +modify mount_reg9to901.groupid 'island_1'; +modify mount_line8to9_load_9.groupid 'island_1'; +modify pole_node_25.groupid 'island_1'; +modify mount_reg25to2501.groupid 'island_1'; +modify mount_line23to25_node_25.groupid 'island_1'; +modify mount_line25to28_node_25.groupid 'island_1'; +modify pole_node_160.groupid 'island_10'; +modify mount_reg160to16001.groupid 'island_10'; +modify pole_node_13.groupid 'control'; +modify mount_sw13to152.groupid 'control'; +modify mount_line8to13_node_13.groupid 'island_1'; +modify mount_line13to34_node_13.groupid 'island_1'; +modify mount_line13to18_node_13.groupid 'island_1'; +modify pole_node_18.groupid 'control'; +modify mount_sw18to135.groupid 'control'; +modify mount_line13to18_node_18.groupid 'island_1'; +modify mount_line18to19_node_18.groupid 'island_1'; +modify mount_line18to21_node_18.groupid 'island_1'; +modify pole_node_54.groupid 'control'; +modify mount_sw54to94.groupid 'control'; +modify mount_line53to54_node_54.groupid 'island_9'; +modify mount_line54to55_node_54.groupid 'island_9'; +modify mount_line54to57_node_54.groupid 'island_9'; +modify pole_load_60.groupid 'control'; +modify mount_sw60to160.groupid 'control'; +modify mount_line57to60_load_60.groupid 'island_9'; +modify mount_line60to61_load_60.groupid 'island_9'; +modify pole_node_61.groupid 'control'; +modify mount_sw61to6101.groupid 'control'; +modify mount_line60to61_node_61.groupid 'island_9'; +modify pole_node_97.groupid 'control'; +modify mount_sw97to197.groupid 'control'; +modify mount_line67to97_node_97.groupid 'island_10'; +modify mount_line97to98_node_97.groupid 'island_10'; +modify pole_node_151.groupid 'control'; +modify mount_sw151to300.groupid 'control'; +modify mount_line51to151_node_151.groupid 'island_8'; +modify pole_node_15001.groupid 'control'; +modify mount_sw15001to149.groupid 'control'; +modify pole_load_1.groupid 'island_1'; +modify mount_line1to2_load_1.groupid 'island_1'; +modify mount_line1to3_load_1.groupid 'island_1'; +modify mount_line1to7_load_1.groupid 'island_1'; +modify mount_line149to1_load_1.groupid 'island_1'; +modify pole_line1to2_100.groupid 'island_1'; +modify mount_line1to2_100.groupid 'island_1'; +modify pole_load_2.groupid 'island_1'; +modify mount_line1to2_load_2.groupid 'island_1'; +modify pole_line1to3_100.groupid 'island_1'; +modify mount_line1to3_100.groupid 'island_1'; +modify pole_line1to3_200.groupid 'island_1'; +modify mount_line1to3_200.groupid 'island_1'; +modify pole_node_3.groupid 'island_1'; +modify mount_line1to3_node_3.groupid 'island_1'; +modify mount_line3to4_node_3.groupid 'island_1'; +modify mount_line3to5_node_3.groupid 'island_1'; +modify pole_line1to7_100.groupid 'island_1'; +modify mount_line1to7_100.groupid 'island_1'; +modify pole_line1to7_200.groupid 'island_1'; +modify mount_line1to7_200.groupid 'island_1'; +modify pole_load_7.groupid 'island_1'; +modify mount_line1to7_load_7.groupid 'island_1'; +modify mount_line7to8_load_7.groupid 'island_1'; +modify pole_line3to4_100.groupid 'island_1'; +modify mount_line3to4_100.groupid 'island_1'; +modify pole_load_4.groupid 'island_1'; +modify mount_line3to4_load_4.groupid 'island_1'; +modify pole_line3to5_100.groupid 'island_1'; +modify mount_line3to5_100.groupid 'island_1'; +modify pole_line3to5_200.groupid 'island_1'; +modify mount_line3to5_200.groupid 'island_1'; +modify pole_line3to5_300.groupid 'island_1'; +modify mount_line3to5_300.groupid 'island_1'; +modify pole_load_5.groupid 'island_1'; +modify mount_line3to5_load_5.groupid 'island_1'; +modify mount_line5to6_load_5.groupid 'island_1'; +modify pole_line5to6_100.groupid 'island_1'; +modify mount_line5to6_100.groupid 'island_1'; +modify pole_line5to6_200.groupid 'island_1'; +modify mount_line5to6_200.groupid 'island_1'; +modify pole_load_6.groupid 'island_1'; +modify mount_line5to6_load_6.groupid 'island_1'; +modify pole_line7to8_100.groupid 'island_1'; +modify mount_line7to8_100.groupid 'island_1'; +modify pole_node_8.groupid 'island_1'; +modify mount_line7to8_node_8.groupid 'island_1'; +modify mount_line8to12_node_8.groupid 'island_1'; +modify mount_line8to9_node_8.groupid 'island_1'; +modify mount_line8to13_node_8.groupid 'island_1'; +modify pole_line8to12_100.groupid 'island_1'; +modify mount_line8to12_100.groupid 'island_1'; +modify pole_line8to12_200.groupid 'island_1'; +modify mount_line8to12_200.groupid 'island_1'; +modify pole_load_12.groupid 'island_1'; +modify mount_line8to12_load_12.groupid 'island_1'; +modify pole_line8to9_100.groupid 'island_1'; +modify mount_line8to9_100.groupid 'island_1'; +modify pole_line8to9_200.groupid 'island_1'; +modify mount_line8to9_200.groupid 'island_1'; +modify pole_line8to13_100.groupid 'island_1'; +modify mount_line8to13_100.groupid 'island_1'; +modify pole_line8to13_200.groupid 'island_1'; +modify mount_line8to13_200.groupid 'island_1'; +modify pole_node_901.groupid 'island_1'; +modify mount_line901to14_node_901.groupid 'island_1'; +modify pole_line901to14_100.groupid 'island_1'; +modify mount_line901to14_100.groupid 'island_1'; +modify pole_line901to14_200.groupid 'island_1'; +modify mount_line901to14_200.groupid 'island_1'; +modify pole_line901to14_300.groupid 'island_1'; +modify mount_line901to14_300.groupid 'island_1'; +modify pole_line901to14_400.groupid 'island_1'; +modify mount_line901to14_400.groupid 'island_1'; +modify pole_node_14.groupid 'island_1'; +modify mount_line901to14_node_14.groupid 'island_1'; +modify mount_line14to11_node_14.groupid 'island_1'; +modify mount_line14to10_node_14.groupid 'island_1'; +modify pole_line13to34_100.groupid 'island_1'; +modify mount_line13to34_100.groupid 'island_1'; +modify pole_load_34.groupid 'island_1'; +modify mount_line13to34_load_34.groupid 'island_1'; +modify mount_line34to15_load_34.groupid 'island_1'; +modify pole_line13to18_100.groupid 'island_1'; +modify mount_line13to18_100.groupid 'island_1'; +modify pole_line13to18_200.groupid 'island_1'; +modify mount_line13to18_200.groupid 'island_1'; +modify pole_line13to18_300.groupid 'island_1'; +modify mount_line13to18_300.groupid 'island_1'; +modify pole_line13to18_400.groupid 'island_1'; +modify mount_line13to18_400.groupid 'island_1'; +modify pole_line13to18_500.groupid 'island_1'; +modify mount_line13to18_500.groupid 'island_1'; +modify pole_line13to18_600.groupid 'island_1'; +modify mount_line13to18_600.groupid 'island_1'; +modify pole_line13to18_700.groupid 'island_1'; +modify mount_line13to18_700.groupid 'island_1'; +modify pole_line13to18_800.groupid 'island_1'; +modify mount_line13to18_800.groupid 'island_1'; +modify pole_line14to11_100.groupid 'island_1'; +modify mount_line14to11_100.groupid 'island_1'; +modify pole_line14to11_200.groupid 'island_1'; +modify mount_line14to11_200.groupid 'island_1'; +modify pole_load_11.groupid 'island_1'; +modify mount_line14to11_load_11.groupid 'island_1'; +modify pole_line14to10_100.groupid 'island_1'; +modify mount_line14to10_100.groupid 'island_1'; +modify pole_line14to10_200.groupid 'island_1'; +modify mount_line14to10_200.groupid 'island_1'; +modify pole_load_10.groupid 'island_1'; +modify mount_line14to10_load_10.groupid 'island_1'; +modify pole_node_15.groupid 'island_1'; +modify mount_line15to16_node_15.groupid 'island_1'; +modify mount_line15to17_node_15.groupid 'island_1'; +modify mount_line34to15_node_15.groupid 'island_1'; +modify pole_line15to16_100.groupid 'island_1'; +modify mount_line15to16_100.groupid 'island_1'; +modify pole_line15to16_200.groupid 'island_1'; +modify mount_line15to16_200.groupid 'island_1'; +modify pole_line15to16_300.groupid 'island_1'; +modify mount_line15to16_300.groupid 'island_1'; +modify pole_load_16.groupid 'island_1'; +modify mount_line15to16_load_16.groupid 'island_1'; +modify pole_line15to17_100.groupid 'island_1'; +modify mount_line15to17_100.groupid 'island_1'; +modify pole_line15to17_200.groupid 'island_1'; +modify mount_line15to17_200.groupid 'island_1'; +modify pole_line15to17_300.groupid 'island_1'; +modify mount_line15to17_300.groupid 'island_1'; +modify pole_load_17.groupid 'island_1'; +modify mount_line15to17_load_17.groupid 'island_1'; +modify pole_line18to19_100.groupid 'island_1'; +modify mount_line18to19_100.groupid 'island_1'; +modify pole_line18to19_200.groupid 'island_1'; +modify mount_line18to19_200.groupid 'island_1'; +modify pole_load_19.groupid 'island_1'; +modify mount_line18to19_load_19.groupid 'island_1'; +modify mount_line19to20_load_19.groupid 'island_1'; +modify pole_line18to21_100.groupid 'island_1'; +modify mount_line18to21_100.groupid 'island_1'; +modify pole_line18to21_200.groupid 'island_1'; +modify mount_line18to21_200.groupid 'island_1'; +modify pole_node_21.groupid 'island_1'; +modify mount_line18to21_node_21.groupid 'island_1'; +modify mount_line21to22_node_21.groupid 'island_1'; +modify mount_line21to23_node_21.groupid 'island_1'; +modify pole_line19to20_100.groupid 'island_1'; +modify mount_line19to20_100.groupid 'island_1'; +modify pole_line19to20_200.groupid 'island_1'; +modify mount_line19to20_200.groupid 'island_1'; +modify pole_line19to20_300.groupid 'island_1'; +modify mount_line19to20_300.groupid 'island_1'; +modify pole_load_20.groupid 'island_1'; +modify mount_line19to20_load_20.groupid 'island_1'; +modify pole_line21to22_100.groupid 'island_1'; +modify mount_line21to22_100.groupid 'island_1'; +modify pole_line21to22_200.groupid 'island_1'; +modify mount_line21to22_200.groupid 'island_1'; +modify pole_line21to22_300.groupid 'island_1'; +modify mount_line21to22_300.groupid 'island_1'; +modify pole_line21to22_400.groupid 'island_1'; +modify mount_line21to22_400.groupid 'island_1'; +modify pole_line21to22_500.groupid 'island_1'; +modify mount_line21to22_500.groupid 'island_1'; +modify pole_load_22.groupid 'island_1'; +modify mount_line21to22_load_22.groupid 'island_1'; +modify pole_line21to23_100.groupid 'island_1'; +modify mount_line21to23_100.groupid 'island_1'; +modify pole_line21to23_200.groupid 'island_1'; +modify mount_line21to23_200.groupid 'island_1'; +modify pole_node_23.groupid 'island_1'; +modify mount_line21to23_node_23.groupid 'island_1'; +modify mount_line23to24_node_23.groupid 'island_1'; +modify mount_line23to25_node_23.groupid 'island_1'; +modify pole_line23to24_100.groupid 'island_1'; +modify mount_line23to24_100.groupid 'island_1'; +modify pole_line23to24_200.groupid 'island_1'; +modify mount_line23to24_200.groupid 'island_1'; +modify pole_line23to24_300.groupid 'island_1'; +modify mount_line23to24_300.groupid 'island_1'; +modify pole_line23to24_400.groupid 'island_1'; +modify mount_line23to24_400.groupid 'island_1'; +modify pole_line23to24_500.groupid 'island_1'; +modify mount_line23to24_500.groupid 'island_1'; +modify pole_load_24.groupid 'island_1'; +modify mount_line23to24_load_24.groupid 'island_1'; +modify pole_line23to25_100.groupid 'island_1'; +modify mount_line23to25_100.groupid 'island_1'; +modify pole_line23to25_200.groupid 'island_1'; +modify mount_line23to25_200.groupid 'island_1'; +modify pole_node_2501.groupid 'island_1'; +modify mount_line2501to26_node_2501.groupid 'island_1'; +modify pole_line2501to26_100.groupid 'island_1'; +modify mount_line2501to26_100.groupid 'island_1'; +modify pole_line2501to26_200.groupid 'island_1'; +modify mount_line2501to26_200.groupid 'island_1'; +modify pole_line2501to26_300.groupid 'island_1'; +modify mount_line2501to26_300.groupid 'island_1'; +modify pole_node_26.groupid 'island_1'; +modify mount_line2501to26_node_26.groupid 'island_1'; +modify mount_line26to27_node_26.groupid 'island_1'; +modify mount_line26to31_node_26.groupid 'island_1'; +modify pole_line25to28_100.groupid 'island_1'; +modify mount_line25to28_100.groupid 'island_1'; +modify pole_load_28.groupid 'island_1'; +modify mount_line25to28_load_28.groupid 'island_1'; +modify mount_line28to29_load_28.groupid 'island_1'; +modify pole_line26to27_100.groupid 'island_1'; +modify mount_line26to27_100.groupid 'island_1'; +modify pole_line26to27_200.groupid 'island_1'; +modify mount_line26to27_200.groupid 'island_1'; +modify pole_node_27.groupid 'island_1'; +modify mount_line26to27_node_27.groupid 'island_1'; +modify mount_line27to33_node_27.groupid 'island_1'; +modify pole_line26to31_100.groupid 'island_1'; +modify mount_line26to31_100.groupid 'island_1'; +modify pole_line26to31_200.groupid 'island_1'; +modify mount_line26to31_200.groupid 'island_1'; +modify pole_load_31.groupid 'island_1'; +modify mount_line26to31_load_31.groupid 'island_1'; +modify mount_line31to32_load_31.groupid 'island_1'; +modify pole_line27to33_100.groupid 'island_1'; +modify mount_line27to33_100.groupid 'island_1'; +modify pole_line27to33_200.groupid 'island_1'; +modify mount_line27to33_200.groupid 'island_1'; +modify pole_line27to33_300.groupid 'island_1'; +modify mount_line27to33_300.groupid 'island_1'; +modify pole_line27to33_400.groupid 'island_1'; +modify mount_line27to33_400.groupid 'island_1'; +modify pole_load_33.groupid 'island_1'; +modify mount_line27to33_load_33.groupid 'island_1'; +modify pole_line28to29_100.groupid 'island_1'; +modify mount_line28to29_100.groupid 'island_1'; +modify pole_line28to29_200.groupid 'island_1'; +modify mount_line28to29_200.groupid 'island_1'; +modify pole_load_29.groupid 'island_1'; +modify mount_line28to29_load_29.groupid 'island_1'; +modify mount_line29to30_load_29.groupid 'island_1'; +modify pole_line29to30_100.groupid 'island_1'; +modify mount_line29to30_100.groupid 'island_1'; +modify pole_line29to30_200.groupid 'island_1'; +modify mount_line29to30_200.groupid 'island_1'; +modify pole_line29to30_300.groupid 'island_1'; +modify mount_line29to30_300.groupid 'island_1'; +modify pole_load_30.groupid 'island_1'; +modify mount_line29to30_load_30.groupid 'island_1'; +modify mount_line30to250_load_30.groupid 'island_1'; +modify pole_line30to250_100.groupid 'island_1'; +modify mount_line30to250_100.groupid 'island_1'; +modify pole_line31to32_100.groupid 'island_1'; +modify mount_line31to32_100.groupid 'island_1'; +modify pole_line31to32_200.groupid 'island_1'; +modify mount_line31to32_200.groupid 'island_1'; +modify pole_load_32.groupid 'island_1'; +modify mount_line31to32_load_32.groupid 'island_1'; +modify pole_load_35.groupid 'island_8'; +modify mount_line35to36_load_35.groupid 'island_8'; +modify mount_line35to40_load_35.groupid 'island_8'; +modify mount_line135to35_load_35.groupid 'island_8'; +modify pole_line35to36_100.groupid 'island_8'; +modify mount_line35to36_100.groupid 'island_8'; +modify pole_line35to36_200.groupid 'island_8'; +modify mount_line35to36_200.groupid 'island_8'; +modify pole_line35to36_300.groupid 'island_8'; +modify mount_line35to36_300.groupid 'island_8'; +modify pole_line35to36_400.groupid 'island_8'; +modify mount_line35to36_400.groupid 'island_8'; +modify pole_line35to36_500.groupid 'island_8'; +modify mount_line35to36_500.groupid 'island_8'; +modify pole_line35to36_600.groupid 'island_8'; +modify mount_line35to36_600.groupid 'island_8'; +modify pole_node_36.groupid 'island_8'; +modify mount_line35to36_node_36.groupid 'island_8'; +modify mount_line36to37_node_36.groupid 'island_8'; +modify mount_line36to38_node_36.groupid 'island_8'; +modify pole_line35to40_100.groupid 'island_8'; +modify mount_line35to40_100.groupid 'island_8'; +modify pole_line35to40_200.groupid 'island_8'; +modify mount_line35to40_200.groupid 'island_8'; +modify pole_node_40.groupid 'island_8'; +modify mount_line35to40_node_40.groupid 'island_8'; +modify mount_line40to41_node_40.groupid 'island_8'; +modify mount_line40to42_node_40.groupid 'island_8'; +modify pole_line36to37_100.groupid 'island_8'; +modify mount_line36to37_100.groupid 'island_8'; +modify pole_line36to37_200.groupid 'island_8'; +modify mount_line36to37_200.groupid 'island_8'; +modify pole_load_37.groupid 'island_8'; +modify mount_line36to37_load_37.groupid 'island_8'; +modify pole_line36to38_100.groupid 'island_8'; +modify mount_line36to38_100.groupid 'island_8'; +modify pole_line36to38_200.groupid 'island_8'; +modify mount_line36to38_200.groupid 'island_8'; +modify pole_load_38.groupid 'island_8'; +modify mount_line36to38_load_38.groupid 'island_8'; +modify mount_line38to39_load_38.groupid 'island_8'; +modify pole_line38to39_100.groupid 'island_8'; +modify mount_line38to39_100.groupid 'island_8'; +modify pole_line38to39_200.groupid 'island_8'; +modify mount_line38to39_200.groupid 'island_8'; +modify pole_line38to39_300.groupid 'island_8'; +modify mount_line38to39_300.groupid 'island_8'; +modify pole_load_39.groupid 'island_8'; +modify mount_line38to39_load_39.groupid 'island_8'; +modify pole_line40to41_100.groupid 'island_8'; +modify mount_line40to41_100.groupid 'island_8'; +modify pole_line40to41_200.groupid 'island_8'; +modify mount_line40to41_200.groupid 'island_8'; +modify pole_line40to41_300.groupid 'island_8'; +modify mount_line40to41_300.groupid 'island_8'; +modify pole_load_41.groupid 'island_8'; +modify mount_line40to41_load_41.groupid 'island_8'; +modify pole_line40to42_100.groupid 'island_8'; +modify mount_line40to42_100.groupid 'island_8'; +modify pole_line40to42_200.groupid 'island_8'; +modify mount_line40to42_200.groupid 'island_8'; +modify pole_load_42.groupid 'island_8'; +modify mount_line40to42_load_42.groupid 'island_8'; +modify mount_line42to43_load_42.groupid 'island_8'; +modify mount_line42to44_load_42.groupid 'island_8'; +modify pole_line42to43_100.groupid 'island_8'; +modify mount_line42to43_100.groupid 'island_8'; +modify pole_line42to43_200.groupid 'island_8'; +modify mount_line42to43_200.groupid 'island_8'; +modify pole_line42to43_300.groupid 'island_8'; +modify mount_line42to43_300.groupid 'island_8'; +modify pole_line42to43_400.groupid 'island_8'; +modify mount_line42to43_400.groupid 'island_8'; +modify pole_load_43.groupid 'island_8'; +modify mount_line42to43_load_43.groupid 'island_8'; +modify pole_line42to44_100.groupid 'island_8'; +modify mount_line42to44_100.groupid 'island_8'; +modify pole_node_44.groupid 'island_8'; +modify mount_line42to44_node_44.groupid 'island_8'; +modify mount_line44to45_node_44.groupid 'island_8'; +modify mount_line44to47_node_44.groupid 'island_8'; +modify pole_line44to45_100.groupid 'island_8'; +modify mount_line44to45_100.groupid 'island_8'; +modify pole_load_45.groupid 'island_8'; +modify mount_line44to45_load_45.groupid 'island_8'; +modify mount_line45to46_load_45.groupid 'island_8'; +modify pole_line44to47_100.groupid 'island_8'; +modify mount_line44to47_100.groupid 'island_8'; +modify pole_line44to47_200.groupid 'island_8'; +modify mount_line44to47_200.groupid 'island_8'; +modify pole_load_47.groupid 'island_8'; +modify mount_line44to47_load_47.groupid 'island_8'; +modify mount_line47to48_load_47.groupid 'island_8'; +modify mount_line47to49_load_47.groupid 'island_8'; +modify pole_line45to46_100.groupid 'island_8'; +modify mount_line45to46_100.groupid 'island_8'; +modify pole_line45to46_200.groupid 'island_8'; +modify mount_line45to46_200.groupid 'island_8'; +modify pole_load_46.groupid 'island_8'; +modify mount_line45to46_load_46.groupid 'island_8'; +modify pole_line47to48_100.groupid 'island_8'; +modify mount_line47to48_100.groupid 'island_8'; +modify pole_load_48.groupid 'island_8'; +modify mount_line47to48_load_48.groupid 'island_8'; +modify pole_line47to49_100.groupid 'island_8'; +modify mount_line47to49_100.groupid 'island_8'; +modify pole_line47to49_200.groupid 'island_8'; +modify mount_line47to49_200.groupid 'island_8'; +modify pole_load_49.groupid 'island_8'; +modify mount_line47to49_load_49.groupid 'island_8'; +modify mount_line49to50_load_49.groupid 'island_8'; +modify pole_line49to50_100.groupid 'island_8'; +modify mount_line49to50_100.groupid 'island_8'; +modify pole_line49to50_200.groupid 'island_8'; +modify mount_line49to50_200.groupid 'island_8'; +modify pole_load_50.groupid 'island_8'; +modify mount_line49to50_load_50.groupid 'island_8'; +modify mount_line50to51_load_50.groupid 'island_8'; +modify pole_line50to51_100.groupid 'island_8'; +modify mount_line50to51_100.groupid 'island_8'; +modify pole_line50to51_200.groupid 'island_8'; +modify mount_line50to51_200.groupid 'island_8'; +modify pole_load_51.groupid 'island_8'; +modify mount_line50to51_load_51.groupid 'island_8'; +modify mount_line51to151_load_51.groupid 'island_8'; +modify pole_line51to151_100.groupid 'island_8'; +modify mount_line51to151_100.groupid 'island_8'; +modify pole_line51to151_200.groupid 'island_8'; +modify mount_line51to151_200.groupid 'island_8'; +modify pole_line51to151_300.groupid 'island_8'; +modify mount_line51to151_300.groupid 'island_8'; +modify pole_line51to151_400.groupid 'island_8'; +modify mount_line51to151_400.groupid 'island_8'; +modify pole_load_52.groupid 'island_9'; +modify mount_line52to53_load_52.groupid 'island_9'; +modify mount_line152to52_load_52.groupid 'island_9'; +modify pole_line52to53_100.groupid 'island_9'; +modify mount_line52to53_100.groupid 'island_9'; +modify pole_load_53.groupid 'island_9'; +modify mount_line52to53_load_53.groupid 'island_9'; +modify mount_line53to54_load_53.groupid 'island_9'; +modify pole_line53to54_100.groupid 'island_9'; +modify mount_line53to54_100.groupid 'island_9'; +modify pole_line54to55_100.groupid 'island_9'; +modify mount_line54to55_100.groupid 'island_9'; +modify pole_line54to55_200.groupid 'island_9'; +modify mount_line54to55_200.groupid 'island_9'; +modify pole_load_55.groupid 'island_9'; +modify mount_line54to55_load_55.groupid 'island_9'; +modify mount_line55to56_load_55.groupid 'island_9'; +modify pole_line54to57_100.groupid 'island_9'; +modify mount_line54to57_100.groupid 'island_9'; +modify pole_line54to57_200.groupid 'island_9'; +modify mount_line54to57_200.groupid 'island_9'; +modify pole_line54to57_300.groupid 'island_9'; +modify mount_line54to57_300.groupid 'island_9'; +modify pole_node_57.groupid 'island_9'; +modify mount_line54to57_node_57.groupid 'island_9'; +modify mount_line57to58_node_57.groupid 'island_9'; +modify mount_line57to60_node_57.groupid 'island_9'; +modify pole_line55to56_100.groupid 'island_9'; +modify mount_line55to56_100.groupid 'island_9'; +modify pole_line55to56_200.groupid 'island_9'; +modify mount_line55to56_200.groupid 'island_9'; +modify pole_load_56.groupid 'island_9'; +modify mount_line55to56_load_56.groupid 'island_9'; +modify pole_line57to58_100.groupid 'island_9'; +modify mount_line57to58_100.groupid 'island_9'; +modify pole_line57to58_200.groupid 'island_9'; +modify mount_line57to58_200.groupid 'island_9'; +modify pole_load_58.groupid 'island_9'; +modify mount_line57to58_load_58.groupid 'island_9'; +modify mount_line58to59_load_58.groupid 'island_9'; +modify pole_line57to60_100.groupid 'island_9'; +modify mount_line57to60_100.groupid 'island_9'; +modify pole_line57to60_200.groupid 'island_9'; +modify mount_line57to60_200.groupid 'island_9'; +modify pole_line57to60_300.groupid 'island_9'; +modify mount_line57to60_300.groupid 'island_9'; +modify pole_line57to60_400.groupid 'island_9'; +modify mount_line57to60_400.groupid 'island_9'; +modify pole_line57to60_500.groupid 'island_9'; +modify mount_line57to60_500.groupid 'island_9'; +modify pole_line57to60_600.groupid 'island_9'; +modify mount_line57to60_600.groupid 'island_9'; +modify pole_line57to60_700.groupid 'island_9'; +modify mount_line57to60_700.groupid 'island_9'; +modify pole_line58to59_100.groupid 'island_9'; +modify mount_line58to59_100.groupid 'island_9'; +modify pole_line58to59_200.groupid 'island_9'; +modify mount_line58to59_200.groupid 'island_9'; +modify pole_load_59.groupid 'island_9'; +modify mount_line58to59_load_59.groupid 'island_9'; +modify pole_line60to61_100.groupid 'island_9'; +modify mount_line60to61_100.groupid 'island_9'; +modify pole_line60to61_200.groupid 'island_9'; +modify mount_line60to61_200.groupid 'island_9'; +modify pole_line60to61_300.groupid 'island_9'; +modify mount_line60to61_300.groupid 'island_9'; +modify pole_line60to61_400.groupid 'island_9'; +modify mount_line60to61_400.groupid 'island_9'; +modify pole_line60to61_500.groupid 'island_9'; +modify mount_line60to61_500.groupid 'island_9'; +modify pole_node_67.groupid 'island_10'; +modify mount_line67to68_node_67.groupid 'island_10'; +modify mount_line67to72_node_67.groupid 'island_10'; +modify mount_line67to97_node_67.groupid 'island_10'; +modify mount_line16001to67_node_67.groupid 'island_10'; +modify pole_line67to68_100.groupid 'island_10'; +modify mount_line67to68_100.groupid 'island_10'; +modify pole_load_68.groupid 'island_10'; +modify mount_line67to68_load_68.groupid 'island_10'; +modify mount_line68to69_load_68.groupid 'island_10'; +modify pole_line67to72_100.groupid 'island_10'; +modify mount_line67to72_100.groupid 'island_10'; +modify pole_line67to72_200.groupid 'island_10'; +modify mount_line67to72_200.groupid 'island_10'; +modify pole_node_72.groupid 'island_10'; +modify mount_line67to72_node_72.groupid 'island_10'; +modify mount_line72to73_node_72.groupid 'island_10'; +modify mount_line72to76_node_72.groupid 'island_10'; +modify pole_line67to97_100.groupid 'island_10'; +modify mount_line67to97_100.groupid 'island_10'; +modify pole_line67to97_200.groupid 'island_10'; +modify mount_line67to97_200.groupid 'island_10'; +modify pole_line68to69_100.groupid 'island_10'; +modify mount_line68to69_100.groupid 'island_10'; +modify pole_line68to69_200.groupid 'island_10'; +modify mount_line68to69_200.groupid 'island_10'; +modify pole_load_69.groupid 'island_10'; +modify mount_line68to69_load_69.groupid 'island_10'; +modify mount_line69to70_load_69.groupid 'island_10'; +modify pole_line69to70_100.groupid 'island_10'; +modify mount_line69to70_100.groupid 'island_10'; +modify pole_line69to70_200.groupid 'island_10'; +modify mount_line69to70_200.groupid 'island_10'; +modify pole_line69to70_300.groupid 'island_10'; +modify mount_line69to70_300.groupid 'island_10'; +modify pole_load_70.groupid 'island_10'; +modify mount_line69to70_load_70.groupid 'island_10'; +modify mount_line70to71_load_70.groupid 'island_10'; +modify pole_line70to71_100.groupid 'island_10'; +modify mount_line70to71_100.groupid 'island_10'; +modify pole_line70to71_200.groupid 'island_10'; +modify mount_line70to71_200.groupid 'island_10'; +modify pole_load_71.groupid 'island_10'; +modify mount_line70to71_load_71.groupid 'island_10'; +modify pole_line72to73_100.groupid 'island_10'; +modify mount_line72to73_100.groupid 'island_10'; +modify pole_line72to73_200.groupid 'island_10'; +modify mount_line72to73_200.groupid 'island_10'; +modify pole_load_73.groupid 'island_10'; +modify mount_line72to73_load_73.groupid 'island_10'; +modify mount_line73to74_load_73.groupid 'island_10'; +modify pole_line72to76_100.groupid 'island_10'; +modify mount_line72to76_100.groupid 'island_10'; +modify pole_load_76.groupid 'island_10'; +modify mount_line72to76_load_76.groupid 'island_10'; +modify mount_line76to77_load_76.groupid 'island_10'; +modify mount_line76to86_load_76.groupid 'island_10'; +modify pole_line73to74_100.groupid 'island_10'; +modify mount_line73to74_100.groupid 'island_10'; +modify pole_line73to74_200.groupid 'island_10'; +modify mount_line73to74_200.groupid 'island_10'; +modify pole_line73to74_300.groupid 'island_10'; +modify mount_line73to74_300.groupid 'island_10'; +modify pole_load_74.groupid 'island_10'; +modify mount_line73to74_load_74.groupid 'island_10'; +modify mount_line74to75_load_74.groupid 'island_10'; +modify pole_line74to75_100.groupid 'island_10'; +modify mount_line74to75_100.groupid 'island_10'; +modify pole_line74to75_200.groupid 'island_10'; +modify mount_line74to75_200.groupid 'island_10'; +modify pole_line74to75_300.groupid 'island_10'; +modify mount_line74to75_300.groupid 'island_10'; +modify pole_load_75.groupid 'island_10'; +modify mount_line74to75_load_75.groupid 'island_10'; +modify pole_line76to77_100.groupid 'island_10'; +modify mount_line76to77_100.groupid 'island_10'; +modify pole_line76to77_200.groupid 'island_10'; +modify mount_line76to77_200.groupid 'island_10'; +modify pole_line76to77_300.groupid 'island_10'; +modify mount_line76to77_300.groupid 'island_10'; +modify pole_load_77.groupid 'island_10'; +modify mount_line76to77_load_77.groupid 'island_10'; +modify mount_line77to78_load_77.groupid 'island_10'; +modify pole_line76to86_100.groupid 'island_10'; +modify mount_line76to86_100.groupid 'island_10'; +modify pole_line76to86_200.groupid 'island_10'; +modify mount_line76to86_200.groupid 'island_10'; +modify pole_line76to86_300.groupid 'island_10'; +modify mount_line76to86_300.groupid 'island_10'; +modify pole_line76to86_400.groupid 'island_10'; +modify mount_line76to86_400.groupid 'island_10'; +modify pole_line76to86_500.groupid 'island_10'; +modify mount_line76to86_500.groupid 'island_10'; +modify pole_line76to86_600.groupid 'island_10'; +modify mount_line76to86_600.groupid 'island_10'; +modify pole_load_86.groupid 'island_10'; +modify mount_line76to86_load_86.groupid 'island_10'; +modify mount_line86to87_load_86.groupid 'island_10'; +modify pole_node_78.groupid 'island_10'; +modify mount_line77to78_node_78.groupid 'island_10'; +modify mount_line78to79_node_78.groupid 'island_10'; +modify mount_line78to80_node_78.groupid 'island_10'; +modify pole_line78to79_100.groupid 'island_10'; +modify mount_line78to79_100.groupid 'island_10'; +modify pole_line78to79_200.groupid 'island_10'; +modify mount_line78to79_200.groupid 'island_10'; +modify pole_load_79.groupid 'island_10'; +modify mount_line78to79_load_79.groupid 'island_10'; +modify pole_line78to80_100.groupid 'island_10'; +modify mount_line78to80_100.groupid 'island_10'; +modify pole_line78to80_200.groupid 'island_10'; +modify mount_line78to80_200.groupid 'island_10'; +modify pole_line78to80_300.groupid 'island_10'; +modify mount_line78to80_300.groupid 'island_10'; +modify pole_line78to80_400.groupid 'island_10'; +modify mount_line78to80_400.groupid 'island_10'; +modify pole_load_80.groupid 'island_10'; +modify mount_line78to80_load_80.groupid 'island_10'; +modify mount_line80to81_load_80.groupid 'island_10'; +modify pole_line80to81_100.groupid 'island_10'; +modify mount_line80to81_100.groupid 'island_10'; +modify pole_line80to81_200.groupid 'island_10'; +modify mount_line80to81_200.groupid 'island_10'; +modify pole_line80to81_300.groupid 'island_10'; +modify mount_line80to81_300.groupid 'island_10'; +modify pole_line80to81_400.groupid 'island_10'; +modify mount_line80to81_400.groupid 'island_10'; +modify pole_node_81.groupid 'island_10'; +modify mount_line80to81_node_81.groupid 'island_10'; +modify mount_line81to82_node_81.groupid 'island_10'; +modify mount_line81to84_node_81.groupid 'island_10'; +modify pole_line81to82_100.groupid 'island_10'; +modify mount_line81to82_100.groupid 'island_10'; +modify pole_line81to82_200.groupid 'island_10'; +modify mount_line81to82_200.groupid 'island_10'; +modify pole_load_82.groupid 'island_10'; +modify mount_line81to82_load_82.groupid 'island_10'; +modify mount_line82to83_load_82.groupid 'island_10'; +modify pole_line81to84_100.groupid 'island_10'; +modify mount_line81to84_100.groupid 'island_10'; +modify pole_line81to84_200.groupid 'island_10'; +modify mount_line81to84_200.groupid 'island_10'; +modify pole_line81to84_300.groupid 'island_10'; +modify mount_line81to84_300.groupid 'island_10'; +modify pole_line81to84_400.groupid 'island_10'; +modify mount_line81to84_400.groupid 'island_10'; +modify pole_line81to84_500.groupid 'island_10'; +modify mount_line81to84_500.groupid 'island_10'; +modify pole_line81to84_600.groupid 'island_10'; +modify mount_line81to84_600.groupid 'island_10'; +modify pole_load_84.groupid 'island_10'; +modify mount_line81to84_load_84.groupid 'island_10'; +modify mount_line84to85_load_84.groupid 'island_10'; +modify pole_line82to83_100.groupid 'island_10'; +modify mount_line82to83_100.groupid 'island_10'; +modify pole_line82to83_200.groupid 'island_10'; +modify mount_line82to83_200.groupid 'island_10'; +modify pole_load_83.groupid 'island_10'; +modify mount_line82to83_load_83.groupid 'island_10'; +modify pole_line84to85_100.groupid 'island_10'; +modify mount_line84to85_100.groupid 'island_10'; +modify pole_line84to85_200.groupid 'island_10'; +modify mount_line84to85_200.groupid 'island_10'; +modify pole_line84to85_300.groupid 'island_10'; +modify mount_line84to85_300.groupid 'island_10'; +modify pole_line84to85_400.groupid 'island_10'; +modify mount_line84to85_400.groupid 'island_10'; +modify pole_load_85.groupid 'island_10'; +modify mount_line84to85_load_85.groupid 'island_10'; +modify pole_line86to87_100.groupid 'island_10'; +modify mount_line86to87_100.groupid 'island_10'; +modify pole_line86to87_200.groupid 'island_10'; +modify mount_line86to87_200.groupid 'island_10'; +modify pole_line86to87_300.groupid 'island_10'; +modify mount_line86to87_300.groupid 'island_10'; +modify pole_line86to87_400.groupid 'island_10'; +modify mount_line86to87_400.groupid 'island_10'; +modify pole_load_87.groupid 'island_10'; +modify mount_line86to87_load_87.groupid 'island_10'; +modify mount_line87to88_load_87.groupid 'island_10'; +modify mount_line87to89_load_87.groupid 'island_10'; +modify pole_line87to88_100.groupid 'island_10'; +modify mount_line87to88_100.groupid 'island_10'; +modify pole_load_88.groupid 'island_10'; +modify mount_line87to88_load_88.groupid 'island_10'; +modify pole_line87to89_100.groupid 'island_10'; +modify mount_line87to89_100.groupid 'island_10'; +modify pole_line87to89_200.groupid 'island_10'; +modify mount_line87to89_200.groupid 'island_10'; +modify pole_node_89.groupid 'island_10'; +modify mount_line87to89_node_89.groupid 'island_10'; +modify mount_line89to90_node_89.groupid 'island_10'; +modify mount_line89to91_node_89.groupid 'island_10'; +modify pole_line89to90_100.groupid 'island_10'; +modify mount_line89to90_100.groupid 'island_10'; +modify pole_line89to90_200.groupid 'island_10'; +modify mount_line89to90_200.groupid 'island_10'; +modify pole_load_90.groupid 'island_10'; +modify mount_line89to90_load_90.groupid 'island_10'; +modify pole_line89to91_100.groupid 'island_10'; +modify mount_line89to91_100.groupid 'island_10'; +modify pole_line89to91_200.groupid 'island_10'; +modify mount_line89to91_200.groupid 'island_10'; +modify pole_node_91.groupid 'island_10'; +modify mount_line89to91_node_91.groupid 'island_10'; +modify mount_line91to92_node_91.groupid 'island_10'; +modify mount_line91to93_node_91.groupid 'island_10'; +modify pole_line91to92_100.groupid 'island_10'; +modify mount_line91to92_100.groupid 'island_10'; +modify pole_line91to92_200.groupid 'island_10'; +modify mount_line91to92_200.groupid 'island_10'; +modify pole_load_92.groupid 'island_10'; +modify mount_line91to92_load_92.groupid 'island_10'; +modify pole_line91to93_100.groupid 'island_10'; +modify mount_line91to93_100.groupid 'island_10'; +modify pole_line91to93_200.groupid 'island_10'; +modify mount_line91to93_200.groupid 'island_10'; +modify pole_node_93.groupid 'island_10'; +modify mount_line91to93_node_93.groupid 'island_10'; +modify mount_line93to94_node_93.groupid 'island_10'; +modify mount_line93to95_node_93.groupid 'island_10'; +modify pole_line93to94_100.groupid 'island_10'; +modify mount_line93to94_100.groupid 'island_10'; +modify pole_line93to94_200.groupid 'island_10'; +modify mount_line93to94_200.groupid 'island_10'; +modify pole_load_94.groupid 'island_10'; +modify mount_line93to94_load_94.groupid 'island_10'; +modify pole_line93to95_100.groupid 'island_10'; +modify mount_line93to95_100.groupid 'island_10'; +modify pole_line93to95_200.groupid 'island_10'; +modify mount_line93to95_200.groupid 'island_10'; +modify pole_line95to96_100.groupid 'island_10'; +modify mount_line95to96_100.groupid 'island_10'; +modify pole_load_96.groupid 'island_10'; +modify mount_line95to96_load_96.groupid 'island_10'; +modify pole_line97to98_100.groupid 'island_10'; +modify mount_line97to98_100.groupid 'island_10'; +modify pole_line97to98_200.groupid 'island_10'; +modify mount_line97to98_200.groupid 'island_10'; +modify pole_load_98.groupid 'island_10'; +modify mount_line97to98_load_98.groupid 'island_10'; +modify mount_line98to99_load_98.groupid 'island_10'; +modify pole_line98to99_100.groupid 'island_10'; +modify mount_line98to99_100.groupid 'island_10'; +modify pole_line98to99_200.groupid 'island_10'; +modify mount_line98to99_200.groupid 'island_10'; +modify pole_line98to99_300.groupid 'island_10'; +modify mount_line98to99_300.groupid 'island_10'; +modify pole_line98to99_400.groupid 'island_10'; +modify mount_line98to99_400.groupid 'island_10'; +modify pole_line98to99_500.groupid 'island_10'; +modify mount_line98to99_500.groupid 'island_10'; +modify pole_load_99.groupid 'island_10'; +modify mount_line98to99_load_99.groupid 'island_10'; +modify mount_line99to100_load_99.groupid 'island_10'; +modify pole_line99to100_100.groupid 'island_10'; +modify mount_line99to100_100.groupid 'island_10'; +modify pole_line99to100_200.groupid 'island_10'; +modify mount_line99to100_200.groupid 'island_10'; +modify pole_load_100.groupid 'island_10'; +modify mount_line99to100_load_100.groupid 'island_10'; +modify mount_line100to450_load_100.groupid 'island_10'; +modify pole_line100to450_100.groupid 'island_10'; +modify mount_line100to450_100.groupid 'island_10'; +modify pole_line100to450_200.groupid 'island_10'; +modify mount_line100to450_200.groupid 'island_10'; +modify pole_line100to450_300.groupid 'island_10'; +modify mount_line100to450_300.groupid 'island_10'; +modify pole_line100to450_400.groupid 'island_10'; +modify mount_line100to450_400.groupid 'island_10'; +modify pole_line100to450_500.groupid 'island_10'; +modify mount_line100to450_500.groupid 'island_10'; +modify pole_line100to450_600.groupid 'island_10'; +modify mount_line100to450_600.groupid 'island_10'; +modify pole_line100to450_700.groupid 'island_10'; +modify mount_line100to450_700.groupid 'island_10'; +modify pole_node_101.groupid 'island_11'; +modify mount_line101to102_node_101.groupid 'island_11'; +modify mount_line101to105_node_101.groupid 'island_11'; +modify mount_line197to101_node_101.groupid 'island_11'; +modify pole_line101to102_100.groupid 'island_11'; +modify mount_line101to102_100.groupid 'island_11'; +modify pole_line101to102_200.groupid 'island_11'; +modify mount_line101to102_200.groupid 'island_11'; +modify pole_load_102.groupid 'island_11'; +modify mount_line101to102_load_102.groupid 'island_11'; +modify mount_line102to103_load_102.groupid 'island_11'; +modify pole_line101to105_100.groupid 'island_11'; +modify mount_line101to105_100.groupid 'island_11'; +modify pole_line101to105_200.groupid 'island_11'; +modify mount_line101to105_200.groupid 'island_11'; +modify pole_node_105.groupid 'island_11'; +modify mount_line101to105_node_105.groupid 'island_11'; +modify mount_line105to106_node_105.groupid 'island_11'; +modify mount_line105to108_node_105.groupid 'island_11'; +modify pole_line102to103_100.groupid 'island_11'; +modify mount_line102to103_100.groupid 'island_11'; +modify pole_line102to103_200.groupid 'island_11'; +modify mount_line102to103_200.groupid 'island_11'; +modify pole_line102to103_300.groupid 'island_11'; +modify mount_line102to103_300.groupid 'island_11'; +modify pole_load_103.groupid 'island_11'; +modify mount_line102to103_load_103.groupid 'island_11'; +modify mount_line103to104_load_103.groupid 'island_11'; +modify pole_line103to104_100.groupid 'island_11'; +modify mount_line103to104_100.groupid 'island_11'; +modify pole_line103to104_200.groupid 'island_11'; +modify mount_line103to104_200.groupid 'island_11'; +modify pole_line103to104_300.groupid 'island_11'; +modify mount_line103to104_300.groupid 'island_11'; +modify pole_line103to104_400.groupid 'island_11'; +modify mount_line103to104_400.groupid 'island_11'; +modify pole_line103to104_500.groupid 'island_11'; +modify mount_line103to104_500.groupid 'island_11'; +modify pole_line103to104_600.groupid 'island_11'; +modify mount_line103to104_600.groupid 'island_11'; +modify pole_load_104.groupid 'island_11'; +modify mount_line103to104_load_104.groupid 'island_11'; +modify pole_line105to106_100.groupid 'island_11'; +modify mount_line105to106_100.groupid 'island_11'; +modify pole_line105to106_200.groupid 'island_11'; +modify mount_line105to106_200.groupid 'island_11'; +modify pole_load_106.groupid 'island_11'; +modify mount_line105to106_load_106.groupid 'island_11'; +modify mount_line106to107_load_106.groupid 'island_11'; +modify pole_line105to108_100.groupid 'island_11'; +modify mount_line105to108_100.groupid 'island_11'; +modify pole_line105to108_200.groupid 'island_11'; +modify mount_line105to108_200.groupid 'island_11'; +modify pole_line105to108_300.groupid 'island_11'; +modify mount_line105to108_300.groupid 'island_11'; +modify pole_node_108.groupid 'island_11'; +modify mount_line105to108_node_108.groupid 'island_11'; +modify mount_line108to109_node_108.groupid 'island_11'; +modify mount_line108to300_node_108.groupid 'island_11'; +modify pole_line106to107_100.groupid 'island_11'; +modify mount_line106to107_100.groupid 'island_11'; +modify pole_line106to107_200.groupid 'island_11'; +modify mount_line106to107_200.groupid 'island_11'; +modify pole_line106to107_300.groupid 'island_11'; +modify mount_line106to107_300.groupid 'island_11'; +modify pole_line106to107_400.groupid 'island_11'; +modify mount_line106to107_400.groupid 'island_11'; +modify pole_line106to107_500.groupid 'island_11'; +modify mount_line106to107_500.groupid 'island_11'; +modify pole_load_107.groupid 'island_11'; +modify mount_line106to107_load_107.groupid 'island_11'; +modify pole_line108to109_100.groupid 'island_11'; +modify mount_line108to109_100.groupid 'island_11'; +modify pole_line108to109_200.groupid 'island_11'; +modify mount_line108to109_200.groupid 'island_11'; +modify pole_line108to109_300.groupid 'island_11'; +modify mount_line108to109_300.groupid 'island_11'; +modify pole_line108to109_400.groupid 'island_11'; +modify mount_line108to109_400.groupid 'island_11'; +modify pole_load_109.groupid 'island_11'; +modify mount_line108to109_load_109.groupid 'island_11'; +modify mount_line109to110_load_109.groupid 'island_11'; +modify pole_line108to300_100.groupid 'island_11'; +modify mount_line108to300_100.groupid 'island_11'; +modify pole_line108to300_200.groupid 'island_11'; +modify mount_line108to300_200.groupid 'island_11'; +modify pole_line108to300_300.groupid 'island_11'; +modify mount_line108to300_300.groupid 'island_11'; +modify pole_line108to300_400.groupid 'island_11'; +modify mount_line108to300_400.groupid 'island_11'; +modify pole_line108to300_500.groupid 'island_11'; +modify mount_line108to300_500.groupid 'island_11'; +modify pole_line108to300_600.groupid 'island_11'; +modify mount_line108to300_600.groupid 'island_11'; +modify pole_line108to300_700.groupid 'island_11'; +modify mount_line108to300_700.groupid 'island_11'; +modify pole_line108to300_800.groupid 'island_11'; +modify mount_line108to300_800.groupid 'island_11'; +modify pole_line108to300_900.groupid 'island_11'; +modify mount_line108to300_900.groupid 'island_11'; +modify pole_line109to110_100.groupid 'island_11'; +modify mount_line109to110_100.groupid 'island_11'; +modify pole_line109to110_200.groupid 'island_11'; +modify mount_line109to110_200.groupid 'island_11'; +modify pole_node_110.groupid 'island_11'; +modify mount_line109to110_node_110.groupid 'island_11'; +modify mount_line110to111_node_110.groupid 'island_11'; +modify mount_line110to112_node_110.groupid 'island_11'; +modify pole_line110to111_100.groupid 'island_11'; +modify mount_line110to111_100.groupid 'island_11'; +modify pole_line110to111_200.groupid 'island_11'; +modify mount_line110to111_200.groupid 'island_11'; +modify pole_line110to111_300.groupid 'island_11'; +modify mount_line110to111_300.groupid 'island_11'; +modify pole_line110to111_400.groupid 'island_11'; +modify mount_line110to111_400.groupid 'island_11'; +modify pole_line110to111_500.groupid 'island_11'; +modify mount_line110to111_500.groupid 'island_11'; +modify pole_load_111.groupid 'island_11'; +modify mount_line110to111_load_111.groupid 'island_11'; +modify pole_line110to112_100.groupid 'island_11'; +modify mount_line110to112_100.groupid 'island_11'; +modify pole_load_112.groupid 'island_11'; +modify mount_line110to112_load_112.groupid 'island_11'; +modify mount_line112to113_load_112.groupid 'island_11'; +modify pole_line112to113_100.groupid 'island_11'; +modify mount_line112to113_100.groupid 'island_11'; +modify pole_line112to113_200.groupid 'island_11'; +modify mount_line112to113_200.groupid 'island_11'; +modify pole_line112to113_300.groupid 'island_11'; +modify mount_line112to113_300.groupid 'island_11'; +modify pole_line112to113_400.groupid 'island_11'; +modify mount_line112to113_400.groupid 'island_11'; +modify pole_line112to113_500.groupid 'island_11'; +modify mount_line112to113_500.groupid 'island_11'; +modify pole_load_113.groupid 'island_11'; +modify mount_line112to113_load_113.groupid 'island_11'; +modify mount_line113to114_load_113.groupid 'island_11'; +modify pole_line113to114_100.groupid 'island_11'; +modify mount_line113to114_100.groupid 'island_11'; +modify pole_line113to114_200.groupid 'island_11'; +modify mount_line113to114_200.groupid 'island_11'; +modify pole_line113to114_300.groupid 'island_11'; +modify mount_line113to114_300.groupid 'island_11'; +modify pole_load_114.groupid 'island_11'; +modify mount_line113to114_load_114.groupid 'island_11'; +modify pole_node_135.groupid 'island_8'; +modify mount_line135to35_node_135.groupid 'island_8'; +modify pole_line135to35_100.groupid 'island_8'; +modify mount_line135to35_100.groupid 'island_8'; +modify pole_line135to35_200.groupid 'island_8'; +modify mount_line135to35_200.groupid 'island_8'; +modify pole_line135to35_300.groupid 'island_8'; +modify mount_line135to35_300.groupid 'island_8'; +modify pole_node_149.groupid 'island_1'; +modify mount_line149to1_node_149.groupid 'island_1'; +modify pole_line149to1_100.groupid 'island_1'; +modify mount_line149to1_100.groupid 'island_1'; +modify pole_line149to1_200.groupid 'island_1'; +modify mount_line149to1_200.groupid 'island_1'; +modify pole_line149to1_300.groupid 'island_1'; +modify mount_line149to1_300.groupid 'island_1'; +modify pole_node_152.groupid 'island_9'; +modify mount_line152to52_node_152.groupid 'island_9'; +modify pole_line152to52_100.groupid 'island_9'; +modify mount_line152to52_100.groupid 'island_9'; +modify pole_line152to52_200.groupid 'island_9'; +modify mount_line152to52_200.groupid 'island_9'; +modify pole_line152to52_300.groupid 'island_9'; +modify mount_line152to52_300.groupid 'island_9'; +modify pole_node_16001.groupid 'island_10'; +modify mount_line16001to67_node_16001.groupid 'island_10'; +modify pole_line16001to67_100.groupid 'island_10'; +modify mount_line16001to67_100.groupid 'island_10'; +modify pole_line16001to67_200.groupid 'island_10'; +modify mount_line16001to67_200.groupid 'island_10'; +modify pole_line16001to67_300.groupid 'island_10'; +modify mount_line16001to67_300.groupid 'island_10'; +modify pole_node_197.groupid 'island_11'; +modify mount_line197to101_node_197.groupid 'island_11'; +modify pole_line197to101_100.groupid 'island_11'; +modify mount_line197to101_100.groupid 'island_11'; +modify pole_line197to101_200.groupid 'island_11'; +modify mount_line197to101_200.groupid 'island_11'; diff --git a/tools/autotest/test_group_network_opt.glm b/tools/autotest/test_group_network_opt.glm new file mode 100644 index 000000000..f36a5ab3b --- /dev/null +++ b/tools/autotest/test_group_network_opt.glm @@ -0,0 +1,3087 @@ +// IEEE 123 model + +#set strictnames=FALSE + +module powerflow +{ + solver_method NR; + line_limits FALSE; + default_maximum_voltage_error 1e-4; +} + +// Nodes + +object node +{ + name node_3; + groupid nodevolts; + phases CN; + latitude 35N23.076; + longitude 119W0.132; + nominal_voltage 2401.7771; +} + +object node +{ + name node_8; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; + latitude 35N23.117; + longitude 119W0.031; +} + +object node +{ + name node_13; + groupid nodevolts; + nominal_voltage 2401.7771; + phases ABCN; + latitude 35N23.117; + longitude 118W59.971; +} + +object substation +{ + name node_14; + bustype SWING; + groupid nodevolts; + phases AN; + nominal_voltage 2401.7771; + latitude 35N23.224; + longitude 119W0.031; +} +object meter +{ + name substation_meter; + parent node_14; + groupid nodevolts; + phases AN; + latitude 35N23.224; + longitude 119W0.031; + nominal_voltage 2401.7771; +} + +object node +{ + name node_15; + phases CN; + latitude 35N23.076; + longitude 118W59.971; + groupid nodevolts; + nominal_voltage 2401.7771; +} + +object node +{ + name node_18; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_21; + groupid nodevolts; + phases ABCN; + latitude 35N23.302; + longitude 118W59.971; + nominal_voltage 2401.7771; +} + +object node +{ + name node_23; + groupid nodevolts; + phases ABCN; + latitude 35N23.343; + longitude 118W59.971; + nominal_voltage 2401.7771; +} + +object node +{ + name node_25; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_26; + groupid nodevolts; + phases ACN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_27; + groupid nodevolts; + phases ACN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_36; + groupid nodevolts; + phases ABN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_40; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_44; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_54; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_57; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_61; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_67; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_72; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_78; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_81; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_89; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_91; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_93; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_97; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_101; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_105; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_108; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_110; + groupid nodevolts; + phases AN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_135; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_149; + groupid nodevolts; + phases ABCN; + latitude 35N23.409; + longitude 118W59.643; + nominal_voltage 2401.7771; +} + +object node +{ + name node_150; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; + bustype SWING; + voltage_A 2401.777120+0.000000j; + voltage_B -1200.888560-2080.000000j; + voltage_C -1200.888560+2080.000000j; +} + +object node +{ + name node_151; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_152; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_160; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_197; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_250; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_300; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_450; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_610; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_901; + groupid nodevolts; + phases AN; + latitude 35N23.388; + longitude 118W59.971; + nominal_voltage 2401.7771; +} + +object node +{ + name node_2501; + groupid nodevolts; + phases ACN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_6101; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +object node +{ + name node_15001; + groupid nodevolts; + phases ABCN; + latitude 35N23.141; + longitude 118W59.679; + nominal_voltage 2401.7771; +} + +object node +{ + name node_16001; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; +} + +//Pure spot loads + +object load +{ + name load_1; + groupid nodevolts; + phases ABCN; + constant_power_A 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_2; + groupid nodevolts; + phases BN; + constant_power_B 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_4; + groupid nodevolts; + phases CN; + constant_power_C 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_5; + groupid nodevolts; + phases CN; + constant_current_C -0.557814+9.293330j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_6; + groupid nodevolts; + phases CN; + constant_impedance_C 115.370667+57.685333j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_7; + groupid nodevolts; + phases ABCN; + constant_power_A 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_9; + groupid nodevolts; + phases AN; + constant_power_A 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_10; + groupid nodevolts; + phases AN; + constant_current_A 8.327167-4.163584j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_11; + groupid nodevolts; + phases AN; + constant_impedance_A 115.370667+57.685333j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_12; + groupid nodevolts; + phases BN; + constant_power_B 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_16; + groupid nodevolts; + phases CN; + constant_power_C 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_17; + groupid nodevolts; + phases CN; + constant_power_C 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_19; + groupid nodevolts; + phases AN; + constant_power_A 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_20; + groupid nodevolts; + phases AN; + constant_current_A 16.654335-8.327167j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_22; + groupid nodevolts; + phases BN; + constant_impedance_B 115.370667+57.685333j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_24; + groupid nodevolts; + phases CN; + constant_power_C 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_28; + groupid nodevolts; + phases ABCN; + constant_current_A 16.654335-8.327167j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_29; + groupid nodevolts; + phases ABCN; + constant_impedance_A 115.370667+57.685333j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_30; + groupid nodevolts; + phases ABCN; + constant_power_C 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_31; + groupid nodevolts; + phases CN; + constant_power_C 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_32; + groupid nodevolts; + phases CN; + constant_power_C 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_33; + groupid nodevolts; + phases AN; + constant_current_A 16.654335-8.327167j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_34; + groupid nodevolts; + phases CN; + constant_impedance_C 115.370667+57.685333j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_35; + groupid nodevolts; + phases ABCD; + constant_power_A 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_37; + groupid nodevolts; + phases AN; + constant_impedance_A 115.370667+57.685333j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_38; + groupid nodevolts; + phases BN; + constant_current_B -7.769353-5.129747j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_39; + groupid nodevolts; + phases BN; + constant_power_B 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_41; + groupid nodevolts; + phases CN; + constant_power_C 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_42; + groupid nodevolts; + phases ABCN; + constant_power_A 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_43; + groupid nodevolts; + phases BN; + constant_impedance_B 115.370667+57.685333j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_45; + groupid nodevolts; + phases AN; + constant_current_A 8.327167-4.163584j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_46; + groupid nodevolts; + phases AN; + constant_power_A 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_47; + groupid nodevolts; + phases ABCN; + constant_current_A 14.572543-10.408959j; + constant_current_B -16.300695-7.415713j; + constant_current_C 1.728152+17.824672j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_48; + groupid nodevolts; + phases ABCN; + constant_impedance_A 54.567207+38.976577j; + constant_impedance_B 54.567207+38.976577j; + constant_impedance_C 54.567207+38.976577j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_49; + groupid nodevolts; + phases ABCN; + constant_power_A 35000.000000+25000.000000j; + constant_power_B 70000.000000+50000.000000j; + constant_power_C 35000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_50; + groupid nodevolts; + phases ABCN; + constant_power_C 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_51; + groupid nodevolts; + phases ABCN; + constant_power_A 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_52; + groupid nodevolts; + phases ABCN; + constant_power_A 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_53; + groupid nodevolts; + phases ABCN; + constant_power_A 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_55; + groupid nodevolts; + phases ABCN; + constant_impedance_A 230.741333+115.370667j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_56; + groupid nodevolts; + phases ABCN; + constant_power_B 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_58; + groupid nodevolts; + phases BN; + constant_current_B -7.769353-5.129747j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_59; + groupid nodevolts; + phases BN; + constant_power_B 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_60; + groupid nodevolts; + phases ABCN; + constant_power_A 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_62; + groupid nodevolts; + phases ABCN; + constant_impedance_C 115.370667+57.685333j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_63; + groupid nodevolts; + phases ABCN; + constant_power_A 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_64; + groupid nodevolts; + phases ABCN; + constant_current_B -28.233631-19.756998j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_65; + groupid nodevolts; + phases ABCD; + constant_impedance_A 327.403243+233.859459j; + constant_impedance_B 327.403243+233.859459j; + constant_impedance_C 163.701622+116.929730j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_66; + groupid nodevolts; + phases ABCN; + constant_power_C 75000.000000+35000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_68; + groupid nodevolts; + phases AN; + constant_power_A 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_69; + groupid nodevolts; + phases AN; + constant_power_A 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_70; + groupid nodevolts; + phases AN; + constant_power_A 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_71; + groupid nodevolts; + phases AN; + constant_power_A 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_73; + groupid nodevolts; + phases CN; + constant_power_C 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_74; + groupid nodevolts; + phases CN; + constant_impedance_C 115.370667+57.685333j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_75; + groupid nodevolts; + phases CN; + constant_power_C 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_76; + groupid nodevolts; + phases ABCD; + constant_current_A 31.474199-4.034142j; + constant_current_B -12.019231-16.826923j; + constant_current_C -8.562927+18.822421j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_77; + groupid nodevolts; + phases ABCN; + constant_power_B 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_79; + groupid nodevolts; + phases ABCN; + constant_impedance_A 115.370667+57.685333j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_80; + groupid nodevolts; + phases ABCN; + constant_power_B 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_82; + groupid nodevolts; + phases ABCN; + constant_power_A 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_83; + groupid nodevolts; + phases ABCN; + constant_power_C 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_84; + groupid nodevolts; + phases CN; + constant_power_C 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_85; + groupid nodevolts; + phases CN; + constant_power_C 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_86; + groupid nodevolts; + phases ABCN; + constant_power_B 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_87; + groupid nodevolts; + phases ABCN; + constant_power_B 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_88; + groupid nodevolts; + phases AN; + constant_power_A 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_90; + groupid nodevolts; + phases BN; + constant_current_B -15.538706-10.259493j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_92; + groupid nodevolts; + phases CN; + constant_power_C 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_94; + groupid nodevolts; + phases ABCN; + constant_power_A 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_95; + groupid nodevolts; + phases ABCN; + constant_power_B 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_96; + groupid nodevolts; + phases BN; + constant_power_B 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_98; + groupid nodevolts; + phases ABCN; + constant_power_A 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_99; + groupid nodevolts; + phases ABCN; + constant_power_B 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_100; + groupid nodevolts; + phases ABCN; + constant_impedance_C 115.370667+57.685333j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_102; + groupid nodevolts; + phases CN; + constant_power_C 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_103; + groupid nodevolts; + phases CN; + constant_power_C 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_104; + groupid nodevolts; + phases CN; + constant_power_C 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_106; + groupid nodevolts; + phases BN; + constant_power_B 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_107; + groupid nodevolts; + phases BN; + constant_power_B 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_109; + groupid nodevolts; + phases AN; + constant_power_A 40000.000000+20000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_111; + groupid nodevolts; + phases AN; + constant_power_A 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_112; + groupid nodevolts; + phases AN; + constant_current_A 8.327167-4.163584j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_113; + groupid nodevolts; + phases AN; + constant_impedance_A 115.370667+57.685333j; + nominal_voltage 2401.7771; +} + +object load +{ + name load_114; + groupid nodevolts; + phases AN; + constant_power_A 20000.000000+10000.000000j; + nominal_voltage 2401.7771; +} + +//distributed loads intermediates (2/3 load at 1/4 line) + +//pure distributed loads (1/3 load at end of line) + +//combination loads (1/3 dist load and spot load) + +//Pure lines (no distributed loads) + +object overhead_line +{ + name line1to2; + phases BN; + from load_1; + to load_2; + length 175.00; + configuration lc310; +} + + +object overhead_line +{ + name line1to3; + phases CN; + from load_1; + to node_3; + length 250.00; + configuration lc311; +} + +object overhead_line +{ + name line1to7; + phases ABCN; + from load_1; + to load_7; + length 300.00; + configuration lc301; +} + +object overhead_line +{ + name line3to4; + phases CN; + from node_3; + to load_4; + length 200.00; + configuration lc311; +} + +object overhead_line +{ + name line3to5; + phases CN; + from node_3; + to load_5; + length 325.00; + configuration lc311; +} + +object overhead_line +{ + name line5to6; + phases CN; + from load_5; + to load_6; + length 250.00; + configuration lc311; +} + +object overhead_line +{ + name line7to8; + phases ABCN; + from load_7; + to node_8; + length 200.00; + configuration lc301; +} + +object overhead_line +{ + name line8to12; + phases BN; + from node_8; + to load_12; + length 225.00; + configuration lc310; +} + +object overhead_line +{ + name line8to9; + phases AN; + from node_8; + to load_9; + length 225.00; + configuration lc309; +} + +object overhead_line +{ + name line8to13; + phases ABCN; + from node_8; + to node_13; + length 300.00; + configuration lc301; +} + +object overhead_line +{ + name line901to14; + phases AN; + from node_901; + to node_14; + length 425.00; + configuration lc309; +} + +object overhead_line +{ + name line13to34; + phases CN; + from node_13; + to load_34; + length 150.00; + configuration lc311; +} + +object overhead_line +{ + name line13to18; + phases ABCN; + from node_13; + to node_18; + length 825.00; + configuration lc302; +} + +object overhead_line +{ + name line14to11; + phases AN; + from node_14; + to load_11; + length 250.00; + configuration lc309; +} + +object overhead_line +{ + name line14to10; + phases AN; + from node_14; + to load_10; + length 250.00; + configuration lc309; +} + +object overhead_line +{ + name line15to16; + phases CN; + from node_15; + to load_16; + length 375.00; + configuration lc311; +} + +object overhead_line +{ + name line15to17; + phases CN; + from node_15; + to load_17; + length 350.00; + configuration lc311; +} + +object overhead_line +{ + name line18to19; + phases AN; + from node_18; + to load_19; + length 250.00; + configuration lc309; +} + +object overhead_line +{ + name line18to21; + phases ABCN; + from node_18; + to node_21; + length 300.00; + configuration lc302; +} + +object overhead_line +{ + name line19to20; + phases AN; + from load_19; + to load_20; + length 325.00; + configuration lc309; +} + +object overhead_line +{ + name line21to22; + phases BN; + from node_21; + to load_22; + length 525.00; + configuration lc310; +} + +object overhead_line +{ + name line21to23; + phases ABCN; + from node_21; + to node_23; + length 250.00; + configuration lc302; +} + +object overhead_line +{ + name line23to24; + phases CN; + from node_23; + to load_24; + length 550.00; + configuration lc311; +} + +object overhead_line +{ + name line23to25; + phases ABCN; + from node_23; + to node_25; + length 275.00; + configuration lc302; +} + +object overhead_line +{ + name line2501to26; + phases ACN; + from node_2501; + to node_26; + length 350.00; + configuration lc307; +} + +object overhead_line +{ + name line25to28; + phases ABCN; + from node_25; + to load_28; + length 200.00; + configuration lc302; +} + +object overhead_line +{ + name line26to27; + phases ACN; + from node_26; + to node_27; + length 275.00; + configuration lc307; +} + +object overhead_line +{ + name line26to31; + phases CN; + from node_26; + to load_31; + length 225.00; + configuration lc311; +} + +object overhead_line +{ + name line27to33; + phases AN; + from node_27; + to load_33; + length 500.00; + configuration lc309; +} + +object overhead_line +{ + name line28to29; + phases ABCN; + from load_28; + to load_29; + length 300.00; + configuration lc302; +} + +object overhead_line +{ + name line29to30; + phases ABCN; + from load_29; + to load_30; + length 350.00; + configuration lc302; +} + +object overhead_line +{ + name line30to250; + phases ABCN; + from load_30; + to node_250; + length 200.00; + configuration lc302; +} + +object overhead_line +{ + name line31to32; + phases CN; + from load_31; + to load_32; + length 300.00; + configuration lc311; +} + +object overhead_line +{ + name line34to15; + phases CN; + from load_34; + to node_15; + length 100.00; + configuration lc311; +} + +object overhead_line +{ + name line35to36; + phases ABN; + from load_35; + to node_36; + length 650.00; + configuration lc308; +} + +object overhead_line +{ + name line35to40; + phases ABCN; + from load_35; + to node_40; + length 250.00; + configuration lc301; +} + +object overhead_line +{ + name line36to37; + phases AN; + from node_36; + to load_37; + length 300.00; + configuration lc309; +} + +object overhead_line +{ + name line36to38; + phases BN; + from node_36; + to load_38; + length 250.00; + configuration lc310; +} + +object overhead_line +{ + name line38to39; + phases BN; + from load_38; + to load_39; + length 325.00; + configuration lc310; +} + +object overhead_line +{ + name line40to41; + phases CN; + from node_40; + to load_41; + length 325.00; + configuration lc311; +} + +object overhead_line +{ + name line40to42; + phases ABCN; + from node_40; + to load_42; + length 250.00; + configuration lc301; +} + +object overhead_line +{ + name line42to43; + phases BN; + from load_42; + to load_43; + length 500.00; + configuration lc310; +} + +object overhead_line +{ + name line42to44; + phases ABCN; + from load_42; + to node_44; + length 200.00; + configuration lc301; +} + +object overhead_line +{ + name line44to45; + phases AN; + from node_44; + to load_45; + length 200.00; + configuration lc309; +} + +object overhead_line +{ + name line44to47; + phases ABCN; + from node_44; + to load_47; + length 250.00; + configuration lc301; +} + +object overhead_line +{ + name line45to46; + phases AN; + from load_45; + to load_46; + length 300.00; + configuration lc309; +} + +object overhead_line +{ + name line47to48; + phases ABCN; + from load_47; + to load_48; + length 150.00; + configuration lc304; +} + +object overhead_line +{ + name line47to49; + phases ABCN; + from load_47; + to load_49; + length 250.00; + configuration lc304; +} + +object overhead_line +{ + name line49to50; + phases ABCN; + from load_49; + to load_50; + length 250.00; + configuration lc304; +} + +object overhead_line +{ + name line50to51; + phases ABCN; + from load_50; + to load_51; + length 250.00; + configuration lc304; +} + +object overhead_line +{ + name line51to151; + phases ABCN; + from load_51; + to node_151; + length 500.00; + configuration lc304; +} + +object overhead_line +{ + name line52to53; + phases ABCN; + from load_52; + to load_53; + length 200.00; + configuration lc301; +} + +object overhead_line +{ + name line53to54; + phases ABCN; + from load_53; + to node_54; + length 125.00; + configuration lc301; +} + +object overhead_line +{ + name line54to55; + phases ABCN; + from node_54; + to load_55; + length 275.00; + configuration lc301; +} + +object overhead_line +{ + name line54to57; + phases ABCN; + from node_54; + to node_57; + length 350.00; + configuration lc303; +} + +object overhead_line +{ + name line55to56; + phases ABCN; + from load_55; + to load_56; + length 275.00; + configuration lc301; +} + +object overhead_line +{ + name line57to58; + phases BN; + from node_57; + to load_58; + length 250.00; + configuration lc310; +} + +object overhead_line +{ + name line57to60; + phases ABCN; + from node_57; + to load_60; + length 750.00; + configuration lc303; +} + +object overhead_line +{ + name line58to59; + phases BN; + from load_58; + to load_59; + length 250.00; + configuration lc310; +} + +object overhead_line +{ + name line60to61; + phases ABCN; + from load_60; + to node_61; + length 550.00; + configuration lc305; +} + +object underground_line +{ + name line60to62; + phases ABC; + from load_60; + to load_62; + length 250.00; + configuration lc312; +} + +object underground_line +{ + name line62to63; + phases ABC; + from load_62; + to load_63; + length 175.00; + configuration lc312; +} + +object underground_line +{ + name line63to64; + phases ABC; + from load_63; + to load_64; + length 350.00; + configuration lc312; +} + +object underground_line +{ + name line64to65; + phases ABC; + from load_64; + to load_65; + length 425.00; + configuration lc312; +} + +object underground_line +{ + name line65to66; + phases ABC; + from load_65; + to load_66; + length 325.00; + configuration lc312; +} + +object overhead_line +{ + name line67to68; + phases AN; + from node_67; + to load_68; + length 200.00; + configuration lc309; +} + +object overhead_line +{ + name line67to72; + phases ABCN; + from node_67; + to node_72; + length 275.00; + configuration lc303; +} + +object overhead_line +{ + name line67to97; + phases ABCN; + from node_67; + to node_97; + length 250.00; + configuration lc303; +} + +object overhead_line +{ + name line68to69; + phases AN; + from load_68; + to load_69; + length 275.00; + configuration lc309; +} + +object overhead_line +{ + name line69to70; + phases AN; + from load_69; + to load_70; + length 325.00; + configuration lc309; +} + +object overhead_line +{ + name line70to71; + phases AN; + from load_70; + to load_71; + length 275.00; + configuration lc309; +} + +object overhead_line +{ + name line72to73; + phases CN; + from node_72; + to load_73; + length 275.00; + configuration lc311; +} + +object overhead_line +{ + name line72to76; + phases ABCN; + from node_72; + to load_76; + length 200.00; + configuration lc303; +} + +object overhead_line +{ + name line73to74; + phases CN; + from load_73; + to load_74; + length 350.00; + configuration lc311; +} + +object overhead_line +{ + name line74to75; + phases CN; + from load_74; + to load_75; + length 400.00; + configuration lc311; +} + +object overhead_line +{ + name line76to77; + phases ABCN; + from load_76; + to load_77; + length 400.00; + configuration lc306; +} + +object overhead_line +{ + name line76to86; + phases ABCN; + from load_76; + to load_86; + length 700.00; + configuration lc303; +} + +object overhead_line +{ + name line77to78; + phases ABCN; + from load_77; + to node_78; + length 100.00; + configuration lc306; +} + +object overhead_line +{ + name line78to79; + phases ABCN; + from node_78; + to load_79; + length 225.00; + configuration lc306; +} + +object overhead_line +{ + name line78to80; + phases ABCN; + from node_78; + to load_80; + length 475.00; + configuration lc306; +} + +object overhead_line +{ + name line80to81; + phases ABCN; + from load_80; + to node_81; + length 475.00; + configuration lc306; +} + +object overhead_line +{ + name line81to82; + phases ABCN; + from node_81; + to load_82; + length 250.00; + configuration lc306; +} + +object overhead_line +{ + name line81to84; + phases CN; + from node_81; + to load_84; + length 675.00; + configuration lc311; +} + +object overhead_line +{ + name line82to83; + phases ABCN; + from load_82; + to load_83; + length 250.00; + configuration lc306; +} + +object overhead_line +{ + name line84to85; + phases CN; + from load_84; + to load_85; + length 475.00; + configuration lc311; +} + +object overhead_line +{ + name line86to87; + phases ABCN; + from load_86; + to load_87; + length 450.00; + configuration lc306; +} + +object overhead_line +{ + name line87to88; + phases AN; + from load_87; + to load_88; + length 175.00; + configuration lc309; +} + +object overhead_line +{ + name line87to89; + phases ABCN; + from load_87; + to node_89; + length 275.00; + configuration lc306; +} + +object overhead_line +{ + name line89to90; + phases BN; + from node_89; + to load_90; + length 225.00; + configuration lc310; +} + +object overhead_line +{ + name line89to91; + phases ABCN; + from node_89; + to node_91; + length 225.00; + configuration lc306; +} + +object overhead_line +{ + name line91to92; + phases CN; + from node_91; + to load_92; + length 300.00; + configuration lc311; +} + +object overhead_line +{ + name line91to93; + phases ABCN; + from node_91; + to node_93; + length 225.00; + configuration lc306; +} + +object overhead_line +{ + name line93to94; + phases ABCN; + from node_93; + to load_94; + length 275.00; + configuration lc306; +} + +object overhead_line +{ + name line93to95; + phases ABCN; + from node_93; + to load_95; + length 300.00; + configuration lc306; +} + +object overhead_line +{ + name line95to96; + phases BN; + from load_95; + to load_96; + length 200.00; + configuration lc310; +} + +object overhead_line +{ + name line97to98; + phases ABCN; + from node_97; + to load_98; + length 275.00; + configuration lc303; +} + +object overhead_line +{ + name line98to99; + phases ABCN; + from load_98; + to load_99; + length 550.00; + configuration lc303; +} + +object overhead_line +{ + name line99to100; + phases ABCN; + from load_99; + to load_100; + length 300.00; + configuration lc303; +} + +object overhead_line +{ + name line100to450; + phases ABCN; + from load_100; + to node_450; + length 800.00; + configuration lc303; +} + +object overhead_line +{ + name line101to102; + phases CN; + from node_101; + to load_102; + length 225.00; + configuration lc311; +} + +object overhead_line +{ + name line101to105; + phases ABCN; + from node_101; + to node_105; + length 275.00; + configuration lc303; +} + +object overhead_line +{ + name line102to103; + phases CN; + from load_102; + to load_103; + length 325.00; + configuration lc311; +} + +object overhead_line +{ + name line103to104; + phases CN; + from load_103; + to load_104; + length 700.00; + configuration lc311; +} + +object overhead_line +{ + name line105to106; + phases BN; + from node_105; + to load_106; + length 225.00; + configuration lc310; +} + +object overhead_line +{ + name line105to108; + phases ABCN; + from node_105; + to node_108; + length 325.00; + configuration lc303; +} + +object overhead_line +{ + name line106to107; + phases BN; + from load_106; + to load_107; + length 575.00; + configuration lc310; +} + +object overhead_line +{ + name line108to109; + phases AN; + from node_108; + to load_109; + length 450.00; + configuration lc309; +} + +object overhead_line +{ + name line108to300; + phases ABCN; + from node_108; + to node_300; + length 1000.00; + configuration lc303; +} + +object overhead_line +{ + name line109to110; + phases AN; + from load_109; + to node_110; + length 300.00; + configuration lc309; +} + +object overhead_line +{ + name line110to111; + phases AN; + from node_110; + to load_111; + length 575.00; + configuration lc309; +} + +object overhead_line +{ + name line110to112; + phases AN; + from node_110; + to load_112; + length 125.00; + configuration lc309; +} + +object overhead_line +{ + name line112to113; + phases AN; + from load_112; + to load_113; + length 525.00; + configuration lc309; +} + +object overhead_line +{ + name line113to114; + phases AN; + from load_113; + to load_114; + length 325.00; + configuration lc309; +} + +object overhead_line +{ + name line135to35; + phases ABCN; + from node_135; + to load_35; + length 375.00; + configuration lc304; +} + +object overhead_line +{ + name line149to1; + phases ABCN; + from node_149; + to load_1; + length 400.00; + configuration lc301; +} + +object overhead_line +{ + name line152to52; + phases ABCN; + from node_152; + to load_52; + length 400.00; + configuration lc301; +} + +object overhead_line +{ + name line16001to67; + phases ABCN; + from node_16001; + to node_67; + length 350.00; + configuration lc306; +} + +object overhead_line +{ + name line197to101; + phases ABCN; + from node_197; + to node_101; + length 250.00; + configuration lc303; +} + +//Lines with distributed loads + +//Transformers + +object transformer +{ + name trans6101to610; + phases ABCN; + from node_6101; + to node_610; + configuration tc500; +} + +//Regulators + +object regulator +{ + name reg150to15001; + phases ABCN; + from node_150; + to node_15001; + configuration rc501; +} + +object regulator +{ + name reg9to901; + phases AN; + from load_9; + to node_901; + configuration rc502; +} + +object regulator +{ + name reg25to2501; + phases ACN; + from node_25; + to node_2501; + configuration rc503; +} + +object regulator +{ + name reg160to16001; + phases ABCN; + from node_160; + to node_16001; + configuration rc504; +} + +//Switches + +object switch +{ + name sw13to152; + phases ABCN; + from node_13; + to node_152; + status CLOSED; +} + +object switch +{ + name sw18to135; + phases ABCN; + from node_18; + to node_135; + status CLOSED; +} + +object switch +{ + name sw54to94; + phases ABCN; + from node_54; + to load_94; + status OPEN; +} + +object switch +{ + name sw60to160; + phases ABCN; + from load_60; + to node_160; + status CLOSED; +} + +object switch +{ + name sw61to6101; + phases ABCN; + from node_61; + to node_6101; + status CLOSED; +} + +object switch +{ + name sw97to197; + phases ABCN; + from node_97; + to node_197; + status CLOSED; +} + +object switch +{ + name sw151to300; + phases ABCN; + from node_151; + to node_300; + status OPEN; +} +object switch +{ + name sw15001to149; + phases ABCN; + from node_15001; + to node_149; + status CLOSED; +} + +//Capacitors + +object capacitor +{ + name cap_83; + parent load_83; + phases ABC; + phases_connected ABC; + nominal_voltage 2401.7771; + control MANUAL; + capacitor_A 200000.0000; + capacitor_B 200000.0000; + capacitor_C 200000.0000; + switchA OPEN; + switchB OPEN; + switchC OPEN; +}; + +object capacitor +{ + name cap_88; + parent load_88; + phases A; + phases_connected A; + nominal_voltage 2401.7771; + control MANUAL; + capacitor_A 50000.0000; + switchA OPEN; +}; + +object capacitor +{ + name cap_90; + parent load_90; + phases B; + phases_connected B; + nominal_voltage 2401.7771; + control MANUAL; + capacitor_B 50000.0000; + switchB OPEN; +}; + +object capacitor +{ + name cap_92; + parent load_92; + phases C; + phases_connected C; + nominal_voltage 2401.7771; + control MANUAL; + capacitor_C 50000.0000; + switchC OPEN; +}; + +// IEEE 123 realtime demo feeder topology +// Copyright (C) 2016, Stanford University +// by dchassin@slac.stanford.edu +// + +// lateral feeds +object node +{ + name node_251; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; + bustype SWING; + voltage_A 2401.777120+0.000000j; + voltage_B -1200.888560-2080.000000j; + voltage_C -1200.888560+2080.000000j; +} + +object node +{ + name node_350; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; + bustype SWING; + voltage_A 2401.777120+0.000000j; + voltage_B -1200.888560-2080.000000j; + voltage_C -1200.888560+2080.000000j; +} + + +object node +{ + name node_451; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; + bustype SWING; + voltage_A 2401.777120+0.000000j; + voltage_B -1200.888560-2080.000000j; + voltage_C -1200.888560+2080.000000j; +} + +object node +{ + name node_195; + groupid nodevolts; + phases ABCN; + nominal_voltage 2401.7771; + bustype SWING; + voltage_A 2401.777120+0.000000j; + voltage_B -1200.888560-2080.000000j; + voltage_C -1200.888560+2080.000000j; +} + +// switch to laterals +object switch +{ + name sw250to251; + phases ABCN; + from node_250; + to node_251; + status OPEN; +} + +object switch +{ + name sw300to350; + phases ABCN; + from node_300; + to node_350; + status OPEN; +} + +object switch +{ + name sw450to451; + phases ABCN; + from node_450; + to node_451; + status OPEN; +} + +object switch +{ + name sw95to195; + phases ABCN; + from load_95; + to node_195; + status OPEN; +} + +//Conductors + +object overhead_line_conductor +{ + name olc301c; //336,400 26/7 ACSR + geometric_mean_radius 0.0244; + resistance 0.306; + diameter 0.721; +} + +object overhead_line_conductor +{ + name olc301n; //4/0 6/1 ACSR + geometric_mean_radius 0.00814; + resistance 0.592; + diameter 0.563; +} + +object overhead_line_conductor +{ + name olc309; //1/0 ACSR + geometric_mean_radius 0.004460; + resistance 1.120000; + diameter 0.398; +} + +object underground_line_conductor +{ + name ulc312; //1/0 AA, CN + outer_diameter 1.06; + conductor_gmr 0.0111; + conductor_diameter 0.368; + conductor_resistance 0.97; + neutral_gmr 0.00208; + neutral_resistance 14.8722; + neutral_diameter 0.0640837; + neutral_strands 16.0; +} + +//Line spacings +//ABCN +object line_spacing +{ + name ls500301; + distance_AB 2.5; + distance_AC 7.0; + distance_BC 4.5; + distance_CN 5.0; + distance_AN 5.65685424949; + distance_BN 4.27200187266; + distance_AE 28.0; + distance_BE 28.0; + distance_CE 28.0; + distance_NE 24.0; +} + +//CABN +object line_spacing +{ + name ls500302; + distance_AB 4.5; + distance_AC 2.5; + distance_BC 7.0; + distance_AN 4.27200187266; + distance_CN 5.65685424949; + distance_BN 5.0; + distance_AE 28.0; + distance_BE 28.0; + distance_CE 28.0; + distance_NE 24.0; +} + +//BCAN +object line_spacing +{ + name ls500303; + distance_AB 7.0; + distance_AC 4.5; + distance_BC 2.5; + distance_AN 5.0; + distance_BN 5.65685424949; + distance_CN 4.27200187266; + distance_AE 28.0; + distance_BE 28.0; + distance_CE 28.0; + distance_NE 24.0; +} + +//CBAN +object line_spacing +{ + name ls500304; + distance_AB 4.5; + distance_AC 7.0; + distance_BC 2.5; + distance_AN 5.0; + distance_BN 4.27200187266; + distance_CN 5.65685424949; + distance_AE 28.0; + distance_BE 28.0; + distance_CE 28.0; + distance_NE 24.0; +} + +//BACN +object line_spacing +{ + name ls500305; + distance_AB 2.5; + distance_AC 4.5; + distance_BC 7.0; + distance_CN 5.0; + distance_AN 4.27200187266; + distance_BN 5.65685424949; + distance_AE 28.0; + distance_BE 28.0; + distance_CE 28.0; + distance_NE 24.0; +} + +//ACBN +object line_spacing +{ + name ls500306; + distance_AB 2.5; + distance_AC 7.0; + distance_BC 4.5; + distance_CN 5.0; + distance_BN 4.27200187266; + distance_AN 5.65685424949; + distance_AE 28.0; + distance_BE 28.0; + distance_CE 28.0; + distance_NE 24.0; +} + +//ACN +object line_spacing +{ + name ls505307; + distance_AC 7.0; + distance_AN 5.65685424949; + distance_CN 5.0; + distance_AE 28.0; + distance_CE 28.0; + distance_NE 24.0; +} + +//ABN +object line_spacing +{ + name ls505308; + distance_AB 7.0; + distance_AN 5.65685424949; + distance_BN 5.0; + distance_AE 28.0; + distance_BE 28.0; + distance_NE 24.0; +} + +//AN +object line_spacing +{ + name ls510309; + distance_AN 5.024937811; + distance_AE 28.0; + distance_NE 24.0; +} + +//BN +object line_spacing +{ + name ls510310; + distance_BN 5.024937811; + distance_BE 28.0; + distance_NE 24.0; +} + +//CN +object line_spacing +{ + name ls510311; + distance_CN 5.024937811; + distance_CE 28.0; + distance_NE 24.0; +} + +//UGL - ABC +object line_spacing +{ + name ls515312; + distance_AB 0.5; + distance_AC 1.0; + distance_BC 0.5; +} + +//Line configurations +//ABCN +object line_configuration +{ + name lc301; + conductor_A olc301c; + conductor_B olc301c; + conductor_C olc301c; + conductor_N olc301n; + spacing ls500301; +} + +//CABN +object line_configuration +{ + name lc302; + conductor_A olc301c; + conductor_B olc301c; + conductor_C olc301c; + conductor_N olc301n; + spacing ls500302; +} + +//BCAN +object line_configuration +{ + name lc303; + conductor_A olc301c; + conductor_B olc301c; + conductor_C olc301c; + conductor_N olc301n; + spacing ls500303; +} + +//CBAN +object line_configuration +{ + name lc304; + conductor_A olc301c; + conductor_B olc301c; + conductor_C olc301c; + conductor_N olc301n; + spacing ls500304; +} + +//BACN +object line_configuration +{ + name lc305; + conductor_A olc301c; + conductor_B olc301c; + conductor_C olc301c; + conductor_N olc301n; + spacing ls500305; +} + +//ACBN +object line_configuration +{ + name lc306; + conductor_A olc301c; + conductor_B olc301c; + conductor_C olc301c; + conductor_N olc301n; + spacing ls500306; +} + +//ACN +object line_configuration +{ + name lc307; + conductor_A olc301c; + conductor_C olc301c; + conductor_N olc301n; + spacing ls505307; +} + +//ABN +object line_configuration +{ + name lc308; + conductor_A olc301c; + conductor_B olc301c; + conductor_N olc301n; + spacing ls505308; +} + +//AN +object line_configuration +{ + name lc309; + conductor_A olc309; + conductor_N olc309; + spacing ls510309; +} + +//BN +object line_configuration +{ + name lc310; + conductor_B olc309; + conductor_N olc309; + spacing ls510310; +} + +//CN +object line_configuration +{ + name lc311; + conductor_C olc309; + conductor_N olc309; + spacing ls510311; +} + +//ABC +object line_configuration +{ + name lc312; + conductor_A ulc312; + conductor_B ulc312; + conductor_C ulc312; + spacing ls515312; +} + +//Transformer configurations +object transformer_configuration +{ + name tc500; + connect_type DELTA_DELTA; + install_type PADMOUNT; + power_rating 150.0 kVA; + primary_voltage 4160.0; + secondary_voltage 480.0; + resistance 0.0127; + reactance 0.0272; +} + +object transformer_configuration +{ + name tc9999; + connect_type DELTA_GWYE; + install_type PADMOUNT; + power_rating 5.0 MVA; + primary_voltage 115.0; + secondary_voltage 4160.0; + resistance 0.01; + reactance 0.08; +} + +// Regulator configs +object regulator_configuration +{ + name rc501; + connect_type WYE_WYE; + band_center 2400.000; + band_width 40.0; + time_delay 30.0; + raise_taps 16; + lower_taps 16; + current_transducer_ratio 700; + power_transducer_ratio 20; + compensator_r_setting_A 3.0; + compensator_x_setting_A 7.5; + CT_phase "A"; + PT_phase "A"; + regulation 0.10; + Control OUTPUT_VOLTAGE; + Type A; + tap_pos_A 0; + tap_pos_B 0; + tap_pos_C 0; +} + +object regulator_configuration +{ + name rc502; + connect_type WYE_WYE; + band_center 2400.000; + band_width 40.0; + time_delay 30.0; + raise_taps 16; + lower_taps 16; + current_transducer_ratio 50; + power_transducer_ratio 20; + compensator_r_setting_A 0.4; + compensator_x_setting_A 0.4; + CT_phase "A"; + PT_phase "A"; + regulation 0.10; + Control MANUAL; + Type A; + tap_pos_A -1; + tap_pos_B 0; + tap_pos_C 0; +} + +object regulator_configuration +{ + name rc503; + connect_type WYE_WYE; + band_center 2400.000; + band_width 20.0; + time_delay 30.0; + raise_taps 16; + lower_taps 16; + current_transducer_ratio 50; + power_transducer_ratio 20; + compensator_r_setting_A 0.4; + compensator_r_setting_C 0.4; + compensator_x_setting_A 0.4; + compensator_x_setting_C 0.4; + CT_phase "AC"; + PT_phase "AC"; + regulation 0.10; + Control MANUAL; + Type A; + tap_pos_A 0; + tap_pos_B 0; + tap_pos_C -1; +} + +object regulator_configuration +{ + name rc504; + connect_type WYE_WYE; + band_center 2400.000; + band_width 40.0; + time_delay 30.0; + raise_taps 16; + lower_taps 16; + current_transducer_ratio 300; + power_transducer_ratio 20; + compensator_r_setting_A 0.6; + compensator_r_setting_B 1.4; + compensator_r_setting_C 0.2; + compensator_x_setting_A 1.3; + compensator_x_setting_B 2.6; + compensator_x_setting_C 1.4; + CT_phase "ABC"; + PT_phase "ABC"; + regulation 0.10; + Control MANUAL; + Type A; + tap_pos_A 8; + tap_pos_B 1; + tap_pos_C 5; +} diff --git a/tools/group.py b/tools/group.py new file mode 100644 index 000000000..758c7cd11 --- /dev/null +++ b/tools/group.py @@ -0,0 +1,453 @@ +# Syntax: group -i=INPUT [-o=OUTPUT] [OPTIONS ...] +"""Set group according to powerflow islanding + +Syntax: group [-i=INPUT] [-o=OUTPUT] [OPTIONS ...] + +Options +------- + + -b|--by=GROUPER specify grouping (default is 'island') + + -c|--cut=CLASSES command-separated list classes of cut objects + (default is 'switch') + + --control=NAME set control groupid (default "control_") + + --copy_from=CLASS.PROPERTY,... specify CLASS.PROPERTY from which groupid + is copied (default is `pole_mount.equipment`) + + --copy_to=CLASS.PROPERTY,... specify CLASS.PROPERTY to which groupid is + copied (default is `pole_mount.parent`) + + -d|--debug enable debugging output and exception handling + + -f|--force force overwrite of existing groupid data + + -i|--input=INPUT input JSON file name (default is stdin) + + -m|--modify output GLM modify statements instead of full modify + + -o|--output=OUTPUT output file name (JSON or GLM, default is stdout) + + -p|--prefix=PREFIX set the groupid prefix (default "island_") + + -q|--quiet disable error output + + -w|--warning disable warning output + +The `group` tools identify groups of object based on a grouper method and a +cut criteria. The only grouper currently supported is the `island` grouper +with `switch` cut object criteria. Additional cut classes can be specified +using a comma-separated list of class names, e.g., +`--cut=switch,relay,breaker`. + +The input file must a GridLAB-D JSON file. You can use the +`gridlabd -o|--output FILENAME.json` option to generate a JSON file from a +GLM model. The output file may be a JSON or GLM file, depending on the use +of the `-m|--modify` option. When `modify` is not used, the output file +format is JSON. When `modify` is used, the output file format is GLM, and +python variables defined to provide information about the grouping. The +variable `groups` contains a dictionary of all the groups created and which +objects belong to each group. The variable `controls` contains a dictionary +of control objects and which groups are connected by that object. The +variable `swingbus` contains a dictionary of the swing buses for each island. +The variable `isolated` contains a list of groups that do not have a swing +bus. These groups are considered isolated when they are not connected to a +group that has a swing bus. + +The `-f|--force` option is used to overwrite any existing `groupid` values +found in the model. + +Example: + +The following example generates a GLM modify file for the IEEE 123 model based +on switch islanding. + +~~~ +gridlabd model get IEEE/123 +gridlabd -C 123.glm -o 123.json +gridlabd group -i=123.json --modify -o=groups.glm --force +~~~ +""" + +import sys, os +import json +import datetime + +class GroupException(Exception): + pass + +MODIFY = False +FORCE = False +DEBUG = False +WARNING = False +QUIET = False +GROUPER = 'island' +PREFIX = 'island_' +CONTROL = 'control' +CUTOBJECTS = 'switch' +INPUT = "/dev/stdin" +OUTPUT = None +COPYFROM = 'pole_mount.equipment' +COPYTO = 'pole_mount.parent' + +E_OK = 0 +E_INVALID = 1 +E_FAILED = 2 +E_MISSING = 3 +E_EXCEPTION = 8 +E_SYNTAX = 9 + +def error(msg,code=None): + """Output error message or raise exception + + Parameters: + msg (str) - error message + code (None, int) - termination code + + If code is None, only message is displayed. If code + is int, `exit(code)` is called. + """ + if not QUIET: + print(f"ERROR [group]: {msg}",file=sys.stderr) + if DEBUG: + raise GroupException(msg) + if type(code) is int: + exit(code) + elif not code is None: + raise GroupException(f"{code} is an invalid error code") + +def warning(msg): + """Output warning message""" + if not WARNING: + print(f"WARNING [group]: {msg}",file=sys.stderr) + +def debug(msg): + """Output a debugging message""" + if DEBUG: + print(f"DEBUG [group]: {msg}",file=sys.stderr) + +def grouper_island(input=None): + """Group object by connectivity in powerflow solution + + Parameters: + input (str) - input file name + + Returns: + dict - processed gridlabd model + """ + if input is None: + input = INPUT + + # + # Load model + # + with open(input,"r") as fh: + model = json.load(fh) + + # + # Check groupid + # + if not FORCE: + for obj,data in model['objects'].items(): + if 'groupid' in data and data['groupid']: + error(f"{obj}.groupid='{data['groupid']}' (use --force to overwrite)",E_FAILED) + + # + # Find swing buses and build network graph + # + swing_buses = [] + groupid = 1 + links = {} + nodes = {} + for obj,data in model['objects'].items(): + model['objects'][obj]['groupid'] = None + if 'bustype' in data and data['bustype'] in ["SWING","SWING_PQ"]: + swing_buses.append(obj) + model['objects'][obj]['groupid'] = f"{PREFIX}{groupid}" + groupid += 1 + elif 'from' in data or 'to' in data: + from_node = data['from'] + to_node = data['to'] + links[obj] = [from_node,to_node] + if not from_node in nodes: + nodes[from_node] = [obj] + elif obj not in nodes[from_node]: + nodes[from_node].append(obj) + if not to_node in nodes: + nodes[to_node] = [obj] + elif obj not in nodes[to_node]: + nodes[to_node].append(obj) + + # + # Process each swing_bus + # + def group(bus): + groupid = model['objects'][bus]['groupid'] + if not bus in nodes: + return + for link in nodes[bus]: + link_data = model['objects'][link] + if not link_data['class'] in CUTOBJECTS: + debug(f"tagging link '{link}' from '{bus}' as '{groupid}'") + model['objects'][link]['groupid'] = groupid + for node in links[link]: + if model['objects'][node]['groupid'] is None: + debug(f"tagging node '{node}' from '{link}' as '{groupid}'") + model['objects'][node]['groupid'] = groupid + group(node) + else: + model['objects'][link]['groupid'] = CONTROL + debug(f"tagging control '{link}' from '{bus}' as '{CONTROL}'") + for bus in swing_buses: + group(bus) + + # + # Recursively tag objects + # + for obj,data in model['objects'].items(): + if 'bustype' in data and data['groupid'] is None: + if 'parent' not in data: + model['objects'][obj]['groupid'] = f'{PREFIX}{groupid}' + group(obj) + warning(f"group '{data['groupid']}' does not have a swing bus") + groupid += 1 + # del model['objects'][obj]['groupid'] + else: + model['objects'][data['parent']]['groupid'] = model['objects'][obj]['groupid'] + elif 'from' in data and 'to' in data and data['groupid'] is None: + if data['groupid'] == CONTROL: + from_node = model['objects'][obj]['from'] + to_node = model['objects'][obj]['to'] + from_group = model['objects'][from_node]['groupid'] + to_group = model['objects'][to_node]['groupid'] + groupid = model['objects'][obj] = f"control_{from_group}_{to_group}" + debug(f"tagging link {link} from {bus} as {groupid}") + else: + warning(f"link '{obj}' was not tagged") + del model['objects'][obj]['groupid'] + + # + # Process linkages and children + # + for obj,data in model['objects'].items(): + + # copy groupid from objects + for linkage in COPYFROM.split(','): + classname,propname = linkage.split('.') + if data['class'] == classname and propname in data: + if data['groupid'] is None: + ref_name = data[propname] + ref = model['objects'][ref_name] + model['objects'][obj]['groupid'] = ref['groupid'] + # print(classname,'linkage from',ref_name,'to',obj,'as',ref['groupid']) + elif data['groupid'] != ref['groupid']: + warning(f"{classname} link from {ref_name} {ref['groupid']} differs from {obj} {data['groupid']}") + + # copy groupid to objects + for children in COPYTO.split(','): + classname,propname = children.split('.') + if data['class'] == classname: + ref_name = data[propname] + ref = model['objects'][ref_name] + if ref['groupid'] is None and propname in data: + model['objects'][ref_name]['groupid'] = data['groupid'] + # print(classname,'linkage from',ref_name,'to',obj,'as',ref['groupid']) + elif data['groupid'] != ref['groupid'] and ref['groupid'] != CONTROL: + warning(f"{classname} link to {ref_name} {ref['groupid']} differs from {obj} {data['groupid']}") + + return model + +# +# Process argument list +# +if len(sys.argv) == 1: + for line in __doc__.split('\n'): + if line.startswith('Syntax: '): + print(line) + exit(E_SYNTAX) +for arg in sys.argv[1:]: + token,value = (arg.split('=')[0],'='.join(arg.split('=')[1:]) if '=' in arg else None) + + # + # -h|--help|help + # + if token in ['-h','--help','help']: + print(__doc__) + exit(E_OK) + + # + # -b|--by=GROUPER specify grouping (default is 'island') + # + elif token in ['-b','--by']: + GROUPER = value + + # + # -c|--cut=CUTOBJECTS + # + elif token in ['-c','--cut']: + CUTOBJECTS = value.split(',') if ',' in value else [value] + + # + # --control=NAME set control groupid (default "control_") + # + elif token in ['--control']: + CONTROL = value + # + # --copy_from=CLASS.PROPERTY,... specify CLASS.PROPERTY from which groupid is copied (default + # is `pole_mount.equipment`) + # + elif token in ['--copy_from']: + COPYFROM = value + + # + # --copy_to=CLASS.PROPERTY,... specify CLASS.PROPERTY to which groupid is copied (default + # is `pole_mount.parent`) + # + elif token in ['--copy_to']: + COPYTO = value + + # + # -d|--debug + # + elif token in ['-d','--debug']: + DEBUG = True + + # + # -f|--force force overwrite of existing groupid data + # + elif token in ['-f','--force']: + FORCE = True + + # + # -i|--input=INPUT input JSON file name + # + elif token in ['-i','--input']: + if os.path.splitext(value)[1] in [".json"]: + INPUT = value + else: + error("only JSON input files are supported",E_INVALID) + + # + # -m|--modify output GLM modify statements instead of full modify + # + elif token in ['-m','--modify']: + MODIFY = True + + # + # -o|--output=OUTPUT output file name (JSON or GLM) + # + elif token in ['-o','--output']: + OUTPUT = value + + # + # -p|--prefix=PREFIX set the groupid prefix (default "island_") + # + elif token in ['--prefix']: + PREFIX = value + + # -q|--quiet + # + elif token in ['-q','--quiet']: + QUIET = True + + # + # -w|--warning + # + elif token in ['-w','--warning']: + WARNING = True + + # + # invalid arg + # + else: + error(f"option {arg} is invalid",E_INVALID) + +# +# Process commands +# +if __name__ == "__main__": + + EXITCODE = E_OK + # + # check for existence of grouper function + # + if "grouper_"+GROUPER not in globals(): + error(f"grouper '{GROUPER}' is invalid",E_INVALID) + + # + # check for consistent use of modify and output file extension + # + if OUTPUT is None: + OUTPUT = "/dev/stdout" + elif MODIFY and os.path.splitext(OUTPUT)[1] != ".glm": + error(f"modify output must be GLM",E_INVALID) + elif not MODIFY and os.path.splitext(OUTPUT)[1] != ".json": + error(f"model output must be JSON",E_INVALID) + + try: + + # + # call grouper + # + model = globals()["grouper_"+GROUPER]() + + # + # generate output + # + with open(OUTPUT,"w") as fh: + if MODIFY: + print(f"// generated by {' '.join(sys.argv)} at {datetime.datetime.now()}",file=fh) + + # generate python variables + groups = {} + controls = {} + swingbus = {} + isolated = [] + for obj,data in model['objects'].items(): + groupid = data['groupid'] + if groupid: + if groupid.startswith(PREFIX): + if not data['groupid'] in groups: + groups[groupid] = [obj] + else: + groups[groupid].append(obj) + if not groupid in isolated and not groupid in swingbus: + isolated.append(groupid) + if 'bustype' in data and data['bustype'] in ['SWING','SWING_PG']: + if not obj in swingbus: + swingbus[groupid] = [obj] + else: + swingbus[groupid].append(obj) + if groupid in isolated: + isolated.remove(groupid) + elif groupid == CONTROL and 'from' in data and 'to' in data: + controls[obj] = [model['objects'][data[x]]['groupid'] for x in ['from','to']] + print(f"""#begin python +groups = {groups} +controls = {controls} +swingbus = {swingbus} +isolated = {isolated} +#end +""",file=fh) + # output modify directives + for obj,data in model['objects'].items(): + groupid = data['groupid'] + if groupid: + print(f"modify {obj}.groupid '{groupid}';",file=fh) + else: + json.dump(model,fh,indent=4) + + except SystemExit as err: + + EXITCODE = err + + except: + + if DEBUG: + raise + + e_type,e_value,e_trace = sys.exc_info() + error(f"{e_type.__name__} {e_value} at line {e_trace.tb_lineno}",E_EXCEPTION) + + exit(EXITCODE) From 501215cd5e9865efa3816e0cbd19151f32ee5d53 Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Mon, 7 Aug 2023 13:30:01 -0700 Subject: [PATCH 28/34] Added comments, improved readability Added additional comments to explain what AGL and GLC are, improved a couple variable names (ex: e to elev_data), moved the lines of code that spilt GPS data into 'latitude' and 'longitude' columns to be next to the line that drops the now redundant column 'GPS Point'. A comment explaining what those lines were doing had been put right above the line that dropped the unneeded column, making it look like the code that made the new columns was missing. --- converters/xls-spida2csv-geodata.py | 19 +++++++++++-------- geodata/geodata_elevation.py | 13 +++++++------ 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/converters/xls-spida2csv-geodata.py b/converters/xls-spida2csv-geodata.py index 8fa9c7b07..9cb52b7ad 100644 --- a/converters/xls-spida2csv-geodata.py +++ b/converters/xls-spida2csv-geodata.py @@ -18,6 +18,9 @@ This converter extracts pole geodata from a SPIDAcalc pole asset report spreadsheet and generates a GriDLAB-D geodata CSV file. + This SPIDACalc API documentation explains the data in the pole asset report spreadsheet: + https://github.com/spidasoftware/schema/blob/master/doc/calc.md + OPTIONS: - `precision=2`: specify the number of digits in a number and function ROUND will be used (default 2) @@ -47,6 +50,8 @@ def string_clean(input_str): def convert(input_file, output_file, options={}): # Round to nearest hundreth decimal place if value has more decimal places than that. + + # Creates global variables for all the options: for name, value in default_options.items(): globals()[name] = value for name, value in options.items(): @@ -73,17 +78,12 @@ def convert(input_file, output_file, options={}): parse_column(df_current_sheet, 'Lean Angle', parse_angle) parse_column(df_current_sheet, 'Lean Direction', parse_angle) parse_column(df_current_sheet, 'Length', parse_length) - parse_column(df_current_sheet, 'GLC', parse_circumference_to_diamater) - parse_column(df_current_sheet, 'AGL', parse_length) + parse_column(df_current_sheet, 'GLC', parse_circumference_to_diamater) # GroundLine Circumference + parse_column(df_current_sheet, 'AGL', parse_length) # Above Ground Length parse_column(df_current_sheet, 'Effective Allowable Stress', parse_pressure) # for sec data parse_column(df_current_sheet, 'GPS Point', check_lat_long) - - # Prepare GPS Point column for splitting and split value into lat and long. - df_current_sheet['GPS Point'] = df_current_sheet['GPS Point'].apply(lambda x: str(x).replace('', ',') if str(x) == '' else str(x)) - df_current_sheet[['latitude','longitude']] = df_current_sheet['GPS Point'].str.split(',', expand=True) - - # Subtract agl from length to get depth. + # Subtract AGL from length to get depth. for row in range(0,len(df_current_sheet['AGL'])): try: df_current_sheet.at[row,'AGL'] = subtract_length_columns(str(df_current_sheet.at[row,'Length']), str(df_current_sheet.at[row,'AGL']), 'Length', 'AGL', row) @@ -99,6 +99,9 @@ def convert(input_file, output_file, options={}): 'Class': "grade"}, inplace=True) # for sec data # Split GPS Point into longitude and latitude, then parse. + # Prepare GPS Point column for splitting and split value into lat and long. + df_current_sheet['GPS Point'] = df_current_sheet['GPS Point'].apply(lambda x: str(x).replace('', ',') if str(x) == '' else str(x)) + df_current_sheet[['latitude','longitude']] = df_current_sheet['GPS Point'].str.split(',', expand=True) # Remove original GPS Point column df_current_sheet.drop(columns = {'GPS Point'},axis=1,inplace=True) # sce data diff --git a/geodata/geodata_elevation.py b/geodata/geodata_elevation.py index 684518a82..ccb27496b 100644 --- a/geodata/geodata_elevation.py +++ b/geodata/geodata_elevation.py @@ -134,7 +134,7 @@ def apply(data, options=default_options, config=default_config, warning=print): # Elevation data processing # -def get_elevation(pos,repourl=default_config["repourl"],cachedir=default_config["cachedir"]): +def get_elevation(pos,repo_url=default_config["repourl"],cachedir=default_config["cachedir"]): """Compute the elevations at the locations specified Elevations are obtained for each entry in the args list. If the @@ -148,21 +148,22 @@ def get_elevation(pos,repourl=default_config["repourl"],cachedir=default_config[ DataFrame Pandas dataframe containing the latitudes, longitudes, and elevations. """ - n,e = get_imagedata(pos,repourl,cachedir) + # elev_data (nparray) The elevation data from the image + _, elev_data = get_imagedata(pos,repo_url,cachedir) row,col = get_rowcol(pos) dx = 1.0-math.modf(abs(pos[1])*3600)[0] dy = 1.0-math.modf(abs(pos[0])*3600)[0] - e00 = float(e[row][col]) + e00 = float(elev_data[row][col]) if row > 0: - e10 = float(e[row-1][col]) + e10 = float(elev_data[row-1][col]) else: e10 = e00 if col > 0: - e01 = float(e[row][col-1]) + e01 = float(elev_data[row][col-1]) else: e01 = e00 if row > 0 and col > 0: - e11 = float(e[row-1][col-1]) + e11 = float(elev_data[row-1][col-1]) else: e11 = e00 e0 = dx*e00 + (1-dx)*e01 From 6bcb23c0a404790282b992e41a72c0b65eca13d4 Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Sun, 13 Aug 2023 11:46:19 -0700 Subject: [PATCH 29/34] Added to documentation and improved variable names Added meaning of 'direction' property to the documentation for pole_mount and comments (it's a bearing). Replaced df_current_sheet variable with two variables that actually indicate which sheet is being referenced. (I delete the first one when it's no longer used - del keyword - so no extra memory is used.) Added a link to the SpidaCalc documentation in the comments of xls-spida2csv-geodata.py so it's easier for people who read the code to figure out what the information it reads in represents. A few other explanatory comments, ex: what WEP means, explaining why pole_spacing is originally assigned to a string that identifies one, (it's a placeholder, the identified WEP has the information that goes here). Also renamed variable 'key' in a for loop to wireID, and created an intermediate variable called wepID to shorten a line of code and make it clear that the for loop is replacing the placeholder explained above. --- converters/xls-spida2csv-geodata.py | 220 +++++++++++++++------------- docs/Module/Powerflow/Pole_mount.md | 2 +- module/powerflow/pole_mount.cpp | 2 +- 3 files changed, 122 insertions(+), 102 deletions(-) diff --git a/converters/xls-spida2csv-geodata.py b/converters/xls-spida2csv-geodata.py index 9cb52b7ad..8fdacf30b 100644 --- a/converters/xls-spida2csv-geodata.py +++ b/converters/xls-spida2csv-geodata.py @@ -18,7 +18,8 @@ This converter extracts pole geodata from a SPIDAcalc pole asset report spreadsheet and generates a GriDLAB-D geodata CSV file. - This SPIDACalc API documentation explains the data in the pole asset report spreadsheet: + This SPIDACalc API documentation explains data in the pole asset report spreadsheet: + https://github.com/spidasoftware/schema/blob/66cb5d102dde5bf23b487dbddb261d3a88fc0907/doc/wfs.md https://github.com/spidasoftware/schema/blob/master/doc/calc.md OPTIONS: @@ -52,6 +53,8 @@ def convert(input_file, output_file, options={}): # Round to nearest hundreth decimal place if value has more decimal places than that. # Creates global variables for all the options: + # These are defined implicitly using the global symbols dictionary; some IDEs + # may warn that they are undefined when they appear in the code. for name, value in default_options.items(): globals()[name] = value for name, value in options.items(): @@ -63,51 +66,51 @@ def convert(input_file, output_file, options={}): df = pd.read_excel(input_file, sheet_name=None,) # First do operations on the sheet 'Design - Pole.' - df_current_sheet = df['Design - Pole'].copy() - new_header_index = df_current_sheet.iloc[:, 0].first_valid_index() - new_header = df_current_sheet.iloc[new_header_index-1] - df_current_sheet = df_current_sheet[new_header_index:] - df_current_sheet.columns = new_header - df_current_sheet.index = range(len(df_current_sheet.index)) - df_current_sheet.columns.name = None + df_design_pole = df['Design - Pole'].copy() + new_header_index = df_design_pole.iloc[:, 0].first_valid_index() + new_header = df_design_pole.iloc[new_header_index-1] + df_design_pole = df_design_pole[new_header_index:] + df_design_pole.columns = new_header + df_design_pole.index = range(len(df_design_pole.index)) + df_design_pole.columns.name = None # Drop unneeded columns - df_current_sheet.drop(['Owner', 'Foundation', 'Ground Water Level',],axis=1,inplace=True) + df_design_pole.drop(['Owner', 'Foundation', 'Ground Water Level',],axis=1,inplace=True) # Parse necessary columns into a format supported by Gridlabd. - parse_column(df_current_sheet, 'Lean Angle', parse_angle) - parse_column(df_current_sheet, 'Lean Direction', parse_angle) - parse_column(df_current_sheet, 'Length', parse_length) - parse_column(df_current_sheet, 'GLC', parse_circumference_to_diamater) # GroundLine Circumference - parse_column(df_current_sheet, 'AGL', parse_length) # Above Ground Length - parse_column(df_current_sheet, 'Effective Allowable Stress', parse_pressure) # for sec data - parse_column(df_current_sheet, 'GPS Point', check_lat_long) - - # Subtract AGL from length to get depth. - for row in range(0,len(df_current_sheet['AGL'])): + parse_column(df_design_pole, 'Lean Angle', parse_angle) + parse_column(df_design_pole, 'Lean Direction', parse_angle) + parse_column(df_design_pole, 'Length', parse_length) + parse_column(df_design_pole, 'GLC', parse_circumference_to_diamater) # GroundLine Circumference + parse_column(df_design_pole, 'AGL', parse_length) # Above Ground Length + parse_column(df_design_pole, 'Effective Allowable Stress', parse_pressure) # for sec data + parse_column(df_design_pole, 'GPS Point', check_lat_long) + + # Subtract Above Ground Length from length to get depth. + for row in range(0,len(df_design_pole['AGL'])): try: - df_current_sheet.at[row,'AGL'] = subtract_length_columns(str(df_current_sheet.at[row,'Length']), str(df_current_sheet.at[row,'AGL']), 'Length', 'AGL', row) + df_design_pole.at[row,'AGL'] = subtract_length_columns(str(df_design_pole.at[row,'Length']), str(df_design_pole.at[row,'AGL']), 'Length', 'AGL', row) except ValueError as e: - df_current_sheet.at[row,'AGL'] = "" + df_design_pole.at[row,'AGL'] = "" # Rename columns to its corresponding column name in Gridlabd. # I believe class in the file is referring to grade, so it is renamed. - df_current_sheet.rename(columns = {np.nan : 'name', 'Lean Angle': 'tilt_degree', + df_design_pole.rename(columns = {np.nan : 'name', 'Lean Angle': 'tilt_degree', 'Lean Direction': 'tilt_direction', 'Effective Allowable Stress': 'fiber_strength',\ 'Length' : 'pole_length', 'GLC' : 'ground_diameter', 'AGL' : 'pole_depth',\ 'Class': "grade"}, inplace=True) # for sec data # Split GPS Point into longitude and latitude, then parse. # Prepare GPS Point column for splitting and split value into lat and long. - df_current_sheet['GPS Point'] = df_current_sheet['GPS Point'].apply(lambda x: str(x).replace('', ',') if str(x) == '' else str(x)) - df_current_sheet[['latitude','longitude']] = df_current_sheet['GPS Point'].str.split(',', expand=True) + df_design_pole['GPS Point'] = df_design_pole['GPS Point'].apply(lambda x: str(x).replace('', ',') if str(x) == '' else str(x)) + df_design_pole[['latitude','longitude']] = df_design_pole['GPS Point'].str.split(',', expand=True) # Remove original GPS Point column - df_current_sheet.drop(columns = {'GPS Point'},axis=1,inplace=True) # sce data + df_design_pole.drop(columns = {'GPS Point'},axis=1,inplace=True) # sce data # Split the dataframe based on properties of pole_config and pole_library. - df_pole_config = df_current_sheet[['pole_length', 'pole_depth', 'ground_diameter', 'fiber_strength']].copy() - df_pole_library = df_current_sheet[['tilt_degree', 'tilt_direction', 'latitude', 'longitude']].copy() + df_pole_config = df_design_pole[['pole_length', 'pole_depth', 'ground_diameter', 'fiber_strength']].copy() + df_pole_library = df_design_pole[['tilt_degree', 'tilt_direction', 'latitude', 'longitude']].copy() # Specify class of the properties. df_pole_config.loc[:,'class'] = 'powerflow.pole_configuration' @@ -115,17 +118,20 @@ def convert(input_file, output_file, options={}): # Additional properties for each class. These values are just for testing purposes for now. pole_configuration_name = [] - pole_name = [] - for i in range(len(df_current_sheet["name"])): - pole_configuration_name.append(f"pole_configuration_{df_current_sheet['name'][i]}") - pole_name.append(f"pole_{df_current_sheet['name'][i]}") + # Pole names are made in the form: f'pole_{id}' + pole_names = [] + for i in range(len(df_design_pole["name"])): # Every row is a pole, so this goes over every pole + pole_configuration_name.append(f"pole_configuration_{df_design_pole['name'][i]}") + pole_names.append(f"pole_{df_design_pole['name'][i]}") df_pole_config.loc[:,'class'] = 'pole_configuration' df_pole_library.loc[:,'class'] = 'pole' df_pole_config.loc[:,'name'] = pole_configuration_name df_pole_library.loc[:,'configuration'] = pole_configuration_name - df_pole_library.loc[:,'name'] = pole_name - if include_weather: + df_pole_library.loc[:,'name'] = pole_names + if include_weather: # a user-specified option. + # Your IDE may warn that include_weather is undefined; it is defined implicitly + # using the global symbols dictionary accessed by the built-in function globals(). df_pole_library.loc[:,'weather'] = include_weather else: df_pole_library.loc[:,'wind_speed'] = '0 m/s' @@ -134,20 +140,23 @@ def convert(input_file, output_file, options={}): df['Design - Pole']= pd.concat([df_pole_config, df_pole_library], axis=0, ignore_index=True) # Secondly do operations on the sheet 'Design - Structure' - if extract_equipment: - df_current_sheet = df['Design - Structure'].copy() - new_header_index = df_current_sheet.iloc[:, 0].first_valid_index() - new_header = df_current_sheet.iloc[new_header_index+1] - df_current_sheet = df_current_sheet[new_header_index:] - df_current_sheet.columns = new_header - df_current_sheet.index = range(len(df_current_sheet.index)) - df_current_sheet.columns.name = None + del df_design_pole # We are done with the 'Design - Pole' sheet + if extract_equipment: # a user-specified option. + # Your IDE may warn that extract_equipment is undefined; it is defined implicitly + # using the global symbols dictionary accessed by the built-in function globals(). + df_design_structure = df['Design - Structure'].copy() + new_header_index = df_design_structure.iloc[:, 0].first_valid_index() + new_header = df_design_structure.iloc[new_header_index+1] + df_design_structure = df_design_structure[new_header_index:] + df_design_structure.columns = new_header + df_design_structure.index = range(len(df_design_structure.index)) + df_design_structure.columns.name = None pos_index = [] pole_index = 0 - for i in range(len(df_current_sheet["ID#"])): - if df_current_sheet.iloc[i]["ID#"] == pole_name[pole_index].split('_')[1]: + for i in range(len(df_design_structure["ID#"])): + if df_design_structure.iloc[i]["ID#"] == pole_names[pole_index].split('_')[1]: pos_index.append(i) - if pole_index == len(pole_name)-1: + if pole_index == len(pole_names)-1: break else: pole_index += 1 @@ -158,91 +167,100 @@ def convert(input_file, output_file, options={}): mount_wep_dic = {} for i in range(len(pos_index)-1): for k in range(pos_index[i]+2,pos_index[i+1]-1): - mount_ID = df_current_sheet.iloc[k]["ID#"] + mount_ID = df_design_structure.iloc[k]["ID#"] if "Wire" in mount_ID: - mount_height = parse_length(df_current_sheet.iloc[k]["Height"], "Height", f"{k}") - mount_direction = parse_angle(df_current_sheet.iloc[k]["Direction"], "Direction", f"{k}") - mount_wire_dic[f"OL_{mount_ID}_{pole_name[pole_index]}"] = { - "equipment" : f"OL_{mount_ID}_{pole_name[pole_index]}", + mount_height = parse_length(df_design_structure.iloc[k]["Height"], "Height", f"{k}") + mount_direction = parse_angle(df_design_structure.iloc[k]["Direction"], "Direction", f"{k}") + mount_wire_dic[f"OL_{mount_ID}_{pole_names[pole_index]}"] = { # OL means Overhead Line + "equipment" : f"OL_{mount_ID}_{pole_names[pole_index]}", "class" : "pole_mount", - "parent" : pole_name[pole_index], + "parent" : pole_names[pole_index], "height" : mount_height, "direction" : mount_direction, - "pole_spacing" : f'WEP_{df_current_sheet.iloc[k]["Related"]}_{pole_name[pole_index]}', - "// cable_type" : df_current_sheet.iloc[k]["Size"], + # In the source data, pole spacing is associated with Wire End Points (WEP), not individual wires. + # A placeholder indicating the 'Related' WEP is stored, to be replaced after WEP data is read in. + "pole_spacing" : f'WEP_{df_design_structure.iloc[k]["Related"]}_{pole_names[pole_index]}', + "// cable_type" : df_design_structure.iloc[k]["Size"], "flags" : "NONE", - + # Source data may include a Tension Group in the 'Type' column. SPIDACalc lets users define these, they are not consistent + # enough to be interpreted here. } elif "Equip" in mount_ID: - mount_height = parse_length(df_current_sheet.iloc[k]["Height"], "Height", f"{k}") - mount_direction = parse_angle(df_current_sheet.iloc[k]["Direction"], "Direction", f"{k}") - mount_equip_dic[f"TF_{mount_ID}_{pole_name[pole_index]}"] = { - "equipment" : f"TF_{mount_ID}_{pole_name[pole_index]}", + mount_height = parse_length(df_design_structure.iloc[k]["Height"], "Height", f"{k}") + mount_direction = parse_angle(df_design_structure.iloc[k]["Direction"], "Direction", f"{k}") + mount_equip_dic[f"TF_{mount_ID}_{pole_names[pole_index]}"] = { + "equipment" : f"TF_{mount_ID}_{pole_names[pole_index]}", "class" : "pole_mount", - "parent" : pole_name[pole_index], + "parent" : pole_names[pole_index], "height" : mount_height, "direction" : mount_direction, "offset" : "1 ft", "area" : "1 sf", "weight" : "10 lb", - "// equipment_type" : df_current_sheet.iloc[k]["Size"], + "// equipment_type" : df_design_structure.iloc[k]["Size"], "flags" : "NONE", } - elif "WEP" in mount_ID: - mount_direction = parse_angle(df_current_sheet.iloc[k]["Direction"], "Direction", f"{k}") - mount_offset = parse_length(df_current_sheet.iloc[k]["Offset/Lead"], "Offset/Lead", f"{k}") - mount_wep_dic[f"WEP_{mount_ID}_{pole_name[pole_index]}"] = { - "name" : f"WEP_{mount_ID}_{pole_name[pole_index]}", + elif "WEP" in mount_ID: # Wire End Point (the pole or building at the other end of a wire) + mount_direction = parse_angle(df_design_structure.iloc[k]["Direction"], "Direction", f"{k}") + wire_distance = parse_length(df_design_structure.iloc[k]["Offset/Lead"], "Offset/Lead", f"{k}") # Distance to object at the other end of the wire + mount_wep_dic[f"WEP_{mount_ID}_{pole_names[pole_index]}"] = { + "name" : f"WEP_{mount_ID}_{pole_names[pole_index]}", "direction" : mount_direction, - "distance" : mount_offset, + "distance" : wire_distance, } pole_index += 1 - for k in range(pos_index[-1]+2,len(df_current_sheet["ID#"])): - mount_ID = df_current_sheet.iloc[k]["ID#"] + for k in range(pos_index[-1]+2,len(df_design_structure["ID#"])): + mount_ID = df_design_structure.iloc[k]["ID#"] if "Wire" in mount_ID: - mount_height = parse_length(df_current_sheet.iloc[k]["Height"], "Height", f"{k}") - mount_direction = parse_angle(df_current_sheet.iloc[k]["Direction"], "Direction", f"{k}") - mount_wire_dic[f"OL_{mount_ID}_{pole_name[pole_index]}"] = { - "equipment" : f"OL_{mount_ID}_{pole_name[pole_index]}", + mount_height = parse_length(df_design_structure.iloc[k]["Height"], "Height", f"{k}") + mount_direction = parse_angle(df_design_structure.iloc[k]["Direction"], "Direction", f"{k}") + mount_wire_dic[f"OL_{mount_ID}_{pole_names[pole_index]}"] = { # OL means Overhead Line + "equipment" : f"OL_{mount_ID}_{pole_names[pole_index]}", "class" : "pole_mount", - "parent" : pole_name[pole_index], + "parent" : pole_names[pole_index], "height" : mount_height, "direction" : mount_direction, - "pole_spacing" : f'WEP_{df_current_sheet.iloc[k]["Related"]}_{pole_name[pole_index]}', - "// cable_type" : df_current_sheet.iloc[k]["Size"], + # In the source data, pole spacing is associated with Wire End Points (WEP), not individual wires. + # A placeholder indicating the 'Related' WEP is stored, to be replaced after WEP data is read in. + "pole_spacing" : f'WEP_{df_design_structure.iloc[k]["Related"]}_{pole_names[pole_index]}', + "// cable_type" : df_design_structure.iloc[k]["Size"], "flags" : "NONE", - + # Source data may include a Tension Group in the 'Type' column. SPIDACalc lets users define these, they are not consistent + # enough to be interpreted here. } elif "Equip" in mount_ID: - mount_height = parse_length(df_current_sheet.iloc[k]["Height"], "Height", f"{k}") - mount_direction = parse_angle(df_current_sheet.iloc[k]["Direction"], "Direction", f"{k}") - mount_equip_dic[f"TF_{mount_ID}_{pole_name[pole_index]}"] = { - "equipment" : f"TF_{mount_ID}_{pole_name[pole_index]}", + mount_height = parse_length(df_design_structure.iloc[k]["Height"], "Height", f"{k}") + mount_direction = parse_angle(df_design_structure.iloc[k]["Direction"], "Direction", f"{k}") + mount_equip_dic[f"TF_{mount_ID}_{pole_names[pole_index]}"] = { + "equipment" : f"TF_{mount_ID}_{pole_names[pole_index]}", "class" : "pole_mount", - "parent" : pole_name[pole_index], + "parent" : pole_names[pole_index], "height" : mount_height, "direction" : mount_direction, "offset" : "1 ft", "area" : "1 sf", "weight" : "10 lb", - "// equipment_type" : df_current_sheet.iloc[k]["Size"], + "// equipment_type" : df_design_structure.iloc[k]["Size"], "flags" : "NONE", } - elif "WEP" in mount_ID: - mount_direction = parse_angle(df_current_sheet.iloc[k]["Direction"], "Direction", f"{k}") - mount_offset = parse_length(df_current_sheet.iloc[k]["Offset/Lead"], "Offset/Lead", f"{k}") - mount_wep_dic[f"WEP_{mount_ID}_{pole_name[pole_index]}"] = { - "name" : f"WEP_{mount_ID}_{pole_name[pole_index]}", + elif "WEP" in mount_ID: # Wire End Point (the pole or building at the other end of a wire) + mount_direction = parse_angle(df_design_structure.iloc[k]["Direction"], "Direction", f"{k}") + wire_distance = parse_length(df_design_structure.iloc[k]["Offset/Lead"], "Offset/Lead", f"{k}") + mount_wep_dic[f"WEP_{mount_ID}_{pole_names[pole_index]}"] = { + "name" : f"WEP_{mount_ID}_{pole_names[pole_index]}", "direction" : mount_direction, - "distance" : mount_offset, + "distance" : wire_distance, } - for key in mount_wire_dic.keys(): - mount_wire_dic[key]["pole_spacing"] = mount_wep_dic[mount_wire_dic[key]["pole_spacing"]]["distance"] - df_mount_wire = pd.DataFrame.from_dict(mount_wire_dic, orient='index') - df_mount_equip = pd.DataFrame.from_dict(mount_equip_dic, orient='index') - df['Design - Structure']= pd.concat([df_mount_wire, df_mount_equip], axis=0, ignore_index=True) - df['Design - Pole']= pd.concat([df['Design - Pole'], df['Design - Structure']], axis=0, ignore_index=True) + # The source data associates pole spacing data with Wire End Points rather than wires. Replace placeholder key + # in the wire dict with actual pole spacing from WEP dict. + for wireID in mount_wire_dic.keys(): + wepID = mount_wire_dic[wireID]["pole_spacing"] # placeholder key + mount_wire_dic[wireID]["pole_spacing"] = mount_wep_dic[wepID]["distance"] + df_mount_wire = pd.DataFrame.from_dict(mount_wire_dic, orient='index') # rows are wires, columns are wire data + df_mount_equip = pd.DataFrame.from_dict(mount_equip_dic, orient='index') # rows are different equipment mounts + df['Design - Structure'] = pd.concat([df_mount_wire, df_mount_equip], axis=0, ignore_index=True) + df['Design - Pole'] = pd.concat([df['Design - Pole'], df['Design - Structure']], axis=0, ignore_index=True) if include_network: df['Design - Pole'] = xls2glm_object(df['Design - Pole'],input_file) @@ -521,13 +539,13 @@ def parse_space_to_underscore(cell_string, current_column, current_row): def xls2glm_object(df_glm, input_file): glm_node_dic = {} - glm_OLLC_dic = {} - glm_LS_dic = {} - glm_LC_dic = {} - glm_OL_dic = {} - glm_TC_dic = {} - glm_TF_dic = {} - swing_node = f"ND_{os.path.basename(input_file).split('.')[0]}" + glm_OLLC_dic = {} # OLLC - Overhead Line Conductor + glm_LS_dic = {} # LS - Line Spacing + glm_LC_dic = {} # LC - Line Configuration + glm_OL_dic = {} # OL - Overhead Line + glm_TC_dic = {} # TC - Transformer Configuration + glm_TF_dic = {} # TF - Transformer + swing_node = f"ND_{os.path.basename(input_file).split('.')[0]}" # ND - Node glm_node_dic[swing_node] = { "name" : swing_node, "class" : "node", @@ -537,7 +555,9 @@ def xls2glm_object(df_glm, input_file): } last_node = swing_node for n in range(len(df_glm["class"])): + # Iterating over every pole_mount: if df_glm.iloc[n]["class"] == "pole_mount": + # For every Overhead Line, if df_glm.iloc[n]["equipment"].split('_')[0] == "OL": if f'ND_{df_glm.iloc[n]["equipment"]}' not in glm_node_dic.keys(): glm_node_dic[f'ND_{df_glm.iloc[n]["equipment"]}'] = { diff --git a/docs/Module/Powerflow/Pole_mount.md b/docs/Module/Powerflow/Pole_mount.md index af64f4fd5..19dd3dc5c 100644 --- a/docs/Module/Powerflow/Pole_mount.md +++ b/docs/Module/Powerflow/Pole_mount.md @@ -59,7 +59,7 @@ object pole double direction; ~~~ -Direction from pole centerline at which equipment is mounted in degrees. +Bearing of the mounted equipment, an angle measured clockwise from North in degrees with vertex at the pole centerline. # See also diff --git a/module/powerflow/pole_mount.cpp b/module/powerflow/pole_mount.cpp index d1445287f..2f385dc42 100644 --- a/module/powerflow/pole_mount.cpp +++ b/module/powerflow/pole_mount.cpp @@ -330,7 +330,7 @@ TIMESTAMP pole_mount::sync(TIMESTAMP t0) pole *mount = OBJECTDATA(my()->parent,pole); double pole_tilt = mount->get_tilt_degree()*PI/180; double pole_tilt_dir = mount->get_tilt_direction()*PI/180; - double mount_dir = direction*PI/180; // direction from pole centerline at which equipment is mounted. + double mount_dir = direction*PI/180; // Angle clockwise from North at which equipment is mounted, with vertex at pole centerline. if ( mount->recalc ) { verbose("%s recalculation flag set",my()->parent->name); From 71163c153df461dab437c2226ed170d1582fb585 Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Sun, 13 Aug 2023 11:50:21 -0700 Subject: [PATCH 30/34] Update xls-spida2csv-geodata.py Just a minor grammar edit in one of my comments --- converters/xls-spida2csv-geodata.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/converters/xls-spida2csv-geodata.py b/converters/xls-spida2csv-geodata.py index 8fdacf30b..26eb508c9 100644 --- a/converters/xls-spida2csv-geodata.py +++ b/converters/xls-spida2csv-geodata.py @@ -222,7 +222,8 @@ def convert(input_file, output_file, options={}): "height" : mount_height, "direction" : mount_direction, # In the source data, pole spacing is associated with Wire End Points (WEP), not individual wires. - # A placeholder indicating the 'Related' WEP is stored, to be replaced after WEP data is read in. + # A placeholder indicating the 'Related' WEP is stored as the value for pole_spacing, + # to be replaced after WEP data is read in. "pole_spacing" : f'WEP_{df_design_structure.iloc[k]["Related"]}_{pole_names[pole_index]}', "// cable_type" : df_design_structure.iloc[k]["Size"], "flags" : "NONE", From 0149d403d68bd04830ea1b563678b59d8515b436 Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Tue, 22 Aug 2023 13:31:41 -0700 Subject: [PATCH 31/34] Documentation for Spida converter Create a documentation page for the Spida to csv converter under converters, fill in the broad overview from comments that were already in the python file, and additional details on interpreting the input data and output results. I explained the more unintuitive definitions, and added a link to a relevant part of the SpidaCalc documentation for easy reference. Improved comments in xls-spida2csv-geodata.py --- converters/xls-spida2csv-geodata.py | 9 +++-- docs/Converters/Import/Spida_data.md | 60 ++++++++++++++++++++++++++++ docs/Converters/Import/Xls_files.md | 1 + 3 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 docs/Converters/Import/Spida_data.md diff --git a/converters/xls-spida2csv-geodata.py b/converters/xls-spida2csv-geodata.py index 26eb508c9..641d4c9e0 100644 --- a/converters/xls-spida2csv-geodata.py +++ b/converters/xls-spida2csv-geodata.py @@ -8,6 +8,8 @@ """Convert XLS SPIDAcalc pole data to geodata +See docs/Converters/Import/Spida_data.md + SYNOPSIS GLM: @@ -95,11 +97,12 @@ def convert(input_file, output_file, options={}): df_design_pole.at[row,'AGL'] = "" # Rename columns to its corresponding column name in Gridlabd. + # Some values are replaced with analogous information, like GroundLine Circumference (GLC) to ground_diameter. # I believe class in the file is referring to grade, so it is renamed. df_design_pole.rename(columns = {np.nan : 'name', 'Lean Angle': 'tilt_degree', 'Lean Direction': 'tilt_direction', 'Effective Allowable Stress': 'fiber_strength',\ 'Length' : 'pole_length', 'GLC' : 'ground_diameter', 'AGL' : 'pole_depth',\ - 'Class': "grade"}, inplace=True) # for sec data + 'Class': "grade"}, inplace=True) # for Southern California Edison data # Split GPS Point into longitude and latitude, then parse. # Prepare GPS Point column for splitting and split value into lat and long. @@ -253,8 +256,8 @@ def convert(input_file, output_file, options={}): "direction" : mount_direction, "distance" : wire_distance, } - # The source data associates pole spacing data with Wire End Points rather than wires. Replace placeholder key - # in the wire dict with actual pole spacing from WEP dict. + # The source data associates pole spacing data with Wire End Points rather than wires. + # Replace placeholder key in the wire dict with actual pole spacing from WEP dict. for wireID in mount_wire_dic.keys(): wepID = mount_wire_dic[wireID]["pole_spacing"] # placeholder key mount_wire_dic[wireID]["pole_spacing"] = mount_wep_dic[wepID]["distance"] diff --git a/docs/Converters/Import/Spida_data.md b/docs/Converters/Import/Spida_data.md new file mode 100644 index 000000000..193cf792d --- /dev/null +++ b/docs/Converters/Import/Spida_data.md @@ -0,0 +1,60 @@ +[[/Converters/Import/Spida_data]] -- SPIDACalc data import + +# Synopis + +GLM: +~~~ +#convert SPIDACALC.xls GEODATA.csv -f xls-spida -t csv-geodata [precision=2] [extract_equipment=yes] [include_network=yes] +~~~ + +# Description + +This converter extracts pole geodata from a SPIDAcalc pole asset report spreadsheet and generates a GriDLAB-D geodata CSV file. + + +# Options + +- `precision=2`: specify the number of digits in a number and function ROUND will be used (default 2) + +- `extract_equipment=yes`: enable the conversion of pole-mounted equipment, dummy values will be used for equipment properties (default None) + +- `include_network=yes`: enable the generation of a bus-type feeder, dummy values will be used for properties of feeder and equipment (default None) + +- `include_weather=NAME`: name the weather object and do not use dummy values for weather data (default None) + +# Input + +[SPIDAcalc](https://www.spidasoftware.com/spidacalc/) is proprietarty pole loading and line design software that some utilities use to model the forces on transmission and distribution systems. The data includes detailed specifications and location data for poles, mounted equipment and lines. + +The input .xls must include a sheet called 'Design - Pole'. +If `extract_equipment=yes`, then it must also include a sheet called 'Design - Structure' + +This SPIDACalc API documentation explains data in the pole asset report spreadsheet: + https://github.com/spidasoftware/schema/blob/66cb5d102dde5bf23b487dbddb261d3a88fc0907/doc/wfs.md + https://github.com/spidasoftware/schema/blob/master/doc/calc.md + +For quick reference, some of the less obvious meanings are included below: +In 'Design - Pole': +* `AGL` means Above Ground Length +* `GLC` means GroundLine Circumference + +In 'Design - Structure': +* `Direction` is a bearing for the mounted equipment, measured in degrees clockwise from North. +* A WEP is a Wire End Point, indicating the pole or building at the other end of a wire. Here `Offset/Lead` corresponds to the length of wire between the pole and this Wire End Point. +* For Insulators: "If on pole, then `offest` is attach height. If on cross arm, then `offset` is the distance from one end of the cross arm." - (SPIDAcalc docs)[https://github.com/spidasoftware/schema/blob/66cb5d102dde5bf23b487dbddb261d3a88fc0907/doc/wfs.md] +* For CrossArms: "Crossarm bearing is the direction the end of the crossarm points, not the direction of the bolt attachment." - (SPIDAcalc docs)[https://github.com/spidasoftware/schema/blob/66cb5d102dde5bf23b487dbddb261d3a88fc0907/doc/wfs.md] + + +# Output + +A csv where each row represents a GridLAB-D object, columns are properties for that object. +**See the documentation for the respective GridLAB-D objects to interpret the properties.** + +The following objects can be included in the output: +`pole`, `pole_configuration` +If `extract_equipment=yes`, it will also include `pole_mount`. + + +# See also + +* [[/Converters/Import/Csv_files]] \ No newline at end of file diff --git a/docs/Converters/Import/Xls_files.md b/docs/Converters/Import/Xls_files.md index d82bc8f7e..caf6d8b1e 100644 --- a/docs/Converters/Import/Xls_files.md +++ b/docs/Converters/Import/Xls_files.md @@ -17,6 +17,7 @@ There are many different types of XLS files that can be imported. Each is docume * [[/Converters/Import/Ceus_data]] * [[/Converters/Import/Rbsa_data]] * [[/Converters/Import/Scada_data]] + * [[/Converters/Import/Spida_data]] * GLM models * [[/Converters/Import/Config_data]] * [[/Converters/Import/Ica_data]] From 3034d9e4bac41c6e0b35a33429b6d53f4a4ef644 Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Sat, 2 Sep 2023 09:13:49 -0700 Subject: [PATCH 32/34] Update pole.cpp Added a few comments to pole.cpp. --- module/powerflow/pole.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/module/powerflow/pole.cpp b/module/powerflow/pole.cpp index ce27d5767..c55d3adaf 100644 --- a/module/powerflow/pole.cpp +++ b/module/powerflow/pole.cpp @@ -443,8 +443,8 @@ TIMESTAMP pole::precommit(TIMESTAMP t0) double age = t0_year - install_year; if ( age > 0 && config->degradation_rate > 0 ) { - if ( age > 0 ) - current_hollow_diameter = 2.0*age*config->degradation_rate*diameter/config->ground_diameter; + if ( age > 0 ) // Decay expands from the center, the hollow region making up the same fraction of the pole diameter at every height. + current_hollow_diameter = 2.0*age*config->degradation_rate * diameter/config->ground_diameter; else current_hollow_diameter = 0.0; // ignore future installation years verbose("current_hollow_diameter = %g in",current_hollow_diameter); @@ -457,7 +457,7 @@ TIMESTAMP pole::precommit(TIMESTAMP t0) // update resisting moment considering aging resisting_moment = 0.008186 // constant * pi^3 * config->strength_factor_250b_wood - * config->fiber_strength + * config->fiber_strength // max stress that can be applied at a point in the material (psi) * (diameter*diameter*diameter-current_hollow_diameter*current_hollow_diameter*current_hollow_diameter); verbose("updated resisting moment %.0f ft*lb (aged)",resisting_moment); @@ -467,7 +467,7 @@ TIMESTAMP pole::precommit(TIMESTAMP t0) tilt_degree = 0.0; tilt_direction = 0.0; pole_status = PS_OK; - install_year = 1970 + (unsigned int)(t0/86400/365.24); + install_year = 1970 + (unsigned int)(t0/86400/365.24); verbose("install_year = %d (pole repaired)", install_year); recalc = true; From 02636768b881147ec8e97c72a5c42f93e06dd094 Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Sat, 2 Sep 2023 09:16:36 -0700 Subject: [PATCH 33/34] Update pole_analysis.py Renamed variables with x in them to z, because it represents height and x is already being used to represent a different direction elsewhere in the same document. Also added comments for an equation that was not self-explanatory. --- tools/pole_analysis.py | 92 +++++++++++++++++++++++------------------- 1 file changed, 51 insertions(+), 41 deletions(-) diff --git a/tools/pole_analysis.py b/tools/pole_analysis.py index 286303a08..13c154b4c 100644 --- a/tools/pole_analysis.py +++ b/tools/pole_analysis.py @@ -202,8 +202,10 @@ def verbose(msg): print(msg) def pole_diameter(g_diameter,t_diameter,h,H): - x_diameter = g_diameter - h*(g_diameter-t_diameter)/H - return x_diameter + '''Returns the pole diameter at height h. + Linearly interpolates between ground diameter and top diameter for a pole of height H.''' + z_diameter = g_diameter - h*(g_diameter-t_diameter)/H + return z_diameter def reactions_PW(g_diameter,t_diameter,height,density,tilt_degree,tilt_direction): # reactions due to pole weight and pole tilt @@ -223,9 +225,9 @@ def reactions_CT(strength,tilt_degree,heading_direction): def reactions_CW(g_diameter,t_diameter,height,weight,gP,zP,tilt_degree,tilt_direction,offset_direction): # reactions due to cable weight - x_diameter = pole_diameter(g_diameter,t_diameter,zP,height) - x_radius = x_diameter/2 - cable_weight_moment = weight*x_radius + z_diameter = pole_diameter(g_diameter,t_diameter,zP,height) + z_radius = z_diameter/2 + cable_weight_moment = weight*z_radius if tilt_degree == 0: xV = -cable_weight_moment*cos(pi*offset_direction/180)/(zP-gP) yV = -cable_weight_moment*sin(pi*offset_direction/180)/(zP-gP) @@ -319,13 +321,13 @@ def shear_moment_WP(wind_presure,wind_direction,gP,Z,g_diameter,t_diameter,heigh yShear = np.zeros(len(Z)) #Initialise a container to hold all shear force data for equipment weight xMoment = np.zeros(len(Z)) #Initialise a container to hold all moment force data for equipment weight yMoment = np.zeros(len(Z)) #Initialise a container to hold all moment force data for equipment weight - for i, x in enumerate(Z): - if x >= gP: - x = x - gP - x_diameter = pole_diameter(g_diameter,t_diameter,x,height) - shear = -wind_presure*(t_diameter+x_diameter)*(height-x)*cos(pi*tilt_degree/180)/2 + for i, z in enumerate(Z): + if z >= gP: + z = z - gP + z_diameter = pole_diameter(g_diameter,t_diameter,z,height) + shear = -wind_presure*(t_diameter+z_diameter)*(height-z)*cos(pi*tilt_degree/180)/2 moment = wind_presure*cos(pi*tilt_degree/180)*(height**2*(g_diameter+2*t_diameter)/72 \ - + x*(x_diameter*(x-height)-height*t_diameter - x**2*(g_diameter-t_diameter)/(3*height))/24) + + z*(z_diameter*(z-height)-height*t_diameter - z**2*(g_diameter-t_diameter)/(3*height))/24) else: shear = 0.0 moment = 0.0 @@ -405,21 +407,23 @@ def shear_moment_CT(xV,yV,zP,gP,Z,heading_direction): yMoment[i] = ymoment return xShear, yShear, xMoment, yMoment -def shear_moment_PW(g_diameter,t_diameter,gP,Z,height,density,tilt_degree,tilt_direction): - #Cycle through the structure and calculate the shear force and bending moment at each point +def shear_moment_PW(g_diameter,t_diameter,guy_height,Z,height,density,tilt_degree,tilt_direction): + '''Calculate the shear force and bending moment at each point along the pole length. + + Z is a list of z-coordinates (heights) from 0 to pole_length.''' xShear = np.zeros(len(Z)) #Initialise a container to hold all shear force data for pole weight yShear = np.zeros(len(Z)) #Initialise a container to hold all shear force data for pole weight xMoment = np.zeros(len(Z)) #Initialise a container to hold all moment force data for pole weight yMoment = np.zeros(len(Z)) #Initialise a container to hold all moment force data for pole weight - for i, x in enumerate(Z): - if x >= gP: - x = x - gP - x_diameter = pole_diameter(g_diameter,t_diameter,x,height) - pole_weight = density*sin(pi*tilt_degree/180)*pi*(x_diameter**2+x_diameter*t_diameter+t_diameter**2)\ - *(height-x)/(3*4*12*12) + for i, z in enumerate(Z): + if z >= guy_height: + z = z - guy_height + z_diameter = pole_diameter(g_diameter,t_diameter,z,height) + pole_weight = density*sin(pi*tilt_degree/180)*pi*(z_diameter**2+z_diameter*t_diameter+t_diameter**2)\ + *(height-z)/(3*4*12*12) pole_weight_moment = density*sin(pi*tilt_degree/180)*pi*\ - (g_diameter**2*(height**2-x**2)/(2*4)+(g_diameter-t_diameter)**2*(height**4-x**4)/(4*4*height**2)\ - -2*g_diameter*(g_diameter-t_diameter)*(height**3-x**3)/(3*4*height))/(12*12) + (g_diameter**2*(height**2-z**2)/(2*4)+(g_diameter-t_diameter)**2*(height**4-z**4)/(4*4*height**2)\ + -2*g_diameter*(g_diameter-t_diameter)*(height**3-z**3)/(3*4*height))/(12*12) else: pole_weight = 0.0 pole_weight_moment = 0.0 @@ -440,8 +444,8 @@ def calcDeflection(M, gP, Z, E, delX, theta_0, v_0, g_diameter,t_diameter, heigh ind = i if i > 0 and Z[i] >= gP: x = Z[i] - gP - x_diameter = pole_diameter(g_diameter,t_diameter,x,height) - I = 3.14*(x_diameter/2/12)**4/4 #ft4 + z_diameter = pole_diameter(g_diameter,t_diameter,x,height) + I = 3.14*(z_diameter/2/12)**4/4 #ft4 M_im1 = M[ind-1] M_i = M[ind] @@ -461,10 +465,10 @@ def calcStress(M, gP, Z, g_diameter,t_diameter, height): Stress = np.zeros(len(Z)) for i, m in enumerate(M): if Z[i] >= gP: - x = Z[i] - gP - x_diameter = pole_diameter(g_diameter,t_diameter,x,height) - I = 3.14*(x_diameter/2/12)**4/4 - stress = m*x_diameter/(2*I*12) # in lbs/ft2 + z = Z[i] - gP + z_diameter = pole_diameter(g_diameter,t_diameter,z,height) + I = 3.14*(z_diameter/2/12)**4/4 + stress = m*z_diameter/(2*I*12) # in lbs/ft2 Stress[i] = stress * 0.00694 # lbs/ft2 to psi return Stress @@ -634,7 +638,7 @@ def main(inputfile,**options): tilt_degree = pole_data['tilt_degree'] tilt_direction = pole_data['tilt_direction'] delta_height = pole_length/segment_dives - Z = np.arange(0, pole_length + delta_height, delta_height) #Range of z-coordinates + Z = np.arange(0, pole_length + delta_height, delta_height) # Range of z-coordinates xShearForce = np.empty([0,len(Z)]) #Shear forces at each data point yShearForce = np.empty([0,len(Z)]) #Shear forces at each data point xBendingMoment = np.empty([0,len(Z)]) #Bending moment at each data point @@ -664,9 +668,15 @@ def main(inputfile,**options): strength = mount_data["strength"] heading_direction = mount_data["direction"] zP = mount_data["height"] - weight = mount_data["weight"]*mount_data["pole_spacing"]/2 + pi*mount_data["ice_thickness"]*\ - (mount_data["ice_thickness"]+mount_data["cable_diameter"])*mount_data["pole_spacing"]*\ - ice_density*12/2 + # cable weight + # mount_data["weight"] is lbs per ft + weight = (mount_data["weight"] * mount_data["pole_spacing"]/2 + # ice weight + # Assumes an even coating of ice all around the cable (so a circular cross-section). + # pi * ice radius * (ice radius + cable diameter) = pi * (ice radius + cable radius)^2 - pi * (cable radius)^2 + # ice_density is in lbs per cubic inch, so pole_spacing is multiplied by 12 to convert to inches + + pi*mount_data["ice_thickness"]*(mount_data["ice_thickness"]+mount_data["cable_diameter"]) + *ice_density * 12*mount_data["pole_spacing"]/2) offset_direction = mount_data["direction"] ## cable tension if guy_height < zP: @@ -731,10 +741,10 @@ def main(inputfile,**options): warning(f"wind direction increment hasn't defined, use DEFAULT_DIRECTION_INCREMENT (2 degree)") direction_increment = DEFAULT_DIRECTION_INCREMENT - anaglysis_directions = np.arange(0, 360, direction_increment) #Range of wind direction - anaglysis_stress = np.zeros(len(anaglysis_directions)) + analysis_directions = np.arange(0, 360, direction_increment) # Range of wind direction + analysis_stress = np.zeros(len(analysis_directions)) - for i, anaglysis_direction in enumerate(anaglysis_directions): + for i, anaglysis_direction in enumerate(analysis_directions): wind_direction = anaglysis_direction wind_presure = 0.00256*(2.24*wind_speed)**2 #2.24 account for m/s to mph conversion, in lb/ft2 xAnalysisShearForce = np.empty([0,len(Z)]) #Shear forces at each data point @@ -799,11 +809,11 @@ def main(inputfile,**options): verbose(f"analysis direction: {wind_direction}, stress: {max(Stress)}") if max(Stress) > 100: warning(f"[{pole}] stress = {max(Stress)}% at direction {anaglysis_direction} degree") - anaglysis_stress[i] = max(Stress) + analysis_stress[i] = max(Stress) ## record data - verbose(f"analysis anagle: {anaglysis_directions}") - verbose(f"analysis stress: {anaglysis_stress}") - pole_analysis[pole]['worst_angle'] = anaglysis_directions[np.argmax(anaglysis_stress)] + verbose(f"analysis angle: {analysis_directions}") + verbose(f"analysis stress: {analysis_stress}") + pole_analysis[pole]['worst_angle'] = analysis_directions[np.argmax(analysis_stress)] pole_analysis[pole]['worst_angle_speed'] = wind_speed elif ANALYSIS == "critical_speed": if np.isnan(wind_direction): @@ -814,7 +824,7 @@ def main(inputfile,**options): speed_increment = DEFAULT_SPEED_INCREMENT anaglysis_windspeed = [] #list of wind speed - anaglysis_stress = [] + analysis_stress = [] critical_wind_speed = 0.0 critical_stress = 0.0 while critical_stress < 100.0: @@ -883,12 +893,12 @@ def main(inputfile,**options): critical_stress = max(Stress) verbose(f"critical_stress: {critical_stress}") anaglysis_windspeed.append(wind_speed) #list of wind speed - anaglysis_stress.append(critical_stress) + analysis_stress.append(critical_stress) ## update data critical_wind_speed = critical_wind_speed + speed_increment ## record data verbose(f"analysis anagle: {anaglysis_windspeed}") - verbose(f"analysis stress: {anaglysis_stress}") + verbose(f"analysis stress: {analysis_stress}") pole_analysis[pole]['critical_wind_speed'] = critical_wind_speed - speed_increment pole_analysis[pole]['critical_wind_direction'] = wind_direction elif ANALYSIS == "loading_scenario": From 4e9c372da9a16e05f6bf2d6624b3e5f5e43f9bc4 Mon Sep 17 00:00:00 2001 From: AllisonBrand <56557237+AllisonBrand@users.noreply.github.com> Date: Wed, 6 Sep 2023 22:49:20 -0400 Subject: [PATCH 34/34] Update Pole.md --- docs/Module/Powerflow/Pole.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Module/Powerflow/Pole.md b/docs/Module/Powerflow/Pole.md index 01cc66b9c..ddb005211 100644 --- a/docs/Module/Powerflow/Pole.md +++ b/docs/Module/Powerflow/Pole.md @@ -38,7 +38,7 @@ object pole # Description -The pole object models poles in powerflow network. The current pole object models pole failure by overstress at the base the pole from wind pressure on the equipment, wire, and tilt. The model does not model failures from ice loading on the lines or from foundation failure. +The pole object models poles in powerflow network. The current pole object models pole failure by overstress at the base the pole from wind pressure on the equipment, wire, and tilt. Ice on the line is modeled as an increase in the conductor diameter for respect to wind loading. The added weight is calculated assuming a cylindrically symmetric ice accumulation with constant density. The model does not model foundation failure. Generally, any link object in a powerflow model can be mounted on a pole by creating a `pole_mount` object that uses the pole as a parent, and providing just the `weather` and `pole_configuration` object references to the pole. The `pole_mount` object specifies the position, size, and weight of the equipment on the pole to model the effect of wind give the aerodynamic cross-section.