formatted_io1

Two models, A & B, that send/receive ASCII data (strings). Model A receives input from a file and then sends it’s output to model B. Model B receives input from model A and sends it’s output to a file.

C Version

Model Code:

 1#include <stdio.h>
 2// Include methods for input/output channels
 3#include "YggInterface.h"
 4
 5#define MYBUFSIZ 1000
 6
 7int main(int argc, char *argv[]) {
 8  // Initialize input/output channels
 9  yggInput_t in_channel = yggInput("inputA");
10  yggOutput_t out_channel = yggOutput("outputA");
11
12  // Declare resulting variables and create buffer for received message
13  int flag = 1;
14  size_t msg_siz = 0;
15  char *msg = NULL;
16
17  // Loop until there is no longer input or the queues are closed
18  while (flag >= 0) {
19
20    // Receive input from input channel
21    // If there is an error, the flag will be negative
22    // Otherwise, it is the number of variables filled
23    flag = yggRecvRealloc(in_channel, &msg, &msg_siz);
24    if (flag < 0) {
25      printf("Model A: No more input.\n");
26      break;
27    }
28
29    // Print received message
30    printf("Model A: %s\n", msg);
31
32    // Send output to output channel
33    // If there is an error, the flag will be negative
34    flag = yggSend(out_channel, msg, msg_siz);
35    if (flag < 0) {
36      printf("Model A: Error sending output.\n");
37      break;
38    }
39
40  }
41  
42  return 0;
43}
44
 1#include <stdio.h>
 2// Include methods for input/output channels
 3#include "YggInterface.h"
 4
 5#define MYBUFSIZ 1000
 6
 7int main(int argc, char *argv[]) {
 8  // Initialize input/output channels
 9  yggInput_t in_channel = yggInput("inputB");
10  yggOutput_t out_channel = yggOutput("outputB");
11
12  // Declare resulting variables and create buffer for received message
13  int flag = 1;
14  size_t msg_siz = 0;
15  char *msg = NULL;
16
17  // Loop until there is no longer input or the queues are closed
18  while (flag >= 0) {
19  
20    // Receive input from input channel
21    // If there is an error, the flag will be negative
22    // Otherwise, it is the size of the received message
23    flag = yggRecvRealloc(in_channel, &msg, &msg_siz);
24    if (flag < 0) {
25      printf("Model B: No more input.\n");
26      break;
27    }
28
29    // Print received message
30    printf("Model B: %s\n", msg);
31
32    // Send output to output channel
33    // If there is an error, the flag will be negative
34    flag = yggSend(out_channel, msg, msg_siz);
35    if (flag < 0) {
36      printf("Model B: Error sending output.\n");
37      break;
38    }
39
40  }
41  
42  return 0;
43}
44

Model YAML:

 1models:
 2  - name: c_modelA
 3    language: c
 4    args: ./src/formatted_io1_modelA.c
 5    inputs: inputA
 6    outputs: outputA
 7
 8  - name: c_modelB
 9    language: c
10    args: ./src/formatted_io1_modelB.c
11    inputs: inputB
12    outputs: outputB
13
14connections:
15  - input: outputA  # Connection between model A output & model B input
16    output: inputB
17  - input: ./Input/input.txt  # Connection between file and model A input
18    output: inputA
19    filetype: ascii
20  - input: outputB  # Connection between model B output and file
21    output: ./output.txt
22    filetype: ascii

C++ Version

Model Code:

 1#include <iostream>
 2// Include methods for input/output channels
 3#include "YggInterface.hpp"
 4
 5#define MYBUFSIZ 1000
 6
 7int main(int argc, char *argv[]) {
 8  // Initialize input/output channels
 9  YggInput in_channel("inputA");
10  YggOutput out_channel("outputA");
11
12  // Declare resulting variables and create buffer for received message
13  int flag = 1;
14  size_t msg_siz = 0;
15  char *msg = NULL;
16  size_t * const p_msg_siz = &msg_siz; // Required in C++ to get msg size
17
18  // Loop until there is no longer input or the queues are closed
19  while (flag >= 0) {
20  
21    // Receive input from input channel
22    // If there is an error, the flag will be negative
23    // Otherwise, it is the size of the received message
24    flag = in_channel.recvRealloc(2, &msg, &msg_siz);
25    if (flag < 0) {
26      std::cout << "Model A: No more input." << std::endl;
27      break;
28    }
29
30    // Print received message
31    std::cout << "Model A: " << msg << std::endl;
32
33    // Send output to output channel
34    // If there is an error, the flag will be negative
35    flag = out_channel.send(2, msg, msg_siz);
36    if (flag < 0) {
37      std::cout << "Model A: Error sending output." << std::endl;
38      break;
39    }
40
41  }
42  
43  return 0;
44}
 1#include <iostream>
 2// Include methods for input/output channels
 3#include "YggInterface.hpp"
 4
 5#define MYBUFSIZ 1000
 6
 7int main(int argc, char *argv[]) {
 8  // Initialize input/output channels
 9  YggInput in_channel("inputB");
10  YggOutput out_channel("outputB");
11
12  // Declare resulting variables and create buffer for received message
13  int flag = 1;
14  size_t msg_siz = 0;
15  char *msg = NULL;
16  size_t * const p_msg_siz = &msg_siz; // Required in C++ to get msg size
17
18  // Loop until there is no longer input or the queues are closed
19  while (flag >= 0) {
20  
21    // Receive input from input channel
22    // If there is an error, the flag will be negative
23    // Otherwise, it is the size of the received message
24    flag = in_channel.recvRealloc(2, &msg, &msg_siz);
25    if (flag < 0) {
26      std::cout << "Model B: No more input." << std::endl;
27      break;
28    }
29
30    // Print received message
31    std::cout << "Model B: " << msg << std::endl;
32
33    // Send output to output channel
34    // If there is an error, the flag will be negative
35    flag = out_channel.send(2, msg, msg_siz);
36    if (flag < 0) {
37      std::cout << "Model B: Error sending output." << std::endl;
38      break;
39    }
40
41  }
42  
43  return 0;
44}

Model YAML:

 1models:
 2  - name: cpp_modelA
 3    language: c++
 4    args: ./src/formatted_io1_modelA.cpp
 5    inputs: inputA
 6    outputs: outputA
 7
 8  - name: cpp_modelB
 9    language: c++
10    args: ./src/formatted_io1_modelB.cpp
11    inputs: inputB
12    outputs: outputB
13
14connections:
15  - input: outputA  # Connection between model A output & model B input
16    output: inputB
17  - input: ./Input/input.txt  # Connection between file and model A input
18    output: inputA
19    filetype: ascii
20  - input: outputB  # Connection between model B output and file
21    output: ./output.txt
22    filetype: ascii

Fortran Version

Model Code:

 1program main
 2  ! Include methods for input/output channels
 3  use fygg
 4
 5  ! Declare resulting variables and create buffer for received message
 6  logical :: flag = .true.
 7  type(yggcomm) :: in_channel, out_channel
 8  type(yggchar_r) :: msg  ! Structure wrapping reallocatable string
 9  integer(kind=c_size_t), target :: msg_siz = 0
10
11  ! initialize input/output channels
12  in_channel = ygg_input("inputA")
13  out_channel = ygg_output("outputA")
14
15  ! Loop until there is no longer input or the queues are closed
16  do while (flag)
17
18     ! Receive input from input channel
19     ! If there is an error, the flag will be negative
20     ! Otherwise, it is the number of variables filled
21     flag = ygg_recv_var_realloc(in_channel, &
22          [yggarg(msg), yggarg(msg_siz)])
23     if (.not.flag) then
24        print *, "Model A: No more input."
25        exit
26     end if
27
28     ! Print received message
29     print *, "Model A: ", msg%x
30
31     ! Send output to output channel
32     ! If there is an error, the flag will be negative
33     flag = ygg_send_var(out_channel, &
34          [yggarg(msg), yggarg(msg_siz)])
35     if (.not.flag) then
36        print *, "Model A: Error sending output."
37        exit
38     end if
39
40  end do
41
42end program main
 1program main
 2  ! Include methods for input/output channels
 3  use fygg
 4
 5  ! Declare resulting variables and create buffer for received message
 6  logical :: flag = .true.
 7  type(yggcomm) :: in_channel, out_channel
 8  type(yggchar_r) :: msg  ! Structure wrapping reallocatable string
 9  integer(kind=c_size_t), target :: msg_siz = 0
10
11  ! Initialize input/output channels
12  in_channel = ygg_input("inputB")
13  out_channel = ygg_output("outputB")
14
15  ! Loop until there is no longer input or the queues are closed
16  do while (flag)
17
18     ! Receive input from input channel
19     ! If there is an error, the flag will be negative
20     ! Otherwise, it is the number of variables filled
21     flag = ygg_recv_var_realloc(in_channel, &
22          [yggarg(msg), yggarg(msg_siz)])
23     if (.not.flag) then
24        print *, "Model B: No more input."
25        exit
26     end if
27
28     ! Print received message
29     print *, "Model B: ", msg%x
30
31     ! Send output to output channel
32     ! If there is an error, the flag will be negative
33     flag = ygg_send_var(out_channel, &
34          [yggarg(msg), yggarg(msg_siz)])
35     if (.not.flag) then
36        print *, "Model B: Error sending output."
37        exit
38     end if
39
40  end do
41
42end program main

Model YAML:

 1models:
 2  - name: fortran_modelA
 3    language: fortran
 4    args: ./src/formatted_io1_modelA.f90
 5    inputs: inputA
 6    outputs: outputA
 7
 8  - name: fortran_modelB
 9    language: fortran
10    args: ./src/formatted_io1_modelB.f90
11    inputs: inputB
12    outputs: outputB
13
14connections:
15  - input: outputA  # Connection between model A output & model B input
16    output: inputB
17  - input: ./Input/input.txt  # Connection between file and model A input
18    output: inputA
19    filetype: ascii
20  - input: outputB  # Connection between model B output and file
21    output: ./output.txt
22    filetype: ascii

Matlab Version

Model Code:

 1% Initialize input/output channels 
 2in_channel = YggInterface('YggInput', 'inputA');
 3out_channel = YggInterface('YggOutput', 'outputA');
 4
 5flag = true;
 6
 7% Loop until there is no longer input or the queues are closed
 8while flag
 9
10  % Receive input from input channel
11  % If there is an error, the flag will be False.
12  [flag, msg] = in_channel.recv();
13  if (~flag)
14    disp('Model A: No more input.');
15    break;
16  end;
17
18  % Print received message
19  fprintf('Model A: %s\n', msg);
20
21  % Send output to output channel
22  % If there is an error, the flag will be False
23  flag = out_channel.send(msg);
24  if (~flag)
25    error('Model A: Error sending output.');
26    break;
27  end;
28  
29end;
 1% Initialize input/output channels 
 2in_channel = YggInterface('YggInput', 'inputB');
 3out_channel = YggInterface('YggOutput', 'outputB');
 4
 5flag = true;
 6
 7% Loop until there is no longer input or the queues are closed
 8while flag
 9
10  % Receive input from input channel
11  % If there is an error, the flag will be False.
12  [flag, msg] = in_channel.recv();
13  if (~flag)
14    disp('Model B: No more input.');
15    break;
16  end;
17
18  % Print received message
19  fprintf('Model B: %s\n', msg);
20
21  % Send output to output channel
22  % If there is an error, the flag will be False
23  flag = out_channel.send(msg);
24  if (~flag)
25    error('Model B: Error sending output.');
26    break;
27  end;
28  
29end;

Model YAML:

 1models:
 2  - name: matlab_modelA
 3    language: matlab
 4    args: ./src/formatted_io1_modelA.m
 5    inputs: inputA
 6    outputs: outputA
 7
 8  - name: matlab_modelB
 9    language: matlab
10    args: ./src/formatted_io1_modelB.m
11    inputs: inputB
12    outputs: outputB
13
14connections:
15  - input: outputA  # Connection between model A output & model B input
16    output: inputB
17  - input: ./Input/input.txt  # Connection between file and model A input
18    output: inputA
19    filetype: ascii
20  - input: outputB  # Connection between model B output and file
21    output: ./output.txt
22    filetype: ascii

Python Version

Model Code:

 1# Import classes for input/output channels
 2from yggdrasil.interface.YggInterface import YggInput, YggOutput
 3
 4# Initialize input/output channels
 5in_channel = YggInput('inputA')
 6out_channel = YggOutput('outputA')
 7
 8# Loop until there is no longer input or the queues are closed
 9while True:
10
11    # Receive input from input channel
12    # If there is an error, the flag will be False
13    flag, msg = in_channel.recv()
14    if not flag:
15        print("Model A: No more input.")
16        break
17
18    # Print received message
19    print('Model A: %s' % msg)
20
21    # Send output to output channel
22    # If there is an error, the flag will be False
23    flag = out_channel.send(msg)
24    if not flag:
25        raise RuntimeError("Model A: Error sending output.")
 1# Import classes for input/output channels
 2from yggdrasil.interface.YggInterface import YggInput, YggOutput
 3
 4# Initialize input/output channels
 5in_channel = YggInput('inputB')
 6out_channel = YggOutput('outputB')
 7
 8# Loop until there is no longer input or the queues are closed
 9while True:
10
11    # Receive input from input channel
12    # If there is an error, the flag will be False
13    flag, msg = in_channel.recv()
14    if not flag:
15        print("Model B: No more input.")
16        break
17
18    # Print received message
19    print('Model B: %s' % msg)
20
21    # Send output to output channel
22    # If there is an error, the flag will be False
23    flag = out_channel.send(msg)
24    if not flag:
25        raise RuntimeError("Model B: Error sending output.")

Model YAML:

 1models:
 2  - name: python_modelA
 3    language: python
 4    args: ./src/formatted_io1_modelA.py
 5    inputs: inputA
 6    outputs: outputA
 7
 8  - name: python_modelB
 9    language: python
10    args: ./src/formatted_io1_modelB.py
11    inputs: inputB
12    outputs: outputB
13
14connections:
15  - input: outputA  # Connection between model A output & model B input
16    output: inputB
17  - input: ./Input/input.txt  # Connection between file and model A input
18    output: inputA
19    filetype: ascii
20  - input: outputB  # Connection between model B output and file
21    output: ./output.txt
22    filetype: ascii

R Version

Model Code:

 1# Import library for input/output
 2library(yggdrasil)
 3
 4# Initialize input/output channels
 5in_channel <- YggInterface('YggInput', 'inputA')
 6out_channel <- YggInterface('YggOutput', 'outputA')
 7
 8# Loop until there is no longer input or the queues are closed
 9while(TRUE) {
10
11  # Receive input from input channel
12  # If there is an error, the flag will be False
13  c(flag, msg) %<-% in_channel$recv()
14  if (!flag) {
15    print('Model A: No more input.')
16    break
17  }
18
19  # Print received message
20  fprintf('Model A: %s', msg)
21
22  # Send output to output channel
23  # If there is an error, the flag will be False
24  flag = out_channel$send(msg)
25  if (!flag) {
26    stop('Model A: Error sending output.')
27  }
28
29}
 1# Import library for input/output
 2library(yggdrasil)
 3
 4# Initialize input/output channels
 5in_channel <- YggInterface('YggInput', 'inputB')
 6out_channel <- YggInterface('YggOutput', 'outputB')
 7
 8# Loop until there is no longer input or the queues are closed
 9while(TRUE) {
10
11  # Receive input from input channel
12  # If there is an error, the flag will be False
13  c(flag, msg) %<-% in_channel$recv()
14  if (!flag) {
15    print('Model B: No more input.')
16    break
17  }
18
19  # Print received message
20  fprintf('Model B: %s', msg)
21
22  # Send output to output channel
23  # If there is an error, the flag will be False
24  flag = out_channel$send(msg)
25  if (!flag) {
26    stop('Model B: Error sending output.')
27  }
28
29}

Model YAML:

 1models:
 2  - name: R_modelA
 3    language: R
 4    args: ./src/formatted_io1_modelA.R
 5    inputs: inputA
 6    outputs: outputA
 7
 8  - name: R_modelB
 9    language: R
10    args: ./src/formatted_io1_modelB.R
11    inputs: inputB
12    outputs: outputB
13
14connections:
15  - input: outputA  # Connection between model A output & model B input
16    output: inputB
17  - input: ./Input/input.txt  # Connection between file and model A input
18    output: inputA
19    filetype: ascii
20  - input: outputB  # Connection between model B output and file
21    output: ./output.txt
22    filetype: ascii