Versions Compared

Key

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

Table of Contents

3.1.1 Changes

 

CHEAT SHEET
ITMIMAS
import ual
import imas
ual.itm(shot, run)
imas.ids(shot, run)
cpoArray = itm_obj.<ids_name>Array
ids = imas_obj.<ids_name>
cpoArray.put()
ids.put()

 

3.1.2 Method "put"

 

 put
Info

In this tutorial

  • how can you integrate your code with UAL
  • how can you access data via UAL

Accessing data from UAL requires some modification to your code. In this part of tutorial, we will take a closer look on how to access IDS via UAL.

 

 

Warning

Warning

Stop here for a moment. Make sure you have followed the configuration setup before proceeding any further!

Configuration related tutorial is here -> Click me! <-

 

3.1 Accessing data using Python

Exercise no. 3 - After this exercise you will:

  • know how to access UAL using Python
  • know how to retrieve IDS from UAL
  • know how to access IDS data

Exercise no. 3 (approx. 15 min)

 

1. source ITMv1 script by invoking

source $ITMSCRIPTDIR/ITMv1 kepler test 4.10b > /dev/null 

2. Go to example directory

cd $TUTORIAL_DIR/ids_basics/python/

3. Execute sample code

Code Block
languagebash
shell> python ./put_ids_array.py
shell> python ./put_ids_slices.py

 

 

4. Open example file

Handling IDSes: put() vs. putSlice()
Code Block
languagepy
title$TUTORIAL_DIR/ids_basics/python/put_ids_array.pyITM
linenumberstrue
#system libraries
import sys
from pylab import * 

#UAL library
import ual

ids# Create a new instance of database
itm_obj = ual.itm(13,3)
idsitm_obj.create()

if not ids.isConnected():
    print 'error during itmdb entry creation'
    sys.exit(1)

ids.equilibriumArray.


cpoArray = itm_obj.equilibriumArray

# allocate the CPO structures
cpoArray.resize(10)
equi = ids.equilibriumArray

#First# fillFilling fields which are not time-dependent.
equi.array[0].datainfo.dataprovider = 'MKO'
equi.array[0].datainfo.putdate = '20/09/2016'
equi.array[0].with TIME-INDEPENDENT data
cpoArray[0].codeparam.parameters = 'param'

# SCALARS(!)

# ---- a loop ----
for i in range(0, 10):
    #Fill# time-dependentSetting fieldsvalues 
of time depended  equi.array[i].eqgeometry.boundary.resize(1)data 
    equi.arraycpoArray[i].eqgeometry.boundary[0].r = sin(arange(0,2*pi,2*pi/100)) + (1/float(100-i))
    equi.array[i].eqgeometry.boundary[0].z = cos(arange(0,2*pi,2*pi/100)) + (1/float(100-i))x.y = i
    
	#Do not forget time!!
    equi.arraycpoArray[i].time = i
# ---- a loop ----





#Save data in the database
equicpoArray.put() # <= Called outside the loop

#close the pulse file
idsitm_obj.close()
Code Block
languagepy
title$TUTORIAL_DIR/ids_basics/python/put_ids_slices.pyIMAS
linenumberstrue
#system libraries
import sys
from pylab import *numpy

#UAL library
import ualimas

ids# Create a new instance of database
imas_obj = ualimas.itmids(1411,4 22)
idsimas_obj.create()

if# not ids.isConnected():
    print 'error during itmdb entry creation'
    sys.exit(1)

equi = ids.equilibrium


#First fill fields which are not time-dependent.
equi.datainfo.dataprovider = 'MKO'
equi.datainfo.putdate = '20/09/2016'
equi.codeparam.parameters = 'param'

#Save time independent fields
equi.putNonTimed(Mandatory to define this property
ids.ids_properties.homogeneous_time = 0

ids = imas_obj.core_profiles

# allocate the IDS structures
ids.x.y.resize(10)
ids.time.resize(10))

# Filling fields with TIME-INDEPENDENT  data
ids.ids_properties.comment = 'IDS created by PUT'

# STORE AS SCALARS(!)
# ---- a loop ----
for i in range(0, 10):
	#Fill  time-dependent fields 
	equi.eqgeometry.boundary.resize(1)
  #  equi.eqgeometry.boundary[0].r = sin(arange(0,2*pi,2*pi/100)) + (1/float(100-i))
Setting values of time depended data
      equiids.eqgeometryx.boundaryy[0i].z = cos(arange(0,2*pi,2*pi/100)) + (1/float(100-i))
    
i 
	  
      #Do not forget time!!
    equi  ids.time[i] = i
# ---- a loop ----

# OR STORE AS VECTORS
ids.x.y = valueVector
ids.time = #Append this slice timeVector

#Save data in the database
    equi.putSliceids.put() # <= Called insideoutside the loop
# ---- a loop ----

#close the pulse file
idsimas_obj.close()

...

3.1.3 Method "putSlice"

 

putSlice()
Code Block
languagepy
titleITM
linenumberstrue
#system libraries
import sys
from pylab import * 

# UAL library
import ual

# Create a new instance of database
itm_obj = ual.itm(14,4)
itm_obj.create()

cpo = itm_obj.equilibrium




# Filling fields with TIME-INDEPENDENT data
cpo.codeparam.parameters = 'param'

#Save time independent fields
cpo.putNonTimed()





# Setting values of time depended data
cpo.x.y = VALUE
    
#Do not forget time!!
cpo.time = VALUE 
    
#Append this slice in the database
cpo.putSlice() 

#close the pulse file
itm_obj.close()
Code Block
languagepy
titleIMAS
linenumberstrue
#system libraries
import sys
import numpy

# UAL library
import imas

# Create a new instance of database
imas_obj = imas.ids(11, 22)
imas_obj.create()  

ids = imas_obj.core_profiles

# Mandatory to define this property
ids.ids_properties.homogeneous_time = 1

# Filling fields with TIME-INDEPENDENT  data
ids.ids_properties.comment = 'IDS created by putSlice'

#Save time independent fields
ids.putNonTimed()

# Allocate all variables, time coordinate of size 1
ids.time.resize(1)
ids.x.y.resize(1)

# Setting values of time depended data
ids.x.y[0] = VAKUE 

#Do not forget time!!
ids.time[0] = VALUE

#Append this slice in the database
ids.putSlice()

#close the pulse file
imas_obj.close()

 

3.1.4 Method "get"

 

get() CPO vs IDS
Code Block
languagepy
titleITM
linenumberstrue
#system libraries
import numpy
import sys

#UAL library
import ual

#Open the database
itm_obj = ual.itm(123,3)
itm_obj.open() 
        
cpoArray = itm_obj.pfsystemsArray

#Get data
cpoArray.get()

# SCALARS (!)
for i in range(len(cpoArray)):
      print "Time = " + str(cpoArray[i].time)
      print "Value = "+ str(cpoArray[i].x.y)






#close the pulse file
imas_obj.close()
Code Block
languagepy
titleIMAS
linenumberstrue
#system libraries
import sys
import numpy

#UAL library
import imas

#Open a database
imas_obj = imas.ids(11, 22)
imas_obj.open()  

ids = imas_obj.core_profiles

#Get data
ids.get()

# SCALARS (!)
for i in range(len(ids.time)):
    print 'Time   =' + str(ids.time[i]) 
    print 'Value  =' + str(ids.x.y[i])

# VECTORS (!)
print 'Time  = '  + str(ids.time)
print 'Value  = ' + str(ids.x.y)


#close the pulse file
imas_obj.close()

 

 

 

3.1.5 Method "getSlice"

 

 getSlice() CPO vs  IDS
Code Block
languagepy
titleITM
linenumberstrue
#system libraries
import sys
import numpy

#UAL library
import ual

#Open the database
itm_obj = ual.itm(11,22)
itm_obj.open() 
 
cpo = my_itm_obj.pfsystems

#Get data
cpo.getSlice(2, 1)

#SCALARS 
print 'Time : ' + str(cpo.time)
print 'VALUE = ' + str(ids.x.y)

#close the pulse file
itm_obj.close()
Code Block
languagepy
titleIMAS
linenumberstrue
#system libraries
import sys
import numpy

#UAL library
import imas

#Open a database
imas_obj = imas.ids(11,22)
imas_obj.open()  

ids = imas_obj.core_profiles

#Get data
ids.getSlice(2, 1)

#SCALARS 
print 'Time : ' + str(ids.time)
print 'VALUE = ' + str(ids.x.y)

#close the pulse file
imas_obj.close()

 

vi $TUTORIAL_DIR/ids_basics/python/put_ids.py

What you can see here is a simple code that stores particular IDS into MDSPlus database using UAL.

 

 

Let's check how to read these data in Fortran.

3.2 Accessing data using Fortran

Exercise no. 4 - After this exercise you will:

  • know how to connect to UAL
  • know how to retrieve data from UAL
  • know how to prepare Makefile for your Fortran code

Exercise no. 4 (approx. 15 min)

In this exercise you will read IDS and print some data stored inside.

1. source ITMv1 script by invoking

source $ITMSCRIPTDIR/ITMv1 kepler test 4.10b > /dev/null

2. Change directory to a demo location for this exercise

cd $TUTORIAL_DIR/ids_basics/fortran
 
Handling IDSes: get() vs. getSlice()
Code Block
title$TUTORIAL_DIR/ids_basics/fortran/get_ids_array.f90
linenumberstrue
program diagnostic
    use imas_schemas
    use imas_routines
    implicit none

    integer :: idx, i, arraySize
    type (type_equilibrium), pointer :: eqArray(:) ! <= Array !!!



    call imas_open('IDS', 14, 4, idx)
    
    call imas_get(idx, 'equilibrium', eqArray)
    arraySize = size(eqArray)
    write (*,*) "Number of slices: ", arraySize
    
	do i=1, arraySize
    	write (*,*) "Time: ", eqArray(i)%time
        write (*,*) "Value of r: ", eqArray(i)%eqgeometry%boundary(1)%r(1)
        write (*,*) "Value of z: ", eqArray(i)%eqgeometry%boundary(1)%z(1)
    enddo
    call imas_close(idx)
end program
Code Block
title$TUTORIAL_DIR/ids_basics/fortran/get_ids_slices.f90
linenumberstrue
program diagnostic
    use imas_schemas
    use imas_routines  
    implicit none

    integer :: idx, i, arraySize 
    type (type_equilibrium) :: equilibrium
    real(IMAS_R8), pointer :: timeVector(:)
    real(IMAS_R8) :: time

    call imas_open('IDS', 14, 4, idx)
    
    call imas_get_times(idx, 'equilibrium',timeVector)
    
    arraySize = size(timeVector)
    write (*,*) "Number of slices: ", arraySize
    write (*,*) "Time vector: ", timeVector
    
	do i = 1, arraySize
        time = timeVector(i)
        call imas_get_slice(idx, 'equilibrium', equilibrium, time, 1)
            
    	write (*,*) "Time [", time, "]: ",  equilibrium%time
        write (*,*) "Value of r: ", equilibrium%eqgeometry%boundary(1)%r(1)
        write (*,*) "Value of z: ", equilibrium%eqgeometry%boundary(1)%z(1)
    enddo
    
	call imas_close(idx)
end program

 

4. Compile the code
 
Code Block
shell> make clean
shell> make

5. Run the code

Code Block
shell> ./get_ids_array.exe
shell> ./get_ids_slices.exe

 

 

6. You should see values that we have stored using Python based code.

4. FC2K - Fortran Code to Kepler

It is possible to encapsulate Fortran/C++ code with Java code that represents Kepler actor. This way, you can easily incorporate your Fortran code with existing Kepler workflow. In order to make it happen you will have to:

  1. Prepare Fortran code that has a subroutine to be called and is compiled as a library
  2. Prepare FC2K based description of the actor
  3. Recompile Kepler with newly created actor

After these steps are performed, you will have an access to Kepler actor that encapsulates your Fortran code.

All these topics will be covered in separate tutorial: 1.4 Using FC2K for embedding Fortran code into Kepler

...