From 6b6f3c7728419d520feb85a0c3d9be7ea6382d8c Mon Sep 17 00:00:00 2001
From: jtra <jtra@7c7fe9aa-52eb-4d9e-b0a8-ba7d787348e9>
Date: Tue, 21 Jun 2011 11:31:14 +0000
Subject: [PATCH] included freespace solution to the poisson equation included
 spectral curl - but ONLY for the periodic case cleanup, maybe small bugs

git-svn-id: https://ppm.inf.ethz.ch/svn/ppmnumerics/branches/ngtopo/libppmnumerics@1024 7c7fe9aa-52eb-4d9e-b0a8-ba7d787348e9
---
 ...isson_init_predef.f => ppm_poisson_init.f} | 110 ++----
 src/poisson/ppm_poisson_solve.f               | 363 ++++--------------
 src/ppm_module_poisson.f                      |   6 +-
 3 files changed, 111 insertions(+), 368 deletions(-)
 rename src/poisson/{ppm_poisson_init_predef.f => ppm_poisson_init.f} (85%)

diff --git a/src/poisson/ppm_poisson_init_predef.f b/src/poisson/ppm_poisson_init.f
similarity index 85%
rename from src/poisson/ppm_poisson_init_predef.f
rename to src/poisson/ppm_poisson_init.f
index 77e2d98..38caaaa 100644
--- a/src/poisson/ppm_poisson_init_predef.f
+++ b/src/poisson/ppm_poisson_init.f
@@ -1,5 +1,5 @@
       !-------------------------------------------------------------------------
-      !  Subroutine   : ppm_poisson_init_predef.f90
+      !  Subroutine   : ppm_poisson_init.f90
       !-------------------------------------------------------------------------
       ! Copyright (c) 2010 CSE Lab (ETH Zurich), MOSAIC Group (ETH Zurich),
       !                    Center for Fluid Dynamics (DTU)
@@ -50,7 +50,7 @@
       INTEGER, INTENT(IN)                                         :: green
       !!!flag to select build-in Greens functions:
       !!!ppm_poisson_grn_pois_per - Poisson equation, periodic boundaries
-      !!!ppm_poisson_grn_pois_fre - Poisson equation, freespace boundaries (not implemented)
+      !!!ppm_poisson_grn_pois_fre - Poisson equation, freespace boundaries
       !!!ppm_poisson_grn_reprojec - Do vorticity reprojection to kill divergence
       !!!
       !!!Eventually this should also accept custom Greens function
@@ -64,7 +64,7 @@
       !!!flag to toggle various derivatives of the solution (not to be used with
       !!!green=ppm_poisson_grn_reprojec):
       !!! * ppm_poisson_drv_none
-      !!! * ppm_poisson_drv_curl_sp  (not fully implemented)
+      !!! * ppm_poisson_drv_curl_sp  (only for periodic BC)
       !!! * ppm_poisson_drv_grad_sp  (not implemented)
       !!! * ppm_poisson_drv_lapl_sp  (not implemented)
       !!! * ppm_poisson_drv_div_sp   (not implemented)
@@ -111,7 +111,7 @@
       !-------------------------------------------------------------------------
       ! Initialise routine
       !-------------------------------------------------------------------------
-      CALL substart('ppm_poisson_init_predef',t0,info)
+      CALL substart('ppm_poisson_init',t0,info)
 
       !-------------------------------------------------------------------------
       ! Investigate optional arguments, setup routine accordingly
@@ -130,7 +130,7 @@
       !-------------------------------------------------------------------------
       CALL ppm_topo_get(topoid,topology,info)
       IF (info .NE. 0) THEN
-        CALL ppm_write(ppm_rank,'ppm_poisson_init_predef','Failed to get topology.',isub)
+        CALL ppm_write(ppm_rank,'ppm_poisson_init','Failed to get topology.',isub)
         GOTO 9999
       ENDIF
       !nsubs = topology%nsublist
@@ -173,10 +173,6 @@
         dx = (topology%max_physd(1)-topology%min_physd(1))/(mesh%nm(1)-1)
         dy = (topology%max_physd(2)-topology%min_physd(2))/(mesh%nm(2)-1)
         dz = (topology%max_physd(3)-topology%min_physd(3))/(mesh%nm(3)-1)
-        !maybe they should look like this: - no I think not for declaring the Greens function - after all the above dx is the value we have
-        !dx = (topology%max_physd(1)-topology%min_physd(1))/(mesh%nm(1))
-        !dy = (topology%max_physd(2)-topology%min_physd(2))/(mesh%nm(2))
-        !dz = (topology%max_physd(3)-topology%min_physd(3))/(mesh%nm(3))
       ENDIF
 
       !-------------------------------------------------------------------------
@@ -192,33 +188,29 @@
                                    & LBOUND(fieldout,3):UBOUND(fieldout,3),&
                                    & LBOUND(fieldout,4):UBOUND(fieldout,4),&
                                    & LBOUND(fieldout,5):UBOUND(fieldout,5)))
-        !IF ((      derive .EQ. ppm_poisson_drv_curl_fd2  &
-          !&  .OR.  derive .EQ. ppm_poisson_drv_curl_fd4) &
-          !&  .AND. ppmpoisson%case .EQ. ppm_poisson_grn_pois_per) THEN
-          !ppmpoisson%derivatives = derive
-          !ALLOCATE(ppmpoisson%drv_vr(LBOUND(fieldout,1):UBOUND(fieldout,1),&
-                                   !& LBOUND(fieldout,2):UBOUND(fieldout,2),&
-                                   !& LBOUND(fieldout,3):UBOUND(fieldout,3),&
-                                   !& LBOUND(fieldout,4):UBOUND(fieldout,4),&
-                                   !& LBOUND(fieldout,5):UBOUND(fieldout,5)))
-        !ELSE IF ((      derive .EQ. ppm_poisson_drv_curl_fd2  &
-          !&  .OR.  derive .EQ. ppm_poisson_drv_curl_fd4) &
-          !&  .AND. ppmpoisson%case .EQ. ppm_poisson_grn_pois_fre) THEN
-          !ppmpoisson%derivatives = derive
-          !ALLOCATE(ppmpoisson%drv_vr(LBOUND(fieldout,1):UBOUND(fieldout,1),&
-                                   !& LBOUND(fieldout,2):UBOUND(fieldout,2),&
-                                   !& LBOUND(fieldout,3):UBOUND(fieldout,3),&
-                                   !& LBOUND(fieldout,4):UBOUND(fieldout,4),&
-                                   !& LBOUND(fieldout,5):UBOUND(fieldout,5)))
         ELSE IF (derive .EQ. ppm_poisson_drv_curl_sp) THEN
-          ppmpoisson%normkx = 2*PI/(topology%max_physd(1)-topology%min_physd(1))
-          ppmpoisson%normky = 2*PI/(topology%max_physd(2)-topology%min_physd(2))
-          ppmpoisson%normkz = 2*PI/(topology%max_physd(3)-topology%min_physd(3))
           ppmpoisson%derivatives = ppm_poisson_drv_curl_sp
+          IF (ppmpoisson%case .EQ. ppm_poisson_grn_pois_per) THEN
+            ppmpoisson%normkx = &
+              & 2.0_MK*PI/(topology%max_physd(1)-topology%min_physd(1))
+            ppmpoisson%normky = &
+              & 2.0_MK*PI/(topology%max_physd(2)-topology%min_physd(2))
+            ppmpoisson%normkz = &
+              & 2.0_MK*PI/(topology%max_physd(3)-topology%min_physd(3))
+          ELSE IF (ppmpoisson%case .EQ. ppm_poisson_grn_pois_fre) THEN
+            CALL ppm_write(ppm_rank,'ppm_poisson_init', &
+            & 'WARNING: Spectral curl is not fully implemented in Freespace.',isub)
+            ppmpoisson%normkx = &
+              & 2.0_MK*PI/((topology%max_physd(1)-topology%min_physd(1))*2.0_MK)
+            ppmpoisson%normky = &
+              & 2.0_MK*PI/((topology%max_physd(2)-topology%min_physd(2))*2.0_MK)
+            ppmpoisson%normkz = &
+              & 2.0_MK*PI/((topology%max_physd(3)-topology%min_physd(3))*2.0_MK)
+          ENDIF
         ELSE IF (derive .EQ. ppm_poisson_drv_none) THEN
           ppmpoisson%derivatives = ppm_poisson_drv_none
         ELSE
-          CALL ppm_write(ppm_rank,'ppm_poisson_init_predef','Undefined derivation input.',isub)
+          CALL ppm_write(ppm_rank,'ppm_poisson_init','Undefined derivation input.',isub)
           GOTO 9999
         ENDIF
       ELSE
@@ -228,7 +220,7 @@
 
 
       !-------------------------------------------------------------------------
-      ! Create new slab topology !@sofar periodic
+      ! Create new slab topology
       !-------------------------------------------------------------------------
       ttopoid = 0
       tmeshid = -1
@@ -241,8 +233,6 @@
       ENDIF
       tmpmin              = topology%min_physd
       tmpmax              = topology%max_physd
-      !!tmpmin2             = topology%min_physd
-      !!tmpmax2             = topology%max_physd
 
       CALL ppm_mktopo(ttopoid,tmeshid,xp,0,&
       & decomposition,assigning,&
@@ -251,7 +241,7 @@
       & __ZEROSI,ppmpoisson%costxy,ppmpoisson%istartxy,ppmpoisson%ndataxy,&
       & ppmpoisson%nmxy,info)
       IF (info .NE. 0) THEN
-        CALL ppm_write(ppm_rank,'ppm_poisson_init_predef','Failed to create xy-topology.',isub)
+        CALL ppm_write(ppm_rank,'ppm_poisson_init','Failed to create xy-topology.',isub)
         GOTO 9999
       ENDIF
       ppmpoisson%topoidxy = ttopoid
@@ -266,16 +256,14 @@
       CALL ppm_mesh_define(ttopoid,tmeshid,&
       & ppmpoisson%nmxy,ppmpoisson%istartxyc,ppmpoisson%ndataxyc,info) !@nmxyC
       IF (info .NE. 0) THEN
-        CALL ppm_write(ppm_rank,'ppm_poisson_init_predef','Failed to create complex xy mesh definition.',isub)
+        CALL ppm_write(ppm_rank,'ppm_poisson_init','Failed to create complex xy mesh definition.',isub)
         GOTO 9999
       ENDIF
       ppmpoisson%meshidxyc = tmeshid
-      !write(*,*) ppmpoisson%meshidxy,tmeshid,ttopoid,ppmpoisson%meshidxyc
-      !!write(*,*) ppmpoisson%istartxyc,ppmpoisson%ndataxyc
 
 
       !-------------------------------------------------------------------------
-      ! Create new pencil topology !@sofar periodic
+      ! Create new pencil topology
       !-------------------------------------------------------------------------
       ttopoid = 0
       tmeshid = -1
@@ -286,17 +274,14 @@
       ENDIF
       assigning       = ppm_param_assign_internal
       decomposition   = ppm_param_decomp_zpencil
-      !tmpmin              = topology%min_physd
-      !tmpmax              = topology%max_physd
 
       CALL ppm_mktopo(ttopoid,tmeshid,xp,0,&
       & decomposition,assigning,&
-      !& topology%min_physd,topology%max_physd,bcdef,&
       & tmpmin,tmpmax,bcdef,&
       & __ZEROSI,ppmpoisson%costz,ppmpoisson%istartz,ppmpoisson%ndataz,&
       & ppmpoisson%nmz,info)
       IF (info .NE. 0) THEN
-        CALL ppm_write(ppm_rank,'ppm_poisson_init_predef','Failed to create z-topology.',isub)
+        CALL ppm_write(ppm_rank,'ppm_poisson_init','Failed to create z-topology.',isub)
         GOTO 9999
       ENDIF
       ppmpoisson%topoidz = ttopoid
@@ -307,19 +292,19 @@
       !-------------------------------------------------------------------------
       CALL ppm_topo_get(ppmpoisson%topoidxy,topologyxy,info)
       IF (info .NE. 0) THEN
-        CALL ppm_write(ppm_rank,'ppm_poisson_init_predef','Failed to get xy topology.',isub)
+        CALL ppm_write(ppm_rank,'ppm_poisson_init','Failed to get xy topology.',isub)
         GOTO 9999
       ENDIF
 
       !!CALL ppm_topo_get(ppmpoisson%topoidxyc,topologyxyc,info)
       !!IF (info .NE. 0) THEN
-        !!CALL ppm_write(ppm_rank,'ppm_poisson_init_predef','Failed to get complex xy topology.',isub)
+        !!CALL ppm_write(ppm_rank,'ppm_poisson_init','Failed to get complex xy topology.',isub)
         !!GOTO 9999
       !!ENDIF
 
       CALL ppm_topo_get(ppmpoisson%topoidz,topologyz,info)
       IF (info .NE. 0) THEN
-        CALL ppm_write(ppm_rank,'ppm_poisson_init_predef','Failed to get z topology.',isub)
+        CALL ppm_write(ppm_rank,'ppm_poisson_init','Failed to get z topology.',isub)
         GOTO 9999
       ENDIF
 
@@ -389,12 +374,8 @@
       ENDDO
 
       !-------------------------------------------------------------------------
-      ! Allocate real and complex xy slabs
+      ! Allocate complex xy slabs
       !-------------------------------------------------------------------------
-      !!ALLOCATE(ppmpoisson%fldxyr(__DIM,&
-      !!& indl(1):indu(1),indl(2):indu(2),indl(3):indu(3),&
-      !!& 1:ppmpoisson%nsublistxy),stat=info)
-!!
       ALLOCATE(ppmpoisson%fldxyc(__DIM,&
       & indl(1):indu(1),indl(2):indu(2),indl(3):indu(3),&
       & 1:ppmpoisson%nsublistxy),stat=info)
@@ -434,11 +415,6 @@
         & indl(1):indu(1),indl(2):indu(2),indl(3):indu(3),&
         & 1:ppmpoisson%nsublistz),stat=info)
       ELSE IF (green .EQ. ppm_poisson_grn_pois_fre) THEN
-        !!!The z-dimension is defined to full extent for the real temporary
-        !!!Greens function array
-        !!ALLOCATE(ppmpoisson%fldgrnr(&
-        !!& indl(1):indu(1),indl(2):indu(2),indl(3):((indu(3)-1)*2),&
-        !!& 1:ppmpoisson%nsublistz),stat=info)
         ALLOCATE(ppmpoisson%fldgrnc(&
         & indl(1):indu(1),indl(2):indu(2),indl(3):indu(3),&
         & 1:ppmpoisson%nsublistz),stat=info)
@@ -474,10 +450,13 @@
       ! PSI                              = 1/(4*pi2)*1/(kx2 + ky2 + kz2)OMEGA
       !-------------------------------------------------------------------------
       IF (green .EQ. ppm_poisson_grn_pois_per) THEN
-        ! Scaling the spectral coefficients... one minus is due to (i*k)^2 ... how about one due to Poisson?
+        ! Scaling the spectral coefficients... 
+        ! one minus due to (i*k)^2 and another due to the Poisson equation
         normfac = 1.0_MK/(4.0_MK*PI*PI * &
                 !and normalisation of FFTs
-                & REAL((ppmpoisson%nmz(1)-1)*(ppmpoisson%nmz(2)-1)*(ppmpoisson%nmz(3)-1),MK))
+                & REAL((ppmpoisson%nmz(1)-1)* &
+                &      (ppmpoisson%nmz(2)-1)* &
+                &      (ppmpoisson%nmz(3)-1),MK))
         DO isub=1,ppmpoisson%nsublistz
           isubl=ppmpoisson%isublistz(isub)
           DO k=1,ppmpoisson%ndataz(3,isubl)
@@ -524,18 +503,11 @@
         ! First initialise the real Greens function
         !@alternatively this could come from as input
         !-----------------------------------------------------------------------
-        !@write(*,*) 'what the fuck?'
-        !there should NOT be a minus here since this Greens function takes
+        !there should NOT be a minus here since THIS Greens function takes
         !the minus of the Poisson equation into account
         normfac = 1.0_MK/(4.0_MK*PI* &
         !remembering FFT normalization of ALL points: !vertex
         & REAL((ppmpoisson%nmxy(1))*(ppmpoisson%nmxy(2))*(ppmpoisson%nmxy(3)),MK))*dx*dy*dz
-        !& REAL((ppmpoisson%nmxy(1))*(ppmpoisson%nmxy(2))*(ppmpoisson%nmxy(3)),MK)& !this is the correct normalization to bring one field back and forth.
-        !remembering FFT normalization of ALL points: !vertex
-        !!& REAL((ppmpoisson%nmxy(1))*(ppmpoisson%nmxy(2))*(ppmpoisson%nmxy(3)),MK)& !this should be correct normalization. When back and forth transforming the greens function is correct
-        !!& *REAL((ppmpoisson%nmxy(1))*(ppmpoisson%nmxy(2))*(ppmpoisson%nmxy(3))/8,MK)) !this line is probably not necessary
-        !!!& *REAL((ppmpoisson%nmxy(1))*(ppmpoisson%nmxy(2))*(ppmpoisson%nmxy(3)),MK)) !this line is probably not necessary
-        !@write(*,*) ppmpoisson%nmxy, 'johannes'
         DO isub=1,ppmpoisson%nsublistxy
           isubl=ppmpoisson%isublistxy(isub)
           DO k=1,ppmpoisson%ndataxy(3,isubl)
@@ -638,13 +610,11 @@
           DO k=1,ppmpoisson%ndataz(3,isubl)
             DO j=1,ppmpoisson%ndataz(2,isubl)
               DO i=1,ppmpoisson%ndataz(1,isubl)
-                ppmpoisson%fldgrnc(i,j,k,isub) = ppmpoisson%fldzc2(1,i,j,k,isub)!+1.0_MK
+                ppmpoisson%fldgrnc(i,j,k,isub) = ppmpoisson%fldzc2(1,i,j,k,isub)
               ENDDO
             ENDDO
           ENDDO
         ENDDO
-
-        !@Deallocate field green r NOPE!
       END IF
 
       !-------------------------------------------------------------------------
@@ -659,7 +629,7 @@
       ! Return
       !-------------------------------------------------------------------------
  9999 CONTINUE
-      CALL substop('ppm_poisson_init_predef',t0,info)
+      CALL substop('ppm_poisson_init',t0,info)
       RETURN
 
       END SUBROUTINE __ROUTINE
diff --git a/src/poisson/ppm_poisson_solve.f b/src/poisson/ppm_poisson_solve.f
index e9e0382..7488423 100644
--- a/src/poisson/ppm_poisson_solve.f
+++ b/src/poisson/ppm_poisson_solve.f
@@ -54,16 +54,13 @@
       INTEGER                           :: i,j,k
       INTEGER                           :: info2
       INTEGER                           :: presentcase
-      REAL(__PREC)                      :: wdotk
+      REAL(__PREC)                      :: wdotgreenr
+      COMPLEX(__PREC)                   :: wdotgreenc
       INTEGER                           :: gi,gj,gk
-      REAL(__PREC)                      :: kx,ky,kz
-      REAL(__PREC)                      :: phix,phiy,phiz
+      COMPLEX(__PREC)                   :: kx,ky,kz
+      COMPLEX(__PREC)                   :: phix,phiy,phiz
       REAL(__PREC)                      :: normfac
 
-#ifndef __NOPE
-INTEGER                           :: trank !@
-trank =0
-#endif
       !-------------------------------------------------------------------------
       ! Initialise routine
       !-------------------------------------------------------------------------
@@ -144,94 +141,6 @@ trank =0
       & ppmpoisson%fldxyr, ppmpoisson%fldxyc, &
       & info)
 
-#ifdef __NOPE
-      if (ppm_rank .EQ. trank)   THEN
-      write(*,*) 'Rfftx12', ppm_rank
-      DO isub=1,ppmpoisson%nsublistxy
-        isubl=ppmpoisson%isublistxy(isub)
-        DO k=1,ppmpoisson%ndataxy(3,isubl)-1
-          write(*,*) 'z',k
-            DO i=1,ppmpoisson%ndataxy(1,isubl)-1
-          DO j=1,ppmpoisson%ndataxy(2,isubl)-1
-              write(*,'(A,E12.4,A,$)') '  (',ppmpoisson%fldxyr(1,i,j,k,isub),')'
-            END DO
-            write(*,*)
-          END DO
-        END DO
-      END DO
-      write(*,*) 'Rffty12', ppm_rank
-      DO isub=1,ppmpoisson%nsublistxy
-        isubl=ppmpoisson%isublistxy(isub)
-        DO k=1,ppmpoisson%ndataxy(3,isubl)-1
-          write(*,*) 'z',k
-            DO i=1,ppmpoisson%ndataxy(1,isubl)-1
-          DO j=1,ppmpoisson%ndataxy(2,isubl)-1
-              write(*,'(A,E12.4,A,$)') '  (',ppmpoisson%fldxyr(2,i,j,k,isub),')'
-            END DO
-            write(*,*)
-          END DO
-        END DO
-      END DO
-      write(*,*) 'Rfftz12', ppm_rank
-      DO isub=1,ppmpoisson%nsublistxy
-        isubl=ppmpoisson%isublistxy(isub)
-        DO k=1,ppmpoisson%ndataxy(3,isubl)-1
-          write(*,*) 'z',k
-            DO i=1,ppmpoisson%ndataxy(1,isubl)-1
-          DO j=1,ppmpoisson%ndataxy(2,isubl)-1
-              write(*,'(A,E12.4,A,$)') '  (',ppmpoisson%fldxyr(3,i,j,k,isub),')'
-            END DO
-            write(*,*)
-          END DO
-        END DO
-      END DO
-      ENDIF
-#endif
-
-
-#ifdef __NOPE
-      if (ppm_rank .EQ. trank)   THEN
-      write(*,*) 'fftx12', ppm_rank
-      DO isub=1,ppmpoisson%nsublistxy
-        isubl=ppmpoisson%isublistxy(isub)
-        DO k=1,ppmpoisson%ndataxy(3,isubl)-1
-          write(*,*) 'z',k
-            DO i=1,ppmpoisson%ndataxy(1,isubl)-1
-          DO j=1,ppmpoisson%ndataxy(2,isubl)-1
-              write(*,'(A,E12.4,E12.4,A,$)') '  (',ppmpoisson%fldxyc(1,i,j,k,isub),')'
-            END DO
-            write(*,*)
-          END DO
-        END DO
-      END DO
-      write(*,*) 'ffty12', ppm_rank
-      DO isub=1,ppmpoisson%nsublistxy
-        isubl=ppmpoisson%isublistxy(isub)
-        DO k=1,ppmpoisson%ndataxy(3,isubl)-1
-          write(*,*) 'z',k
-            DO i=1,ppmpoisson%ndataxy(1,isubl)-1
-          DO j=1,ppmpoisson%ndataxy(2,isubl)-1
-              write(*,'(A,E12.4,E12.4,A,$)') '  (',ppmpoisson%fldxyc(2,i,j,k,isub),')'
-            END DO
-            write(*,*)
-          END DO
-        END DO
-      END DO
-      write(*,*) 'fftz12', ppm_rank
-      DO isub=1,ppmpoisson%nsublistxy
-        isubl=ppmpoisson%isublistxy(isub)
-        DO k=1,ppmpoisson%ndataxy(3,isubl)-1
-          write(*,*) 'z',k
-            DO i=1,ppmpoisson%ndataxy(1,isubl)-1
-          DO j=1,ppmpoisson%ndataxy(2,isubl)-1
-              write(*,'(A,E12.4,E12.4,A,$)') '  (',ppmpoisson%fldxyc(3,i,j,k,isub),')'
-            END DO
-            write(*,*)
-          END DO
-        END DO
-      END DO
-      ENDIF
-#endif
 
       !-----------------------------------------------------------------------
       ! Map to the pencils (Z)
@@ -283,67 +192,6 @@ trank =0
       & ppmpoisson%fldzc1, ppmpoisson%fldzc2, &
       & info)
 
-#ifdef __NOPE
-      if (ppm_rank .EQ. trank)   THEN
-            write(*,*)
-            write(*,*) !ppmpoisson%fldzc1 = 0.0_MK
-      write(*,*) 'fftx123', ppm_rank
-      DO isub=1,ppmpoisson%nsublistz
-        isubl=ppmpoisson%isublistz(isub)
-        DO k=1,ppmpoisson%ndataz(3,isubl)-1
-          write(*,*) 'z',k
-            DO i=1,ppmpoisson%ndataz(1,isubl)-1
-          DO j=1,ppmpoisson%ndataz(2,isubl)-1
-              write(*,'(A,E12.4,E12.4,A,$)') '  (',ppmpoisson%fldzc2(1,i,j,k,isub),')'
-            END DO
-            write(*,*)
-          END DO
-        END DO
-      END DO
-      write(*,*) 'ffty123', ppm_rank
-      DO isub=1,ppmpoisson%nsublistz
-        isubl=ppmpoisson%isublistz(isub)
-        DO k=1,ppmpoisson%ndataz(3,isubl)-1
-          write(*,*) 'z',k
-            DO i=1,ppmpoisson%ndataz(1,isubl)-1
-          DO j=1,ppmpoisson%ndataz(2,isubl)-1
-              write(*,'(A,E12.4,E12.4,A,$)') '  (',ppmpoisson%fldzc2(2,i,j,k,isub),')'
-            END DO
-            write(*,*)
-          END DO
-        END DO
-      END DO
-      write(*,*) 'fftz123', ppm_rank
-      DO isub=1,ppmpoisson%nsublistz
-        isubl=ppmpoisson%isublistz(isub)
-        DO k=1,ppmpoisson%ndataz(3,isubl)-1
-          write(*,*) 'z',k
-            DO i=1,ppmpoisson%ndataz(1,isubl)-1
-          DO j=1,ppmpoisson%ndataz(2,isubl)-1
-              write(*,'(A,E12.4,E12.4,A,$)') '  (',ppmpoisson%fldzc2(3,i,j,k,isub),')'
-            END DO
-            write(*,*)
-          END DO
-        END DO
-      END DO
-
-      write(*,*)
-      write(*,*)
-      write(*,*) 'green', ppm_rank
-      DO isub=1,ppmpoisson%nsublistz
-        isubl=ppmpoisson%isublistz(isub)
-        DO k=1,ppmpoisson%ndataz(3,isubl)-1
-          write(*,*) 'z',k
-            DO i=1,ppmpoisson%ndataz(1,isubl)-1
-          DO j=1,ppmpoisson%ndataz(2,isubl)-1
-              write(*,'(E12.4,$)') REAL(ppmpoisson%fldgrnr(i,j,k,isub))
-            END DO
-            write(*,*)
-          END DO
-        END DO
-      END DO
-      ENDIF
-#endif
 
       !-----------------------------------------------------------------------
       ! Apply the periodic Greens function
@@ -384,90 +232,109 @@ trank =0
           ENDDO
         ENDDO
       !-----------------------------------------------------------------------
-      ! Spectral derivatives
-      ! normkx, etc contains 2pi/Lx
+      ! Vorticity re-projection
       !-----------------------------------------------------------------------
-      IF (ppmpoisson%derivatives .EQ. ppm_poisson_drv_curl_sp .AND.&
-         & (presentcase .EQ. ppm_poisson_grn_pois_per .OR. &
-            presentcase .EQ. ppm_poisson_grn_pois_fre)) THEN
-        write(*,*) 'curl fft style! not working yet though!'
+      ELSE IF (presentcase .EQ. ppm_poisson_grn_reprojec) THEN
         !remembering to normalize the FFT
-        normfac = 1.0_MK/ REAL((ppmpoisson%nmz(1)-1)* & !vertex
-                             & (ppmpoisson%nmz(2)-1)* &
-                             & (ppmpoisson%nmz(3)-1),MK)
+        !normfac = 1.0_MK/ REAL((ppmpoisson%nmz(1)-1)* & !vertex
+                              !& (ppmpoisson%nmz(2)-1)* &
+                              !& (ppmpoisson%nmz(3)-1),MK)
         DO isub=1,ppmpoisson%nsublistz
           isubl=ppmpoisson%isublistz(isub)
           DO k=1,ppmpoisson%ndataz(3,isubl)
             gk = k - 1 + (ppmpoisson%istartz(3,isubl)-1)
             IF (gk .GT. (ppmpoisson%nmz(3)-1)/2) gk = gk-(ppmpoisson%nmz(3)-1)
-            kz = CMPLX(0.0_MK,gk*ppmpoisson%normkz,MK)
+            kz = REAL(gk,MK)
             DO j=1,ppmpoisson%ndataz(2,isubl)
               gj = j - 1 + (ppmpoisson%istartz(2,isubl)-1)
               IF (gj .GT. (ppmpoisson%nmz(2)-1)/2) gj = gj-(ppmpoisson%nmz(2)-1)
-              ky = CMPLX(0.0_MK,gj*ppmpoisson%normky,MK)
+              ky = REAL(gj,MK)
               DO i=1,ppmpoisson%ndataz(1,isubl)
                 gi = i - 1 + (ppmpoisson%istartz(1,isubl)-1)
                 IF (gi .GT. (ppmpoisson%nmz(1)-1)/2) gi = gi-(ppmpoisson%nmz(1)-1)
-                kx = CMPLX(0.0_MK,gi*ppmpoisson%normkx,MK)
+                kx = REAL(gi,MK)
 
-                phix = ppmpoisson%fldzc2(1,i,j,k,isub)
-                phiy = ppmpoisson%fldzc2(2,i,j,k,isub)
-                phiz = ppmpoisson%fldzc2(3,i,j,k,isub)
+                !IF (gi .EQ. 0 .AND. gj .EQ. 0 .AND. gk .EQ. 0) THEN
+                  !wdotk = 0.0_mk
+                !ELSE
+                  !wdotk = (ppmpoisson%fldzc2(1,i,j,k,isub) * kx +  &
+                        !&  ppmpoisson%fldzc2(2,i,j,k,isub) * ky +  &
+                        !&  ppmpoisson%fldzc2(3,i,j,k,isub) * kz) / &
+                        !&  (kx*kx+ky*ky+kz*kz)
+                !ENDIF
+
+                !ppmpoisson%fldzc2(1,i,j,k,isub) = &
+                  !& (ppmpoisson%fldzc2(1,i,j,k,isub) - wdotk*kx)*normfac
+                !ppmpoisson%fldzc2(2,i,j,k,isub) = &
+                  !& (ppmpoisson%fldzc2(2,i,j,k,isub) - wdotk*ky)*normfac
+                !ppmpoisson%fldzc2(3,i,j,k,isub) = &
+                  !& (ppmpoisson%fldzc2(3,i,j,k,isub) - wdotk*kz)*normfac
+
+                IF (ppmpoisson%case .EQ. ppm_poisson_grn_pois_fre) THEN
+                  wdotgreenc = (ppmpoisson%fldzc2(1,i,j,k,isub) * kx +  &
+                        &  ppmpoisson%fldzc2(2,i,j,k,isub) * ky +  &
+                        &  ppmpoisson%fldzc2(3,i,j,k,isub) * kz) * &
+                        &  ppmpoisson%fldgrnc( i,j,k,isub)
+                  ppmpoisson%fldzc2(1,i,j,k,isub) = &
+                    & (ppmpoisson%fldzc2(1,i,j,k,isub) - wdotgreenc*kx)
+                  ppmpoisson%fldzc2(2,i,j,k,isub) = &
+                    & (ppmpoisson%fldzc2(2,i,j,k,isub) - wdotgreenc*ky)
+                  ppmpoisson%fldzc2(3,i,j,k,isub) = &
+                    & (ppmpoisson%fldzc2(3,i,j,k,isub) - wdotgreenc*kz)
+                ELSE IF (ppmpoisson%case .EQ. ppm_poisson_grn_pois_per) THEN
+                  wdotgreenr = (ppmpoisson%fldzc2(1,i,j,k,isub) * kx +  &
+                        &  ppmpoisson%fldzc2(2,i,j,k,isub) * ky +  &
+                        &  ppmpoisson%fldzc2(3,i,j,k,isub) * kz) * &
+                        &  ppmpoisson%fldgrnr( i,j,k,isub)
+                  ppmpoisson%fldzc2(1,i,j,k,isub) = &
+                    & (ppmpoisson%fldzc2(1,i,j,k,isub) - wdotgreenr*kx)
+                  ppmpoisson%fldzc2(2,i,j,k,isub) = &
+                    & (ppmpoisson%fldzc2(2,i,j,k,isub) - wdotgreenr*ky)
+                  ppmpoisson%fldzc2(3,i,j,k,isub) = &
+                    & (ppmpoisson%fldzc2(3,i,j,k,isub) - wdotgreenr*kz)
+                ENDIF
 
-                !maybe normfac on kx,ky,kz?
-                ppmpoisson%fldzc2(1,i,j,k,isub) = normfac*(ky*phiz-kz*phiy)
-                ppmpoisson%fldzc2(2,i,j,k,isub) = normfac*(kz*phix-kx*phiz)
-                ppmpoisson%fldzc2(3,i,j,k,isub) = normfac*(kx*phiy-ky*phix)
               ENDDO
             ENDDO
           ENDDO
         ENDDO
       ENDIF
-
       !-----------------------------------------------------------------------
-      ! Vorticity re-projection
+      ! Spectral derivatives
+      ! normkx, etc contains 2pi/Lx
       !-----------------------------------------------------------------------
-      ELSE IF (presentcase .EQ. ppm_poisson_grn_reprojec) THEN
-        !remembering to normalize the FFT
-        normfac = 1.0_MK/ REAL((ppmpoisson%nmz(1)-1)* & !vertex
-                              & (ppmpoisson%nmz(2)-1)* &
-                              & (ppmpoisson%nmz(3)-1),MK)
+      IF (ppmpoisson%derivatives .EQ. ppm_poisson_drv_curl_sp .AND.&
+         & (presentcase .EQ. ppm_poisson_grn_pois_per .OR. &
+            presentcase .EQ. ppm_poisson_grn_pois_fre)) THEN
         DO isub=1,ppmpoisson%nsublistz
           isubl=ppmpoisson%isublistz(isub)
           DO k=1,ppmpoisson%ndataz(3,isubl)
             gk = k - 1 + (ppmpoisson%istartz(3,isubl)-1)
             IF (gk .GT. (ppmpoisson%nmz(3)-1)/2) gk = gk-(ppmpoisson%nmz(3)-1)
-            kz = REAL(gk,MK)
+            kz = CMPLX(0.0_MK,gk*ppmpoisson%normkz,MK)
             DO j=1,ppmpoisson%ndataz(2,isubl)
               gj = j - 1 + (ppmpoisson%istartz(2,isubl)-1)
               IF (gj .GT. (ppmpoisson%nmz(2)-1)/2) gj = gj-(ppmpoisson%nmz(2)-1)
-              ky = REAL(gj,MK)
+              ky = CMPLX(0.0_MK,gj*ppmpoisson%normky,MK)
               DO i=1,ppmpoisson%ndataz(1,isubl)
                 gi = i - 1 + (ppmpoisson%istartz(1,isubl)-1)
                 IF (gi .GT. (ppmpoisson%nmz(1)-1)/2) gi = gi-(ppmpoisson%nmz(1)-1)
-                kx = REAL(gi,MK)
+                kx = CMPLX(0.0_MK,gi*ppmpoisson%normkx,MK)
 
-                IF (gi .EQ. 0 .AND. gj .EQ. 0 .AND. gk .EQ. 0) THEN
-                  wdotk = 0.0_mk
-                ELSE
-                  wdotk = (ppmpoisson%fldzc2(1,i,j,k,isub) * kx +  &
-                        &  ppmpoisson%fldzc2(2,i,j,k,isub) * ky +  &
-                        &  ppmpoisson%fldzc2(3,i,j,k,isub) * kz) / &
-                        &  (kx*kx+ky*ky+kz*kz)
-                ENDIF
+                phix = ppmpoisson%fldzc2(1,i,j,k,isub)
+                phiy = ppmpoisson%fldzc2(2,i,j,k,isub)
+                phiz = ppmpoisson%fldzc2(3,i,j,k,isub)
 
-                ppmpoisson%fldzc2(1,i,j,k,isub) = &
-                  & (ppmpoisson%fldzc2(1,i,j,k,isub) - wdotk*kx)*normfac
-                ppmpoisson%fldzc2(2,i,j,k,isub) = &
-                  & (ppmpoisson%fldzc2(2,i,j,k,isub) - wdotk*ky)*normfac
-                ppmpoisson%fldzc2(3,i,j,k,isub) = &
-                  & (ppmpoisson%fldzc2(3,i,j,k,isub) - wdotk*kz)*normfac
+                ppmpoisson%fldzc2(1,i,j,k,isub) = (ky*phiz-kz*phiy)
+                ppmpoisson%fldzc2(2,i,j,k,isub) = (kz*phix-kx*phiz)
+                ppmpoisson%fldzc2(3,i,j,k,isub) = (kx*phiy-ky*phix)
               ENDDO
             ENDDO
           ENDDO
         ENDDO
       ENDIF
 
+
       !-----------------------------------------------------------------------
       ! IFFT pencil (Z)
       !-----------------------------------------------------------------------
@@ -476,51 +343,6 @@ trank =0
       & ppmpoisson%fldzc2, ppmpoisson%fldzc1, &
       & info)
 
-#ifdef __NOPE
-      if (ppm_rank .EQ. trank)   THEN
-            write(*,*)
-            write(*,*)
-      write(*,*) 'ifftx12', ppm_rank
-      DO isub=1,ppmpoisson%nsublistz
-        isubl=ppmpoisson%isublistz(isub)
-        DO k=1,ppmpoisson%ndataz(3,isubl)-1
-          write(*,*) 'z',k
-            DO i=1,ppmpoisson%ndataz(1,isubl)-1
-          DO j=1,ppmpoisson%ndataz(2,isubl)-1
-              write(*,'(A,E12.4,E12.4,A,$)') '  (',ppmpoisson%fldzc1(1,i,j,k,isub),')'
-            END DO
-            write(*,*)
-          END DO
-        END DO
-      END DO
-      write(*,*) 'iffty12', ppm_rank
-      DO isub=1,ppmpoisson%nsublistz
-        isubl=ppmpoisson%isublistz(isub)
-        DO k=1,ppmpoisson%ndataz(3,isubl)-1
-          write(*,*) 'z',k
-            DO i=1,ppmpoisson%ndataz(1,isubl)-1
-          DO j=1,ppmpoisson%ndataz(2,isubl)-1
-              write(*,'(A,E12.4,E12.4,A,$)') '  (',ppmpoisson%fldzc1(2,i,j,k,isub),')'
-            END DO
-            write(*,*)
-          END DO
-        END DO
-      END DO
-      write(*,*) 'ifftz12', ppm_rank
-      DO isub=1,ppmpoisson%nsublistz
-        isubl=ppmpoisson%isublistz(isub)
-        DO k=1,ppmpoisson%ndataz(3,isubl)-1
-          write(*,*) 'z',k
-            DO i=1,ppmpoisson%ndataz(1,isubl)-1
-          DO j=1,ppmpoisson%ndataz(2,isubl)-1
-              write(*,'(A,E12.4,E12.4,A,$)') '  (',ppmpoisson%fldzc1(3,i,j,k,isub),')'
-            END DO
-            write(*,*)
-          END DO
-        END DO
-      END DO
-      ENDIF
-#endif
 
       !-----------------------------------------------------------------------
       ! Map back to slabs (XY)
@@ -570,51 +392,6 @@ trank =0
       & ppmpoisson%fldxyc, ppmpoisson%fldxyr, &
       & info)
 
-#ifdef __NOPE
-      if (ppm_rank .EQ. trank)   THEN
-            write(*,*)
-            write(*,*)
-      write(*,*) 'ifftx', ppm_rank
-      DO isub=1,ppmpoisson%nsublistxy
-        isubl=ppmpoisson%isublistxy(isub)
-        DO k=1,ppmpoisson%ndataxy(3,isubl)-1
-          write(*,*) 'z',k
-            DO i=1,ppmpoisson%ndataxy(1,isubl)-1
-          DO j=1,ppmpoisson%ndataxy(2,isubl)-1
-              write(*,'(E12.4,$)') ppmpoisson%fldxyr(1,i,j,k,isub)
-            END DO
-            write(*,*)
-          END DO
-        END DO
-      END DO
-      write(*,*) 'iffty', ppm_rank
-      DO isub=1,ppmpoisson%nsublistxy
-        isubl=ppmpoisson%isublistxy(isub)
-        DO k=1,ppmpoisson%ndataxy(3,isubl)-1
-          write(*,*) 'z',k
-            DO i=1,ppmpoisson%ndataxy(1,isubl)-1
-          DO j=1,ppmpoisson%ndataxy(2,isubl)-1
-              write(*,'(E12.4,$)') ppmpoisson%fldxyr(2,i,j,k,isub)
-            END DO
-            write(*,*)
-          END DO
-        END DO
-      END DO
-      write(*,*) 'ifftz', ppm_rank
-      DO isub=1,ppmpoisson%nsublistxy
-        isubl=ppmpoisson%isublistxy(isub)
-        DO k=1,ppmpoisson%ndataxy(3,isubl)-1
-          write(*,*) 'z',k
-            DO i=1,ppmpoisson%ndataxy(1,isubl)-1
-          DO j=1,ppmpoisson%ndataxy(2,isubl)-1
-              write(*,'(E12.4,$)') ppmpoisson%fldxyr(3,i,j,k,isub)
-            END DO
-            write(*,*)
-          END DO
-        END DO
-      END DO
-      ENDIF
-#endif
 
       !-----------------------------------------------------------------------
       ! Map back to standard topology (XYZ)
@@ -718,15 +495,11 @@ trank =0
       ! Perhaps make ppm_poisson_fd take _none as argument. Then maybe no
       ! if-statement is required
       !-------------------------------------------------------------------------
-      IF (ppmpoisson%derivatives .EQ. ppm_poisson_drv_curl_fd2 .AND.&
-         & (presentcase .EQ. ppm_poisson_grn_pois_per .OR. &  !@these may be unnecessary - perhaps just the derive value
-            presentcase .EQ. ppm_poisson_grn_pois_fre)) THEN
+      IF (ppmpoisson%derivatives .EQ. ppm_poisson_drv_curl_fd2) THEN
          CALL ppm_poisson_fd(topoid,meshid,ppmpoisson%drv_vr,fieldout,&
                            & ppm_poisson_drv_curl_fd2,info)
       ENDIF
-      IF (ppmpoisson%derivatives .EQ. ppm_poisson_drv_curl_fd4 .AND.&
-         & (presentcase .EQ. ppm_poisson_grn_pois_per .OR. &  !@these may be unnecessary - perhaps just the derive value
-            presentcase .EQ. ppm_poisson_grn_pois_fre)) THEN
+      IF (ppmpoisson%derivatives .EQ. ppm_poisson_drv_curl_fd4) THEN
          CALL ppm_poisson_fd(topoid,meshid,ppmpoisson%drv_vr,fieldout,&
                            & ppm_poisson_drv_curl_fd4,info)
       ENDIF
diff --git a/src/ppm_module_poisson.f b/src/ppm_module_poisson.f
index fd0408d..e044d1a 100644
--- a/src/ppm_module_poisson.f
+++ b/src/ppm_module_poisson.f
@@ -176,7 +176,7 @@
       INTEGER,PARAMETER                          :: ppm_poisson_grn_reprojec =3
 
       INTERFACE ppm_poisson_init
-         MODULE PROCEDURE ppm_poisson_init_predef
+         MODULE PROCEDURE ppm_poisson_init
       END INTERFACE
 
       INTERFACE ppm_poisson_solve
@@ -199,8 +199,8 @@
 #define __DIM  3
 #define __ZEROSI (/0,0,0/)
 #define __NCOM  3
-#define __ROUTINE ppm_poisson_init_predef
-#include "poisson/ppm_poisson_init_predef.f"
+#define __ROUTINE ppm_poisson_init
+#include "poisson/ppm_poisson_init.f"
 #undef __ROUTINE
 #define __ROUTINE ppm_poisson_solve
 #include "poisson/ppm_poisson_solve.f"
-- 
GitLab