From caf17f98faa663d0e48f0bfe0b2a7cfa798dc2da Mon Sep 17 00:00:00 2001 From: jtra <jtra@7c7fe9aa-52eb-4d9e-b0a8-ba7d787348e9> Date: Sun, 26 Jun 2011 08:32:44 +0000 Subject: [PATCH] new features: spectral derivatives(curl) for periodic greens function vorticity reprojection for periodic domains freespace solution to poisson equation git-svn-id: https://ppm.inf.ethz.ch/svn/ppmnumerics/branches/ngtopo/libppmnumerics@1025 7c7fe9aa-52eb-4d9e-b0a8-ba7d787348e9 --- src/poisson/ppm_poisson_init.f | 35 +++++++++------ src/poisson/ppm_poisson_solve.f | 77 ++++++++++++++++++--------------- 2 files changed, 63 insertions(+), 49 deletions(-) diff --git a/src/poisson/ppm_poisson_init.f b/src/poisson/ppm_poisson_init.f index 38caaaa..b48b9ab 100644 --- a/src/poisson/ppm_poisson_init.f +++ b/src/poisson/ppm_poisson_init.f @@ -190,22 +190,9 @@ & LBOUND(fieldout,5):UBOUND(fieldout,5))) ELSE IF (derive .EQ. ppm_poisson_drv_curl_sp) THEN 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 + 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 @@ -216,6 +203,26 @@ ELSE ppmpoisson%derivatives = ppm_poisson_drv_none ENDIF + !------------------------------------------------------------------------- + ! Create spectral scaling components always. Just in case some + ! reprojection comes up + ! The conditionals need to be for not just the Poisson equation + !------------------------------------------------------------------------- + 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 + 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 diff --git a/src/poisson/ppm_poisson_solve.f b/src/poisson/ppm_poisson_solve.f index 7488423..12ab83c 100644 --- a/src/poisson/ppm_poisson_solve.f +++ b/src/poisson/ppm_poisson_solve.f @@ -54,8 +54,7 @@ INTEGER :: i,j,k INTEGER :: info2 INTEGER :: presentcase - REAL(__PREC) :: wdotgreenr - COMPLEX(__PREC) :: wdotgreenc + COMPLEX(__PREC) :: helmholtzpic INTEGER :: gi,gj,gk COMPLEX(__PREC) :: kx,ky,kz COMPLEX(__PREC) :: phix,phiy,phiz @@ -236,23 +235,29 @@ !----------------------------------------------------------------------- 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%case .EQ. ppm_poisson_grn_pois_fre) THEN + normfac = 1.0_MK/ REAL((ppmpoisson%nmz(1))* & !vertex + & (ppmpoisson%nmz(2))* & + & (ppmpoisson%nmz(3)),MK) + ELSE IF (ppmpoisson%case .EQ. ppm_poisson_grn_pois_per) THEN + normfac = 1.0_MK/ REAL((ppmpoisson%nmz(1)-1)* & !vertex + & (ppmpoisson%nmz(2)-1)* & + & (ppmpoisson%nmz(3)-1),MK) + ENDIF 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 = REAL(gk,MK)*ppmpoisson%normkz 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 = REAL(gj,MK)*ppmpoisson%normky 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 = REAL(gi,MK)*ppmpoisson%normkx !IF (gi .EQ. 0 .AND. gj .EQ. 0 .AND. gk .EQ. 0) THEN !wdotk = 0.0_mk @@ -271,27 +276,27 @@ !& (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) + helmholtzpic = (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) = & !@formatting + & (ppmpoisson%fldzc2(1,i,j,k,isub)*normfac - helmholtzpic*kx) + ppmpoisson%fldzc2(2,i,j,k,isub) = & + & (ppmpoisson%fldzc2(2,i,j,k,isub)*normfac - helmholtzpic*ky) + ppmpoisson%fldzc2(3,i,j,k,isub) = & + & (ppmpoisson%fldzc2(3,i,j,k,isub)*normfac - helmholtzpic*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) + helmholtzpic = (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) = & !@formatting + & (ppmpoisson%fldzc2(1,i,j,k,isub)*normfac - helmholtzpic*kx) + ppmpoisson%fldzc2(2,i,j,k,isub) = & + & (ppmpoisson%fldzc2(2,i,j,k,isub)*normfac - helmholtzpic*ky) + ppmpoisson%fldzc2(3,i,j,k,isub) = & + & (ppmpoisson%fldzc2(3,i,j,k,isub)*normfac - helmholtzpic*kz) ENDIF ENDDO @@ -495,13 +500,15 @@ ! 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) 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) THEN - CALL ppm_poisson_fd(topoid,meshid,ppmpoisson%drv_vr,fieldout,& - & ppm_poisson_drv_curl_fd4,info) + IF (presentcase .NE. ppm_poisson_grn_reprojec) 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) THEN + CALL ppm_poisson_fd(topoid,meshid,ppmpoisson%drv_vr,fieldout,& + & ppm_poisson_drv_curl_fd4,info) + ENDIF ENDIF !------------------------------------------------------------------------- -- GitLab