diff --git a/HySoP/CMake/ParmesTests.cmake b/HySoP/CMake/ParmesTests.cmake index 5888dad433261f14c4f2f71db1576bef6c5efeac..91effc0c932e51020e205be86410eab7d5b4d622 100644 --- a/HySoP/CMake/ParmesTests.cmake +++ b/HySoP/CMake/ParmesTests.cmake @@ -3,15 +3,13 @@ enable_testing() find_python_module(pytest REQUIRED) -# --- We create a new test for each test_XXX.py found in each directory (i.e. module) of parmepy --- +# --- We create a new test for each test_XXX.py found in each directory (i.e. module) of parmepy listed below --- set(py_src_dirs fields domain #operator problem - tools - numerics ) if(USE_MPI) @@ -29,32 +27,22 @@ endif() # file(GLOB_RECURSE py_test_files "${test_dir}" RELATIVE_PATH parmepy/*/test_*.py) # endforeach() -## Build a list of test_*.py files recursively for each directory of parmepy/${py_src_dirs} +## Build a list of test_*.py files for each directory of parmepy/${py_src_dirs} set(py_test_files) foreach(testdir ${py_src_dirs}) - file(GLOB_RECURSE testfiles - RELATIVE ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/parmepy/${testdir}/test_*.py) - set(py_test_files - ${py_test_files} ${testfiles}) + file(GLOB testfiles parmepy/${testdir}/tests/test_*.py) + set(py_test_files ${py_test_files} ${testfiles}) endforeach() - ## Handling doctest in *.py files recursively for each directory of parmepy/${py_src_dirs} ## that names are not __init__ or test_ and that contains '>>>' set(py_doctest_files) foreach(testdir ${py_src_dirs}) - file(GLOB_RECURSE testfiles - RELATIVE ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_SOURCE_DIR}/parmepy/${testdir}/*.py) + file(GLOB testfiles parmepy/${testdir}/*.py) foreach(testfile ${testfiles}) - if(NOT ${testfile} MATCHES "__init__|test_") - file(STRINGS ${testfile} test_doctest - REGEX ">>>") - if(NOT "${test_doctest}" STREQUAL "") - set(py_doctest_files - ${py_doctest_files} ${testfile}) - endif() + file(STRINGS ${testfile} test_doctest REGEX ">>>") + if(NOT "${test_doctest}" STREQUAL "") + set(py_doctest_files ${py_doctest_files} ${testfile}) endif() endforeach() endforeach() @@ -65,7 +53,11 @@ message(STATUS "=== TESTS === ") foreach(testfile ${py_test_files}) get_filename_component(testName ${testfile} NAME_WE) message(STATUS "Add test ${testfile} ...") - add_test(${testName} py.test -v ${testfile}) + if(FULL_TEST) + add_test(NAME ${testName} COMMAND py.test -v --pep8 ${testfile}) + else() + add_test(${testName} py.test -v ${testfile}) + endif() endforeach() ## Add files containing doctests foreach(testfile ${py_doctest_files}) diff --git a/HySoP/CMakeLists.txt b/HySoP/CMakeLists.txt index d73ebe57e75ac1fe4a7de390d4af087f8693aac6..b6f5d06973369d7dac5779abcb7e11ed417df3ac 100644 --- a/HySoP/CMakeLists.txt +++ b/HySoP/CMakeLists.txt @@ -39,6 +39,7 @@ option(WITH_FFTW "Link with fftw library (required for some Parmes solvers), def option(WITH_GPU "Use of GPU (required for some Parmes solvers), default = ON" ON) option(WITH_MAIN_FORTRAN "Create an executable (test purpose) from fortran sources in src/main, linked with libparmes, default = ON" ON) option(DEBUG "Enable debug mode for Parmes (0:disabled, 1:verbose, 2:trace, 3:verbose+trace). Default = 0" 0) +option(FULL_TEST "Enable all test options (pep8 ...) - Default = OFF" OFF) if(NOT WITH_LIB_FORTRAN) message(WARNING "You deactivate libparmes (fortran) generation. This will disable fftw and scales fonctionnalities.") @@ -151,7 +152,7 @@ add_custom_target(python-cleaninstall COMMAND rm -rf ${${PROJECT_NAME}_INSTALL_D file(GLOB_RECURSE PYCFILES "${CMAKE_SOURCE_DIR}/*.pyc"}) add_custom_target(pyclean COMMAND rm -f ${PYCFILES} COMMAND make clean - COMMAND rm -rf ${CMAKE_BINARY_DIR}/build ${CMAKE_BINARY_DIR}/ParmesDoc + COMMAND rm -rf ${CMAKE_BINARY_DIR}/build ${CMAKE_BINARY_DIR}/DoxygenGeneratedDoc COMMAND rm ${CMAKE_SOURCE_DIR}/parmepy/__init__.py COMMENT "clean parmepy sources and build.") diff --git a/HySoP/DoxyConf/parmes.doxyfile.in b/HySoP/DoxyConf/parmes.doxyfile.in index c30e7a0550ebcafaa5ff7af254bcb42396aee69d..9051c0fecd1011d6d19cc52a43a886cc94558af1 100644 --- a/HySoP/DoxyConf/parmes.doxyfile.in +++ b/HySoP/DoxyConf/parmes.doxyfile.in @@ -52,7 +52,7 @@ PROJECT_LOGO = # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. -OUTPUT_DIRECTORY = @CMAKE_BINARY_DIR@/ParmesDoc +OUTPUT_DIRECTORY = @CMAKE_BINARY_DIR@/DoxygenGeneratedDoc # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output @@ -700,10 +700,7 @@ RECURSIVE = YES # Note that relative paths are relative to the directory from which doxygen is # run. -EXCLUDE = @CMAKE_SOURCE_DIR@/parmepy/unusedOrObsolet \ - @CMAKE_SOURCE_DIR@/parmepy/particular_solvers/integrator \ - @CMAKE_SOURCE_DIR@/parmepy/particular_solvers/interpolation \ - @CMAKE_SOURCE_DIR@/parmepy/particular_solvers/remesh +EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded diff --git a/HySoP/ParmesConfig.cmake.in b/HySoP/ParmesConfig.cmake.in index 0ffc839e0225d93bc5207d126c7ad06aa023591a..c435c411fef14a6ed82c1aa37508308a0fc4563e 100644 --- a/HySoP/ParmesConfig.cmake.in +++ b/HySoP/ParmesConfig.cmake.in @@ -14,7 +14,7 @@ # Tell the user where to find ppmcore headers # Tell the user project where to find our headers and libraries -set(@PACKAGE_NAME@_INCLUDE_DIRS "${${PACKAGE_NAME}_INCLUDE_DIRS}") +set(@PACKAGE_NAME@_INCLUDE_DIRS "${${PACKAGE_SHORT_NAME}_INCLUDE_DIRS}") set(@PACKAGE_NAME@_EXTRA_INCLUDE_DIRS "${${PACKAGE_NAME}_EXTRA_INCLUDE_DIRS}") set(@PACKAGE_NAME@_LIBRARY_DIRS "${${PACKAGE_NAME}_LIB_DIR}") set(@PACKAGE_NAME@_MODULE_DIR "${${PACKAGE_NAME}_INCLUDE_DIRS}/Modules") diff --git a/HySoP/hysop/domain/domain.py b/HySoP/hysop/domain/domain.py index c1e85e5735a64b48568c41b09b1fd3d23035243b..95655cb00fdbf081ef691ba8ba9f9f85975de76f 100644 --- a/HySoP/hysop/domain/domain.py +++ b/HySoP/hysop/domain/domain.py @@ -50,4 +50,3 @@ if __name__ == "__main__": print __doc__ print "- Provided class : Domain (abstract)." print Domain.__doc__ - diff --git a/HySoP/hysop/mpi/tests/test_topology.py b/HySoP/hysop/mpi/tests/test_topology.py index 7ea579587f84f6d18f6539c4d5208ac3b424563e..9a3898ced548b45cb5775fb5815b71f2de2ccfd5 100644 --- a/HySoP/hysop/mpi/tests/test_topology.py +++ b/HySoP/hysop/mpi/tests/test_topology.py @@ -1,6 +1,7 @@ import parmepy as pp from parmepy.domain.box import Box from parmepy.mpi.topology import Cartesian +from parmepy.constants import PARMES_INDEX ## @pytest.fixture ## def topology(): @@ -14,6 +15,7 @@ def test_create_topology1D(): dom = Box() resolTopo = [33, 33, 17] topo = Cartesian(dom, 1, resolTopo) + topo.setUp() assert topo.domain == dom assert topo.dim == 1 @@ -25,6 +27,7 @@ def test_create_topology2D(): dom = Box() resolTopo = [33, 33, 17] topo = Cartesian(dom, 2, resolTopo) + topo.setUp() assert topo.domain == dom assert topo.dim == 2 @@ -35,6 +38,7 @@ def test_create_topology3D(): dom = Box() resolTopo = [33, 33, 17] topo = Cartesian(dom, 3, resolTopo) + topo.setUp() assert topo.domain == dom assert topo.dim == 3 @@ -46,7 +50,7 @@ def test_create_topology_with_dims(): resolTopo = [33, 33, 17] topoDims = [pp.mpi.main_size, 1] topo = Cartesian.withResolution(dom, topoDims, resolTopo) - + topo.setUp() assert topo.domain == dom assert topo.dim == 2 assert topo.size == pp.mpi.main_size @@ -64,10 +68,44 @@ def test_comparing_topologies(): topo2 = Cartesian(dom, 2, [11, 33, 17]) assert not topo == topo2 -if __name__ == "__main__": +def test_bridge2D(): + import math + Lx = Ly = 2 * math.pi + from parmepy.mpi.topology import Bridge + dom = Box(dimension=2, length=[Lx, Ly], origin=[0., 0.]) + resolution = [65, 65] + topo2 = Cartesian(dom, 2, resolution) + topo2.setUp() + topo1 = Cartesian(dom, 1, resolution) + topo1.setUp() + bridge = Bridge(topo1, topo2) + print bridge + # We cannot really check something interesting, + # so we just create a bridge. + + +def test_bridge3D(): + import numpy as np + from parmepy.mpi.topology import Bridge + dom = Box() + resolution3d = np.asarray((65, 65, 65), dtype=PARMES_INDEX) + topo1 = Cartesian(dom, 3, resolution3d) + topo1.setUp() + topo2 = Cartesian(dom, 1, resolution3d) + topo2.setUp() + bridge = Bridge(topo1, topo2) + print bridge + # We cannot really check something interesting, + # so we just create a bridge. + + +if __name__ == "__main__": + print "main" + test_create_topology_with_dims() + test_2D() #test_create_topology1D() #pp.mpi.main_comm.barrier() - test_create_topology2D() - pp.mpi.main_comm.barrier() + ## test_create_topology2D() + ## pp.mpi.main_comm.barrier() diff --git a/HySoP/hysop/mpi/topology.py b/HySoP/hysop/mpi/topology.py index c1dfe9c59159d12c360e261ec238c87bacb16f21..d31e093ba2269a4cbe307c2a7b5c054daa59632d 100644 --- a/HySoP/hysop/mpi/topology.py +++ b/HySoP/hysop/mpi/topology.py @@ -1,13 +1,31 @@ """ @package parmepy.mpi.topology -MPI Topologies -@todo merge CartesianTopology and Topology + +Parmes topologies definitions and related tools. +A Parmes Topology is defined as the association of +a mpi process distribution (mpi topology) and of a set of local meshes +(one per process). + +At the time, only cartesian topologies with cartesian meshes are available. + +This module provides the following classes : +- Cartesian : 1,2 or 3D parmes topology. +- Bridge : bridge between two parmes topologies : i.e. what must be +exchange between two topologies and how. + +To get more details try : +\code +>>> import parmepy.mpi.topology as topo +>>> help(topo.Cartesian) +>>> help(topo.Bridge) +\endcode + """ from parmepy.constants import ORDER, np, PARMES_INDEX, debug from parmepy.mpi.mesh import SubMesh -from main_var import main_comm, MPI, main_size from itertools import count +from parmepy.mpi.main_var import main_comm, main_size, main_rank, MPI class Cartesian(object): @@ -40,7 +58,8 @@ class Cartesian(object): @debug def __init__(self, domain, dim, globalMeshResolution, - comm=main_comm, periods=None, ghosts=None, cutdir=None): + comm=main_comm, periods=None, ghosts=None, cutdir=None, + dims=None): ## Associated domain self.domain = domain ## An id for the topology @@ -49,9 +68,10 @@ class Cartesian(object): self.dim = dim ## Communicator used to build the topology self.comm = comm - + ## True if everything has been properly set for this topology + self.isUpToDate = False ## First of all we need to set dims (if not already set) - if not hasattr(self, 'dims'): + if dims is None: # If dims is not provided, computation of the "optimal" processus # distribution for each direction of the grid topology. self.dims = np.asarray(MPI.Compute_dims(main_size, dim), @@ -64,16 +84,18 @@ class Cartesian(object): self.dims.sort() if(ORDER == 'C'): self.dims[:] = self.dims[::-1] - - # default period status is periodic - if(periods is None): - ## Topology BC type - self.periods = self.dim * (True,) else: + self.dims = dims + print "rrrrrrrrrrrr", self.dims + # default period status is periodic + self.periods = np.ones((self.dim), dtype=np.bool) + if(periods is not None): assert (periods.size == self.dim) - self.periods = periods - - self.topo = comm.Create_cart(self.dims, periods=self.periods) + self.periods[:] = periods[:] + print "peeppe", self.periods + print "dididi", self.dims + self.topo = comm.Create_cart(self.dims, periods=self.periods, + reorder=True) ## Size of the topology self.size = self.topo.Get_size() @@ -154,24 +176,16 @@ class Cartesian(object): Create topology's Local Mesh """ self.mesh = SubMesh(self, self.G_start, self.localGridResolution) - - # print "aiaiaiai", self.rank, self.coords, "aaa", self.localGridResolution, self.G_start, L_start, L_end -## print "local ...", self.rank, " ", self.localGridResolution -## self.mesh = LocalMesh(self.rank, -## resolution=self.localGridResolution, -## start=start, -## size=self.domain.length / (self.globalMeshResolution - 1), -## dom_origin=self.domain.origin, -## ghosts=self.ghosts) + self.isUpToDate = True @classmethod def withResolution(cls, domain, topoResolution, globalMeshResolution, cutdir=None, ghosts=None, periods=None): - cls.dims = np.asarray(topoResolution, dtype=PARMES_INDEX) - cls.dim = cls.dims.size - assert cls.dims.all(), "Topology error : you try to \ + dims = np.asarray(topoResolution, dtype=PARMES_INDEX) + dim = dims.size + assert dims.all(), "Topology error : you try to \ create a topology with 0 resolution in one direction." # We set three ways to choose which direction(s) will be distributed : @@ -183,26 +197,26 @@ class Cartesian(object): # arrays: last dir first distributed. # 3 - topoDim < domain.distributed and cutdir as input argument : # we use cutdir to choose which direction(s) will be distributed. - if cls.dim < domain.dimension: - cls.dims.sort() + if dim < domain.dimension: + dims.sort() if(ORDER == 'C'): - cls.dims[:] = cls.dims[::-1] + dims[:] = dims[::-1] - return cls(domain, cls.dim, globalMeshResolution, cutdir=cutdir, - periods=periods, ghosts=ghosts) + return cls(domain, dim, globalMeshResolution, cutdir=cutdir, + periods=periods, ghosts=ghosts, dims=dims) @classmethod def withResolutionFixed(cls, domain, topoResolution, globalMeshResolution, cutdir=None, ghosts=None, periods=None): - cls.dims = np.asarray(topoResolution, dtype=PARMES_INDEX) - cls.dim = cls.dims.size - assert cls.dims.all(), "Topology error : you try to \ + dims = np.asarray(topoResolution, dtype=PARMES_INDEX) + dim = dims.size + assert dims.all(), "Topology error : you try to \ create a topology with 0 resolution in one direction." - return cls(domain, cls.dim, globalMeshResolution, - cutdir=cutdir, periods=periods, ghosts=ghosts) + return cls(domain, dim, globalMeshResolution, + cutdir=cutdir, periods=periods, ghosts=ghosts, dims=dims) def __eq__(self, other): """ @@ -237,6 +251,181 @@ class Cartesian(object): return s +class Bridge(object): + """ + A Bridge is the definition of what must be exchanged between two topologies + and how to do so. + + For a bridge between topo1 and topo2, it will provide : + bridge.sendTo = [[rk, i, j, k, l, ...]] + bridge.recvFrom = [[rk, i, j, k, l, ...]] + where each line corresponds to a message that must be send + from current mpi process to process rk for sendTo or + receive by current mpi process from process rk for recvFrom. + The other columns give the numbers of the node of the mesh + that must be exchange. + Warning : index numbers corresponds to local nodes numbers. + + In sendTo/recvFrom : + * First column : dest/source of the message. + Warning : rank number is given in main_comm. + * second-third columns : first and last index of nodes in the first dir + * 4th-5th : first and last index of nodes in the second dir + * and so on depending on the size of the domain + associated to the topologies. + + """ + + @debug + def __init__(self, topoFrom, topoTo): + """ + Bridge constructor. + @param source topology + @param targeted topology + """ + ## Source topology + self.topoFrom = topoFrom + ## Targeted topology + self.topoTo = topoTo + + # Both topologies must be uptodate + assert(topoFrom.isUpToDate) + assert(topoTo.isUpToDate) + + # Both topologies must have the + # same number of mpi processes. + assert topoFrom.size == topoTo.size + + dom = topoFrom.domain + + # 1 - Get global mesh indices for each topology + size1 = topoFrom.size + start1 = topoFrom.mesh.global_start + end1 = topoFrom.mesh.global_end + iglob1 = np.zeros((size1, dom.dimension * 2), dtype=np.int32) + iglob1[main_rank, 0::2] = start1 + iglob1[main_rank, 1::2] = end1 + + size2 = topoTo.size + start2 = topoTo.mesh.global_start + end2 = topoTo.mesh.global_end + iglob2 = np.zeros((size2, dom.dimension * 2), dtype=np.int32) + iglob2[main_rank, 0::2] = start2 + iglob2[main_rank, 1::2] = end2 + + # 2 Distribute these indices. + main_comm.Allgather([iglob1[main_rank, :], MPI.INT], [iglob1, MPI.INT]) + main_comm.Allgather([iglob2[main_rank, :], MPI.INT], [iglob2, MPI.INT]) + + # Connectivity : + + ### sendTo[:,0] rank of the targeted process in main_comm + ## sendTo[:,1:] local indices (start,end, ...) + ## of the points to be sent for each direction. + ## Example (in 2D) + ## sendTo = [[ 1, 2, 5, 1, 3] + ## [ 2, 0, 3, 1, 2]] + ## means that the current process must send to process 1 + ## the points of indices 2:5 in first dir and 1:3 in second dir + ## and to process 2 those of indices 0:3 and 1:2 + self.sendTo = np.zeros((0, 1 + dom.dimension * 2), dtype=np.int) + indexFrom = [] + for dim in range(dom.dimension): + indexFrom.append(range(iglob1[main_rank, dim * 2], + iglob1[main_rank, dim * 2 + 1] + 1)) + + line = np.zeros((1 + 2 * dom.dimension), dtype=np.int32) + listRanks = [i for i in range(main_size) if i != main_rank] + + for i in listRanks: + line[0] = i + hasInter = True + for dim in range(dom.dimension): + indexTo = range(iglob2[i, dim * 2], iglob2[i, dim * 2 + 1] + 1) + interRow = [k for k in indexFrom[dim] if k in indexTo] + interRow.sort() + if interRow.__len__(): + line[dim * 2 + 1] = interRow[0] + line[dim * 2 + 2] = interRow[-1] + else: + hasInter = False + break + + if hasInter: + self.sendTo = np.vstack((self.sendTo, line)) + + # --- Compute globalConnectivity on process 0 and distribute it --- + # Global Connectivity : each line corresponds to a message : + # globalConnectivity[i,:] = [i, j, 0, 3, 2, 6] + # means that process i must send to process j its mesh + # from node 0 to 3 in the first direction and from node 2 to + # 6 in the second dir AND that process j must receive the same mesh + # from process i. Nodes number given in the global index set. + # Warning : process ranks are given in mpi_main. + globalConnectivity = np.zeros((self.sendTo.shape[0], 2 + + dom.dimension * 2), dtype=np.int) + + globalConnectivity[:, 1:] = self.sendTo.copy() + globalConnectivity[:, 0] = main_rank + + if main_rank == 0: + for i in range(1, main_size): + temp = main_comm.recv(source=i) + globalConnectivity = np.vstack((globalConnectivity, temp)) + + else: + main_comm.ssend(globalConnectivity, dest=0) + + ## recvFrom[:,0] rank of the sending process in main_comm + ## recvFrom[:,1:] local indices (start,end, ...) + ## of the points to be receive for each direction. + ## Example (in 2D) + ## recvFrom = [[1, 2, 5, 1, 3]] + ## means that the current process must receive from process 1 + ## an array that will be saved at positions of indices 2:5 + ## in the first dir and 1:3 in second dir + self.recvFrom = np.empty((), dtype=np.int32) + if main_rank == 0: + for fromRank in range(main_size): + cond1 = globalConnectivity[:, 1] == fromRank + cond2 = globalConnectivity[:, 0] != fromRank + cond = cond1 & cond2 + sol = np.compress(cond, globalConnectivity, axis=0) + cond1 = np.ones((sol.shape[1]), dtype=np.bool) + cond1[1] = False + sol = np.compress(cond1, sol, axis=1) + if(fromRank != main_rank): + main_comm.ssend(sol, dest=fromRank) + else: + self.recvFrom = sol.copy() + + else: + self.recvFrom = main_comm.recv(source=0) + + # Final setup for recvFrom and sendTo : shift from + # global indices to local ones. + + self.recvFrom[:, 1::2] = self.recvFrom[:, 1::2] - start2[:] + self.recvFrom[:, 2::2] = self.recvFrom[:, 2::2] - start2[:] + self.sendTo[:, 1::2] = self.sendTo[:, 1::2] - start1[:] + self.sendTo[:, 2::2] = self.sendTo[:, 2::2] - start1[:] + + @debug + def setUp(self): + """ + + """ + + def __str__(self): + """ TopologyBridge info display """ + s = '======== Bridge from topology ' + str(self.topoFrom.idTopo) + s += ' to topology ' + str(self.topoTo.idTopo) + ' ========\n' + s += '[' + str(main_rank) + '] sendTo :' + str(self.sendTo) + '\n' + s += '[' + str(main_rank) + '] recvFrom :' + str(self.recvFrom) + '\n' + s += '=================================\n' + return s + if __name__ == "__main__": print "This module defines the following classes:" print "- Cartesian Topology: ", Cartesian.__doc__ + print "- Bridge between topologies: ", Bridge.__doc__ diff --git a/HySoP/hysop/operator/analytic.py b/HySoP/hysop/operator/analytic.py index 7074f37961acbe4b4987f4896e552f9e31200109..1e4f5be7320400864c89f0b7b841bd5cb84204f5 100644 --- a/HySoP/hysop/operator/analytic.py +++ b/HySoP/hysop/operator/analytic.py @@ -69,4 +69,4 @@ class Analytic(Operator): if __name__ == "__main__": print __doc__ print "- Provided class : Advection" - print Advection.__doc__ + print Analytic.__doc__ diff --git a/HySoP/hysop/operator/continuous.py b/HySoP/hysop/operator/continuous.py index 11b96a3dbc482e050bbf5b4ef0e950156b9ea1e4..524fee91765b794fee53aa966c8ba86db5839864 100644 --- a/HySoP/hysop/operator/continuous.py +++ b/HySoP/hysop/operator/continuous.py @@ -26,6 +26,10 @@ class Operator(object): """ ## Variables self.variables = variables + ## Input variables + self.input = [] + ## Output variables + self.output = [] ## Domain self.domain = self.variables[0].domain ## Fields discretes id @@ -37,7 +41,7 @@ class Operator(object): def addVariable(self, cVariable): """ - Add an continuous variables to the operator. + Add a continuous variables to the operator. @param cVariable : list of variables to add. """ @@ -80,4 +84,4 @@ class Operator(object): if __name__ == "__main__": print __doc__ print "- Provided class : Operator" - print ContinuousOperator.__doc__ + print Operator.__doc__ diff --git a/HySoP/hysop/unusedOrObsolet/DiscreteTransportProblem.py b/HySoP/unusedOrObsolet/DiscreteTransportProblem.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/DiscreteTransportProblem.py rename to HySoP/unusedOrObsolet/DiscreteTransportProblem.py diff --git a/HySoP/hysop/unusedOrObsolet/GPUParticularSolver.py b/HySoP/unusedOrObsolet/GPUParticularSolver.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/GPUParticularSolver.py rename to HySoP/unusedOrObsolet/GPUParticularSolver.py diff --git a/HySoP/hysop/unusedOrObsolet/GPUParticularSolver_GLRender.py b/HySoP/unusedOrObsolet/GPUParticularSolver_GLRender.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/GPUParticularSolver_GLRender.py rename to HySoP/unusedOrObsolet/GPUParticularSolver_GLRender.py diff --git a/HySoP/hysop/unusedOrObsolet/InterpolationDOp.py b/HySoP/unusedOrObsolet/InterpolationDOp.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/InterpolationDOp.py rename to HySoP/unusedOrObsolet/InterpolationDOp.py diff --git a/HySoP/hysop/unusedOrObsolet/ParticleField.py b/HySoP/unusedOrObsolet/ParticleField.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/ParticleField.py rename to HySoP/unusedOrObsolet/ParticleField.py diff --git a/HySoP/hysop/unusedOrObsolet/TagDOp.py b/HySoP/unusedOrObsolet/TagDOp.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/TagDOp.py rename to HySoP/unusedOrObsolet/TagDOp.py diff --git a/HySoP/hysop/unusedOrObsolet/VelocityDOp.py b/HySoP/unusedOrObsolet/VelocityDOp.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/VelocityDOp.py rename to HySoP/unusedOrObsolet/VelocityDOp.py diff --git a/HySoP/hysop/unusedOrObsolet/VelocityOp.py b/HySoP/unusedOrObsolet/VelocityOp.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/VelocityOp.py rename to HySoP/unusedOrObsolet/VelocityOp.py diff --git a/HySoP/hysop/unusedOrObsolet/VolumeDOp.py b/HySoP/unusedOrObsolet/VolumeDOp.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/VolumeDOp.py rename to HySoP/unusedOrObsolet/VolumeDOp.py diff --git a/HySoP/hysop/unusedOrObsolet/continuous.py b/HySoP/unusedOrObsolet/continuous.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/continuous.py rename to HySoP/unusedOrObsolet/continuous.py diff --git a/HySoP/hysop/unusedOrObsolet/differentialOperator.py b/HySoP/unusedOrObsolet/differentialOperator.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/differentialOperator.py rename to HySoP/unusedOrObsolet/differentialOperator.py diff --git a/HySoP/hysop/unusedOrObsolet/differentialOperator_d.py b/HySoP/unusedOrObsolet/differentialOperator_d.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/differentialOperator_d.py rename to HySoP/unusedOrObsolet/differentialOperator_d.py diff --git a/HySoP/hysop/unusedOrObsolet/discrete.py b/HySoP/unusedOrObsolet/discrete.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/discrete.py rename to HySoP/unusedOrObsolet/discrete.py diff --git a/HySoP/hysop/unusedOrObsolet/forward_euler.py b/HySoP/unusedOrObsolet/forward_euler.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/forward_euler.py rename to HySoP/unusedOrObsolet/forward_euler.py diff --git a/HySoP/hysop/unusedOrObsolet/obstacle_d_old.py b/HySoP/unusedOrObsolet/obstacle_d_old.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/obstacle_d_old.py rename to HySoP/unusedOrObsolet/obstacle_d_old.py diff --git a/HySoP/hysop/unusedOrObsolet/obstacle_old.py b/HySoP/unusedOrObsolet/obstacle_old.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/obstacle_old.py rename to HySoP/unusedOrObsolet/obstacle_old.py diff --git a/HySoP/hysop/unusedOrObsolet/runge_kutta.py b/HySoP/unusedOrObsolet/runge_kutta.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/runge_kutta.py rename to HySoP/unusedOrObsolet/runge_kutta.py diff --git a/HySoP/hysop/unusedOrObsolet/runge_kutta2stretching.py b/HySoP/unusedOrObsolet/runge_kutta2stretching.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/runge_kutta2stretching.py rename to HySoP/unusedOrObsolet/runge_kutta2stretching.py diff --git a/HySoP/hysop/unusedOrObsolet/runge_kutta3stretching.py b/HySoP/unusedOrObsolet/runge_kutta3stretching.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/runge_kutta3stretching.py rename to HySoP/unusedOrObsolet/runge_kutta3stretching.py diff --git a/HySoP/hysop/unusedOrObsolet/runge_kutta4stretching.py b/HySoP/unusedOrObsolet/runge_kutta4stretching.py similarity index 100% rename from HySoP/hysop/unusedOrObsolet/runge_kutta4stretching.py rename to HySoP/unusedOrObsolet/runge_kutta4stretching.py