Versions Compared

Key

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

Table of Contents

4.2.1. Changes

CHEAT SHEET
ITMIMAS
use euitm_schemas
use ids_schemas
use euitm_routines
use ids_routines
type (type_<cpo_name>) :: cpo 
type (ids_<ids_name>) :: ids 
type (type_<cpo_name>), pointer :: cpoArray(:) ! <= Array !!!
type (ids_<ids_name>) :: ids <== SINGLE OBJ !!!
eval-pkg-config
pkg-config 
eval-pkg-config --cflags --libs ual-ifort
pkg-config --cflags --libs imas-ifort
eval-pkg-config --cflags --libs ual-gfortran
pkg-config --cflags --libs imas-gfortran
type(type_param) :: XML_params
type(ids_parameters_input ) :: XML_params

type ids_parameters_input  !    Code parameters block passed from the wrapper to the subroutine. Does not appear as such in the data structure. This is inserted i

1366   character(len=132), dimension(:), pointer ::parameters_value => null()       ! /parameters_input/parameters_value - Actual value of the code parameters (instance of Code_Parameters/Parameters in XML format)

1367   character(len=132), dimension(:), pointer ::parameters_default => null()       ! /parameters_input/parameters_default - Default value of the code parameters (instance of Code_Parameters/Parameters in XML format)

1368   character(len=132), dimension(:), pointer ::schema => null()       ! /parameters_input/schema - Code parameters schema

1369 endtype

 

 

type ids_parameters_input  !   

1366   character(len=132), dimension(:), pointer ::parameters_value => null()      

1367   character(len=132), dimension(:), pointer ::parameters_default => null()      

1368   character(len=132), dimension(:), pointer ::schema => null()      

1369 endtype

 

 

 

 

4.2.2 Examples

Examples of interface between wrapper and user code
ITM

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**** Fortran intrinsic data types ***/
integer :: input
character(50) :: charstring
integer,dimension(4) :: tabint
 
/**** Single slice ***/
void slice( ItmNs::Itm::equilibrium &eq)
type (type_equilibrium) :: cpo
 
/**** Array of slices ***/
void slice_array( ItmNs::Itm::equilibriumArray &eq)
 
type (type_equilibrium),pointer :: cpoArray(:)
/**** Code XML parameters ***/
void code_params(...., ItmNs::codeparam_t& param)
 type(type_param), intent(in) :: codeparam
 
/**** Arbitrary diagnostic info ***/
void diag_info(...., int* outFlag, char** diagInfo)
integer    ::     outputFlag
character(len=:), pointer   ::    diagInfo
IMAS

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**** Fortran intrinsic data types ***/
integer :: input
character(50) :: charstring
integer,dimension(4) :: tabint
 
/**** Single slice ***/
void slice(IdsNs::IDS::equilibrium &eq)type (ids_equilibrium) :: cpo
 
/**** Array of slices ***/
void slice_array( IdsNs::IDS:equilibrium &eq)
type (ids_equilibrium) :: ids <== SINGLE OBJ !!!
 
/**** Code XML parameters ***/
void code_params(...., IdsNs type(ids_parameters_input), intent(in) :: codeparam_t& param)
 
/**** Arbitrary diagnostic info ***/
void diag_info(...., int* outFlag, char** diagInfo)
integer    ::     outputFlag
character(len=:), pointer   ::    diagInfo

 

4.2.3 Delivery of the user code

...

2.1 Subroutine syntax

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

  • name - subroutine name
  • in/out arguments list - a list of input and output subroutine arguments
  • diagnostic_info - arbitrary output diagnostic information

2.2. Arguments list

  • A mandatory position
  • A list of input and output subroutine arguments including:
    • Fortran intrisic data types, eg:
      • integer :: input
      • character(50) :: charstring
      • integer,dimension(4) :: tabint
    • IDSes, eg:
      • type (type_equilibrium),pointer :: equilibriumin(:)
      • type (type_distsource),pointer :: distsourceout(:)
Warning
  • Do not forget to add: use imas_schemas, while playing with IDSes
  • Please use intent(in), intent(out) to point in/out parameters

2.3. Code parameters

  • user defined input parameters
  • input / optional
  • Argument of type: type_param

    Code Block
    type type_param  !
      character(len=132), dimension(:), pointer ::parameters 
      character(len=132), dimension(:), pointer ::default_param  
      character(len=132), dimension(:), pointer ::schema         
    endtype
  • Derived type type_param 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: 
    • (type_param) :: codeparam{{

2.4. Diagnostic info

  • arbitrary output diagnostic information
    • output / optional

      Code Block !---- Diagnostic info ---- integer, intent(out) :: user_out_outputFlag character(len=:), pointer, intent(out) :: user_out_diagnosticInfo
    • outputFlag - indicates if user subroutine was successfully executed

      • outpuflag = 0    - SUCCESS, no action is taken

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

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

    • diagnosticInfo - an arbitrary string


2.5. Examples

Code Block
titleExample 1 Simple in/out argument types
subroutine noids(input, output) integer, intent(in):: input integer, intent(out):: output


 

 

Code Block
titleExample 2 A IDS array as a subroutine argument
subroutine equil2dist(equilibriumin, distsourceout) use imas_schemas implicit none  !input type (type_equilibrium), pointer :: equilibriumin(:) !output  type (type_distsource), pointer :: distsourceout(:)


 

 

Code Block
titleExample 3 Usage of code input parameters
subroutine teststring(coreprof,equi,tabint,tabchar,codeparam)
   use imas_schemas                                                                              
   implicit none                                             

  !input
  type(type_coreprof),pointer,dimension(:) :: coreprof
  integer, dimension(4), intent(in) :: tabint

  !output
  type(type_equilibrium),pointer,dimension(:) :: equi
  character(50), intent(out) :: tabchar

  !code parameters
  type(type_param), intent(in) :: codeparam


 


 

4. Delivery of the user code

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


 
Code Block
languagebash
titleExample 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

 


 

 

Tip

Recomendations

  • Please use eval-pkg-config to get UAL flags and not hard coded references.
  • The usage of environment variables for identifying compilers and versions of the pkg-config is recommended.

 

 

...