0

My question is similar to this one Is it possible to return multiple values from an external file to Dymola? so here it goes:

How do I return multiple outputs from an external function without using a Record (if that's possible at all)? If it's not possible without using a Record - could you please explain how to do this with a Record? I'm relatively new to using external functions so I could be missing something pretty basic here.

I've written an example model (below) to hopefully give a fuller picture of what I'm trying to achieve.

Thank you in advance for your help with this!

model ExampleMultipleOutputs "Example model to output multiple values"

  parameter Real a = 1 "Example real parameter";
  parameter Integer b = 2 "Example integer parameter";

  Real y1 "Declare output y1";
  Real y2 "Declare output y2";
  Real y3 "Declare output y3";
protected 
  function threeOut "Output three Real values from external function"
    input Real a;
    input Integer b;

    output Real y1 "Output 1";
    output Real y2 "Output 2";
    output Real y3 "Output 3";

  external"C" three_Out(
        a,
        b);
    annotation (
      Include="
        
        void three_Out(double a, int b, double* y1, double* y2, double* y3){
               
            *y1 = a;
            *y2 = b;
            *y3 = a+a;  
        
        }
      ");
  end threeOut;

equation 
    (y1, y2, y3) = threeOut(a=a, b=b);

end ExampleMultipleOutputs;

The compiler message from this example model states that "dsmodel.c(69): error C2198: 'three_Out': too few arguments for call", which makes me think my C code isn't correct, the way I have the function set up is not correct, or all of the above. Highly possible because I don't write C often.

moored6
  • 21
  • 5

1 Answers1

2

Not sure why this wasn't clicking a couple hours ago, but I found a solution that works. I just had to stare at this previous post for a bit longer. Hopefully this complete example will be helpful for others.

model ExampleMultipleOutputs "Example model to output multiple values"

  parameter Real a = 1 "Example real parameter";
  parameter Integer b = 2 "Example integer parameter";

  record recDef
    Real y1 "Declare output y1";
    Real y2 "Declare output y2";
    Real y3 "Declare output y3";
  end recDef;

  recDef rec;
protected 
  function threeOut "Output three real values from external function"
    input Real a;
    input Integer b;

    output recDef r;
  external"C" three_Out(a,b,r);
    annotation (
      Include="
      
        struct point{
          double y1;
          double y2;
          double y3;
        };
      
        void three_Out(double a, int b, void* result){
            struct point *pt = result;     
            pt->y1 = a;
            pt->y2 = a+a;  
            pt->y3 = a+a+a; 
        
        };
      ");
  end threeOut;


equation 
    rec = threeOut(a=a, b=b);

end ExampleMultipleOutputs;
moored6
  • 21
  • 5