User Tools

Site Tools


interfaces:how_can_a_gams_process_communicate_with_another_process

How can a GAMS process communicate with another process

Sometimes, you want to exchange data between a running GAMS process and some other process. The following example shows how to do that. Here a GAMS program and a C program continuously exchange data (a scalar). The communication is done through ASCII and GDX files and the synchronization through some semaphores:

$Title Trivial example of two asynchronous processes(one is GAMS) that exchange data through ASCII files

$onechoV > wait.cmd
@echo off
printf "--- Waiting for %1%done"
:loop
if exist %1%done goto finish
printf "."
sleep 5
goto loop
:finish
printf "\n"
rm -f %1%done
$offecho

$onechoV > read.gms
Scalar Ccnt /
$include Ccnt.txt
/
$offecho

* C Program that reads data from GAMS and provides date for a running GAMS job
$onechoV > gc.c
#include <stdio.h>
#include <stdlib.h>

void main() {
  FILE *fp;
  int  Gcnt=0;

  printf("C - Program started\n");
   
  while (Gcnt<10) {
    system("wait.cmd G");           /* Wait for GAMS to write Gcnt.txt */

    printf("--- Reading Gcnt.txt\n"); /* Read Gcnt.txt */
    fp = fopen("Gcnt.txt","r");
    fscanf(fp,"%d",&Gcnt);
    fclose(fp);

    Gcnt = 2*Gcnt;
    printf("--- Writing Ccnt.txt (%d)\n", Gcnt); /* Write Ccnt.txt */
    fp = fopen("Ccnt.txt","w");
    fprintf(fp,"%d",Gcnt);
    fclose(fp);
    system("touch Cdone"); /* Tell the GAMS program we are done writing */
  }
  printf("C - Program terminated\n");
}
$offecho
* Next line call your favorite C compiler
* $call cl gc.c

* Remove old semaphores 
$call rm -f Cdone Gdone

* Start up the C Program (you can start this also from a different Window)
$call start cmd /K gc.exe

* The GAMS Process
$eolcom //
scalar cnt /3/;
file fx / Gcnt.txt /;

while (cnt < 10,
  cnt=cnt - 1;
  putclose fx cnt:0:0                       // write out the current scalar
  execute 'touch Gdone';                    // Tell the C program GAMS writing is done
  execute 'wait.cmd C';                     // wait for the C program to write out the updated scalar
  execute 'gams read.gms gdx read.gdx lo=2' // From the ASCII file with the scalar create a GDX file
  execute_load 'read', cnt=Ccnt;            // Load the updated scalar from the GDX file
  display cnt;               
); 

* make sure the C program also gets to write out the current scalar
putclose fx cnt:0:0                         
execute 'touch Gdone';
interfaces/how_can_a_gams_process_communicate_with_another_process.txt · Last modified: 2012/11/20 08:24 by admin