DISPATCH
_yt.py
1 # -*- coding: utf-8 -*-
2 """
3 Created on Mon Jul 30 03:59:33 2018
4 
5 @author: Aake
6 """
7 # Pythn 2/3 compatibility
8 from __future__ import print_function
9 
10 import numpy as np
11 import dispatch
12 import dispatch.select
13 import yt
14 
15 def parameters(s):
16  p=s.patches[0]
17  return { 'geometry': 'cartesian',
18  'sim_time': s.time,
19  'domain_dimensions': s.cartesian.dims,
20  'periodicity': p.periodic,
21  'length_unit': 1.0,
22  'time_unit': 1.0,
23  'mass_unit': 1.0,
24  'magnetic_unit': 1.0,
25  'velocity_unit': 1.0,
26  'unit_system': 'cgs',
27  #'unit_system': s.units.system,
28  'bbox': domain_bbox(s),
29  'refine_by': 2.
30  }
31 
32 tr={'d':'density',
33  'ux':'velocity_x',
34  'uy':'velocity_y',
35  'uz':'velocity_z',
36  'b1':'magnetic_field_x',
37  'b2':'magnetic_field_y',
38  'b3':'magnetic_field_z',
39  'tt':'temperature'}
40 
41 """
42  Only give these if also attaching units to the array data:
43  'length_units': p.units.l,
44  'time_units': p.units.t,
45  'mass_units': p.units.m,
46  'unit_system': p.units.system,
47 """
48 
49 def patch(p,copy=False):
50  p_void=(np.array([]),'code_length')
51  #if p.guard_zones:
52  # l=p.li
53  # u=p.ui+1
54  #else:
55  l=[0,0,0]
56  u=p.n
57  # if l[2]==u[2]:
58  # u[2]=u[2]+1
59  dict={ 'left_edge': p.llc_cart,
60  'right_edge': p.llc_cart+p.size,
61  'level': 1,
62  'dimensions': p.n,
63  'particle_position_x': p_void,
64  'particle_position_y': p_void,
65  'particle_position_z': p_void}
66  for k,iv in p.idx.dict.items():
67  if p.kind[0:6]=='ramses':
68  k = 'ux' if k=='p1' else k
69  k = 'uy' if k=='p2' else k
70  k = 'uz' if k=='p3' else k
71  elif p.kind[0:8]=='stagger2':
72  k = 'ux' if k=='p1' else k
73  k = 'uy' if k=='p2' else k
74  k = 'uz' if k=='p3' else k
75  else:
76  print (p.kind)
77  key = tr[k] if k in tr.keys() else k
78  if iv >= 0:
79  #if p.guard_zones:
80  # l=p.li
81  # u=p.ui+1
82  # if l[2]==u[2]:
83  # u[2]=u[2]+1
84  # dict[key]=p.var(iv,copy=copy)[l[0]:u[0],l[1]:u[1],l[2]:u[2]]
85  #else:
86  dict[key]=p.var(iv,copy=copy)
87  if 'aux' in p.keys:
88  for k in p.keys['aux']:
89  dict[k]=p.var(k,copy=copy)
90  return dict
91 
92 def patches(s,copy=True):
93  gg=[]
94  for p in s.patches:
95  gg.append(patch(p,copy=copy))
96  return gg
97 
98 def domain_dimensions(s):
99  return s.cartesian.dims
100 
101 def magnetic_unit(s):
102  return s.units.l**(-0.5)*s.units.m**(0.5)*s.units.t**(-1.0)
103 
104 def domain_bbox(s):
105  return np.array([s.cartesian.origin,s.cartesian.size]).T
106 
107 def open_amr(iout=1,run='.',data='../data',verbose=0,copy=True):
108  return snapshot(iout=iout,run=run,data=data,verbose=verbose,copy=copy)
109 
110 def snapshot(iout=1,run='.',data='../data',verbose=0,copy=True):
111  """
112  Open snapshot iout in directory data/run/, returning a YT data set
113  """
114  s=dispatch.snapshot(iout,run,data)
115  if verbose>1:
116  print('time:',s.time)
117  #
118  if verbose:
119  print(' yt patches:',len(s.patches))
120  print('domain_dimesions:',dispatch.yt.domain_dimensions(s))
121  #
122  parameters=dispatch.yt.parameters(s)
123  ds = yt.load_amr_grids(dispatch.yt.patches(s,copy=copy), **parameters)
124  return ds
125 
126 def open_unigrid(iout=1,run='.',data='../data',verbose=0,copy=True):
127  s=dispatch.snapshot(iout,run,data)
128  #
129  parameters=dispatch.yt.parameters(s)
130  #data=dispatch.select.unigrid_volume(s)
131  data=dispatch.yt.patches(s,copy=copy)
132  ds = yt.load_uniform_grid(data, **parameters)
133  return ds