[Nek5000-users] Using an external file for forcing in 'ffx'

nek5000-users at lists.mcs.anl.gov nek5000-users at lists.mcs.anl.gov
Wed Jul 11 10:34:26 CDT 2018


 Hey All,

I have been stuck in this problem for a while now but I think it should be
simple and probably you can tell where I am going wrong.

- So I have a forcing function on a finite difference X-Y grid, which I am
reading in as a text file in the 'userdat2' subroutine.

- I am then parallelizing it using a previous suggestion by Paul, here is a
snippet of the routine.

------------------------------------------------------------
--------------------------------------------

     subroutine usrdat2


      include 'SIZE'

      include 'TOTAL'

       double precision :: my_array(651)

       integer m

        common /myarray/ my_array


        parameter (my_array_size=651)


        real  work(my_array_size)



        n = my_array_size


        call rzero(my_array,n)

        call rzero(work,n)


        if (nid.eq.0) then

          open (unit=49,file='fint41.txt')

             do k = 1,n

                read(49,*) my_array(k)

             enddo

          close(49)

        endif


         call gop(my_array,work,'+  ',n)   !  Sum over all processors


      return

      end
------------------------------------------------------------
---------------------------------------------

- Next I am interpolating this forcing function to the GLL grid points in
the userf routine, by a piecewise linear interpolant, here's how,

------------------------------------------------------------
----------------------------------------------

     subroutine userf  (ix,iy,iz,ieg)


      include 'SIZE'

      include 'TOTAL'

      include 'NEKUSE'

      EQUIVALENCE    (prandtl,param(2))


         double precision :: my_array(651)

         double precision :: shaped_array(31,21)

         real new_array(nx1,ny1,nz1,nelv)

         double precision :: xin(21),yin(31)

         double precision :: xn(nx1*ny1*nelv),yn(nx1*ny1*nelv)

         double precision :: fo(nx1*ny1*nelv)

         integer i,j,k,l,p,q

         integer e,eg

         common /myarray/ my_array


         open(16,file='xin.txt')

         do p=1,21

         read(16,*) xin(p)

         end do

         close(16)


         open(12,file='yin.txt')

         do q=1,31

         read(12,*) yin(q)

         end do

         close(12)


         shaped_array = reshape(my_array,(/31,21/))


         do i=1,nx1*ny1*nelv

         xn(i) = xm1(i,1,1,1)

         yn(i) = ym1(i,1,1,1)

         end do

         call pwl_interp_2d(31,21,yin,xin,shaped_array,nx1*ny1*nelv,yn,xn,
fo)

        new_array=reshape(fo,(/nx1,ny1,nz1,nelv/))


                 do e=1,nelv

                      eg = lglel(e)

                      ffx = new_array(ix,iy,iz,eg)

                 end do


         ffy = 0.0

         ffz = 0.0


      return

      end


------------------------------------------------------------
---------------------------------------------------------------------------

This is a test domain I made, with 6 elements. It seems to be working when
I am using only 1 core, i.e., in series. In parallel, it seems to be giving
me a different flowfield. My actual domain has 252 elements which I intend
to parallelize with 48 cores. So would like to ask you how to proceed. I
think I am close but I am slightly confused about part of the code that I
have made red.

When I am trying this in my actual domain, I get an error, "Segmentation
fault occurred." I think the key here is parallelization and identifying
the elements correctly which I am not sure I am doing right. Thanks for
reading this lengthy email. Will be eager to hear from you.

Thanks,
Saikat
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/nek5000-users/attachments/20180711/06424308/attachment-0001.html>


More information about the Nek5000-users mailing list