From a528f39e104293fa0a5dad68994b408bdb24706c Mon Sep 17 00:00:00 2001 From: Romain Boman <r.boman@uliege.be> Date: Mon, 27 Sep 2021 16:54:17 +0200 Subject: [PATCH] move sph to https://github.com/rboman/progs --- CMakeLists.txt | 5 - sph/.gitignore | 2 - sph/CMakeLists.txt | 20 - sph/__init__.py | 6 - sph/_src/CMakeLists.txt | 49 -- sph/_src/sphw.i | 106 --- sph/broken/cpp/waterdrop.py | 48 -- sph/genp.py | 52 -- sph/louis/.gitignore | 17 - sph/louis/CMakeLists.txt | 41 - sph/louis/README.md | 21 - sph/louis/build.py | 38 - sph/louis/devenv-vs2012.bat | 8 - sph/louis/run.py | 80 -- sph/louis/screenshot.png | Bin 161699 -> 0 bytes sph/louis/sph/__init__.py | 0 sph/louis/sph/gui.py | 146 ---- sph/louis/sph/helpers.py | 253 ------ sph/louis/sph/wutils.py | 57 -- sph/louis/src/SPH_module.f90 | 1241 ----------------------------- sph/louis/src/SPH_simulation.f90 | 31 - sph/louis/tests/waterdrop.py | 63 -- sph/louis/tests/waterdrop2.py | 77 -- sph/louis/tests/waterdrop3.py | 77 -- sph/louis/tests/waterdrop4.py | 77 -- sph/louis/tests/waterdrop_post.py | 188 ----- sph/matlab/interp.m | 72 -- sph/src/CMakeLists.txt | 26 - sph/src/sph.h | 52 -- sph/src/wDisplayHook.cpp | 32 - sph/src/wDisplayHook.h | 41 - sph/src/wDofs.cpp | 28 - sph/src/wDofs.h | 47 -- sph/src/wEigenTest.cpp | 27 - sph/src/wEigenTest.h | 39 - sph/src/wEqState.cpp | 63 -- sph/src/wEqState.h | 76 -- sph/src/wKernel.cpp | 175 ---- sph/src/wKernel.h | 104 --- sph/src/wParticle.cpp | 66 -- sph/src/wParticle.h | 85 -- sph/src/wProblem.cpp | 44 - sph/src/wProblem.h | 53 -- sph/src/wSorter.cpp | 205 ----- sph/src/wSorter.h | 123 --- sph/src/wTimeIntegration.cpp | 32 - sph/src/wTimeIntegration.h | 46 -- sph/tests/eigentest.py | 22 - sph/tests/neighbours.py | 92 --- sph/tests/sandbox.py | 116 --- 50 files changed, 4369 deletions(-) delete mode 100644 sph/.gitignore delete mode 100644 sph/CMakeLists.txt delete mode 100644 sph/__init__.py delete mode 100644 sph/_src/CMakeLists.txt delete mode 100644 sph/_src/sphw.i delete mode 100644 sph/broken/cpp/waterdrop.py delete mode 100644 sph/genp.py delete mode 100644 sph/louis/.gitignore delete mode 100644 sph/louis/CMakeLists.txt delete mode 100644 sph/louis/README.md delete mode 100755 sph/louis/build.py delete mode 100644 sph/louis/devenv-vs2012.bat delete mode 100755 sph/louis/run.py delete mode 100644 sph/louis/screenshot.png delete mode 100644 sph/louis/sph/__init__.py delete mode 100644 sph/louis/sph/gui.py delete mode 100644 sph/louis/sph/helpers.py delete mode 100644 sph/louis/sph/wutils.py delete mode 100644 sph/louis/src/SPH_module.f90 delete mode 100644 sph/louis/src/SPH_simulation.f90 delete mode 100644 sph/louis/tests/waterdrop.py delete mode 100644 sph/louis/tests/waterdrop2.py delete mode 100644 sph/louis/tests/waterdrop3.py delete mode 100644 sph/louis/tests/waterdrop4.py delete mode 100644 sph/louis/tests/waterdrop_post.py delete mode 100644 sph/matlab/interp.m delete mode 100644 sph/src/CMakeLists.txt delete mode 100644 sph/src/sph.h delete mode 100644 sph/src/wDisplayHook.cpp delete mode 100644 sph/src/wDisplayHook.h delete mode 100644 sph/src/wDofs.cpp delete mode 100644 sph/src/wDofs.h delete mode 100644 sph/src/wEigenTest.cpp delete mode 100644 sph/src/wEigenTest.h delete mode 100644 sph/src/wEqState.cpp delete mode 100644 sph/src/wEqState.h delete mode 100644 sph/src/wKernel.cpp delete mode 100644 sph/src/wKernel.h delete mode 100644 sph/src/wParticle.cpp delete mode 100644 sph/src/wParticle.h delete mode 100644 sph/src/wProblem.cpp delete mode 100644 sph/src/wProblem.h delete mode 100644 sph/src/wSorter.cpp delete mode 100644 sph/src/wSorter.h delete mode 100644 sph/src/wTimeIntegration.cpp delete mode 100644 sph/src/wTimeIntegration.h delete mode 100644 sph/tests/eigentest.py delete mode 100644 sph/tests/neighbours.py delete mode 100644 sph/tests/sandbox.py diff --git a/CMakeLists.txt b/CMakeLists.txt index 5d0ed8e1..aa76b306 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -48,7 +48,6 @@ OPTION(WAVES_USE_HEAT "Compile heat module" ON) OPTION(WAVES_USE_MIRRORS "Compile mirrors module" ON) OPTION(WAVES_USE_KATOPTRON "Compile katoptron module" ON) OPTION(WAVES_USE_PARAMS "Compile params module" ON) -OPTION(WAVES_USE_SPH "Compile sph module" ON) OPTION(WAVES_USE_TLNOS "Compile tlnos module" ON) OPTION(WAVES_USE_WAVES "Compile waves module" ON) # (de)activate extensions @@ -181,10 +180,6 @@ IF(WAVES_USE_PARAMS) ADD_SUBDIRECTORY( params ) ENDIF() -IF(WAVES_USE_SPH) - ADD_SUBDIRECTORY( sph ) -ENDIF() - IF(WAVES_USE_TLNOS) ADD_SUBDIRECTORY( tlnos ) ENDIF() diff --git a/sph/.gitignore b/sph/.gitignore deleted file mode 100644 index 3a3a98ab..00000000 --- a/sph/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -louisB -.metadata diff --git a/sph/CMakeLists.txt b/sph/CMakeLists.txt deleted file mode 100644 index 156e07c4..00000000 --- a/sph/CMakeLists.txt +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2020 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Add source dir -ADD_SUBDIRECTORY( src ) -ADD_SUBDIRECTORY( _src ) - -# Add test dir -MACRO_AddTest(${CMAKE_CURRENT_SOURCE_DIR}/tests) diff --git a/sph/__init__.py b/sph/__init__.py deleted file mode 100644 index e56cbd37..00000000 --- a/sph/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# -*- coding: utf-8 -*- -# sph MODULE initialization file - -import fwk -import tbox -from sphw import * diff --git a/sph/_src/CMakeLists.txt b/sph/_src/CMakeLists.txt deleted file mode 100644 index 70b86a4c..00000000 --- a/sph/_src/CMakeLists.txt +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright 2020 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# CMake input file of the SWIG wrapper around "sph.so" - -INCLUDE(${SWIG_USE_FILE}) - -FILE(GLOB SRCS *.h *.cpp *.inl *.swg) -FILE(GLOB ISRCS *.i) - -SET(CMAKE_SWIG_FLAGS "") -SET_SOURCE_FILES_PROPERTIES(${ISRCS} PROPERTIES CPLUSPLUS ON) - -SET(SWINCFLAGS --I${PROJECT_SOURCE_DIR}/sph/src --I${PROJECT_SOURCE_DIR}/tbox/src --I${PROJECT_SOURCE_DIR}/tbox/_src --I${PROJECT_SOURCE_DIR}/fwk/src --I${PROJECT_SOURCE_DIR}/fwk/_src --I${EIGEN_INCLUDE_DIRS} -) -SET_SOURCE_FILES_PROPERTIES(${ISRCS} PROPERTIES SWIG_FLAGS "${SWINCFLAGS}") - -if (${CMAKE_VERSION} VERSION_LESS "3.8.0") - SWIG_ADD_MODULE(sphw python ${ISRCS} ${SRCS}) -else() - SWIG_ADD_LIBRARY(sphw LANGUAGE python SOURCES ${ISRCS} ${SRCS}) -endif() -MACRO_DebugPostfix(_sphw) - -TARGET_INCLUDE_DIRECTORIES(_sphw PRIVATE ${PROJECT_SOURCE_DIR}/fwk/_src - ${PROJECT_SOURCE_DIR}/tbox/_src - ${PYTHON_INCLUDE_PATH} -) - -SWIG_LINK_LIBRARIES(sphw - sph tbox fwk ${PYTHON_LIBRARIES} -) diff --git a/sph/_src/sphw.i b/sph/_src/sphw.i deleted file mode 100644 index baa298c9..00000000 --- a/sph/_src/sphw.i +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// SWIG input file of the 'sph' module - -%feature("autodoc","1"); - -%module(docstring= -"'sphw' module: projet MP 2016 -(c) ULg - A&M", -directors="1", -threads="1" -) sphw -%{ - -#include <string> -#include <sstream> -#include "sph.h" - -#include "fwkw.h" -#include "tboxw.h" - -#include "wKernel.h" -#include "wDofs.h" -#include "wParticle.h" -#include "wEqState.h" -#include "wTimeIntegration.h" -#include "wSorter.h" -#include "wProblem.h" -#include "wEigenTest.h" -#include <Eigen/Core> - -#include "wDisplayHook.h" - -%} - -%include "std_vector.i" // should be included first otherwise SWIGPY_SLICE_ARG is undefined - -%include "fwkw.swg" - -// ----------- MODULES UTILISES ------------ -%import "fwkw.i" -%import "tboxw.i" - -// ----------- SPH CLASSES --------------- -%include "sph.h" - -%shared_ptr(sph::EqState); -%shared_ptr(sph::IdealGas); -%shared_ptr(sph::QIncFluid); -%shared_ptr(sph::Kernel); -%shared_ptr(sph::CubicSplineKernel); -%shared_ptr(sph::QuadraticKernel); -%shared_ptr(sph::QuinticSplineKernel); -%shared_ptr(sph::Sorter); -%shared_ptr(sph::LouisSorter); -%shared_ptr(sph::BruteForceSorter); -%shared_ptr(sph::Problem); - -%feature("director") DisplayHook; -%include "wDisplayHook.h" - -%feature("director:except") { - if ($error != NULL) { - std::cout << "[in director:except]\n"; - //throw Swig::DirectorMethodException(); - throw std::runtime_error("Director problem"); - } -} - - -%include "wKernel.h" -%include "wDofs.h" -%include "wParticle.h" -%include "wEqState.h" -%include "wTimeIntegration.h" -%include "wSorter.h" -%include "wProblem.h" -%include "wEigenTest.h" - -%extend sph::Dofs { - std::string __str__() { - std::stringstream str; str << *self; - return str.str(); - } -} - - - -// Instantiate some std templates -namespace std { - %template(std_vector_Particlep) std::vector<sph::Particle*>; -} diff --git a/sph/broken/cpp/waterdrop.py b/sph/broken/cpp/waterdrop.py deleted file mode 100644 index 8f6e318c..00000000 --- a/sph/broken/cpp/waterdrop.py +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -from sph.helpers import * - -if __name__=="__main__": - - boxL = 2. - Lfloor = 0.7 - Lwater = 0.5 - sep = 0.05 - - kernel = Kernel('cubic', True) # 'cubic', 'quadratic' or 'quintic' - law = EqState('liquid') # 'gas' or 'liquid' - - # parameters - model = Model() - model.kernel = kernel - model.law = law - - model.h_0 = 0.06 # initial smoothing length [m] - model.c_0 = 35.0 # initial speed of sound [m/s] - model.rho_0 = 1000.0 # initial density [kg/m^3] - model.dom_dim = boxL # domain size (cube) - model.alpha = 0.5 # artificial viscosity factor 1 - model.beta = 0.0 # artificial viscosity factor 2 - model.maxTime = 1.0 # simulation time - model.saveInt = 0.01 # save interval - - # mobile particles - cube = Cube( o=(((boxL-Lwater)/2),((boxL-Lwater)/2), ((boxL)/2)+0.5), L=(Lwater,Lwater,Lwater), rho=model.rho_0, s=sep) - model.addMobile(cube.generate()) - - # fixed particles - plane = Cube( o=(((boxL-Lfloor)/2),((boxL-Lfloor)/2), (boxL/2)), L=(Lfloor,Lfloor,sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - plane = Cube( o=(0,0,0), L=(boxL,boxL,sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - - # run SPH model - print(model) - model.run() - - # convert to VTK - import sph.gui as gui - gui.ToParaview(verb=False).convertall() - - \ No newline at end of file diff --git a/sph/genp.py b/sph/genp.py deleted file mode 100644 index 79698d94..00000000 --- a/sph/genp.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2020 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import math - -class Cube: - """ a basic "cube" defined by its origin (o), size (L), density (rho) and distance between layers (s) - """ - def __init__(self, o=(0.0, 0.0, 0.0), L=(1.0, 1.0, 1.0), s=0.1): - self.ox = o[0] - self.oy = o[1] - self.oz = o[2] - self.Lx = L[0] - self.Ly = L[1] - self.Lz = L[2] - self.s = s - - def generate(self): - parts = [] - ni = int(math.ceil((self.Lx/self.s)))+1 - dx = self.Lx/ni - nj = int(math.ceil((self.Ly/self.s)))+1 - dy = self.Ly/nj - nk = int(math.ceil((self.Lz/self.s)))+1 - dz = self.Lz/nk - vol = (dx*dy*dz) - - for i in range(ni): - x = self.ox+ i*dx - for j in range(nj): - y = self.oy+j*dy - for k in range(nk): - z = self.oz+k*dz - p = (x, y, z, vol) - parts.append(p) - return parts - \ No newline at end of file diff --git a/sph/louis/.gitignore b/sph/louis/.gitignore deleted file mode 100644 index 8d83a3c8..00000000 --- a/sph/louis/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -build/ -*.mod -*.53 -*.x3d - -*.fp -*.mp -*.prm - -log.txt -paths.txt -*.out -*.res -*.vtu - -*.kdev4 - diff --git a/sph/louis/CMakeLists.txt b/sph/louis/CMakeLists.txt deleted file mode 100644 index 5482be3c..00000000 --- a/sph/louis/CMakeLists.txt +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright 2020 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -PROJECT(LOUIS Fortran) -CMAKE_MINIMUM_REQUIRED(VERSION 2.6) - -#SET(CMAKE_VERBOSE_MAKEFILE TRUE) # affiche les lignes de commande - -# configure Fortran compiler -GET_FILENAME_COMPONENT(Fortran_COMPILER_NAME ${CMAKE_Fortran_COMPILER} NAME) - -IF (Fortran_COMPILER_NAME MATCHES "f95" OR Fortran_COMPILER_NAME MATCHES "gfortran") - SET(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Wall -fopenmp") -ENDIF() - -IF(Fortran_COMPILER_NAME MATCHES "ifort") - IF(WIN32) - SET(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} /Qopenmp" ) - SET(CMAKE_Fortran_FLAGS_RELEASE "/O3 /D NDEBUG") - #SET(CMAKE_Fortran_FLAGS_DEBUG "/Od /debug:full /dbglibs") - ENDIF() -ENDIF() - -MESSAGE(STATUS "Fortran_COMPILER_NAME : " ${Fortran_COMPILER_NAME}) -MESSAGE(STATUS "CMAKE_Fortran_FLAGS : " ${CMAKE_Fortran_FLAGS}) -MESSAGE(STATUS "CMAKE_Fortran_FLAGS_RELEASE : " ${CMAKE_Fortran_FLAGS_RELEASE}) -MESSAGE(STATUS "CMAKE_Fortran_FLAGS_DEBUG : " ${CMAKE_Fortran_FLAGS_DEBUG}) - -ADD_EXECUTABLE(louis src/SPH_module.f90 src/SPH_simulation.f90) - diff --git a/sph/louis/README.md b/sph/louis/README.md deleted file mode 100644 index 6d50fb37..00000000 --- a/sph/louis/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# SPH Louis Goffin - -[Reference in ORBi](http://orbi.ulg.ac.be/handle/2268/156166) - - - -## Compilation (Windows or Linux) - -```bash -build.py -``` -requires [Python](https://www.python.org/), [CMake](https://cmake.org/) and a fortran compiler (either [Intel](https://software.intel.com/en-us/fortran-compilers) or [gfortran](https://gcc.gnu.org/fortran/)) - -## Run - -```bash -run.py -k 12 tests/waterdrop.py -``` -Results go to `workspace/test_waterdrop`. Conversion to paraview requires [VTK](http://www.vtk.org/). - -Load `.vtu` files in [Paraview](http://www.paraview.org/). diff --git a/sph/louis/build.py b/sph/louis/build.py deleted file mode 100755 index bd218164..00000000 --- a/sph/louis/build.py +++ /dev/null @@ -1,38 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2020 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - - - -import os, sys, subprocess, platform - -try: - # create build dir - os.chdir('..') - if not os.path.isdir('louisB'): os.mkdir('louisB') - os.chdir('louisB') - # cmake - if 'Windows' in platform.uname(): - subprocess.call(r'cmake -G "Visual Studio 11 Win64" ..\louis', shell=True) - else: - subprocess.call('cmake -G"Eclipse CDT4 - Unix Makefiles" -DCMAKE_ECLIPSE_VERSION=4.6 -DCMAKE_ECLIPSE_GENERATE_SOURCE_PROJECT=TRUE ../louis', shell=True) - #subprocess.call('cmake -G"Eclipse CDT4 - Unix Makefiles" -DCMAKE_ECLIPSE_GENERATE_SOURCE_PROJECT=TRUE ../louis', shell=True) - subprocess.call('cmake --build . --config Release', shell=True) - os.chdir('../louis') -except Exception as e: - print(e) - print("<press ENTER to quit>"); input() diff --git a/sph/louis/devenv-vs2012.bat b/sph/louis/devenv-vs2012.bat deleted file mode 100644 index 8a275be2..00000000 --- a/sph/louis/devenv-vs2012.bat +++ /dev/null @@ -1,8 +0,0 @@ -@echo off -:: - cmake -G "Visual Studio 11 2012 Win64" ..\waves -:: - cmake --build . --config Release - -:: MKL + VS en ligne de commande -call "C:\Program Files (x86)\Intel\Composer XE\mkl\bin\intel64\mklvars_intel64.bat" -call "C:\Program Files (x86)\Intel\Composer XE\tbb\bin\tbbvars.bat" intel64 vs2012 -%comspec% /K ""C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat" amd64" diff --git a/sph/louis/run.py b/sph/louis/run.py deleted file mode 100755 index 8ee193c6..00000000 --- a/sph/louis/run.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2020 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# runs a test as if it was installed -# - fixes the python path in a dev environment -# - creates a workspace folder - - -class DupStream: - def __init__(self, stream1, stream2): - self.stream1 = stream1 - self.stream2 = stream2 - def write(self, data): - self.stream1.write(data) - self.stream2.write(data) - def flush(self): - self.stream1.flush() - self.stream2.flush() - - -class Tee: - def __init__(self, name): - import sys - self.file = open(name, 'w') - self.stdoutbak = sys.stdout - self.stderrbak = sys.stderr - sys.stdout = DupStream(sys.stdout, self.file) - sys.stderr = DupStream(sys.stderr, self.file) - def __del__(self): - import sys - sys.stdout = self.stdoutbak - sys.stderr = self.stderrbak - self.file.close() - - -if __name__=="__main__": - import sys, os - # adds "." to the pythonpath - thisdir = os.path.split(__file__)[0] - sys.path.append(thisdir) - import sph.wutils as wu - - # parse args - args = wu.parseargs() - - # run all tests sequentially - for testname in args.file: - testname = os.path.abspath(testname) - if not os.path.isfile(testname): - raise Exception("file not found: %s" % testname) - - wu.setupwdir(testname) - __file__ = testname - - # split streams - tee = Tee('stdout.txt') - - # start test - import time, platform - print('-'*80) - print("starting test", testname) - print("time:", time.strftime("%c")) - print("hostname:", platform.node()) - print('-'*80) - exec(open(testname, 'r', encoding='utf8').read()) diff --git a/sph/louis/screenshot.png b/sph/louis/screenshot.png deleted file mode 100644 index 57acc618a70984dba4acc4b5238b07e7171ff0dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161699 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	xoRZy@42t19lF}Yj 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	LU$Td$`;H8)f<9=N&mkx1CT-K>J$ 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 C699Vv diff --git a/sph/louis/sph/__init__.py b/sph/louis/sph/__init__.py deleted file mode 100644 index e69de29b..00000000 diff --git a/sph/louis/sph/gui.py b/sph/louis/sph/gui.py deleted file mode 100644 index a3f6702c..00000000 --- a/sph/louis/sph/gui.py +++ /dev/null @@ -1,146 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2020 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# converts .res files to Paraview (VTK) - - - - - -import vtk -version=vtk.vtkVersion().GetVTKMajorVersion() -import glob - -class ToParaview: - def __init__(self, verb = False): - self.verb = verb - - def convertall(self, pattern='*MP*.res'): - print("converting grid to VTK") - self.convertGrid() - print("converting %s to VTK" % pattern) - for f in glob.glob(pattern): - self.convertParts(f) - - def convertGrid(self, fname='grid.out'): - if self.verb: print('converting', fname) - - # read file - file = open(fname) - line = file.readline() - nx, dx = line.strip().split() - nx = int(nx) - dx = float(dx) - #print 'nx=%d, dx=%f' % (nx,dx) - file.close() - - # build a sgrid - grid = vtk.vtkStructuredGrid() - points = vtk.vtkPoints() - grid.SetPoints(points) - - for k in range(nx+1): - for j in range(nx+1): - for i in range(nx+1): - points.InsertNextPoint(i*dx,j*dx,k*dx) - grid.SetDimensions(nx+1,nx+1,nx+1) - - writer = vtk.vtkXMLStructuredGridWriter() - compressor = vtk.vtkZLibDataCompressor() - writer.SetCompressor(compressor) - writer.SetDataModeToBinary() - if version>5: - writer.SetInputData(grid) - else: - writer.SetInput(grid) - writer.SetFileName(fname.replace('.out','.vts')) - writer.Write() - - def convertParts(self, fname): - - #if self.verb: - print('converting', fname) - file = open(fname) - - ugrid = vtk.vtkUnstructuredGrid() - points = vtk.vtkPoints() - ugrid.SetPoints(points) - - codes = {'p': (1, "Pressure"), - 'rho': (1, "Mass density"), - 'v' : (3, "Velocity"), - 'm': (1, "Mass"), - 'c': (1, "Speed of sound"), - 'h': (1, "Smoothing length"), - 'mu': (1, "max(mu_ab)"), - 'nv': (1, "Nb of neighbours") } - results = {} - for c in codes: - scalars = vtk.vtkFloatArray() - ncomp, fullname = codes[c] - scalars.SetNumberOfComponents(ncomp) - scalars.SetName(fullname) - ugrid.GetPointData().AddArray(scalars) - results[c] = scalars - - i=0 - for line in file: - #x,y,z, vx,vy,vz, m, p = map(float, line.strip().split()) - try: - x,y,z, vx,vy,vz, rho, p, m, c, h, mu, nv = list(map(float, line.strip().split())) - except: - print("**ERROR while reading file %s!\n\tline=\"%s\"" % (fname,line)) - break - points.InsertPoint(i, x,y,z) - results['v'].InsertNextTuple3(vx,vy,vz) - results['p'].InsertNextValue(p) - results['rho'].InsertNextValue(rho) - results['m'].InsertNextValue(m) - results['c'].InsertNextValue(c) - results['h'].InsertNextValue(h) - results['mu'].InsertNextValue(mu) - results['nv'].InsertNextValue(nv) - i+=1 - file.close() - - ntot=i - if self.verb: print("\t%d lines read. Converting grid to VTK..." % ntot) - - for i in range(ntot): - vertex = vtk.vtkVertex() - ids = vertex.GetPointIds() - ids.SetId(0, i) - ugrid.InsertNextCell(vertex.GetCellType(), ids) - - if self.verb: - print("\t...", ugrid.GetNumberOfPoints(), 'points and', \ - ugrid.GetNumberOfCells(), 'cells converted') - - writer = vtk.vtkXMLUnstructuredGridWriter() - compressor = vtk.vtkZLibDataCompressor() - writer.SetCompressor(compressor) - writer.SetDataModeToBinary() - if version>5: - writer.SetInputData(ugrid) - else: - writer.SetInput(ugrid) - writer.SetFileName(fname.replace('.res','.vtu')) - writer.Write() - -if __name__=="__main__": - ToParaview(verb=True).convertall() diff --git a/sph/louis/sph/helpers.py b/sph/louis/sph/helpers.py deleted file mode 100644 index c05b7713..00000000 --- a/sph/louis/sph/helpers.py +++ /dev/null @@ -1,253 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2020 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# Python helper classes for Louis' code - -import math, subprocess, os, platform, sys, glob -import sph.wutils as wu - -class Kernel: - names = { 'cubic':1, 'quadratic':2, 'quintic':3 } - def __init__(self, name='cubic', corr=True): - if name in Kernel.names: - self.name = name - else: - raise Exception('unknown kernel kind "%s"' % name) - self.corrected = corr - - def __str__(self): - return '%s kernel (%d)' % (self.name, self.val()) - def val(self): - return Kernel.names[self.name] - -class EqState: - names = { 'gas':1, 'liquid':2 } - def __init__(self, name='liquid'): - if name in EqState.names: - self.name = name - else: - raise Exception('unknown equ of state "%s"' % name) - self.gamma = 7 - self.molMass = 28.97e-3 - def __str__(self): - return '%s (%d)' % (self.name, self.val()) - def val(self): - return EqState.names[self.name] - - -class Model: - def __init__(self): - # default values of the parameters - self.h_0 = 0.1 # 3: [double] initial smoothing length - self.c_0 = 1480.0 # 4: [double] initial speed of sound [m/s] - self.rho_0 = 1000.0 # 5: [double] initial density [kg/m^3] - self.dom_dim = 0.0 # 6: [double] domain size (cube) - self.kernel = Kernel() # 7: [integer] (1:'cubic'/2:'quadratic'/3:'quintic') - self.alpha = 0.5 # 8: [double] artificial viscosity factor 1 - self.beta = 0.0 # 9: [double] artificial viscosity factor 2 - self.law = EqState() # 10: [integer] (1:'gas'/2:'fluid') - self.maxTime = 1.0 # 14: [double] simulation time [s] - self.saveInt = 0.01 # 15: [double] save interval [s] - - # sets of particles - self.fparts = [] - self.mparts = [] - - def writeprm(self): - """ writes parameters (input.prm) - """ - file = open('input.prm','w') - file.write('%d\n' % len(self.fparts) ) - file.write('%d\n' % len(self.mparts) ) - file.write('%e\n' % self.h_0) - file.write('%e\n' % self.c_0) - file.write('%e\n' % self.rho_0) - file.write('%e\n' % self.dom_dim) - file.write('%d\n' % self.kernel.val()) - file.write('%e\n' % self.alpha) - file.write('%e\n' % self.beta) - file.write('%d\n' % self.law.val()) - file.write('%d\n' % self.law.gamma) - file.write('%e\n' % self.law.molMass) - file.write('%d\n' % self.kernel.corrected) - file.write('%e\n' % self.maxTime) - file.write('%e\n' % self.saveInt) - file.close() - - def addFixed(self, parts): - """ adds fixed particles to the model - """ - self.fparts += parts - - def addMobile(self, parts): - """ adds mobile particles to the model - """ - self.mparts += parts - - def clean(self): - for p in ['res*.*', 'input.*', 'grid.*']: - for f in glob.glob(p): - print('rm %s' % f) - os.remove(f) - - def run(self): - - # clean prev results - self.clean() - - # write parameters - self.writeprm() - - # input.mp - contains mobile particles - file = open('input.mp','w') - for p in self.mparts: - p.write(file) - file.close() - - # input.fp - contains fixed particles - file = open('input.fp','w') - for p in self.fparts: - p.write(file) - file.close() - - # paths.txt - contains path to the input files - file = open('paths.txt','w') - file.write('input.prm\n') - file.write('input.fp\n') - file.write('input.mp\n') - file.close() - - # set nb of threads - args = wu.parseargs() - os.environ['OMP_NUM_THREADS'] = str(args.k) - - # run program - exename = self.getexe() - print("running %s using %s threads" % (exename, os.environ['OMP_NUM_THREADS'])) - - #iop = subprocess.call(self.getexe(), shell=True, stdout=sys.stdout, stderr=sys.stderr) - #print 'louis returned iop=%d', iop - - #http://stackoverflow.com/questions/2715847/python-read-streaming-input-from-subprocess-communicate/17698359#17698359 - - #file=open('pipo.txt','w') - try: - proc = subprocess.Popen(exename, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=1) - with proc.stdout: - for line in iter(proc.stdout.readline, b''): - line = line.rstrip('\n').rstrip('\r') - print('[F]%s' % line) - #sys.stdout.write(line) - #file.write("line=\"%s\"\n" % line) - proc.wait() - except KeyboardInterrupt: - print('Ignoring CTRL-C') - pass - #file.close() - - def getexe(self): - """ looks for fortran exe - """ - dir1=os.path.abspath(os.path.dirname(__file__)+os.sep+".."+os.sep+"..")+os.sep+"louisB" - if 'Windows' in platform.uname(): - exename = os.path.join(dir1, "Release/louis.exe") - else: - exename = os.path.join(dir1, "louis") - if not os.path.isfile(exename): - raise Exception ("%s NOT found" %exename) - return exename - - def __str__(self): - txt = "SPH Model:\n" - txt += "\tnb fixed particiles = %d\n" % len(self.fparts) - txt += "\tnb mobile particules = %d\n" % len(self.mparts) - txt += "\tinitial smoothing length = %f\n" % self.h_0 - txt += "\tinitial speed of sound [m/s] = %f\n" % self.c_0 - txt += "\tinitial density [kg/m^3] = %f\n" % self.rho_0 - txt += "\tdomain size (cube) = %f\n" % self.dom_dim - txt += "\tkernel kind = %s\n" % self.kernel - txt += "\tartificial viscosity factor 1 = %f\n" % self.alpha - txt += "\tartificial viscosity factor 2 = %f\n" % self.beta - txt += "\tequ of state (1:'gas'/2:'fluid') = %s\n" % self.law - txt += "\tfluid prm = %d\n" % self.law.gamma - txt += "\tgas prm [kg/mol] = %f\n" % self.law.molMass - txt += "\tkernel correction (0:no 1:yes) = %s\n" % self.kernel.corrected - txt += "\tsimulation time [s] = %f\n" % self.maxTime - txt += "\tsave interval [s] = %f\n" % self.saveInt - return txt - -class Particle: - def __init__(self, x,y,z, vx,vy,vz, rho0, m0): - self.x = x - self.y = y - self.z = z - self.vx = vx - self.vy = vz - self.vz = vz - self.rho0 = rho0 - self.m0 = m0 - def write(self, file): - file.write('%e\t%e\t%e\t' % (self.x,self.y,self.z)) - file.write('%e\t%e\t%e\t' % (self.vx,self.vy,self.vz)) - file.write('%e\t%e\n' % (self.rho0, self.m0)) - def __str__(self): - return "pos=(%f, %f, %f) v=(%f, %f, %f) rho=%f m=%f" % \ - (self.x, self.y, self.z, self.vx, self.vy, self.vz, self.rho0, self.m0) - -class Cube: - """ a basic "cube" defined by its origin (o), size (L), density (rho) and distance between layers (s) - """ - def __init__(self, o=(0.0, 0.0, 0.0), L=(1.0, 1.0, 1.0), rho=1.0, s=0.1): - self.ox = o[0] - self.oy = o[1] - self.oz = o[2] - self.Lx = L[0] - self.Ly = L[1] - self.Lz = L[2] - self.rho = rho - self.s = s - - def generate(self): - parts = [] - ni = int(math.ceil((self.Lx/self.s)))+1 - dx = self.Lx/(ni-1) - nj = int(math.ceil((self.Ly/self.s)))+1 - dy = self.Ly/(nj-1) - nk = int(math.ceil((self.Lz/self.s)))+1 - dz = self.Lz/(nk-1) - vx = vy = vz = 0.0 - m0 = (dx*dy*dz)*self.rho - rho0 = self.rho - - for i in range(ni): - x = self.ox+ i*dx - for j in range(nj): - y = self.oy+j*dy - for k in range(nk): - z = self.oz+k*dz - p = Particle(x, y, z, vx, vy, vz, rho0, m0) - parts.append(p) - return parts - - - - - - - - diff --git a/sph/louis/sph/wutils.py b/sph/louis/sph/wutils.py deleted file mode 100644 index 2125cdc6..00000000 --- a/sph/louis/sph/wutils.py +++ /dev/null @@ -1,57 +0,0 @@ -# -*- coding: utf-8 -*- - -# Copyright 2020 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# Python utilities - - - -def setupwdir(testname): - """ - creates a working folder for each test - """ - import os, os.path - #print "__file__=",__file__ - dir1=os.path.abspath(os.path.dirname(__file__)+os.sep+"..")+os.sep - print("dir1=",dir1) - print("testname=",testname) - common = os.path.commonprefix( (testname, dir1) ) - #print "common=", common - resdir = testname[len(common):].replace(os.sep,"_") - resdir = os.path.splitext(resdir)[0] # remove ".py" - #print "resdir=", resdir - wdir=os.path.join('workspace', resdir) - if not os.path.isdir(wdir): - print("creating", wdir) - os.makedirs(wdir) - os.chdir(wdir) - -# ------------------------------------------------------------------------------ - -def parseargs(): - """ - parses command line arguments - """ - import argparse - parser = argparse.ArgumentParser() - parser.add_argument("-v", "--verb", help="increase output verbosity", action="count", default=0) - parser.add_argument("--nogui", help="disable any graphical output", - action="store_true") - parser.add_argument("-k", help="nb of threads", type=int, default=1) - #parser.add_argument("-p", help="misc parameters") - parser.add_argument('file', nargs='*', help='python files') - args = parser.parse_args() - return args diff --git a/sph/louis/src/SPH_module.f90 b/sph/louis/src/SPH_module.f90 deleted file mode 100644 index b6c1f72a..00000000 --- a/sph/louis/src/SPH_module.f90 +++ /dev/null @@ -1,1241 +0,0 @@ -!>SPH_module -!! @n Contains all the classes necessary to run a SPH simulation. -!! @brief Group of classes (types) and procedures definitions. -!! @author Louis Goffin -!! @date 2013-05-26 -!! @version 1.0.0 - -module SPH_module - - implicit none - - integer, parameter :: DP = KIND(1.0D0) !< double precision - !integer, parameter :: DP = KIND(1.0) !< single precision - real(DP), parameter :: pi = 3.141592653589793238462643383279502884197_dp !< \f$ \pi \f$ - - - !> Minimal link class - !! @n This class is a minimal pointer, i.e. the object is composed of only a pointer. - !! No other information is included. The pointers point toward particles - type min_link - class(fixed_particle), pointer :: ptr => null() !< pointer toward a particle - end type min_link - - - !> Link class - !! @n This class contains a pointer that points toward an object - !! and the distance between 2 particles. This class is used to - !! build vectors of pointers toward objects. - - type link - class(fixed_particle), pointer :: ptr => null() !< pointer toward a particle - real(DP) :: r = 0.0_dp !< distance between neighbours - end type link - - - !> List class - !! @n This class is a list that contains pointers toward objects (+distance). - !! The only problem of this list class is that only link objects (ptr+r) can be added - - type list - integer :: nbr = 0 !< number of elements in the list - integer :: max_nbr = 0 !< maxnumber of elements in the list (size of the array) - integer :: incr = 35 !< increment: number of spaces to add when the list is full - type(link), dimension(:), allocatable :: lst !< list containing elements - - contains - procedure :: initList => list_initList - procedure :: addElement => list_addElement - procedure :: resetList => list_resetList - end type list - - - !> Fixed particle class - !! @n This class contains a certain number of parameters describing - !! the state of a fixed particle (boundary particle).It also - !! includes the needed procedures to calculate the continuity - !! and some other equations. - - type fixed_particle - real(DP), dimension(1:3, 1:3) :: coord !< 3x3 array containing the coordinates of a particle. - !! column 1 = currentTime - !! column 2 = RKstep - !! column 3 = nextTime - real(DP), dimension(1:3, 1:3) :: speed !< 3x3 array containing the velocity of a particle. - !! column 1 = currentTime - !! column 2 = RKstep - !! column 3 = nextTime - real(DP), dimension(1:3) :: rho !< 3x1 array containing the density of a particle. - !! element 1 = currentTime - !! element 2 = RKstep - !! element 3 = nextTime - real(DP) :: m !< mass of the particle - real(DP), dimension(1:3) :: p !< pressure of the particle - !! element 1 = currentTime - !! element 2 = RKstep - !! element 3 = nextTime - real(DP), dimension(1:3) :: c !< speed of sound of a particle - !! element 1 = currentTime - !! element 2 = RKstep - !! element 3 = nextTime - real(DP) :: h !< smoothing length - type(list) :: neighbours !< list of neighbours - integer :: numOfNeighbours !< number of neighbours - real(DP), dimension(1:3, 1:150) :: vec_gradW !< array that contains the gradient for every - !! neighbours; initially set to 150 elements to - !! increase the computational efficiency - real(DP), dimension(1:3, 1:150):: vec_gradW_mod !< corrected vec_gradW if asked - class(particle_manager), pointer :: manager !< pointer toward the object particle_manager - real(DP) :: max_mu_ab !< maximum mu_ab of a particle (used for the timestep calculation) - - contains - procedure :: save2disk => particle_save2disk - procedure :: loadfromdisk => particle_loadfromdisk - procedure :: getNeighbours - procedure :: calcPressure - procedure :: calcCelerity - procedure :: gradW - procedure :: kernel_corr - procedure :: varUpdate => varUpdate_fixed - end type fixed_particle - - - !> Mobile_particle class - !! @n This is an extension of the fixed_particle class. - !! The procedure varUpdtate is overwritten to include the update of u and x. - - type, extends(fixed_particle) :: mobile_particle - contains - procedure :: varUpdate => varUpdate_mobile - procedure :: ArtificialViscosity - end type mobile_particle - - - !> Particle_sort class - !! @n This class is able to sort the particles. A grid is generated - !! and the particles are sorted in each cell. - type particle_sort - real(DP) :: h_max !< maximum smoothing length - real(DP) :: cellSize !< length of a side of a cube - integer :: nCells = 0 !< number of cells in the domain - integer :: nCellsSide !< number of cells on a row - logical :: init !< true if the cells must be initialised - type(list), dimension(:), allocatable :: storage !< vector of lists that contain - !! the particles in a cell - class(particle_manager), pointer :: manager !< pointer toward the object particle_manager - - contains - procedure :: get_h_max - procedure :: setCells - procedure :: particlesSort - end type particle_sort - - !> "enums" - - integer, parameter :: K_CUBIC_SPLINE = 1 - integer, parameter :: K_QUADRATIC = 2 - integer, parameter :: K_QUINTIC_SPLINE = 3 - - integer, parameter :: KCORR_OFF = 0 - integer, parameter :: KCORR_ON = 1 - - integer, parameter :: LAW_IDEAL_GAS = 1 - integer, parameter :: LAW_QINC_FLUID = 2 - - - !> Particle_manager class - !! @n This class is used to manage all the particles, - !! i.e. it contains a reference to every particles, - !! it contains a number of parameters useful for the problem - !! (variable smoothing length or not, ...), it has a solver, etc. - - type particle_manager - type(particle_sort) :: sorting !< sorting machine - type(min_link), dimension(:), allocatable :: part !< array of pointers toward particles - - integer :: numFP !< number of fixed particles - integer :: numMP !< number of mobile particles - integer :: numPart !< number of particles (FP+MP) - integer :: kernelKind !< kind of kernel - integer :: kappa !< kappa linked to the eqn state - real(DP) :: alpha !< weighting factor in the artificial viscosity formulation - real(DP) :: beta !< weighting factor in the artificial viscosity formulation - integer :: eqnState !< equation of state - !! 1 = ideal gas law - !! 2 = quasi-incompressible fluid - integer :: state_gamma !< power in eqn State 2. - !! often taken around 7 - real(DP) :: molMass !< Molar mass of the fluid for the prefect gas law - - integer :: kernelCorrection !< correction of the kernel - !! 0 = no correction - !! 1 = correction enabled - - real(DP) :: maxTime !< simulation time in seconds - real(DP) :: saveInt !< saving interval - real(DP) :: h_0 !< initial smoothing length - real(DP) :: rho_0 !< density of the fluid at free surface - real(DP) :: c_0 !< speed of sound in normal conditions - real(DP) :: timeStep !< timestep (not constant) - real(DP) :: currentTime !< current time - integer :: RKstep !< used to know in which RK iteration we are [RB] (1 or 2) - - real(DP) :: dom_dim !< length of a side of the domain - !! (exterior particle to exterior particle). - !! the domain is assumed to be cubic - - contains - procedure :: readPRM - procedure :: initialisation - procedure :: solver - procedure :: timeStepUpdate - procedure :: slUpdate - procedure :: savePartSet - end type particle_manager - - - contains - - !> calculates the distance between two particles - function eval_r(xyz, xyz2) - real(DP), dimension(3) :: xyz - real(DP), dimension(3) :: xyz2 - real(DP) :: eval_r - - eval_r = sqrt(sum( (xyz(:)-xyz2(:))*(xyz(:)-xyz2(:)) )) - end function eval_r - - ! ------------------------------------------------------------------------ - ! list - ! ------------------------------------------------------------------------ - - !> list/initList : initialise a list when it is first created - subroutine list_initList(this) - class(list) :: this - - if(this%incr < 1) then ! [RB] me semble inutile (incr=35 et ne varie pas) - this%incr = 1 - end if - this%max_nbr = this%incr - allocate( this%lst(1:this%max_nbr) ) - end subroutine list_initList - - - !> list/addElement : adds an element to a list. - !! If the list is full, then it increases the size of the list. - !! @param ptr : pointer of type link to be added in the list - !! @param r : distance between two particles - - subroutine list_addElement(this, ptr, r) - class(list) :: this - - class(fixed_particle), pointer :: ptr - real(DP) :: r - type(link), dimension(:), allocatable :: temp_lst !< temporary list used when it is necessary - !! to increase the size of the existing list - - ! if the list is empty, it must be initialised - if(this%max_nbr == 0) then - call this%initList - - ! if the list is full it must be resized - elseif(this%nbr == this%max_nbr) then - allocate(temp_lst(1:this%max_nbr+this%incr)) - temp_lst(1:this%max_nbr) = this%lst(1:this%max_nbr) - call move_alloc(temp_lst, this%lst) ! [RB] c'est une fct fortran - this%max_nbr = this%max_nbr + this%incr - end if - this%nbr = this%nbr + 1 - this%lst(this%nbr)%ptr => ptr - this%lst(this%nbr)%r = r - end subroutine list_addElement - - - !> list/resetList : resets the list. - !! It only sets the number of elements to 0 - !! but it keeps the maximal size to max_nbr - - subroutine list_resetList(this) - class(list) this - this%nbr = 0 - end subroutine list_resetList - - ! ------------------------------------------------------------------------ - ! fixed_particle - ! ------------------------------------------------------------------------ - - subroutine particle_save2disk(this, ufile) - class(fixed_particle), target :: this - integer, intent(in) :: ufile !< unit - - write(unit=ufile, fmt="(E15.7,E15.7,E15.7,E15.7,E15.7,E15.7,E15.7,E15.7,E15.7,E15.7,E15.7,E15.7, I8)") & - this%coord(1, 1), & - this%coord(2, 1), & - this%coord(3, 1), & - this%speed(1, 1), & - this%speed(2, 1), & - this%speed(3, 1), & - this%rho(1), & - this%p(1), & - this%m, & - this%c(1), & - this%h, & - this%max_mu_ab, & - this%numOfNeighbours - end subroutine particle_save2disk - - - subroutine particle_loadfromdisk(this, ufile, h_0) - class(fixed_particle), target :: this - integer, intent(in) :: ufile !< unit - real(DP) :: x, y, z, u_x, u_y, u_z, rho, m - real(DP) :: h_0 - - read(ufile, *) x, y, z, u_x, u_y, u_z, rho, m - this%coord = 0.d0 - this%coord(1, 1) = x - this%coord(2, 1) = y - this%coord(3, 1) = z - this%speed = 0.d0 - this%speed(1, 1) = u_x - this%speed(2, 1) = u_y - this%speed(3, 1) = u_z - this%rho = 0.d0 - this%rho(1) = rho - this%m = m - this%h = h_0 - this%p = 0.d0 - this%p(1) = this%calcPressure(this%rho(1)) - this%c = 0.d0 - this%c(1) = this%calcCelerity(this%rho(1)) - end subroutine particle_loadfromdisk - - !> fixed_particle/getNeighbours is a routine that questions the "particle_sort" object - !! to get the particles in the neighbouring cells. The distance is - !! calculated and the neighbours selected. - - subroutine getNeighbours(this) - class(fixed_particle), target :: this - - real(DP), dimension(:), pointer, contiguous :: xyz !< position of the particle - integer :: xCell, yCell, zCell !< number of the cell according to x, y and z - integer :: nCellsSide !< number of cells on a row of the domain - integer :: i, j, k !< loop counters - integer, dimension(1:27) :: cellsToCheck !< number of the cells to check for the neighbours - real(DP), dimension(:), pointer, contiguous :: neighXYZ !< coordinates of a neighbour - - real(DP) :: r !< distance between two particles - class(fixed_particle), pointer :: cur_ptr !< current pointer toward a particle - type(link), pointer :: cur_neigh !< current list of neighbours - type(particle_sort), pointer :: srt !< pointer toward the sorting machine - type(list), pointer :: storage !< pointer toward the storage - - integer :: cur_RKstep !< RKstep - - ! [RB] -- - integer :: twice - - ! pointer initialisation - srt => this%manager%sorting ! [RB] chaque particule pointe vers le manager - cur_RKstep = this%manager%RKstep - - ! coordinates of the particle - xyz => this%coord(:, cur_RKstep) - - if(cur_RKstep == 1) then - - ! calculates the number of the cell in which the particle is - nCellsSide = srt%nCellsSide - - xCell = nint( (xyz(1)-mod(xyz(1), srt%cellSize)) / srt%cellSize ) + 1 - yCell = nint( (xyz(2)-mod(xyz(2), srt%cellSize)) / srt%cellSize ) + 1 - zCell = nint( (xyz(3)-mod(xyz(3), srt%cellSize)) / srt%cellSize ) + 1 - - if(xCell<1) then - xCell = 1 - end if - if(xCell>nCellsSide) then - xCell = nCellsSide - end if - if(yCell<1) then - yCell = 1 - end if - if(yCell>nCellsSide) then - yCell = nCellsSide - end if - if(zCell<1) then - zCell = 1 - end if - if(zCell>nCellsSide) then - zCell = nCellsSide - end if - - ! calculates the number of the neighbouring cells - do i = -1, 1 - do j = -1, 1 - do k = -1, 1 - if((xCell+i>0).and.(yCell+j>0).and.(zCell+k>0).and. & - (xCell+i <= nCellsSide).and. & - (yCell+j <= nCellsSide).and. & - (zCell+k <= nCellsSide) ) then - cellsToCheck( (i+1)*9 + (j+1)*3 + (k+2) ) = & - (xCell+i-1)*nCellsSide**2 + (yCell+j-1)*nCellsSide + (zCell+k) - else - cellsToCheck((i+1)*9 + (j+1)*3 + (k+2)) = 0 - end if - end do - end do - end do - end if - - - ! stores the neighbours of the particle in the neighbours list. - ! First, the list is reset, then the neighbouring cells are scanned. - ! In each cell, the distance between the two particles is calculated. - ! If it is lower than the support domain and it is not the particle we - ! are working with (r>0 but here r>1E-12 for numerical errors), an element - ! link(ptr+r) is added to the neighbours list. - ! For the second RK step, only the distances r are recalculated. It is assumed that - ! the neighbours remain the same between 2 RK step. - - if(cur_RKstep == 1) then - call this%neighbours%resetList() - twice = 0 ! [RB] - do i = 1, 27 - if(cellsToCheck(i)>0) then - storage => srt%storage(cellsToCheck(i)) - do j = 1, srt%storage(cellsToCheck(i))%nbr - cur_ptr => storage%lst(j)%ptr - neighXYZ => cur_ptr%coord(:, cur_RKstep) - r = eval_r(xyz, neighXYZ) - if(r<= this%manager%kappa*this%h) then - if(r>1E-12) then ! [RB] why not cur_ptr /= this? - call this%neighbours%addElement(cur_ptr, r) - else - twice = twice + 1 ! [RB] - end if - end if - end do - end if - end do - ! [RB] safeguard - if (twice.ne. 1) then - print *, 'safeguard activated!' - print *, ' one particle has been taken into account', twice, ' times' - print *, ' xCell =', xCell - print *, ' yCell =', yCell - print *, ' zCell =', zCell - print *, ' cellsToCheck =', cellsToCheck - stop - end if - this%numOfNeighbours = this%neighbours%nbr - else - ! RK step2 - same neighbours and r is updated - do i = 1, this%numOfNeighbours - cur_neigh => this%neighbours%lst(i) - neighXYZ => cur_neigh%ptr%coord(:, cur_RKstep) - cur_neigh%r = eval_r(xyz, neighXYZ) - end do - end if - end subroutine getNeighbours - - - !> fixed_particle/calcPressure is a function that calculates the pressure according - !! to the equation of state chosen. - !! @param rho : actual density - - function calcPressure(this, rho) - class(fixed_particle) this - - real(DP) :: rho - real(DP) :: calcPressure - real(DP), parameter :: idealGasCst = 8.3144621d0 - real(DP) :: B - - select case(this%manager%eqnState) - case ( LAW_IDEAL_GAS) - calcPressure = (rho/this%manager%rho_0-1) & - * idealGasCst*293.15d0/this%manager%molMass ! eq (3.24) - case ( LAW_QINC_FLUID ) - B = this%manager%c_0**2 & - * this%manager%rho_0 / this%manager%state_gamma ! eq (3.27) - calcPressure = B*((rho/this%manager%rho_0)**this%manager%state_gamma - 1) ! eq (3.25) - case default - print *, 'Bad Equ of state (1,2)' - stop - end select - end function calcPressure - - - !> fixed_particle/calcCelerity : calculates the celerity according - !! to the equation of state chosen. - !! The equation used is @f[c = \sqrt{\frac{dp}{d\rho}}@f] - !! @param rho : actual density - - function calcCelerity(this, rho) - class(fixed_particle) :: this - - real(DP), intent(in) :: rho - real(DP) :: calcCelerity - - select case(this%manager%eqnState) - case( LAW_IDEAL_GAS ) - ! 1 = considering the ideal gas law at 20 degrees C - calcCelerity = this%manager%c_0 ! eq (3.36) - case ( LAW_QINC_FLUID ) - ! 2 = considering a quasi-incompressible fluid - calcCelerity = this%manager%c_0 & - * sqrt((rho/this%manager%rho_0)**(this%manager%state_gamma-1)) ! eq (3.37) - case default - print *, 'Bad Equ of state (1,2)' - stop - end select - end function calcCelerity - - - !> gradW : creates a vector that contains the values - !! of the gradient for each neighbour. - - subroutine gradW(this) - class(fixed_particle), target :: this - integer :: i - real(DP) :: alpha_d !< normalisation coefficient - real(DP) :: r !< distance between a particle and a neighbour - class(fixed_particle), pointer :: cur_neigh !< pointer toward a neighbour - real(DP) :: cur_h !< value of h - integer :: cur_RKstep !< pointer toward the current RK step - - if(this%numOfNeighbours>150) then - print *, 'Error: Number of neighbours greater than expected (max 150 for vec_gradW): ', this%numOfNeighbours - stop - end if - - cur_h = this%h - cur_RKstep = this%manager%RKstep - - select case(this%manager%kernelKind) - case ( K_CUBIC_SPLINE) - - alpha_d = 3.d0/(2.d0*pi*cur_h**3) ! [RB] efficiency of x**3.0d0 vs x**3 vs x*x*x ?? - ! values of alpha_d in table 2.1 p 23 - do i = 1, this%numOfNeighbours - r = this%neighbours%lst(i)%r ! [RB] a pointer is useless here! - cur_neigh => this%neighbours%lst(i)%ptr - if((r/cur_h>= 0.d0).and.(r/cur_h<1.d0)) then ! [RB] could "r/cur_h" be negative?? - this%vec_gradW(:, i) = alpha_d/cur_h & - * (3.d0/2.d0*(r/cur_h)**2 - 2.d0*(r/cur_h) ) & - * (this%coord(:, cur_RKstep) - cur_neigh%coord(:, cur_RKstep))/r ! eq (2.26) - else if((r/cur_h>= 1.d0).and.(r/cur_h<2.d0)) then - this%vec_gradW(:, i) = alpha_d/cur_h & - * (-0.5d0*(2.d0-r/cur_h)**2) & - * (this%coord(:, cur_RKstep) - cur_neigh%coord(:, cur_RKstep))/r - else - this%vec_gradW(:, i) = 0.d0 - end if - end do - - case ( K_QUADRATIC ) - - alpha_d = 5.d0/(4.d0*pi*cur_h**3) - - do i = 1, this%numOfNeighbours - r = this%neighbours%lst(i)%r ! [RB] a pointer is useless here! - cur_neigh => this%neighbours%lst(i)%ptr - - if((r/cur_h>= 0.d0).and.(r/cur_h<= 2.d0)) then ! [RB] could "r/cur_h" be negative?? - this%vec_gradW(:, i) = alpha_d/cur_h & - * (3.d0/8.d0*r/cur_h-3.d0/4.d0) & - * (this%coord(:, cur_RKstep)-cur_neigh%coord(:, cur_RKstep))/r ! eq (2.28) - else - this%vec_gradW(:, i) = 0.d0 - end if - end do - - case ( K_QUINTIC_SPLINE) - - alpha_d = 3.d0/(359.d0*pi*cur_h**3) - - do i = 1, this%numOfNeighbours - r = this%neighbours%lst(i)%r ! [RB] a pointer is useless here! - cur_neigh => this%neighbours%lst(i)%ptr - if((r/cur_h>= 0.d0).and.(r/cur_h<1.d0)) then - this%vec_gradW(:, i) = alpha_d/cur_h & - * ( -5.d0*(3.d0-r/cur_h)**4 & - + 30.d0*(2.d0-r/cur_h)**4 & - - 75.d0*(1.d0-r/cur_h)**4 ) & - * (this%coord(:, cur_RKstep)-cur_neigh%coord(:, cur_RKstep))/r ! eq (2.32) - elseif((r/cur_h>= 1.d0).and.(r/cur_h<2.d0)) then - this%vec_gradW(:, i) = alpha_d/cur_h & - * ( -5.d0*(3.d0-r/cur_h)**4 & - +30.d0*(2.d0-r/cur_h)**4 ) & - * (this%coord(:, cur_RKstep)-cur_neigh%coord(:, cur_RKstep))/r - elseif((r/cur_h>= 2.d0).and.(r/cur_h<3.d0)) then - this%vec_gradW(:, i) = alpha_d/cur_h & - * (-5.d0*(3.d0-r/cur_h)**4) & - * (this%coord(:, cur_RKstep)-cur_neigh%coord(:, cur_RKstep))/r - else - this%vec_gradW(:, i) = 0.d0 - end if - end do - - case default - print *, 'Bad value for kernel kind (1,2,3)' - stop - end select - - if(this%manager%kernelCorrection == KCORR_ON) then - this%vec_gradW_mod = this%vec_gradW - end if - end subroutine gradW - - - !> kernel_corr is a routine that takes into account the fact that the kernel may be truncated. - !! It corrects the gradient of the kernel - - subroutine kernel_corr(this) - class(fixed_particle) :: this - real(DP), dimension(3, 3) :: M !< matrix used to correct the kernel gradient - real(DP), dimension(3, 3) :: L !< inverse of the matrix used to correct the kernel gradient - real(DP) :: detM !< determinant of M - integer :: i !< loop counter - real(DP) :: MDivRho !< m_b/rho_b - class(fixed_particle), pointer :: cur_neigh !< pointer toward the current neighbour - integer :: cur_RKstep !< current RK step - - cur_RKstep = this%manager%RKstep - M(1, 1) = 0.d0 - M(2, 2) = 0.d0 - M(3, 3) = 0.d0 - M(1, 2) = 0.d0 - M(1, 3) = 0.d0 - M(2, 3) = 0.d0 - - do i = 1, this%numOfNeighbours - cur_neigh => this%neighbours%lst(i)%ptr - MDivRho = cur_neigh%m/cur_neigh%rho(cur_RKstep) - M(1, 1) = M(1, 1) + MDivRho * (cur_neigh%coord(1, cur_RKstep) - this%coord(1, cur_RKstep)) * this%vec_gradW(1, i) - M(2, 2) = M(2, 2) + MDivRho * (cur_neigh%coord(2, cur_RKstep) - this%coord(2, cur_RKstep)) * this%vec_gradW(2, i) - M(3, 3) = M(3, 3) + MDivRho * (cur_neigh%coord(3, cur_RKstep) - this%coord(3, cur_RKstep)) * this%vec_gradW(3, i) - M(1, 2) = M(1, 2) + MDivRho * (cur_neigh%coord(1, cur_RKstep) - this%coord(1, cur_RKstep)) * this%vec_gradW(2, i) - M(1, 3) = M(1, 3) + MDivRho * (cur_neigh%coord(1, cur_RKstep) - this%coord(1, cur_RKstep)) * this%vec_gradW(3, i) - M(2, 3) = M(2, 3) + MDivRho * (cur_neigh%coord(2, cur_RKstep) - this%coord(2, cur_RKstep)) * this%vec_gradW(3, i) - end do - M(2, 1) = M(1, 2) !< M is symmetric - M(3, 1) = M(1, 3) !< M is symmetric - M(3, 2) = M(2, 3) !< M is symmetric - - detM = M(1, 1) * ( M(2, 2)*M(3, 3)-M(3, 2)*M(2, 3) ) & - - M(1, 2) * ( M(2, 1)*M(3, 3)-M(3, 1)*M(2, 3) ) & - + M(1, 3) * ( M(2, 1)*M(3, 2)-M(3, 1)*M(2, 2) ) - if(detM.eq.0.0) then - print *, "detM==0!" - stop - end if - - L(1, 1) = M(2, 2)*M(3, 3) - M(3, 2)*M(2, 3) - L(2, 2) = M(1, 1)*M(3, 3) - M(3, 1)*M(1, 3) - L(3, 3) = M(1, 1)*M(2, 2) - M(2, 1)*M(1, 2) - L(1, 2) = M(3, 1)*M(2, 3) - M(2, 1)*M(3, 3) - L(2, 1) = L(1, 2) ! the inverse of a symmetric matrix is symmetric - L(1, 3) = M(2, 1)*M(3, 2) - M(3, 1)*M(2, 2) - - L(3, 1) = L(1, 3) ! the inverse of a symmetric matrix is symmetric - L(2, 3) = M(3, 1)*M(1, 2) - M(1, 1)*M(3, 2) - L(3, 2) = L(2, 3) ! the inverse of a symmetric matrix is symmetric - L = (1.d0/detM)*L - - do i = 1, this%numOfNeighbours - !this%vec_gradW_mod(1, i) = L(1, 1)*this%vec_gradW(1, i) + L(1, 2)*this%vec_gradW(1, i) + L(1, 3)*this%vec_gradW(3, i) - this%vec_gradW_mod(1, i) = L(1, 1)*this%vec_gradW(1, i) + L(1, 2)*this%vec_gradW(2, i) + L(1, 3)*this%vec_gradW(3, i) ! [RB] 1=>2 BUG? - this%vec_gradW_mod(2, i) = L(2, 1)*this%vec_gradW(1, i) + L(2, 2)*this%vec_gradW(2, i) + L(2, 3)*this%vec_gradW(3, i) - this%vec_gradW_mod(3, i) = L(3, 1)*this%vec_gradW(1, i) + L(3, 2)*this%vec_gradW(2, i) + L(3, 3)*this%vec_gradW(3, i) - end do - - end subroutine kernel_corr - - - !> fixed_particle/varUpdate_fixed : update the density of a fixed particle. - !! The update of the velocity and the position are not performed. - !! The integration scheme is a RK22 scheme. - - subroutine varUpdate_fixed(this) - class(fixed_particle) :: this - real(DP) :: Delta_rho !< \f$d\rho/dt\f$ - real(DP), dimension(1:3) :: u_ab !< relative velocity between the particle and a neighbour - integer :: i !< loop counter - integer :: cur_RKstep !< pointer toward the value of the current RK step - class(fixed_particle), pointer :: cur_neigh !< current neighbour - real(DP) :: dt - - Delta_rho = 0.d0 - cur_RKstep = this%manager%RKstep - - call this%getNeighbours() - call this%gradW() - - do i = 1, this%numOfNeighbours - cur_neigh => this%neighbours%lst(i)%ptr - u_ab(:) = this%speed(:, cur_RKstep) - cur_neigh%speed(:, cur_RKstep) - Delta_rho = Delta_rho + this%m * dot_product(u_ab, this%vec_gradW(:, i)) - end do - - dt = this%manager%timeStep - - if(cur_RKstep == 1) then !< 1st RK step - this%rho(2) = this%rho(1) + Delta_rho * dt - this%rho(3) = this%rho(1) + Delta_rho * dt/2.d0 - this%speed(:, 2) = this%speed(:, 1) - this%coord(:, 2) = this%coord(:, 1) - this%p(2) = this%calcPressure(this%rho(2)) - this%c(2) = this%calcCelerity(this%rho(2)) - else !< 2nd RK step - this%rho(3) = this%rho(3) + Delta_rho * dt/2.d0 - this%speed(:, 3) = this%speed(:, 2) - this%coord(:, 3) = this%coord(:, 2) - this%p(3) = this%calcPressure(this%rho(3)) - this%c(3) = this%calcCelerity(this%rho(3)) - end if - end subroutine varUpdate_fixed - - ! ------------------------------------------------------------------------ - ! mobile_particle - ! ------------------------------------------------------------------------ - - !> mobile_particle/varUpdate_mobile is a routine that updates the density, the velocity - !! and the position of a mobile particle. - !! The integration scheme is a RK22 scheme. - - subroutine varUpdate_mobile(this) - class(mobile_particle) :: this - real(DP) :: Delta_rho !< \f$d\rho/dt\f$ - real(DP), dimension(1:3) :: Delta_u !< \f$du/dt\f$ - real(DP), dimension(1:3) :: Delta_x !< \f$dx/dt\f$ - real(DP), dimension(1:3) :: u_ab !< relative velocity between the particle and a neighbour - real(DP), dimension(1:3) :: F !< Volume forces - real(DP) :: pi_ab !< Artificial viscosity - integer :: i !< loopcounter - integer :: cur_RKstep !< pointer toward the value of the current RK step - class(fixed_particle), pointer :: cur_neigh !< current neighbour - real(DP) :: dt - - Delta_rho = 0.d0 - Delta_u = (/ 0.d0, 0.d0, 0.d0 /) - Delta_x = (/ 0.d0, 0.d0, 0.d0 /) - F = (/ real(0, DP), real(0, DP), real(-9.81, DP) /) - - cur_RKstep = this%manager%RKstep - - call this%getNeighbours() - call this%gradW() - - if(this%manager%kernelCorrection == KCORR_ON) then - call this%kernel_corr() - end if - - ! reset max_mu_ab - if(cur_RKstep == 1) then - this%max_mu_ab = 0.d0 - end if - - - - select case(this%manager%kernelCorrection) - case( KCORR_ON ) - do i = 1, this%numOfNeighbours - cur_neigh => this%neighbours%lst(i)%ptr - u_ab(:) = this%speed(:, cur_RKstep) - cur_neigh%speed(:, cur_RKstep) - pi_ab = this%ArtificialViscosity(cur_neigh, this%manager%alpha, this%manager%beta) - Delta_rho = Delta_rho & - + this%m * dot_product(u_ab, this%vec_gradW(:, i)) - Delta_u = Delta_u & - + this%m * (cur_neigh%p(cur_RKstep) / cur_neigh%rho(cur_RKstep)**2 & - + this%p(cur_RKstep) / this%rho(cur_RKstep)**2 & - + pi_ab ) & - * this%vec_gradW_mod(:, i) ! <= difference here - end do - case ( KCORR_OFF ) - do i = 1, this%numOfNeighbours - cur_neigh => this%neighbours%lst(i)%ptr - u_ab(:) = this%speed(:, cur_RKstep) - cur_neigh%speed(:, cur_RKstep) - pi_ab = this%ArtificialViscosity(cur_neigh, this%manager%alpha, this%manager%beta) - Delta_rho = Delta_rho & - + this%m * dot_product(u_ab, this%vec_gradW(:, i)) - Delta_u = Delta_u & - + this%m * (cur_neigh%p(cur_RKstep)/cur_neigh%rho(cur_RKstep)**2 & - + this%p(cur_RKstep) / this%rho(cur_RKstep)**2 & - + pi_ab ) & - * this%vec_gradW(:, i) ! <= difference here - end do - case default - print *,'Bad value of kernel correction' - stop - end select - - Delta_u = -Delta_u + F - dt = this%manager%timeStep - - if(cur_RKstep == 1) then ! 1st RK step - this%rho(2) = this%rho(1) + Delta_rho * dt - this%rho(3) = this%rho(1) + Delta_rho * dt/2.d0 - this%speed(:, 2) = this%speed(:, 1) + Delta_u * dt - this%speed(:, 3) = this%speed(:, 1) + Delta_u * dt/2.d0 - this%coord(:, 2) = this%coord(:, 1) + this%speed(:, 1) * dt - this%coord(:, 3) = this%coord(:, 1) + this%speed(:, 1) * dt/2.d0 - this%p(2) = this%calcPressure(this%rho(2)) - this%c(2) = this%calcCelerity(this%rho(2)) - else ! 2nd RK step - this%rho(3) = this%rho(3) + Delta_rho * dt/2.d0 - this%speed(:, 3) = this%speed(:, 3) + Delta_u * dt/2.d0 - this%coord(:, 3) = this%coord(:, 3) + this%speed(:, 2) * dt/2.d0 - this%p(3) = this%calcPressure(this%rho(3)) - this%c(3) = this%calcCelerity(this%rho(3)) - end if - end subroutine varUpdate_mobile - - - !> mobile_particle/ArtificialViscosity calculates the viscosity term - !! in the momentum equation. - !! @param neighObj : neighbouring object - !! @param alpha : coefficicent in the artificial viscosity formulation - !! @param beta : coefficicent in the artificial viscosity formulation - - function ArtificialViscosity(this, neighObj, alpha, beta) - class(mobile_particle) :: this - class(fixed_particle) :: neighObj - real(DP) :: alpha - real(DP) :: beta - real(DP) :: ArtificialViscosity - real(DP) :: mu_ab = 0.d0 !< this term represents a kind of viscosity - real(DP), dimension(1:3) :: u_ab !< relative velocity of a in comparison with b - real(DP), dimension(1:3) :: x_ab !< the distance between a and b - real(DP) :: c_ab !< mean speed of sound - real(DP) :: rho_ab !< mean density - - u_ab = this%speed(:, this%manager%RKstep) - neighObj%speed(:, this%manager%RKstep) - x_ab = this%coord(:, this%manager%RKstep) - neighObj%coord(:, this%manager%RKstep) - - if(dot_product(u_ab, x_ab)<0.0d0) then - ! mu_ab is calculated using \f[\mu_{ab} = \frac{h\vec{u}_{ab}\cdot\vec{x}_{ab}}{\vec{x}_{ab}^2+\eta^2}\f] - mu_ab = this%h * dot_product(u_ab, x_ab) / ( dot_product(x_ab, x_ab) + 0.01d0*this%h**2.d0 ) - c_ab = 0.5d0 * (this%c(this%manager%RKstep) + neighObj%c(this%manager%RKstep)) - rho_ab = 0.5d0 * (this%rho(this%manager%RKstep) + neighObj%rho(this%manager%RKstep)) - - ArtificialViscosity = (-alpha*c_ab*mu_ab + beta*mu_ab**2.d0)/rho_ab - else - ArtificialViscosity = 0.d0 - end if - - ! update of max_mu_ab for the calculation of the timestep - if( (this%manager%RKstep == 1).and.(mu_ab>this%max_mu_ab) ) then - this%max_mu_ab = mu_ab - end if - end function ArtificialViscosity - - ! ------------------------------------------------------------------------ - ! particle_manager - ! ------------------------------------------------------------------------ - - !> Reading and storing of the data in the parameter files - subroutine readPRM(this, param_path) - class(particle_manager), target :: this - character(len=*) :: param_path - - open(unit = 1, file = trim(param_path)) - read(1, *) this%numFP - read(1, *) this%numMP - read(1, *) this%h_0 - read(1, *) this%c_0 - read(1, *) this%rho_0 - read(1, *) this%dom_dim - read(1, *) this%kernelKind - read(1, *) this%alpha - read(1, *) this%beta - read(1, *) this%eqnState - read(1, *) this%state_gamma - read(1, *) this%molMass - read(1, *) this%kernelCorrection - read(1, *) this%maxTime - read(1, *) this%saveInt - close(unit = 1) - end subroutine readPRM - - - !> particle_manager/initialisation : initialises the particle manager - !! and all the particles. The routine takes the data from external files. - !! The files paths are given in a file saved in the same directory - !! as the program. - !! The external files contains: - !! the parameters, - !! the fixed particles properties and the mobile particles. - - subroutine initialisation(this) - class(particle_manager), target :: this - - character(250) :: param_path !< path of the parameters file - character(250) :: fp_path !< path of the fixed particle(fp) file - character(250) :: mp_path !< path of the mobile particle(mp) file - - integer :: i !< loop counter - class(fixed_particle), pointer :: cur_ptr - - this%timeStep = 1.0d-15 !< initial time step - this%currentTime = 0.d0 !< current time initialisation - this%RKstep = 1 !< RK step counter initialisation - - ! Reading of the paths of the input files - open(unit = 1, file = 'paths.txt') - read(1, *) param_path - read(1, *) fp_path - read(1, *) mp_path - close(unit = 1) - - call this%readPRM(param_path) - - ! allocation of the particles array - this%numPart = this%numFP + this%numMP - allocate(this%part(1:this%numPart)) - - select case(this%kernelKind) - case( K_CUBIC_SPLINE ) - this%kappa = 2 - case( K_QUADRATIC ) - this%kappa = 2 - case( K_QUINTIC_SPLINE ) - this%kappa = 3 - end select - - ! Reading and storing of the data for the fixed particles - open(unit = 1, file = trim(fp_path)) - do i = 1, this%numFP - allocate(fixed_particle :: this%part(i)%ptr) - cur_ptr => this%part(i)%ptr - cur_ptr%manager => this - call cur_ptr%loadfromdisk(1, this%h_0) - call cur_ptr%neighbours%initList() - end do - close(unit = 1) - - ! Reading and storing of the data for the mobile particles - open(unit = 1, file = trim(mp_path)) - do i = 1, this%numMP - allocate(mobile_particle :: this%part(this%numFP+i)%ptr) - cur_ptr => this%part(this%numFP+i)%ptr - cur_ptr%manager => this - call cur_ptr%loadfromdisk(1, this%h_0) - call cur_ptr%neighbours%initList() - end do - close(unit = 1) - - ! Particle sort - this%sorting%manager => this - this%sorting%init = .true. - - print *, 'Initialisation finished.' - end subroutine initialisation - - - !> save a particle set onto disk - - subroutine savePartSet(this, fname, ite, nbegin, nend) - class(particle_manager) :: this - character (len=*), intent(in) :: fname !< file name prefix - integer, intent(in) :: ite - integer, intent(in) :: nbegin, nend - - integer :: i, ios - character (len=250) :: filename - - write(filename , fmt="(A,'_',I0.8,'.res')") fname,ite - open (unit=1, file=filename, action="write", iostat=ios) - if ( ios /= 0 ) then - print "('Cannot open result file')" - stop - end if - do i = nbegin, nend - call this%part(i)%ptr%save2disk(1) - end do - close(unit=1) - end subroutine savePartSet - - - !> particle_manager/solver: solves the problem. It loops over time and uses - !! a RK22 time integration scheme. - - subroutine solver(this) - class(particle_manager) :: this - - integer :: i, j - integer :: ite !< iteration counter - logical :: to_save !< saving flag. If true a saving is done - class(fixed_particle), pointer :: p - - ite = 0 - - do while(this%currentTime <= this%maxTime) - - ! Time increment and saving status - if((floor(this%currentTime/this%saveInt) /= & - floor((this%currentTime+this%timeStep)/this%saveInt)) .or. ite == 0) then - to_save = .true. - end if - this%currentTime = this%currentTime + this%timeStep - - ! Runge-Kutta loop - do j = 1, 2 - this%RKstep = j - !if (j.eq.1) then ! [RB] - call this%sorting%particlesSort() - !end if ! [RB] - ! Loop over the particles - !$OMP PARALLEL DO PRIVATE(i) SCHEDULE(DYNAMIC) - do i = 1, this%numPart - call this%part(i)%ptr%varUpdate() - end do - !$OMP END PARALLEL DO - end do - - ! Update of the current time variables (currentTime = nextTime) - do i = 1, this%numPart - p => this%part(i)%ptr - p%rho(1) = p%rho(3) - p%p(1) = p%p(3) - p%c(1) = p%c(3) - p%speed(:, 1) = p%speed(:, 3) - p%coord(:, 1) = p%coord(:, 3) - end do - - ! Test for the data saving - if(to_save) then - call this%savePartSet('resMP', ite, this%numFP+1, this%numFP+this%numMP) - call this%savePartSet('resFP', ite, 1, this%numFP) - - print *, 'Iteration nb ', ite - print *, ' Time (s) = ', this%currentTime - print *, ' Time step (s) = ', this%timeStep - to_save = .false. - end if - - call this%timeStepUpdate() - call this%slUpdate() - - ite = ite + 1 - end do - - end subroutine solver - - - !> particle_manager/timeStepUpdate: computes the next timestep using - !! the properties of the particles. - - subroutine timeStepUpdate(this) - class(particle_manager) :: this - real(DP) :: dTf, dTftemp !< time step relative to the body forces - real(DP) :: dTcv, dTcvtemp !< time step relative to the viscous forces and Courrant number - integer :: i - class(fixed_particle), pointer :: cur_ptr - - ! computes the timestep relative to the body forces - dTf = sqrt( this%part(this%numFP+1)%ptr%h / 9.81d0 ) - do i = this%numFP+2, this%numPart - cur_ptr => this%part(i)%ptr - dTftemp = sqrt(cur_ptr%h / 9.81d0) - if(dTftemp<dTf) then - dTf = dTftemp - end if - end do - - ! computes the timestep relative to the CN and the viscous forces - dTcv = this%part(this%numFP+1)%ptr%h & - / (this%part(this%numFP+1)%ptr%c(1) & - + 0.6d0 * (this%alpha * this%part(this%numFP+1)%ptr%c(1) & - + this%beta * this%part(this%numFP+1)%ptr%max_mu_ab ) ) - do i = this%numFP+2, this%numPart - cur_ptr => this%part(i)%ptr - dTcvtemp = cur_ptr%h / & - (cur_ptr%c(1) & - + 0.6d0 * (this%alpha * cur_ptr%c(1) + this%beta * cur_ptr%max_mu_ab)) - if(dTcvtemp<dTcv) then - dTcv = dTcvtemp - end if - end do - - ! computes the final timestep - if(0.4d0*dTf > 0.25d0*dTcv) then - this%timeStep = 0.25d0 * dTcv - else - this%timeStep = 0.4d0 * dTf - end if - - !> possibility to change the timestep if we use the ideal gas law - if(this%eqnState == 1) then - this%timeStep = 5.d0 * this%timeStep - end if - end subroutine timeStepUpdate - - - !> particle_manager/slUpdate is a routine that updates the smoothing length at each timestep. - !! It is written to provide the same smoothing length for every particle. - - subroutine slUpdate(this) - class(particle_manager) :: this - real(DP) :: mean_rho !< mean value of the densities of the mobile particles - real(DP) :: new_h !< new smoothing length - integer :: i - mean_rho = 0.d0 - - ! calculation of the average density - do i = 1, this%numPart - mean_rho = mean_rho+this%part(i)%ptr%rho(1) - end do - mean_rho = mean_rho/this%numPart - - ! calculation of the new smoothing length - new_h = this%h_0 * (this%rho_0/mean_rho)**(1.d0/3.d0) - - ! if the smoothing length is greater than 0.5 the size of a cell, it is limited - if(new_h > 0.5d0 * this%sorting%cellSize) then - new_h = 0.5d0 * this%sorting%cellSize - print *, 'Warning: the smoothing has been limited' - end if - - ! update of the smoothing length - do i = 1, this%numPart - this%part(i)%ptr%h = new_h - end do - end subroutine slUpdate - - ! ------------------------------------------------------------------------ - ! particle_sort - ! ------------------------------------------------------------------------ - - !> particle_sort/get_h_max: finds the largest smoothing length of the particles. - !! This is useful when it is not constant over the particles. - - subroutine get_h_max(this) - class(particle_sort) :: this - integer :: i - - this%h_max = 0 - do i = 1, this%manager%numPart - if(this%manager%part(i)%ptr%h > this%h_max) then - this%h_max = this%manager%part(i)%ptr%h - end if - end do - - ! increase of h_max in order to have a security if h changes. - ! This is done according to the equation of state used. - if(this%manager%eqnState == LAW_IDEAL_GAS) then - this%h_max = 1.1d0 * this%h_max - else - this%h_max = 1.02d0 * this%h_max - end if - end subroutine get_h_max - - - !> particle_sort/setCells : sets the size of the cells in which the particles - !! will be sorted. A cell must be cubic. The domain is assumed to be cubic. - !! This routine also sets the number of cells and allocates the vector which contains - !! the lists of particles. - !! In ordrer to be as efficient as possible, the storage vector is not deallocated and - !! reallocated at each iteration. - - subroutine setCells(this) - class(particle_sort) :: this - integer :: ios - - ! calculates the necessary number of cells on a side - call this%get_h_max() - - this%nCellsSide = 0 - do while(this%manager%dom_dim / (this%nCellsSide+1) > this%manager%kappa * this%h_max) - this%nCellsSide = this%nCellsSide + 1 - end do - - this%nCells = this%nCellsSide**3 - - ! allocated with the necessary number of cells. - allocate(this%storage(1:this%nCells)) - this%cellSize = this%manager%dom_dim / this%nCellsSide - - ! [RB] info - print *, 'INFO particle_sort/setCells()' - print *, ' .nCellsSide =', this%nCellsSide - print *, ' .nCells =', this%nCells - print *, ' .cellSize =', this%cellSize - - ! save info 2 disk - open (unit=1, file="grid.out", action="write", iostat=ios) - if ( ios /= 0 ) then - print "('Cannot open grid file')" - stop - end if - write(unit=1, fmt="(I8,E15.7)") & - this%nCellsSide, & - this%cellSize - close(unit=1) - - end subroutine setCells - - - !> particle_sort/particlesSort: sorts every particle in a cell. - !! This will be useful in order to find the neighbours. - - subroutine particlesSort(this) - class(particle_sort), target :: this - - integer :: i - integer :: xCell, yCell, zCell !< number of the cell in the x, y and z direction - integer :: part_pos !< absolute position of a particle - real(DP), dimension(:), pointer, contiguous :: xyz !< position of a particle - integer, pointer :: nCellsSide !< number of cells on a row - - class(fixed_particle), pointer :: prt - - !print *,"sorting particles" - - if(this%init) then - call this%setCells() - this%init = .false. - end if - - ! the lists of every cell are reset - do i = 1, this%nCells - call this%storage(i)%resetList() - end do - - nCellsSide => this%nCellsSide - do i = 1, this%manager%numPart - prt => this%manager%part(i)%ptr - xyz => prt%coord(:, this%manager%RKstep) - - xCell = nint( (xyz(1)-mod(xyz(1), this%cellSize)) / this%cellSize ) + 1 - yCell = nint( (xyz(2)-mod(xyz(2), this%cellSize)) / this%cellSize ) + 1 - zCell = nint( (xyz(3)-mod(xyz(3), this%cellSize)) / this%cellSize ) + 1 - - if(xCell<1) then - xCell = 1 - end if - if(xCell>nCellsSide) then - xCell = nCellsSide - end if - if(yCell<1) then - yCell = 1 - end if - if(yCell>nCellsSide) then - yCell = nCellsSide - end if - if(zCell<1) then - zCell = 1 - end if - if(zCell>nCellsSide) then - zCell = nCellsSide - end if - - part_pos = (xCell-1)*nCellsSide**2 + (yCell-1)*nCellsSide + zCell - - call this%storage(part_pos)%addElement( prt, 0.0_dp ) - end do - - end subroutine particlesSort - -end module SPH_module diff --git a/sph/louis/src/SPH_simulation.f90 b/sph/louis/src/SPH_simulation.f90 deleted file mode 100644 index f16b20b4..00000000 --- a/sph/louis/src/SPH_simulation.f90 +++ /dev/null @@ -1,31 +0,0 @@ -!> SPH simulation -!! @n This program is used to solve the Navier-Stokes equations -!! using the SPH method. A number of files must be given: -!! paths.txt, *.prm, *.fp and *.mp. -!! @warning The domain must be cubic! -!! @brief Main program to launch a SPH simulation -!! @author Louis Goffin -!! @date 2013-05-26 -!! @version 1.0.0 - -program SPH_simulation - - use SPH_module - implicit none - - integer :: t1, t2, clock_rate, clock_max - type(particle_manager) :: manager - - print *,'============= SPH_simulation (L.Goffin)' - - call system_clock(t1, clock_rate, clock_max) - - call manager%initialisation() - call manager%solver() - - call system_clock(t2, clock_rate, clock_max) - - print *,'Elapsed real time = ', (t2-t1)/clock_rate - -end program SPH_simulation - diff --git a/sph/louis/tests/waterdrop.py b/sph/louis/tests/waterdrop.py deleted file mode 100644 index 19f84b5d..00000000 --- a/sph/louis/tests/waterdrop.py +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2020 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -from sph.helpers import * - -if __name__=="__main__": - - boxL = 2. - Lfloor = 0.7 - Lwater = 0.5 - sep = 0.05 - - kernel = Kernel('cubic', True) # 'cubic', 'quadratic' or 'quintic' - law = EqState('liquid') # 'gas' or 'liquid' - - # parameters - model = Model() - model.kernel = kernel - model.law = law - - model.h_0 = 0.06 # initial smoothing length [m] - model.c_0 = 35.0 # initial speed of sound [m/s] - model.rho_0 = 1000.0 # initial density [kg/m^3] - model.dom_dim = boxL # domain size (cube) - model.alpha = 0.5 # artificial viscosity factor 1 - model.beta = 0.0 # artificial viscosity factor 2 - model.maxTime = 1.0 # simulation time - model.saveInt = 0.01 # save interval - - # mobile particles - cube = Cube( o=(((boxL-Lwater)/2),((boxL-Lwater)/2), ((boxL)/2)+0.5), L=(Lwater,Lwater,Lwater), rho=model.rho_0, s=sep) - model.addMobile(cube.generate()) - - # fixed particles - plane = Cube( o=(((boxL-Lfloor)/2),((boxL-Lfloor)/2), (boxL/2)), L=(Lfloor,Lfloor,sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - plane = Cube( o=(0,0,0), L=(boxL,boxL,sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - - # run SPH model - print(model) - model.run() - - # convert to VTK - import sph.gui as gui - gui.ToParaview(verb=False).convertall() - - \ No newline at end of file diff --git a/sph/louis/tests/waterdrop2.py b/sph/louis/tests/waterdrop2.py deleted file mode 100644 index 954fef22..00000000 --- a/sph/louis/tests/waterdrop2.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2020 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -from sph.helpers import * - -if __name__=="__main__": - - boxL = 2. - Lfloor = 0.7 - Lwater = 0.5 - sep = 0.05 - - kernel = Kernel('cubic', False) # 'cubic', 'quadratic' or 'quintic' - law = EqState('liquid') # 'gas' or 'liquid' - - # parameters - model = Model() - model.kernel = kernel - model.law = law - - model.h_0 = 0.06 # initial smoothing length [m] - model.c_0 = 35.0 # initial speed of sound [m/s] - model.rho_0 = 1000.0 # initial density [kg/m^3] - model.dom_dim = boxL # domain size (cube) - model.alpha = 0.5 # artificial viscosity factor 1 - model.beta = 0.0 # artificial viscosity factor 2 - model.maxTime = 3.0 # simulation time - model.saveInt = 0.01 # save interval - - # mobile particles - cube = Cube( o=(((boxL-Lwater)/2),((boxL-Lwater)/2), ((boxL)/2)+0.5), L=(Lwater,Lwater,Lwater), rho=model.rho_0, s=sep) - model.addMobile(cube.generate()) - - # fixed particles - #obstacle - plane = Cube( o=(((boxL-Lfloor)/2),((boxL-Lfloor)/2), (boxL/2)), L=(Lfloor,Lfloor,sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - #floor - plane = Cube( o=(0,0,0), L=(boxL,boxL,sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - #x=0 - plane = Cube( o=(0,0,2*sep), L=(sep,boxL,boxL-2*sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - #y=0 - plane = Cube( o=(2*sep,0,2*sep), L=(boxL-4*sep,sep,boxL-2*sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - #x=L - plane = Cube( o=(boxL-sep,0,2*sep), L=(sep,boxL,boxL-2*sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - #y=L - plane = Cube( o=(2*sep,boxL-sep,2*sep), L=(boxL-4*sep,sep,boxL-2*sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - - # run SPH model - print(model) - model.run() - - # convert to VTK - import sph.gui as gui - gui.ToParaview(verb=False).convertall() - - diff --git a/sph/louis/tests/waterdrop3.py b/sph/louis/tests/waterdrop3.py deleted file mode 100644 index ce6b1497..00000000 --- a/sph/louis/tests/waterdrop3.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2020 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -from sph.helpers import * - -if __name__=="__main__": - - boxL = 2. - Lfloor = 0.7 - Lwater = 0.5 - sep = 0.05/2 - - kernel = Kernel('cubic', False) # 'cubic', 'quadratic' or 'quintic' - law = EqState('liquid') # 'gas' or 'liquid' - - # parameters - model = Model() - model.kernel = kernel - model.law = law - - model.h_0 = 0.06/2 # initial smoothing length [m] - model.c_0 = 35.0 # initial speed of sound [m/s] - model.rho_0 = 1000.0 # initial density [kg/m^3] - model.dom_dim = boxL # domain size (cube) - model.alpha = 0.5 # artificial viscosity factor 1 - model.beta = 0.0 # artificial viscosity factor 2 - model.maxTime = 3.0 # simulation time - model.saveInt = 0.01/2 # save interval - - # mobile particles - cube = Cube( o=(((boxL-Lwater)/2),((boxL-Lwater)/2), ((boxL)/2)+0.5), L=(Lwater,Lwater,Lwater), rho=model.rho_0, s=sep) - model.addMobile(cube.generate()) - - # fixed particles - #obstacle - plane = Cube( o=(((boxL-Lfloor)/2),((boxL-Lfloor)/2), (boxL/2)), L=(Lfloor,Lfloor,sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - #floor - plane = Cube( o=(0,0,0), L=(boxL,boxL,sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - #x=0 - plane = Cube( o=(0,0,2*sep), L=(sep,boxL,boxL-2*sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - #y=0 - plane = Cube( o=(2*sep,0,2*sep), L=(boxL-4*sep,sep,boxL-2*sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - #x=L - plane = Cube( o=(boxL-sep,0,2*sep), L=(sep,boxL,boxL-2*sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - #y=L - plane = Cube( o=(2*sep,boxL-sep,2*sep), L=(boxL-4*sep,sep,boxL-2*sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - - # run SPH model - print(model) - model.run() - - # convert to VTK - import sph.gui as gui - gui.ToParaview(verb=False).convertall() - - diff --git a/sph/louis/tests/waterdrop4.py b/sph/louis/tests/waterdrop4.py deleted file mode 100644 index df08ea33..00000000 --- a/sph/louis/tests/waterdrop4.py +++ /dev/null @@ -1,77 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2020 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -from sph.helpers import * - -if __name__=="__main__": - - boxL = 2. - Lfloor = 0.7 - Lwater = 0.5 - sep = 0.05/4 - - kernel = Kernel('cubic', False) # 'cubic', 'quadratic' or 'quintic' - law = EqState('liquid') # 'gas' or 'liquid' - - # parameters - model = Model() - model.kernel = kernel - model.law = law - - model.h_0 = 0.06/4 # initial smoothing length [m] - model.c_0 = 35.0 # initial speed of sound [m/s] - model.rho_0 = 1000.0 # initial density [kg/m^3] - model.dom_dim = boxL # domain size (cube) - model.alpha = 0.5 # artificial viscosity factor 1 - model.beta = 0.0 # artificial viscosity factor 2 - model.maxTime = 3.0 # simulation time - model.saveInt = 0.01/2 # save interval - - # mobile particles - cube = Cube( o=(((boxL-Lwater)/2),((boxL-Lwater)/2), ((boxL)/2)+0.5), L=(Lwater,Lwater,Lwater), rho=model.rho_0, s=sep) - model.addMobile(cube.generate()) - - # fixed particles - #obstacle - plane = Cube( o=(((boxL-Lfloor)/2),((boxL-Lfloor)/2), (boxL/2)), L=(Lfloor,Lfloor,sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - #floor - plane = Cube( o=(0,0,0), L=(boxL,boxL,sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - #x=0 - plane = Cube( o=(0,0,2*sep), L=(sep,boxL,boxL-2*sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - #y=0 - plane = Cube( o=(2*sep,0,2*sep), L=(boxL-4*sep,sep,boxL-2*sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - #x=L - plane = Cube( o=(boxL-sep,0,2*sep), L=(sep,boxL,boxL-2*sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - #y=L - plane = Cube( o=(2*sep,boxL-sep,2*sep), L=(boxL-4*sep,sep,boxL-2*sep), rho=model.rho_0, s=sep) - model.addFixed(plane.generate()) - - # run SPH model - print(model) - model.run() - - # convert to VTK - import sph.gui as gui - gui.ToParaview(verb=False).convertall() - - diff --git a/sph/louis/tests/waterdrop_post.py b/sph/louis/tests/waterdrop_post.py deleted file mode 100644 index 78d57fa3..00000000 --- a/sph/louis/tests/waterdrop_post.py +++ /dev/null @@ -1,188 +0,0 @@ - -# Copyright 2020 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -#### import the simple module from the paraview -from paraview.simple import * -import glob, os.path - -#### disable automatic camera reset on 'Show' -paraview.simple._DisableFirstRenderCameraReset() - -print("cwd=", os.getcwd()) -dirname = '/home/boman/dev/Projet_MP/waves/sph/louis/workspace/tests_waterdrop' - -# create a new 'XML Structured Grid Reader' -gridvts = XMLStructuredGridReader(FileName=os.path.join(dirname,'grid.vts')) -RenameSource('Grid', gridvts) - -# create a new 'XML Unstructured Grid Reader' -inpfiles = sorted(glob.glob(os.path.join(dirname,'resFP_*.vtu'))) -#print inpfiles -resFP_00000 = XMLUnstructuredGridReader(FileName=inpfiles) -resFP_00000.PointArrayStatus = ['max(mu_ab)', 'Pressure', 'Speed of sound', 'Mass density', 'Velocity', 'Smoothing length', 'Mass', 'Nb of neighbours'] -RenameSource('Fixed particles', resFP_00000) - -# get animation scene -animationScene1 = GetAnimationScene() - -# update animation scene based on data timesteps -animationScene1.UpdateAnimationUsingDataTimeSteps() - -# create a new 'XML Unstructured Grid Reader' -inpfiles = sorted(glob.glob(os.path.join(dirname,'resMP_*.vtu'))) -resMP_00000 = XMLUnstructuredGridReader(FileName=inpfiles) -resMP_00000.PointArrayStatus = ['max(mu_ab)', 'Pressure', 'Speed of sound', 'Mass density', 'Velocity', 'Smoothing length', 'Mass', 'Nb of neighbours'] -RenameSource('Mobile particles', resMP_00000) - -# get active view -renderView1 = GetActiveViewOrCreate('RenderView') -# uncomment following to set a specific view size -# renderView1.ViewSize = [997, 849] - -# show data in view -gridvtsDisplay = Show(gridvts, renderView1) -# trace defaults for the display properties. -gridvtsDisplay.Representation = 'Outline' -gridvtsDisplay.ColorArrayName = ['POINTS', ''] -gridvtsDisplay.OSPRayScaleFunction = 'PiecewiseFunction' -gridvtsDisplay.SelectOrientationVectors = 'None' -gridvtsDisplay.ScaleFactor = 0.2 -gridvtsDisplay.SelectScaleArray = 'None' -gridvtsDisplay.GlyphType = 'Arrow' -gridvtsDisplay.ScalarOpacityUnitDistance = 0.21650635094610968 - -# reset view to fit data -renderView1.ResetCamera() - -# show data in view -resFP_00000Display = Show(resFP_00000, renderView1) -# trace defaults for the display properties. -resFP_00000Display.ColorArrayName = [None, ''] -resFP_00000Display.OSPRayScaleArray = 'Mass' -resFP_00000Display.OSPRayScaleFunction = 'PiecewiseFunction' -resFP_00000Display.SelectOrientationVectors = 'Mass' -resFP_00000Display.ScaleFactor = 0.19512200355529785 -resFP_00000Display.SelectScaleArray = 'Mass' -resFP_00000Display.GlyphType = 'Arrow' -resFP_00000Display.ScalarOpacityUnitDistance = 0.18843877254666028 -resFP_00000Display.GaussianRadius = 0.09756100177764893 -resFP_00000Display.SetScaleArray = ['POINTS', 'Mass'] -resFP_00000Display.ScaleTransferFunction = 'PiecewiseFunction' -resFP_00000Display.OpacityArray = ['POINTS', 'Mass'] -resFP_00000Display.OpacityTransferFunction = 'PiecewiseFunction' - -# show data in view -resMP_00000Display = Show(resMP_00000, renderView1) -# trace defaults for the display properties. -resMP_00000Display.ColorArrayName = [None, ''] -resMP_00000Display.OSPRayScaleArray = 'Mass' -resMP_00000Display.OSPRayScaleFunction = 'PiecewiseFunction' -resMP_00000Display.SelectOrientationVectors = 'Mass' -resMP_00000Display.ScaleFactor = 0.04545450210571289 -resMP_00000Display.SelectScaleArray = 'Mass' -resMP_00000Display.GlyphType = 'Arrow' -resMP_00000Display.ScalarOpacityUnitDistance = 0.07157227916349206 -resMP_00000Display.GaussianRadius = 0.022727251052856445 -resMP_00000Display.SetScaleArray = ['POINTS', 'Mass'] -resMP_00000Display.ScaleTransferFunction = 'PiecewiseFunction' -resMP_00000Display.OpacityArray = ['POINTS', 'Mass'] -resMP_00000Display.OpacityTransferFunction = 'PiecewiseFunction' - -# set active source -SetActiveSource(gridvts) - -# change representation type -gridvtsDisplay.SetRepresentationType('Wireframe') - - -# Properties modified on gridvtsDisplay -gridvtsDisplay.Opacity = 0.2 - -# set active source -SetActiveSource(resFP_00000) - -# change representation type -resFP_00000Display.SetRepresentationType('Points') - -# Properties modified on resFP_00000Display -resFP_00000Display.PointSize = 5.0 - -# set active source -SetActiveSource(resMP_00000) - -# create a new 'Glyph' -glyph1 = Glyph(Input=resMP_00000, GlyphType='Sphere') -glyph1.Scalars = ['POINTS', 'Smoothing length'] -glyph1.Vectors = ['POINTS', 'None'] -glyph1.ScaleMode = 'scalar' -glyph1.ScaleFactor = 1.0 -glyph1.GlyphTransform = 'Transform2' -glyph1.GlyphMode = 'All Points' - - - -# get color transfer function/color map for 'Smoothinglength' -smoothinglengthLUT = GetColorTransferFunction('Smoothinglength') - -# show data in view -glyph1Display = Show(glyph1, renderView1) -# trace defaults for the display properties. -glyph1Display.ColorArrayName = ['POINTS', 'Smoothing length'] -glyph1Display.LookupTable = smoothinglengthLUT -glyph1Display.OSPRayScaleArray = 'Smoothing length' -glyph1Display.OSPRayScaleFunction = 'PiecewiseFunction' -glyph1Display.SelectOrientationVectors = 'Mass' -glyph1Display.ScaleFactor = 0.051454496383666996 -glyph1Display.SelectScaleArray = 'Smoothing length' -glyph1Display.GlyphType = 'Arrow' -glyph1Display.GaussianRadius = 0.025727248191833498 -glyph1Display.SetScaleArray = ['POINTS', 'Smoothing length'] -glyph1Display.ScaleTransferFunction = 'PiecewiseFunction' -glyph1Display.OpacityArray = ['POINTS', 'Smoothing length'] -glyph1Display.OpacityTransferFunction = 'PiecewiseFunction' - -# show color bar/color legend -glyph1Display.SetScalarBarVisibility(renderView1, True) - -# get opacity transfer function/opacity map for 'Smoothinglength' -smoothinglengthPWF = GetOpacityTransferFunction('Smoothinglength') - -# hide data in view -Hide(resMP_00000, renderView1) - -# set scalar coloring -ColorBy(glyph1Display, ('POINTS', 'Velocity')) - -# Hide the scalar bar for this color map if no visible data is colored by it. -HideScalarBarIfNotNeeded(smoothinglengthLUT, renderView1) - -# rescale color and/or opacity maps used to include current data range -glyph1Display.RescaleTransferFunctionToDataRange(True, False) - -# show color bar/color legend -glyph1Display.SetScalarBarVisibility(renderView1, True) - - -#### saving camera placements for all active views - -# current camera placement for renderView1 -renderView1.CameraPosition = [2.242394659003803, -5.320849062052243, 2.8132656553463735] -renderView1.CameraFocalPoint = [1.0000000000000002, 0.9999999999999994, 0.9999999999999989] -renderView1.CameraViewUp = [-0.2489518711661434, 0.22153968976360192, 0.9428378077391271] -renderView1.CameraParallelScale = 1.7320508075688772 - -#### uncomment the following to render all views -RenderAllViews() -# alternatively, if you want to write images, you can use SaveScreenshot(...). \ No newline at end of file diff --git a/sph/matlab/interp.m b/sph/matlab/interp.m deleted file mode 100644 index 4e1b3f06..00000000 --- a/sph/matlab/interp.m +++ /dev/null @@ -1,72 +0,0 @@ - -function interp() - close all; clear all; - - % plot M4 spline kernel - x=linspace(-3,3,100); - figure; - h=0.5; - plot(x,m4spline(x,h)); - hold on - plot(x,gausskernel(x,h)); - grid; - xlabel('x') - ylabel('kernel') - legend('M4 spline', 'gaussian') - - % verify that int W = 1 - %integral(@(x)m4spline(x,h),-3*h,3*h) - integral(@(x)gausskernel(x,h),-Inf,Inf) - - % plot a sin and the approximate fct - x=linspace(1,10,200); - y=myfun(x); - - figure; - plot(x,y); - xlabel('x') - grid; - hold on; - h=2; - plot(x,approx(x,h)) - h=0.5; - plot(x,approx(x,h)) - legend('exact','h=2','h=0.5'); - -end - -function y=myfun(x) - %y=(x-5).^2/10; - y=sin(x); -end - - -function v=m4spline(x,h) - r=abs(x)/h; - i1=find(r<1); - i2=find(r>=1 & r<2); - v=zeros(size(r)); - v(i1) = (((2-r(i1)).^3)-4*((1-r(i1)).^3))/6; - v(i2) = ((2-r(i2)).^3)/6; - v=v/h; -end - -function v=gausskernel(x,h) - v = exp(-(x.*x)/(h^2))/(pi^(1/2)*h); % 1D -end - - -function v=approx(x,h) - f = @(xp,c) m4spline(c-xp, h).*myfun(xp); - %f = @(xp,c) gausskernel(c-xp, h).*myfun(xp); - - - for i=1:length(x) - v(i) = integral(@(xp)f(xp,x(i)),x(i)-3*h,x(i)+3*h); - end -end - - - - - \ No newline at end of file diff --git a/sph/src/CMakeLists.txt b/sph/src/CMakeLists.txt deleted file mode 100644 index becbe3e1..00000000 --- a/sph/src/CMakeLists.txt +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright 2020 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# CMake input file of sph.so - -FILE(GLOB SRCS *.h *.cpp *.inl *.hpp) - -ADD_LIBRARY(sph SHARED ${SRCS}) -MACRO_DebugPostfix(sph) - -TARGET_INCLUDE_DIRECTORIES(sph PUBLIC ${PROJECT_SOURCE_DIR}/sph/src) - -TARGET_LINK_LIBRARIES(sph tbox fwk) - -SOURCE_GROUP(base REGULAR_EXPRESSION ".*\\.(cpp|inl|hpp|h)") diff --git a/sph/src/sph.h b/sph/src/sph.h deleted file mode 100644 index 567ecf58..00000000 --- a/sph/src/sph.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// global header of the sph module - -#ifndef SPH_H -#define SPH_H - -#if defined(WIN32) -#ifdef sph_EXPORTS -#define SPH_API __declspec(dllexport) -#else -#define SPH_API __declspec(dllimport) -#endif -#else -#define SPH_API -#endif - -#include "tbox.h" -#include <math.h> - -namespace sph -{ -class Dofs; -class Problem; -class Particle; -class FixedParticle; -class MobileParticle; -class EqState; -class IdealGas; -class QIncFluid; -class Kernel; -class CubicSplineKernel; -class QuadraticKernel; -class QuinticSplineKernel; -class DisplayHook; -} // namespace sph - -#endif //SPH_H diff --git a/sph/src/wDisplayHook.cpp b/sph/src/wDisplayHook.cpp deleted file mode 100644 index c27f6b9b..00000000 --- a/sph/src/wDisplayHook.cpp +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wDisplayHook.h" -using namespace sph; - -DisplayHook::DisplayHook() -{ -} - -void DisplayHook::display(int nt, double t, std::vector<double> &u) -{ - std::cout << "DisplayHook::display()\n"; -} - -void DisplayHook::refresh() -{ - std::cout << "DisplayHook::refresh()\n"; -} diff --git a/sph/src/wDisplayHook.h b/sph/src/wDisplayHook.h deleted file mode 100644 index 7489d09e..00000000 --- a/sph/src/wDisplayHook.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WDISPLAYHOOK_H -#define WDISPLAYHOOK_H - -#include "sph.h" -#include "wObject.h" -#include <vector> - -namespace sph -{ - -/** - * @brief Dispay Hook - links with the python GUI - */ - -class SPH_API DisplayHook : public fwk::wObject -{ -public: - DisplayHook(); - virtual void display(int nt, double t, std::vector<double> &u); - virtual void refresh(); -}; - -} // namespace sph - -#endif //WDISPLAYHOOK_H diff --git a/sph/src/wDofs.cpp b/sph/src/wDofs.cpp deleted file mode 100644 index 65e2fd0e..00000000 --- a/sph/src/wDofs.cpp +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wDofs.h" -using namespace sph; - -namespace sph -{ -SPH_API std::ostream & -operator<<(std::ostream &out, Dofs const &obj) -{ - out << "x=" << obj.x.transpose() << " v=" << obj.u.transpose() << " rho=" << obj.rho; - return out; -} -} // namespace sph diff --git a/sph/src/wDofs.h b/sph/src/wDofs.h deleted file mode 100644 index d86af3e4..00000000 --- a/sph/src/wDofs.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WDOFS_H -#define WDOFS_H - -#include "sph.h" -#include <iostream> -#include <vector> -#include <Eigen/Core> - -namespace sph -{ - -/** - * @brief independant variables of the problem - */ - -class SPH_API Dofs -{ -public: - Eigen::Vector3d x; //< position - Eigen::Vector3d u; //< velocity - double rho; //< density - Dofs(Eigen::Vector3d const &_x, Eigen::Vector3d const &_u, double _rho) : x(_x), u(_u), rho(_rho) {} - -#ifndef SWIG - friend SPH_API std::ostream &operator<<(std::ostream &out, Dofs const &obj); -#endif -}; - -} // namespace sph - -#endif //WDOFS_H diff --git a/sph/src/wEigenTest.cpp b/sph/src/wEigenTest.cpp deleted file mode 100644 index 0ec8bcec..00000000 --- a/sph/src/wEigenTest.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wEigenTest.h" -#include <Eigen/Eigen> -#include <iostream> - -using namespace sph; -using namespace Eigen; -void EigenTest::test1() -{ - Matrix4f A = Matrix4f::Random(); - std::cout << A << std::endl; -} diff --git a/sph/src/wEigenTest.h b/sph/src/wEigenTest.h deleted file mode 100644 index c8bf5d3f..00000000 --- a/sph/src/wEigenTest.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WEIGENTEST_H -#define WEIGENTEST_H - -#include "sph.h" - -namespace sph -{ - -/** - * @brief test of the Eigen library - */ - -class SPH_API EigenTest -{ -public: - EigenTest() {} - - void test1(); -}; - -} // namespace sph - -#endif //WEIGENTEST_H diff --git a/sph/src/wEqState.cpp b/sph/src/wEqState.cpp deleted file mode 100644 index 0fb78e33..00000000 --- a/sph/src/wEqState.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wEqState.h" -using namespace sph; - -EqState::EqState() -{ -} - -EqState::~EqState() -{ -} - -void EqState::write(std::ostream &out) const -{ - out << "sph::EqState"; -} - -// -------------------------------------------------------- - -IdealGas::IdealGas() -{ -} - -IdealGas::~IdealGas() -{ - std::cout << "~IdealGas()\n"; -} - -void IdealGas::write(std::ostream &out) const -{ - out << "sph::IdealGas"; -} - -// -------------------------------------------------------- - -QIncFluid::QIncFluid() -{ -} - -QIncFluid::~QIncFluid() -{ - std::cout << "~QIncFluid()\n"; -} - -void QIncFluid::write(std::ostream &out) const -{ - out << "sph::QIncFluid"; -} diff --git a/sph/src/wEqState.h b/sph/src/wEqState.h deleted file mode 100644 index a4a19b24..00000000 --- a/sph/src/wEqState.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WEQSTATE_H -#define WEQSTATE_H - -#include "sph.h" -#include "wObject.h" -#include <iostream> -#include <vector> -#include <memory> - -namespace sph -{ - -/** - * @brief Virtual class for Equations of state - */ - -class SPH_API EqState : public fwk::wSharedObject -{ -public: - EqState(); - virtual ~EqState(); - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -/** - * @brief Ideal gas - */ - -class SPH_API IdealGas : public EqState -{ -public: - IdealGas(); - virtual ~IdealGas(); - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -/** - * @brief Quasi incompressible fluid - */ - -class SPH_API QIncFluid : public EqState -{ -public: - QIncFluid(); - virtual ~QIncFluid(); - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -} // namespace sph - -#endif //WEQSTATE_H diff --git a/sph/src/wKernel.cpp b/sph/src/wKernel.cpp deleted file mode 100644 index fc8129c2..00000000 --- a/sph/src/wKernel.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wKernel.h" -using namespace sph; - -Kernel::Kernel() -{ -} - -Kernel::~Kernel() -{ -} - -void Kernel::write(std::ostream &out) const -{ - out << "sph::Kernel"; -} - -// ----------------------------------------------------------- - -CubicSplineKernel::CubicSplineKernel() : Kernel() -{ -} - -CubicSplineKernel::~CubicSplineKernel() -{ - std::cout << "~CubicSplineKernel()\n"; -} - -void CubicSplineKernel::write(std::ostream &out) const -{ - out << "sph::CubicSplineKernel"; -} - -double -CubicSplineKernel::value(double r, double h) const -{ - double h2 = h * h; - double h3 = h2 * h; - double alphad = 3.0 / (2.0 * M_PI * h3); - double rh = r / h; - - if (rh < 1.0) - return alphad * (3.0 / 2.0 - rh * rh + 0.5 * rh * rh * rh); - else if (rh < 2.0) - return alphad * (1.0 / 6.0 * pow(1.0 - rh, 3)); - else - return 0.0; -} - -double -CubicSplineKernel::grad(double r, double h) const -{ - double h2 = h * h; - double h3 = h2 * h; - double alphad = 3.0 / (2.0 * M_PI * h3); - double rh = r / h; - - if (rh < 1.0) - return alphad / h * (3.0 / 2.0 * rh * rh - 2.0 * rh); - else if (rh < 2.0) - return alphad / h * (-0.5 * (2.0 - rh) * (2.0 - rh)); - else - return 0.0; -} - -// ----------------------------------------------------------- - -QuadraticKernel::QuadraticKernel() : Kernel() -{ -} - -QuadraticKernel::~QuadraticKernel() -{ - std::cout << "~QuadraticKernel()\n"; -} - -void QuadraticKernel::write(std::ostream &out) const -{ - out << "sph::QuadraticKernel"; -} - -double -QuadraticKernel::value(double r, double h) const -{ - double h2 = h * h; - double h3 = h2 * h; - double alphad = 5.0 / (4.0 * M_PI * h3); - double rh = r / h; - - if (rh < 2.0) - return alphad * (3.0 / 16.0 * rh * rh - 3.0 / 4.0 * rh + 3.0 / 4.0); - else - return 0.0; -} - -double -QuadraticKernel::grad(double r, double h) const -{ - double h2 = h * h; - double h3 = h2 * h; - double alphad = 5.0 / (4.0 * M_PI * h3); - double rh = r / h; - - if (rh < 2.0) - return alphad / h * (3.0 / 8.0 * rh - 3.0 / 4.0); - else - return 0.0; -} - -// ----------------------------------------------------------- - -QuinticSplineKernel::QuinticSplineKernel() : Kernel() -{ -} - -QuinticSplineKernel::~QuinticSplineKernel() -{ - std::cout << "~QuinticSplineKernel()\n"; -} - -void QuinticSplineKernel::write(std::ostream &out) const -{ - out << "sph::QuinticSplineKernel"; -} - -double -QuinticSplineKernel::value(double r, double h) const -{ - double h2 = h * h; - double h3 = h2 * h; - double alphad = 3.0 / (359.0 * M_PI * h3); - double rh = r / h; - - if (rh < 1.0) - return alphad * (pow(3.0 - rh, 5) - 6.0 * pow(2.0 - rh, 5) + 15.0 * pow(1.0 - rh, 5)); - else if (rh < 2.0) - return alphad * (pow(3.0 - rh, 5) - 6.0 * pow(2.0 - rh, 5)); - else if (rh < 3.0) - return alphad * (pow(3.0 - rh, 5)); - else - return 0.0; -} - -double -QuinticSplineKernel::grad(double r, double h) const -{ - double h2 = h * h; - double h3 = h2 * h; - double alphad = 3.0 / (359.0 * M_PI * h3); - double rh = r / h; - - if (rh < 1.0) - return alphad / h * (-5.0 * pow(3.0 - rh, 4) + 30.0 * pow(2.0 - rh, 4) - 75.0 * pow(1.0 - rh, 4)); - else if (rh < 2.0) - return alphad / h * (-5.0 * pow(3.0 - rh, 4) + 30.0 * pow(2.0 - rh, 4)); - else if (rh < 3.0) - return alphad / h * (-5.0 * pow(3.0 - rh, 4)); - else - return 0.0; -} diff --git a/sph/src/wKernel.h b/sph/src/wKernel.h deleted file mode 100644 index aed4e0b9..00000000 --- a/sph/src/wKernel.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WKERNEL_H -#define WKERNEL_H - -#include "sph.h" -#include "wObject.h" -#include <iostream> -#include <vector> -#include <memory> - -namespace sph -{ - -/** - * @brief virtual Kernel class - */ - -class SPH_API Kernel : public fwk::wSharedObject -{ -public: - Kernel(); - virtual ~Kernel(); - virtual double kappa() const = 0; - - virtual double value(double r, double h) const = 0; - virtual double grad(double r, double h) const = 0; - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -/** - * @brief Cubic spline kernel - */ - -class SPH_API CubicSplineKernel : public Kernel -{ -public: - CubicSplineKernel(); - virtual ~CubicSplineKernel(); - virtual double kappa() const override { return 2.0; } - virtual double value(double r, double h) const override; - virtual double grad(double r, double h) const override; - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -/** - * @brief Quadratic kernel - */ - -class SPH_API QuadraticKernel : public Kernel -{ -public: - QuadraticKernel(); - virtual ~QuadraticKernel(); - virtual double kappa() const override { return 2.0; } - virtual double value(double r, double h) const override; - virtual double grad(double r, double h) const override; - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -/** - * @brief Quintic spline kernel - */ - -class SPH_API QuinticSplineKernel : public Kernel -{ -public: - QuinticSplineKernel(); - virtual ~QuinticSplineKernel(); - virtual double kappa() const override { return 3.0; } - virtual double value(double r, double h) const override; - virtual double grad(double r, double h) const override; - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -} // namespace sph - -#endif //WKERNEL_H diff --git a/sph/src/wParticle.cpp b/sph/src/wParticle.cpp deleted file mode 100644 index 20841401..00000000 --- a/sph/src/wParticle.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wParticle.h" -#include "wDofs.h" -using namespace sph; - -Particle::Particle(int _no, Dofs const &_dofs) : no(_no) -{ - dofs.push_back(new Dofs(_dofs)); -} - -Particle::~Particle() -{ - std::cout << "~Particle()\n"; - for (auto d : dofs) - delete d; -} - -void Particle::write(std::ostream &out) const -{ - out << "p#" << no; -} - -// ------------------------------------------------------------------------ - -FixedParticle::FixedParticle(int _no, Dofs const &_dofs) : Particle(_no, _dofs) -{ -} - -FixedParticle::~FixedParticle() -{ -} - -void FixedParticle::write(std::ostream &out) const -{ - out << "pF#" << no; -} - -// ------------------------------------------------------------------------ - -MobileParticle::MobileParticle(int _no, Dofs const &_dofs) : Particle(_no, _dofs) -{ -} - -MobileParticle::~MobileParticle() -{ -} - -void MobileParticle::write(std::ostream &out) const -{ - out << "pM#" << no; -} diff --git a/sph/src/wParticle.h b/sph/src/wParticle.h deleted file mode 100644 index f0c0ba11..00000000 --- a/sph/src/wParticle.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WPARTICLE_H -#define WPARTICLE_H - -#include "sph.h" -#include "wObject.h" -#include <iostream> -#include <vector> -#include <memory> - -using namespace tbox; - -namespace sph -{ - -/** - * @brief a particle - */ - -class SPH_API Particle : public fwk::wObject -{ -public: - int no; //< label (debug/visu) - std::vector<Dofs *> dofs; //< variables that are time integrated - double p; //< pressure - double c; //< speed of sound - std::vector<Particle *> neighs; //< list of neighbours - -public: - Particle(int _no, Dofs const &_dofs); - virtual ~Particle(); - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -/** - * @brief Fixed particle - */ - -class SPH_API FixedParticle : public Particle -{ -public: - FixedParticle(int _no, Dofs const &_dofs); - virtual ~FixedParticle(); - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -/** - * @brief Mobile particle - */ - -class SPH_API MobileParticle : public Particle -{ -public: - MobileParticle(int _no, Dofs const &_dofs); - virtual ~MobileParticle(); - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -} // namespace sph - -#endif //WPARTICLE_H diff --git a/sph/src/wProblem.cpp b/sph/src/wProblem.cpp deleted file mode 100644 index 96f54c16..00000000 --- a/sph/src/wProblem.cpp +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wProblem.h" -#include "wParticle.h" -using namespace sph; - -Problem::Problem(double _h) : h(_h) -{ -} - -Problem::~Problem() -{ - std::cout << "~Problem()\n"; -} - -void Problem::write(std::ostream &out) const -{ - out << "sph::Problem:\n"; - out << "\t" << prts.size() << " particles"; -} - -void Problem::addFixedP(int no, Dofs const &dof) -{ - prts.push_back(new FixedParticle(no, dof)); -} - -void Problem::addMobileP(int no, Dofs const &dof) -{ - prts.push_back(new MobileParticle(no, dof)); -} diff --git a/sph/src/wProblem.h b/sph/src/wProblem.h deleted file mode 100644 index d57a9823..00000000 --- a/sph/src/wProblem.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WPROBLEM_H -#define WPROBLEM_H - -#include "sph.h" -#include "wObject.h" -#include <iostream> -#include <vector> -#include <memory> - -namespace sph -{ - -/** - * @brief main sph Problem object - */ - -class SPH_API Problem : public fwk::wSharedObject -{ -public: - std::vector<Particle *> prts; //< set containing all the particles - double h; //< smoothing length (same for all particles) but may vary with time - - Problem(double _h); - virtual ~Problem(); - - // -- add particles to the problem - void addFixedP(int no, Dofs const &dof); - void addMobileP(int no, Dofs const &dof); - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -} // namespace sph - -#endif //WPROBLEM_H diff --git a/sph/src/wSorter.cpp b/sph/src/wSorter.cpp deleted file mode 100644 index 6de12df9..00000000 --- a/sph/src/wSorter.cpp +++ /dev/null @@ -1,205 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wSorter.h" -#include "wKernel.h" -#include "wParticle.h" -#include "wDofs.h" -#include <algorithm> -#include <sstream> -#include <exception> -#include <tbb/parallel_for.h> -using namespace sph; - -Sorter::Sorter() : nthreads(1) -{ -} - -Sorter::~Sorter() -{ -} - -void Sorter::write(std::ostream &out) const -{ - out << "sph::Sorter"; -} - -// ------------------------------------ - -LouisSorter::LouisSorter(double _edgeL, double _hmax, Kernel const &kernel) : edgeL(_edgeL), hmax(_hmax) -{ - kappa = kernel.kappa(); - ncells = std::max(int(edgeL / (hmax * kappa)), 1); -} - -LouisSorter::~LouisSorter() -{ - std::cout << "~LouisSorter()\n"; -} - -void LouisSorter::write(std::ostream &out) const -{ - out << "sph::LouisSorter:\n"; - out << "\tedgeL = " << edgeL << '\n'; - out << "\thmax = " << hmax << '\n'; - out << "\tncells = " << ncells << 'x' << ncells << 'x' << ncells; -} - -void LouisSorter::execute(std::vector<Particle *> &prts, int step) -{ - // alloc if required - if (sgrid.empty()) - sgrid.resize(ncells * ncells * ncells); - else - for (auto &l : sgrid) - l.clear(); - - // fills the grid - for (auto p : prts) - { - Eigen::Vector3d &x = p->dofs[step]->x; - int ii[3]; - for (int i = 0; i < 3; ++i) - { - int id = int((x(i) / edgeL) * ncells); - if (id < 0) - id = 0; - if (id >= ncells) - id = ncells - 1; - ii[i] = id; - } - sgrid[idx(ii[0], ii[1], ii[2])].push_back(p); - } - - // fills neighbours - double Rmax = (hmax * kappa); - double R2max = Rmax * Rmax; - - for (auto p : prts) - { - p->neighs.clear(); - Eigen::Vector3d &x = p->dofs[step]->x; - int binf[3], bsup[3]; - for (int i = 0; i < 3; ++i) - { - int id = int((x(i) / edgeL) * ncells); - if (id < 0) - id = 0; - if (id >= ncells) - id = ncells - 1; - binf[i] = decidx(id); - bsup[i] = incidx(id); - } - for (int i = binf[0]; i <= bsup[0]; ++i) - for (int j = binf[1]; j <= bsup[1]; ++j) - for (int k = binf[2]; k <= bsup[2]; ++k) - for (auto pn : sgrid[idx(i, j, k)]) - if (pn != p) - { - Eigen::Vector3d &xn = pn->dofs[step]->x; - double R2 = (xn - x).squaredNorm(); - if (R2 <= R2max) - p->neighs.push_back(pn); - } - } -} - -void LouisSorter::chkidx(int i, int j, int k) const -{ - if (i < 0 || i >= ncells || j < 0 || j >= ncells || k < 0 || k >= ncells) - { - std::stringstream str; - str << "LouisSorter:: bad index (" << i << "," << j << "," << k << ") [ncells=" << ncells << "]!"; - throw std::runtime_error(str.str()); - } -} - -// ------------------------------------ - -BruteForceSorter::BruteForceSorter(double _hmax, Kernel const &kernel) : hmax(_hmax) -{ - kappa = kernel.kappa(); - method = 1; -} - -BruteForceSorter::~BruteForceSorter() -{ - std::cout << "~BruteForceSorter()\n"; -} - -void BruteForceSorter::write(std::ostream &out) const -{ - out << "sph::BruteForceSorter:\n"; - out << "\thmax = " << hmax << '\n'; -} - -void BruteForceSorter::execute(std::vector<Particle *> &prts, int step) -{ - for (auto p : prts) - p->neighs.clear(); - //p->neighs.reserve(100); // change rien - - double Rmax = (hmax * kappa); - double R2max = Rmax * Rmax; - - if (method == 1) - { - std::cout << "using serial code\n"; - for (auto it = prts.begin(); (it + 1) != prts.end(); ++it) - { - Particle *p = *it; - Eigen::Vector3d &x = p->dofs[step]->x; - for (auto it2 = it + 1; it2 != prts.end(); ++it2) - { - Particle *pn = *it2; - Eigen::Vector3d &xn = pn->dofs[step]->x; - double R2 = (xn - x).squaredNorm(); - if (R2 <= R2max) - { - p->neighs.push_back(pn); - pn->neighs.push_back(p); - } - } - } - } - else //if(method==2) - { - std::cout << "using parallel code with " << nthreads << " threads\n"; - // (NAIVE) PARALLEL CODE - - int grainsize = 200; - tbb::parallel_for( - tbb::blocked_range<size_t>(0, prts.size(), grainsize), - [=](tbb::blocked_range<size_t> &r) { - //std::cout << r.size() << '\n'; - for (size_t i = r.begin(); i < r.end(); ++i) - { - Particle *p = prts[i]; - Eigen::Vector3d &x = p->dofs[step]->x; - //Eigen::Vector3d x = p->dofs[step]->x; - for (auto it2 = prts.begin(); it2 != prts.end(); ++it2) - { - Particle *pn = *it2; - Eigen::Vector3d &xn = pn->dofs[step]->x; - double R2 = (xn - x).squaredNorm(); - if (R2 <= R2max) - p->neighs.push_back(pn); - } - } - }, - tbb::simple_partitioner()); - } -} diff --git a/sph/src/wSorter.h b/sph/src/wSorter.h deleted file mode 100644 index c249c6f9..00000000 --- a/sph/src/wSorter.h +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WSORTER_H -#define WSORTER_H - -#include "sph.h" -#include "wObject.h" -#include <iostream> -#include <vector> -#include <memory> - -namespace sph -{ - -/** - * @brief Nearest neighbour search - */ - -class SPH_API Sorter : public fwk::wSharedObject -{ -public: - int nthreads; //< nb of threads - - Sorter(); - virtual ~Sorter(); - - virtual void execute(std::vector<Particle *> &parts, int step = 0) = 0; -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -/** - * @brief Louis'method: particles are sorted in a cubic structured grid - * between (x,y,z)=(0,0,0) and (x,y,z)=(edgeL,edgeL,edgeL) - */ - -class SPH_API LouisSorter : public Sorter -{ - std::vector<std::vector<Particle *>> sgrid; //< structured grid - double kappa; - -public: - double edgeL; //< length of the cube edge - double hmax; //< expected max smothing length used to calculate the number of elements in the sgrid - int ncells; //< number of cells along 1 edge - - LouisSorter(double _edgeL, double _hmax, Kernel const &kernel); - virtual ~LouisSorter(); - virtual void execute(std::vector<Particle *> &prts, int step = 0) override; - - // debug (only) - size_t nbprts(int i, int j, int k) const - { - chkidx(i, j, k); - return sgrid[idx(i, j, k)].size(); - } - std::vector<Particle *> &getParticles(int i, int j, int k) - { - chkidx(i, j, k); - return sgrid[idx(i, j, k)]; - } - int size() const { return ncells; } -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -private: - int idx(int i, int j, int k) const { return ncells * (ncells * i + j) + k; } - void chkidx(int i, int j, int k) const; - int incidx(int id) const - { - ++id; - if (id >= ncells) - id = ncells - 1; - return id; - } - int decidx(int id) const - { - --id; - if (id < 0) - id = 0; - return id; - } -}; - -/** - * @brief Brute force neighbour search (used for comparison) - */ - -class SPH_API BruteForceSorter : public Sorter -{ - double kappa; - -public: - double hmax; //< expected max smothing length used to calculate the number of elements in the sgrid - int method; - - BruteForceSorter(double _hmax, Kernel const &kernel); - virtual ~BruteForceSorter(); - virtual void execute(std::vector<Particle *> &prts, int step = 0) override; - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -} // namespace sph - -#endif //WSORTER_H diff --git a/sph/src/wTimeIntegration.cpp b/sph/src/wTimeIntegration.cpp deleted file mode 100644 index 39723352..00000000 --- a/sph/src/wTimeIntegration.cpp +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "wTimeIntegration.h" -using namespace sph; - -TimeIntegration::TimeIntegration() -{ -} - -TimeIntegration::~TimeIntegration() -{ - std::cout << "~TimeIntegration()\n"; -} - -void TimeIntegration::write(std::ostream &out) const -{ - out << "sph::TimeIntegration"; -} diff --git a/sph/src/wTimeIntegration.h b/sph/src/wTimeIntegration.h deleted file mode 100644 index a07b7cfd..00000000 --- a/sph/src/wTimeIntegration.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2020 University of Liège - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef WTIMEINTEGRATION_H -#define WTIMEINTEGRATION_H - -#include "sph.h" -#include "wObject.h" -#include <iostream> -#include <vector> -#include <memory> - -namespace sph -{ - -/** - * @brief main sph TimeIntegration object - */ - -class SPH_API TimeIntegration : public fwk::wObject -{ -public: - TimeIntegration(); - virtual ~TimeIntegration(); - -#ifndef SWIG - virtual void write(std::ostream &out) const override; -#endif -}; - -} // namespace sph - -#endif //WTIMEINTEGRATION_H diff --git a/sph/tests/eigentest.py b/sph/tests/eigentest.py deleted file mode 100644 index bf5f33b8..00000000 --- a/sph/tests/eigentest.py +++ /dev/null @@ -1,22 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2020 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import sph - - -sph.EigenTest().test1() diff --git a/sph/tests/neighbours.py b/sph/tests/neighbours.py deleted file mode 100644 index c95e6399..00000000 --- a/sph/tests/neighbours.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2020 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import sph -from tbox import Vector3d -from fwk import Timer - - -def saveNeighbours(pbl, fname): - print('saving results to %s...' % fname) - f = open(fname,'w') - for p in pbl.prts: - nos=[] - for pn in p.neighs: - nos.append(pn.no) - f.write( ' p#%d (%d): ' % (p.no, len(p.neighs))) - for no in sorted(nos): - f.write( '%d,' % no) - f.write('\n') - f.close() - - -def printLouisGrid(sorter): - for i in range(sorter.size()): - for j in range(sorter.size()): - for k in range(sorter.size()): - prts = sorter.getParticles(i,j,k) - if len(prts)!=0: - print("(i,l,k)=(%d,%d,%d) nbprts=%d" % (i,j,k,len(prts))) -# - - -boxL = 2. -Lfloor = 0.7 -Lwater = 0.5 -sep = 0.015 -rho = 1000.0 -h0 = 1.2*sep - - -pbl = sph.Problem(h0) - -# generate a set of particles - -import sph.genp as genp -no=0 - -cube = genp.Cube( o=(((boxL-Lwater)/2),((boxL-Lwater)/2), ((boxL)/2)+0.5), L=(Lwater,Lwater,Lwater), s=sep) -for p in cube.generate(): - no+=1 - pbl.addMobileP(no, sph.Dofs(Vector3d(p[0], p[1], p[2]), Vector3d(0.0, 0.0, 0.0), rho)) - -print(pbl) - -# kernel - -kernel = sph.CubicSplineKernel() -print(kernel) - - -# sorter - -timer = Timer(); timer.start() -sorter = sph.LouisSorter(boxL, h0, kernel) -print(sorter) -sorter.execute(pbl.prts) -timer.stop(); print(timer) -#saveNeighbours(pbl, 'louissorter.txt') - -timer = Timer(); timer.start() -sorter = sph.BruteForceSorter(h0, kernel) -sorter.method = 2 -sorter.nthreads = 6 -print(sorter) -sorter.execute(pbl.prts) -timer.stop(); print(timer) -#saveNeighbours(pbl, 'bruteforcesorter.txt') diff --git a/sph/tests/sandbox.py b/sph/tests/sandbox.py deleted file mode 100644 index da1853ea..00000000 --- a/sph/tests/sandbox.py +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# Copyright 2020 University of Liège -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import sph -from tbox import Vector3d -from fwk import Timer - - -# test dofs -- -d1 = sph.Dofs(Vector3d(0,0,0), Vector3d(0,0,0), 0.0) -d2 = sph.Dofs(Vector3d(1,1,1), Vector3d(0,0,0), 0.0) -print("dof1:", d1) -print("dof2:", d2) - -# - - -boxL = 2. -Lfloor = 0.7 -Lwater = 0.5 -sep = 0.05 -rho = 1000.0 -h0 = 1.2*sep - - -pbl = sph.Problem(h0) -print(pbl) - -# generate a set of particles - -import sph.genp as genp - -no=0 -# mobile particles -cube = genp.Cube( o=(((boxL-Lwater)/2),((boxL-Lwater)/2), ((boxL)/2)+0.5), L=(Lwater,Lwater,Lwater), s=sep) -for p in cube.generate(): - no+=1 - pbl.addMobileP(no, sph.Dofs(Vector3d(p[0], p[1], p[2]), Vector3d(0.0, 0.0, 0.0), rho)) - - -# fixed particles - -plane = genp.Cube( o=(((boxL-Lfloor)/2),((boxL-Lfloor)/2), (boxL/2)), L=(Lfloor,Lfloor,sep), s=sep) -for p in plane.generate(): - no+=1 - pbl.addMobileP(no, sph.Dofs(Vector3d(p[0], p[1], p[2]), Vector3d(0.0, 0.0, 0.0), rho)) - -plane = genp.Cube( o=(0,0,0), L=(boxL,boxL,sep), s=sep) -for p in plane.generate(): - no+=1 - pbl.addMobileP(no, sph.Dofs(Vector3d(p[0], p[1], p[2]), Vector3d(0.0, 0.0, 0.0), rho)) - -print(pbl) - -# kernel - -kernel = sph.CubicSplineKernel() -print(kernel) - - -# sorter - -timer = Timer(); timer.start() -sorter = sph.LouisSorter(boxL, h0, kernel) -sorter.execute(pbl.prts) -timer.stop(); print(timer) - -print(sorter) - -if 0: - for i in range(sorter.size()): - for j in range(sorter.size()): - for k in range(sorter.size()): - prts = sorter.getParticles(i,j,k) - if len(prts)!=0: - print("(i,l,k)=(%d,%d,%d) nbprts=%d" % (i,j,k,len(prts))) - -def saveNeighbours(pbl, fname): - f = open(fname,'w') - for p in pbl.prts: - nos=[] - for pn in p.neighs: - nos.append(pn.no) - f.write( ' p#%d (%d): ' % (p.no, len(p.neighs))) - for no in sorted(nos): - f.write( '%d,' % no) - f.write('\n') - f.close() - print('%s saved to disk' % fname) - -saveNeighbours(pbl, 'louissorter.txt') - -timer = Timer(); timer.start() -sorter = sph.BruteForceSorter(h0, kernel) -sorter.execute(pbl.prts) -timer.stop(); print(timer) - - -print(sorter) - -saveNeighbours(pbl, 'bruteforcesorter.txt') -- GitLab