Skip to main content
  • Home
  • Development
  • Documentation
  • Donate
  • Operational login
  • Browse the archive

swh logo
SoftwareHeritage
Software
Heritage
Archive
Features
  • Search

  • Downloads

  • Save code now

  • Add forge now

  • Help

Revision 92d43fb1eea21ec77fe31adc0b0c999f1a124737 authored by Nils Thuerey on 08 June 2017, 20:22:23 UTC, committed by Nils Thuerey on 08 June 2017, 20:22:23 UTC
screens
1 parent 0b4d265
  • Files
  • Changes
  • 5d19b9f
  • /
  • scenes
  • /
  • ofblend2dTest.py
Raw File Download

To reference or cite the objects present in the Software Heritage archive, permalinks based on SoftWare Hash IDentifiers (SWHIDs) must be used.
Select below a type of object currently browsed in order to display its associated SWHID and permalink.

  • revision
  • directory
  • content
revision badge
swh:1:rev:92d43fb1eea21ec77fe31adc0b0c999f1a124737
directory badge
swh:1:dir:8046bfcf9852b9019a6879130764073eab66a024
content badge
swh:1:cnt:ec4efb77a0ab28b1207a31b76da624a1c2896f5c

This interface enables to generate software citations, provided that the root directory of browsed objects contains a citation.cff or codemeta.json file.
Select below a type of object currently browsed in order to generate citations for them.

  • revision
  • directory
  • content
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
ofblend2dTest.py
############################################################################################################################
#
# Data load setup
#
############################################################################################################################

# img out sample calls
#
# gen blended sequence for 2 inputs:
#./manta ../mantaflowgit/scenes/pcgTestOfLoad.py doOnlyLoad 1 doSingleLoad 1 dataSet 201 showUi 1 blendIters 1 blendSingleAlpha 0.5 regen2dSlices 1 dispWidth 500 dispHeight 500 camposz 0.8 singleSel   0 0 0   0 1 0
#
# gen blended sequence for 3 inputs:
#./manta ../mantaflowgit/scenes/pcgTestOfLoad.py doOnlyLoad 1 doSingleLoad 1 dataSet 202 showUi 1 blendIters 1 regen2dSlices 1 dispWidth 500 dispHeight 500 camposz 0.8 singleSel3   0 0 0   0 1 0   1 0 0      blendSingleAlpha 0.5   blendThirdAlpha 0.5
#
# run single grid data
#./manta ../mantaflowgit/scenes/pcgTestOfLoad.py dataSet 202  dosingleselect 1  singleSel 0 1 0  0 2 0
#

import sys
from manta import *
from math  import *

setDebugLevel(1); # set to 2 for kernel msgs, 3 for ranges


dataSet       = 2
paramSet      = 5
showUi        = True
multiStep     = 3
doLsProject   = False
doFinalProject= True
doStoreResult = False
writePngs     = False

# load only modes
doOnlyLoad     = False
doSingleSelect = False
singleSel      = [0,0,0, 1,1,0,  -1,-1,-1]; 
doLoadThird    = False
doConstOverride = 0; # for testing only, paper ex2, turn of SDF!

# configure blending
blendIters       = -9;
blendSingleAlpha = -1;
blendThirdAlpha = -1;

# generate 2d slices from 3d version
regen2dSlices = False
# window settings, for img output
dispWidth  = 800
dispHeight = 600
camPosZ    = 1.2

# data input 
dim = 2
res = 10
resLoad        = 12
isLevelset     = True
frameIterStart = 0
frameIterEnd   = 12
frameIterMult  = 10
frameIterOffset= 10
orderTime  = 1
orderSpace = 1
projSizeThreshold = 959
doLoadGrid = 0
thirdDimFactor = 1.0

# modify filename for some runs...
dataSetSuffix = ""

# fit data into grid with 10% border, used in OF solve for reset
autoBorder  = 0.1
loadOffset  = Vec3(0,0,0);

gridLoadX  = -1;  gridLoadY = -1;  gridLoadZ = -1;
gridOtherX = -1; gridOtherY = -1; gridOtherZ = -1;
gridThirdX = -1; gridThirdY = -1; gridThirdZ = -1;


# check for parameters (ignore case), note: bool given as 0/1
# eg call with: "./manta scene.py   dataSet 2 showUi 1 doOnlyLoad 0 "
skipNext = 0;
for iter in range(1, len(sys.argv)):
	if skipNext>0:
		skipNext = skipNext-1; continue; 
	if(sys.argv[iter].lower() == "showui"):
		showUi = (int(sys.argv[iter+1])!=0);
		print( "showUi set to %d" % (showUi) ); skipNext = 1;
	elif(sys.argv[iter].lower() == "dataset"):
		dataSet = int(sys.argv[iter+1])
		print( "dataSet set to %d" % (dataSet) ); skipNext = 1;
	elif(sys.argv[iter].lower() == "paramset"):
		paramSet = int(sys.argv[iter+1])
		print( "paramSet set to %d" % (paramSet) ); skipNext = 1;
	elif(sys.argv[iter].lower() == "dostoreresult"):
		doStoreResult = (int(sys.argv[iter+1])!=0);
		print( "doStoreResult set to %d" % (doStoreResult) ); skipNext = 1;
	elif(sys.argv[iter].lower() == "doonlyload"):
		doOnlyLoad = (int(sys.argv[iter+1])!=0);
		print( "doOnlyLoad set to %d" % (doOnlyLoad) ); skipNext = 1;
	elif(sys.argv[iter].lower() == "dosingleload") or (sys.argv[iter].lower() == "dosingleselect"):
		doSingleSelect = (int(sys.argv[iter+1])!=0);
		print( "doSingleSelect set to %d" % (doSingleSelect) ); skipNext = 1;
	elif(sys.argv[iter].lower() == "singlesel"):
		for i in range(0, 6):
			singleSel[i] = int(sys.argv[iter+1+i]);
		print( "singleSel set to %d,%d,%d and %d,%d,%d" % (singleSel[0],singleSel[1],singleSel[2],singleSel[3],singleSel[4],singleSel[5]) ); 
		skipNext = 6;
	elif(sys.argv[iter].lower() == "singlesel3"): # double interpol, 9 values
		for i in range(0, 9):
			singleSel[i] = int(sys.argv[iter+1+i]);
		print( "singleSel3 set to " + str(singleSel) ); 
		skipNext = 9;
	elif(sys.argv[iter].lower() == "blenditers"):
		blendIters = int(sys.argv[iter+1])
		print( "blendIters set to %d" % (blendIters) ); skipNext = 1;
	elif(sys.argv[iter].lower() == "blendsinglealpha"):
		blendSingleAlpha = float(sys.argv[iter+1])
		print( "blendSingleAlpha set to %f" % (blendSingleAlpha) ); skipNext = 1;
	elif(sys.argv[iter].lower() == "blendthirdalpha"):
		blendThirdAlpha = float(sys.argv[iter+1])
		print( "blendThirdAlpha set to %f" % (blendThirdAlpha) ); skipNext = 1;
	elif(sys.argv[iter].lower() == "regen2dslices"):
		regen2dSlices = (int(sys.argv[iter+1])!=0);
		print( "regen2dSlices set to %d" % (regen2dSlices) ); skipNext = 1;
	elif(sys.argv[iter].lower() == "dispwidth"):
		dispWidth = int(sys.argv[iter+1])
		print( "dispWidth set to %d" % (dispWidth) ); skipNext = 1;
	elif(sys.argv[iter].lower() == "dispheight"):
		dispHeight = int(sys.argv[iter+1])
		print( "dispHeight set to %d" % (dispHeight) ); skipNext = 1;
	elif(sys.argv[iter].lower() == "camposz"):
		camPosZ = float(sys.argv[iter+1])
		print( "camPosZ set to %d" % (camPosZ) ); skipNext = 1;
	else:
		print( "Error: unknown parameter '" + sys.argv[iter] +"' " );
		exit(1);



############################################################################################################################

# liquids

# 1-3 , 64^2 in pcgData64
if dataSet==1:
	datPath = "pcgData64/phi"
	frameIterEnd = 8
	res = 64
	dat0 = 3
	dat1 = 1  
	resLoad = 64
	#res = 100
	#frameIterOffset= 60; # more interesting start frame
	#dat0 = 1; dat1 = 2; # NT_DEBUG

# 4-6 , 140^2 in pcgData140
elif dataSet==2:
	datPath = "pcgData140/phi"
	res = 140
	resLoad = 140
	res = 168
	frameIterStart = 4 # debug , tough start frame

	# variants
	#dat0 = 4; dat1 = 5; # rel. easy
	dat0 = 4; dat1 = 6;  # tough!
	#dat0 = 6;	dat1 = 4;  # tougher , reverse
	#dat0 = 5; dat1 = 4; # NT_DEBUG new


# border (autoBord,autoBnd) reduce test data
elif dataSet==3:
	autoBorder  = 0.0
	datPath = "pcgDataBordred/phibv"
	res = 120
	dat0 = 1; 
	dat1 = 3; 
	resLoad = 100
	frameIterStart = 2 
	frameIterMult  = 1
	frameIterOffset= 1

# smoke

# 2d plume 1-4 (note 1&2 are too low...?)
elif dataSet==5:
	datPath = "pcgDataSmoke64/dens"
	#frameIterOffset = 5;
	frameIterOffset = 30;
	frameIterMult   = 5;
	frameIterEnd    = 8;
	res = 64;
	isLevelset = False;
	dat0 = 3;
	dat1 = 4;
	resLoad = 64;
	res = 80;
	frameIterEnd    = 18; frameIterOffset = 5 # longer , all frames
	#frameIterOffset = 60 # start later

# 2d paper example
elif dataSet==6:
	datPath = "pcgData2dPaper/phi"
	res = 140
	dat0 = 1; 
	dat1 = 2;
	resLoad = 128
	res = 280;
	frameIterStart = 2 

# 3d

# 7-9 , 64^3 in pcgData64 (3d versions of 1-3)
elif dataSet==10:
	datPath = "pcgData64threed/phi"
	dim = 3; res = 64
	dat0 = 7
	dat1 = 9
	resLoad = 64
	res = 16; # NT_DBEUG 4d
	# shorter
	frameIterStart = 1; frameIterEnd   = 7
	frameIterMult  = 20; frameIterOffset= 10
	#res = 124;	frameIterMult   = 5;	frameIterEnd    = 80; 


# 3d plume 5,6
elif dataSet==15:
	datPath = "pcgDataSmoke64threed/dens"
	frameIterOffset = 50
	frameIterMult   = 5
	dim = 3; res = 64
	isLevelset = False
	dat0 = 5
	dat1 = 6
	resLoad = 64
	# full run
	frameIterOffset = 5; frameIterEnd = 18

# 3d volumes for dat 1-3 , 64^2 in pcgData64conv3d , frame #0 is interval 1, #1 is interval 2
elif dataSet==101:
	datPath = "pcgData64conv3d/phito"
	dim = 3;
	res = 64;
	dat0 = 1;
	dat1 = 3;
	dat0 = 3; dat1 = 1; # reverse
	resLoad = 64;
	res = 76;
	frameIterOffset= 0;
	frameIterMult  = 1;
	frameIterEnd   = 2;
	#resLoad = 64; res = 40; # smaller
	frameIterOffset= 1; frameIterEnd   = 1;

elif dataSet==102:
	# special test, run a case from 202 single, for loop
	dat0 = 1; dat1 = 2; # fixed for grids!
	datPath = "pcgDataGrid01/phito02" 
	doLoadGrid = 1;
	dim        = 3;
	resLoad    = 80;
	res        = 96;
	frameIterOffset= 0; frameIterMult  = 1;
	frameIterStart = 0; frameIterEnd   = 1; 
	gridLoadX,  gridLoadY,  gridLoadZ  = (1,5,0)
	gridLoadX,  gridLoadY,  gridLoadZ  = (1,1,0) # tougher!
	gridOtherX, gridOtherY, gridOtherZ = (3,5,0)
	res        = 44; # small! 
	res        = 64; # ca. 10s

elif dataSet==103:
	# special test, run a case from 202 single, for loop
	dat0 = 1; dat1 = 2; # fixed for grids!
	datPath = "pcgDataFlip2d/phifl2d" 
	doLoadGrid = 0;
	dim        = 3;
	resLoad    = 100;
	res        = 120;
	frameIterOffset= 0; frameIterMult  = 1;
	frameIterStart = 0; frameIterEnd   = 1; 
	res        = 64; # small! 

elif dataSet==104:
	#NT_DEBUG print("ERR fix time below"); exit(1);
	# two d case with longer time
	dat0 = 1; dat1 = 2; 
	datPath = "pcgDataFlip2d/phifl2dLonger" 
	doLoadGrid = 0;
	dim        = 3;
	resLoad    = 50;
	res        = 60;
	frameIterOffset= 0; frameIterMult  = 1;
	frameIterStart = 0; frameIterEnd   = 1; 
	#res        = 34; # small! 
	thirdDimFactor = 1.5


# 3d volumes for 2d flip sims, grid 10x10;   to02: 80 , to03: 46  (pcgTestDatagenArrFlip)
elif dataSet==200:
	dat0 = 1; dat1 = 2; # fixed for grids!
	datPath = "pcgDataGrid01/phito03" # note, suffix added!
	doLoadGrid = 1;
	dim        = 3;
	resLoad    = 46;
	res        = 56;
	#res        = 32; # smaller NT DEBUG
	frameIterOffset= 0; frameIterMult  = 1;
	frameIterStart = 0; frameIterEnd   = 1;
elif dataSet==201 or dataSet==202 or dataSet==203:
	# 201 = 4 drops low
	# 202 = 6 drops higher
	# 203 = 6 drops higher , 2stepOf
	dat0 = 1; dat1 = 2; # fixed for grids!
	datPath = "pcgDataGrid01/phito02" 
	doLoadGrid = 1;
	dim        = 3;
	resLoad    = 80;
	res        = 96;
	frameIterOffset= 0; frameIterMult  = 1;
	frameIterStart = 0; frameIterEnd   = 1;

	#res        = 34; # small! 
	res        = 44; 
	#res        = 54; 
	#res        = 96; 

	# modify load
	if dataSet==202:
		dataSetSuffix = "B_"
	# spcecial = 2 step OF!
	if dataSet==203:
		#dataSetSuffix = "C_" # org, fastMarch = False
		dataSetSuffix = "D_"  # t2, fastMarch = True


else:
	print( "Error , no valid dataSet chosen!"); exit(1);

# automatically compute border offset
loadOffset  = Vec3(0.)
if autoBorder>0:
	resOffset   = int(res * autoBorder);
	loadOffset  = Vec3(resOffset,resOffset,resOffset);

# repeat the first frame?
doRepeat = False; 
repeatLen = int(res*autoBorder*1.0); 
if 1 and (dataSet>=200 or dataSet==102 or dataSet==103 or dataSet==104): #  NT_DEBUG , check repeat for long
	doRepeat = True;
	loadOffset.z = loadOffset.z + repeatLen


# ====== other params ... ====

# maximal region around surface to include from levelset
# modified below...
maxDist = 5

# solving accuracy, default
cgAccuracy = 1e-04

# cfl condition for advection (old 10)
cfl = 999; # NT_DBEUG off 

# dont correct outer layer in levelset 
corrOuter = False;
# use fast-marching , or simple-reinit?
#doFastMarch = True;
doFastMarch = False; # default for now

# misc params, to be initialized
lsFactor = 0
wSmooth = 0
wEnergy = 0
wPostBlur = 0
maxDist = 0
blurSelection = 0

# for projection step (used with doLsProject)
projMaxDist = 4.0; # 4 & 40 - good defaults...
projMaxIter = 40;

gsStd  = Vec3(res,res,res*thirdDimFactor)
if (dim==2):
	gsStd.z=1

solv           = Solver(name='main', gridSize = gsStd, dim=dim )
solv.timestep  = 1.0
times          = Timings()

# setup relics  ...
flags = solv.create(FlagGrid)
flags.initDomain()
flags.setConst(TypeFluid) # set all to TypeFluid

# testing , preview!
vDiff = solv.create(VecGrid)
i0blend  = solv.create(LevelsetGrid)
i0reinit = solv.create(LevelsetGrid)

# allocate grid data
i0      = solv.create(LevelsetGrid)
i1      = solv.create(LevelsetGrid)
i0org   = solv.create(LevelsetGrid)
i1org   = solv.create(LevelsetGrid)
vel     = solv.create(VecGrid)
velTmp  = solv.create(VecGrid);
# debug multi level solve
debvel5 = solv.create(VecGrid)
debvel4 = solv.create(VecGrid)
debvel3 = solv.create(VecGrid)
debvel2 = solv.create(VecGrid)
debvel1 = solv.create(VecGrid)
debls5 = solv.create(LevelsetGrid)
debls4 = solv.create(LevelsetGrid)
debls3 = solv.create(LevelsetGrid)
debls2 = solv.create(LevelsetGrid)
debls1 = solv.create(LevelsetGrid)
#rhs   = solv.create(RealGrid)
deberr1 = Vec3(0,0,0)
deberr2 = Vec3(0,0,0)
deberr3 = Vec3(0,0,0)
deberr4 = Vec3(0,0,0)
deberr5 = Vec3(0,0,0)
deberr6 = Vec3(0,0,0)
deberr7 = Vec3(0,0,0)
deberr8 = Vec3(0,0,0)
# optional for 2-param interpol
velThird   = 0
iDiffThird = 0

# only for velocity extrapol test , shouldnt be needed in general
velMac = ""

# test motion
i0adv   = solv.create(LevelsetGrid) # advected

# multi step OF
velTmp2  = solv.create(VecGrid)
iTmp1    = solv.create(LevelsetGrid)

iDiff     = solv.create(RealGrid)
iDiffBack = solv.create(RealGrid)

# other solver data
meshDest = solv.create(Mesh)
meshRef1 = solv.create(Mesh)
meshRef0 = solv.create(Mesh)

# solver object for load & size convert
gsload = vec3(resLoad,resLoad,resLoad*thirdDimFactor)
if (dim==2):
	gsload.z=1
sload  = Solver(name='loaddata', gridSize = gsload, dim=dim)
iload  = sload.create(RealGrid)

# 3d mesh env for 2d data
doMeshFrom2d = True
if doMeshFrom2d:
	t2gs = vec3(res,res,10)
	#if (dim==2): t2gs.z=1
	t2dsolv  = Solver(name='mesh3d', gridSize = t2gs, dim=3)
	t2dphi   = t2dsolv.create(LevelsetGrid)

# create preview mesh for 2d data
def previewMesh(phi, meshOut):
	for i in range(0,10):
		placeGrid2d(phi,t2dphi,dstz=i)
	t2dphi.setBound(0.1,0);
	t2dphi.createMesh(meshOut);

#///

if showUi and (GUI):
	gui = Gui()
	gui.windowSize(dispWidth,dispHeight);
	gui.setCamPos (0,0,-camPosZ);
	gui.show()
	if not regen2dSlices:
		gui.pause();
	else:
		gui.toggleHideGrids();

avgErrBest  = 1e10
screenNum   = 0
blendScrNum = 0


# helper functions
def extrapolLs(target, maxt=-1):
	# extrapolation distance, default & override
	d = (maxDist+1);
	if maxt>=0:
		d = maxt;

	if 1: # for testing, disable extrapol
		if doFastMarch:
			target.reinitMarching(flags=flags, maxTime=d , correctOuterLayer=corrOuter ); 
		else:
			extrapolateLsSimple(phi=target, distance=d)  
			extrapolateLsSimple(phi=target, distance=d, inside=true)

	if doConstOverride: # for testing, turn into 0-1 surface
		print("WARNING - const override test active!");
		constOverride(phi=target, val=-(1./lsFactor) );

	# extrapolLs done

# process newly loaded data for of
def doPostProcess(iTarget):
	if(isLevelset):
		extrapolLs(iTarget);
		remapLsValues( grid=iTarget, max=maxDist ) 
		iTarget.multConst(lsFactor)
	else:
		# convert to LS:
		iTarget.multConst(-1.0)
		iTarget.addConst(0.5) # org
		iTarget.addConst(0.3) # larger off

		# workaround , convert to LS...
		if 1:
			extrapolLs(iTarget);
			remapLsValues( grid=iTarget, max=maxDist )
			iTarget.multConst(lsFactor)
		#unused: simpleBlur(iTarget, preImgBlur)

	#iTarget.multConst(-1.0); 
	#iTarget.setBound( int(maxDist*-0.25), int(res*autoBorder*0.5) ); # old, hard reset
	iTarget.setBoundNeumann(int(res*autoBorder*0.5));
	# end post process
	

# load and process data file
def getDataName(dataId, num, attachSuffix=True ):
	suffix = "";

	# hard coded offset for paper 2d example
	# try1
	if 0:
		if dataSet==6 and dataId==1:
			num = 100 # img 7
		if dataSet==6 and dataId==2:
			num = 70 + 10
	# try2
	if 1:
		if dataSet==6 and dataId==1: 
			#num = 60 
			num = num + 20 
		if dataSet==6 and dataId==2:
			#num = 40 
			num = num + 0 
	# end - hard coded offset for paper 2d example

	if attachSuffix:
		suffix = ".uni";
	if(doLoadGrid<=0):
		return("./%s%02d_%04d%s" % (datPath, dataId, num, suffix ) );
	else:
		# grid data
		if  (dataId==1):
			return("./%s_x%dy%dz%d_%04d%s" % (datPath, gridLoadX,gridLoadY,gridLoadZ ,num, suffix ) );
		elif(dataId==2):
			return("./%s_x%dy%dz%d_%04d%s" % (datPath, gridOtherX,gridOtherY,gridOtherZ ,num, suffix ) );
		elif(dataId==3):
			return("./%s_x%dy%dz%d_%04d%s" % (datPath, gridThirdX,gridThirdY,gridThirdZ ,num, suffix ) );
		else:
			print( "Error - invalid grid dataId %d \n"%(dataId) ); 
			exit(1);
	return("-error-");

def loadData(iTarget, dataId, num ):
	global iload;
	if 1:
		# regular load
		iload.load( getDataName(dataId, num) );

		if dataSet==6: # 2d paper example
			iload.setBound(0.1, 3 ); # paper example - cut off flat side

	else:
		# fixed init of sphere for debugging
		drop = solv.create(Sphere, center=vec3(0.4,0.5,0.0)*vec3(res,res,res), radius=res*0.25); 
		if dataId==2:
			drop = solv.create(Sphere, center=vec3(0.4+0.05,0.5,0.0)*vec3(res,res,res), radius=res*0.25); 
		iload = drop.computeLevelset()
		# fixed init of sphere, end

	interpolateGrid(iTarget, iload, offset=loadOffset , scale=vec3(1.-2*autoBorder) );

	if doRepeat: 
		repeatFrame( iTarget, loadOffset.z + 1./float(res), repeatLen, bnd=0 ); 

	iTarget.setBound(0.1, int(res*autoBorder) ); # reset border of LS! 


def getResultName(dataId0, dataId1, num, suffix ):
	name = "";
	if(doLoadGrid<=0):
		name = "%s_res%02d_%s.uni" % (getDataName(dataId0, num, False), dataId1, suffix);
	else:
		name = "%s_to_x%dy%dz%d_%s.uni" % (getDataName(dataId0, num, False), gridOtherX,gridOtherY,gridOtherZ, suffix);
	return name;


def storeResult(iTarget, dataId0, dataId1, num , suffix):
	mySuffix = dataSetSuffix+suffix
	if doStoreResult:
		iTarget.save( getResultName(dataId0, dataId1, num, mySuffix) );

def loadResult(iTarget, dataId0, dataId1, num , suffix):
	mySuffix = dataSetSuffix+suffix
	iTarget.load( getResultName(dataId0, dataId1, num, mySuffix) );


# small helper to prepare final LS
def createFinal(iTarget, iSrc, copyFromSrc=True ):
	if(copyFromSrc):
		iTarget.copyFrom(iSrc);
	iTarget.setBound(-0.1, int(res*autoBorder) ); # reset border of LS!
	if(isLevelset):
		dummy = 1.;
		#extrapolLs(iTarget); # only slight gain in accuracy...

# simple helper to select 1 run from grid
def checkSingleSelect(testRunX,testRunY,testRunZ, otherRunX,otherRunY,otherRunZ):
	if(testRunX == singleSel[0] and
	   testRunY == singleSel[1] and
	   testRunZ == singleSel[2] and
	   otherRunX== singleSel[3] and
	   otherRunY== singleSel[4] and
	   otherRunZ== singleSel[5]): 
		return True;
	return False;


############################################################################################################################

accuAvgErr = 0.; # global results of runseq
def runSeq():
	global screenNum, blendScrNum, avgErrBest
	global accuAvgErr
	global gridOtherX, gridOtherY, gridOtherZ, gridThirdX, gridThirdY, gridThirdZ;

	accuAvgErr = 0.;
	accuAvgCnt = 0.;

	#main loop, check different tests
	for frameIter in range(frameIterStart,frameIterEnd): 

		# =========================================== setup

		i0.setConst(0.);
		i1.setConst(0.);
		print( "\nframeIter: %dd "%(frameIter) )

		# load & backup input data
		fileNum = frameIterOffset + frameIter*frameIterMult
		loadData( i0, dat0, fileNum );
		loadData( i1, dat1, fileNum );
		i0org.copyFrom(i0); 
		i1org.copyFrom(i1); 
		if 1 and isLevelset: # why extrapolate original?  -> data should match
			extrapolLs(i0org);
			extrapolLs(i1org);
		doPostProcess(i0);
		doPostProcess(i1);
		
		if not doOnlyLoad:
			# =========================================== step

			vel.setConst(vec3(0,0,0));

			opticalFlowMultiscale3d(vel=vel, i0=i0, i1=i1,   wSmooth=wSmooth, wEnergy=wEnergy  , postVelBlur=wPostBlur 
				, cgAccuracy=cgAccuracy , blurType=blurSelection , cfl=cfl, orderTime=orderTime,orderSpace=orderSpace  
				, resetBndWidth=autoBorder , multiStep=multiStep , projSizeThresh=projSizeThreshold, minGridSize=6, doFinalProject=doFinalProject 
				, dv1=debvel1,dv2=debvel2,dv3=debvel3,dv4=debvel4,dv5=debvel5 , dr1=debls1,dr2=debls2,dr3=debls3,dr4=debls4,dr5=debls5 );

			# use level set projection
			if doLsProject: 
				maxLSPNorm = 0.50; # zero defo where normals disagree (old: skip vary normals & extrapolate if <1 )
				maxLSPDist = 20;   # skip when defo further than this
				lspBlur    = wPostBlur * 0.5;
				#lspBlur    = 0.01; maxLSPDist = 5; # settings, test blur fill in

				# control by loop
				maxLSPNorm = -1. # doesnt matter
				maxLSPDist = projMaxDist;
				#lspBlur    = wPostBlur * 0.5; 
				lspBlur    = 2.
				maxIter    = projMaxIter;

				print( "\nAdding level-set projection, params %d %f , blur %d, iter %d " % (maxLSPDist, maxLSPNorm, lspBlur , maxIter) );

				corrVelsOf3d( velTmp , vel, i0, i0, i1 , maxLSPDist, maxLSPNorm , lspBlur, autoBorder , maxIter ); 
				#vel.addScaled(velTmp, Vec3(-1.0) );

			#if 0:
				#maxVel = vel.getMaxValue(); print( "Max vel "+str(maxVel) )# check... 


			# =========================================== advect forward 
			i0adv.copyFrom(i0);  # calcErrOrg
			advectSemiLagrangeCfl(cfl=cfl, flags=flags, vel=vel, grid=i0adv, order=orderTime)
			i0adv.setBoundNeumann(0); 

			# calcErrOrg 
			createFinal( i0reinit, i0adv );

			# =========================================== calc error
			# load reference surface again
	
			# just for comparison
			if (dim==3) and showUi:
				i1org.createMesh(meshRef1)
				i0org.createMesh(meshRef0)

			avgErr1 = 0.

			# create full SDF for advected i0
			if(isLevelset): 
				# mark disagreements in levelsets (also compute error
				avgErr1 = calcLsDiff3d(i0=i0adv, i1=i1, correction=20. ) * 1.; # calcErrOrg
				#? i0reinit.multConst(-1.); createFinal(i0reinit, i0reinit, False); # calcErrOrg

				if 1 and (dim==3) and showUi:
					iTmp1.copyFrom(i0reinit); 
					iTmp1.multConst( -( maxDist/(lsFactor) ));
					iTmp1.createMesh(meshDest)

			else:
				# non levelsets...
				avgErr1 = calcDensDiff(i0=i0reinit, i1=iTmp1); 

			print( "Frame %d %d->%d: avg curr error %f " % (fileNum, dat0,dat1, avgErr1 ) ) # per frame error

			# =========================================== 


			# recons 3d mesh surface for 2d
			if doMeshFrom2d and dim==2:
				iTmp1.copyFrom(i0reinit); 
				iTmp1.multConst( -( maxDist/(lsFactor) ));
				#simpleBlur(iTmp1, 1.);
				previewMesh(iTmp1, meshDest);
				previewMesh(i1org, meshRef1);
				previewMesh(i0org, meshRef0);


			# store difference grid
			iDiff.copyFrom(i1org); 
			iDiff.sub(i0reinit);
			#iDiff.setBound(0., int(res*autoBorder) ); # reset border 

			# store result
			storeResult( iDiff, dat0,dat1, fileNum, "dif" );
			storeResult( vel,   dat0,dat1, fileNum, "vel" );

		else:
			# load only
			loadResult( iDiff, dat0,dat1, fileNum, "dif" );
			loadResult( vel  , dat0,dat1, fileNum, "vel" );
			avgErr1 = 0.;


		# load data for third 
		if doLoadThird:
			# a bit ugly - bend "other" selector towards third
			(tmpx, tmpy, tmpz) = (gridOtherX, gridOtherY, gridOtherZ)
			(gridOtherX, gridOtherY, gridOtherZ) = getGridDataId(gridThirdX, gridThirdY, gridThirdZ);

			loadResult( iDiffThird, dat0,dat1, fileNum, "dif" );
			loadResult( velThird  , dat0,dat1, fileNum, "vel" );

			(gridOtherX, gridOtherY, gridOtherZ) = (tmpx, tmpy, tmpz)

		accuAvgErr += avgErr1 
		accuAvgCnt += 1.0

		solv.step()
		if writePngs and showUi: # output
			gui.screenshot( 'out02ms3_%05d.png' % screenNum ); 
			screenNum += 1

		# =========================================== 
		# try blending...
		maxBl = blendIters
		for blendIt in range(0,maxBl): 
			if blendSingleAlpha>=0.:
				alpha = blendSingleAlpha;
			else:
				alpha = (1.0*blendIt) / (1.0*(maxBl-1.0));
			beta = blendThirdAlpha; # optional

			i0blend.copyFrom(i0org); 

			# blending: 0 off, 1 SL, 2 wDiff , 3 2param
			blendMode = 1
			if not doLoadThird:
				print( "Blending %f "%(alpha) )
			else:
				print( "Blending sec %f, third %f "%(alpha, beta) )
				blendMode = 3;

			# show org i1 last
			if alpha>(1.0+1e-04): 
				blendMode = 99;

			# ... blend!
			if blendMode==0:
				# naive LS blend
				i0blend.multConst( 1.0 - alpha )
				iTmp1.copyFrom(i1org);
				iTmp1.multConst( alpha )
				i0blend.add( iTmp1 );
			elif blendMode==1:
				# just forward
				advectSemiLagrangeCfl(cfl=cfl, flags=flags, vel=vel, grid=i0blend, order=orderTime, velFactor=alpha)
			elif blendMode==2:
				# forward & backw
				advectSemiLagrangeCfl(cfl=cfl, flags=flags, vel=vel, grid=i0blend, order=orderTime, velFactor=alpha )
				if 1 and (isLevelset):
					createFinal( i0blend, 0 , copyFrom_i0adv=False ); # damn, needed?
				diffDuration = 0.3
				#wdiff = 1.0 * alpha # org identical
				wdiff = (1.0/diffDuration) * alpha - (1.0/diffDuration-1.) # diffDuration% shift
				# only add if >0
				if wdiff>0.:
					iTmp1.copyFrom( iDiff );   
					iTmp1.multConst( wdiff )
					advectSemiLagrangeCfl(cfl=cfl, flags=flags, vel=vel, grid=iTmp1, order=orderTime, velFactor=-(1.-alpha) )
					i0blend.add( iTmp1 );
					print( "Adding diff vector, weight = %f "%(wdiff) )

			elif blendMode==3:
				# 2-param, just forward
				advectSemiLagrangeCfl(cfl=cfl, flags=flags, vel=vel, grid=i0blend, order=orderTime, velFactor=alpha)
				advectSemiLagrangeCfl(cfl=cfl, flags=flags, vel=velThird, grid=i0blend, order=orderTime, velFactor=beta)

			elif blendMode==99:
				print( "No blend! Showing org1");
				i0blend.copyFrom(i1org); 

			else:
				print( "Invalid blend mode! %d"%blendMode ); exit(1);



			# reinit...
			if(isLevelset):
				extrapolLs(i0blend, res/4);
				i0blend.setBound(0.1, int(res*autoBorder) ); # reset border 
				if (dim==3) and showUi:
					i0blend.createMesh(meshDest)
				if (dim==2) and showUi:
					previewMesh(i0blend, meshDest);
				# optionally save mesh...?
				if 0: # output
					meshDest.save( 'mesh_%d_%04d.obj' % (blendIt,blendScrNum) )
			else:
				i0blend.copyFrom(i0blend, False)
				if 0: # output
					i0blend.save( 'outblxy_%d_%04d.uni' % (blendIt,blendScrNum) )

			# output


			# re-generate 2d slices for whole 2d anim, output - similar to preview Mesh , only for solves with time dim
			if regen2dSlices:
				# note - skip region that is only safety border (ie, res* autoBorder*(1+1) )
				# once for blank region, and once in the beginning for the first-frame-repeat
				for z in range( int(res* autoBorder*2.0)-1, int(res*thirdDimFactor-(res* autoBorder)) ):
					getSliceFrom3d(src=i0blend, srcz=z, dst=t2dphi, dstz=0);
					for dstz in range(1,10):
						getSliceFrom3d(src=t2dphi, srcz=0, dst=t2dphi, dstz=dstz);
					t2dphi.setBound(0.1,0);
					t2dphi.createMesh(meshDest);
					if writePngs and showUi: # output
						#gui.screenshot( 'out_%d_%04d.png' % (blendIt,z) ); 
						if not doLoadThird:
							gui.screenshot( 'outbl%02d_%f_%04d.png' % (dataSet,alpha,z) ); 
						else:
							gui.screenshot( 'outbl%02d_%f_%f_%04d.png' % (dataSet,alpha,beta,z) ); 
					solv.step();
			else:
				# normal display / screenshot
				solv.step()
				if 0 and writePngs and showUi: # output
					gui.screenshot( 'outbl01_%d_%04d.png' % (blendIt,blendScrNum) ); 


		if maxBl>0:
			print("Blending done");
			solv.step(); # stop after blending is done?
		# done blending 

		blendScrNum = blendScrNum + 1


	accuAvgErr /= accuAvgCnt
	print( "Accu avg error %f  (params lsf %f, maxd %f, smo %f, ene %f, blr %f, cgacc %f, rI %d, rO %d)   d/pSet:%d,%d|%d,%d " % (accuAvgErr, lsFactor, maxDist, wSmooth, wEnergy, wPostBlur, cgAccuracy, res, resLoad, dataSet, paramSet, dat0,dat1 ) )
	if(accuAvgErr < avgErrBest):
		avgErrBest = accuAvgErr
	times.display()
	exit(1); # quit after one cycle 
		

############################################################################################################################

def loopParamSearch() :
	global lsFactor, wSmooth, wEnergy, wPostBlur;
	global maxDist, cgAccuracy, blurSelection;
	global projMaxDist , projMaxIter;

	# prepare loop ranges
	loopLenMd  = 1
	loopLenLfs = 1
	loopLenBlr = 1

	if paramSet==6: # search
		loopLenMd  = 3
		loopLenLfs = 5
		loopLenBlr = 5

	if paramSet==7: # search
		loopLenMd  = 5
		loopLenLfs = 5
		loopLenBlr = 5


	# main loop, vary parameters
	for testRunMd in range(0,loopLenMd):
		for testRunLsf in range(0,loopLenLfs): # 5
			for testRunBlr in range(0,loopLenBlr): # 10

				# run1, main params (range 4,6,6)
				if paramSet==1: # search 64
					lsFactor  = pow(10, (1.-testRunLsf) )
					wSmooth   = 0.00002
					wEnergy   = 0.001
					wPostBlur = 1.0 * testRunBlr
					maxDist   = 0.5 * pow(5, (testRunMd) ) 

				# good run 102 accu avg error 3.562538  (params lsf 0.100000, maxd 12.500000, smo 0.000020, ene 0.001000, blr 3.000000)
				elif paramSet==2: # search 64 p2
					lsFactor  = 0.1
					wSmooth   = 0.00002
					wEnergy   = 0.001
					wPostBlur = 3.0 
					maxDist   = 12.0
					# run2
					wSmooth   = 0.000001 * pow(5, testRunBlr)
					wEnergy   = 0.0001   * pow(5, testRunLsf)

				elif paramSet==3: # search 140
					lsFactor  = 0.1
					wEnergy   = 0.000125
					wPostBlur = 3.0 * testRunBlr
					maxDist   = 0.5 * pow(5, (testRunMd) ) 
					wSmooth   = 0.000001 * pow(5, testRunLsf)

				# 1/25 of smoothing amount, 3x more blur!
				elif paramSet==4:
					lsFactor  = 0.1
					wSmooth   = 0.000001
					wEnergy   = 0.000125
					wPostBlur = 9.0 
					maxDist   = 12.0

				# good from 64 , smoke
				elif paramSet==5:
					wPostBlur  = 3.0 
					wSmooth    = 0.01
					wEnergy    = 0.0005
					# 1 for median, 2 for simple
					#wPostBlur  = 2.0  

					wPostBlur  = 1.0 * testRunBlr
					blurSelection  = testRunLsf

					#wPostBlur  = 1.0 
					blurSelection  = 1

					maxDist    = 1. + 10. *testRunLsf
					lsFactor   = 0.1 * (testRunBlr+1)
					maxDist    = 20; 
					lsFactor   = 0.1
					wPostBlur  = 6. # compromise?

					#cgAccuracy = 0.003
					cgAccuracy = 0.03 

				# exhaustive search
				elif paramSet==6:
					maxDist    = 20; 
					lsFactor   = 0.1;
					cgAccuracy = 0.01;
					blurSelection = 1;
					wPostBlur = 2.0       *         testRunBlr;
					wSmooth   = 0.00001   * pow(10, testRunLsf);
					wEnergy   = 0.0001    * pow(10, testRunMd);

				# search project
				elif paramSet==7:
					wSmooth    = 0.01
					wEnergy    = 0.0005 
					blurSelection  = 1 
					maxDist    = 20; 
					lsFactor   = 0.1
					wPostBlur  = 6. 
					cgAccuracy = 0.001 
					wPostBlur   = 10. / (testRunBlr+1);
					projMaxDist = 20  / (testRunLsf+1);
					projMaxIter = 200 / (testRunMd+1);
					# search 1: maxdist 20 bad!
					wPostBlur   = 2.* (testRunBlr+0.);
					projMaxDist = 5-(testRunLsf);
					projMaxIter = 5 * (testRunMd+1);
					# good:
					wPostBlur   = 4;  # times 0.5 later -> 2
					projMaxIter = 40;
					projMaxDist = 4;
					# test fill in , NT_DEBUG , doFillIn
					# minimal difference?
					projMaxIter = 3 * (testRunBlr+0);

				# liquid 64 3d
				elif paramset==10:
					wSmooth    = 0.000025
					wEnergy    = 0.000125
					wPostBlur  = 3.0 
					maxDist    = 12.0
					lsFactor   = 0.1
					#cgAccuracy = pow(10, -testRunBlr)
					#cgAccuracy = 0.05
					cgAccuracy = 0.5   # low, but still ok...
					#cgAccuracy = 10.0 # solve effectively off

				else:
					print( "Error , no valid paramset chosen!"); exit(1);

				print( "\nparamSearch loop %d %d %d "%(testRunBlr,testRunMd,testRunLsf) )
				runSeq();

			print( "Accu avg error === " ) # loop sep

	print( "Accu avg error best so far %f " % avgErrBest )


############################################################################################################################

def idString(testRunX,testRunY,testRunZ, otherRunX,otherRunY,otherRunZ):
	ret = "";
	# uni directional graph
	#if   otherRunZ < testRunZ:
		#ret = ("%d_%d_%d vs %d_%d_%d" % (otherRunX,otherRunY,otherRunZ, testRunX,testRunY,testRunZ   ));
	#elif otherRunY < testRunY:
		#ret = ("%d_%d_%d vs %d_%d_%d" % (otherRunX,otherRunY,otherRunZ, testRunX,testRunY,testRunZ   ));
	#elif otherRunX < testRunX:
		#ret = ("%d_%d_%d vs %d_%d_%d" % (otherRunX,otherRunY,otherRunZ, testRunX,testRunY,testRunZ   ));
	#else:
		#ret = ("%d_%d_%d vs %d_%d_%d" % (testRunX,testRunY,testRunZ,    otherRunX,otherRunY,otherRunZ));

	# bi-directional
	ret = ("%d_%d_%d vs %d_%d_%d" % (testRunX,testRunY,testRunZ,    otherRunX,otherRunY,otherRunZ));

	return ret;

def getGridDataId(ix,iy,iz):
	outx,outy,outz = (-1,-1,-1)
	if dataSet==200 or dataSet==201: 
		outx = ix * 2;
		outy = iy * 2;
		outz = iz * 2;
	elif dataSet==202:
		outx = 1 + ix * 2;
		outy = 1 + iy * 2;
		outz = 0; # 2 params
	elif dataSet==203:
		outx = 1 + ix * 2;
		outy = 1 + iy * 2;
		outz = 0; # 2 params
	return (outx,outy,outz)

def loopGrid() :
	global lsFactor, wSmooth, wEnergy, wPostBlur;
	global maxDist, cgAccuracy, blurSelection;
	global gridLoadX, gridLoadY, gridLoadZ;
	global gridOtherX, gridOtherY, gridOtherZ;
	global gridThirdX, gridThirdY, gridThirdZ;
	global doLoadThird, velThird, iDiffThird;

	# sanity check for grid single load
	#if doSingleSelect and not doOnlyLoad:
		#print ("Error, use single load only with load mode"); exit(1);

	errAllRuns = 0.
	# prepare loop ranges
	loopLenZ = 1;
	loopLenY = 1;
	loopLenX = 1;

	if dataSet==200 or dataSet==201: 
		loopLenZ = 1
		loopLenY = 2
		loopLenX = 2
	if dataSet==202:
		loopLenZ = 1
		loopLenY = 3
		loopLenX = 2
	if dataSet==203:
		loopLenZ = 1
		loopLenY = 3
		loopLenX = 2

	gridThirdX, gridThirdY, gridThirdZ = (singleSel[6],singleSel[7],singleSel[8]) 
	if doSingleSelect and gridThirdX>=0 and gridThirdY>=0 and gridThirdZ>=0:
		print("Loading third data point for interpolation")
		doLoadThird = True;
		# allocate grids
		velThird   = solv.create(VecGrid)
		iDiffThird = solv.create(LevelsetGrid)

	# fix params
	maxDist   = 20
	lsFactor  = 0.1
	wSmooth   = 0.01
	wEnergy   = 0.0005
	#wPostBlur = 2
	wPostBlur = 6
	#cgAccuracy = 0.003 # doesnt pay off
	cgAccuracy = 0.03
	blurSelection = 1
	#cgAccuracy = 11.11 # NT DEBUG off

	gv = {};

	# main loop, vary parameters
	for testRunZ in range(0,loopLenZ):
		for testRunY in range(0,loopLenY): 
			for testRunX in range(0,loopLenX): 
				# calculate offsets into data
				gridLoadX, gridLoadY, gridLoadZ = getGridDataId(testRunX,testRunY,testRunZ );

				for otherRunZ in range(0,loopLenZ):
					for otherRunY in range(0,loopLenY): 
						for otherRunX in range(0,loopLenX): 
							if 1 and testRunX==otherRunX and testRunY==otherRunY and testRunZ==otherRunZ:
								continue;
							#gridOtherX = otherRunX * 2; gridOtherY = otherRunY * 2; gridOtherZ = otherRunZ * 2;
							gridOtherX, gridOtherY, gridOtherZ = getGridDataId(otherRunX,otherRunY,otherRunZ );

							#print( "\ngridSearch (%d %d %d) -> (%d %d %d)  "%(testRunX,testRunY,testRunZ, otherRunX,otherRunY,otherRunZ) )
							#print( "    sel    (%d %d %d) -> (%d %d %d)  "%(singleSel[0],singleSel[1],singleSel[2],singleSel[3],singleSel[4],singleSel[5]) );
							if (not doSingleSelect) or (doSingleSelect and checkSingleSelect(testRunX,testRunY,testRunZ, otherRunX,otherRunY,otherRunZ) ):
								#print( "\ngridSearch (%d %d %d) -> (%d %d %d)  "%(testRunX,testRunY,testRunZ, otherRunX,otherRunY,otherRunZ) )
								print( "\ngridSearch (%d %d %d) -> (%d %d %d)  "%(gridLoadX,gridLoadY,gridLoadZ, gridOtherX,gridOtherY,gridOtherZ) )

								runSeq();

								# store error
								print( idString(testRunX,testRunY,testRunZ, otherRunX,otherRunY,otherRunZ) );
								gv[ idString(testRunX,testRunY,testRunZ, otherRunX,otherRunY,otherRunZ) ] = accuAvgErr;
								errAllRuns = errAllRuns + accuAvgErr;
				# sub loop done
	# main loop done

	if not doOnlyLoad:
		if 0:
			print( "\nResults:");
			for item in gv:
				print("%s: %f" % (item, gv[item]));

		if 1:
			sorted_list = [x for x in gv.iteritems()] 
			sorted_list.sort(key=lambda x: x[0]) # sort by id string
			#sorted_list.sort(key=lambda x: x[1]) # sort by value 
			#sorted_list.reverse() # to reverse the sort
			print( "\nResults sorted:");
			for item in sorted_list:
				print("%s: %f" % (item[0], item[1]));

	print( "\nTotal added err: %f"%(errAllRuns));
	# grid done



############################################################################################################################


# select loop type
if dataSet<200:
	loopParamSearch();
else:
	loopGrid();


The diff you're trying to view is too large. Only the first 1000 changed files have been loaded.
Showing with 0 additions and 0 deletions (0 / 0 diffs computed)
swh spinner

Computing file changes ...

back to top

Software Heritage — Copyright (C) 2015–2026, The Software Heritage developers. License: GNU AGPLv3+.
The source code of Software Heritage itself is available on our development forge.
The source code files archived by Software Heritage are available under their own copyright and licenses.
Terms of use: Archive access, API— Content policy— Contact— JavaScript license information— Web API