| tadd BC parameter to file/data structures, add utility functions - sphere - GPU… | |
| git clone git://src.adamsgaard.dk/sphere | |
| Log | |
| Files | |
| Refs | |
| LICENSE | |
| --- | |
| commit b456fd10ab9a15540b915c36ee2d3ed08ca44faf | |
| parent 6b42a6886653c7e1e620ca470ffa953820ca6de0 | |
| Author: Anders Damsgaard Christensen <[email protected]> | |
| Date: Thu, 11 Aug 2016 16:01:06 -0700 | |
| add BC parameter to file/data structures, add utility functions | |
| Diffstat: | |
| M python/sphere.py | 131 ++++++++++++++++++++++++++++-… | |
| M src/datatypes.h | 4 ++++ | |
| M src/file_io.cpp | 10 ++++++++++ | |
| 3 files changed, 133 insertions(+), 12 deletions(-) | |
| --- | |
| diff --git a/python/sphere.py b/python/sphere.py | |
| t@@ -329,11 +329,21 @@ class sim: | |
| self.p_mod_f = numpy.zeros(1, dtype=numpy.float64) # Frequency [H… | |
| self.p_mod_phi = numpy.zeros(1, dtype=numpy.float64) # Shift [rad] | |
| + if self.cfd_solver[0] == 1: # Darcy solver | |
| + # Boundary conditions at the sides of the fluid grid | |
| + # 0: Dirichlet | |
| + # 1: Neumann | |
| + # 2: Periodic (default) | |
| + self.bc_xn = numpy.ones(1, dtype=numpy.int32)*3 # Neg. x bc | |
| + self.bc_xp = numpy.ones(1, dtype=numpy.int32)*3 # Pos. x bc | |
| + self.bc_yn = numpy.ones(1, dtype=numpy.int32)*3 # Neg. y bc | |
| + self.bc_yp = numpy.ones(1, dtype=numpy.int32)*3 # Pos. y bc | |
| + | |
| # Boundary conditions at the top and bottom of the fluid grid | |
| # 0: Dirichlet (default) | |
| # 1: Neumann free slip | |
| - # 2: Neumann no slip | |
| - # 3: Periodic | |
| + # 2: Neumann no slip (Navier Stokes), Periodic (Darcy) | |
| + # 3: Periodic (Navier-Stokes solver only) | |
| # 4: Constant flux (Darcy solver only) | |
| self.bc_bot = numpy.zeros(1, dtype=numpy.int32) | |
| self.bc_top = numpy.zeros(1, dtype=numpy.int32) | |
| t@@ -345,16 +355,6 @@ class sim: | |
| self.bc_bot_flux = numpy.zeros(1, dtype=numpy.float64) | |
| self.bc_top_flux = numpy.zeros(1, dtype=numpy.float64) | |
| - # Boundary conditions at the top and bottom of the fluid grid | |
| - # 0: Dirichlet | |
| - # 1: Neumann | |
| - # 2: Periodic (default) | |
| - # 3: Constant flux (Darcy solver only) | |
| - self.bc_xn = numpy.zeros(1, dtype=numpy.int32)*2 # Neg. x boundary | |
| - self.bc_xp = numpy.zeros(1, dtype=numpy.int32)*2 # Pos. x boundary | |
| - self.bc_yn = numpy.zeros(1, dtype=numpy.int32)*2 # Neg. y boundary | |
| - self.bc_yp = numpy.zeros(1, dtype=numpy.int32)*2 # Pos. y boundary | |
| - | |
| ## Solver parameters | |
| # Navier-Stokes | |
| t@@ -739,6 +739,18 @@ class sim: | |
| elif self.k_c != other.k_c: | |
| print(88) | |
| return(88) | |
| + elif (self.bc_xn != other.bc_xn): | |
| + print(92) | |
| + return 92 | |
| + elif (self.bc_xp != other.bc_xp): | |
| + print(93) | |
| + return 93 | |
| + elif (self.bc_yn != other.bc_yn): | |
| + print(94) | |
| + return 94 | |
| + elif (self.bc_yp != other.bc_yp): | |
| + print(95) | |
| + return 95 | |
| if (self.color != other.color).any(): | |
| print(90) | |
| t@@ -1155,6 +1167,16 @@ class sim: | |
| self.p_mod_phi =\ | |
| numpy.fromfile(fh, dtype=numpy.float64, count=1) | |
| + if self.version >= 2.12 and self.cfd_solver == 1: | |
| + self.bc_xn =\ | |
| + numpy.fromfile(fh, dtype=numpy.int32, count=1) | |
| + self.bc_xp =\ | |
| + numpy.fromfile(fh, dtype=numpy.int32, count=1) | |
| + self.bc_yn =\ | |
| + numpy.fromfile(fh, dtype=numpy.int32, count=1) | |
| + self.bc_yp =\ | |
| + numpy.fromfile(fh, dtype=numpy.int32, count=1) | |
| + | |
| self.bc_bot =\ | |
| numpy.fromfile(fh, dtype=numpy.int32, count=1) | |
| self.bc_top =\ | |
| t@@ -1405,6 +1427,12 @@ class sim: | |
| fh.write(self.p_mod_f.astype(numpy.float64)) | |
| fh.write(self.p_mod_phi.astype(numpy.float64)) | |
| + if self.cfd_solve[0] == 1: # Sides only adjustable with Darcy | |
| + fh.write(self.bc_xn.astype(numpy.int32)) | |
| + fh.write(self.bc_xp.astype(numpy.int32)) | |
| + fh.write(self.bc_yn.astype(numpy.int32)) | |
| + fh.write(self.bc_yp.astype(numpy.int32)) | |
| + | |
| fh.write(self.bc_bot.astype(numpy.int32)) | |
| fh.write(self.bc_top.astype(numpy.int32)) | |
| fh.write(self.free_slip_bot.astype(numpy.int32)) | |
| t@@ -3358,6 +3386,11 @@ class sim: | |
| self.f_p = numpy.zeros((self.np, self.nd), dtype=numpy.float64) | |
| self.k_c = numpy.ones(1, dtype=numpy.float64)*4.6e-10 | |
| + self.bc_xn = numpy.ones(1, dtype=numpy.int32)*3 | |
| + self.bc_xp = numpy.ones(1, dtype=numpy.int32)*3 | |
| + self.bc_yn = numpy.ones(1, dtype=numpy.int32)*3 | |
| + self.bc_yp = numpy.ones(1, dtype=numpy.int32)*3 | |
| + | |
| else: | |
| raise Exception('Value of cfd_solver not understood (' + \ | |
| str(self.cfd_solver[0]) + ')') | |
| t@@ -3465,6 +3498,80 @@ class sim: | |
| self.bc_top[0] = 4 | |
| self.bc_top_flux[0] = specific_flux | |
| + def setFluidXFixedPressure(self): | |
| + ''' | |
| + Set the X boundaries of the fluid domain to follow the fixed pressure | |
| + value (Dirichlet) boundary condition. | |
| + | |
| + This is not the default behavior for the boundary. See also | |
| + :func:`setFluidXFixedPressure()`, | |
| + :func:`setFluidXNoFlow()`, and | |
| + :func:`setFluidXPeriodic()` (default) | |
| + ''' | |
| + self.bc_xn[0] = 0 | |
| + self.bc_xp[0] = 0 | |
| + | |
| + def setFluidXNoFlow(self): | |
| + ''' | |
| + Set the X boundaries of the fluid domain to follow the no-flow | |
| + (Neumann) boundary condition. | |
| + | |
| + This is not the default behavior for the boundary. See also | |
| + :func:`setFluidXFixedPressure()`, | |
| + :func:`setFluidXNoFlow()`, and | |
| + :func:`setFluidXPeriodic()` (default) | |
| + ''' | |
| + self.bc_xn[0] = 1 | |
| + self.bc_xp[0] = 1 | |
| + | |
| + def setFluidXPeriodic(self): | |
| + ''' | |
| + Set the X boundaries of the fluid domain to follow the periodic | |
| + (cyclic) boundary condition. | |
| + | |
| + This is the default behavior for the boundary. See also | |
| + :func:`setFluidXFixedPressure()` and | |
| + :func:`setFluidXNoFlow()` | |
| + ''' | |
| + self.bc_xn[0] = 2 | |
| + self.bc_xp[0] = 2 | |
| + | |
| + def setFluidYFixedPressure(self): | |
| + ''' | |
| + Set the Y boundaries of the fluid domain to follow the fixed pressure | |
| + value (Dirichlet) boundary condition. | |
| + | |
| + This is not the default behavior for the boundary. See also | |
| + :func:`setFluidYNoFlow()` and | |
| + :func:`setFluidYPeriodic()` (default) | |
| + ''' | |
| + self.bc_yn[0] = 0 | |
| + self.bc_yp[0] = 0 | |
| + | |
| + def setFluidYNoFlow(self): | |
| + ''' | |
| + Set the Y boundaries of the fluid domain to follow the no-flow | |
| + (Neumann) boundary condition. | |
| + | |
| + This is not the default behavior for the boundary. See also | |
| + :func:`setFluidYFixedPressure()` and | |
| + :func:`setFluidYPeriodic()` (default) | |
| + ''' | |
| + self.bc_yn[0] = 1 | |
| + self.bc_yp[0] = 1 | |
| + | |
| + def setFluidYPeriodic(self): | |
| + ''' | |
| + Set the Y boundaries of the fluid domain to follow the periodic | |
| + (cyclic) boundary condition. | |
| + | |
| + This is the default behavior for the boundary. See also | |
| + :func:`setFluidYFixedPressure()` and | |
| + :func:`setFluidYNoFlow()` | |
| + ''' | |
| + self.bc_yn[0] = 2 | |
| + self.bc_yp[0] = 2 | |
| + | |
| def setPermeabilityPrefactor(self, k_c, verbose=True): | |
| ''' | |
| Set the permeability prefactor from Goren et al 2011, eq. 24. The | |
| diff --git a/src/datatypes.h b/src/datatypes.h | |
| t@@ -164,6 +164,10 @@ struct Darcy { | |
| Float p_mod_A; // Pressure modulation amplitude at top | |
| Float p_mod_f; // Pressure modulation frequency at top | |
| Float p_mod_phi; // Pressure modulation phase at top | |
| + int bc_xn; // 0: Dirichlet, 1: Neumann, 3: Periodic | |
| + int bc_xp; // 0: Dirichlet, 1: Neumann, 3: Periodic | |
| + int bc_yn; // 0: Dirichlet, 1: Neumann, 3: Periodic | |
| + int bc_yp; // 0: Dirichlet, 1: Neumann, 3: Periodic | |
| int bc_bot; // 0: Dirichlet, 1: Neumann | |
| int bc_top; // 0: Dirichlet, 1: Neumann | |
| int free_slip_bot; // 0: no, 1: yes | |
| diff --git a/src/file_io.cpp b/src/file_io.cpp | |
| t@@ -294,6 +294,7 @@ void DEM::readbin(const char *target) | |
| ifs.read(as_bytes(ns.p_mod_f), sizeof(Float)); | |
| ifs.read(as_bytes(ns.p_mod_phi), sizeof(Float)); | |
| + ifs.read(as_bytes(ns.bc_top), sizeof(int)); | |
| ifs.read(as_bytes(ns.bc_bot), sizeof(int)); | |
| ifs.read(as_bytes(ns.bc_top), sizeof(int)); | |
| ifs.read(as_bytes(ns.free_slip_bot), sizeof(int)); | |
| t@@ -364,6 +365,10 @@ void DEM::readbin(const char *target) | |
| ifs.read(as_bytes(darcy.p_mod_f), sizeof(Float)); | |
| ifs.read(as_bytes(darcy.p_mod_phi), sizeof(Float)); | |
| + ifs.read(as_bytes(darcy.bc_xn), sizeof(int)); | |
| + ifs.read(as_bytes(darcy.bc_xp), sizeof(int)); | |
| + ifs.read(as_bytes(darcy.bc_yn), sizeof(int)); | |
| + ifs.read(as_bytes(darcy.bc_yp), sizeof(int)); | |
| ifs.read(as_bytes(darcy.bc_bot), sizeof(int)); | |
| ifs.read(as_bytes(darcy.bc_top), sizeof(int)); | |
| ifs.read(as_bytes(darcy.free_slip_bot), sizeof(int)); | |
| t@@ -659,6 +664,11 @@ void DEM::writebin(const char *target) | |
| ofs.write(as_bytes(darcy.p_mod_f), sizeof(Float)); | |
| ofs.write(as_bytes(darcy.p_mod_phi), sizeof(Float)); | |
| + ofs.write(as_bytes(darcy.bc_xn), sizeof(int)); | |
| + ofs.write(as_bytes(darcy.bc_xp), sizeof(int)); | |
| + ofs.write(as_bytes(darcy.bc_yn), sizeof(int)); | |
| + ofs.write(as_bytes(darcy.bc_yp), sizeof(int)); | |
| + ofs.write(as_bytes(darcy.bc_top), sizeof(int)); | |
| ofs.write(as_bytes(darcy.bc_bot), sizeof(int)); | |
| ofs.write(as_bytes(darcy.bc_top), sizeof(int)); | |
| ofs.write(as_bytes(darcy.free_slip_bot), sizeof(int)); |