Exemple #1
0
def withOctree(a, offset, density):
    # step
    tol = 1./density
    
    # octree
    snears = []; sec = 0
    for z in a:
        bb = G.bbox(z)
        rx = bb[3]-bb[0]; ry = bb[4]-bb[1]; rz = bb[5]-bb[2]
        snear = min(rx, ry); snear = min(snear, rz)
        snear = 0.1*snear
        sec = max(sec, snear)
        snears.append(snear)
    o = G.octree(a, snears, dfar=offset+sec)
    o = compDistance(o, a, loc='nodes')

    # iteration d'adaptation
    nit = 0
    while nit < 10:
        print('iterating: %d...'%nit)

        o = C.node2Center(o, 'TurbulentDistance')
        o = G.getVolumeMap(o)

        # adapt
        C._initVars(o, '{centers:vol}={centers:vol}**0.33333')
        # was 2.1 factor
        C._initVars(o, '{centers:indicator}=logical_and({centers:vol} > %20.16g , abs({centers:TurbulentDistance}-%20.16g) < 1.*{centers:vol})'%(tol,offset))
        o1 = G.adaptOctree(o, 'centers:indicator')

        #C.convertPyTree2File([o1]+a, 'out%d.cgns'%nit)

        # check convergence
        dim1 = Internal.getZoneDim(o1); dim = Internal.getZoneDim(o)
        if dim1 == dim: break

        #if (nit%2 == 0): o1 = P.extractMesh([o], o1)
        o1 = compDistance(o1, a, loc='nodes')
        o = o1
        nit += 1
    
    o = C.rmVars(o, 'centers:TurbulentDistance')
    o = C.rmVars(o, 'centers:vol')
    o = C.rmVars(o, 'centers:indicator')
    #C.convertPyTree2File(o, 'out.cgns')

    # Iso surface
    iso = P.isoSurfMC([o], 'TurbulentDistance', value=offset)
    return iso
# - adaptOctree (pyTree) - 
import Generator.PyTree as G
import Converter.PyTree as C
import Geom.PyTree as D
import KCore.test as test

s = D.circle((0,0,0), 1., N=100); snear = 0.1
o = G.octree([s], [snear], dfar=5.,balancing=1)
o = C.initVars(o,'centers:indicator', 2.)
res = G.adaptOctree(o)
t = C.newPyTree(['OCTREE',2]); t[2][1][2] += [res]
test.testT(t)

s = D.sphere((0,0,0), 1., N=20); snear = 0.5
o = G.octree([s], [snear], dfar=5., balancing=1)
o = C.initVars(o,'centers:indicator',2.)
res = G.adaptOctree(o)
t = C.newPyTree(['OCTREE']); t[2][1][2] += [res]
test.testT(t,2)
Exemple #3
0
K = 1./math.sqrt(0.001*2*math.pi)
K2 = 1./(2*0.001)


def F(x, y):
    if 0.05 < abs(y) < 0.7:
        return K*math.exp(-(x-0.5)**2*K2)
    else:
        return 0.

o = C.initVars(o, 'F', F, ['CoordinateX', 'CoordinateY'])

# Computation of the indicator onto the octree mesh
npts = Internal.getZoneDim(o)[1]
o2, valInf, valSup = P.computeIndicatorField(o, 'F', nbTargetPts=1.2*npts,
                                             refineFinestLevel=0, bodies=[naca])

# Adaptation of the octree wrt the indicator
o2 = G.adaptOctree(o2)

# Interpolate solution on adapted octree
o = C.rmVars(o, ['centers:indicator', 'F'])
o2 = P.extractMesh([o], o2)

# Save file
t = C.newPyTree(['Octree', 'Octree2'])
t[2][1][2] += [o]
t[2][2][2] = [o2]
C.convertPyTree2File(t, 'out.cgns')
    vol

    Returns
    -------

    """
    if c == 0. and vol > volmin:
        return 1.
    else:
        return 0.

# Refine the octree inside the sphere until all the elements inside the
# sphere are of finest level
end = 0
while end == 0:
    t = X.blankCells(t, [[a]], BM, blankingType='center_in')
    t = G.getVolumeMap(t)
    volmin = C.getMinValue(t, 'centers:vol')
    t = C.initVars(t, 'centers:indicator', F, ['centers:cellN', 'centers:vol'])
    end = 1
    if C.getMaxValue(t, 'centers:indicator') == 1.:
        end = 0
    # Maintien du niveau de raffinement le plus fin
    o = t[2][1][2][0]
    o = G.adaptOctree(o, 'centers:indicator', balancing=1)
    # Sortie
    t = C.newPyTree(['Base'])
    t[2][1][2] += [o]

C.convertPyTree2File(t, 'out.cgns')
Exemple #5
0
# - adaptOctree (pyTree) - 
import Generator.PyTree as G
import Converter.PyTree as C
import Geom.PyTree as D
import KCore.test as test
# Quadtree
s = D.circle((0,0,0), 1., N=100); snear=0.1
o = G.octree([s], [snear], dfar=5.,balancing=1)
o = C.initVars(o, 'centers:indicator', 1.)
res = G.adaptOctree(o)
t = C.newPyTree(['OCTREE',2]); t[2][1][2] += [res]
test.testT(t)
# Octree
s = D.sphere((0,0,0), 1., N=100); snear=0.5
o = G.octree([s], [snear], dfar=5., balancing=1)
o = C.initVars(o,'centers:indicator',1.)
res = G.adaptOctree(o)
t = C.newPyTree(['OCTREE']); t[2][1][2] += [res]
test.testT(t,2)
# 9-tree
s = D.circle((0,0,0), 1., N=100); snear=0.1
o = G.octree([s], [snear], dfar=5.,balancing=1,ratio=3)
o = C.initVars(o,'centers:indicator',1.)
res = G.adaptOctree(o,ratio=3)
t = C.newPyTree(['OCTREE',2]); t[2][1][2] += [res]
test.testT(t,3)
# 27-tree
s = D.sphere((0,0,0), 1., N=100); snear=0.5
o = G.octree([s], [snear], dfar=5., balancing=1,ratio=3)
o = C.initVars(o,'centers:indicator',1.)
res = G.adaptOctree(o,ratio=3)
def adaptInsideOctree():
    if CTK.t == []: return
    if (CTK.__MAINTREE__ <= 0):
        CTK.TXT.insert('START', 'Fail on a temporary tree.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
        return

    # EquationDimension
    node = Internal.getNodeFromName(CTK.t, 'EquationDimension')
    if node is not None: dim = Internal.getValue(node)
    else:
        CTK.TXT.insert('START',
                       'EquationDimension not found (tkState). Using 3D.\n')
        CTK.TXT.insert('START', 'Warning: ', 'Warning')
        dim = 3

    nzs = CPlot.getSelectedZones()
    if (nzs == []):
        CTK.TXT.insert('START', 'Selection is empty.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
        return

    snearsarg = VARS[0].get()
    try:
        volmin = float(snearsarg)
        volmin = volmin**dim
    except:
        CTK.TXT.insert('START', 'snear is invalid.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
        return

        snearsarg = snearsarg.split(';')
        for s in snearsarg:
            snears.append(float(s))

    # Octree meshes
    tp = C.newPyTree(['Base'])
    for nz in nzs:
        nob = CTK.Nb[nz] + 1
        noz = CTK.Nz[nz]
        z = CTK.t[2][nob][2][noz]
        tp[2][1][2].append(z)

    # surfaces des corps
    name = VARS[6].get()
    names = name.split(';')
    surfaces = []
    for v in names:
        v = v.lstrip()
        v = v.rstrip()
        sname = v.split('/', 1)
        bases = Internal.getNodesFromName1(CTK.t, sname[0])
        if (bases != []):
            nodes = Internal.getNodesFromType1(bases[0], 'Zone_t')
            for z in nodes:
                if (z[0] == sname[1]): surfaces.append(z)
    if (len(surfaces) == 0):
        CTK.TXT.insert('START', 'Invalid body surface.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
        return

    # Blank
    CTK.saveTree()

    BM = numpy.zeros((1, 1), numpy.int32)
    BM[0, 0] = 1
    end = 0
    count = 0
    while end == 0:
        tp = X.blankCells(tp, [surfaces],
                          blankingMatrix=BM,
                          blankingType='center_in',
                          dim=dim)
        tp = G.getVolumeMap(tp)
        C._initVars(
            tp,
            '{centers:indicator}=({centers:cellN}<1.)*({centers:vol}>%20.16g)'
            % volmin)
        end = 1
        if C.getMaxValue(tp, 'centers:indicator') == 1.: end = 0
        for noz in xrange(len(tp[2][1][2])):
            tp[2][1][2][noz] = G.adaptOctree(tp[2][1][2][noz],
                                             'centers:indicator',
                                             balancing=1)
        count += 1

    # Back to tree
    c = 0
    for nz in nzs:
        nob = CTK.Nb[nz] + 1
        noz = CTK.Nz[nz]
        z = tp[2][1][2][c]
        CTK.t[2][nob][2][noz] = z
        c += 1
    fail = False
    #C._fillMissingVariables(CTK.t)
    if fail == False:
        CTK.TXT.insert('START', 'Adapt octree computed.\n')
    else:
        CTK.TXT.insert('START', 'Adapt octree failed.\n')
        CTK.TXT.insert('START', 'Error: ', 'Error')
    (CTK.Nb, CTK.Nz) = CPlot.updateCPlotNumbering(CTK.t)
    CTK.TKTREE.updateApp()
    CPlot.render()