From 9ba82f11429bfd8e1855baaffc0000307907d856 Mon Sep 17 00:00:00 2001 From: Seweryn Kokot Date: Thu, 28 Oct 2021 21:05:22 +0200 Subject: [PATCH] Add getNodeLoadData output command --- SRC/domain/node/NodalLoad.cpp | 2 - SRC/interpreter/OpenSeesCommands.h | 1 + SRC/interpreter/OpenSeesOutputCommands.cpp | 72 ++++++++++++++++++++++ SRC/interpreter/PythonWrapper.cpp | 13 ++++ SRC/interpreter/TclWrapper.cpp | 10 +++ SRC/tcl/commands.cpp | 68 ++++++++++++++++++++ SRC/tcl/commands.h | 3 + 7 files changed, 167 insertions(+), 2 deletions(-) diff --git a/SRC/domain/node/NodalLoad.cpp b/SRC/domain/node/NodalLoad.cpp index f5a937f01..318075eeb 100644 --- a/SRC/domain/node/NodalLoad.cpp +++ b/SRC/domain/node/NodalLoad.cpp @@ -334,8 +334,6 @@ NodalLoad::applyLoad(Vector& loadFactors) { const Vector& NodalLoad::getData(int& type) { - // Vector* Empty = new Vector(); - // return *Empty; return *load; } diff --git a/SRC/interpreter/OpenSeesCommands.h b/SRC/interpreter/OpenSeesCommands.h index 31ba3368d..7945a0d58 100644 --- a/SRC/interpreter/OpenSeesCommands.h +++ b/SRC/interpreter/OpenSeesCommands.h @@ -290,6 +290,7 @@ int OPS_getEleLoadClassTags(); int OPS_getEleLoadTags(); int OPS_getEleLoadData(); int OPS_getNodeLoadTags(); +int OPS_getNodeLoadData(); // Sensitivity:END ///////////////////////////////////////////// /* OpenSeesMiscCommands.cpp */ diff --git a/SRC/interpreter/OpenSeesOutputCommands.cpp b/SRC/interpreter/OpenSeesOutputCommands.cpp index 996750b7c..3be606cde 100644 --- a/SRC/interpreter/OpenSeesOutputCommands.cpp +++ b/SRC/interpreter/OpenSeesOutputCommands.cpp @@ -3575,6 +3575,78 @@ int OPS_getNodeLoadTags() return 0; } +int OPS_getNodeLoadData() +{ + Domain* theDomain = OPS_GetDomain(); + if (theDomain == 0) return -1; + + int numdata = OPS_GetNumRemainingInputArgs(); + + std::vector data; + + if (numdata < 1) { + LoadPattern *thePattern; + LoadPatternIter &thePatterns = theDomain->getLoadPatterns(); + + int typeEL; + + while ((thePattern = thePatterns()) != 0) { + NodalLoadIter &theNodLoads = thePattern->getNodalLoads(); + NodalLoad* theNodLoad; + + while ((theNodLoad = theNodLoads()) != 0) { + const Vector &nodeLoadData = theNodLoad->getData(typeEL); + + int nodeLoadDataSize = nodeLoadData.Size(); + for (int i = 0; i < nodeLoadDataSize; i++) { + data.push_back(nodeLoadData(i)); + } + } + } + + } else if (numdata == 1) { + + int patternTag; + if (OPS_GetIntInput(&numdata, &patternTag) < 0) { + opserr << "could not read patternTag\n"; + return -1; + } + + LoadPattern* thePattern = theDomain->getLoadPattern(patternTag); + if (thePattern == nullptr) { + opserr << "ERROR load pattern with tag " << patternTag << " not found in domain -- getNodeLoadData\n"; + return -1; + } + NodalLoadIter& theNodLoads = thePattern->getNodalLoads(); + NodalLoad* theNodLoad; + + int typeEL; + + while ((theNodLoad = theNodLoads()) != 0) { + const Vector &nodeLoadData = theNodLoad->getData(typeEL); + + int nodeLoadDataSize = nodeLoadData.Size(); + for (int i = 0; i < nodeLoadDataSize; i++) { + data.push_back(nodeLoadData(i)); + } + } + + } else { + opserr << "WARNING want - getNodeLoadData \n"; + return -1; + } + + int size = data.size(); + + if (OPS_SetDoubleOutput(&size, data.data(), false) < 0) { + opserr << "WARNING failed to set output\n"; + return -1; + } + + return 0; +} + + int OPS_getNumElements() { Domain* theDomain = OPS_GetDomain(); diff --git a/SRC/interpreter/PythonWrapper.cpp b/SRC/interpreter/PythonWrapper.cpp index bb197ee1e..6cbf83bb1 100644 --- a/SRC/interpreter/PythonWrapper.cpp +++ b/SRC/interpreter/PythonWrapper.cpp @@ -2100,6 +2100,18 @@ static PyObject *Py_ops_getNodeLoadTags(PyObject *self, PyObject *args) return wrapper->getResults(); } +static PyObject *Py_ops_getNodeLoadData(PyObject *self, PyObject *args) +{ + wrapper->resetCommandLine(PyTuple_Size(args), 1, args); + + if (OPS_getNodeLoadData() < 0) { + opserr<<(void*)0; + return NULL; + } + + return wrapper->getResults(); +} + static PyObject *Py_ops_randomVariable(PyObject *self, PyObject *args) { wrapper->resetCommandLine(PyTuple_Size(args), 1, args); @@ -2519,6 +2531,7 @@ PythonWrapper::addOpenSeesCommands() addCommand("getEleLoadTags", &Py_ops_getEleLoadTags); addCommand("getEleLoadData", &Py_ops_getEleLoadData); addCommand("getNodeLoadTags", &Py_ops_getNodeLoadTags); + addCommand("getNodeLoadData", &Py_ops_getNodeLoadData); addCommand("randomVariable", &Py_ops_randomVariable); addCommand("getRVTags", &Py_ops_getRVTags); addCommand("getMean", &Py_ops_getRVMean); diff --git a/SRC/interpreter/TclWrapper.cpp b/SRC/interpreter/TclWrapper.cpp index 0c56dfcb0..da18d7d9a 100644 --- a/SRC/interpreter/TclWrapper.cpp +++ b/SRC/interpreter/TclWrapper.cpp @@ -1370,6 +1370,15 @@ static int Tcl_ops_getNodeLoadTags(ClientData clientData, Tcl_Interp *interp, in return TCL_OK; } +static int Tcl_ops_getNodeLoadData(ClientData clientData, Tcl_Interp *interp, int argc, TCL_Char **argv) +{ + wrapper->resetCommandLine(argc, 1, argv); + + if (OPS_getNodeLoadData() < 0) return TCL_ERROR; + + return TCL_OK; +} + static int Tcl_ops_randomVariable(ClientData clientData, Tcl_Interp *interp, int argc, TCL_Char **argv) { wrapper->resetCommandLine(argc, 1, argv); @@ -1721,6 +1730,7 @@ TclWrapper::addOpenSeesCommands(Tcl_Interp* interp) addCommand(interp,"getEleLoadTags", &Tcl_ops_getEleLoadTags); addCommand(interp,"getEleLoadData", &Tcl_ops_getEleLoadData); addCommand(interp,"getNodeLoadTags", &Tcl_ops_getNodeLoadTags); + addCommand(interp,"getNodeLoadData", &Tcl_ops_getNodeLoadData); addCommand(interp,"randomVariable", &Tcl_ops_randomVariable); addCommand(interp,"getRVTags", &Tcl_ops_getRVTags); addCommand(interp,"getMean", &Tcl_ops_getRVMean); diff --git a/SRC/tcl/commands.cpp b/SRC/tcl/commands.cpp index f3392b427..af562876c 100644 --- a/SRC/tcl/commands.cpp +++ b/SRC/tcl/commands.cpp @@ -1038,6 +1038,8 @@ int OpenSeesAppInit(Tcl_Interp *interp) { (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "getNodeLoadTags", &getNodeLoadTags, (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); + Tcl_CreateCommand(interp, "getNodeLoadData", &getNodeLoadData, + (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); Tcl_CreateCommand(interp, "sdfResponse", &sdfResponse, (ClientData)NULL, (Tcl_CmdDeleteProc *)NULL); @@ -9197,6 +9199,72 @@ getNodeLoadTags(ClientData clientData, Tcl_Interp *interp, int argc, TCL_Char ** return TCL_OK; } +int +getNodeLoadData(ClientData clientData, Tcl_Interp *interp, int argc, TCL_Char **argv) +{ + + if (argc == 1) { + LoadPattern *thePattern; + LoadPatternIter &thePatterns = theDomain.getLoadPatterns(); + + char buffer[40]; + int typeEL; + + while ((thePattern = thePatterns()) != 0) { + NodalLoadIter &theNodeLoads = thePattern->getNodalLoads(); + NodalLoad *theNodLoad; + + while ((theNodLoad = theNodeLoads()) != 0) { + const Vector &eleLoadData = theNodLoad->getData(typeEL); + + int eleLoadDataSize = eleLoadData.Size(); + opserr << "eleLoadDataSize: "<< eleLoadDataSize << "\n"; + for (int i = 0; i < eleLoadDataSize; i++) { + sprintf(buffer, "%35.20f ", eleLoadData(i)); + Tcl_AppendResult(interp, buffer, NULL); + } + } + } + + } else if (argc == 2) { + int patternTag; + + if (Tcl_GetInt(interp, argv[1], &patternTag) != TCL_OK) { + opserr << "WARNING getNodeLoadData -- could not read patternTag \n"; + return TCL_ERROR; + } + + LoadPattern *thePattern = theDomain.getLoadPattern(patternTag); + if (thePattern == nullptr) { + opserr << "ERROR load pattern with tag " << patternTag << " not found in domain -- getNodeLoadData\n"; + return TCL_ERROR; + } + + NodalLoadIter theNodeLoads = thePattern->getNodalLoads(); + NodalLoad* theNodLoad; + + int typeEL; + char buffer[40]; + + while ((theNodLoad = theNodeLoads()) != 0) { + const Vector &eleLoadData = theNodLoad->getData(typeEL); + + int eleLoadDataSize = eleLoadData.Size(); + for (int i = 0; i < eleLoadDataSize; i++) { + sprintf(buffer, "%35.20f ", eleLoadData(i)); + Tcl_AppendResult(interp, buffer, NULL); + } + + } + + } else { + opserr << "WARNING want - getNodeLoadTags \n" << endln; + return TCL_ERROR; + } + + return TCL_OK; +} + int getEleTags(ClientData clientData, Tcl_Interp *interp, int argc, TCL_Char **argv) { diff --git a/SRC/tcl/commands.h b/SRC/tcl/commands.h index 140e37170..eed9426ea 100644 --- a/SRC/tcl/commands.h +++ b/SRC/tcl/commands.h @@ -299,6 +299,9 @@ getEleLoadData(ClientData clientData, Tcl_Interp *interp, int argc, TCL_Char **a int getNodeLoadTags(ClientData clientData, Tcl_Interp *interp, int argc, TCL_Char **argv); +int +getNodeLoadData(ClientData clientData, Tcl_Interp *interp, int argc, TCL_Char **argv); + int startTimer(ClientData clientData, Tcl_Interp *interp, int argc, TCL_Char **argv);