From ea125f14bfc701f7f93f26ddefde73257e6bf658 Mon Sep 17 00:00:00 2001 From: Federico Bergero Date: Tue, 10 May 2011 15:29:47 +0000 Subject: [PATCH] Runtime for the QSS methods git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@8913 f25d12d1-65f4-0310-ae8a-bbce733d8d8e --- c_runtime/Makefile.common | 2 +- c_runtime/solver_qss/integrator.cpp | 52 ++++++++++++--------- c_runtime/solver_qss/integrator.h | 1 + c_runtime/solver_qss/runtime.h | 9 ++-- c_runtime/solver_qss/solver_qss.cpp | 10 ++--- c_runtime/solver_qss/static_function.cpp | 57 +++++++++++++++++++----- c_runtime/solver_qss/static_function.h | 5 ++- 7 files changed, 93 insertions(+), 43 deletions(-) diff --git a/c_runtime/Makefile.common b/c_runtime/Makefile.common index b96bd49ba1a..4826dd7be4a 100644 --- a/c_runtime/Makefile.common +++ b/c_runtime/Makefile.common @@ -178,6 +178,6 @@ clean : rm -f $(SIMOBJS) cd sendData && rm -fr release debug *sendData*.o *sendData*.a rm -rf sendData/release sendData/debug - rm -f sendData.o sendData.a sendData/sendDataHumbug.o sendData/releasesendData.o sendData/Makefile + rm -f sendData.o sendData.a sendData/sendDataHumbug.o sendData/releasesendData.o sendData/Makefile solver_qss/*.o diff --git a/c_runtime/solver_qss/integrator.cpp b/c_runtime/solver_qss/integrator.cpp index 6f841771835..dafcfef8826 100644 --- a/c_runtime/solver_qss/integrator.cpp +++ b/c_runtime/solver_qss/integrator.cpp @@ -6,53 +6,63 @@ IntegratorQSS::IntegratorQSS(double dqm, double dqr) order=1; dQmin=dqm; dQrel=dqr; + } void IntegratorQSS::init(Time t, unsigned int i) { index=i; + for (int j=0;jstates[index]); - q[index].setOrder(order-1); - X[index].setOrder(order); - derX[index].setOrder(order); - q[index].setCoeff(0,X[index].value()); - X[index].sampledAt(t); - q[index].sampledAt(t); - dQ = fabs(X[index].value())*dQrel; + X[state].setCoeff(0,globalData->states[state]); + q[state].setOrder(order-1); + X[state].setOrder(order); + derX[state].setOrder(order); + q[state].setCoeff(0,X[state].value()); + X[state].sampledAt(t); + q[state].sampledAt(t); + dQ = fabs(X[state].value())*dQrel; if (dQ0) { - if (X[index].coeff(1)==0) { + if (X[state].coeff(1)==0) { sigma=INF; return; } const double sigmaUpper = diff.offsetBy(dQ).minPosRoot(); const double sigmaLower = diff.offsetBy(-dQ).minPosRoot(); sigma=std::min(sigmaUpper,sigmaLower); - if (fabs(X[index].value()-q[index].value())>dQ) + if (fabs(X[state].value()-q[state].value())>dQ) sigma=0.0; } - X[index].sampledAt(t); + X[state].sampledAt(t); } diff --git a/c_runtime/solver_qss/integrator.h b/c_runtime/solver_qss/integrator.h index d2b50dc20d7..7f51cadd158 100644 --- a/c_runtime/solver_qss/integrator.h +++ b/c_runtime/solver_qss/integrator.h @@ -11,6 +11,7 @@ class IntegratorQSS: public Simulator virtual void makeStep(Time t); virtual void update(Time t); private: + unsigned int state; unsigned int index; double dQmin; double dQrel; diff --git a/c_runtime/solver_qss/runtime.h b/c_runtime/solver_qss/runtime.h index 5cbf366815b..a5b6163dd09 100644 --- a/c_runtime/solver_qss/runtime.h +++ b/c_runtime/solver_qss/runtime.h @@ -17,10 +17,13 @@ void function_staticBlocks(int,double,double*,double*); double minposroot(double *coeff, int order); extern QssSignal *X,*q,*derX,*alg,*zc; -extern char incidenceMatrix[]; +extern int incidenceMatrix[]; +extern int incidenceRows; extern int staticBlocks; -extern char inputMatrix[]; -extern char outputMatrix[]; +extern int inputMatrix[]; +extern int outputMatrix[]; +extern int outputRows; +extern int inputRows; extern bool interactiveSimuation; int diff --git a/c_runtime/solver_qss/solver_qss.cpp b/c_runtime/solver_qss/solver_qss.cpp index c438c3848b9..c808737262a 100644 --- a/c_runtime/solver_qss/solver_qss.cpp +++ b/c_runtime/solver_qss/solver_qss.cpp @@ -78,7 +78,7 @@ int qss_main( int argc, char** argv,double &start, double &stop, double &step, // Init static functions - One per state but could differ for (int i=0;inStates] = new StaticFunction(3,dQmin,dQrel); + childs[i+globalData->nStates] = new StaticFunction(1,dQmin,dQrel,i+globalData->nStates); childs[i+globalData->nStates]->init(globalData->timeValue,i); tn[i+globalData->nStates] = globalData->timeValue+childs[i+globalData->nStates]->ta(); } @@ -127,12 +127,12 @@ int qss_main( int argc, char** argv,double &start, double &stop, double &step, steps++; // Update corresponding childs - for (int i=0;iupdate(globalData->timeValue); - tn[i]=globalData->timeValue+childs[i]->ta(); + childs[incidenceMatrix[i*2+1]]->update(globalData->timeValue); + tn[incidenceMatrix[i*2+1]]=globalData->timeValue+childs[incidenceMatrix[i*2+1]]->ta(); } } } diff --git a/c_runtime/solver_qss/static_function.cpp b/c_runtime/solver_qss/static_function.cpp index 1e86d9f4e2a..2657709f4d1 100644 --- a/c_runtime/solver_qss/static_function.cpp +++ b/c_runtime/solver_qss/static_function.cpp @@ -1,15 +1,31 @@ #include "runtime.h" #include "static_function.h" -StaticFunction::StaticFunction(int ord, double dqm, double dqr) +StaticFunction::StaticFunction(int ord, double dqm, double dqr,int in) { order=ord; dQmin=dqm; dQrel=dqr; + devsIndex=in; + for (int i=0;i1) { @@ -37,9 +54,24 @@ void StaticFunction::init(Time t, unsigned int i) void StaticFunction::makeStep(Time t) { advanceInputs(t); - function_staticBlocks(index,t,NULL,out); + function_staticBlocks(index,t,inp,out); + derX[0].setCoeff(0,out[0]); + derX[0].sampledAt(t); + + if (order>1) + { + advanceInputs(t-dt); + function_staticBlocks(index,t,inp,out_dt); + + advanceInputs(t+dt); + function_staticBlocks(index,t+dt,inp,outdt); + + } + writeOutputs(t); sigma=INF; + // Take back the time + globalData->timeValue=t; } void StaticFunction::update(Time t) @@ -49,23 +81,26 @@ void StaticFunction::update(Time t) void StaticFunction::writeOutputs(Time t) { - for (int i=0; inStates;i++) + std::list::iterator it=computes.begin(); + int i=0; + for (;it!=computes.end();it++,i++) { - if (outputMatrix[(globalData->nStates+index)*globalData->nStates +i]) - { - derX[i].setCoeff(0,globalData->statesDerivatives[i]); - derX[i].sampledAt(t); + if (*itnStates) { + derX[*it].sampledAt(t); + derX[*it].setCoeff(0,out[i]); + // If order>1... } - } + } } void StaticFunction::advanceInputs(Time t) { - for (int i=0; inStates;i++) + std::list::iterator it=inputs.begin(); + for (; it!=inputs.end();it++) { - if (inputMatrix[(globalData->nStates+index)*globalData->nStates +i]) + if (*itnStates) { - globalData->states[i] = q[i].valueAt(t); + inp[*it] = q[*it].valueAt(t); } } } diff --git a/c_runtime/solver_qss/static_function.h b/c_runtime/solver_qss/static_function.h index 23244ad5128..2e47ee87319 100644 --- a/c_runtime/solver_qss/static_function.h +++ b/c_runtime/solver_qss/static_function.h @@ -6,7 +6,7 @@ class StaticFunction: public Simulator { public: - StaticFunction(int ord, double dqm, double dqr); + StaticFunction(int ord, double dqm, double dqr, int devsIndex); ~StaticFunction(); virtual void init(Time t, unsigned int i); virtual void makeStep(Time t); @@ -17,11 +17,12 @@ class StaticFunction: public Simulator void writeOutputs(Time t); double dQmin,dQrel,dQ; - double *out,*outdt,*out_dt,*out2dt,*out_2dt; + double *out,*outdt,*out_dt,*out2dt,*out_2dt,*inp; unsigned int index; int order; unsigned int outVars; list inputs; list computes; double dt; + int devsIndex; };