import numpy as np import os import time from tools.solver.Ndar import PetscP def comp_kperm_sub(parser,rundir,nr): k=np.load(rundir+'k.npy') ref=int(parser.get('Solver',"ref")) t0=time.time() S_min_post = int(parser.get('K-Postprocess','MinBlockSize')) nimax =2** int(parser.get('K-Postprocess','Max_sample_size')) S_min_post=S_min_post*ref if S_min_post==0: sx=2 #k.shape[0] else: sx = get_min_nbl(k,nimax,nr,S_min_post) if sx==1: sx=2 tkperm=getKpost(k, sx,rundir,ref) ttotal=time.time()-t0 return def getKpost(kf, sx,rundir,ref): ex=int(np.log2(kf.shape[0])) esx=int(np.log2(sx)) scales=2**np.arange(esx,ex) datadir=rundir+'KpostProcess/' try: os.makedirs(datadir) except: nada=0 tkperm=np.zeros((scales.shape[0])) for il in range(scales.shape[0]): l=scales[il] nblx, nbly, nblz = kf.shape[0]//l, kf.shape[1]//l, kf.shape[2]//l sx,sy,sz=l,l,l if kf.shape[2]==1: nblz=1 sz=1 if l==2: refDeg=2 else: refDeg=ref tkperm[il]=time.time() Kperm = np.zeros((nblx,nbly,nblz)) try: Kperm=np.load(datadir+'Kperm'+str(l//ref)+'.npy') except: for i in range(nblx): for j in range(nbly): for k in range(nblz): Kperm[i,j,k]=PetscP('',refDeg,kf[i*sx:(i+1)*sx,j*sy:(j+1)*sy,k*sz:(k+1)*sz],False,1e-4,0) tkperm[il]= time.time()-tkperm[il] np.save(datadir+'Kperm'+str(sx)+'.npy',Kperm) np.savetxt(rundir+'tkperm_sub.txt',tkperm) return tkperm def get_min_nbl(kc,nimax,nr,smin): if kc.shape[2]==1: dim=2.0 else: dim=3.0 if nr>0: y=(1/dim)*np.log2(nr*kc.size/(nimax*(smin**dim))) else: y=0 y=int(y) s=int((2**y) * smin) if s