diff --git a/Examples/demo_2D_real-time.py b/Examples/demo_2D_real-time.py index 6b6f28df292644995174cf41e35d87121854494e..4ed123c8035f71b87ebc9ef07f9e5bdddb162a45 100755 --- a/Examples/demo_2D_real-time.py +++ b/Examples/demo_2D_real-time.py @@ -1,29 +1,28 @@ #!/usr/bin/env python -import time import parmepy from parmepy.domain.box import Box from parmepy.gpu import PARMES_REAL_GPU, PARMES_DOUBLE_GPU +#parmepy.gpu.CL_PROFILE = True + from parmepy.fields.continuous import Field from parmepy.operator.advection import Advection from parmepy.problem.transport import TransportProblem from parmepy.operator.analytic import Analytic from parmepy.gpu.QtRendering import QtOpenGLRendering +from parmepy.problem.simulation import Simulation import math -import sys import numpy as np -parmepy.gpu.CL_PROFILE = False - norm2 = lambda x, y: x * x + y * y norm1 = lambda x, y: abs(x) + abs(y) norminf = lambda x, y: max(abs(x), abs(y)) def initScalar(x, y): - return math.exp(-(norm2(x - 0.5, y - 0.75)/0.0225)**6) \ - + 0.75*math.exp(-(norm2(x - 0.75, y - 0.25)/0.0225)**6) \ - + 0.5*math.exp(-(norm1(x - 0.4, y - 0.4)/0.1)**6) \ - + 0.25*math.exp(-(norminf(x - 0.6, y - 0.5)/0.08)**6) + return math.exp(-(norm2(x - 0.5, y - 0.75) / 0.0225) ** 6) \ + + 0.75 * math.exp(-(norm2(x - 0.75, y - 0.25) / 0.0225) ** 6) \ + + 0.5 * math.exp(-(norm1(x - 0.4, y - 0.4) / 0.1) ** 6) \ + + 0.25 * math.exp(-(norminf(x - 0.6, y - 0.5) / 0.08) ** 6) # if norm2(x - 0.5, y - 0.75) < 0.0225: # return 0.25 # elif norm2(x - 0.75, y - 0.25) < 0.0225: @@ -36,62 +35,66 @@ def initScalar(x, y): # return 0. -def run(nb=257): - dim = 2 - boxLength = [1., 1.] - boxMin = [0., 0.] - if isinstance(nb, list): - nbElem = nb - else: - nbElem = [nb, nb] - - timeStep = 0.075 - finalTime = 3.0 + timeStep - ## Domain - box = Box(dim, length=boxLength, origin=boxMin) - - ## Fields - scal = Field(domain=box, name='Scalar', formula=initScalar) - velo = Field(domain=box, name='Velocity', isVector=True) - - ## Operators - advec = Advection(velo, scal, - resolutions={velo: nbElem, - scal: nbElem}, - method='gpu_1k_m6prime', - #src=['./demo_2D.cl'], - precision=PARMES_REAL_GPU, - splittingConfig='o2' - ) - velocity = Analytic(velo, - resolutions={velo: nbElem}, - method='gpu', - src=['./demo_2D.cl'], - precision=PARMES_REAL_GPU, - ) - render = QtOpenGLRendering(scal) - - # Problem - pb = TransportProblem([velocity, advec], - monitors=[render]) - - # Setting solver to Problem - pb.setUp(finalTime, timeStep) - - # We copy the first discretisation of scalar - scalar_initial = np.copy(scal.discreteFields.values()[0].data) - - ## Solve problem - pb.solve() - - scal_disc = scal.discreteFields.values()[0] - scal_disc.toHost() - print 'Erreur : ', np.max(np.abs(scalar_initial - - scal_disc.data)) / np.max(scalar_initial) - print np.linalg.norm(scalar_initial - scal_disc.data, ord=2)/np.linalg.norm(scalar_initial, ord=2) - - pb.finalize() - -if __name__ == "__main__": - run([513, 513]) - +def vitesse(x, y, t=0): + vx = -math.sin(x * math.pi) ** 2 * math.sin(y * math.pi * 2.) * \ + math.cos(t * math.pi / 3.) + vy = math.sin(y * math.pi) ** 2 * math.sin(x * math.pi * 2.) * \ + math.cos(t * math.pi / 3.) + return vx, vy + + +dim = 2 +boxLength = [1., 1.] +boxMin = [0., 0.] +nbElem = [513, 513] + +timeStep = 0.075 +finalTime = 3.0 + timeStep + +simu = Simulation(0., finalTime, int(finalTime / timeStep)) + +## Domain +box = Box(dim, length=boxLength, origin=boxMin) + +## Fields +scal = Field(domain=box, name='Scalar', formula=initScalar) +velo = Field(domain=box, name='Velocity', isVector=True) + +## Operators +advec = Advection(velo, scal, + resolutions={velo: nbElem, + scal: nbElem}, + method='gpu_1k_m6prime', + #src=['./demo_2D.cl'], + precision=PARMES_REAL_GPU, + splittingConfig='o2' + ) +velocity = Analytic(velo, # formula=vitesse, + resolutions={velo: nbElem}, + method='gpu', + src=['./demo_2D.cl'], + precision=PARMES_REAL_GPU, + ) +render = QtOpenGLRendering(scal) + +# Problem +pb = TransportProblem([velocity, advec], simu, + monitors=[render]) + +# Setting solver to Problem +pb.setUp() + +# We copy the first discretisation of scalar +scalar_initial = np.copy(scal.discreteFields.values()[0].data) + +## Solve problem +pb.solve() + +scal_disc = scal.discreteFields.values()[0] +scal_disc.toHost() +print 'Erreur : ', np.max(np.abs(scalar_initial - + scal_disc.data)) / np.max(scalar_initial) +print np.linalg.norm(scalar_initial - scal_disc.data, ord=2) / \ + np.linalg.norm(scalar_initial, ord=2) + +pb.finalize() diff --git a/Examples/levelSet2D.py b/Examples/levelSet2D.py index a0a2e0de9e71f9b33117a1c032a5c22cc9e54b68..84a59b5f96a42b5a020caaeb3c7916be6994e290 100755 --- a/Examples/levelSet2D.py +++ b/Examples/levelSet2D.py @@ -1,119 +1,99 @@ #!/usr/bin/env python -import time from parmepy.domain.box import Box from parmepy.gpu import PARMES_REAL_GPU from parmepy.fields.continuous import Field from parmepy.operator.advection import Advection from parmepy.problem.transport import TransportProblem from parmepy.operator.monitors.printer import Printer +from parmepy.problem.simulation import Simulation from parmepy.operator.analytic import Analytic -import math -import sys - +# import math # def vitesse(x, y): # vx = -math.sin(x * math.pi) ** 2 * math.sin(y * math.pi * 2) # vy = math.sin(y * math.pi) ** 2 * math.sin(x * math.pi * 2) # return vx, vy -def vitesse(x, y, t, dt, ite): - vx = -math.sin(x * math.pi) ** 2 * math.sin(y * math.pi * 2)*math.cos(t*math.pi/3.0) - vy = math.sin(y * math.pi) ** 2 * math.sin(x * math.pi * 2)*math.cos(t*math.pi/3.0) - return vx, vy - - -def scalaire(x, y): - rr = math.sqrt((x - 0.5) ** 2 + (y - 0.75) ** 2) - if rr < 0.15: - return 1. - else: - return 0. - - -def run(nb=257): - dim = 2 - boxLength = [1., 1.] - boxMin = [0., 0.] - if isinstance(nb, list): - nbElem = nb - else: - nbElem = [nb, nb] - - timeStep = 0.025 - finalTime = 3. - outputFilePrefix = './res_2D/levelSet_2D_rect_' - outputModulo = 1 - - t0 = time.time() - - ## Domain - box = Box(dim, length=boxLength, origin=boxMin) - - ## Fields - scal = Field(domain=box, name='Scalar') - velo = Field(domain=box, name='Velocity', isVector=True) - - ## Operators - advec = Advection(velo, scal, - resolutions={velo: nbElem, - scal: nbElem}, - method='gpu_1k_m4prime', - #method='gpu_1k_m6prime', - #method='gpu_1k_m8prime', - #method='gpu_2k_m4prime', - #method='gpu_2k_m6prime', - #method='gpu_2k_m8prime', - #method='scales' - src=['./levelSet2D.cl'], - precision=PARMES_REAL_GPU, - #precision=PARMES_DOUBLE_GPU, - #splittingConfig='o2' - #splittingConfig='y_only' - splittingConfig='o2_FullHalf' - ) - velocity = Analytic(velo, - resolutions={velo: nbElem}, - method='gpu', - src=['./levelSet2D.cl'], - precision=PARMES_REAL_GPU, - ) - - ##Problem - #pb = TransportProblem([advec], - pb = TransportProblem([velocity, advec], - monitors=[Printer(fields=[scal], - frequency=outputModulo, - outputPrefix=outputFilePrefix)]) - - ## Setting solver to Problem - pb.setUp(finalTime, timeStep) - - t1 = time.time() - ## Solve problem - timings = pb.solve() - tf = time.time() - - print "\n" - print "Total time : ", tf - t0, "sec (CPU)" - print "Init time : ", t1 - t0, "sec (CPU)" - print "Solving time : ", tf - t1, "sec (CPU)" - print "" - return (pb.time_info[0] + "\"Solving time\" \"Init time\" \"Total time\"", - pb.time_info[1] + str(tf - t1) + " " + str(t1 - t0) + " " + str(tf - t0)) - -if __name__ == "__main__": - run(257) - # timings = {} - # f = open('bench_levelSet2D.dat', 'w') - # header = "#size dim nPart " - # sizes = xrange(128, 4096+2048+1, 128) - # sizes = xrange(128, 512+1, 128) - # sizes = [1024,2048,4096,4096+2048] - # for s in sizes: - # h, t = run(s) - # timings[s] = t - # header += h - # f.write(header + "\n") - # for s in sizes: - # f.write(str(s) + " " + str(2) + " " + str(s**2) + " " + str(timings[s]) + "\n") - # f.close() + +# def vitesse(x, y, t=0): +# vx = -math.sin(x * math.pi) ** 2 * math.sin(y * math.pi * 2) * \ +# math.cos(t * math.pi / 3.) +# vy = math.sin(y * math.pi) ** 2 * math.sin(x * math.pi * 2) * \ +# math.cos(t * math.pi / 3.) +# return vx, vy + + +# def scalaire(x, y): +# rr = math.sqrt((x - 0.5) ** 2 + (y - 0.75) ** 2) +# if rr < 0.15: +# return 1. +# else: +# return 0. + + +dim = 2 +boxLength = [1., 1.] +boxMin = [0., 0.] +nbElem = [1025, 1025] + +timeStep = 0.025 +finalTime = 3. +outputFilePrefix = './res_2D/levelSet_2D_rect_' +outputModulo = 0 +simu = Simulation(0., finalTime, int(finalTime / timeStep)) + +## Domain +box = Box(dim, length=boxLength, origin=boxMin) + +## Fields +scal = Field(domain=box, name='Scalar') +velo = Field(domain=box, name='Velocity', isVector=True) + +## Operators +advec = Advection(velo, scal, + resolutions={velo: nbElem, + scal: nbElem}, + method='gpu_2k_m4prime', + #method='gpu_1k_m6prime', + #method='gpu_1k_m8prime', + #method='gpu_2k_m4prime', + #method='gpu_2k_m6prime', + #method='gpu_2k_m8prime', + #method='scales' + src=['./levelSet2D.cl'], + precision=PARMES_REAL_GPU, + #precision=PARMES_DOUBLE_GPU, + #splittingConfig='o2' + #splittingConfig='y_only' + #splittingConfig='o2_FullHalf' + ) +velocity = Analytic(velo, + resolutions={velo: nbElem}, + method='gpu', + src=['./levelSet2D.cl'], + precision=PARMES_REAL_GPU, + ) + +##Problem +#pb = TransportProblem([advec],simu, +pb = TransportProblem([velocity, advec], simu, + monitors=[Printer(fields=[scal], + frequency=outputModulo, + prefix=outputFilePrefix)]) + +## Setting solver to Problem +pb.setUp() + +## Solve problem +pb.solve() + +pb.finalize() + +th, tt = pb.timer.toString() +for op in pb.operators: + oth, ott = op.timer.toString() + th += oth + tt += ott +print th +print tt + diff --git a/Examples/levelSet3D.py b/Examples/levelSet3D.py index 9a78e45696a666b96c9398302755fe41930b5367..23afc96eb98d1b7cb6e7d3064b1f12275087e00f 100755 --- a/Examples/levelSet3D.py +++ b/Examples/levelSet3D.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -import time import parmepy as pp from parmepy.gpu import PARMES_REAL_GPU, PARMES_DOUBLE_GPU from parmepy.fields.continuous import Field @@ -7,100 +6,81 @@ from parmepy.operator.advection import Advection from parmepy.problem.transport import TransportProblem from parmepy.operator.monitors.printer import Printer from parmepy.operator.analytic import Analytic -from math import sin, cos, pi -import sys - - -def vitesse(x, y, z, t=0, dt=0, ite=0): - vx = 2. * sin(pi*x)**2*sin(2.*pi*y)*sin(2.*pi*z)*cos(t*pi/3.) - vy = -sin(2.*pi*x)*sin(pi*y)**2*sin(2.*pi*z)*cos(t*pi/3.) - vz = -sin(2.*pi*x)*sin(2.*pi*y)*sin(pi*z)**2*cos(t*pi/3.) - return vx, vy, vz - - -def run(nb=257): - dim = 3 - boxLength = [1., 1., 1.] - boxMin = [0., 0., 0.] - if isinstance(nb, list): - nbElem = nb - else: - nbElem = [nb, nb, nb] - - timeStep = 0.05 - finalTime = 3. - outputFilePrefix = './res3D_new/levelSet_3D_' - outputModulo = 1 - - t0 = time.time() - - ## Domain - box = pp.Box(dim, length=boxLength, origin=boxMin) - - ## Fields - scal = Field(domain=box, name='Scalar') - velo = Field(domain=box, name='Velocity', isVector=True) - - ## Operators - advec = Advection(velo, scal, - resolutions={velo: nbElem, - scal: nbElem}, - #method='scales', - method='gpu_1k_m4prime', - #method='gpu_1k_m6prime', - #method='gpu_1k_m8prime', - #method='gpu_2k_m4prime', - #method='gpu_2k_m6prime', - #method='gpu_2k_m8prime', - src=['./levelSet3D.cl'], - precision=PARMES_REAL_GPU, - #precision=PARMES_DOUBLE_GPU, - splittingConfig='o2' - #splittingConfig='o2_FullHalf' - ) - velocity = Analytic(velo, # formula=vitesse, - resolutions={velo: nbElem}, - method='gpu', - src=['./levelSet3D.cl'], - precision=PARMES_REAL_GPU, - ) - - ##Problem - #pb = TransportProblem([advec], - pb = TransportProblem([velocity, advec], - monitors=[Printer(fields=[scal], - frequency=outputModulo, - outputPrefix=outputFilePrefix)]) - - ## Setting solver to Problem - pb.setUp(finalTime, timeStep) - - t1 = time.time() - - ## Solve problem - timings = pb.solve() - - tf = time.time() - - print "\n" - print "Total time : ", tf - t0, "sec (CPU)" - print "Init time : ", t1 - t0, "sec (CPU)" - print "Solving time : ", tf - t1, "sec (CPU)" - print "" - return pb.time_info[0] + "\"Solving time\" \"Init time\" \"Total time\"", pb.time_info[1] + str(tf - t1) + " " + str(t1 - t0) + " " + str(tf - t0) - -if __name__ == "__main__": - run([129, 129, 129]) - # timings = {} - # f = open('bench_levelSet3D.dat', 'w') - # header = "#size dim nPart " - # sizes = xrange(32, 256+32*3+1, 32) - # #sizes = [256+32+32+32] - # for s in sizes: - # h, t = run(s) - # timings[s] = t - # header += h - # f.write(header + "\n") - # for s in sizes: - # f.write(str(s) + " " + str(3) + " " + str(s**3) + " " + str(timings[s]) + "\n") - # f.close() +from parmepy.problem.simulation import Simulation +# from math import sin, cos, pi + + +# def scalaire(x,y,z): +# return 1. + + +# def vitesse(x, y, z, t=0): +# vx = 2. * sin(pi*x)**2*sin(2.*pi*y)*sin(2.*pi*z)*cos(t*pi/3.) +# vy = -sin(2.*pi*x)*sin(pi*y)**2*sin(2.*pi*z)*cos(t*pi/3.) +# vz = -sin(2.*pi*x)*sin(2.*pi*y)*sin(pi*z)**2*cos(t*pi/3.) +# return vx, vy, vz + +dim = 3 +boxLength = [1., 1., 1.] +boxMin = [0., 0., 0.] +nbElem = 3 * [129] + +timeStep = 0.05 +finalTime = 3. +outputFilePrefix = './res3D_new/levelSet_3D_' +outputModulo = 1 +simu = Simulation(0., finalTime, int(finalTime / timeStep)) + +## Domain +box = pp.Box(dim, length=boxLength, origin=boxMin) + +## Fields +scal = Field(domain=box, name='Scalar') +velo = Field(domain=box, name='Velocity', isVector=True) + +## Operators +advec = Advection(velo, scal, + resolutions={velo: nbElem, + scal: nbElem}, + #method='scales', + method='gpu_1k_m4prime', + #method='gpu_1k_m6prime', + #method='gpu_1k_m8prime', + #method='gpu_2k_m4prime', + #method='gpu_2k_m6prime', + #method='gpu_2k_m8prime', + src=['./levelSet3D.cl'], + precision=PARMES_REAL_GPU, + #precision=PARMES_DOUBLE_GPU, + splittingConfig='o2' + #splittingConfig='o2_FullHalf' + ) +velocity = Analytic(velo, + resolutions={velo: nbElem}, + method='gpu', + src=['./levelSet3D.cl'], + precision=PARMES_REAL_GPU, + ) + +##Problem +#pb = TransportProblem([advec], +pb = TransportProblem([velocity, advec], simu, + monitors=[Printer(fields=[scal], + frequency=outputModulo, + prefix=outputFilePrefix)]) + +## Setting solver to Problem +pb.setUp() + +## Solve problem +pb.solve() + +pb.finalize() + +th, tt = pb.timer.toString() +for op in pb.operators: + oth, ott = op.timer.toString() + th += oth + tt += ott +print th +print tt