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)
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')
# - 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()