[Nek5000-users] Transfer data from an nelx*nely*nelz array of Nth-order to an n*n*n array for FFT analysis

nek5000-users at lists.mcs.anl.gov nek5000-users at lists.mcs.anl.gov
Sat May 5 07:10:31 CDT 2012


Hi All,

In regards to the discussion on this issue. I have been lately  
interpolating  from the SEM nek5000 grid onto an equidistant grid and  
performing FFT to obtain two-point correlations and energy spectrum  
for pipe flow simulations.

During the simulation, I outpost fields from nek5000 containing the  
velocity and pressure. After the simulation ends, I would use a  
simplified version of nek5000 where I loop on these files and  
interpolate in parallel. Upon reading each file, I interpolate to a  
cylindrical mesh that is equidistant in the axial and azimuthal  
direction, and non-uniform in the radial direction.

Since my grid is huge, I do the interpolation in tubes. I loop in the
radial direction, and for each radial position, I generate the
equidistant (z,theta)-grid then interpolate the velocities and
pressure etc.. onto that grid using subroutines used in hpts. Each
data in a tube is sent to a separate processors where I perform FFT
analysis. The FFT analysis is performed using FFT subroutines included
in a .f file which I added to nek5000.

This procedure continues until I finish looping on all my files.

Best
George


Quoting nek5000-users at lists.mcs.anl.gov:

> Le 04/05/2012 13:55, nek5000-users at lists.mcs.anl.gov a écrit :
>> Hi Neks,
>> another point I'm (even more) interested in is: how do you do your  
>> FFT analysis?
>> I guess in a first step the grid is mapped onto a regular grid
>> (ifreguo = .true.) and in a second step the FFT is computed at that
>> grid.
>> Then the question arises: What is a good choice for "nrg" (with nrg as
>> the dimension of regular grid (nrg**ndim)...)? nrg=lx1 or lx1-1?
>> Regards
>> Jan
>>
>> 2012/4/13 Jan Frielinghausen<jan.frielinghausen at googlemail.com>:
>>> Hi Neks, Hi Can,
>>> I too would be very interested in getting more information about  
>>> these routines.
>>> regards
>>> Jan
>>>
>>> Am 5. April 2012 18:10 schrieb<nek5000-users at lists.mcs.anl.gov>:
>>>> Hi neks !
>>>>
>>>> For a given velocity field
>>>> (vx(1:lx1,1:ly1,1:lz1,1:lelv),vy(1:lx1,1:ly1,1:lz1,1:lelv),vz(1:lx1,1:ly1,1:lz1,1:lelv))
>>>> i would like to calculate the energy spectrum, this implies FFT
>>>> transformation on regular arrays
>>>> vx(1:n,1:n,1:n),vy(1:n,1:n,1:n),vz(1:n,1:n,1:n) (need
>>>> deltax=deltay=deltaz=cst).
>>>> On the emailing-list it has been said :
>>>> "We do have off-line serial routines
>>>> that can transfer data from an nelx x nely x nelz array of Nth-order
>>>> elements to an nxnxn array - this allows for analysis by FFTs etc"
>>>>
>>>>
>>>> Can you please tell me more about this ? What are these routines ??
>>>> B.regards
>>>> Can
>>>>
>>>> _______________________________________________
>>>> Nek5000-users mailing list
>>>> Nek5000-users at lists.mcs.anl.gov
>>>> https://lists.mcs.anl.gov/mailman/listinfo/nek5000-users
>> _______________________________________________
>> Nek5000-users mailing list
>> Nek5000-users at lists.mcs.anl.gov
>> https://lists.mcs.anl.gov/mailman/listinfo/nek5000-users
>>
> The solution (i think its more an hack than a real solution) i  
> found, was to create an hpts.in file with the coordinates of every  
> points of the regular mesh
> i wrote the fallowing routine for this :
> (My domain is a cube of length 2pi*2pi*2pi, you can surely adapt the  
> fallowing routine for other simple geometries)
>
> subroutine generehptsin(ndummy,ldummy,uprn)
>     implicit none
> c  ndummy = number of grid points per dimension
> c  ldummy = length in one dimension
> c  uprn = dummy variable for output
> c  you need nx=ny=nz and deltax=deltay=deltaz
> c  For fft analysis you have to ensure that ndummy**3 is equal to  
> 2^n (ex : 128 points = 2^7)
>     integer ndummy,i,j,k,uprn
>     real*8    ldummy,deltax,
> &    x(0:ndummy-1),y(0:ndummy-1),z(0:ndummy-1)
>     open(uprn,file='hpts.in',status='unknown')
> c    compute deltax
>     deltax=0
>     deltax=ldummy/(ndummy-1)
> c    fil vectors : x,y,z
>     x=0
>     y=0
>     z=0
>     do i=0, ndummy-1
>     x(i)=i*deltax
>     y(i)=i*deltax
>     z(i)=i*deltax
>     enddo
>     write(uprn,*)ndummy*ndummy*ndummy    ! total number of grid  
> points in the first line
>     do k=0, ndummy-1
>     do j=0, ndummy-1
>     do i=0, ndummy-1
>     write(uprn,'(1p20E15.7)')x(i),y(j),z(k)
>     enddo
>     enddo
>     enddo
>     close(uprn)
>     return
>     end
>
> Then modify the hpts() subroutine slightly (just to be able to  
> access to the "fieldout" matrix  when you call hpts() in userchk())
> Eg :  modify "subroutine hpts()" to "subroutine hpts(fieldout)"  
> (it's the first line of hpts routine in postpro.f)
> You will also probably want to comment the fallowing lines to avoid  
> hpts to write in the hpts.out.
>
>       ! write interpolation results to hpts.out
> c      if(nid.eq.0) then
> c        do ip = 1,npoints
> c           write(50,'(1p20E15.7)') time,
> c &      (fieldout(i,ip), i=1,nflds)
> c        enddo
> c      endif
> c      if(nid.eq.0) write(6,*) 'done :: dump history points'
>
>
> Then, to express the velocity field in a v(i,j,k) layout, i wrote  
> the fallowing routine :
>
>     subroutine reformatfield(nfldm,fieldout,
> &    ndummy,vxrdummy,vyrdummy,vzrdummy)
>
> c  You have to call this in userchk routine without changing the  
> first two input arguments
>     implicit none
> c  fieldout is now the output matrix of the hpts routine, we need this matrix
> c  nfldm is the number of field you resolve
> c  ndummy is the number of grid points per dimension
> c  vxrdummx is the x component of the velocity field in a regular grid
> c  vxrdummy is the y component of the velocity field in a regular grid
> c  vxrdummz is the z component of the velocity field in a regular grid
>     integer ndummy,i,j,k,z,nfldm
>     real     field1(ndummy*ndummy*ndummy),
> &        field2(ndummy*ndummy*ndummy),
> &        field3(ndummy*ndummy*ndummy),
> &        fieldout(nfldm,ndummy*ndummy*ndummy),
> &        vxrdummy(1:ndummy,1:ndummy,1:ndummy),
> &        vyrdummy(1:ndummy,1:ndummy,1:ndummy),
> &        vzrdummy(1:ndummy,1:ndummy,1:ndummy)
>
>
>
>     do i=1,ndummy*ndummy*ndummy
>     field1(i)=fieldout(1,i)    ! vx
>     field2(i)=fieldout(2,i)    ! vy
>     field3(i)=fieldout(3,i)    ! vz
>     enddo
>
>     z=0
>     do k=1,ndummy
>         do j=1,ndummy
>             do i=1,ndummy
>             vxrdummy(i,j,k)=field1(i+z)
>             vyrdummy(i,j,k)=field2(i+z)
>             vzrdummy(i,j,k)=field3(i+z)
>             enddo
>         z=z+ndummy
>         enddo
>     enddo
>     return
>     end
>
> This routine will output a velocity field expressed in a regular  
> grid with v=v(i,j,k) layout. You can, from there, use any FFT  
> routine for fft analysis.
> I used the "four1" routine that you can find on the "numerical recipies" tome
> Sorry for my poor english and  hope that will help
> For your question i think nrg=nelx*lx1 (1D) because, the number of  
> grid points on a 1D gll mesh is nelx * lx1 with lx1=N+1
> B.regards
>
>
>
> _______________________________________________
> Nek5000-users mailing list
> Nek5000-users at lists.mcs.anl.gov
> https://lists.mcs.anl.gov/mailman/listinfo/nek5000-users
>



----------------------------------------------------------------
This message was sent using IMP, the Internet Messaging Program.



More information about the Nek5000-users mailing list