From 20c75ebb5f46c60749a9b2163b1b265a3d3324fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franck=20P=C3=A9rignon?= <franck.perignon@imag.fr> Date: Fri, 24 Jan 2014 13:02:14 +0000 Subject: [PATCH] testCurl pour Chloe --- Examples/testCurl.py | 122 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 Examples/testCurl.py diff --git a/Examples/testCurl.py b/Examples/testCurl.py new file mode 100644 index 000000000..b7e300c14 --- /dev/null +++ b/Examples/testCurl.py @@ -0,0 +1,122 @@ +import numpy as np +from parmepy.domain.obstacle.controlBox import ControlBox +import parmepy as pp +import parmepy.mpi as mpi +from parmepy.domain.obstacle.planes import SubSpace, SubPlane +from parmepy.operator.monitors.printer import Printer +from parmepy.problem.simulation import Simulation +from parmepy.constants import HDF5 +import numpy as np +## pi constant +pi = np.pi +cos = np.cos +sin = np.sin + +nb = 129 + +Lx = Ly = Lz = 2 * pi +dom = pp.Box(dimension=3, length=[Lx, Ly, Lz], origin=[-pi, -pi, -pi]) +resol3D = [nb, nb, nb] + +from parmepy.methods_keys import Scales, TimeIntegrator, Interpolation,\ + Remesh, Support, Splitting, dtAdvecCrit, SpaceDiscretisation, GhostUpdate +from parmepy.methods import FD_C_4 + +## Function to compute TG velocity +def computeVel(res, x, y, z, t): + res[0][...] = sin(x) * cos(y) * cos(z) + res[1][...] = - cos(x) * sin(y) * cos(z) + res[2][...] = 0. + return res + + +## Function to compute reference vorticity +def computeVort(res, x, y, z, t): + res[0][...] = - cos(x) * sin(y) * sin(z) + res[1][...] = - sin(x) * cos(y) * sin(z) + res[2][...] = 2. * sin(x) * sin(y) * cos(z) + return res + +velo = pp.Field(domain=dom, formula=computeVel, name='Velocity', isVector=True) +velo2 = pp.Field(domain=dom, formula=computeVel, name='Veloty2', isVector=True) +vortifft = pp.Field(domain=dom, name='vortifft', isVector=True) +vortiFD = pp.Field(domain=dom, isVector=True) +vortiref = pp.Field(domain=dom, name='vortiref', formula=computeVort, isVector=True) +vortiref2 = pp.Field(domain=dom, name='vortiref2', formula=computeVort, isVector=True) + +from parmepy.operator.differential import Curl +from parmepy.f2py import fftw2py +topo3 = mpi.topology.Cartesian(dom, 3, resol3D, ghosts=[2, 2, 2]) + +curlfft = Curl(velo, vortifft, resolutions={velo: resol3D, vortifft: resol3D}, + method={SpaceDiscretisation: fftw2py, GhostUpdate: False}) + +curlFD = Curl(velo2, vortiFD, resolutions={velo2: resol3D, vortiFD: resol3D}, + method={SpaceDiscretisation: FD_C_4, GhostUpdate: True}, + topo=topo3) + +curlfft.discretize() +curlFD.discretize() + +topofft = curlfft.discreteFields[curlfft.outvar].topology +vortiref.discretize(topofft) +vortiref2.discretize(topo3) +velo.initialize(topofft) +velo2.initialize(topo3) +vortiref.initialize(topofft) +vortiref2.initialize(topo3) +curlfft.setUp() +curlFD.setUp() + +wdfft = vortifft.discreteFields[topofft].data +wFD = vortiFD.discreteFields[topo3].data +wREF1 = vortiref.discreteFields[topofft].data +wREF2 = vortiref2.discreteFields[topo3].data + +vd1 = velo.discreteFields[topofft].data +vd2 = velo2.discreteFields[topo3].data + +from parmepy.constants import VTK +printer = Printer(variables=[vortiref, vortifft], + topo=topofft, + frequency=1, + prefix='./testCurl', + formattype=VTK) +printer.setUp() +printer2 = Printer(variables=[vortiFD, vortiref2], + topo=topo3, + frequency=1, + prefix='./testCurl2', + formattype=VTK) + +printer2.setUp() +simulation = Simulation() + +curlfft.apply(simulation) +curlFD.apply(simulation) + +printer.apply(simulation) +printer2.apply(simulation) + +ind = topo3.mesh.iCompute +indfft = topofft.mesh.iCompute + + +for i in xrange(3): + print vortifft.norm() + print vortiFD.norm() + print vortiref.norm() + print vortiref2.norm() + ## print np.allclose(wdfft[i][...], wFD[i][ind]) + ## print np.allclose(wdfft[i][...], wREF1[i]) + ## print np.allclose(wFD[i][ind], wREF2[i][ind]) + ## print np.allclose(wREF1[i][indfft], wREF2[i][ind]) + ## print np.sum(wdfft[i][...] - wFD[i][ind]) + ## print 'max :', np.abs((wdfft[i][indfft] - wFD[i][ind])).max() + ## print 'max fft/ref1 :', np.abs((wdfft[i] - wREF1[i])).max() + ## print 'max fft/ref11 :', np.abs((wdfft[i][indfft] - wREF1[i][indfft])).max() + ## print 'max fft/ref11 :', np.abs((wdfft[i][...] - wREF1[i][...])).max() + ## print 'max fft/ref2 :', np.abs((wdfft[i][indfft] - wREF2[i][ind])).max() + ## print 'max FD/ref:', np.abs((wFD[i][ind] - wREF2[i][ind])).max() + ## print 'max ref/ref:', np.abs((wREF1[i][indfft] - wREF2[i][ind])).max() + -- GitLab