How To Hydrotrend Component

From CSDMS

This page needs to be updated: assigned to Eric Hutton

Creating a Hydrotrend project (in Python) with CCA

I found myself creating a project, screwing up, removing the project and starting again so often, I wrote a script that creates a new hydrotrend project. I called it make_my_hydrotrend_project.sh since that's what it does. I've listed it's contents here:

<geshi lang=bash>

  1. ! /bin/ksh

bocca create project hydrotrend --language=python

cd hydrotrend

bocca create port FilenamePort bocca create port StartPort

bocca create component Driver --uses=StartPort:model \

                                  --provides=gov.cca.ports.GoPort:run

bocca create component Hydrotrend --uses=FilenamePort:inputFile \

                                  --uses=FilenamePort:outputFile \
                                  --provides=StartPort:model

bocca create component GetFilename --provides=FilenamePort:filename bocca create component PutFilename --provides=FilenamePort:filename </geshi>

Attach member functions to the new ports

Now I edit the SIDL files to declare the member functions of the two ports I've defined (StartPort and FilenamePort). These files are located in ./ports/sidl (relative to the root project directory). To hydrotrend.StartPort.sidl add the line, <geshi lang=c>

  int start_model();

</geshi> after the 'Insert-code-here' comment. The FilenamePort has two member functions: one to get the name of a file, and one to provide the name of a file. Again in the sidl diretory, add the following lines to hydrotrendFilenamePort.sidl, <geshi lang=c>

  int get_filename( out string file );
  int put_filename( in  string file );

</geshi>

Now configure and make the project from the root project directory (you may not have to actually make it at this point), <geshi lang=bash> ./configure ; make </geshi>

Create implementations of port functions

We now work in the components directory.

In hydrotrend.Driver/hydrotrend/Driver_Impl.py, add Python code to the 'go' member function: <geshi lang=python>

   port = self.d_services.getPort( "model" )
   if port==None:
      print "hydrotrend.PythonDriver not connected"
      self.d_services.releasePort( "model" )
      return -1
   hydrotrend.StartPort.StartPort( port ).start_model()
   self.d_services.releasePort( "model" )
   return 0

</geshi>

In hydrotrend.Hydrotrend/hydrotrend/Hydrotrend_Impl.py, add code to start_model: <geshi lang=python>

   in_port  = self.d_services.getPort( "inputFile"  )
   out_port = self.d_services.getPort( "outputFile" )
   in_file = hydrotrend.FilenamePort.FilenamePort( in_port ).get_filename( )
   print "Input file is:" , in_file[1]
   hydrotrend.FilenamePort.FilenamePort( out_port ).put_filename( "hydrotrend output file" )
   self.d_services.releasePort( "inputFile"  )
   self.d_services.releasePort( "outputFile" )
   return 0

</geshi>


In hydrotrend.GetFilename/hydrotrend/GetFilename_Impl.py, add code to get_filename: <geshi lang=python>

   return ( 0 , "hydrotrend input file" )

</geshi>

In hydrotrend.PutFilename/hydrotrend/PutFilename_Impl.py, add code to put_filename: <geshi lang=python>

   print "Output file: hydrotrend output file"
   return 0

</geshi>

Now configure and make the project once more. I find that I need to clean things up first since my changes aren't always noticed by the Makefile (I imaging that this is a bug). From the top project directory, <geshi lang=bash> ./configure ; make clean ; make </geshi>

Loading the project into ccafeine

You may not have to edit these files by hand but I had to. In the utils directory, edit run-gui.sh so that BOCCA_HOME and PROJECT_DRIECTORY are correct. For me, the bocca home directory is located in /usr/local/cca so I set BOCCA_HOME to, <geshi lang=bash> BOCCA_HOME=/usr/local/cca </geshi> Set PROJECT_DIR to the top level of you project directory <geshi lang=bash> PROJECT_DIR=/Users/huttone/bocca/csdms/hydrotrend </geshi>

That should be it. If you want, you can edit components/test/test_gui_rc so that when you start ccafeine the components are already connected. My test_gui_rc file looks like, <geshi lang=bash>

  1. !ccaffeine bootstrap file.
  2. ------- don't change anything ABOVE this line.-------------

path set /Users/huttone/bocca/csdms/hydrotrend/components/lib

repository get-global hydrotrend.Driver repository get-global hydrotrend.GetFilename repository get-global hydrotrend.Hydrotrend repository get-global hydrotrend.PutFilename

instantiate hydrotrend.Driver Driver instantiate hydrotrend.GetFilename GetFilename instantiate hydrotrend.Hydrotrend Hydrotrend instantiate hydrotrend.PutFilename PutFilename

connect Driver model Hydrotrend model connect Hydrotrend inputFile GetFilename filename connect Hydrotrend outputFile PutFilename filename </geshi>

Now run utils/run-gui.sh.

Note: run-gui.sh and test_gui_rc are recreated when you configure/make so you'll probably want to create copies so your changes aren't lost.