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 CPO via UAL.
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! <-
1.1.1. 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 CPO from UAL
- know how to access CPO 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/cpo_basics/python/
3. Execute sample code
shell> python ./put_cpo_array.py shell> python ./put_cpo_slices.py
4. Open example file
Handling CPOs: put() vs. putSlice() | |
---|---|
$TUTORIAL_DIR/cpo_basics/python/put_cpo_array.py import sys from pylab import * import ual cpo = ual.itm(13,3) cpo.create() if not cpo.isConnected(): print 'error during itmdb entry creation' sys.exit(1) cpo.equilibriumArray.resize(10) equi = cpo.equilibriumArray #First fill fields which are not time-dependent. equi.array[0].datainfo.dataprovider = 'MKO' equi.array[0].datainfo.putdate = '20/09/2016' equi.array[0].codeparam.parameters = 'param' # ---- a loop ---- for i in range(0, 10): #Fill time-dependent fields equi.array[i].eqgeometry.boundary.resize(1) equi.array[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)) #Do not forget time!! equi.array[i].time = i # ---- a loop ---- #Save data in the database equi.put() # <= Called outside the loop #close the pulse file cpo.close() | $TUTORIAL_DIR/cpo_basics/python/put_cpo_slices.py import sys from pylab import * import ual cpo = ual.itm(14,4) cpo.create() if not cpo.isConnected(): print 'error during itmdb entry creation' sys.exit(1) equi = cpo.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() # ---- 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)) equi.eqgeometry.boundary[0].z = cos(arange(0,2*pi,2*pi/100)) + (1/float(100-i)) #Do not forget time!! equi.time = i #Append this slice in the database equi.putSlice() # <= Called inside the loop # ---- a loop ---- #close the pulse file cpo.close() |
VI related notice I will use VI in every place where text files are modified. If you have any other text file editor of your choice - fell free to use it instead. |
vi $TUTORIAL_DIR/cpo_basics/python/put_cpo.py
What you can see here is a simple code that stores particular CPO into MDSPlus database using UAL.
Let's check how to read these data in Fortran.
1.1.2. 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 CPO 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/cpo_basics/fortran
Handling CPOs: get() vs. getSlice() | |
---|---|
$TUTORIAL_DIR/cpo_basics/fortran/get_cpo_array.f90 program diagnostic use euitm_schemas use euitm_routines implicit none integer :: idx, i, arraySize type (type_equilibrium), pointer :: eqArray(:) ! <= Array !!! call euitm_open('euitm', 14, 4, idx) call euitm_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 euitm_close(idx) end program | $TUTORIAL_DIR/cpo_basics/fortran/get_cpo_slices.f90 program diagnostic use euitm_schemas use euitm_routines implicit none integer :: idx, i, arraySize type (type_equilibrium) :: equilibrium real(EUITM_R8), pointer :: timeVector(:) real(EUITM_R8) :: time call euitm_open('euitm', 14, 4, idx) call euitm_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 euitm_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 euitm_close(idx) end program |
4. Compile the code
shell> make clean shell> make
5. Run the code
shell> ./get_cpo_array.exe shell> ./get_cpo_slices.exe
6. You should see values that we have stored using Python based code.
1.2. 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:
- Prepare Fortran code that has a subroutine to be called and is compiled as a library
- Prepare FC2K based description of the actor
- 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