Versions Compared

Key

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

...

3 Development of C++ codes3.1 Function syntax

void name <in/out arguments list> [,code_parameters] [,diagnostic_info] )

  • name - function name
  • code_parameters - optional - user defined input parameters
  • diagnostic_info -  arbitrary output diagnostic information

3.2 Arguments list

CHEAT SHEET
ITMIMAS
#include "UALClasses.h"#include "UALClasses.h"
ItmNs::Itm::<cpo> cpo;
IdsNs::IDS::<ids> ids;
  • in/out arguments list
  •  mandatory
  • a list of input and output function arguments including:
  • CPP intrisic data types, eg:
    • int &x
    • double &y
  • IDSes, eg:Argument of type:
    ItmNs::Itm::
    antennas & ant
  • ItmNs::Itm::equilibriumArray & eq
  • 3.3 Code parameters

  • Optional
  • User defined input parameters
  • <cpo>Array     cpoArray;  <= Array!
    IdsNs::IDS::<ids>    ids;   <= Single obj !
    ItmNs::codeparam_t &
    codeparamIdsNs::codeparam_t & codeparam
    eval-pkg-config
    pkg-config
    eval-pkg-config --cflags --libs ual-cpp-gnu
    pkg-config --cflags --libs imas-cpp
      

     


    Examples

    Examples of interface between wrapper and user code
    Code Block
    languagepy
    titleITM
    linenumberstrue
    /**** Simple types ***/
    void simple(double &x, double &y)
    
    /**** Single slice ***/
    void slice( ItmNs::Itm::equilibrium &eq)
    
    /**** Array of slices ***/
    void slice_array( ItmNs::Itm::equilibriumArray &eq)
    
    /**** Code XML parameters ***/
    void code_params(...., 
    Code Block
    languagecpp
    typedef struct {
            char **parameters;
            char **default_param;
            char **schema;
        } codeparam_t;

     

     
  • A structure codeparam_t describes:
    • parameters - Actual value of the code parameters (instance of coparam/parameters in XML format).
    • default_param - Default value of the code parameters (instance of coparam/parameters in XML format).
    • schema - Code parameters schema.
  • An example:
    ItmNs::codeparam_t&
    codeparam

    3.4 Diagnostic info

  • arbitrary output diagnostic information
  • output / optional

    Code Block
    languagecpp
    void name
     codeparam)
    
    /**** Arbitrary diagnostic info ***/
    void diag_info(...., int* output_flag, char** diagnostic_info)
  • output_flag - indicates if user subroutine was successfully executed

    • output_flag = 0  - SUCCESS, no action is taken

    • output_flag > 0  - WARNING, a warning message is displayed, workflow continuue execution

    • output_flag < 0  - ERROR, actor throws an exception, workflow stops

  • diagnostic_info - an arbitrary string

  • Code Block
    languagepy
    titleIMAS
    linenumberstrue
    /**** Simple types ***/
    void simple
    Warning

    Required header

    Do not forget to add #include "UALClasses.h" while playing with IDSes!

     

     

    3.5 Examples

     

     

    Code Block
    languagecpp
    titleExample 4. Simple in/out argument types
    void simplecppactornoids
    (double &x, double &y)
    Code Block
    languagecpp
    title Example 5. A IDS array as a function argument
    void simplecppactor(ItmNs::Itm
    
    
    /**** Single slice ***/
    void slice(IdsNs::IDS::equilibrium &eq
    , double &x, double &y) Code Block
    languagecpp
    titleExample 6. Usage of init function and code input parameters
    void mycppfunctionbis_init(); void mycppfunction(ItmNs::Itm::summary& sum, ItmNs::Itm::equilibrium& eq, int& x, ItmNs::Itm::coreimpur& cor, double& y, ItmNs
    )
    
    /**** Array of slices ***/void slice_array
    ( IdsNs::IDS:equilibrium &eq)
    
    /**** Code XML parameters ***/
    void code_params(...., IdsNs::codeparam_t& codeparam)
    Info

    Initialization

    If user function needs any pre-initialization, an additional function <name>_init could be defined.
    
     
    /**** Arbitrary diagnostic info ***/
    void diag_info(...., int* output_flag, char** diagnostic_info)

     

    4. Delivery of the user code

    The user code should be delivered as a static library.
    Please find examples of the simple "makefilesMakefile" below:

     

    language
    Code Block
    bashtitleExample 6. Building of Fortran code
    F90 = $(ITM_INTEL_FC)
    COPTS = -g -O0 -assume no2underscore -fPIC -shared-intel
    
    INCLUDES = $(shell eval-pkg-config --cflags ual-$(ITM_INTEL_OBJECTCODE))
    
    all: equilibrium2distsource.o libequilibrium2distsource
    
    libequilibrium2distsource: equilibrium2distsource.o
            ar -rvs libequilibrium2distsource.a equilibrium2distsource.o
    
    equilibrium2distsource.o: equilibrium2distsource.f90
            $(F90) $(COPTS) -c -o $@ $^ ${INCLUDES} 
    
    clean:
            rm -f *.o *.a
    Code Block
    titleExample 7. Building of C++ code
    CXX=g++
    CXXFLAGS= -g -fPIC
    CXXINCLUDES= ${shell eval-pkg-config --cflags ualimas-cpp-gnu}
    
    all: libsimplecppactor.a
    
    libsimplecppactor.a: simplecppactor.o
            ar -rvs $@ $^
    
    simplecppactor.o: simplecppactor.cpp
            $(CXX) $(CXXFLAGS) $(CXXINCLUDES) -c -o $@ $^
    
    clean:
            rm *.a *.o