Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.


Main purpose of FC2K is to embed native code inside Kepler workflow. This way, you are able to connect various, physics based, calculations into chain of execution. There are few rules you have to follow while embedding native code inside Kepler:

  • your routine signature must be exactly the same as one suggested by FC2K
  • in order to access IDSes, you have to use IMAS based modules inside your Fortran code
  • you can pass data into and outside of the code in the form of:
    • primitive types
    • IDSes
    • code parameters
  • you should avoid accessing external files unless it's really impossible to run the simulation without external source of data
  • all physics related information should be exchanged only via IDSes

In this tutorial, I will show show you how to build simple native code and plug it inside Kepler using FC2K.

Sample, shown below, will access IDS data and print it on console.

...

When you talk about actor, most important is the interface. It's API defines how actor interacts with other actors in the workflow.

...

Defining interface to user code

Info

You can always start with FC2K in order to make sure how native interface should be implemented like.

Let's start with running FC2K. It's little bit counterintuitive, but will help us to properly prepare the code.

First of all, let's add two ports into actor. Input port - IDS, and output port - integer.

Now, let's take a look how the native code should look like in order to provide correct implementation of the actor's API.

Image Removed

Now, once we know how our interface looks like, we can start developing the code

Source code of the actor

In our case, we can start with providing very basic implementation

...

As you can see, we don't even access input data, yet. All we have, so far, is the API of the native code.


Creating library with native code

As you recall from previous session (dedicated to FC2K) we have to have library that contains native code we are supposed to run.Image Removed


Let's prepare it. We will do it, by creating Makefile  project - library will be called libdistribution_disp.a 

...

...

# In this sample I will use ifort
# However, depending on target system (where IMAS is installed)
# it might be you have other options as well - e.g.: gfortran, pgi, NAG, etc.

F90      = ifort
COPTS    = -g -O0 -assume no2underscore -fPIC -shared-intel

# Note that you should _always_ use pkg-config to obtain
# flags for compiler and linker
# do not pass hardcoded locations unless it's really unavoidable!

LIBS     = `pkg-config --libs imas-ifort imas-lowlevel`
INCLUDES = `pkg-config --cflags imas-ifort imas-lowlevel`

# It is little bit messy here, but we need two different targets
# for the purpose of the tutorial
# first  - builds very basic code that doesn't touch IDSes data
# second - builds the code that will read IDSed data
#

first: distribution_disp.o libdistribution_disp.a

second: distribution_disp_2.o libdistribution_disp_2.a

libdistribution_disp.a: distribution_disp.o
  ar -rvs libdistribution_disp.a $^

libdistribution_disp_2.a: distribution_disp_2.o
  ar -rvs libdistribution_disp.a $^

distribution_disp.o: distribution_disp.f90
  $(F90) $(COPTS) -c -o $@ $^ ${INCLUDES} $(LIBS)

distribution_disp_2.o: distribution_disp_2.f90
  $(F90) $(COPTS) -c -o $@ $^ ${INCLUDES} $(LIBS)

# try to provide _clean_ target, so you can easily
# cleanup source tree

clean:
  rm -f *.o *.a

Once we run make we can use library inside the project

...

Describing the actor

When we fill information regarding actor, we make it possible to create a bridge between Kepler (actor) and native code (in this case Fortran based library). I will fill the table following way

...