Skip to content

Commit

Permalink
Fix container time rounding issue, add log and (lightly) refactor fmu_t
Browse files Browse the repository at this point in the history
  • Loading branch information
nl78 committed Feb 10, 2025
1 parent 1465714 commit 3a344d3
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 30 deletions.
40 changes: 22 additions & 18 deletions container/container.c
Original file line number Diff line number Diff line change
Expand Up @@ -923,9 +923,9 @@ static fmi2Status do_internal_step_parallel_mt(container_t* container, fmi2Real
fmi2Boolean noSetFMUStatePriorToCurrentPoint) {
fmi2Status status = fmi2OK;

container->currentCommunicationPoint = currentCommunicationPoint;
container->step_size = step_size;
container->noSetFMUStatePriorToCurrentPoint = noSetFMUStatePriorToCurrentPoint;
container->fmi_currentCommunicationPoint = currentCommunicationPoint;
container->fmi_step_size = step_size;
container->fmi_noSetFMUStatePriorToCurrentPoint = noSetFMUStatePriorToCurrentPoint;

/* Launch computation for all threads*/
for (int i = 0; i < container->nb_fmu; i += 1) {
Expand Down Expand Up @@ -964,9 +964,9 @@ static fmi2Status do_internal_step_parallel(container_t* container, fmi2Real cur
return status;
}

container->currentCommunicationPoint = currentCommunicationPoint;
container->step_size = step_size;
container->noSetFMUStatePriorToCurrentPoint = noSetFMUStatePriorToCurrentPoint;
container->fmi_currentCommunicationPoint = currentCommunicationPoint;
container->fmi_step_size = step_size;
container->fmi_noSetFMUStatePriorToCurrentPoint = noSetFMUStatePriorToCurrentPoint;

for (int i = 0; i < container->nb_fmu; i += 1) {
const fmu_t* fmu = &container->fmu[i];
Expand Down Expand Up @@ -994,30 +994,34 @@ fmi2Status fmi2DoStep(fmi2Component c,
fmi2Real communicationStepSize,
fmi2Boolean noSetFMUStatePriorToCurrentPoint) {
container_t *container = (container_t*)c;
const fmi2Real end_time = currentCommunicationPoint + communicationStepSize + container->tolerance;
const fmi2Real end_time = currentCommunicationPoint + communicationStepSize;
fmi2Real current_time;
fmi2Status status = fmi2OK;


const int nb_step = (int)((end_time - container->time + container->tolerance) / container->time_step);
/*
* Early return if requested end_time is lower than next container time step.
*/
if (end_time < container->time + container->time_step) {
if (nb_step == 0)
return fmi2OK;
}

for(current_time = container->time;
current_time + container->time_step < end_time;
current_time += container->time_step) {
fmi2Real start_time = container->time;
for(int i = 0; i < nb_step; i += 1) {
if (container->mt)
status = do_internal_step_parallel_mt(container, current_time, container->time_step, noSetFMUStatePriorToCurrentPoint);
status = do_internal_step_parallel_mt(container, container->time, container->time_step, noSetFMUStatePriorToCurrentPoint);
else
status = do_internal_step_parallel(container, current_time, container->time_step, noSetFMUStatePriorToCurrentPoint);
status = do_internal_step_parallel(container, container->time, container->time_step, noSetFMUStatePriorToCurrentPoint);
if (status != fmi2OK) {
logger(fmi2Error, "Container cannot do_internal_step. Status=%d", status);
break;
}
container->time = start_time + (i+1) * container->time_step;
}
container->time = current_time;

if (fabs(currentCommunicationPoint + communicationStepSize - current_time) > container->tolerance) {
logger(fmi2Warning, "CommunicationStepSize should be divisible by %e", container->time_step);
double remaining_time = currentCommunicationPoint + communicationStepSize - container->time;
if (fabs(remaining_time) > container->tolerance) {
logger(fmi2Warning, "Container CommunicationStepSize should be divisible by %e. (remaining=%e, nb_step=%d)",
container->time_step, remaining_time, nb_step);
return fmi2Warning;
}

Expand Down
6 changes: 3 additions & 3 deletions container/container.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,9 @@ typedef struct container_s {

fmu_t *fmu;

fmi2Real currentCommunicationPoint;
fmi2Real step_size;
fmi2Boolean noSetFMUStatePriorToCurrentPoint;
fmi2Real fmi_currentCommunicationPoint;
fmi2Real fmi_step_size;
fmi2Boolean fmi_noSetFMUStatePriorToCurrentPoint;

} container_t;

Expand Down
36 changes: 27 additions & 9 deletions container/fmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,9 @@ static int fmu_do_step_thread(fmu_t* fmu) {
}

fmu->status = fmuDoStep(fmu,
container->currentCommunicationPoint,
container->step_size,
container->noSetFMUStatePriorToCurrentPoint);
container->fmi_currentCommunicationPoint,
container->fmi_step_size,
container->fmi_noSetFMUStatePriorToCurrentPoint);

thread_mutex_unlock(&fmu->mutex_fmu);
}
Expand Down Expand Up @@ -211,32 +211,50 @@ void fmu_unload(fmu_t *fmu) {


fmi2Status fmuGetReal(const fmu_t *fmu, const fmi2ValueReference vr[], size_t nvr, fmi2Real value[]) {
return fmu->fmi_functions.fmi2GetReal(fmu->component, vr, nvr, value);
fmi2Status status = fmu->fmi_functions.fmi2GetReal(fmu->component, vr, nvr, value);
if (status != fmi2OK)
logger(status, "%s: fmuGetReal status=%d", fmu->identifier, status);
return status;
}


fmi2Status fmuGetInteger(const fmu_t *fmu, const fmi2ValueReference vr[], size_t nvr, fmi2Integer value[]) {
return fmu->fmi_functions.fmi2GetInteger(fmu->component, vr, nvr, value);
fmi2Status status = fmu->fmi_functions.fmi2GetInteger(fmu->component, vr, nvr, value);
if (status != fmi2OK)
logger(status, "%s: fmuGetInteger status=%d", fmu->identifier, status);
return status;
}


fmi2Status fmuGetBoolean(const fmu_t *fmu, const fmi2ValueReference vr[], size_t nvr, fmi2Boolean value[]) {
return fmu->fmi_functions.fmi2GetBoolean(fmu->component, vr, nvr, value);
fmi2Status status = fmu->fmi_functions.fmi2GetBoolean(fmu->component, vr, nvr, value);
if (status != fmi2OK)
logger(status, "%s: fmuGetBoolean status=%d", fmu->identifier, status);
return status;
}


fmi2Status fmuSetReal(const fmu_t *fmu, const fmi2ValueReference vr[], size_t nvr, const fmi2Real value[]) {
return fmu->fmi_functions.fmi2SetReal(fmu->component, vr, nvr, value);
fmi2Status status = fmu->fmi_functions.fmi2SetReal(fmu->component, vr, nvr, value);
if (status != fmi2OK)
logger(status, "%s: fmuSetReal status=%d", fmu->identifier, status);
return status;
}


fmi2Status fmuSetInteger(const fmu_t *fmu, const fmi2ValueReference vr[], size_t nvr, const fmi2Integer value[]) {
return fmu->fmi_functions.fmi2SetInteger(fmu->component, vr, nvr, value);
fmi2Status status = fmu->fmi_functions.fmi2SetInteger(fmu->component, vr, nvr, value);
if (status != fmi2OK)
logger(status, "%s: fmuSetInteger status=%d", fmu->identifier, status);
return status;
}


fmi2Status fmuSetBoolean(const fmu_t *fmu, const fmi2ValueReference vr[], size_t nvr, const fmi2Boolean value[]) {
return fmu->fmi_functions.fmi2SetBoolean(fmu->component, vr, nvr, value);
fmi2Status status = fmu->fmi_functions.fmi2SetBoolean(fmu->component, vr, nvr, value);
if (status != fmi2OK)
logger(status, "%s: fmuSetBoolean status=%d", fmu->identifier, status);
return status;
}


Expand Down

0 comments on commit 3a344d3

Please sign in to comment.