The process to read data is done in 3 steps:
1) Initialisation of the library
2) Data loading
3) Data extracting
filename: (character * (*)) Is the input simulation filename. It can be
an absolute
filename path or just a simulation name (eg "gas001"). In the later case,
all the parameters of the simulation, if it exists, will be automatically
collected from the simulation database filename stored in the usual place
(/pil/programs/DB/simulation.dbl).
selected_component: (character * (*))
select components or range of particles that you want to load. The
following data can be requested:disk,gas,halo,bulge,stars,bndry,all. A
range with the value "0:299999" select the particles between 0 and 299999.
For NEMO simulation, range and components of the selected simulation will
be taken from the file /pil/programs/DB/simulation.dbl. You can request
several data separated with a "," like this:
"disk,gas". The order of your selection will be respected when you will
get the data.
selected_time: (character * (*)) select a range of time
from where you want to select the
particles. You can request several range of times separated with a ",".
Example: "700:750,800:900" will only proceed on particles in the time
range [700:750] and [800:900].
integer uns_sim_type(ident) This function
return an integer matching to the type of the snaphot identified by
the integer ident. It returns "0" for nemo snapshot, "1" for gadget snapshot.
selected_values: (character * (*)) The extra
variable selected_values allows to restrict the loading of
selected values only. It can speedup the file
loading and reduce the memory footprint. Each value is specified by a
character. Here is all the possibilities :
’m’ mass
’x’ position
’v’ velolcity
’p’ potential
’a’ acceleration
’e’ softening
’k’ keys array (from nemo)
’X’ aux array (from nemo)
’R’ density
’I’ particles’s Id
’U’ Internal energy
’M’ metallicity
’A’ stars’s age
’H’ hsml
’T’ temperature
example: "mxR" will load mass, position and density only.
Each functions return 1 if success or 0 if it fails.
There is a set
of uns_get_value functions to get data value (float or integer) from the
snapshot. Each functions take as first parameter an integer ident, returned
by the function uns_init(...).
function integer uns_get_value_i(ident,tag,data) Put in the integer variable data, the requested tag value. Tag is a string variable.
tag="nsel" => set data with number of particles selected
function integer uns_get_value_f(ident,tag,data) Put in the real*4 variable data, the requested tag value. Tag is a string variable.
tag="time" => set
data with snapshot time
tag="redshift" => set data with snapshot redshift function integer uns_get_array_i(ident,component,tag,data,n) Put in the integer array variable data(n), the requested combination of tag value and component. Tag and component are string variables. tag="id" => set data array with component ids tag="nbody" => set n value with component nbody function integer uns_get_array_f(ident,component,tag,data,n) Put in the real*4 array variable data(n), the requested combination of tag value and component. Tag and component are string variables. tag="pos" => set data array with component position tag="vel" => set data array with component velocity tag="mass" => set data array with component mass tag="acc" => set data array with component acceleration tag="pot" => set data array with component potential tag="rho " => set data array with component density tag="u" => set data array with component internal energy tag="hsml" => set data array with component hydro smooth length tag="age" => set data array with component age tag="metal" => set data array with component metalicity tag="temp" => set data array with component temperature DATA EXTRACTING (uns_get_XXXX) There is a set of uns_get_XXXX functions to get data from the snapshot. Each functions take as the first parameter an integer ident returned by the function uns_init(...). subroutine uns_get_nbody(ident,nbody) Put in the integer variable nbody the #bodies resquested according to the selected_component variable (Cf uns_init(...) function). subroutine uns_get_time(ident,time) Put in the floating variable time the current time of the simulation. subroutine uns_get_pos(ident,pos,size_array) Put in the two dimensional floating array pos(3,size_array), all the positions requested. subroutine uns_get_vel(ident,vel,size_array) Put in the two dimensional floating array vel(3,size_array), all the velocities requested. subroutine uns_get_mass(ident,mass,size_array) Put in the one dimensional floating array mass(size_array), all the masses requested. function integer uns_get_age(ident,age,size_array) Put in the one dimensional floating array age(size_array), all the particles with an age (stars). It returns the number of stars particles or 0. function integer uns_get_metal(ident,metal,size_array) Put in the one dimensional floating array metal(size_array), all the particles with metalicity (gas+stars) in the respective order gas then stars. It returns the number of gas+stars particles or 0. function integer uns_get_metal_gas(ident,metal,size_array) Put in the one dimensional floating array metal(size_array), metalicity of the gas particles. It returns the number of gas particles or 0. function integer uns_get_metal_stars(ident,metal,size_array) Put in the one dimensional floating array metal(size_array), metalicity of the stars particles. It returns the number of stars particles or 0. function integer uns_get_u(ident,u,size_array) Put in the one dimensional floating array u(size_array), internal energy of the gas particles. It returns the number of gas particles or 0. function integer uns_get_temp(ident,temp,size_array) Put in the one dimensional floating array temp(size_array), temperature of the gas particles. It returns the number of gas particles or 0. function integer uns_get_rho(ident,rho,size_array) Put in the one dimensional floating array rho(size_array), density of the gas particles. It returns the number of gas particles or 0. integer uns_get_range(ident,component,nbody,first,last) This function give the particles’s range for a selected component. You give in a string variable component, the name of the component, and the function return an integer variable nbody (#bodies), first and last, the first and the last index of the component in the array. First and last values are given in fortran array convention (starts from index 1). It returns "1" if the component exist, and "0" otherwise. Example to get halo’s particles range: status = uns_get_range(ident,"halo",n,first,last) integer uns_get_eps(ident,component,eps) This function give the softening for a selected component. You give in a string variable component, the name of the component, and the function return a float variable eps. It returns "1" if the softening exist for the component, and "0" otherwise. This function will only work if the simulation requested belong to the database file /pil/programs/DB/simulation.dbl. Example to get halo’s softening: status = uns_get_eps(ident,"halo",eps) integer uns_get_cod(ident,component,time,tcod[7]) This function give the COD for a selected component (or a set of components separeted with ","), at the selected time. You give in a string variable component, the name of the component, and the function return a float array tcod[7] filled with respectively the time, x,y,z,vx,vy,vz of the COD. It returns "1" if the cod exist for the requested component and time. It returns "0" if the cod does not exits for the requested time. It returns "-1" if the COD file does not exist. This function will only work if the simulation requested belong to the database file /pil/programs/DB/simulation.dbl. Example to get "disk,stars"’s cod at time=0.1: status = uns_get_cod(ident,"disk,stars",0.1,tcod) Example ! ----------------------------------------------------------- program testlib implicit none integer iargc, lnblnk, narg, uns_init, uns_load, valid, ident, $ nbody character arg1 * 80, arg2 * 80, arg3 * 80 narg = command_argument_count() if (narg.ne.3) then write(0,*) "You must give 3 parameters:" write(0,*) "filename selected_component selected_time" stop endif call get_command_argument(1,arg1) ! get filename call get_command_argument(2,arg2) ! get selected component call get_command_argument(3,arg3) ! get selected time ! initialyze UNS engine ident=uns_init(arg1, arg2, arg3) ! return identifier for the snaphot ! ident must be positive if (ident.gt.0) then valid = 1 do while (valid .gt. 0) ! loop on all the time step valid = uns_load(ident) ! load data belonging to ident snapshot if (valid .gt. 0) then ! it goes fine call uns_get_nbody(ident, nbody) ! get #bodies call start(ident,nbody) endif enddo endif end ! ----------------------------------------------------------- subroutine start(ident,nbody) implicit none ! input parameters integer ident,nbody ! UNS variable integer status integer uns_get_range real *4 time, pos(3,nbody), vel(3,nbody), mass(3,nbody) ! various integer io_nemo_f character * 90 out integer n,first,last call uns_get_time(ident,time ) ! read time call uns_get_pos (ident,pos ,nbody) ! read pos call uns_get_vel (ident,vel ,nbody) ! read vel call uns_get_mass(ident,mass,nbody) ! read mass status = uns_get_range(ident,"gas",n,first,last) ! gas’s range out = "nemo.out" write(0,*) "nbody=",nbody," time=",time status = io_nemo_f(out,80,nbody,"float,save,3n,n,t,x,v,m", $ nbody,time,pos,vel,mass) end ! ----------------------------------------------------------- Compilation A fortran program which use the UNS library must link against NEMO library (-lnemo) and C++ library (-lstdc++). Here is an example of Makefile using gfortran compiler. # ---------------------------------------- # MAKEFILE to use UNS # ---------------------------------------- # find libg2c.a library LIB_G77 := $(shell g77 -print-libgcc-file-name 2> /dev/null) LIB_G77 := $(shell dirname $(LIB_G77) 2> /dev/null) # path for NEMO Library, UNS library and G2C UNS_LIB_PATH := $(LOCAL)/lib LIBS := -L$(NEMOLIB) -L$(UNS_LIB_PATH) -L$(LIB_G77) # - - - - - - - - - - - - - - - - - - - - # compilation with gfortran compiler # - - - - - - - - - - - - - - - - - - - - GFORTFLAGS = -Wall -O2 -ggdb -Wl,-rpath,$(UNS_LIB_PATH) testlibF : testlib.F gfortran $(GFORTFLAGS) -o $@ testlib.F $(LIBS) \ -lnemomaing77 -lunsio -lnemo -lg2c -lstdc++ -lm # ----------------------------------------
nemo(1NEMO), snapshot(5NEMO), gadget2nemo, uns_tonemo, uns_density, uns_2dplot
Jean-Charles.Lambert@oamp.fr
11-Dec-08 created JCL 09-Jun-11 a lot of improvement JCL