Skip to content

Commit

Permalink
Added destructor and cleared currStates error
Browse files Browse the repository at this point in the history
  • Loading branch information
devyeshtandon committed Aug 10, 2016
1 parent 956024c commit 61576e2
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 62 deletions.
90 changes: 54 additions & 36 deletions mbdynFMI.cc
Original file line number Diff line number Diff line change
Expand Up @@ -132,8 +132,8 @@ void fmu2::ImportCreateDLL(int type){
int fmu2::GetNumOfContinousStates(void){
numOfContStates = fmi2_import_get_number_of_continuous_states(fmu);

currStates = new double[numOfContStates];
currStatesDer = new double[numOfContStates];

// currStatesDer = new double[numOfContStates];

return numOfContStates;
}
Expand Down Expand Up @@ -188,7 +188,7 @@ bool fmu2::SupportsDirectionalDerivatives(int simType){
}

if (!capability){
silent_cout("This FMU does not support Directional Derivatives\n"<<capability<<"LOL\n");
silent_cout("This FMU does not support Directional Derivatives\n");
return false;
}

Expand Down Expand Up @@ -267,10 +267,12 @@ void fmu2::SetStates(double* states){

}

// Returns TRUE if it is of type input
bool fmu2::CheckInput(const std::string s){
v = fmi2_import_get_variable_by_name(fmu, s.c_str());

if(v==NULL){
silent_cout(s.c_str()<<" is not defined in XML, hence ");
return false;
}
return ((fmi2_import_get_causality(v))==2);
}

Expand All @@ -290,20 +292,29 @@ double fmu2::GetStateFromRefValue(unsigned int i){

}

double* fmu2::GetStateDerivatives(void){
fmi2_real_t *deriv;
deriv = new fmi2_real_t [numOfContStates];
fmi2_import_get_derivatives(fmu, deriv, numOfContStates);
return deriv;
fmu2::~fmu2(void){
delete[] eventIndicators;
delete[] eventIndicatorsPrev;

fmi_import_free_context(context);


}


void fmu2::GetStateDerivatives(double* derivatives){

fmistatus = fmi2_import_get_derivatives(fmu, derivatives, numOfContStates);
STATUSCHECK(fmistatus);

}

double* fmu2::GetStates(void){
fmistatus = fmi2_import_get_continuous_states(fmu, currStates, numOfContStates);
void fmu2::GetStates(double* states){
fmistatus = fmi2_import_get_continuous_states(fmu, states, numOfContStates);
STATUSCHECK(fmistatus);
return currStates;
}

bool fmu2::CheckInterrupts(double currTime){
bool fmu2::CheckInterrupts(double currTime, double* states){
int zeroCrossningEvent = 0;

fmistatus = fmi2_import_get_event_indicators(fmu, eventIndicators, nEventIndicators);
Expand All @@ -319,7 +330,7 @@ bool fmu2::CheckInterrupts(double currTime){
fmistatus = fmi2_import_enter_event_mode(fmu);
do_event_iteration(fmu, &eventInfo);
fmistatus = fmi2_import_enter_continuous_time_mode(fmu);
fmistatus = fmi2_import_get_continuous_states(fmu, currStates, numOfContStates);
fmistatus = fmi2_import_get_continuous_states(fmu, states, numOfContStates);
fmistatus = fmi2_import_get_event_indicators(fmu, eventIndicatorsPrev, nEventIndicators);


Expand Down Expand Up @@ -367,12 +378,7 @@ void fmu2::SetValuesByVariable(const std::string s, double value){

void fmu2::Terminate(void){
fmi2_import_free_instance(fmu);
delete[] eventIndicators;
delete[] eventIndicatorsPrev;
// delete[] currStates;
delete[] currStatesDer;

delete[] vrs;

fmi2_import_free_instance(fmu);
fmi2_import_free(fmu);

Expand Down Expand Up @@ -410,6 +416,16 @@ void fmu2::TerminateSlave(void){

}

fmu::~fmu(void){
NO_OP;
}

fmu1::~fmu1(void){
silent_cout("This was called");
fmi_xml_free_context(context);
}


void fmu1::parseXML(fmi_import_context_t* context, const char* dirPath){
fmu = fmi1_import_parse_xml(context, dirPath);
if (!fmu){
Expand All @@ -436,8 +452,8 @@ void fmu1::ImportCreateDLL(int type){

int fmu1::GetNumOfContinousStates(void){
numOfContStates = fmi1_import_get_number_of_continuous_states(fmu);
currStates = new double [numOfContStates];
currStatesDer = new double [numOfContStates];
// currStates = new double [numOfContStates];
// currStatesDer = new double [numOfContStates];
vrs = new fmi1_value_reference_t [numOfContStates];
deriv = new fmi1_real_t [numOfContStates];
return numOfContStates;
Expand Down Expand Up @@ -486,7 +502,7 @@ int fmu1::GetNumOfEventIndicators(void){
return fmi1_import_get_number_of_event_indicators(fmu);
}

bool fmu1::CheckInterrupts(double currTime){
bool fmu1::CheckInterrupts(double currTime, double* states){
int zeroCrossningEvent = 0;

fmistatus = fmi1_import_get_event_indicators(fmu, eventIndicators, nEventIndicators);
Expand All @@ -500,7 +516,7 @@ bool fmu1::CheckInterrupts(double currTime){

if ( zeroCrossningEvent || (eventInfo.upcomingTimeEvent && currTime == eventInfo.nextEventTime)) {
fmistatus = fmi1_import_eventUpdate(fmu, intermediateResults, &eventInfo);
fmistatus = fmi1_import_get_continuous_states(fmu, currStates, numOfContStates);
fmistatus = fmi1_import_get_continuous_states(fmu, states, numOfContStates);
fmistatus = fmi1_import_get_event_indicators(fmu, eventIndicatorsPrev, nEventIndicators);
return true;
} else {
Expand All @@ -510,6 +526,11 @@ bool fmu1::CheckInterrupts(double currTime){

bool fmu1::CheckInput(const std::string s){
v = fmi1_import_get_variable_by_name(fmu, s.c_str());
if(v==NULL){
silent_cout(s.c_str()<<" is not defined in XML, hence ");
return false;
}

return ((fmi1_import_get_causality(v))==0);
}

Expand Down Expand Up @@ -556,12 +577,10 @@ int fmu1::GetRefValueFromString(const char* s){
return static_cast<int>(fmi1_import_get_variable_vr(v));
}

double* fmu1::GetStateDerivatives(){


fmi1_import_get_derivatives(fmu, deriv, numOfContStates);
void fmu1::GetStateDerivatives(double* derivatives){

return deriv;
fmistatus = fmi1_import_get_derivatives(fmu, derivatives, numOfContStates);
STATUSCHECK(fmistatus);
}

void fmu1::SetTime(double time){
Expand Down Expand Up @@ -629,15 +648,15 @@ void fmu1::Terminate(void){
delete[] eventIndicators;
delete[] eventIndicatorsPrev;
// delete[] currStates;
delete[] currStatesDer;

delete[] deriv;
delete[] vrs;

fmi1_import_free_model_instance(fmu);
fmi1_import_destroy_dllfmu(fmu);
fmi1_import_free(fmu);

fmi_xml_free_context(context);



}
Expand All @@ -650,16 +669,15 @@ void fmu1::TerminateSlave(void){

}

double* fmu1::GetStates(void){
void fmu1::GetStates(double* states){

fmistatus = fmi1_import_get_continuous_states(fmu, currStates, numOfContStates);
fmistatus = fmi1_import_get_continuous_states(fmu, states, numOfContStates);
if(!fmistatus){
fmistatus = fmi1_import_get_nominal_continuous_states(fmu, currStates, numOfContStates);
fmistatus = fmi1_import_get_nominal_continuous_states(fmu, states, numOfContStates);
}
//Put all the values as zero if everything fails?
STATUSCHECK(fmistatus);

return currStates;
}

void fmu1::InitializeAsSlave(const char* location, double tstart, double tend){
Expand Down
26 changes: 15 additions & 11 deletions mbdynFMI.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,19 +50,19 @@ class fmu {

virtual int GetRefValueFromString(const char* s) = 0;
virtual double GetStateFromRefValue(unsigned int i) = 0;
virtual double* GetStateDerivatives(void) = 0;
virtual double* GetStates(void) = 0;
virtual void GetStateDerivatives(double*) = 0;
virtual void GetStates(double*) = 0;
virtual void GetDirectionalDerivatives(double** ,int*, int, double *) = 0;
virtual bool SupportsDirectionalDerivatives(int) = 0;

virtual bool CheckInterrupts(double currTime) = 0;
virtual bool CheckInterrupts(double, double*) = 0;
virtual void Terminate(void) = 0;

virtual void InitializeAsSlave(const char*, double, double) = 0;
virtual void CSPropogate(double tcur, double dt) = 0;
virtual void TerminateSlave(void) = 0;


virtual ~fmu(void);
};

class fmu1 :public fmu{
Expand Down Expand Up @@ -92,6 +92,7 @@ class fmu1 :public fmu{
fmi1_boolean_t intermediateResults;
fmi1_import_variable_list_t* vl;

int type; //1: IMPORT 2:COSIM
public:
void parseXML(fmi_import_context_t* context, const char* dirPath);
void setCallBackFunction();
Expand All @@ -118,18 +119,19 @@ class fmu1 :public fmu{

int GetRefValueFromString(const char* s);
double GetStateFromRefValue(unsigned int i);
double* GetStateDerivatives(void);
double* GetStates(void);
void GetStateDerivatives(double*);
void GetStates(double *);
void GetDirectionalDerivatives(double** , int*, int, double*);
bool SupportsDirectionalDerivatives(int);

bool CheckInterrupts(double currTime);
bool CheckInterrupts(double, double*);
void Terminate(void);

void InitializeAsSlave(const char* location, double tstart, double tend);
void CSPropogate(double tcur, double dt);
void TerminateSlave(void);

virtual ~fmu1(void);

};

Expand Down Expand Up @@ -161,8 +163,9 @@ class fmu2 : public fmu{
fmi2_boolean_t intermediateResults;
fmi2_import_variable_list_t* vl;

void FMI2STATUSCHECK(std::string fcn);


int type; //1: IMPORT 2:COSIM
public:
void parseXML(fmi_import_context_t* context, const char* dirPath);
void setCallBackFunction();
Expand All @@ -189,17 +192,18 @@ class fmu2 : public fmu{

int GetRefValueFromString(const char* s);
double GetStateFromRefValue(unsigned int i);
double* GetStateDerivatives(void);
double* GetStates(void);
void GetStateDerivatives(double*);
void GetStates(double *);
void GetDirectionalDerivatives(double** , int*, int, double*);
bool SupportsDirectionalDerivatives(int);

bool CheckInterrupts(double currTime);
bool CheckInterrupts(double, double*);
void Terminate(void);

void InitializeAsSlave(const char* , double, double);
void CSPropogate(double tcur, double dt);
void TerminateSlave(void);

virtual ~fmu2(void);
};

Binary file modified mbdynFMI.o
Binary file not shown.
36 changes: 21 additions & 15 deletions module-FMU.cc
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ pDM(pDM)
}

currState = new double[numOfContinousStates];
stateDerivatives = new double[numOfContinousStates];
directionalFlag = model->SupportsDirectionalDerivatives(SIMTYPE);
jacobianInputVector = new int[drivesContainer.size()];
privDriveLength = 0;
Expand Down Expand Up @@ -152,9 +153,8 @@ pDM(pDM)

if (directionalFlag){
jacobian = new double*[numOfContinousStates];
for (int i=0; i<numOfContinousStates; i++){
jacobian[i] = new double[numOfContinousStates + privDriveLength];
}
jacobian[0] = new double[(numOfContinousStates + privDriveLength)*numOfContinousStates];


seedVector = new double[numOfContinousStates + privDriveLength];
}
Expand All @@ -170,17 +170,23 @@ ModuleFMU::~ModuleFMU(void)
}

if(directionalFlag){
for(int i=0; i<numOfContinousStates; i++){
delete[] jacobian[i];
}

delete[] jacobian[0];
delete[] jacobian;

delete[] seedVector;
}


delete[] jacobianInputVector;
delete model;
delete[] currState;
delete[] stateDerivatives;

for (strDriveCon::iterator i = drivesContainer.begin(); i != drivesContainer.end(); i++){
delete[] (i->second);
}

drivesContainer.clear();
}

Expand Down Expand Up @@ -313,7 +319,7 @@ ModuleFMU::AssRes(SubVectorHandler& WorkVec,
model->SetStates(currState);
// model->CheckInterrupts(currTime);

stateDerivatives = model->GetStateDerivatives();
model->GetStateDerivatives(stateDerivatives);
}

//Get Index of the elements
Expand Down Expand Up @@ -381,16 +387,16 @@ ModuleFMU::SetValue(DataManager *pDM,
VectorHandler& X, VectorHandler& XP,
SimulationEntity::Hints *ph)
{
if(numOfContinousStates > 0){
if(SIMTYPE == IMPORT){
currState = model->GetStates();
stateDerivatives = model->GetStateDerivatives();
for (int i=0; i<numOfContinousStates; i++){
X(iGetFirstIndex() + i + 1) = currState[i];
XP(iGetFirstIndex() + i + 1) = stateDerivatives[i];
}

if(SIMTYPE == IMPORT){
model->GetStates(currState);
model->GetStateDerivatives(stateDerivatives);
for (int i=0; i<numOfContinousStates; i++){
X(iGetFirstIndex() + i + 1) = currState[i];
XP(iGetFirstIndex() + i + 1) = stateDerivatives[i];
}
}

}

std::ostream&
Expand Down
Binary file modified module-FMU.o
Binary file not shown.

0 comments on commit 61576e2

Please sign in to comment.