diff --git a/HySoP/CMakeLists.txt b/HySoP/CMakeLists.txt index 71c2db0426cbbced648c67da0bb84d712f172a9c..3d665d59ddd1d4609b3252e2e4217debe40ac33e 100644 --- a/HySoP/CMakeLists.txt +++ b/HySoP/CMakeLists.txt @@ -28,7 +28,7 @@ option(VERBOSE_MODE "enable verbose mode for cmake exec. Default = on" ON) option(USE_PPM "link parmes with ppm when this mode is enable. Default = on." ON) option(USE_MPI "compile and link parmes with mpi when this mode is enable. Default = on." ON) option(USE_PPM "link Parmes with PPM library (core component). Default = on." ON) -option(USE_PPMNumerics "link Parmes with PPM-numerics. Default = off" OFF) +option(USE_PPMNumerics "link Parmes with PPM-numerics. Default = off" ON) option(DOUBLEPREC "set precision for real numbers to double precision when this mode is enable. Default = on." ON) option(WITH_TESTS "Enable testing. Default = on" ON) option(BUILD_SHARED_LIBS "Enable dynamic library build, default = ON" ON) diff --git a/HySoP/src/interfaces/ppm/wrap_ppm_topologies.f95 b/HySoP/src/interfaces/ppm/wrap_ppm_topologies.f95 index 3f9ee30247d00dae9584cdb5510ca1a264bc328e..a13e7dc1f34cd0d92762a7a64108f51a825f9472 100644 --- a/HySoP/src/interfaces/ppm/wrap_ppm_topologies.f95 +++ b/HySoP/src/interfaces/ppm/wrap_ppm_topologies.f95 @@ -19,13 +19,13 @@ contains type(c_Ptr), intent(in), VALUE :: minPhys type(c_Ptr), intent(in), VALUE :: maxPhys type(c_Ptr), intent(in), VALUE :: bc - real(kind=real_kind), intent(in) :: ghostsize + real(kind=real_kind), intent(in) :: ghostsize ! ghostsize is a real in ppm subroutine ... strange ... ! type(c_ptr), intent(inout) :: costPerProc ! Local vars integer :: info - integer :: nbProcs = 3 ! TODO : input arg + ! integer :: nbProcs = 3 ! TODO : input arg integer :: assig = ppm_param_assign_internal real(kind=real_kind), pointer, dimension(:) :: cost => NULL() real(kind=real_kind), pointer, dimension(:) ::min_phys => NULL(), max_phys => NULL() diff --git a/HySoP/src/main/Domain.f90 b/HySoP/src/main/Domain.f90 index e84fb57ebc8aa6bdeabb14a9e00f6659a67d1954..039f9e3f498ec801e49af2a6f13498ac615564ba 100755 --- a/HySoP/src/main/Domain.f90 +++ b/HySoP/src/main/Domain.f90 @@ -11,8 +11,10 @@ module Domain integer, dimension(:), pointer :: domain_ghostsize=>NULL() integer, dimension(:), pointer :: grid_resolution =>NULL() + real(mk), dimension(:), pointer :: grid_step =>NULL() integer, private :: istat + contains subroutine init_geometry() @@ -21,7 +23,7 @@ contains allocate(domain_minCoords(dime), domain_maxCoords(dime), stat = istat) if(istat.ne.0) stop 'Geometry, allocation failed' domain_minCoords = 0.0 - domain_maxCoords = 3.1415927 + domain_maxCoords = 1.1 ! Boundary conditions and ghosts allocate(domain_bc(2*dime), domain_ghostsize(dime), stat = istat) if(istat.ne.0) stop 'BC, allocation failed' @@ -32,9 +34,10 @@ contains subroutine init_grid() - allocate(grid_resolution(dime),stat=istat) + allocate(grid_resolution(dime),grid_step(dime),stat=istat) if(istat.ne.0) stop 'grid_resolution, allocation failed' - grid_resolution = 10 + grid_resolution = 65 + grid_step = (domain_maxCoords - domain_minCoords)/(real(grid_resolution,mk)-1.) end subroutine init_grid diff --git a/HySoP/src/main/Fields.f90 b/HySoP/src/main/Fields.f90 index d0e7a4a705cc87aa17fa2004cdcc81107c6cb5d5..679adad9b960263f40dca70f53175189e26b34d6 100755 --- a/HySoP/src/main/Fields.f90 +++ b/HySoP/src/main/Fields.f90 @@ -2,22 +2,23 @@ module Fields use client_data, only: mk,dime use ppm_module_typedef, only : ppm_t_equi_mesh, ppm_t_topo - + implicit none !> Velocity real(mk), dimension(:,:,:,:,:), pointer :: velocity => NULL() !> Vorticity real(mk), dimension(:,:,:,:,:), pointer :: vorticity =>NULL() + !> Stream function + real(mk), dimension(:,:,:,:,:), pointer :: stream_function =>NULL() contains - subroutine init_fields(ghostsize, mesh, topo) + subroutine init_fields(ghostsize, topo) integer, dimension(:), pointer :: ghostsize - type(ppm_t_equi_mesh), pointer :: mesh type(ppm_t_topo), pointer :: topo - + !> Number of points in each dir (1st index) for each sub (2nd index) integer, dimension(:,:), pointer :: ndata =>NULL() !> List of subdomains for the current proc - Warning, it seems that from ppm, isublist is of size nbproc (total number of proc) but @@ -31,11 +32,11 @@ contains ! Lower and upper bounds for fields integer, dimension(dime) :: ldl, ldu integer, dimension(dime) :: vndata - - ndata => mesh%nnodes + + ndata => topo%mesh(1)%nnodes isublist => topo%isublist nsublist = topo%nsublist - + vndata(1) = maxval(ndata(1,isublist(1:nsublist))) vndata(2) = maxval(ndata(2,isublist(1:nsublist))) vndata(3) = maxval(ndata(3,isublist(1:nsublist))) @@ -48,40 +49,12 @@ contains ! Vorticity allocate(vorticity(dime,ldl(1):ldu(1),ldl(2):ldu(2),ldl(3):ldu(3),nsublist), stat = istat) if(istat.ne.0) stop 'Field allocation error for vorticity' + ! Stream function + allocate(stream_function(dime,ldl(1):ldu(1),ldl(2):ldu(2),ldl(3):ldu(3),nsublist), stat = istat) + if(istat.ne.0) stop 'Field allocation error for stream_function' - print *, shape(velocity) nullify(isublist, ndata) end subroutine init_fields - -!!$ subroutine allocfield(field, field_length, info) -!!$ -!!$ real(mk), dimension(:,:,:,:,:), pointer :: field -!!$ integer, intent(out) :: info -!!$ integer, intent(in ) :: field_length -!!$ -!!$ integer, dimension(3) :: vndata, ldl, ldu -!!$ -!!$ info = -1 -!!$ -!!$ ! Check if field is already allocated and nullify if required. -!!$ if(associated(field)) then -!!$ deallocate(field,stat=info) -!!$ nullify(field) -!!$ if(info.ne.0) stop 'tools:allocfield allocation failed' -!!$ end if -!!$ -!!$ -!!$ vndata(1) = maxval(ndata(1,isublist(1:nsublist))) -!!$ vndata(2) = maxval(ndata(2,isublist(1:nsublist))) -!!$ vndata(3) = maxval(ndata(3,isublist(1:nsublist))) -!!$ -!!$ ldl = 1 - ghostsize -!!$ ldu = vndata + ghostsize -!!$ -!!$ allocate(field(field_length,ldl(1):ldu(1),ldl(2):ldu(2),ldl(3):ldu(3),nsublist),& -!!$ & stat = info) -!!$ -!! end subroutine allocfield - + end module Fields diff --git a/HySoP/src/main/FieldsComputation.f90 b/HySoP/src/main/FieldsComputation.f90 new file mode 100755 index 0000000000000000000000000000000000000000..c4f415bc5c71397960c7a9b2c2e1f1dfb8dd8b2c --- /dev/null +++ b/HySoP/src/main/FieldsComputation.f90 @@ -0,0 +1,42 @@ +module FieldsComputation + + use client_data, only: mk + + !use Solver, only: solve_poisson + + implicit none + + private + + public :: fit_velocity + +contains + +!!$ subroutine compute_velocity(field_out, field_in,topoid,meshid, ghostsize) +!!$ real(mk), dimension(:,:,:,:,:), pointer :: field_out +!!$ !> Vorticity +!!$ real(mk), dimension(:,:,:,:,:), pointer :: field_in +!!$ integer, intent(in) :: topoid, meshid +!!$ +!!$ integer, dimension(:), pointer :: ghostsize +!!$ +!!$ ! Solves poisson and computes velocity +!!$ call solve_poisson(field_in, field_out, topoid, meshid,ghostsize) +!!$ +!!$ ! Multigrid in PPM is bugged ... +!!$ !call solve_poisson(topoid, stream_function, field_in) +!!$ +!!$ end subroutine compute_velocity + + subroutine fit_velocity(vel, resolution, bc) + ! Velocity, intent(inout) + real(mk), dimension(:,:,:,:,:), pointer :: vel + ! grid resolution, intent(in) + integer, dimension(:), pointer :: resolution + ! boundary conditions type, intent(in) + integer, dimension(:), pointer :: bc + + ! TODO + end subroutine fit_velocity + +end module FieldsComputation diff --git a/HySoP/src/main/NavierStokes3D.f90 b/HySoP/src/main/NavierStokes3D.f90 new file mode 100755 index 0000000000000000000000000000000000000000..54c56eb77db902960159a15bf0535d1198937338 --- /dev/null +++ b/HySoP/src/main/NavierStokes3D.f90 @@ -0,0 +1,158 @@ +!> Temp modules for ppm_client +module ppmNavierStokes3D + + use ppm_module_init + use ppm_module_data, only : ppm_kind_double + use ppm_module_finalize + + ! use client_io + use client_data, only: mk, dime + ! Physical domain and grid + use Domain + ! Fields on the grid + use Fields, only: init_fields, velocity, vorticity + ! Topology + use client_topology, only: init_topo, mesh, topo + ! Multigrid solver + use Solver, only : init_poisson_solver, solve_poisson + + use FieldsComputation, only : fit_velocity + + use mpi + !use WrapFort + + implicit none + + include "ppm_numerics.h" + + integer, private :: info + +contains + + !> All required initialisations : + !! MPI, ppm + !! Domain, grid + !! Fields + !! Particles + subroutine init_client() + + integer :: prec,tol + ! MPI comm + integer :: comm + ! debug mode + integer :: debug + ! error status + integer :: info + + !====================== + ! Init ppm + !====================== + prec = ppm_kind_double ! Defined in ppm_param.h + comm = MPI_COMM_WORLD ! + debug = 2 + tol = -10 + info = -1 + call ppm_init(dime,prec,tol,comm,debug,info) + + !====================== + ! Geometry and grid + !====================== + call init_geometry() + call init_grid() + + !====================== + ! Creates the topology + !====================== + call init_topo(domain_minCoords, domain_maxCoords, domain_bc, domain_ghostsize, grid_resolution) + + !====================== + ! Fields allocation + !====================== + call init_fields(domain_ghostsize, topo) + + !====================== + ! Init Physics + !====================== + velocity = 0.0_mk + vorticity = 1.0_mk + + vorticity(3,10,10,10,:) = 50.0_mk + + !====================== + ! Init Particles + !====================== + + print *, "end of parmes:ppm:init_client" + + end subroutine init_client + + subroutine main_client() bind(c,name='NavierStokes3D') + + real(mk) :: initial_time, final_time, current_time, time_step + integer :: i, rank + initial_time = 0.0 + final_time = 1.0 + time_step = 0.005 + current_time = initial_time + + call MPI_COMM_RANK(MPI_COMM_WORLD, rank, info) + + ! Initialisation stuff + call init_client() + + !====================== + ! Init solver + !====================== + ! Init multigrid works in ppm (or seems to ...) but solve fails. + !call init_multigrid(topo%ID, topo%mesh(1)%ID, domain_ghostsize, domain_bc) + + call init_poisson_solver(vorticity,velocity,topo%ID, topo%mesh(1)%ID) + +!!$ print *, shape(topo%mesh) +!!$ do i=1, size(topo%mesh) +!!$ print *, 'mesh :', topo%mesh(i)%ID +!!$ end do +!!$ +!!$ do i=1, 3!size(ppm_topo) +!!$ print *, rank, ' topo: ', ppm_topo(i)%t%ID +!!$ +!!$ print *, rank, ' minmax: ', ppm_topo(i)%t%min_subd, ' max ...', ppm_topo(i)%t%max_subd +!!$ print *, rank ,' bc ', ppm_topo(i)%t%subs_bc +!!$ +!!$ end do +!!$ +!!$ + ! Time loop + + do while(current_time < final_time ) + + ! Compute velocity from vorticity + ! Two steps: + ! - solve Poisson for stream_function and update velocity from stream_function. + ! - update velocity to fit with required boundary values + ! call solve_poisson(vorticity, velocity, topo%ID, topo%mesh(1)%ID,domain_ghostsize) + ! call fit_velocity(velocity, grid_resolution,domain_bc) + + ! Penalize +! call penalize_velocity(velocity) + + ! Compute the new "penalized" vorticity + !call compute_vorticity(vorticity, velocity) + + ! Initialize the particles + !call create_particles(vorticity,velocity,wp,xp,vp) + + ! Integrate + !call push_particles(xp,vp,wp) + ! Remesh + !call remesh_particles(wp,vorticity) + + current_time = current_time + time_step + current_time = final_time + enddo + + call ppm_finalize(info) + print *, 'end ppm simulation' + end subroutine main_client + +end module ppmNavierStokes3D diff --git a/HySoP/src/main/Penalize.f90 b/HySoP/src/main/Penalize.f90 new file mode 100755 index 0000000000000000000000000000000000000000..2b9b1856cb54142fe1fe5d1a1605a6f5d7ccc403 --- /dev/null +++ b/HySoP/src/main/Penalize.f90 @@ -0,0 +1,124 @@ +module penalisation + + use client_data, only: mk,dime + use ppm_module_typedef, only : ppm_t_equi_mesh, ppm_t_topo + + implicit none + + private + + public :: penalisation_init, penalise_velocity + + ! Penalisation kernel function + real(mk), dimension(:,:,:,:), pointer :: chi => NULL() + ! + real(mk) :: lambda + +contains + + subroutine penalisation_init(topo, ghostsize, meshStep) + integer, dimension(:), pointer :: ghostsize + type(ppm_t_topo), pointer :: topo + integer, dimension(:), pointer :: meshStep + + !> Number of points in each dir (1st index) for each sub (2nd index) + integer, dimension(:,:), pointer :: ndata =>NULL() + !> List of subdomains for the current proc - Warning, it seems that from ppm, isublist is of size nbproc (total number of proc) but + ! for each proc, only isublist(1:nsublist) is relevent + integer, dimension(:),pointer :: isublist => NULL() + !> Number of subs for the current proc + integer :: nsublist + + integer::istat,i,j,k,isub,isubl + + ! Lower and upper bounds for fields + integer, dimension(dime) :: ldl, ldu + integer, dimension(dime) :: vndata + + ! z position + real(mk) :: zPos + ! lower bound of the physical domain + real(mk), dimension(:), pointer :: minPhys => NULL() + ! mesh indexes + integer, dimension(:,:), pointer :: istart => NULL() + ! virtual boundary layer position + real(mk) :: limitPos + limitPos = 1.0 + + ! Set lambda value + lambda = 5.5D5 + + ndata => topo%mesh(1)%nnodes + isublist => topo%isublist + nsublist = topo%nsublist + + vndata(1) = maxval(ndata(1,isublist(1:nsublist))) + vndata(2) = maxval(ndata(2,isublist(1:nsublist))) + vndata(3) = maxval(ndata(3,isublist(1:nsublist))) + + ldl = 1 - ghostsize + ldu = vndata + ghostsize + + allocate(chi(ldl(1):ldu(1),ldl(2):ldu(2),ldl(3):ldu(3),nsublist),stat = istat) + if(istat.ne.0) stop 'Chi function allocation error.' + + chi = 0.0 + istart => topo%mesh(1)%istart + minPhys => topo%min_physd + ! Loop over subprocess ... + do isub=1,nsublist + ! loop over mesh nodes + isubl=isublist(isub) + do k=1,ndata(3,isubl) + do j=1,ndata(2,isubl) + do i=1,ndata(1,isubl) + zpos = minPhys(3) + meshStep(3)*istart(k,isubl) + if( (zpos>limitPos).or.(zpos<-limitPos)) then + chi(i,j,k,isub) = lambda + end if + end do + end do + end do + end do + + nullify(isublist, ndata) + + + end subroutine penalisation_init + !> + subroutine penalise_velocity(vel, topo, resolution, dt) + ! Velocity, intent(inout) + real(mk), dimension(:,:,:,:,:), pointer :: vel + ! The topology + type(ppm_t_topo), pointer :: topo + ! grid resolution, intent(in) + integer, dimension(:), pointer :: resolution + ! Time step + real(mk), intent(in) :: dt + ! Chi penalisation function + + + integer :: i,j,k, isub, nsublist,isubl + real(mk) :: coef + + nsublist = topo%nsublist + + + do isub = 1, nsublist + isubl=topo%isublist(isub) + do k=1,resolution(3) + do j=1,resolution(2) + do i=1,resolution(1) + + coef =1./(1.+ dt*chi(i,j,k,isubl)) + vel(1,i,j,k,isubl)=vel(1,i,j,k,isubl)*coef + vel(2,i,j,k,isubl)=vel(2,i,j,k,isubl)*coef + vel(3,i,j,k,isubl)=vel(3,i,j,k,isubl)*coef + + end do + end do + end do + end do +end subroutine penalise_velocity + +end module Penalisation diff --git a/HySoP/src/main/Plouhmans.f90 b/HySoP/src/main/Plouhmans.f90 index 7127ac1ddcefe474c1fd99a0d3cda1a9aee9a91d..6469e385f148628459c411f5dbf3356e4f86e54f 100644 --- a/HySoP/src/main/Plouhmans.f90 +++ b/HySoP/src/main/Plouhmans.f90 @@ -4,21 +4,20 @@ module ppmExample use ppm_module_init use ppm_module_data, only : ppm_kind_double use ppm_module_finalize - use ppm_module_mg_init - ! For ppm_param -! use client_io + + ! use client_io use client_data, only: mk, dime - ! Physical domain and grid use Domain - use Fields, only: init_fields + ! Fields on the grid + use Fields, only: init_fields, velocity, vorticity, stream_function ! Topology use client_topology, only: init_topo, mesh, topo + ! Multigrid solver + !use Solver, only : init_multigrid, solve_poisson - use Solver, only : init_multigrid use mpi use WrapFort - use Tools implicit none @@ -58,6 +57,7 @@ contains !====================== call init_geometry() call init_grid() + !====================== ! Creates the topology !====================== @@ -66,23 +66,36 @@ contains !====================== ! Fields allocation !====================== - call init_fields(domain_ghostsize, mesh, topo) + call init_fields(domain_ghostsize, topo) !====================== ! Init solver !====================== - call init_multigrid(topo%ID, mesh%ID, domain_ghostsize, domain_bc) +! call init_multigrid(topo%ID, mesh%ID, domain_ghostsize, domain_bc) + !====================== + ! Init Physics + !====================== + velocity = 0.0_mk + vorticity = 0.0_mk + + !====================== + ! Init Particles + !====================== + print *, "end of parmes:ppm:init_client" end subroutine init_client subroutine main_client() bind(c,name='plouhmans') + ! Multigrid parameters ... print *, 'run ppm simulation ...' ! init ppm ... call init_client() +! call solve_poisson(topo%ID, stream_function, vorticity) + call ppm_finalize(info) print *, 'end ppm simulation' end subroutine main_client diff --git a/HySoP/src/main/Solver.f90 b/HySoP/src/main/Solver.f90 index 9a23eca298ad27ef49e1ce021a575092c491bbd8..70a7582d3df807c110bedd94dfa804bfebabbb22 100755 --- a/HySoP/src/main/Solver.f90 +++ b/HySoP/src/main/Solver.f90 @@ -4,9 +4,32 @@ module Solver use client_data, only: mk, dime use ppm_module_mg_init use ppm_module_numerics_data, only: ppm_param_eq_poisson, ppm_param_smooth_rbsor + !use ppm_module_fdsolver_init + !use ppm_module_fdsolver_solve + use ppm_module_mg_solv + use ppm_module_poisson, only: ppm_poisson_init, ppm_poisson_plan, ppm_poisson_grn_pois_per, ppm_poisson_solve, & + ppm_poisson_drv_curl_fd2, ppm_poisson_fd + use client_topology + use ppm_module_typedef, only : ppm_param_mesh_coarsen + use ppm_module_mesh_derive, only: ppm_mesh_derive implicit none + private + + public :: init_poisson_solver, solve_poisson + + type(ppm_poisson_plan), pointer :: fftwplanForppm => NULL() + + ! Interface to poisson solver initialisation. Only fft at the time + interface init_poisson_solver + module procedure init_fftw + end interface + + interface solve_poisson + module procedure solve_poisson_fftw + end interface + contains subroutine init_multigrid(topoid, meshid, ghostsize, bc) @@ -22,23 +45,12 @@ contains logical :: with_w_cycles, dump_info real(mk) :: omega integer :: limlev ! Number of mg levels - integer :: info, i,j,k,l - CHARACTER(LEN=120) :: mesg - i =1 - j=2 - k=3 - l=4 - - WRITE(mesg,'(A,I5,A,I1,A,I6,A,I3)') 'Mesh on sub ', & - i,' in dimension ',j,' has ',k, & - ' mesh cells and is not divisible by ',l - - print *, mesg + integer :: info info = -1 - limlev = 6 ! Warning, limlev must cope with grid resolution ... + limlev = 2 ! Warning, limlev must cope with grid resolution ... omega = 1.15_mk ! Relaxation param - with_w_cycles = .TRUE. + with_w_cycles = .FALSE. dump_info = .TRUE. ibcvalue(:,:,:,:,:)=0.0_mk ibcdef(1,:)=bc(:) @@ -50,12 +62,76 @@ contains ! Anyway, at the time the two parameters above are not used in ppm routine. !! maxlev : number of levels in multigrid !! - + call ppm_mg_init(topoid, ppm_param_eq_poisson,ghostsize, ppm_param_smooth_rbsor,dime,ibcdef,& - ibcvalue,meshid,limlev,with_w_cycles,dump_info,omega,info) - + ibcvalue,meshid,limlev,with_w_cycles,dump_info,omega,info) + if(info.ne.0) stop 'Init_multigrid failed ...' end subroutine init_multigrid + subroutine solve_poisson_multigrid(topoid, field, rhs) + integer, intent(in) :: topoid + real(mk), dimension(:,:,:,:,:), pointer :: field + real(mk), dimension(:,:,:,:,:), pointer :: rhs + + integer :: itera, iterf, iter1, iter2, info + real(mk) :: Eu + + itera = 3 + iterf = 3 + iter1 = 10 + iter2 = 4 + print *, 'solve ...', topoid + + ! Bug inside ... + call ppm_mg_solv(topoid, field, rhs, dime, itera, iterf, iter1, iter2, Eu, info) + + end subroutine solve_poisson_multigrid + + subroutine init_fftw(fieldin,fieldout, topoid, meshid) + + real(mk), dimension(:,:,:,:,:), pointer :: fieldin, fieldout + integer, intent(in) :: topoid, meshid + + ! Parameters for ppm poisson routine + integer :: info + + ! Flag to select built-in Green functions (...) + integer :: green + + green = ppm_poisson_grn_pois_per ! periodic boundaries + info = -1 + allocate(fftwplanForppm) + + ! Call ppm routine to initialize fftw plan. + call ppm_poisson_init(topoid, meshid, fftwplanForppm, fieldin, fieldout, green,info) + if(info.NE.0) stop 'PPM Poisson solver init failed.' + end subroutine init_fftw + + subroutine solve_poisson_fftw(fieldin, fieldout, topoid, meshid, ghostsize) + + real(mk), dimension(:,:,:,:,:), pointer :: fieldin, fieldout + integer, intent(in) :: meshid, topoid + integer, dimension(:),pointer :: ghostsize + + integer :: info + ! Finite diff scheme used to compute curl + integer :: dtype + + info = -1 + dtype = ppm_poisson_drv_curl_fd2 + + ! Solves laplacian(fieldout) = - fieldin + call ppm_poisson_solve(topoid, meshid, fftwplanForppm,fieldin,fieldout,ghostsize,info) + if(info.NE.0) stop 'PPM Poisson solver failed.' + + info = -1 + ! Computes fieldout = curl(fieldout) using finite differences, 2nd order (dtype = ppm_poisson_drv_curl_fd2), + ! or 4th order (dtype = ppm_poisson_drv_curl_fd4). Last one is untested according to ppm doc ... + call ppm_poisson_fd(topoid,meshid,fieldout,fieldout,dtype,info) + if(info.NE.0) stop 'PPM Poisson, curl computation failed.' + + end subroutine solve_poisson_fftw + end module Solver diff --git a/HySoP/src/main/Topology.f90 b/HySoP/src/main/Topology.f90 index 0f49bd7975075755ed1f1e31fa52848d66ed7784..68074c446c9982f430efeae9c097b05dedefd3c2 100755 --- a/HySoP/src/main/Topology.f90 +++ b/HySoP/src/main/Topology.f90 @@ -5,7 +5,13 @@ module client_topology use ppm_module_mktopo use ppm_module_data, only : ppm_param_assign_internal, ppm_param_decomp_cartesian, ppm_topo use mpi - use client_data, only: mk + use client_data, only: mk,dime + + + use ppm_module_numerics_data, only: ppm_param_eq_poisson, ppm_param_smooth_rbsor + use ppm_module_mg_init + + implicit none type(ppm_t_topo), pointer :: topo => null() @@ -41,9 +47,10 @@ contains call ppm_mktopo(topoid,meshid, false_xp, false_np, decomposition, assigning, minPos, maxPos, bc, ghostsize, subcost, & istart, ndata, resolution, info) if(info.ne.0) stop 'Topology:init initialisation failed' + ! Get the created topology ... topo=>ppm_topo(topoid)%t - mesh=>topo%mesh(meshid) + !mesh=>topo%mesh(meshid) end subroutine init_topo end module client_topology diff --git a/HySoP/src/main/main.cxx b/HySoP/src/main/main.cxx index fcdecbadfb85ba2a39ca952cfe33c1414581d102..ee277ddc157f407015d9962bb5dc15490f80ff6f 100644 --- a/HySoP/src/main/main.cxx +++ b/HySoP/src/main/main.cxx @@ -16,13 +16,14 @@ using Parmes::Def::real_t; extern "C" void createTopoG(int*, int*, int*, double*, double*, int*, double*); extern "C" void plouhmans(); +extern "C" void NavierStokes3D(); void testPlouhmans() { MPI::Init(); assert(MPI::Is_initialized()); - plouhmans(); + NavierStokes3D(); MPI::Finalize();