335 """ Scans the Chombo HDF5 data files for AMR in PLUTO.
339 fp -- Data file pointer\n
340 myvars -- Names of the variables to read\n
341 ilev -- required AMR level
345 Dictionary consisting of variable names as keys and its values.
349 Due to the particularity of AMR, the grid arrays loaded in ReadGridFile are overwritten here.
353 dim = fp[
'Chombo_global'].attrs.get(
'SpaceDim')
354 nlev = fp.attrs.get(
'num_levels')
355 il = min(nlev-1,ilev)
357 for i
in range(nlev):
358 lev.append(
'level_'+str(i))
359 freb = np.zeros(nlev,dtype=
'int')
360 for i
in range(il+1)[::-1]:
363 pdom = fl.attrs.get(
'prob_domain')
364 dx = fl.attrs.get(
'dx')
365 dt = fl.attrs.get(
'dt')
366 ystr = 1. ; zstr = 1. ; logr = 0
368 geom = fl.attrs.get(
'geometry')
369 logr = fl.attrs.get(
'logr')
371 ystr = fl.attrs.get(
'g_x2stretch')
373 zstr = fl.attrs.get(
'g_x3stretch')
375 print 'Old HDF5 file, not reading stretch and logr factors'
377 x1b = fl.attrs.get(
'domBeg1')
381 x2b = fl.attrs.get(
'domBeg2')
382 if (dim == 1
or dim == 2):
385 x3b = fl.attrs.get(
'domBeg3')
386 jbeg = 0 ; jend = 0 ; ny = 1
387 kbeg = 0 ; kend = 0 ; nz = 1
389 ibeg = pdom[0] ; iend = pdom[1] ; nx = iend-ibeg+1
391 ibeg = pdom[0] ; iend = pdom[2] ; nx = iend-ibeg+1
392 jbeg = pdom[1] ; jend = pdom[3] ; ny = jend-jbeg+1
394 ibeg = pdom[0] ; iend = pdom[3] ; nx = iend-ibeg+1
395 jbeg = pdom[1] ; jend = pdom[4] ; ny = jend-jbeg+1
396 kbeg = pdom[2] ; kend = pdom[5] ; nz = kend-kbeg+1
398 rat = fl.attrs.get(
'ref_ratio')
399 freb[i] = rat*freb[i+1]
410 ibeg =
max([ibeg, int(ibeg0*freb[0])]) ; iend = min([iend,int(iend0*freb[0]-1)])
415 jbeg =
max([jbeg, int(jbeg0*freb[0])]) ; jend = min([jend,int(jend0*freb[0]-1)])
420 kbeg =
max([kbeg, int(kbeg0*freb[0])]) ; kend = min([kend,int(kend0*freb[0]-1)])
425 x1 = x1b + (ibeg+np.array(range(nx))+0.5)*dx
427 x1 = x1b*(exp((ibeg+np.array(range(nx))+1)*dx)+exp((ibeg+np.array(range(nx)))*dx))*0.5
429 x2 = x2b + (jbeg+np.array(range(ny))+0.5)*dx*ystr
430 x3 = x3b + (kbeg+np.array(range(nz))+0.5)*dx*zstr
434 dx1 = x1b*(exp((ibeg+np.array(range(nx))+1)*dx)-exp((ibeg+np.array(range(nx)))*dx))
435 dx2 = np.ones(ny)*dx*ystr
436 dx3 = np.ones(nz)*dx*zstr
440 x1r = np.zeros(len(x1)+1) ; x1r[1:] = x1 + dx1/2.0 ; x1r[0] = x1r[1]-dx1[0]
441 x2r = np.zeros(len(x2)+1) ; x2r[1:] = x2 + dx2/2.0 ; x2r[0] = x2r[1]-dx2[0]
442 x3r = np.zeros(len(x3)+1) ; x3r[1:] = x3 + dx3/2.0 ; x3r[0] = x3r[1]-dx3[0]
443 NewGridDict = dict([(
'n1',nx),(
'n2',ny),(
'n3',nz),\
444 (
'x1',x1),(
'x2',x2),(
'x3',x3),\
445 (
'x1r',x1r),(
'x2r',x2r),(
'x3r',x3r),\
446 (
'dx1',dx1),(
'dx2',dx2),(
'dx3',dx3),\
451 vars = np.zeros((nx,ny,nz,nvar))
453 LevelDic = {
'nbox':0,
'ibeg':ibeg,
'iend':iend,
'jbeg':jbeg,
'jend':jend,
'kbeg':kbeg,
'kend':kend}
455 AMRBoxes = np.zeros((nx,ny,nz))
456 for i
in range(il+1):
457 AMRLevel.append(LevelDic.copy())
459 data = fl[
'data:datatype=0']
461 nbox = len(boxes[
'lo_i'])
462 AMRLevel[i][
'nbox'] = nbox
464 AMRLevel[i][
'box']=[]
465 for j
in range(nbox):
466 AMRLevel[i][
'box'].append({
'x0':0.,
'x1':0.,
'ib':0L,
'ie':0L,\
467 'y0':0.,
'y1':0.,
'jb':0L,
'je':0L,\
468 'z0':0.,
'z1':0.,
'kb':0L,
'ke':0L})
470 ib = boxes[j][
'lo_i'] ; ie = boxes[j][
'hi_i'] ; nbx = ie-ib+1
471 jb = 0 ; je = 0 ; nby = 1
472 kb = 0 ; ke = 0 ; nbz = 1
474 jb = boxes[j][
'lo_j'] ; je = boxes[j][
'hi_j'] ; nby = je-jb+1
476 kb = boxes[j][
'lo_k'] ; ke = boxes[j][
'hi_k'] ; nbz = ke-kb+1
477 szb = nbx*nby*nbz*nvar
479 kb = kb*freb[i] ; ke = (ke+1)*freb[i] - 1
480 jb = jb*freb[i] ; je = (je+1)*freb[i] - 1
481 ib = ib*freb[i] ; ie = (ie+1)*freb[i] - 1
484 if ((ib > iend)
or (ie < ibeg)
or \
485 (jb > jend)
or (je < jbeg)
or \
486 (kb > kend)
or (ke < kbeg)):
487 ncount = ncount + szb
491 q = data[ncount:ncount+szb].reshape((nvar,nbz,nby,nbx)).T
494 ib0 =
max([ibeg,ib]) ; ie0 = min([iend,ie])
495 jb0 =
max([jbeg,jb]) ; je0 = min([jend,je])
496 kb0 =
max([kbeg,kb]) ; ke0 = min([kend,ke])
500 AMRLevel[i][
'box'][j][
'x0'] = x1b + dx*(ib0)
501 AMRLevel[i][
'box'][j][
'x1'] = x1b + dx*(ie0+1)
503 AMRLevel[i][
'box'][j][
'x0'] = x1b*exp(dx*(ib0))
504 AMRLevel[i][
'box'][j][
'x1'] = x1b*exp(dx*(ie0+1))
505 AMRLevel[i][
'box'][j][
'y0'] = x2b + dx*(jb0)*ystr
506 AMRLevel[i][
'box'][j][
'y1'] = x2b + dx*(je0+1)*ystr
507 AMRLevel[i][
'box'][j][
'z0'] = x3b + dx*(kb0)*zstr
508 AMRLevel[i][
'box'][j][
'z1'] = x3b + dx*(ke0+1)*zstr
509 AMRLevel[i][
'box'][j][
'ib'] = ib0 ; AMRLevel[i][
'box'][j][
'ie'] = ie0
510 AMRLevel[i][
'box'][j][
'jb'] = jb0 ; AMRLevel[i][
'box'][j][
'je'] = je0
511 AMRLevel[i][
'box'][j][
'kb'] = kb0 ; AMRLevel[i][
'box'][j][
'ke'] = ke0
512 AMRBoxes[ib0-ibeg:ie0-ibeg+1, jb0-jbeg:je0-jbeg+1, kb0-kbeg:ke0-kbeg+1] = il
515 cib0 = (ib0-ib)/freb[i] ; cie0 = (ie0-ib)/freb[i]
516 cjb0 = (jb0-jb)/freb[i] ; cje0 = (je0-jb)/freb[i]
517 ckb0 = (kb0-kb)/freb[i] ; cke0 = (ke0-kb)/freb[i]
518 q1 = np.zeros((cie0-cib0+1, cje0-cjb0+1, cke0-ckb0+1,nvar))
519 q1 = q[cib0:cie0+1,cjb0:cje0+1,ckb0:cke0+1,:]
523 new_shape = (ie0-ib0+1,1)
525 new_shape = (ie0-ib0+1,je0-jb0+1)
527 new_shape = (ie0-ib0+1,je0-jb0+1,ke0-kb0+1)
529 stmp = list(new_shape)
530 while stmp.count(1) > 0:
532 new_shape = tuple(stmp)
535 for iv
in range(nvar):
536 vars[ib0-ibeg:ie0-ibeg+1,jb0-jbeg:je0-jbeg+1,kb0-kbeg:ke0-kbeg+1,iv] = \
537 myT.congrid(q1[:,:,:,iv].squeeze(),new_shape,method=
'linear',minusone=
True).reshape((ie0-ib0+1,je0-jb0+1,ke0-kb0+1))
541 for iv
in range(nvar):
542 h5vardict[myvars[iv]] = vars[:,:,:,iv].squeeze()
543 AMRdict = dict([(
'AMRBoxes',AMRBoxes),(
'AMRLevel',AMRLevel)])
544 OutDict = dict(NewGridDict)
545 OutDict.update(AMRdict)
546 OutDict.update(h5vardict)
x1range
Allow to load only a portion of the domain.
def DataScanHDF5(self, fp, myvars, ilev)