Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fmi2_import_get_real_variable_start(fmi2_import_real_variable_t*) API is returning trimmed value #124

Closed
SudeepGhoshIN opened this issue Jun 12, 2024 · 5 comments
Assignees
Labels
question Further information is requested

Comments

@SudeepGhoshIN
Copy link

Hi Team,

I have a requirement of fetching start value for signal variables in FMI2.0.
As part of this , I am trying to utilize fmi2_import_get_real_variable_start(fmi2_import_real_variable_t*) API to get the variable value start. But unfortunately, above mentioned API is returning trimmed value, so I could not proceed further for retrieving the proper start value.

My question is, is it expected behavior for fmi2_import_get_real_variable_start(fmi2_import_real_variable_t*) API not to read start value and return trimmed value as bellow ?
If so then what is the pattern ?
We are using this code->
fmi2_import_real_variable_t* rv = fmi2_import_get_variable_as_real(var);
fmi2_real_t StartValue = fmi2_import_get_real_variable_start(rv);

We are getting this value:

  1. 0.997497 55859375 --> 0.997498
  2. 0.996662 327892311 --> 0.996662
  3. 1.08699500201411 --> 1.087

Thanks,
Sudeep

@PeterMeisrimelModelon PeterMeisrimelModelon self-assigned this Jun 12, 2024
@PeterMeisrimelModelon PeterMeisrimelModelon added the question Further information is requested label Jun 12, 2024
@PeterMeisrimelModelon
Copy link
Contributor

Hi SudeepGhoshIN,

I did a small test with the values you provided and do not observe any truncation issues.

However, the truncation you describe would be consistent with a default accuracy you would get with printf("start=%f", StartValue).

Please verify this is not a printing issue? If not, can you please provide a minimal reproducer (complete call sequence + modelDescription)?

/Peter

@SudeepGhoshIN
Copy link
Author

ModelDescription:

<ScalarVariable name="Parameters.AmbientHumConvert_PartialPressure_y[38]" valueReference="611" causality="parameter" variability="tunable">
    <Real start="0.876435000755719"/>
  </ScalarVariable>
  <ScalarVariable name="Parameters.AmbientHumConvert_PartialPressure_y[39]" valueReference="612" causality="parameter" variability="tunable">
    <Real start="0.942482643066795"/>
  </ScalarVariable>
  <ScalarVariable name="Parameters.AmbientHumConvert_PartialPressure_y[40]" valueReference="613" causality="parameter" variability="tunable">
    <Real start="1.01260562980966"/>
  </ScalarVariable>
  <ScalarVariable name="Parameters.AmbientHumConvert_PartialPressure_y[41]" valueReference="614" causality="parameter" variability="tunable">
    <Real start="1.08699500201411"/>
  </ScalarVariable>
  <ScalarVariable name="Parameters.AmbientHumConvert_PartialPressure_y[42]" valueReference="615" causality="parameter" variability="tunable">
    <Real start="1.16584749044042"/>
  </ScalarVariable>
  <ScalarVariable name="Parameters.AmbientHumConvert_PartialPressure_y[43]" valueReference="616" causality="parameter" variability="tunable">
    <Real start="1.24936555283518"/>
  </ScalarVariable>
  <ScalarVariable name="Parameters.AmbientHumConvert_PartialPressure_y[44]" valueReference="617" causality="parameter" variability="tunable">
    <Real start="1.33775740784234"/>
  </ScalarVariable>
  <ScalarVariable name="Parameters.AmbientHumConvert_PartialPressure_y[45]" valueReference="618" causality="parameter" variability="tunable">
    <Real start="1.43123706561278"/>
  </ScalarVariable>



Code Sequence:

fmi2_import_variable_t* var = fmi2_import_get_variable(varList, i);
baseType = fmi2_import_get_variable_base_type(var);
VariableType = fmi2_base_type_to_string(baseType);
if (VariableType == "Real")
{
fmi2_import_real_variable_t* rv = fmi2_import_get_variable_as_real(var);                    
fmi2_real_t StartValue = fmi2_import_get_real_variable_start(rv);  
}

@PeterMeisrimelModelon
Copy link
Contributor

Hi SudeepGhoshIN,

I took your modelDescription.xml and the following code

#include <stdio.h>
#include "fmilib.h"

int main(int argc, char **argv) {
    fmi_import_context_t *ctx = fmi_import_allocate_context(jm_get_default_callbacks());
    fmi2_import_t* xml = fmi2_import_parse_xml(ctx, ".", NULL);

    fmi2_import_variable_list_t* varList = fmi2_import_get_variable_list(xml, 0);
    for (int i = 0; i < fmi2_import_get_variable_list_size(varList); i++) {
        fmi2_import_variable_t* var = fmi2_import_get_variable(varList, i);
        printf("Variable, %s\n", fmi2_import_get_variable_name(var));
        int hasStartValue = fmi2_import_get_variable_has_start(var);
        printf("hasStartValue ? %i \n", hasStartValue);
        if (hasStartValue) {
            fmi2_import_real_variable_t *rv = fmi2_import_get_variable_as_real(var);
            printf("start = %2.15f\n", fmi2_import_get_real_variable_start(rv));
        }
    }

    fmi2_import_free(xml);
}

does produce the expected output

Variable, Parameters.AmbientHumConvert_PartialPressure_y[38]
hasStartValue ? 1 
start = 0.876435000755719
Variable, Parameters.AmbientHumConvert_PartialPressure_y[39]
hasStartValue ? 1 
start = 0.942482643066795
Variable, Parameters.AmbientHumConvert_PartialPressure_y[40]
hasStartValue ? 1 
start = 1.012605629809660
Variable, Parameters.AmbientHumConvert_PartialPressure_y[41]
hasStartValue ? 1 
start = 1.086995002014110
Variable, Parameters.AmbientHumConvert_PartialPressure_y[42]
hasStartValue ? 1 
start = 1.165847490440420
Variable, Parameters.AmbientHumConvert_PartialPressure_y[43]
hasStartValue ? 1 
start = 1.249365552835180
Variable, Parameters.AmbientHumConvert_PartialPressure_y[44]
hasStartValue ? 1 
start = 1.337757407842340
Variable, Parameters.AmbientHumConvert_PartialPressure_y[45]
hasStartValue ? 1 
start = 1.431237065612780

If this does not help, please provide a complete reproducer that produces the unexpected output.

/Peter

@SudeepGhoshIN
Copy link
Author

Hi Peter,
Thanks for your help.
I have one more question
if modelDescription.xml having
<ScalarVariable name="Parameters.PartialWaterPressure_Wet_P3_Siz[0]" valueReference="571" causality="parameter" variability="tunable"> <Real start="1.0"/> </ScalarVariable> <ScalarVariable name="Parameters.PartialWaterPressure_Wet_P3_Siz[1]" valueReference="572" causality="parameter" variability="tunable"> <Real start="102.0"/> </ScalarVariable>

fmi2_import_real_variable_t *rv = fmi2_import_get_variable_as_real(var);
printf("start = %2.15f\n", fmi2_import_get_real_variable_start(rv));

        it is returning 1.00000000 inspite of 1.0 , how to fix this?

@PeterMeisrimelModelon
Copy link
Contributor

Hi SudeepGhoshIN,

1.00000000 is identical to 1.0, so I don't see the issue? I suppose this could be made prettier with appropriate formatting for printf, but this is a general C question and not specific to FMILibrary.

/Peter

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

2 participants