From e577d829681b3821fe897989fdc3747c9524051a Mon Sep 17 00:00:00 2001 From: Jean-Matthieu Etancelin <jean-matthieu.etancelin@imag.fr> Date: Wed, 3 Apr 2013 16:11:30 +0000 Subject: [PATCH] Add 2D demo real time rendering --- Examples/demo_2D.cl | 50 +++++++++++++++++++++++++++++ Examples/demo_2D_real-time.py | 60 +++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 Examples/demo_2D.cl create mode 100644 Examples/demo_2D_real-time.py diff --git a/Examples/demo_2D.cl b/Examples/demo_2D.cl new file mode 100644 index 000000000..fb7e70b1c --- /dev/null +++ b/Examples/demo_2D.cl @@ -0,0 +1,50 @@ +__kernel void initScalar(__global float* scalar, + float4 minPos, + float4 size) +{ + uint gidX = get_global_id(0); + uint gidY = get_global_id(1); + uint i; + float2 pos, center=(float2)(0.5, 0.75),center2=(float2)(0.75, 0.25),center3=(float2)(0.4, 0.4),center4=(float2)(0.6, 0.5); + for(i=gidX; i<WIDTH; i+=WGN) + { + pos = (float2)(i*size.x, gidY*size.y); + scalar[i+gidY*(WIDTH)] = ((distance(pos, center)<0.15) ? 1.0 : ((distance(pos, center2)<0.15) ? 2.0 : ((fabs(center3.x-pos.x)+fabs(center3.y-pos.y)<0.1) ? 3.0 : ((10.0*maxmag(fabs(center4.x-pos.x),fabs(center4.y-pos.y))<0.8) ? 4.0 : 0.0)))); + } +} + +#define PI (float)M_PI + +__kernel void initVelocity(__global float* veloX,__global float* veloY, + float4 minPos, + float4 size) +{ + uint gidX = get_global_id(0); + uint gidY = get_global_id(1); + uint i; + float v; + for(i=gidX; i<WIDTH; i+=WGN) + { + v = veloX[i+gidY*(WIDTH)] = -sin(i*size.x * PI)*sin(i*size.x * PI)*sin(gidY*size.y * PI * 2); + veloX[i+gidY*(WIDTH)] = v; // = Vx(x,y) + veloY[i+gidY*(WIDTH)] = -v;// = Vy(y,x) = -Vx(x,y) + } +} + +__kernel void analyticVelocity(__global float* veloX,__global float* veloY, + float t, + float4 minPos, + float4 size) +{ + uint gidX = get_global_id(0); + uint gidY = get_global_id(1); + uint i; + float v; + float time_term = cos(t*PI/3.0); + for(i=gidX; i<WIDTH; i+=WGN) + { + v = veloX[i+gidY*(WIDTH)] = -sin(i*size.x * PI)*sin(i*size.x * PI)*sin(gidY*size.y * PI * 2)*time_term; + veloX[i+gidY*(WIDTH)] = v; // = Vx(x,y) + veloY[i+gidY*(WIDTH)] = -v;// = Vy(y,x) = -Vx(x,y) + } +} diff --git a/Examples/demo_2D_real-time.py b/Examples/demo_2D_real-time.py new file mode 100644 index 000000000..5305195e0 --- /dev/null +++ b/Examples/demo_2D_real-time.py @@ -0,0 +1,60 @@ +#!/bin/env python +import time +from parmepy.domain.box import Box +from parmepy.gpu import PARMES_REAL_GPU, PARMES_DOUBLE_GPU +from parmepy.fields.continuous import Field +from parmepy.fields.analytical import AnalyticalField +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 parmepy.gpu.QtRendering import QtOpenGLRendering +import math +import sys + + +def run(nb=257): + dim = 2 + boxLength = [1., 1.] + boxMin = [0., 0.] + nbElem = [nb, nb] + + timeStep = 0.025 + finalTime = 3. + + ## 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_m6prime', + src=['./demo_2D.cl'], + precision=PARMES_REAL_GPU, + ) + velocity = Analytic(velo, None, + resolutions={velo: nbElem, }, + method='gpu', + src=['./demo_2D.cl'], + ) + render = QtOpenGLRendering(scal) + + ##Problem + pb = TransportProblem([velocity, advec], + monitors=[render]) + + ## Setting solver to Problem + pb.setUp(finalTime, timeStep) + + ## Solve problem + pb.solve() + + +if __name__ == "__main__": + run(1025) + -- GitLab