Skip to content
Snippets Groups Projects
Commit 0d9fdb9a authored by Chloe Mimeau's avatar Chloe Mimeau
Browse files

2D poisson solver included in Parmes

parent ee2fb2cf
No related branches found
No related tags found
No related merge requests found
...@@ -71,13 +71,16 @@ contains ...@@ -71,13 +71,16 @@ contains
subroutine solve_poisson_2d(omega,velocity_x,velocity_y) subroutine solve_poisson_2d(omega,velocity_x,velocity_y)
real(pk),dimension(:,:),intent(in):: omega real(pk),dimension(:,:),intent(in):: omega
real(pk),dimension(size(omega,1),size(omega,2)),intent(out) :: velocity_x,velocity_y real(pk),dimension(size(omega,1),size(omega,2)),intent(out) :: velocity_x,velocity_y
real(pk) :: start
!f2py intent(in,out) :: velocity_x,velocity_y !f2py intent(in,out) :: velocity_x,velocity_y
start = MPI_WTime()
call r2c_2d(omega) call r2c_2d(omega)
call filter_poisson_2d() call filter_poisson_2d()
call c2r_2d(velocity_x,velocity_y) call c2r_2d(velocity_x,velocity_y)
print *, "fortran resolution time : ", MPI_WTime() - start
end subroutine solve_poisson_2d end subroutine solve_poisson_2d
......
...@@ -33,6 +33,7 @@ class DiffusionFFT(DiscreteOperator): ...@@ -33,6 +33,7 @@ class DiffusionFFT(DiscreteOperator):
self.diff.discreteFieldId[self.diff.vorticity]] self.diff.discreteFieldId[self.diff.vorticity]]
## Viscosity. ## Viscosity.
self.viscosity = viscosity self.viscosity = viscosity
self.domain = self.diff.domain
## Boolean : pure vort diffusion or curl(u) + vort diffusion. ## Boolean : pure vort diffusion or curl(u) + vort diffusion.
self.with_curl = with_curl self.with_curl = with_curl
self.compute_time = 0. self.compute_time = 0.
...@@ -48,27 +49,35 @@ class DiffusionFFT(DiscreteOperator): ...@@ -48,27 +49,35 @@ class DiffusionFFT(DiscreteOperator):
""" """
self.compute_time = time.time() self.compute_time = time.time()
if self.with_curl: if (self.domain.dimension == 2):
self.vorticity.data[0], \ raise ValueError("Not yet implemented")
self.vorticity.data[1], \
self.vorticity.data[2] = \ elif (self.domain.dimension == 3):
fftw2py.solve_curl_diffusion_3d(self.viscosity * dt,
self.velocity.data[0], if self.with_curl:
self.velocity.data[1], self.vorticity.data[0], \
self.velocity.data[2], self.vorticity.data[1], \
self.vorticity.data[0], self.vorticity.data[2] = \
self.vorticity.data[1], fftw2py.solve_curl_diffusion_3d(self.viscosity * dt,
self.vorticity.data[2]) self.velocity.data[0],
self.velocity.data[1],
self.velocity.data[2],
self.vorticity.data[0],
self.vorticity.data[1],
self.vorticity.data[2])
else:
self.vorticity.data[0], \
self.vorticity.data[1], \
self.vorticity.data[2] = \
fftw2py.solve_diffusion_3d(self.viscosity * dt,
self.vorticity.data[0],
self.vorticity.data[1],
self.vorticity.data[2])
else: else:
self.vorticity.data[0], \ raise ValueError("invalid problem dimension")
self.vorticity.data[1], \
self.vorticity.data[2] = \
fftw2py.solve_diffusion_3d(self.viscosity * dt,
self.vorticity.data[0],
self.vorticity.data[1],
self.vorticity.data[2])
# ind0a = self.topology.mesh.local_start[0] # ind0a = self.topology.mesh.local_start[0]
......
...@@ -15,7 +15,7 @@ class PoissonFFT(DiscreteOperator): ...@@ -15,7 +15,7 @@ class PoissonFFT(DiscreteOperator):
""" """
@debug @debug
def __init__(self, poisson, method='', domain=None): def __init__(self, poisson, method=''):
""" """
Constructor. Constructor.
@param velocity : descretized velocity to update from vorticity. @param velocity : descretized velocity to update from vorticity.
...@@ -31,7 +31,7 @@ class PoissonFFT(DiscreteOperator): ...@@ -31,7 +31,7 @@ class PoissonFFT(DiscreteOperator):
self.vorticity = self.poisson.vorticity.discreteField[ self.vorticity = self.poisson.vorticity.discreteField[
self.poisson.discreteFieldId[self.poisson.vorticity]] self.poisson.discreteFieldId[self.poisson.vorticity]]
self.method = method self.method = method
self.domain = domain self.domain = self.poisson.domain
self.compute_time = 0. self.compute_time = 0.
@debug @debug
...@@ -51,21 +51,32 @@ class PoissonFFT(DiscreteOperator): ...@@ -51,21 +51,32 @@ class PoissonFFT(DiscreteOperator):
self.compute_time = time.time() self.compute_time = time.time()
#=== RECOVER VELOCITY FIELD FROM VORTICITY FIELD === #=== RECOVER VELOCITY FIELD FROM VORTICITY FIELD ===
self.velocity.data[0],\ if (self.domain.dimension == 2):
self.velocity.data[1],\ self.velocity.data[0],\
self.velocity.data[2] = \ self.velocity.data[1] =\
fftw2py.solve_poisson_3d(self.vorticity.data[0], fftw2py.solve_poisson_2d(self.vorticity.data,
self.vorticity.data[1], self.velocity.data[0],
self.vorticity.data[2], self.velocity.data[1])
self.velocity.data[0],
self.velocity.data[1], elif (self.domain.dimension == 3):
self.velocity.data[2]) self.velocity.data[0],\
self.velocity.data[1],\
self.velocity.data[2] = \
fftw2py.solve_poisson_3d(self.vorticity.data[0],
self.vorticity.data[1],
self.vorticity.data[2],
self.velocity.data[0],
self.velocity.data[1],
self.velocity.data[2])
else:
raise ValueError("invalid problem dimension")
#============== VELOCITY CORRECTION ================ #============== VELOCITY CORRECTION ================
surf = (self.domain.length[1]-self.domain.origin[1]) * \ # surf = (self.domain.length[1]-self.domain.origin[1]) * \
(self.domain.length[2]-self.domain.origin[2]) # (self.domain.length[2]-self.domain.origin[2])
#============= CORRECTION VEL X : u_x ============== #============= CORRECTION VEL X : u_x ==============
......
# -*- coding: utf-8 -*-
import time
import parmepy as pp
import numpy as np
from parmepy.constants import PARMES_REAL, ORDER
from parmepy.fields.analytical import AnalyticalField
from parmepy.operator.poisson import Poisson
from parmepy.operator.diffusion import Diffusion
from parmepy.problem.navier_stokes import NSProblem
from parmepy.operator.monitors.energy_enstrophy import Energy_enstrophy
from math import sqrt, pi, exp
def computeVel(x, y, z):
vx = 0.
vy = 0.
vz = 0.
return vx, vy, vz
def computeVort(x, y, z):
xc = 1. / 2.
yc = 1. / 2.
zc = 1. / 4.
R = 0.2
sigma = R / 2.
Gamma = 0.0075
dist = sqrt((x-xc) ** 2 + (y-yc) ** 2)
s2 = (z - zc) ** 2 + (dist - R) ** 2
wx = 0.
wy = 0.
wz = 0.
if (dist != 0.):
cosTheta = (x - xc) / dist
sinTheta = (y - yc) / dist
wTheta = Gamma / (pi * sigma ** 2) * \
exp(-(s2 / sigma ** 2))
wx = - wTheta * sinTheta
wy = wTheta * cosTheta
wz = 0.
return wx, wy, wz
def test_Diff_Poisson():
# Parameters
nb = 65
dim = 3
boxLength = [1., 1., 1.]
boxMin = [0., 0., 0.]
nbElem = [nb, nb, nb]
timeStep = 0.01
finalTime = 150 * timeStep
outputFilePrefix = './Energies'
outputModulo = 10
t0 = time.time()
## Domain
box = pp.Box(dim, length=boxLength, origin=boxMin)
## Fields
velo = AnalyticalField(domain=box, formula=computeVel,
name='Velocity', vector=True)
vorti = AnalyticalField(domain=box, formula=computeVort,
name='Vorticity', vector=True)
## FFT Diffusion operators and FFT Poisson solver
diffusion = Diffusion(velo, vorti,
resolutions={velo: nbElem,
vorti: nbElem},
method='',
viscosity=0.002,
with_curl=False
)
poisson = Poisson(velo, vorti,
resolutions={velo: nbElem,
vorti: nbElem},
method=''
)
## Problem
pb = NSProblem([diffusion, poisson],
monitors=[Energy_enstrophy(
fields=[velo, vorti],
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)"
if __name__ == "__main__":
test_Diff_Poisson()
# -*- coding: utf-8 -*-
import time
import parmepy as pp
import numpy as np
from parmepy.constants import PARMES_REAL, ORDER
from parmepy.fields.analytical import AnalyticalField
from parmepy.operator.poisson import Poisson
from parmepy.operator.diffusion import Diffusion
from parmepy.problem.navier_stokes import NSProblem
from parmepy.operator.monitors.energy_enstrophy import Energy_enstrophy
from math import sqrt, pi, exp
def computeVel(x, y):
vx = 0.
vy = 0.
return vx, vy
def computeVort(x, y):
w = np.cos(y) * np.cos(x)
return w
def test_Diff_Poisson():
# Parameters
nb = 65
dim = 2
boxLength = [1., 1.]
boxMin = [0., 0.]
nbElem = [nb, nb]
timeStep = 0.01
finalTime = 150 * timeStep
outputFilePrefix = './Energies'
outputModulo = 10
t0 = time.time()
## Domain
box = pp.Box(dim, length=boxLength, origin=boxMin)
## Fields
velo = AnalyticalField(domain=box, formula=computeVel,
name='Velocity', vector=True)
vorti = AnalyticalField(domain=box, formula=computeVort,
name='Vorticity', vector=False)
## FFT Poisson solver
poisson = Poisson(velo, vorti,
resolutions={velo: nbElem,
vorti: nbElem},
method=''
)
## Problem
pb = NSProblem([poisson])
## 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)"
if __name__ == "__main__":
test_Diff_Poisson()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment