+ <pre class="pre_special">program vort<br><br> implicit none<br><br> ! use FFTW for the Fourier transforms<br> include "fftw3.f"<br><br><br> integer, parameter :: mytype = 8<br> <br> ! global size<br> integer, parameter :: n1=8, n2=8, n3=8 <br><br><br><br><br><br><br> real(mytype), allocatable, dimension(:,:,:) :: &<br> ox,oy,oz, uu,vv,ww<br> complex(mytype), allocatable, dimension(:,:,:) :: &<br> Ax,Ay,Az,U,V,W<br><br> integer*8 :: plan<br><br><br><br> ! allocate space for real-space vorticity field<br> allocate(ox(0:n1-1,0:n2-1,0:n3-1))<br> allocate(oy(0:n1-1,0:n2-1,0:n3-1))<br> allocate(oz(0:n1-1,0:n2-1,0:n3-1))<br><br><br><br><br><br><br> <br> ! initialise vorticity in real-space <br> do k=0,n3-1<br> do j=0,n2-1<br> do i=0,n1-1<br><br> ! init ox, oy, oz<br> call vortexOmega( &<br> ox(i,j,k),oy(i,j,k),oz(i,j,k), &<br> xgs+dx*(i+0.5-1), ygs+dy*(j+0.5-1), &<br> zgs+dz*(k+0.5-1))<br> end do<br> end do<br> end do<br><br><br><br><br><br><br> ! allocate space for wave-space variables<br> allocate(Ax(0:n1/2,0:n2-1,0:n3-1))<br> allocate(Ay(0:n1/2,0:n2-1,0:n3-1))<br> allocate(Az(0:n1/2,0:n2-1,0:n3-1))<br> allocate(U(0:n1/2,0:n2-1,0:n3-1))<br> allocate(V(0:n1/2,0:n2-1,0:n3-1))<br> allocate(W(0:n1/2,0:n2-1,0:n3-1))<br><br><br><br><br><br><br><br><br><br><br><br><br><br> ! Using FFTW, <br> ! forward FFT - ox,oy,oz -> Ax,Ay,Az<br> call dfftw_plan_dft_r2c_3d( &<br> plan,n1,n2,n3,ox,Ax,FFTW_ESTIMATE)<br> call dfftw_execute_dft_r2c(plan,ox,Ax)<br> call dfftw_plan_dft_r2c_3d( &<br> plan,n1,n2,n3,oy,Ay,FFTW_ESTIMATE)<br> call dfftw_execute_dft_r2c(plan,oy,Ay)<br> call dfftw_plan_dft_r2c_3d( &<br> plan,n1,n2,n3,oz,Az,FFTW_ESTIMATE)<br> call dfftw_execute_dft_r2c(plan,oz,Az)<br><br> deallocate(ox,oy,oz)<br><br> ! Fourier domain stuff<br> do k=0,n3-1<br> do j=0,n2-1<br> do i=0,n1/2<br><br> ! wave-space calculation omitted<br> U(i,j,k) = ......<br> V(i,j,k) = ......<br> W(i,j,k) = ......<br><br> end do<br> end do<br> end do<br><br> deallocate(Ax,Ay,Az)<br> <br> ! allocate real-space velocity variables<br> allocate(uu(0:n1-1,0:n2-1,0:n3-1))<br> allocate(vv(0:n1-1,0:n2-1,0:n3-1))<br> allocate(ww(0:n1-1,0:n2-1,0:n3-1))<br><br><br><br><br><br><br><br> ! Using FFTW, <br> ! inverse FFT U,V,W -> uu,vv,ww<br> call dfftw_plan_dft_c2r_3d( &<br> plan,n1,n2,n3,U,uu,FFTW_ESTIMATE)<br> call dfftw_execute_dft_c2r(plan,U,uu)<br> call dfftw_plan_dft_c2r_3d( &<br> plan,n1,n2,n3,V,vv,FFTW_ESTIMATE)<br> call dfftw_execute_dft_c2r(plan,V,vv)<br> call dfftw_plan_dft_c2r_3d( &<br> plan,n1,n2,n3,W,ww,FFTW_ESTIMATE)<br> call dfftw_execute_dft_c2r(plan,W,WW)<br><br> ! rescale<br> uu = uu*scale<br> vv = vv*scale<br> ww = ww*scale<br><br> deallocate(U,V,W)<br><br> ! write out using Fortran direct access <br> inquire(iolength=iol) uu(1,1,1)<br> open(10, FILE='data_serial', &<br> FORM='unformatted', &<br> ACCESS='DIRECT', RECL=iol)<br> n=1<br> do k=0,n3-1<br> do j=0,n2-1<br> do i=0,n1-1<br> write(10,rec=n) uu(i,j,k)<br> n=n+1<br> end do<br> end do<br> end do<br> do k=0,n3-1<br> do j=0,n2-1<br> do i=0,n1-1<br> write(10,rec=n) vv(i,j,k)<br> n=n+1<br> end do<br> end do<br> end do<br> do k=0,n3-1<br> do j=0,n2-1<br> do i=0,n1-1<br> write(10,rec=n) ww(i,j,k)<br> n=n+1<br> end do<br> end do<br> end do<br> close(10)<br><br> deallocate(uu,vv,ww)<br><br><br><br><br><br><br>end program vort<br></pre>
0 commit comments