You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			108 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			108 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Python
		
	
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 < smin:
 | 
						|
        s = smin
 | 
						|
 | 
						|
    return s
 |