xref: /phasta/phSolver/common/turbsa.f (revision 712d3df0b59ebebaaeaea358162c8d2c043c6e08)
159599516SKenneth E. Jansenc-----------------------------------------------------------------------
259599516SKenneth E. Jansenc
359599516SKenneth E. Jansenc     Spalart-Allmaras turbulence model constants
459599516SKenneth E. Jansenc
559599516SKenneth E. Jansenc-----------------------------------------------------------------------
659599516SKenneth E. Jansen      module turbSA
759599516SKenneth E. Jansen
859599516SKenneth E. Jansen      real*8, allocatable ::  d2wall(:)
959599516SKenneth E. Jansen      real*8, allocatable ::  wnrm(:,:)
1059599516SKenneth E. Jansen      integer, allocatable :: otwn(:)
1159599516SKenneth E. Jansen      real*8  saCb1, saCb2, saCw1, saCw2, saCw3, saCv1, saSigma,
1259599516SKenneth E. Jansen     &        saKappa, saKappaP2Inv, saCv2P3, saCw3P6, saSigmaInv
1359599516SKenneth E. Jansen      integer, allocatable :: sidmapg(:) ! list of all surfID's, low to high
1459599516SKenneth E. Jansen
1559599516SKenneth E. Jansen      parameter (
1659599516SKenneth E. Jansen     &     saCb1        = 0.1355d0,
1759599516SKenneth E. Jansen     &     saCb2        = 0.622d0,
1859599516SKenneth E. Jansen     &     saCw1        = 3.239067817d0,
1959599516SKenneth E. Jansen     &     saCw2        = 0.3d0,
2059599516SKenneth E. Jansen     &     saCw3        = 2.0d0,
2159599516SKenneth E. Jansen     &     saKappa      = 0.41d0,
2259599516SKenneth E. Jansen     &     saSigma      = 0.666666666666666667d0,
2359599516SKenneth E. Jansen     &     saCv1        = 7.1d0,
2459599516SKenneth E. Jansen     &     saKappaP2Inv = 5.94883997620464d0,
2559599516SKenneth E. Jansen     &     saCv1P3      = 3.579109999999999d+02,
2659599516SKenneth E. Jansen     &     saCw3P6      = 64.0d0,
2759599516SKenneth E. Jansen     &     saSigmaInv   = 1.50d0
2859599516SKenneth E. Jansen     &     )
2959599516SKenneth E. Jansen
3059599516SKenneth E. Jansen
3159599516SKenneth E. Jansen      end module
3259599516SKenneth E. Jansen
3359599516SKenneth E. Jansenc-----------------------------------------------------------------------
3459599516SKenneth E. Jansenc
3559599516SKenneth E. Jansenc     Initialize: compute the distance to the nearest wall for
3659599516SKenneth E. Jansenc     each vertex in the mesh.
3759599516SKenneth E. Jansenc
3859599516SKenneth E. Jansenc     Michael Yaworski (fall 1998)
3959599516SKenneth E. Jansenc
4059599516SKenneth E. Jansenc-----------------------------------------------------------------------
4159599516SKenneth E. Jansen      subroutine initTurb( x )
4259599516SKenneth E. Jansen
4359599516SKenneth E. Jansen      use     pointer_data
4459599516SKenneth E. Jansen      use     turbSA
4559599516SKenneth E. Jansen      include "common.h"
4659599516SKenneth E. Jansen      include "mpif.h"
4759599516SKenneth E. Jansen
48513954efSKenneth E. Jansen      character(len=20) fname1,  fmt1
4959599516SKenneth E. Jansen      real*8   x(numnp,nsd)
50*5dfdb27dSKenneth E. Jansen      integer  nwall(numpe),      idisp(numpe), npwmark(numnp)
51513954efSKenneth E. Jansen      character(len=5)  cname
52*5dfdb27dSKenneth E. Jansen      real*8, allocatable :: xwi(:,:), xw(:,:)
5359599516SKenneth E. Jansen
5459599516SKenneth E. Jansen!MR CHANGE
5559599516SKenneth E. Jansen      integer :: ierr
5659599516SKenneth E. Jansen      integer :: numparts, nfile, itmp2, id2wall, itwo, ifoundd2wall
5759599516SKenneth E. Jansen      integer iarray(10)
58513954efSKenneth E. Jansen      character(len=255) :: fnamer, fname2, temp2
59513954efSKenneth E. Jansen      character(len=64) :: temp1
6059599516SKenneth E. Jansen!MR CHANGE END
6159599516SKenneth E. Jansen
6259599516SKenneth E. Jansen      allocate ( d2wall(numnp) )
6359599516SKenneth E. Jansen
6459599516SKenneth E. Jansen!MR CHANGE
6559599516SKenneth E. Jansen      if(myrank.eq.master) then
6659599516SKenneth E. Jansen        write (*,*) 'entering initTurb'
6759599516SKenneth E. Jansen      endif
6859599516SKenneth E. Jansen      call MPI_BARRIER(MPI_COMM_WORLD,ierr)
6959599516SKenneth E. Jansen
7059599516SKenneth E. Jansen      ! First we try to read the d2wall field from either the restart files or the d2wall files
7159599516SKenneth E. Jansen      call read_d2wall(myrank,numnp,d2wall,ifoundd2wall)
7259599516SKenneth E. Jansen!MR CHANGE END
7359599516SKenneth E. Jansen
7459599516SKenneth E. Jansen      if(ifoundd2wall.eq.0) then   ! d2wall was not found so calculate the distance
7559599516SKenneth E. Jansen        if(myrank.eq.master) then
7659599516SKenneth E. Jansen          write (*,*) 'Computing the d2wall field'
7759599516SKenneth E. Jansen        endif
7859599516SKenneth E. Jansenc
7959599516SKenneth E. Jansenc   hard code trip point until we are sure it is worth doing
8059599516SKenneth E. Jansenc
8159599516SKenneth E. Jansen
8259599516SKenneth E. Jansenc
83*5dfdb27dSKenneth E. Jansenc.... find the points that are on the wall and mark npwmap with a 1 if they are
8459599516SKenneth E. Jansenc
85*5dfdb27dSKenneth E. Jansen         npwmark(1:numnp)=0
8659599516SKenneth E. Jansen         do iblk = 1, nelblb    ! loop over boundary elt blocks
8759599516SKenneth E. Jansen            npro = lcblkb(1,iblk+1) - lcblkb(1,iblk)
8859599516SKenneth E. Jansen            nenbl  = lcblkb(6,iblk) ! no. of vertices per bdry. face
89*5dfdb27dSKenneth E. Jansen            do j = 1, npro
9059599516SKenneth E. Jansen               if(btest(miBCB(iblk)%p(j,1),4)) then
91*5dfdb27dSKenneth E. Jansen                  do k=1,nenbl
92*5dfdb27dSKenneth E. Jansen                    npw=mienb(iblk)%p(j,k)
93*5dfdb27dSKenneth E. Jansen                    npwmark(npw)=1
9459599516SKenneth E. Jansen                  enddo
9559599516SKenneth E. Jansen                endif
96*5dfdb27dSKenneth E. Jansen            enddo
97*5dfdb27dSKenneth E. Jansen         enddo
98*5dfdb27dSKenneth E. Jansen         nwalli=sum(npwmark(1:numnp))
99*5dfdb27dSKenneth E. Jansen         markNeeded=1
100*5dfdb27dSKenneth E. Jansen         if (nwalli.eq.0) then
101*5dfdb27dSKenneth E. Jansen             markNeeded=0
102*5dfdb27dSKenneth E. Jansen             nwalli=1 !  patch for mpi's lack of imagination
103*5dfdb27dSKenneth E. Jansen         endif
104*5dfdb27dSKenneth E. Jansen         allocate (xwi(nwalli,nsd))
105*5dfdb27dSKenneth E. Jansen
106*5dfdb27dSKenneth E. Jansen         if(markneeded.eq.1) then
107*5dfdb27dSKenneth E. Jansen           nwalli=0
108*5dfdb27dSKenneth E. Jansen           do i = 1,numnp
109*5dfdb27dSKenneth E. Jansen              if(npwmark(i).eq.1)  then
110*5dfdb27dSKenneth E. Jansen                nwalli=nwalli+1
111*5dfdb27dSKenneth E. Jansen                xwi(nwalli,1:nsd)=x(i,1:nsd)
112*5dfdb27dSKenneth E. Jansen              endif
113*5dfdb27dSKenneth E. Jansen           enddo
114*5dfdb27dSKenneth E. Jansen         else
115*5dfdb27dSKenneth E. Jansen           xwi=1.0e32 ! fix for mpi's lack of imagination
116*5dfdb27dSKenneth E. Jansen         endif
11759599516SKenneth E. Jansenc
11859599516SKenneth E. Jansenc  Pool "number of welts" info from all processors
11959599516SKenneth E. Jansenc
12059599516SKenneth E. JansencMPI_ALLGATHER(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm)
12159599516SKenneth E. Jansenc[ IN sendbuf] starting address of send buffer (choice)
12259599516SKenneth E. Jansenc[ IN sendcount] number of elements in send buffer (integer)
12359599516SKenneth E. Jansenc[ IN sendtype] data type of send buffer elements (handle)
12459599516SKenneth E. Jansenc[ OUT recvbuf] address of receive buffer (choice)
12559599516SKenneth E. Jansenc[ IN recvcount] number of elements received from any process (integer)
12659599516SKenneth E. Jansenc[ IN recvtype] data type of receive buffer elements (handle)
12759599516SKenneth E. Jansenc[ IN comm] communicator (handle)
12859599516SKenneth E. Jansen         if (numpe.gt.1) then   ! multiple processors
12959599516SKenneth E. Jansenc write the number of wall elts on the jth processor to slot j of nwall
13059599516SKenneth E. Jansen            call MPI_ALLGATHER(nwalli,1,MPI_INTEGER,nwall,1,
13159599516SKenneth E. Jansen     &          MPI_INTEGER,MPI_COMM_WORLD,ierr)
13259599516SKenneth E. Jansenc count up the total number of wall elts among all processes
13359599516SKenneth E. Jansen            nwallt=0
13459599516SKenneth E. Jansen            do j=1,numpe
13559599516SKenneth E. Jansen               nwallt=nwallt+nwall(j)
13659599516SKenneth E. Jansen            enddo
13759599516SKenneth E. Jansen         else                   ! single processor
13859599516SKenneth E. Jansenc the local information is the global information for single-processor
13959599516SKenneth E. Jansen            nwall=nwalli
14059599516SKenneth E. Jansen            nwallt=nwalli
14159599516SKenneth E. Jansen         endif                  ! if-else for multiple processors
14259599516SKenneth E. Jansenc
14359599516SKenneth E. Jansenc  Make all-processor wallnode-coord collage
14459599516SKenneth E. Jansenc
145*5dfdb27dSKenneth E. Jansen         allocate (xw(nwallt,nsd))
14659599516SKenneth E. Jansen         if (numpe.gt.1) then   ! multiple processors
14759599516SKenneth E. Jansenc we will gather coordinates from local on-proc sets to a global set
14859599516SKenneth E. Jansenc we will stack each processor's coordinate list atop that of the
14959599516SKenneth E. Jansenc previous processor.  If the coordinate list for processor i is
15059599516SKenneth E. Jansenc called xwi, then our global coordinate list xw will look like this:
15159599516SKenneth E. Jansenc ---------------------------------------------------------------
15259599516SKenneth E. Jansenc | xw1            | xw2                | xw3        |   ...    |
15359599516SKenneth E. Jansenc ---------------------------------------------------------------
15459599516SKenneth E. Jansenc  <---nwall(1)---> <-----nwall(2)-----> <-nwall(3)->
15559599516SKenneth E. Jansenc  <------------------------nwallt-----------------------...---->
15659599516SKenneth E. Jansenc To accomplish this with MPI, we use MPI_ALLGATHERV, summarized as:
15759599516SKenneth E. JansencMPI_ALLGATHERV(sendbuf,sendcount,sendtype,recvbuf,recvcount,disp,recvtype,comm)
15859599516SKenneth E. Jansenc[ IN sendbuf] starting address of send buffer (choice)
15959599516SKenneth E. Jansenc[ IN sendcount] number of elements in send buffer (integer)
16059599516SKenneth E. Jansenc[ IN sendtype] data type of send buffer elements (handle)
16159599516SKenneth E. Jansenc[ OUT recvbuf] address of receive buffer (choice)
16259599516SKenneth E. Jansenc[ IN recvcount] number of elements received from any process (integer)
16359599516SKenneth E. Jansenc[ IN disp] displacement array
16459599516SKenneth E. Jansenc[ IN recvtype] data type of receive buffer elements (handle)
16559599516SKenneth E. Jansenc[ IN comm] communicator (handle)
16659599516SKenneth E. Jansenc The displacement array disp is an array of integers in which the jth
16759599516SKenneth E. Jansenc entry indicates which slot of xw marks beginning of xwj
16859599516SKenneth E. Jansenc So, first we will build this displacement array
16959599516SKenneth E. Jansen            idisp(:)=0 ! starting with zero, since MPI likes C-numbering
17059599516SKenneth E. Jansen            do j=2,numpe
17159599516SKenneth E. Jansen               idisp(j)=idisp(j-1)+nwall(j-1) ! see diagram above
17259599516SKenneth E. Jansen            enddo
17359599516SKenneth E. Jansen            do k=1,nsd
174*5dfdb27dSKenneth E. Jansen               call MPI_ALLGATHERV(xwi(:,k),nwalli,
175*5dfdb27dSKenneth E. Jansen     &              MPI_DOUBLE_PRECISION,xw(:,k),nwall,idisp,
17659599516SKenneth E. Jansen     &              MPI_DOUBLE_PRECISION,MPI_COMM_WORLD,ierr)
17759599516SKenneth E. Jansen            enddo
17859599516SKenneth E. Jansen         else                   ! single-processor
17959599516SKenneth E. Jansenc global data is local data in single processor case
18059599516SKenneth E. Jansen            xw=xwi
18159599516SKenneth E. Jansen         endif
18259599516SKenneth E. Jansen
18359599516SKenneth E. Jansenc
18459599516SKenneth E. Jansenc  For each point, loop over wall nodes and calculate distance;
18559599516SKenneth E. Jansenc  save the distance in this node's position of d2wall if it's
18659599516SKenneth E. Jansenc  shorter than currently stored distance
18759599516SKenneth E. Jansenc
18859599516SKenneth E. Jansen         d2wall=1.0e32
18959599516SKenneth E. Jansen         do i=1,numnp
19059599516SKenneth E. Jansen            do j=1, nwallt
191*5dfdb27dSKenneth E. Jansen               distance =  ( x(i,1) - xw(j,1) )**2
192*5dfdb27dSKenneth E. Jansen     &              +( x(i,2) - xw(j,2) )**2
193*5dfdb27dSKenneth E. Jansen     &              +( x(i,3) - xw(j,3) )**2
19459599516SKenneth E. Jansen               if ( d2wall(i).gt.distance ) d2wall(i) = distance
19559599516SKenneth E. Jansen            enddo
19659599516SKenneth E. Jansen         enddo
19759599516SKenneth E. Jansen         d2wall=sqrt(d2wall)
19859599516SKenneth E. Jansenc
19959599516SKenneth E. Jansen         deallocate(xwi)
20059599516SKenneth E. Jansen         deallocate(xw)
20159599516SKenneth E. Jansen      endif
20259599516SKenneth E. Jansen
20359599516SKenneth E. Jansen      call MPI_BARRIER(MPI_COMM_WORLD,ierr)
20459599516SKenneth E. Jansen      if(myrank.eq.master) then
20559599516SKenneth E. Jansen        write (*,*) 'leaving initTurb'
20659599516SKenneth E. Jansen      endif
20759599516SKenneth E. Jansen
20859599516SKenneth E. Jansen      return
20959599516SKenneth E. Jansen995     call error ('d2wall  ','opening ', 72)
21059599516SKenneth E. Jansen996     call error ('d2wall  ','opening ', 72)
21159599516SKenneth E. Jansen
21259599516SKenneth E. Jansen      end subroutine
21359599516SKenneth E. Jansen
21459599516SKenneth E. Jansen
215