2. Development of Fortran codes
1.1. 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
1.2. 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(:)
- Fortran intrisic data types, eg:
- Always describe IDS as an array. In case of time slice, the size of the input IDS is 1 (!)
- Do not forget to add: use imas_schemas, while playing with IDSes
- Please use intent(in), intent(out) to point in/out parameters
1.3. 2.3. Code parameters
- user defined input parameters
- input / optional
Argument of type: type_param
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
{{
1.4. 2.4. Diagnostic info
- arbitrary output diagnostic information
output / optional
!---- Diagnostic info ---- integer, intent(out) :: user_out_outputFlag character(len=:), pointer, intent(out) :: user_out_diagnosticInfo
outputFlag
- indicates if user subroutine was successfully executedoutpuflag = 0
- SUCCESS, no action is takenoutputFlag > 0
- WARNING, a warning message is displayed, workflow continuue executionoutputFlag < 0
- ERROR, actor throws an exception, workflow stops
diagnosticInfo
- an arbitrary string
1.5. 2.5. Examples
Example 1 Simple in/out argument types
subroutine noids(input, output) integer, intent(in):: input integer, intent(out):: output
Example 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(:)
Example 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
2. 4. Delivery of the user code
The user code should be delivered as a static library.
Please find examples of the simple "makefiles" below:
Example 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
Example 7. Building of C++ code
CXX=g++ CXXFLAGS= -g -fPIC CXXINCLUDES= ${shell eval-pkg-config --cflags ual-cpp-gnu} all: libsimplecppactor.a libsimplecppactor.a: simplecppactor.o ar -rvs $@ $^ simplecppactor.o: simplecppactor.cpp $(CXX) $(CXXFLAGS) $(CXXINCLUDES) -c -o $@ $^ clean: rm *.a *.o
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.