9. AMNS¶
9.1. Scientific Rationale and Main Objectives¶
The EU-IM has a broad need for data relating to atomic, molecular, nuclear and surface data (AMNS). In particular, AMNS data are needed in several of the EU-IM modelling projects. A consistent approach, taking into account the specific requirements of the EU-IM while maintaining the work aligned with other European efforts in this area, is therefore required.
9.2. EU-IM contact person¶
David Coster
9.3. AMNS tasks¶
The AMNS work is divided into two broad areas:
- The maintenance and development of the AMNS library (and the associated AMNS CPO) to provide access to AMNS data in the various languages used by the codes within the Work Package
- The addition to the AMNS database of AMNS data needed by the codes within the Work Package
9.4. AMNS Documentation¶
The AMNS library is meant to be called by Work Package codes if the codes need data for Atomic, Molecular, Nuclear or Surface processes. The calling sequence is described in more detail below, but the basic idea is: (1) initialize the package; (2) request data for a particular reaction by initializing a “table” for that reaction; (3) (repeatedly) requesting data for that reaction as a fuction of plasma or other parameters; (4) finishing with the table; and (5) finishing with the AMNS library.
The actual AMNS data is provided by CPOs stored under the “amns” tokamak and will first be searched for in the user’s database, and if not found there, the system will default to obtaining the data from the public AMNS database. Multiple versions of the AMNS data are possible: in 4.09a and 4.09b this was done via a mysql database; in 4.10a and 4.10b this is done by having an index block stored in shot 0, run 1 of the AMNS CPO.
The implementation in IMAS IDS’s has followed the example of the CPO implementation using shot 0, run 1 to store an index of available data.
Some papers:
- “Simulations of the edge plasma: the role of atomic, molecular and surface physics”, AIP Conference Proceedings 1125, 113 (2009); https://doi.org/10.1063/1.3141685, D. P. Coster, X. Bonnin, D. Reiter, A. Kukushkin, S. Gori, P. Krstic, P. Strand, L.‐G. Eriksson, and Contributors to the EFDA‐TF‐ITM
- “Implementation of PIC/MC Code BIT1 in ITM Platform”, Contrib. Plasma Phys., 54 (4-6), 399–403 (2014), https://doi.org/10.1002/ctpp.201410029, D. Tskhakaya, D. Coster and ITM-TF contributors
The present coding for the AMNS project is done in the gforge amnsproto project.
9.4.1. AMNS User Interface¶
This section discusses the user interface to the AMNS subsystem.
The AMNS library is made available via a module - available versions can be found by executing
module avail amns
module avail AMNS
The include and library locations are specified via the “pkg-config” system. To display the available package names do
pkg-config --list-all | grep -i amns
The AMNS library can be called from
- Fortran
- C /C++
- Python
- Java
- Matlab
The various bindings for the different languages are given below, but make use of a set of standard concepts which are described first.
9.4.1.1. AMNS User Interface Data Structures¶
A number of data structures are used by the library interface. Some are opaque (i.e. the contents are not of relevance to the user), and some need to be set or read by the user programme.
The two opaque types are handles which are returned by the setup routines and then need to be passed to the other routines:
- amns_handle_type, used for the database wide routines
- amns_handle_rx_type, used for the reaction specific routines
In some language bindings these are the basis of classes.
The non-opaque types are:
- amns_error_type, used to indicate if an error occured and, if so, what the error was
- amns_reaction_type, used to indicate the requested reaction
- amns_set_type, used to set an AMNS internal parameter
- amns_query_type, used to query an AMNS internal parameter
- amns_answer_type, used to contain the answer from an AMNS query
- amns_version_type, used to specify the AMNS version
- amns_reactants_type, used to specify the reactants to a reaction
- amns_reactant_type, a sub-component of amns_reactants_type used to characterize the individual reactants
The definitions of these data types can be found at the doxygen documentation for the AMNS User routines
9.4.1.2. AMNS User Interface Data Reactions¶
The currently available reactions specified in reaction_typex%string in the call to EU-IM_AMNS_SETUP_TABLE are
- RC: Recombination (acd)
- EI: Electron Impact Ionisation (scd)
- CX: CX recombination coeffts (ccd)
- BR: Recomb/brems power coeffts (prb)
- LR: Line radiation (plt)
- ZE: Effective Charge (zcd)
- ZE2: Effective Square Charge (ycd)
- EIP: Effective Ionisation Potential (ecd)
- some nuclear reactions
- Cross-sections of different processes
- …
The actual reactions are listed in the AMNS section.
9.4.1.3. AMNS User Interface Data Queries¶
The currently available queries for query%string in the call to EU-IM_AMNS_QUERY is
- version: Return the version information
The currently available queries for query%string in the call to EU-IM_AMNS_QUERY_TABLE are
- source: source (origin) of the data
- no_of_reactants: number of tractants involved
- index: Not sure what this is
- filled: whether the data table has been filled (“Filled” or “Empty”)
- reaction_type: reaction type
- reactants: nuclear charges of reactants
- version: information about the version
- state_label: label for the charge state (if appropriate)
- result_unit: units of the result
- result_label: description of the result
9.4.1.4. AMNS User Interface Data Setting Options¶
The currently setting options for set%string in the call to EU-IM_AMNS_SET is
- NONE
The currently available setting options for set%string in the call to EU-IM_AMNS_SET_TABLE is
- nowarn: deactivate warning when extrapolating
9.4.1.5. FORTRAN AMNS User Interface¶
The fortran interface to the AMNS subsystem is based on a standardised set of calls to the AMNS library. The details of what lies behind these calls is the responsibility of the AMNS data providers and does not need to be understood by the users of the AMNS data.
The code modules devloped for the AMNS project are hosted in gforge as the project amnsproto.
9.4.1.5.1. AMNS User Interface: Fortran Calls¶
The 9 calls to the AMNS system are:
- EU-IM_AMNS_SETUP, initialization call for the AMNS package
subroutine EU-IM_AMNS_SETUP(handle, version, error_status)
optional version, error_status
type(amns_handle_type), intent(out) :: handle
type(amns_version_type), intent(in) :: version
type(amns_error_type), intent(out) :: error_status
- EU-IM_AMNS_QUERY, query routine for the AMNS package
subroutine EU-IM_AMNS_QUERY(handle,query,answer,error_status)
optional error_status
type(amns_handle_type), intent(in) :: handle
type(amns_query_type), intent(in) :: query
type(amns_answer_type), intent(out) :: answer
type(amns_error_type), intent(out) :: error_status
- EU-IM_AMNS_SET, set a parameter for the AMNS package
subroutine EU-IM_AMNS_SET(handle,set,error_status)
optional error_status
type(amns_handle_type), intent(in) :: handle
type(amns_set_type), intent(in) :: set
type(amns_error_type), intent(out) :: error_status
- EU-IM_AMNS_FINISH, finalization call for the AMNS package
subroutine EU-IM_AMNS_FINISH(handle, error_status)
optional error_status
type(amns_handle_type), intent(inout) :: handle
type(amns_error_type), intent(out) :: error_status
- EU-IM_AMNS_SETUP_TABLE, initialization call for a particular reaction
subroutine EU-IM_AMNS_SETUP_TABLE(handle, reaction_type, reactant, handle_rx, error_status)
optional error_status
type(amns_handle_type), intent(in) :: handle
type(amns_reaction_type), intent(in) :: reaction_type
type(amns_reactants_type), intent(in) :: reactant
type(amns_handle_rx_type), intent(out) :: handle_rx
type(amns_error_type), intent(out) :: error_status
EU-IM_AMNS_QUERY_TABLE, query routine for a particular reaction
qsubroutine EU-IM_AMNS_QUERY_TABLE(handle_rx,query,answer,error_status) optional error_status type(amns_handle_rx_type), intent(in) :: handle_rx type(amns_query_type), intent(in) :: query type(amns_answer_type), intent(out) :: answer type(amns_error_type), intent(out) :: error_status
EU-IM_AMNS_SET_TABLE, set a parameter for a particular reaction
subroutine EU-IM_AMNS_SET_TABLE(handle_rx,set,error_status)
optional error_status
type(amns_handle_rx_type), intent(in) :: handle_rx
type(amns_set_type), intent(in) :: set
type(amns_error_type), intent(out) :: error_status
- EU-IM_AMNS_FINISH_TABLE, finalization call for a particular reaction
subroutine EU-IM_AMNS_FINISH_TABLE(handle_rx, error_status)
optional error_status
type(amns_handle_rx_type), intent(inout) :: handle_rx
type(amns_error_type), intent(out) :: error_status
- EU-IM_AMNS_RX, get the rates associated with the input args for a particular reaction
interface EU-IM_AMNS_RX
module procedure EU-IM_AMNS_RX_1, EU-IM_AMNS_RX_2, EU-IM_AMNS_RX_3
end interface
subroutine EU-IM_AMNS_RX_1(handle_rx,out,arg1,arg2,arg3,error_status)
optional arg2,arg3,error_status
type(amns_handle_rx_type), intent(inout) :: handle_rx
real (kind=R8), intent(out) :: out(:)
real (kind=R8), intent(in) :: arg1(:),arg2(:),arg3(:)
type(amns_error_type), intent(out) :: error_status
subroutine EU-IM_AMNS_RX_2(handle_rx,out,arg1,arg2,arg3,error_status)
optional arg2,arg3,error_status
type(amns_handle_rx_type), intent(inout) :: handle_rx
real (kind=R8), intent(out) :: out(:,:)
real (kind=R8), intent(in) :: arg1(:,:),arg2(:,:),arg3(:,:)
type(amns_error_type), intent(out) :: error_status
subroutine EU-IM_AMNS_RX_3(handle_rx,out,arg1,arg2,arg3,error_status)
optional arg2,arg3,error_status
type(amns_handle_rx_type), intent(inout) :: handle_rx
real (kind=R8), intent(out) :: out(:,:,:)
real (kind=R8), intent(in) :: arg1(:,:,:),arg2(:,:,:),arg3(:,:,:)
type(amns_error_type), intent(out) :: error_status
9.4.1.5.2. AMNS User Interface Example (Fortran)¶
An example of the use of the code can be found in the (fortran minimal example):
program minimal
use itm_types
use amns_types
use amns_module
implicit none
type (amns_handle_type) :: amns ! AMNS global handle
type (amns_handle_rx_type) :: amns_rx ! AMNS table handle
type (amns_reaction_type) :: xx_rx
type (amns_reactants_type) :: species
real (kind=R8) :: te=100.0_R8, ne=1e20_R8, rate
call EU-IM_AMNS_SETUP(amns) ! set up the AMNS system
allocate(species%components(4)) ! set up reactants
species%components = (/ amns_reactant_type(6, 1, 12, 0), &
amns_reactant_type(1, 0, 2, 0), &
amns_reactant_type(6, 0, 12, 1), &
amns_reactant_type(1, 1, 2, 1) /)
xx_rx%string='CX' ! set up reaction
call EU-IM_AMNS_SETUP_TABLE(amns, xx_rx, species, amns_rx) ! set up table
call EU-IM_AMNS_RX(amns_rx, rate, te, ne) ! get results
write(*,*) 'Rate = ', rate
call EU-IM_AMNS_FINISH_TABLE(amns_rx) ! finish with table
call EU-IM_AMNS_FINISH(amns) ! finish with amns
end program minimal
9.4.1.5.3. AMNS User Interface Example Fortran Makefile¶
An example Makefile demonstrating the use of the AMNS routines:
obj/minimal: src/minimal.f90
ifort -g -o $@ $< ${shell eval-pkg-config --cflags --libs \
amns-amd64_intel_12 itmtypes-amd64_intel_12 ual-amd64_intel_12}
Other examples can be found (here):
9.4.2. C AMNS User Interface¶
The C interface to the AMNS subsystem is based on a standardised set of calls to the AMNS library. The details of what lies behind these calls is the responsibility of the AMNS data providers and does not need to be understood by the users of the AMNS data.
The code modules devloped for the AMNS project are hosted in gforge as the project amnsproto.
9.4.2.1. AMNS User Interface: C Calls¶
The 9 calls to the AMNS system are:
- EU-IM_AMNS_SETUP, initialization call for the AMNS package
void EU-IM_AMNS_C_SETUP(void **handle_out, amns_error_type *error_status);
- EU-IM_AMNS_QUERY, query routine for the AMNS package
void EU-IM_AMNS_C_QUERY(void *handle_in, amns_query_type *query,
amns_answer_type *answer, amns_error_type *error_status)
- EU-IM_AMNS_SET, set a parameter for the AMNS package
void EU-IM_AMNS_C_SET(void *handle_in, amns_set_type *set, amns_error_type *error_status);
- EU-IM_AMNS_FINISH, finalization call for the AMNS package
void EU-IM_AMNS_C_FINISH(void **handle_inout, amns_error_type *error_status);
- EU-IM_AMNS_SETUP_TABLE, initialization call for a particular reaction
void EU-IM_AMNS_C_SETUP_TABLE(void *handle_in, amns_reaction_type *reaction_type,
void *reactant_handle_in, void **handle_rx_out,
amns_error_type *error_status);
- EU-IM_AMNS_QUERY_TABLE, query routine for a particular reaction
void EU-IM_AMNS_C_QUERY_TABLE(void *handle_rx_in, amns_query_type *query,
amns_answer_type *answer, amns_error_type *error_status);
- EU-IM_AMNS_SET_TABLE, set a parameter for a particular reaction
void EU-IM_AMNS_C_SET_TABLE(void *handle_rx_in, amns_set_type *set,
amns_error_type *error_status);
- EU-IM_AMNS_FINISH_TABLE, finalization call for a particular reaction
void EU-IM_AMNS_C_FINISH_TABLE(void **handle_rx_inout, amns_error_type *error_status);
- EU-IM_AMNS_RX, get the rates associated with the input args for a particular reaction
void EU-IM_AMNS_C_RX_0_A(void *handle_rx_in, double *out,
double arg1, amns_error_type *error_status);
void EU-IM_AMNS_C_RX_0_B(void *handle_rx_in, double *out,
double arg1, double arg2, amns_error_type *error_status);
void EU-IM_AMNS_C_RX_0_C(void *handle_rx_in, double *out,
double arg1, double arg2, double arg3, amns_error_type *error_s
tatus);
void EU-IM_AMNS_C_RX_1_A(void *handle_rx_in, int nx, double *out,
double *arg1, amns_error_type *error_status);
void EU-IM_AMNS_C_RX_1_B(void *handle_rx_in, int nx, double *out,
double *arg1, double *arg2, amns_error_type *error_status);
void EU-IM_AMNS_C_RX_1_C(void *handle_rx_in, int nx, double *out,
double *arg1, double *arg2, double *arg3, amns_error_ty
pe *error_status);
void EU-IM_AMNS_C_RX_2_A(void *handle_rx_in, int nx, int ny,
double *out, double *arg1, amns_error_type *error_status);
void EU-IM_AMNS_C_RX_2_B(void *handle_rx_in, int nx, int ny,
double *out, double *arg1, double *arg2, amns_error_type *error_status);
void EU-IM_AMNS_C_RX_2_C(void *handle_rx_in, int nx, int ny,
double *out, double *arg1, double *arg2, double *arg3, amns_error_type *error_status);
void EU-IM_AMNS_C_RX_3_A(void *handle_rx_in, int nx, int ny, int nz,
double *out, double *arg1, amns_error_type *error_status);
void EU-IM_AMNS_C_RX_3_B(void *handle_rx_in, int nx, int ny, int nz,
double *out, double *arg1, double *arg2, amns_error_type *error_status);
void EU-IM_AMNS_C_RX_3_C(void *handle_rx_in, int nx, int ny, int nz,
double *out, double *arg1, double *arg2, double *arg3, amns_error_type *error_status);
In addition, service routines are provided for dealing with reactants:
void EU-IM_AMNS_C_SETUP_REACTANTS(void **reactants_handle_out, char string_in[reaction_length],
int index_in, int n_react
ants);
void EU-IM_AMNS_C_SET_REACTANT(void *reactants_handle_in, int reactant_index, amns_reactant_type *reactant_in);
void EU-IM_AMNS_C_GET_REACTANT(void *reactants_handle_in, int reactant_index, amns_reactant_type *reactant_out);
void EU-IM_AMNS_C_FINISH_REACTANTS(void **reactants_handle_inout);
9.4.2.2. AMNS User Interface Example (C)¶
An example of the use of the code can be found in the (c minimal example):
#include "amns_interface.h"
int main(int argc, char *argv[])
{
void* amns_handle = NULL;
amns_c_error_type error_stat = DEFAULT_AMNS_C_ERROR_TYPE;
void* reactants_handle = NULL;
amns_c_reactant_type species1 = {.ZN=6, .ZA=1, .MI=12, .LR=0};
amns_c_reactant_type species2 = {.ZN=1, .ZA=0, .MI=2 , .LR=0};
amns_c_reactant_type species3 = {.ZN=6, .ZA=0, .MI=12, .LR=1};
amns_c_reactant_type species4 = {.ZN=1, .ZA=1, .MI=2 , .LR=1};
amns_c_reaction_type xx_rx = {.string = "CX"};
void* amns_cx_handle;
double rate;
EU-IM_AMNS_CC_SETUP(AMNS_HANDLE, &ERROR_STAT)
printf("error = %s: %s\n", error_stat.flag ? "true" : "false", error_stat.string);
EU-IM_AMNS_CC_SETUP_REACTANTS(REACTANTS_HANDLE, "", 0, 4)
EU-IM_AMNS_CC_SET_REACTANT(reactants_handle, 1, SPECIES1)
EU-IM_AMNS_CC_SET_REACTANT(reactants_handle, 2, SPECIES2)
EU-IM_AMNS_CC_SET_REACTANT(reactants_handle, 3, SPECIES3)
EU-IM_AMNS_CC_SET_REACTANT(reactants_handle, 4, SPECIES4)
EU-IM_AMNS_CC_SETUP_TABLE(amns_handle, XX_RX, REACTANTS_HANDLE, &AMNS_CX_HANDLE, &ERROR_STAT)
printf("error = %s: %s\n", error_stat.flag ? "true" : "false", error_stat.string);
EU-IM_AMNS_CC_RX_0_B(amns_cx_handle, RATE, 100.0, 1E20, &ERROR_STAT)
printf("error = %s: %s\n", error_stat.flag ? "true" : "false", error_stat.string);
printf("rate=%e\n", rate);
EU-IM_AMNS_CC_FINISH_TABLE(AMNS_CX_HANDLE, &ERROR_STAT)
printf("error = %s: %s\n", error_stat.flag ? "true" : "false", error_stat.string);
EU-IM_AMNS_CC_FINISH_REACTANTS(REACTANTS_HANDLE)
EU-IM_AMNS_CC_FINISH(AMNS_HANDLE, &ERROR_STAT)
printf("error = %s: %s\n", error_stat.flag ? "true" : "false", error_stat.string);
return 0;
}
9.4.3. Python AMNS User Interface¶
The Python interface to the AMNS subsystem is based on a standardised set of calls to the AMNS library. The details of what lies behind these calls is the responsibility of the AMNS data providers and does not need to be understood by the users of the AMNS data.
The code modules devloped for the AMNS project are hosted in gforge as the project amnsproto.
9.4.3.1. AMNS User Interface: Python Calls¶
The Python interface creates
- Amns (class)
- finalize (method)
- get_table (method)
- query (method)
- set (method)
- Table (class)
- data (method)
- finalize (method)
- query (method)
- set (method)
- Reactants (class)
- add (method)
- test (method)
- value (method)
9.4.3.2. AMNS User Interface Example (Python)¶
An example of the use of the code can be found in the (python minimal example):
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import amns
import numpy as np
amnsdb = amns.Amns()
r = amns.Reactants()
r.add(6,1,12)
r.add(1,0,2)
r.add(6,0,12,lr=1)
r.add(1,1,2,lr=1)
table = amnsdb.get_table("CX", r)
print "table.no_of_reactants", table.no_of_reactants
print table.data(np.array([100.0]), np.array([1e20]))
amnsdb.finalize()