From 80ce382a387dfacc58d8e675055a58f35837994f Mon Sep 17 00:00:00 2001 From: Michael Tryby Date: Wed, 20 Mar 2019 18:01:11 -0400 Subject: [PATCH] Removing epanet-output from tools folder epanet-output has been moved to epanet/src/outfile --- tools/epanet-output/CMakeLists.txt | 40 - tools/epanet-output/include/epanet_output.h | 82 -- .../include/epanet_output_enums.h | 79 -- tools/epanet-output/setup.py | 41 - tools/epanet-output/src/epanet_output.c | 1000 ----------------- tools/epanet-output/src/epanet_output.i | 203 ---- tools/epanet-output/src/errormanager.c | 74 -- tools/epanet-output/src/errormanager.h | 27 - tools/epanet-output/src/messages.h | 29 - tools/epanet-output/test/data/__init__.py | 14 - tools/epanet-output/test/data/net1.out | Bin 16832 -> 0 bytes .../epanet-output/test/test_epanet_output.cpp | 251 ----- 12 files changed, 1840 deletions(-) delete mode 100644 tools/epanet-output/CMakeLists.txt delete mode 100644 tools/epanet-output/include/epanet_output.h delete mode 100644 tools/epanet-output/include/epanet_output_enums.h delete mode 100644 tools/epanet-output/setup.py delete mode 100644 tools/epanet-output/src/epanet_output.c delete mode 100644 tools/epanet-output/src/epanet_output.i delete mode 100644 tools/epanet-output/src/errormanager.c delete mode 100644 tools/epanet-output/src/errormanager.h delete mode 100644 tools/epanet-output/src/messages.h delete mode 100644 tools/epanet-output/test/data/__init__.py delete mode 100644 tools/epanet-output/test/data/net1.out delete mode 100644 tools/epanet-output/test/test_epanet_output.cpp diff --git a/tools/epanet-output/CMakeLists.txt b/tools/epanet-output/CMakeLists.txt deleted file mode 100644 index 0d85da4..0000000 --- a/tools/epanet-output/CMakeLists.txt +++ /dev/null @@ -1,40 +0,0 @@ -# -# CMakeLists.txt - CMake configuration file for epanet-output library -# -# Created: March 9, 2018 -# Author: Michael E. Tryby -# US EPA ORD/NRMRL -# - -cmake_minimum_required (VERSION 3.0) - - -# Sets for output directory for executables and libraries. -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) - - -set(CMAKE_C_VISIBILITY_PRESET hidden) -set(CMAKE_CXX_VISIBILITY_PRESET hidden) -set(CMAKE_POSITION_INDEPENDENT_CODE ON) -set(CMAKE_INCLUDE_CURRENT_DIR ON) - - -# configure file groups -set(EPANET_OUT_SOURCES src/epanet_output.c src/errormanager.c) - - -# the binary output file API -add_library(epanet-output SHARED ${EPANET_OUT_SOURCES}) -target_include_directories(epanet-output PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include) - -include(GenerateExportHeader) -generate_export_header(epanet-output - BASE_NAME epanet_output - EXPORT_MACRO_NAME EXPORT_OUT_API - EXPORT_FILE_NAME epanet_output_export.h - STATIC_DEFINE SHARED_EXPORTS_BUILT_AS_STATIC) - -file(COPY ${CMAKE_CURRENT_BINARY_DIR}/epanet_output_export.h DESTINATION - ${CMAKE_CURRENT_SOURCE_DIR}/include) diff --git a/tools/epanet-output/include/epanet_output.h b/tools/epanet-output/include/epanet_output.h deleted file mode 100644 index 9c06522..0000000 --- a/tools/epanet-output/include/epanet_output.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * epanet_output.h - EPANET Output API - * - * Created on: Jun 4, 2014 - * - * Author: Michael E. Tryby - * US EPA - ORD/NRMRL - */ - -#ifndef EPANET_OUTPUT_H_ -#define EPANET_OUTPUT_H_ -/* Epanet Results binary file API */ - - -#define MAXFNAME 259 // Max characters in file name -#define MAXID 31 // Max characters in ID name - - -// This is an opaque pointer to struct. Do not access variables. -typedef void* ENR_Handle; - - -#include "epanet_output_enums.h" -#include "epanet_output_export.h" - - -#ifdef __cplusplus -extern "C" { -#endif - -int EXPORT_OUT_API ENR_init(ENR_Handle* p_handle_out); - -int EXPORT_OUT_API ENR_open(ENR_Handle p_handle_in, const char* path); - -int EXPORT_OUT_API ENR_getVersion(ENR_Handle p_handle_in, int* int_out); - -int EXPORT_OUT_API ENR_getNetSize(ENR_Handle p_handle_in, int** int_out, int* int_dim); - -int EXPORT_OUT_API ENR_getUnits(ENR_Handle p_handle_in, ENR_Units t_enum, int* int_out); - -int EXPORT_OUT_API ENR_getTimes(ENR_Handle p_handle_in, ENR_Time t_enum, int* int_out); - -int EXPORT_OUT_API ENR_getElementName(ENR_Handle p_handle_in, ENR_ElementType t_enum, - int elementIndex, char** string_out, int* slen); - -int EXPORT_OUT_API ENR_getEnergyUsage(ENR_Handle p_handle_in, int pumpIndex, - int* int_out, float** float_out, int* int_dim); - -int EXPORT_OUT_API ENR_getNetReacts(ENR_Handle p_handle_in, float** float_out, int* int_dim); - - -int EXPORT_OUT_API ENR_getNodeSeries(ENR_Handle p_handle_in, int nodeIndex, ENR_NodeAttribute t_enum, - int startPeriod, int endPeriod, float** outValueSeries, int* dim); - -int EXPORT_OUT_API ENR_getLinkSeries(ENR_Handle p_handle_in, int linkIndex, ENR_LinkAttribute t_enum, - int startPeriod, int endPeriod, float** outValueSeries, int* dim); - -int EXPORT_OUT_API ENR_getNodeAttribute(ENR_Handle p_handle_in, int periodIndex, - ENR_NodeAttribute t_enum, float** outValueArray, int* dim); - -int EXPORT_OUT_API ENR_getLinkAttribute(ENR_Handle p_handle_in, int periodIndex, - ENR_LinkAttribute t_enum, float** outValueArray, int* dim); - -int EXPORT_OUT_API ENR_getNodeResult(ENR_Handle p_handle_in, int periodIndex, int nodeIndex, - float** float_out, int* int_dim); - -int EXPORT_OUT_API ENR_getLinkResult(ENR_Handle p_handle_in, int periodIndex, int linkIndex, - float** float_out, int* int_dim); - -int EXPORT_OUT_API ENR_close(ENR_Handle* p_handle_out); - -void EXPORT_OUT_API ENR_free(void** array); - -void EXPORT_OUT_API ENR_clearError(ENR_Handle p_handle_in); - -int EXPORT_OUT_API ENR_checkError(ENR_Handle p_handle_in, char** msg_buffer); - -#ifdef __cplusplus -} -#endif - -#endif /* EPANET_OUTPUT_H_ */ diff --git a/tools/epanet-output/include/epanet_output_enums.h b/tools/epanet-output/include/epanet_output_enums.h deleted file mode 100644 index 0fa012f..0000000 --- a/tools/epanet-output/include/epanet_output_enums.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * epanet_output_enums.h - EPANET Output API enums - * - * Created on: March 11, 2019 - * - * Author: Michael E. Tryby - * US EPA - ORD/NRMRL - */ - - -#ifndef EPANET_OUTPUT_ENUMS_H_ -#define EPANET_OUTPUT_ENUMS_H_ - - -typedef enum { - ENR_node = 1, - ENR_link = 2 -} ENR_ElementType; - -typedef enum { - ENR_flowUnits = 1, - ENR_pressUnits = 2, - ENR_qualUnits = 3 -} ENR_Units; - -typedef enum { - ENR_CFS = 0, - ENR_GPM = 1, - ENR_MGD = 2, - ENR_IMGD = 3, - ENR_AFD = 4, - ENR_LPS = 5, - ENR_LPM = 6, - ENR_MLD = 7, - ENR_CMH = 8, - ENR_CMD = 9 -} ENR_FlowUnits; - -typedef enum { - ENR_PSI = 0, - ENR_MTR = 1, - ENR_KPA = 2 -} ENR_PressUnits; - -typedef enum { - ENR_NONE = 0, - ENR_MGL = 1, - ENR_UGL = 2, - ENR_HOURS = 3, - ENR_PRCNT = 4 -} ENR_QualUnits; - -typedef enum { - ENR_reportStart = 1, - ENR_reportStep = 2, - ENR_simDuration = 3, - ENR_numPeriods = 4 -}ENR_Time; - -typedef enum { - ENR_demand = 1, - ENR_head = 2, - ENR_pressure = 3, - ENR_quality = 4 -} ENR_NodeAttribute; - -typedef enum { - ENR_flow = 1, - ENR_velocity = 2, - ENR_headloss = 3, - ENR_avgQuality = 4, - ENR_status = 5, - ENR_setting = 6, - ENR_rxRate = 7, - ENR_frctnFctr = 8 -} ENR_LinkAttribute; - - -#endif /* EPANET_OUTPUT_ENUMS_H_ */ diff --git a/tools/epanet-output/setup.py b/tools/epanet-output/setup.py deleted file mode 100644 index 92881ce..0000000 --- a/tools/epanet-output/setup.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# -# setup.py -# -# Created: 9/20/2017 -# Author: Michael E. Tryby -# US EPA - ORD/NRMRL -# -# Setup up script for en_outputapi python extension -# -# Requires: -# Platform C language compiler -# Python packages: numpy -# - -try: - from setuptools import setup, Extension - from setuptools.command.build_ext import build_ext -except ImportError: - from distutils.core import setup, Extension - from distutils.command.build_ext import build_ext - -setup( - name = "epanet-output", - version = "0.1.0-alpha", - ext_modules = [ - Extension("_epanet_output", - define_macros = [('epanet_output_EXPORTS', None)], - include_dirs = ['include'], - sources = ['src/epanet_output.i', 'src/epanet_output.c', 'src/errormanager.c'], - swig_opts=['-modern'], - language = 'C' - ) - ], - package_dir = {'':'src'}, - py_modules = ['epanet_output'], - - install_requires = [ - 'enum34' - ] -) diff --git a/tools/epanet-output/src/epanet_output.c b/tools/epanet-output/src/epanet_output.c deleted file mode 100644 index eef6957..0000000 --- a/tools/epanet-output/src/epanet_output.c +++ /dev/null @@ -1,1000 +0,0 @@ -//----------------------------------------------------------------------------- -// -// epanet_output.c -- API for reading results from EPANET binary output file -// -// Version: 0.30 -// Date 09/06/2017 -// 06/17/2016 -// 08/05/2014 -// 05/21/2014 -// -// Author: Michael E. Tryby -// US EPA - ORD/NRMRL -// -// Modified: Maurizio Cingi -// University of Modena -// -// Purpose: Output API provides an interface for retrieving results from an -// EPANET binary output file. -// -// Output data in the binary file are aligned on a 4 byte word size. -// Therefore all values both integers and reals are 32 bits in length. -// -// All values returned by the output API are indexed from 0 to n-1. This -// differs from how node and link elements are indexed by the binary file -// writer found in EPANET. Times correspond to reporting periods are indexed -// from 0 to number of reporting periods minus one. Node and link elements -// are indexed from 0 to nodeCount minus one and 0 to linkCount minus one -// respectively. -// -// The Output API functions provide a convenient way to select "slices" of -// data from the output file. As such they return arrays of data. The API -// functions automatically allocate memory for the array to be returned. The -// caller is responsible for deallocating memory. The function ENR_free() is -// provided for that purpose. -// -//----------------------------------------------------------------------------- - -#include "epanet_output.h" - -#include -#include -#include - -#include "errormanager.h" -#include "messages.h" - -// NOTE: These depend on machine data model and may change when porting -// F_OFF Must be a 8 byte / 64 bit integer for large file support -#ifdef _WIN32 // Windows (32-bit and 64-bit) -#define F_OFF __int64 -#else // Other platforms -#define F_OFF off_t -#endif -#define INT4 int // Must be a 4 byte / 32 bit integer type -#define REAL4 float // Must be a 4 byte / 32 bit real type -#define WORDSIZE 4 // Memory alignment 4 byte word size for both int and real - -#define MINNREC 14 // Minimum allowable number of records -#define PROLOGUE 884 // Preliminary fixed length section of header -#define MAXID_P1 32 // EPANET max characters in ID name PLUS 1 -#define MAXMSG_P1 80 // EPANET max characters in message text PLUS 1 - -#define NELEMENTTYPES 5 // Number of element types -#define NENERGYRESULTS 6 // Number of energy results -#define NNODERESULTS 4 // number of result fields for nodes -#define NLINKRESULTS 8 // number of result fields for links -#define NREACTRESULTS 4 // number of net reaction results - -#define MEMCHECK(x) (((x) == NULL) ? 411 : 0 ) - -// Typedefs for opaque pointer -typedef struct data_s { - char name[MAXFNAME+1]; // file path/name - FILE* file; // FILE structure pointer - INT4 nodeCount, tankCount, linkCount, pumpCount, valveCount, nPeriods; - F_OFF outputStartPos; // starting file position of output data - F_OFF bytesPerPeriod; // bytes saved per simulation time period - - error_handle_t* error_handle; -} data_t; - -//----------------------------------------------------------------------------- -// Local functions -//----------------------------------------------------------------------------- -void errorLookup(int errcode, char* errmsg, int length); -int validateFile(ENR_Handle); -float getNodeValue(ENR_Handle, int, int, int); -float getLinkValue(ENR_Handle, int, int, int); - -int _fopen(FILE **f, const char *name, const char *mode); -int _fseek(FILE* stream, F_OFF offset, int whence); -F_OFF _ftell(FILE* stream); - -float* newFloatArray(int n); -int* newIntArray(int n); -char* newCharArray(int n); - - -int EXPORT_OUT_API ENR_init(ENR_Handle* dp_handle) -// Purpose: Initialized pointer for the opaque ENR_Handle. -// -// Returns: Error code 0 on success, -1 on failure -// -// Note: The existence of this function has been carefully considered. -// Don't change it. -// -{ - int errorcode = 0; - data_t* p_data; - - // Allocate memory for private data - p_data = (data_t*)calloc(1, sizeof(data_t)); - - if (p_data != NULL){ - p_data->error_handle = new_errormanager(&errorLookup); - *dp_handle = p_data; - } - else - errorcode = -1; - - // TODO: Need to handle errors during initialization better. - return errorcode; -} - -int EXPORT_OUT_API ENR_close(ENR_Handle* p_handle) -/*------------------------------------------------------------------------ - ** Input: *p_handle = pointer to ENR_Handle struct - ** - ** Returns: Error code 0 on success, -1 on failure - ** - ** Purpose: Close the output binary file, dellocate ENR_Handle struc - ** and nullify pointer to ENR_Handle struct - ** - ** NOTE: ENR_close must be called before program end - ** after calling ENR_close data in ENR_Handle struct are no more - ** accessible - **------------------------------------------------------------------------- - */ -{ - data_t* p_data; - int errorcode = 0; - - p_data = (data_t*)(*p_handle); - - if (p_data == NULL || p_data->file == NULL) - errorcode = -1; - - else - { - dst_errormanager(p_data->error_handle); - fclose(p_data->file); - free(p_data); - - *p_handle = NULL; - } - - return errorcode; -} - -int EXPORT_OUT_API ENR_open(ENR_Handle p_handle, const char* path) -/*------------------------------------------------------------------------ - ** Input: path - ** Output: p_handle = pointer to ENR_Handle struct - ** Returns: warning / error code - ** Purpose: Opens the output binary file and reads prologue and epilogue - ** - ** NOTE: ENR_init must be called before anyother ENR_* functions - **------------------------------------------------------------------------- - */ -{ - int err, errorcode = 0; - F_OFF bytecount; - data_t* p_data; - - p_data = (data_t*)p_handle; - - if (p_data == NULL) return -1; - else - { - strncpy(p_data->name, path, MAXFNAME); - // Attempt to open binary output file for reading only - if ((_fopen(&(p_data->file), path, "rb")) != 0) errorcode = 434; - - // Perform checks to insure the file is valid - else if ((err = validateFile(p_data)) != 0) errorcode = err; - - // If a warning is encountered read file header - if (errorcode < 400 ) { - - // read network size - fseek(p_data->file, 2*WORDSIZE, SEEK_SET); - fread(&(p_data->nodeCount), WORDSIZE, 1, p_data->file); - fread(&(p_data->tankCount), WORDSIZE, 1, p_data->file); - fread(&(p_data->linkCount), WORDSIZE, 1, p_data->file); - fread(&(p_data->pumpCount), WORDSIZE, 1, p_data->file); - fread(&(p_data->valveCount), WORDSIZE, 1, p_data->file); - - // Compute positions and offsets for retrieving data - // fixed portion of header + title section + filenames + chem names - bytecount = PROLOGUE; - // node names + link names - bytecount += MAXID_P1*p_data->nodeCount + MAXID_P1*p_data->linkCount; - // network connectivity + tank nodes + tank areas - bytecount += 3*WORDSIZE*p_data->linkCount + 2*WORDSIZE*p_data->tankCount; - // node elevations + link lengths and link diameters - bytecount += WORDSIZE*p_data->nodeCount + 2*WORDSIZE*p_data->linkCount; - // pump energy summary - bytecount += 7*WORDSIZE*p_data->pumpCount + WORDSIZE; - p_data->outputStartPos= bytecount; - - p_data->bytesPerPeriod = NNODERESULTS*WORDSIZE*p_data->nodeCount + - NLINKRESULTS*WORDSIZE*p_data->linkCount; - } - } - // If error close the binary file - if (errorcode > 400) { - set_error(p_data->error_handle, errorcode); - ENR_close(&p_handle); - } - - return errorcode; -} - -int EXPORT_OUT_API ENR_getVersion(ENR_Handle p_handle, int* version) -/*------------------------------------------------------------------------ - ** Input: p_handle = pointer to ENR_Handle struct - ** Output: version Epanet version - ** Returns: error code - ** - ** Purpose: Returns Epanet version that wrote EBOFile - **--------------element codes------------------------------------------- - */ -{ - int errorcode = 0; - data_t* p_data; - - p_data = (data_t*)p_handle; - - if (p_data == NULL) return -1; - else - { - fseek(p_data->file, 1*WORDSIZE, SEEK_SET); - if (fread(version, WORDSIZE, 1, p_data->file) != 1) - errorcode = 436; - } - - return set_error(p_data->error_handle, errorcode); -} - -int EXPORT_OUT_API ENR_getNetSize(ENR_Handle p_handle, int** elementCount, int* length) -/*------------------------------------------------------------------------ - ** Input: p_handle = pointer to ENR_Handle struct - ** Output: array of element counts (nodes, tanks, links, pumps, valves) - ** Returns: error code - ** Purpose: Returns an array of count values - **------------------------------------------------------------------------- - */ -{ - int errorcode = 0; - int* temp = newIntArray(NELEMENTTYPES); - data_t* p_data; - - p_data = (data_t*)p_handle; - - if (p_data == NULL) return -1; - else - { - temp[0] = p_data->nodeCount; - temp[1] = p_data->tankCount; - temp[2] = p_data->linkCount; - temp[3] = p_data->pumpCount; - temp[4] = p_data->valveCount; - - *elementCount = temp; - *length = NELEMENTTYPES; - } - - return set_error(p_data->error_handle, errorcode); -} - -int EXPORT_OUT_API ENR_getUnits(ENR_Handle p_handle, ENR_Units code, int* unitFlag) -/*------------------------------------------------------------------------ - ** Input: p_handle = pointer to ENR_Handle struct - ** code - ** Output: count - ** Returns: unitFlag - ** Purpose: Returns pressure or flow unit flag - **--------------pressure unit flags---------------------------------------- - ** 0 = psi - ** 1 = meters - ** 2 = kPa - **------------------flow unit flags---------------------------------------- - ** 0 = cubic feet/second - ** 1 = gallons/minute - ** 2 = million gallons/day - ** 3 = Imperial million gallons/day - ** 4 = acre-ft/day - ** 5 = liters/second - ** 6 = liters/minute - ** 7 = megaliters/day - ** 8 = cubic meters/hour - ** 9 = cubic meters/day - **------------------------------------------------------------------------- - */ -{ - int errorcode = 0; - F_OFF offset; - char temp[MAXID_P1]; - data_t* p_data; - - *unitFlag = -1; - - p_data = (data_t*)p_handle; - - if (p_data == NULL) return -1; - else - { - switch (code) - { - case ENR_flowUnits: - _fseek(p_data->file, 9*WORDSIZE, SEEK_SET); - fread(unitFlag, WORDSIZE, 1, p_data->file); - break; - - case ENR_pressUnits: - _fseek(p_data->file, 10*WORDSIZE, SEEK_SET); - fread(unitFlag, WORDSIZE, 1, p_data->file); - break; - - case ENR_qualUnits: - offset = 7*WORDSIZE; - _fseek(p_data->file, offset, SEEK_SET); - fread(unitFlag, WORDSIZE, 1, p_data->file); - - if (*unitFlag == 0) *unitFlag = ENR_NONE; - - else if (*unitFlag == 1) { - offset = 15*WORDSIZE + 3*MAXMSG_P1 + 2*(MAXFNAME+1) + MAXID_P1; - _fseek(p_data->file, offset, SEEK_SET); - fread(temp, MAXID_P1, 1, p_data->file); - - if (!strcmp(temp, "mg/L")) *unitFlag = ENR_MGL; - else *unitFlag = ENR_UGL; - } - - else if (*unitFlag == 2) *unitFlag = ENR_HOURS; - - else *unitFlag = ENR_PRCNT; - - break; - - default: errorcode = 421; - } - } - return set_error(p_data->error_handle, errorcode); -} - -int EXPORT_OUT_API ENR_getTimes(ENR_Handle p_handle, ENR_Time code, int* time) -/*------------------------------------------------------------------------ - ** Input: p_handle = pointer to ENR_Handle struct - ** code = element code - ** Output: time - ** Returns: error code - ** Purpose: Returns report and simulation time related parameters. - **------------------------------------------------------------------------- - */ -{ - int errorcode = 0; - data_t* p_data; - - *time = -1; - - p_data = (data_t*)p_handle; - - if (p_data == NULL) return -1; - else - { - switch (code) - { - case ENR_reportStart: - fseek(p_data->file, 12*WORDSIZE, SEEK_SET); - fread(time, WORDSIZE, 1, p_data->file); - break; - - case ENR_reportStep: - fseek(p_data->file, 13*WORDSIZE, SEEK_SET); - fread(time, WORDSIZE, 1, p_data->file); - break; - - case ENR_simDuration: - fseek(p_data->file, 14*WORDSIZE, SEEK_SET); - fread(time, WORDSIZE, 1, p_data->file); - break; - - case ENR_numPeriods: - *time = p_data->nPeriods; - break; - - default: - errorcode = 421; - } - } - return set_error(p_data->error_handle, errorcode); -} - -int EXPORT_OUT_API ENR_getChemData(ENR_Handle p_handle, char** name, int* length) - -{ - return 0; -} - -int EXPORT_OUT_API ENR_getElementName(ENR_Handle p_handle, ENR_ElementType type, - int elementIndex, char** name, int* length) -/*------------------------------------------------------------------------ - ** Input: p_handle = pointer to ENR_Handle struct - ** type = ENR_node or ENR_link - ** elementIndex from 1 to nodeCount or 1 to linkCount - ** Output: name = elementName - ** Returns: error code - ** Purpose: Retrieves Name of a specified node or link element - ** NOTE: 'name' must be able to hold MAXID characters - ** TODO: Takes EPANET indexing from 1 to n not 0 to n-1 - **------------------------------------------------------------------------- - */ -{ - F_OFF offset; - int errorcode = 0; - char* temp; - data_t* p_data; - - p_data = (data_t*)p_handle; - - if (p_data == NULL) return -1; - /* Allocate memory for name */ - else if MEMCHECK(temp = newCharArray(MAXID_P1)) errorcode = 411; - - else - { - switch (type) - { - case ENR_node: - if (elementIndex < 1 || elementIndex > p_data->nodeCount) - errorcode = 423; - else offset = PROLOGUE + (elementIndex - 1)*MAXID_P1; - break; - - case ENR_link: - if (elementIndex < 1 || elementIndex > p_data->linkCount) - errorcode = 423; - else - offset = PROLOGUE + p_data->nodeCount*MAXID_P1 + - (elementIndex - 1)*MAXID_P1; - break; - - default: - errorcode = 421; - } - - if (!errorcode) - { - _fseek(p_data->file, offset, SEEK_SET); - fread(temp, 1, MAXID_P1, p_data->file); - - *name = temp; - *length = MAXID_P1; - } - } - - return set_error(p_data->error_handle, errorcode); -} - -int EXPORT_OUT_API ENR_getEnergyUsage(ENR_Handle p_handle, int pumpIndex, - int* linkIndex, float** outValues, int* length) -/* - * Purpose: Returns pump energy usage statistics. - * - * Energy usage statistics: - * 0 = pump utilization - * 1 = avg. efficiency - * 2 = avg. kW/flow - * 3 = avg. kwatts - * 4 = peak kwatts - * 5 = cost/day - */ -{ - F_OFF offset; - int errorcode = 0; - float* temp; - data_t* p_data; - - p_data = (data_t*)p_handle; - - if (p_data == NULL) return -1; - // Check for valid pump index - else if (pumpIndex < 1 || pumpIndex > p_data->pumpCount) errorcode = 423; - // Check memory for outValues - else if MEMCHECK(temp = newFloatArray(NENERGYRESULTS)) errorcode = 411; - - else - { - // Position offset to start of pump energy summary - offset = p_data->outputStartPos - (p_data->pumpCount*(WORDSIZE + 6*WORDSIZE) + WORDSIZE); - // Adjust offset by pump index - offset += (pumpIndex - 1)*(WORDSIZE + 6*WORDSIZE); - - // Power summary is 1 int and 6 floats for each pump - _fseek(p_data->file, offset, SEEK_SET); - fread(linkIndex, WORDSIZE, 1, p_data->file); - fread(temp, WORDSIZE, 6, p_data->file); - - *outValues = temp; - *length = NENERGYRESULTS; - } - return set_error(p_data->error_handle, errorcode); -} - -int EXPORT_OUT_API ENR_getNetReacts(ENR_Handle p_handle, float** outValues, int* length) -/* - * Purpose: Returns network wide average reaction rates and average - * source mass inflow: - * 0 = bulk - * 1 = wall - * 2 = tank - * 3 = source - */ -{ - F_OFF offset; - int errorcode = 0; - float* temp; - data_t* p_data; - - p_data = (data_t*)p_handle; - - if (p_data == NULL) return -1; - // Check memory for outValues - else if MEMCHECK(temp = newFloatArray(NREACTRESULTS)) errorcode = 411; - - else - { - // Reaction summary is 4 floats located right before epilogue. - // This offset is relative to the end of the file. - offset = - 3*WORDSIZE - 4*WORDSIZE; - _fseek(p_data->file, offset, SEEK_END); - fread(temp, WORDSIZE, 4, p_data->file); - - *outValues = temp; - *length = NREACTRESULTS; - } - return set_error(p_data->error_handle, errorcode); -} - -void EXPORT_OUT_API ENR_free(void** array) -// -// Purpose: Frees memory allocated by API calls -// -{ - if (array != NULL) { - free(*array); - *array = NULL; - } -} - -int EXPORT_OUT_API ENR_getNodeSeries(ENR_Handle p_handle, int nodeIndex, ENR_NodeAttribute attr, - int startPeriod, int endPeriod, float** outValueSeries, int* dim) -// -// Purpose: Get time series results for particular attribute. Specify series -// start and length using seriesStart and seriesLength respectively. -// -// NOTE: The node index argument corresponds to the EPANET node index from 1 to -// nnodes. The series returned is indexed from 0 to nperiods - 1. -// -{ - int k, length, errorcode = 0; - float* temp; - data_t* p_data; - - p_data = (data_t*)p_handle; - - if (p_data == NULL) return -1; - else if (nodeIndex < 1 || nodeIndex > p_data->nodeCount) errorcode = 423; - else if (startPeriod < 0 || endPeriod >= p_data->nPeriods || - endPeriod <= startPeriod) errorcode = 422; - // Check memory for outValues - else if MEMCHECK(temp = newFloatArray(length = endPeriod - startPeriod)) errorcode = 411; - else - { - // loop over and build time series - for (k = 0; k < length; k++) - temp[k] = getNodeValue(p_handle, startPeriod + k, - nodeIndex, attr); - - *outValueSeries = temp; - *dim = length; - } - return set_error(p_data->error_handle, errorcode); -} - -int EXPORT_OUT_API ENR_getLinkSeries(ENR_Handle p_handle, int linkIndex, ENR_LinkAttribute attr, - int startPeriod, int endPeriod, float** outValueSeries, int* dim) -// -// Purpose: Get time series results for particular attribute. Specify series -// start and length using seriesStart and seriesLength respectively. -// -// NOTE: -// The link index argument corresponds to the EPANET link index from 1 to -// nlinks. The series returned is indexed from 0 to nperiods - 1. -// -{ - int k, length, errorcode = 0; - float* temp; - data_t* p_data; - - p_data = (data_t*)p_handle; - - if (p_data == NULL) return -1; - else if (linkIndex < 1 || linkIndex > p_data->linkCount) errorcode = 423; - else if (startPeriod < 0 || endPeriod >= p_data->nPeriods || - endPeriod <= startPeriod) errorcode = 422; - // Check memory for outValues - else if MEMCHECK(temp = newFloatArray(length = endPeriod - startPeriod)) errorcode = 411; - else - { - // loop over and build time series - for (k = 0; k < length; k++) - temp[k] = getLinkValue(p_handle, startPeriod + k, linkIndex, attr); - - *outValueSeries = temp; - *dim = length; - } - return set_error(p_data->error_handle, errorcode); -} - -int EXPORT_OUT_API ENR_getNodeAttribute(ENR_Handle p_handle, int periodIndex, - ENR_NodeAttribute attr, float** outValueArray, int* length) -// -// Purpose: -// For all nodes at given time, get a particular attribute -// -// Returns: -// Error code -// OutValueArray of results is indexed from 0 to nodeCount -// -// Warning: -// Caller must free memory allocated for outValueArray -// -// NOTE: -// The array returned is indexed from 0 to nnodes - 1. So to access -// node values by their EPANET index, the index value must be -// decremented by one. -// -{ - F_OFF offset; - int errorcode = 0; - float * temp; - data_t* p_data; - - p_data = (data_t*)p_handle; - - if (p_data == NULL) return -1; - // if the time index is out of range return an error - else if (periodIndex < 0 || periodIndex >= p_data->nPeriods) errorcode = 422; - // Check memory for outValues - else if MEMCHECK(temp = newFloatArray(p_data->nodeCount)) errorcode = 411; - - else - { - // calculate byte offset to start time for series - offset = p_data->outputStartPos + (periodIndex)*p_data->bytesPerPeriod; - // add offset for node and attribute - offset += ((attr - 1)*p_data->nodeCount)*WORDSIZE; - - _fseek(p_data->file, offset, SEEK_SET); - fread(temp, WORDSIZE, p_data->nodeCount, p_data->file); - - *outValueArray = temp; - *length = p_data->nodeCount; - } - - return set_error(p_data->error_handle, errorcode); -} - -int EXPORT_OUT_API ENR_getLinkAttribute(ENR_Handle p_handle, int periodIndex, - ENR_LinkAttribute attr, float** outValueArray, int* length) -// -// Purpose: -// For all links at given time, get a particular attribute -// -// Returns: -// Error code -// OutValueArray of results is indexed from 0 to linkCount -// -// Warning: -// Caller must free memory allocated for outValueArray -// -// NOTE: -// The array returned is indexed from 0 to nlinks - 1. So to access -// link values by their EPANET index, the index value must be -// decremented by one. -// -{ - F_OFF offset; - int errorcode = 0; - float* temp; - data_t* p_data; - - p_data = (data_t*)p_handle; - - if (p_data == NULL) return -1; - // if the time index is out of range return an error - else if (periodIndex < 0 || periodIndex >= p_data->nPeriods) errorcode = 422; - // Check memory for outValues - else if MEMCHECK(temp = newFloatArray(p_data->linkCount)) errorcode = 411; - - else - { - // calculate byte offset to start time for series - offset = p_data->outputStartPos + (periodIndex)*p_data->bytesPerPeriod - + (NNODERESULTS*p_data->nodeCount)*WORDSIZE; - // add offset for link and attribute - offset += ((attr - 1)*p_data->linkCount)*WORDSIZE; - - _fseek(p_data->file, offset, SEEK_SET); - fread(temp, WORDSIZE, p_data->linkCount, p_data->file); - - *outValueArray = temp; - *length = p_data->linkCount; - } - - return set_error(p_data->error_handle, errorcode); -} - -int EXPORT_OUT_API ENR_getNodeResult(ENR_Handle p_handle, int periodIndex, - int nodeIndex, float** outValueArray, int* length) -// -// Purpose: For a node at given time, get all attributes. -// -// NOTE: -// -{ - int j, errorcode = 0; - float* temp; - data_t* p_data; - - p_data = (data_t*)p_handle; - - if (p_data == NULL) return -1; - else if (periodIndex < 0 || periodIndex >= p_data->nPeriods) errorcode = 422; - else if (nodeIndex < 1 || nodeIndex > p_data->nodeCount) errorcode = 423; - else if MEMCHECK(temp = newFloatArray(NNODERESULTS)) errorcode = 411; - else - { - for (j = 0; j < NNODERESULTS; j++) - temp[j] = getNodeValue(p_handle, periodIndex, nodeIndex, j); - - *outValueArray = temp; - *length = NNODERESULTS; - } - - return set_error(p_data->error_handle, errorcode); -} - -int EXPORT_OUT_API ENR_getLinkResult(ENR_Handle p_handle, int periodIndex, - int linkIndex, float** outValueArray, int* length) -// -// Purpose: For a link at given time, get all attributes -// -{ - int j, errorcode = 0; - float* temp; - data_t* p_data; - - p_data = (data_t*)p_handle; - - if (p_data == NULL) return -1; - else if (periodIndex < 0 || periodIndex >= p_data->nPeriods) errorcode = 422; - else if (linkIndex < 1 || linkIndex > p_data->linkCount) errorcode = 423; - else if MEMCHECK(temp = newFloatArray(NLINKRESULTS)) errorcode = 411; - else - { - for (j = 0; j < NLINKRESULTS; j++) - temp[j] = getLinkValue(p_handle, periodIndex, linkIndex, j); - - *outValueArray = temp; - *length = NLINKRESULTS; - } - return set_error(p_data->error_handle, errorcode); -} - -void EXPORT_OUT_API ENR_clearError(ENR_Handle p_handle) -{ - data_t* p_data; - - p_data = (data_t*)p_handle; - clear_error(p_data->error_handle); -} - -int EXPORT_OUT_API ENR_checkError(ENR_Handle p_handle, char** msg_buffer) -{ - int errorcode = 0; - char *temp = NULL; - data_t* p_data; - - p_data = (data_t*)p_handle; - - if (p_data == NULL) return -1; - else - { - errorcode = p_data->error_handle->error_status; - if (errorcode) - temp = check_error(p_data->error_handle); - - *msg_buffer = temp; - } - - return errorcode; -} - - -void errorLookup(int errcode, char* dest_msg, int dest_len) -// -// Purpose: takes error code returns error message -// -{ - const char* msg; - - switch (errcode) - { - case 10: msg = WARN10; - break; - case 411: msg = ERR411; - break; - case 412: msg = ERR412; - break; - case 421: msg = ERR421; - break; - case 422: msg = ERR422; - break; - case 423: msg = ERR423; - break; - case 434: msg = ERR434; - break; - case 435: msg = ERR435; - break; - case 436: msg = ERR436; - break; - default: msg = ERRERR; - } - - strncpy(dest_msg, msg, MSG_MAXLEN); -} - -int validateFile(ENR_Handle p_handle) -// Returns: -// Error code: 435, 436 -// Warning code: 10 -{ - INT4 magic1, magic2, hydcode; - int errorcode = 0; - F_OFF filepos; - data_t* p_data; - - p_data = (data_t*)p_handle; - - // Read magic number from beginning of file - fseek(p_data->file, 0L, SEEK_SET); - fread(&magic1, WORDSIZE, 1, p_data->file); - - // Fast forward to end and read file epilogue - fseek(p_data->file, -3*WORDSIZE, SEEK_END); - fread(&(p_data->nPeriods), WORDSIZE, 1, p_data->file); - fread(&hydcode, WORDSIZE, 1, p_data->file); - fread(&magic2, WORDSIZE, 1, p_data->file); - - filepos = _ftell(p_data->file); - - // Is the file an EPANET binary file? - if (magic1 != magic2) errorcode = 435; - // Does the binary file contain results? - else if (filepos < MINNREC*WORDSIZE || p_data->nPeriods == 0) - errorcode = 436; - // Issue warning if there were problems with the model run. - else if (hydcode != 0) errorcode = 10; - - return errorcode; -} - -float getNodeValue(ENR_Handle p_handle, int periodIndex, int nodeIndex, - int attr) -// -// Purpose: Retrieves an attribute value at a specified node and time -// -{ - F_OFF offset; - REAL4 y; - data_t* p_data; - - p_data = (data_t*)p_handle; - - // calculate byte offset to start time for series - offset = p_data->outputStartPos + periodIndex*p_data->bytesPerPeriod; - // add byte position for attribute and node - offset += ((attr - 1)*p_data->nodeCount + (nodeIndex - 1))*WORDSIZE; - - _fseek(p_data->file, offset, SEEK_SET); - fread(&y, WORDSIZE, 1, p_data->file); - - return y; -} - -float getLinkValue(ENR_Handle p_handle, int periodIndex, int linkIndex, - int attr) -// -// Purpose: Retrieves an attribute value at a specified link and time -// -{ - F_OFF offset; - REAL4 y; - data_t* p_data; - - p_data = (data_t*)p_handle; - - // Calculate byte offset to start time for series - offset = p_data->outputStartPos + periodIndex*p_data->bytesPerPeriod - + (NNODERESULTS*p_data->nodeCount)*WORDSIZE; - // add byte position for attribute and link - offset += ((attr - 1)*p_data->linkCount + (linkIndex - 1))*WORDSIZE; - - _fseek(p_data->file, offset, SEEK_SET); - fread(&y, WORDSIZE, 1, p_data->file); - - return y; -} - -int _fopen(FILE **f, const char *name, const char *mode) { - // - // Purpose: Substitute for fopen_s on platforms where it doesn't exist - // Note: fopen_s is part of C++11 standard - // - int ret = 0; -#ifdef _WIN32 - ret = (int)fopen_s(f, name, mode); -#else - *f = fopen(name, mode); - if (!*f) - ret = -1; -#endif - return ret; -} - -int _fseek(FILE* stream, F_OFF offset, int whence) -// -// Purpose: Selects platform fseek() for large file support -// -{ -#ifdef _WIN32 // Windows (32-bit and 64-bit) -#define FSEEK64 _fseeki64 -#else // Other platforms -#define FSEEK64 fseeko -#endif - - return FSEEK64(stream, offset, whence); -} - -F_OFF _ftell(FILE* stream) -// -// Purpose: Selects platform ftell() for large file support -// -{ -#ifdef _WIN32 // Windows (32-bit and 64-bit) -#define FTELL64 _ftelli64 -#else // Other platforms -#define FTELL64 ftello -#endif - - return FTELL64(stream); -} - -float* newFloatArray(int n) -// -// Warning: Caller must free memory allocated by this function. -// -{ - return (float*) malloc((n)*sizeof(float)); -} - -int* newIntArray(int n) -// -// Warning: Caller must free memory allocated by this function. -// -{ - return (int*) malloc((n)*sizeof(int)); -} - -char* newCharArray(int n) -// -// Warning: Caller must free memory allocated by this function. -// -{ - return (char*) malloc((n)*sizeof(char)); -} diff --git a/tools/epanet-output/src/epanet_output.i b/tools/epanet-output/src/epanet_output.i deleted file mode 100644 index 8a239d6..0000000 --- a/tools/epanet-output/src/epanet_output.i +++ /dev/null @@ -1,203 +0,0 @@ -/* - * epanet_output.i - SWIG interface description file for EPANET Output API - * - * Created: 9/20/2017 - * - * Author: Michael E. Tryby - * US EPA - ORD/NRMRL - * -*/ -%module epanet_output -%{ -#include "errormanager.h" -#include "messages.h" -#include "epanet_output.h" - -#define SWIG_FILE_WITH_INIT -%} - -%include "typemaps.i" - -/* DEFINE AND TYPEDEF MUST BE INCLUDED */ -#define MAXMSG 53 - -typedef void* ENR_Handle; - - -%include "epanet_output_enums.h" - - -/* TYPEMAPS FOR OPAQUE POINTER */ -/* Used for functions that output a new opaque pointer */ -%typemap(in, numinputs=0) ENR_Handle* p_handle_out (ENR_Handle retval) -{ - /* OUTPUT in */ - retval = NULL; - $1 = &retval; -} -/* used for functions that take in an opaque pointer (or NULL) -and return a (possibly) different pointer */ -%typemap(argout) ENR_Handle* p_handle_out -{ - /* OUTPUT argout */ - %append_output(SWIG_NewPointerObj(SWIG_as_voidptr(retval$argnum), $1_descriptor, 0)); -} -/* No need for special IN typemap for opaque pointers, it works anyway */ - - -/* TYPEMAP FOR IGNORING INT ERROR CODE RETURN VALUE */ -%typemap(out) int { - $result = Py_None; - Py_INCREF($result); -} - -/* TYPEMAPS FOR INT ARGUMENT AS RETURN VALUE */ -%typemap(in, numinputs=0) int* int_out (int temp) { - $1 = &temp; -} -%typemap(argout) int* int_out { - %append_output(PyInt_FromLong(*$1)); -} - -/* TYPEMAP FOR MEMORY MANAGEMENT AND ENCODING OF STRINGS */ -%typemap(in, numinputs=0)char** string_out (char* temp), int* slen (int temp){ - $1 = &temp; -} -%typemap(argout)(char** string_out, int* slen) { - if (*$1) { - PyObject* o; - o = PyUnicode_FromStringAndSize(*$1, *$2); - - $result = SWIG_Python_AppendOutput($result, o); - free(*$1); - } -} - -/* TYPEMAPS FOR MEMORY MANAGEMNET OF FLOAT ARRAYS */ -%typemap(in, numinputs=0)float** float_out (float* temp), int* int_dim (int temp){ - $1 = &temp; -} -%typemap(argout) (float** float_out, int* int_dim) { - if (*$1) { - PyObject *o = PyList_New(*$2); - int i; - float* temp = *$1; - for(i=0; i<*$2; i++) { - PyList_SetItem(o, i, PyFloat_FromDouble((double)temp[i])); - } - $result = SWIG_Python_AppendOutput($result, o); - free(*$1); - } -} - -/* TYPEMAPS FOR MEMORY MANAGEMENT OF INT ARRAYS */ -%typemap(in, numinputs=0)int** int_out (long* temp), int* int_dim (int temp){ - $1 = &temp; -} -%typemap(argout) (int** int_out, int* int_dim) { - if (*$1) { - PyObject *o = PyList_New(*$2); - int i; - long* temp = *$1; - for(i=0; i<*$2; i++) { - PyList_SetItem(o, i, PyInt_FromLong(temp[i])); - } - $result = SWIG_Python_AppendOutput($result, o); - free(*$1); - } -} - -/* TYPEMAP FOR ENUMERATED TYPES */ -%typemap(in) EnumeratedType (int val, int ecode = 0) { - if (PyObject_HasAttrString($input,"value")) { - PyObject* o; - o = PyObject_GetAttrString($input, "value"); - ecode = SWIG_AsVal_int(o, &val); - } - else { - SWIG_exception_fail(SWIG_ArgError(ecode), "in method '" "$symname" "', argument " "$argnum"" of type '" "$ltype""'"); - } - - $1 = ($1_type)(val); -} -%apply EnumeratedType {ENR_ElementType, ENR_Units, ENR_Time, ENR_NodeAttribute, ENR_LinkAttribute} - - -/* RENAME FUNCTIONS PYTHON STYLE */ -%rename("%(undercase)s") ""; - -/* INSERTS CUSTOM EXCEPTION HANDLING IN WRAPPER */ -%exception -{ - char* err_msg; - ENR_clearError(arg1); - $function - if (ENR_checkError(arg1, &err_msg)) - { - PyErr_SetString(PyExc_Exception, err_msg); - SWIG_fail; - } -} -/* INSERT EXCEPTION HANDLING FOR THESE FUNCTIONS */ -int ENR_open(ENR_Handle p_handle, const char* path); - -int ENR_getVersion(ENR_Handle p_handle, int* int_out); -int ENR_getNetSize(ENR_Handle p_handle, int** int_out, int* int_dim); -int ENR_getUnits(ENR_Handle p_handle, ENR_Units t_enum, int* int_out); -int ENR_getTimes(ENR_Handle p_handle, ENR_Time t_enum, int* int_out); -int ENR_getElementName(ENR_Handle p_handle, ENR_ElementType t_enum, - int elementIndex, char** string_out, int* slen); -int ENR_getEnergyUsage(ENR_Handle p_handle, int pumpIndex, - int* int_out, float** float_out, int* int_dim); -int ENR_getNetReacts(ENR_Handle p_handle, float** float_out, int* int_dim); - - -int ENR_getNodeAttribute(ENR_Handle p_handle, int periodIndex, - ENR_NodeAttribute t_enum, float** float_out, int* int_dim); -int ENR_getLinkAttribute(ENR_Handle p_handle, int periodIndex, - ENR_LinkAttribute t_enum, float** float_out, int* int_dim); -%exception; - -/* NO EXCEPTION HANDLING FOR THESE FUNCTIONS */ -int ENR_init(ENR_Handle* p_handle_out); -int ENR_close(ENR_Handle* p_handle_out); -void ENR_free(void** array); - -void ENR_clearError(ENR_Handle p_handle); -int ENR_checkError(ENR_Handle p_handle, char** msg_buffer); - - -/* CODE ADDED DIRECTLY TO SWIGGED INTERFACE MODULE */ -%pythoncode%{ -import enum - -class ElementType(enum.Enum): - NODE = ENR_node - LINK = ENR_link - -class Units(enum.Enum): - FLOW_UNIT = ENR_flowUnits - PRESS_UNIT = ENR_pressUnits - -class Time(enum.Enum): - REPORT_START = ENR_reportStart - REPORT_STEP = ENR_reportStep - SIM_DURATION = ENR_simDuration - NUM_PERIODS = ENR_numPeriods - -class NodeAttribute(enum.Enum): - DEMAND = ENR_demand - HEAD = ENR_head - PRESSURE = ENR_pressure - QUALITY = ENR_quality - -class LinkAttribute(enum.Enum): - FLOW = ENR_flow - VELOCITY = ENR_velocity - HEADLOSS = ENR_headloss - AVG_QUALITY = ENR_avgQuality - STATUS = ENR_status - SETTING = ENR_setting - RX_RATE = ENR_rxRate - FRCTN_FCTR = ENR_frctnFctr -%} diff --git a/tools/epanet-output/src/errormanager.c b/tools/epanet-output/src/errormanager.c deleted file mode 100644 index 49e41db..0000000 --- a/tools/epanet-output/src/errormanager.c +++ /dev/null @@ -1,74 +0,0 @@ -//----------------------------------------------------------------------------- -// -// errormanager.c -// -// Purpose: Provides a simple interface for managing runtime error messages. -// -// Date: 08/25/2017 -// -// Author: Michael E. Tryby -// US EPA - ORD/NRMRL -//----------------------------------------------------------------------------- -#include -#include -#include "errormanager.h" - -error_handle_t* new_errormanager(void (*p_error_message)(int, char*, int)) -// -// Purpose: Constructs a new error handle. -// -{ - error_handle_t* error_handle; - error_handle = (error_handle_t*)calloc(1, sizeof(error_handle_t)); - - error_handle->p_msg_lookup = p_error_message; - - return error_handle; -} - -void dst_errormanager(error_handle_t* error_handle) -// -// Purpose: Destroys the error handle. -// -{ - free(error_handle); -} - -int set_error(error_handle_t* error_handle, int errorcode) -// -// Purpose: Sets an error code in the handle. -// -{ - // If the error code is 0 no action is taken and 0 is returned. - // This is a feature not a bug. - if (errorcode) - error_handle->error_status = errorcode; - - return errorcode; -} - -char* check_error(error_handle_t* error_handle) -// -// Purpose: Returns the error message or NULL. -// -// Note: Caller must free memory allocated by check_error -// -{ - char* temp = NULL; - - if (error_handle->error_status != 0) { - temp = (char*) calloc(ERR_MAXMSG, sizeof(char)); - - if (temp) - error_handle->p_msg_lookup(error_handle->error_status, temp, ERR_MAXMSG); - } - return temp; -} - -void clear_error(error_handle_t* error_handle) -// -// Purpose: Clears the error from the handle. -// -{ - error_handle->error_status = 0; -} diff --git a/tools/epanet-output/src/errormanager.h b/tools/epanet-output/src/errormanager.h deleted file mode 100644 index d62b6a3..0000000 --- a/tools/epanet-output/src/errormanager.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * errormanager.h - * - * Created on: Aug 25, 2017 - * - * Author: Michael E. Tryby - * US EPA - ORD/NRMRL - */ - -#ifndef ERRORMANAGER_H_ -#define ERRORMANAGER_H_ - -#define ERR_MAXMSG 256 - -typedef struct error_s { - int error_status; - void (*p_msg_lookup)(int, char*, int); -} error_handle_t; - -error_handle_t* new_errormanager(void (*p_error_message)(int, char*, int)); -void dst_errormanager(error_handle_t* error_handle); - -int set_error(error_handle_t* error_handle, int errorcode); -char* check_error(error_handle_t* error_handle); -void clear_error(error_handle_t* error_handle); - -#endif /* ERRORMANAGER_H_ */ diff --git a/tools/epanet-output/src/messages.h b/tools/epanet-output/src/messages.h deleted file mode 100644 index bc04a7d..0000000 --- a/tools/epanet-output/src/messages.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * messages.h - EPANET - * - * Created on: June 1, 2017 - * - * Author: Michael E. Tryby - * US EPA - ORD/NRMRL - */ - -#ifndef MESSAGES_H_ -#define MESSAGES_H_ -/*------------------- Error Messages --------------------*/ -#define MSG_MAXLEN 53 - -#define WARN10 "Warning: model run issued warnings" - -#define ERR411 "Input Error 411: no memory allocated for results" -#define ERR412 "Input Error 412: binary file hasn't been opened" -#define ERR421 "Input Error 421: invalid parameter code" -#define ERR422 "Input Error 422: reporting period index out of range" -#define ERR423 "Input Error 423: element index out of range" - -#define ERR434 "File Error 434: unable to open binary file" -#define ERR435 "File Error 435: invalid binary file type" -#define ERR436 "File Error 436: no results in binary file" - -#define ERRERR "Error: An unknown error has occurred" - -#endif /* MESSAGES_H_ */ diff --git a/tools/epanet-output/test/data/__init__.py b/tools/epanet-output/test/data/__init__.py deleted file mode 100644 index ca2e575..0000000 --- a/tools/epanet-output/test/data/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# -*- coding: utf-8 -*- - -# __init__.py -# -# Created: 11/13/2017 -# Author: Michael E. Tryby -# US EPA - ORD/NRMRL -# - -import os - -DATA_PATH = os.path.abspath(os.path.dirname(__file__)) - -OUTPUT_FILE_EXAMPLE1 = os.path.join(DATA_PATH, 'net1.out') diff --git a/tools/epanet-output/test/data/net1.out b/tools/epanet-output/test/data/net1.out deleted file mode 100644 index 6cede26b23767e4bd91a30d2ccaba14f34904ba3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16832 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 VZ{1BMO!v?feK@&oH21$7{s%(sdMW?_ diff --git a/tools/epanet-output/test/test_epanet_output.cpp b/tools/epanet-output/test/test_epanet_output.cpp deleted file mode 100644 index ed4f79d..0000000 --- a/tools/epanet-output/test/test_epanet_output.cpp +++ /dev/null @@ -1,251 +0,0 @@ -/* - * test_epanet_output.cpp - * - * Created: 8/4/2017 - * Author: Michael E. Tryby - * US EPA - ORD/NRMRL - * - * Unit testing for EPANET Output API using google test. -*/ - -#include -#include -#include -#include "gtest/gtest.h" - -#include "../src/epanet_output.h" - -#define PROJECT_HOME "C:/Users/mtryby/Workspace/GitRepo/michaeltryby/epanet/" -#define DATA_PATH "tools/epanet-output/test/data/net1.out" - - -namespace { - -TEST(ENR_init, InitTest) { - ENR_Handle p_handle; - - int error = ENR_init(&p_handle); - ASSERT_EQ(0, error); - ASSERT_TRUE(p_handle != NULL); -} - -TEST(ENR_open, OpenTest) { - std::string path = std::string(PROJECT_HOME) + std::string(DATA_PATH); - ENR_Handle p_handle; - ENR_init(&p_handle); - - int error = ENR_open(p_handle, path.c_str()); - ASSERT_EQ(0, error); - ENR_close(&p_handle); -} - -TEST(ENR_close, CloseTest) { - ENR_Handle p_handle; - int error = ENR_init(&p_handle); - - error = ENR_close(&p_handle); - ASSERT_EQ(-1, error); - ASSERT_TRUE(p_handle != NULL); -} - - - -class OutputapiTest : public testing::Test { -protected: - // SetUp for OutputapiTest fixture - virtual void SetUp() { - std::string path = std::string(PROJECT_HOME) + std::string(DATA_PATH); - - error = ENR_init(&p_handle); - ENR_clearError(p_handle); - error = ENR_open(p_handle, path.c_str()); - } - - // TearDown for OutputapiTest fixture - virtual void TearDown() { - ENR_free((void**)&array); - error = ENR_close(&p_handle); - } - - int error = 0; - ENR_Handle p_handle = NULL; - - float* array = NULL; - int array_dim = 0; -}; - -TEST_F(OutputapiTest, getNetSizeTest) { - int* i_array = NULL; - // nodes, tanks, links, pumps, valves - int ref_array[5] = {11,2,13,1,0}; - - error = ENR_getNetSize(p_handle, &i_array, &array_dim); - ASSERT_EQ(0, error); - - for (int i = 0; i < array_dim; i++) - EXPECT_EQ(ref_array[i], i_array[i]); - - ENR_free((void**)&i_array); -} - -TEST_F(OutputapiTest, getElementName) { - char* name = new char[MAXID]; - int length, index = 1; - - error = ENR_getElementName(p_handle, ENR_node, index, &name, &length); - ASSERT_EQ(0, error); - - EXPECT_STREQ("10", name); - - delete(name); -} - -TEST_F(OutputapiTest, getNodeAttributeTest) { - float ref_array[11] = { 1.0, - 0.44407997, - 0.43766347, - 0.42827705, - 0.41342604, - 0.42804748, - 0.44152543, - 0.40502965, - 0.38635802, - 1.0, - 0.96745253 }; - - error = ENR_getNodeAttribute(p_handle, 1, ENR_quality, &array, &array_dim); - ASSERT_EQ(0, error); - - for (int i = 0; i < array_dim; i++) - EXPECT_FLOAT_EQ(ref_array[i], array[i]); -} - -TEST_F(OutputapiTest, getLinkAttributeTest) { - float ref_array[13] = { 1848.5812, - 1220.4274, - 130.11162, - 187.6893, - 119.8884, - 40.464489, - -748.58112, - 478.15378, - 191.73459, - 30.111609, - 140.46449, - 59.535515, - 1848.5812}; - - error = ENR_getLinkAttribute(p_handle, 1, ENR_flow, &array ,&array_dim); - ASSERT_EQ(0, error); - - for (int i = 0; i < array_dim; i++) - EXPECT_FLOAT_EQ(ref_array[i], array[i]); -} - -TEST_F(OutputapiTest, getNodeResultTest) { - float ref_array[4] = {0.041142918, - 150.0, - 987.98358, - 120.45029}; - - error = ENR_getNodeResult(p_handle, 1, 2, &array, &array_dim); - ASSERT_EQ(0, error); - - for (int i = 0; i < array_dim; i++) - EXPECT_FLOAT_EQ(ref_array[i], array[i]); -} - -TEST_F(OutputapiTest, getLinkResultTest) { - float ref_array[8] = {0.58586824, - 1892.2433, - 0.0, - -200.71875, - 1.0, - 3.0, - 1.0, - 0.0}; - - error = ENR_getLinkResult(p_handle, 24, 13, &array, &array_dim); - ASSERT_EQ(0, error); - - for (int i = 0; i < array_dim; i++) - EXPECT_FLOAT_EQ(ref_array[i], array[i]); -} - -TEST_F(OutputapiTest, getNodeSeriesTest){ - float ref_array[10] = {119.25731, - 120.45029, - 121.19854, - 122.00622, - 122.37414, - 122.8122, - 122.82034, - 122.90379, - 123.40434, - 123.81807}; - - error = ENR_getNodeSeries(p_handle, 2, ENR_pressure, 0, 10, &array, &array_dim); - ASSERT_EQ(0, error); - - for (int i = 0; i < array_dim; i++) - EXPECT_FLOAT_EQ(ref_array[i], array[i]); -} - -TEST_F(OutputapiTest, getLinkSeriesTest) { - float ref_array[10] = {1234.2072, - 1220.4274, - 1164.4, - 1154.8175, - 1100.0635, - 1094.759, - 1041.7854, - 1040.7617, - 1087.556, - 1082.5011}; - - error = ENR_getLinkSeries(p_handle, 2, ENR_flow, 0, 10, &array, &array_dim); - ASSERT_EQ(0, error); - - for (int i = 0; i < array_dim; i++) - EXPECT_FLOAT_EQ(ref_array[i], array[i]); -} - -TEST_F(OutputapiTest, getNetReactsTest) { - float ref_array[4] = {18806.59, - 85424.438, - 115174.05, - 238972.66}; - - error = ENR_getNetReacts(p_handle, &array, &array_dim); - ASSERT_EQ(0, error); - - for (int i = 0; i < array_dim; i++) - EXPECT_FLOAT_EQ(ref_array[i], array[i]); -} - -TEST_F(OutputapiTest, getEnergyUsageTest) { - float ref_array[6] = {57.712959, - 75.0, - 880.41583, - 96.254318, - 96.707115, - 0.0}; - - int linkIdx; - - error = ENR_getEnergyUsage(p_handle, 1, &linkIdx, &array, &array_dim); - ASSERT_EQ(0, error); - - for (int i = 0; i < array_dim; i++) - EXPECT_FLOAT_EQ(ref_array[i], array[i]); -} - -} - -GTEST_API_ int main(int argc, char **argv) { - - printf("Running main() from gtest_main.cc\n"); - testing::InitGoogleTest(&argc, argv); - - return RUN_ALL_TESTS(); -}