[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
Fri May 4 07:51:15 CDT 2012
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
More information about the Nek5000-users
mailing list