Versions Compared

Key

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

...

  • GET_SLICE type methods are not in the scope of the task (they are alternative ways to retrieve parts of the data elements) – although may be useful to add (independently of the deliverable) if straightforward to implement.
  • Implementation in Python only, no plans for other languages
  • In case of nested AoS, it is not allowed to specify set of indices for AoS ancestors
  • IMPLEMENTATION IN NEW LL ONLY!!!!!

 

...

USE CASES:

 


  1. During the partial GET, only the requested node is returned (and the structure below if the node is not a leaf), not the whole structure above: get (« magnetics.flux_loop(i).flux ») à flux(t) for index (i) of its parent
  2. If the user specifies a set of indices for the parent, then the GET returns a reshaped leaf with an additional dimension (corresponding to the one of its parent). Reshaping is done while keeping time as the last dimension, to keep consistent with the IMAS DD rule (even if the reshaped leaf is not anymore a legal DD entity) :
    1. get (« magnetics.flux_loop(i1:i2).flux ») à flux(i1:i2, t)
    2. get (« equilibrium.time_slice(t1:t2).profiles_1d.q ») à q(:, t1:t2)
    3. In case of nested AoS, it is not allowed to specify set of indices for AoS ancestors. Only given values of AoS ancestors indices are handled : path/to/field/with/ancestorAoS(x:y)/field/AoS(n :m) is not managed by partial GET
Type of FieldIndicesQueryOutput
 

primitive/structureNOpath/to/field/with/ancestorAoS(x)/field

primitive_type[1]

structure[1]

 


primitive/structureYESpath/to/field/with/ancestorAoS(i1:i2)/field

primitive_type[n]

structure[n]

n=i2 - i1
primitive/structureYESpath/to/field/with/ancestorAoS(x:y)/field/AoS(n :m)/fieldERRORit is not allowed to specify set of indices for AoS ancestors
AoSNOpath/to/field/with/ancestorAoS(x)/field/AoS(y)AoS[1]if AoS is not a leaf, its "sub-structure" is filled in
AoSYESpath/to/field/with/ancestorAoS(x)/field/AoS(i1:i2)AoS[n]

n=i2 - i1

if AoS is not a leaf, its "sub-structure" is filled in

AoSYESpath/to/field/with/ancestorAoS(x:y)/field/AoS(n :m)ERRORit is not allowed to specify set of indices for AoS ancestors
AoSYESpath/to/field/with/ancestorAoS(x:y)/field/AoS(1)ERROR?????
 

 



Time issue in heterogeneous mode:

...

  • GET(/path/to/AoS/) - OK
  • GET(/path/to/AoS/data)  
    •   Homogeneous mode: OK
    • Heterogeneous  mode:
      • If requesting for single index - OK
      • otherwise - ERROR
  • GET(/path/to/AoS/time) 
    • Homogeneous mode: ids%time
    • Heterogeneous  mode: ERROR 

 



Example:

  • get (« magnetics.flux_loop(i1:i2).flux ») returns flux(i1:i2). This is an AoS with data(t) and time(t) below, which can be of different sizes for the various indices i1:i2

 


  • get (« magnetics.flux_loop(i1:i2).flux.data ») returns data(i1:i2,t) in homogeneous case, and an error message otherwise.

 

...

 



...


  • ids_get(<path_including_indices>)
    input parameterspulseCtx (OR shot, run, user, tokamak, version)
    • IDS name
    • occurence
    • QUERY
    • output parameters
      • array of primitive types (if query points to field of primitive type)
      • array of structures (if query points to field of AoS type or structure)
  • query syntax 
    • separators ( / . | ) - path within tree
    • brackets ()  []   - array
    • indices (fortran style)
      • ":" all elements
      • "x:y" (from x to y)
      • ":y" from begin to y
      • "x:" from x to the last 
    • only the last bracket AoS can contain indices:
      • YES: "path/to/field/with/ancestorAoS(1)/field/AoS(n:m)"
      • NO: "path/to/field/with/ancestorAoS(x:y)/field/AoS(1)"

 

...

  • Low Level:
    • read_data - sanity check of type only when requested
  • HLI:
    • method for creating AoS (method of classes representing AoS array) OR resize(1)
    • method to obtain AoS ctx
    • AoS classes - a special field indicating that class is AoS (question)

 

Algorithm:





Input: path (   /a/b/c(1)/d/e(m:n)/f/g  )

1) Convert path to array/list  {'a','b','c(1)','d','e(m:n)','f','g'}

2) Call traverse(ctx = p-fCtx, path, node = ids)

 

 

 

 

 

 

 

 

path/to/field/with/ancestorAoS(1)/field/AoS(n:m) -> AoS(n:m) 

...

ancestorAoS(x:y)/field(:) --> field(:,x:y)

 

 



Time issues

AoS

/path/ending/with/timedAoS(i1:i2)

...

From your email " get (« magnetics.flux_loop(i1:i2).flux.data ») returns data(i1:i2,t) in homogeneous case, and an error message otherwise."
So:
HETERO: 
  •  single index from the ancestor AoS is requested, so no reshaping should be done, and no attempt to fill in time arrays should be done. 
  • ERROR (because of  lack of time info available in returned data)
HOMO: OK (BTW Is "t" time or just size of "data" field ?  Why data can be returned in such case (also no time info returned)

...

 /path/to/timeDepArray(i1:i2) - path from root, no AoS3 on path
HOMO : OK
if field name is not "time" - no additional action
if field name is "time" - return ids%time
HETERO: OK
No special actions

Shape of returned arrays

 


/path/with/AoS(i1:i2)/data

...

+ data for AoS(i2) = {21, 22, 23, 24, 25}

 


Non timed AoS

get (« magnetics.flux_loop(i1:i2).flux ») à flux(i1:i2, t) 


If AoS is NON TIMED (AoS1 or AoS2) return array has shape (range, data_len)

...

arr(0,1) = 12

arr(1,2) = 23 


Timed AoS

get (« equilibrium.time_slice(t1:t2).profiles_1d.q ») à q(:, t1:t2)

 


If AoS is TIMED (AoS3) return array has shape (data_len, range)

...

arr(0,1) = 21

arr(2,1) = 23

 

 



OPEN POINTS: 


  • AoS as ancestor(s) of queried data
    • once implemented mechanism for creation of AoS could be reused to "go through" ancestors
  • returned value 
    • type provided by user?
    • AoS? if not - functionality can be placed at the Low Level and available for all HLIs (however it could be a problem with returned type  anyway)
  • Level of nesting
    • path/AoS(indices)/x/y/z ?