def __init__(self, datadir=False, sim=False, tmin=0, tmax=-1, noutmax='-1', swap_endian=False, quiet=False, use_existing_pstalk_sav=False): """ Read PSTALK files from Pencil Code using IDL. Uses IDL<->Python Bridge, this must be activated manually! Args: - datadir specify datadir, default False - sim specify simulation from which you want to read - swap_endian change if needed to True, default False - quiet verbosity, default False - use_existing_pstalk_sav use existing <sim.datadir>/data/pc/tmp/pstalk.sav for speed up """ import numpy as np import os from os.path import join from .. import get_sim if datadir == False: if sim == False: sim = get_sim() datadir = sim.datadir if quiet == False: quiet = '0' else: quiet = '1' if swap_endian == False: swap_endian = '0' else: swap_endian = '1' if use_existing_pstalk_sav == True: from scipy.io.idl import readsav print('~ reading existing pstalk..') ps = readsav(join(sim.pc_datadir,'tmp','pstalk.sav'))('pstalk') for key in set(ps.dtype.fields.keys()): if hasattr(self, key.lower()): continue setattr(self, key.lower(), ps[key][0].T) else: try: cwd = os.getcwd() from idlpy import IDL os.chdir(cwd) print('~ reading pstalk in IDL..') idl_call = ', '.join(['pc_read_pstalk', 'obj=pstalk', 'datadir="'+datadir+'"', 'it0='+str(tmin), 'it1='+str(tmax), 'quiet='+quiet, 'swap_endian='+swap_endian, 'noutmax='+str(noutmax)]) IDL.run(idl_call) print('~ parsing pstalk from IDL to python..') ps = IDL.pstalk for key in set(ps.keys()): if hasattr(self, key.lower()): continue setattr(self, key.lower(), ps[key].T) except: print('! ERROR: no idl<->python bridge found. Try whats written in pstalk-comment to fix that issue.') print('! ') print('! Use something like: (ensure you have IDL 8.5.1 or larger)') print('! export PYTHONPATH=$PYTHONPATH:$IDL_HOME/lib/bridges:$IDL_HOME/bin/bin.linux.x86_64') print('! export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64:$IDL_HOME/bin/bin.linux.x86_64') print('! in your .bashrc') print('! ') print('! If you have it already installed, try: from idlpy import IDL and check for errors') print('! ') print('~ BACKUP SOLUTION: reading pstalk via pidly, starting IDL..') from ..backpack import pidly IDL = pidly.IDL(long_delay=0.05) # start IDL engine from scipy.io.idl import readsav from ..io import mkdir ## read tstalk file print('## reading particle stalker file..') IDL('pc_read_pstalk, object=pstalk, datadir="'+sim.datadir+'"'+', quiet='+quiet+', it0='+str(tmin)+', it1='+str(tmax)+', swap_endian='+swap_endian) print('## transfering pstalk file from IDL to python..') mkdir(join(sim.pc_datadir,'tmp')) IDL('save, pstalk, filename="'+join(sim.pc_datadir,'tmp','pstalk_'+str(tmin)+'_'+str(tmax)+'.sav')+'"') ps = readsav(join(sim.pc_datadir,'tmp','pstalk.sav'))('pstalk') #from pc.io import debug_breakpoint; debug_breakpoint() for key in set(ps.dtype.fields.keys()): if hasattr(self, key.lower()): continue setattr(self, key.lower(), ps[key][0].T)