xref: /phasta/phSolver/common/turbsa.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
2*59599516SKenneth E. Jansenc
3*59599516SKenneth E. Jansenc     Spalart-Allmaras turbulence model constants
4*59599516SKenneth E. Jansenc
5*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
6*59599516SKenneth E. Jansen      module turbSA
7*59599516SKenneth E. Jansen
8*59599516SKenneth E. Jansen      real*8, allocatable ::  d2wall(:)
9*59599516SKenneth E. Jansen      real*8, allocatable ::  wnrm(:,:)
10*59599516SKenneth E. Jansen      integer, allocatable :: otwn(:)
11*59599516SKenneth E. Jansen      real*8  saCb1, saCb2, saCw1, saCw2, saCw3, saCv1, saSigma,
12*59599516SKenneth E. Jansen     &        saKappa, saKappaP2Inv, saCv2P3, saCw3P6, saSigmaInv
13*59599516SKenneth E. Jansen      integer, allocatable :: sidmapg(:) ! list of all surfID's, low to high
14*59599516SKenneth E. Jansen
15*59599516SKenneth E. Jansen      parameter (
16*59599516SKenneth E. Jansen     &     saCb1        = 0.1355d0,
17*59599516SKenneth E. Jansen     &     saCb2        = 0.622d0,
18*59599516SKenneth E. Jansen     &     saCw1        = 3.239067817d0,
19*59599516SKenneth E. Jansen     &     saCw2        = 0.3d0,
20*59599516SKenneth E. Jansen     &     saCw3        = 2.0d0,
21*59599516SKenneth E. Jansen     &     saKappa      = 0.41d0,
22*59599516SKenneth E. Jansen     &     saSigma      = 0.666666666666666667d0,
23*59599516SKenneth E. Jansen     &     saCv1        = 7.1d0,
24*59599516SKenneth E. Jansen     &     saKappaP2Inv = 5.94883997620464d0,
25*59599516SKenneth E. Jansen     &     saCv1P3      = 3.579109999999999d+02,
26*59599516SKenneth E. Jansen     &     saCw3P6      = 64.0d0,
27*59599516SKenneth E. Jansen     &     saSigmaInv   = 1.50d0
28*59599516SKenneth E. Jansen     &     )
29*59599516SKenneth E. Jansen
30*59599516SKenneth E. Jansen
31*59599516SKenneth E. Jansen      end module
32*59599516SKenneth E. Jansen
33*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
34*59599516SKenneth E. Jansenc
35*59599516SKenneth E. Jansenc     Initialize: compute the distance to the nearest wall for
36*59599516SKenneth E. Jansenc     each vertex in the mesh.
37*59599516SKenneth E. Jansenc
38*59599516SKenneth E. Jansenc     Michael Yaworski (fall 1998)
39*59599516SKenneth E. Jansenc
40*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
41*59599516SKenneth E. Jansen      subroutine initTurb( x )
42*59599516SKenneth E. Jansen
43*59599516SKenneth E. Jansen      use     pointer_data
44*59599516SKenneth E. Jansen      use     turbSA
45*59599516SKenneth E. Jansen      include "common.h"
46*59599516SKenneth E. Jansen      include "mpif.h"
47*59599516SKenneth E. Jansen
48*59599516SKenneth E. Jansen      character*20 fname1,  fmt1
49*59599516SKenneth E. Jansen      real*8   x(numnp,nsd)
50*59599516SKenneth E. Jansen      integer  nwall(numpe),      idisp(numpe)
51*59599516SKenneth E. Jansen      character*5  cname
52*59599516SKenneth E. Jansen      real*8, allocatable :: xwi(:,:,:), xw(:,:,:)
53*59599516SKenneth E. Jansen
54*59599516SKenneth E. Jansen!MR CHANGE
55*59599516SKenneth E. Jansen      integer :: ierr
56*59599516SKenneth E. Jansen      integer :: numparts, nfile, itmp2, id2wall, itwo, ifoundd2wall
57*59599516SKenneth E. Jansen      integer iarray(10)
58*59599516SKenneth E. Jansen      character*255 :: fnamer, fname2, temp2
59*59599516SKenneth E. Jansen      character*64 :: temp1
60*59599516SKenneth E. Jansen!MR CHANGE END
61*59599516SKenneth E. Jansen
62*59599516SKenneth E. Jansen      allocate ( d2wall(numnp) )
63*59599516SKenneth E. Jansen
64*59599516SKenneth E. Jansen!MR CHANGE
65*59599516SKenneth E. Jansen      if(myrank.eq.master) then
66*59599516SKenneth E. Jansen        write (*,*) 'entering initTurb'
67*59599516SKenneth E. Jansen      endif
68*59599516SKenneth E. Jansen      call MPI_BARRIER(MPI_COMM_WORLD,ierr)
69*59599516SKenneth E. Jansen
70*59599516SKenneth E. Jansen      ! First we try to read the d2wall field from either the restart files or the d2wall files
71*59599516SKenneth E. Jansen      call read_d2wall(myrank,numnp,d2wall,ifoundd2wall)
72*59599516SKenneth E. Jansen!MR CHANGE END
73*59599516SKenneth E. Jansen
74*59599516SKenneth E. Jansen      if(ifoundd2wall.eq.0) then   ! d2wall was not found so calculate the distance
75*59599516SKenneth E. Jansen        if(myrank.eq.master) then
76*59599516SKenneth E. Jansen          write (*,*) 'Computing the d2wall field'
77*59599516SKenneth E. Jansen        endif
78*59599516SKenneth E. Jansenc
79*59599516SKenneth E. Jansenc   hard code trip point until we are sure it is worth doing
80*59599516SKenneth E. Jansenc
81*59599516SKenneth E. Jansen
82*59599516SKenneth E. Jansenc
83*59599516SKenneth E. Jansenc.... Count the welts (wall-elements)
84*59599516SKenneth E. Jansenc
85*59599516SKenneth E. Jansen         nwalli=0
86*59599516SKenneth E. Jansen         do iblk = 1, nelblb    ! loop over boundary elt blocks
87*59599516SKenneth E. Jansen            npro = lcblkb(1,iblk+1) - lcblkb(1,iblk)
88*59599516SKenneth E. Jansen            do j = 1, npro
89*59599516SKenneth E. Jansen               if(btest(miBCB(iblk)%p(j,1),4)) nwalli=nwalli+1
90*59599516SKenneth E. Jansen            enddo
91*59599516SKenneth E. Jansen         enddo
92*59599516SKenneth E. Jansenc
93*59599516SKenneth E. Jansenc.... Create wallnode-coord list for welts on processor
94*59599516SKenneth E. Jansenc
95*59599516SKenneth E. Jansen         if (nwalli.eq.0) nwalli=1 !  patch for mpi's lack of imagination
96*59599516SKenneth E. Jansen         allocate (xwi(nwalli,nenb+1,nsd))
97*59599516SKenneth E. Jansen         xwi = 1.0d32
98*59599516SKenneth E. Jansen         xwi(:,nenb+1,:)=zero
99*59599516SKenneth E. Jansen         nwalli = 0
100*59599516SKenneth E. Jansen         do iblk = 1, nelblb    ! loop over boundary elt blocks
101*59599516SKenneth E. Jansenc
102*59599516SKenneth E. Jansen            iel    = lcblkb(1,iblk)
103*59599516SKenneth E. Jansen            nenbl  = lcblkb(6,iblk) ! no. of vertices per bdry. face
104*59599516SKenneth E. Jansen            npro   = lcblkb(1,iblk+1) - iel
105*59599516SKenneth E. Jansenc
106*59599516SKenneth E. Jansen            do j = 1, npro      ! loop over belts in this blk
107*59599516SKenneth E. Jansen               if(btest(miBCB(iblk)%p(j,1),4)) then
108*59599516SKenneth E. Jansen                  nwalli=nwalli+1
109*59599516SKenneth E. Jansenc assemble local coord list
110*59599516SKenneth E. Jansen                  do node = 1, nenbl
111*59599516SKenneth E. Jansen                     xwi(nwalli,node,1:3)=x(mienb(iblk)%p(j,node),:)
112*59599516SKenneth E. Jansen                  enddo
113*59599516SKenneth E. Jansenc put the centroid coordinates in the last slot
114*59599516SKenneth E. Jansen                  do node = 1, nenbl
115*59599516SKenneth E. Jansen                     xwi(nwalli,nenb+1,:)=xwi(nwalli,nenb+1,:)
116*59599516SKenneth E. Jansen     &                    +xwi(nwalli,node,:)
117*59599516SKenneth E. Jansen                  enddo
118*59599516SKenneth E. Jansen                  xwi(nwalli,nenb+1,:)=xwi(nwalli,nenb+1,:)/nenbl
119*59599516SKenneth E. Jansenc
120*59599516SKenneth E. Jansen               endif
121*59599516SKenneth E. Jansen            enddo               ! loop over belts in this blk
122*59599516SKenneth E. Jansenc
123*59599516SKenneth E. Jansen         enddo                  ! loop over boundary elt blocks
124*59599516SKenneth E. Jansenc
125*59599516SKenneth E. Jansen         if (nwalli.eq.0) xwi=1.0e32 ! fix for mpi's lack of imagination
126*59599516SKenneth E. Jansen         if (nwalli.eq.0) nwalli=1 !  patch for mpi's lack of imagination
127*59599516SKenneth E. Jansenc
128*59599516SKenneth E. Jansenc  Pool "number of welts" info from all processors
129*59599516SKenneth E. Jansenc
130*59599516SKenneth E. JansencMPI_ALLGATHER(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm)
131*59599516SKenneth E. Jansenc[ IN sendbuf] starting address of send buffer (choice)
132*59599516SKenneth E. Jansenc[ IN sendcount] number of elements in send buffer (integer)
133*59599516SKenneth E. Jansenc[ IN sendtype] data type of send buffer elements (handle)
134*59599516SKenneth E. Jansenc[ OUT recvbuf] address of receive buffer (choice)
135*59599516SKenneth E. Jansenc[ IN recvcount] number of elements received from any process (integer)
136*59599516SKenneth E. Jansenc[ IN recvtype] data type of receive buffer elements (handle)
137*59599516SKenneth E. Jansenc[ IN comm] communicator (handle)
138*59599516SKenneth E. Jansen         if (numpe.gt.1) then   ! multiple processors
139*59599516SKenneth E. Jansenc write the number of wall elts on the jth processor to slot j of nwall
140*59599516SKenneth E. Jansen            call MPI_ALLGATHER(nwalli,1,MPI_INTEGER,nwall,1,
141*59599516SKenneth E. Jansen     &          MPI_INTEGER,MPI_COMM_WORLD,ierr)
142*59599516SKenneth E. Jansenc count up the total number of wall elts among all processes
143*59599516SKenneth E. Jansen            nwallt=0
144*59599516SKenneth E. Jansen            do j=1,numpe
145*59599516SKenneth E. Jansen               nwallt=nwallt+nwall(j)
146*59599516SKenneth E. Jansen            enddo
147*59599516SKenneth E. Jansen         else                   ! single processor
148*59599516SKenneth E. Jansenc the local information is the global information for single-processor
149*59599516SKenneth E. Jansen            nwall=nwalli
150*59599516SKenneth E. Jansen            nwallt=nwalli
151*59599516SKenneth E. Jansen         endif                  ! if-else for multiple processors
152*59599516SKenneth E. Jansenc
153*59599516SKenneth E. Jansenc  Make all-processor wallnode-coord collage
154*59599516SKenneth E. Jansenc
155*59599516SKenneth E. Jansen         allocate (xw(nwallt,nenb+1,nsd))
156*59599516SKenneth E. Jansen         if (numpe.gt.1) then   ! multiple processors
157*59599516SKenneth E. Jansenc we will gather coordinates from local on-proc sets to a global set
158*59599516SKenneth E. Jansenc we will stack each processor's coordinate list atop that of the
159*59599516SKenneth E. Jansenc previous processor.  If the coordinate list for processor i is
160*59599516SKenneth E. Jansenc called xwi, then our global coordinate list xw will look like this:
161*59599516SKenneth E. Jansenc ---------------------------------------------------------------
162*59599516SKenneth E. Jansenc | xw1            | xw2                | xw3        |   ...    |
163*59599516SKenneth E. Jansenc ---------------------------------------------------------------
164*59599516SKenneth E. Jansenc  <---nwall(1)---> <-----nwall(2)-----> <-nwall(3)->
165*59599516SKenneth E. Jansenc  <------------------------nwallt-----------------------...---->
166*59599516SKenneth E. Jansenc To accomplish this with MPI, we use MPI_ALLGATHERV, summarized as:
167*59599516SKenneth E. JansencMPI_ALLGATHERV(sendbuf,sendcount,sendtype,recvbuf,recvcount,disp,recvtype,comm)
168*59599516SKenneth E. Jansenc[ IN sendbuf] starting address of send buffer (choice)
169*59599516SKenneth E. Jansenc[ IN sendcount] number of elements in send buffer (integer)
170*59599516SKenneth E. Jansenc[ IN sendtype] data type of send buffer elements (handle)
171*59599516SKenneth E. Jansenc[ OUT recvbuf] address of receive buffer (choice)
172*59599516SKenneth E. Jansenc[ IN recvcount] number of elements received from any process (integer)
173*59599516SKenneth E. Jansenc[ IN disp] displacement array
174*59599516SKenneth E. Jansenc[ IN recvtype] data type of receive buffer elements (handle)
175*59599516SKenneth E. Jansenc[ IN comm] communicator (handle)
176*59599516SKenneth E. Jansenc The displacement array disp is an array of integers in which the jth
177*59599516SKenneth E. Jansenc entry indicates which slot of xw marks beginning of xwj
178*59599516SKenneth E. Jansenc So, first we will build this displacement array
179*59599516SKenneth E. Jansen            idisp(:)=0 ! starting with zero, since MPI likes C-numbering
180*59599516SKenneth E. Jansen            do j=2,numpe
181*59599516SKenneth E. Jansen               idisp(j)=idisp(j-1)+nwall(j-1) ! see diagram above
182*59599516SKenneth E. Jansen            enddo
183*59599516SKenneth E. Jansenc Now, we gather the data one slice at a time (1:nwalli)
184*59599516SKenneth E. Jansen            do j=1,nenb+1
185*59599516SKenneth E. Jansen               do k=1,nsd
186*59599516SKenneth E. Jansen                  call MPI_ALLGATHERV(xwi(:,j,k),nwalli,
187*59599516SKenneth E. Jansen     &                 MPI_DOUBLE_PRECISION,xw(:,j,k),nwall,idisp,
188*59599516SKenneth E. Jansen     &                 MPI_DOUBLE_PRECISION,MPI_COMM_WORLD,ierr)
189*59599516SKenneth E. Jansen               enddo
190*59599516SKenneth E. Jansen            enddo
191*59599516SKenneth E. Jansen         else                   ! single-processor
192*59599516SKenneth E. Jansenc global data is local data in single processor case
193*59599516SKenneth E. Jansen            xw=xwi
194*59599516SKenneth E. Jansen         endif
195*59599516SKenneth E. Jansen
196*59599516SKenneth E. Jansenc
197*59599516SKenneth E. Jansenc  For each point, loop over wall nodes and calculate distance;
198*59599516SKenneth E. Jansenc  save the distance in this node's position of d2wall if it's
199*59599516SKenneth E. Jansenc  shorter than currently stored distance
200*59599516SKenneth E. Jansenc
201*59599516SKenneth E. Jansen         d2wall=1.0e32
202*59599516SKenneth E. Jansen         do i=1,numnp
203*59599516SKenneth E. Jansen            do j=1, nwallt
204*59599516SKenneth E. Jansen               do k=1,nenb+1
205*59599516SKenneth E. Jansen                  distance =  ( x(i,1) - xw(j,k,1) )**2
206*59599516SKenneth E. Jansen     &                 +( x(i,2) - xw(j,k,2) )**2
207*59599516SKenneth E. Jansen     &                 +( x(i,3) - xw(j,k,3) )**2
208*59599516SKenneth E. Jansen                  if ( d2wall(i).gt.distance ) d2wall(i) = distance
209*59599516SKenneth E. Jansen               enddo
210*59599516SKenneth E. Jansen            enddo
211*59599516SKenneth E. Jansen         enddo
212*59599516SKenneth E. Jansen         d2wall=sqrt(d2wall)
213*59599516SKenneth E. Jansenc
214*59599516SKenneth E. Jansen         deallocate(xwi)
215*59599516SKenneth E. Jansen         deallocate(xw)
216*59599516SKenneth E. Jansenc
217*59599516SKenneth E. Jansenc.... write d2wall to a file so we don't have to do this again
218*59599516SKenneth E. Jansenc
219*59599516SKenneth E. Jansen
220*59599516SKenneth E. Jansen!MR CHANGE #Fix this with SyncIO!!!!!
221*59599516SKenneth E. Jansen!         write (fmt1,"('(''d2wall.'',i',i1,',1x)')") 1
222*59599516SKenneth E. Jansen!         write (fname1,fmt1) 0
223*59599516SKenneth E. Jansen!         fname1 = trim(fname1) // cname(myrank+1)
224*59599516SKenneth E. Jansen!         if(myrank.eq.master) write (*,*) 'Writing dist file : ', fname1
225*59599516SKenneth E. Jansen!         open (unit=72, file=fname1, status='unknown',
226*59599516SKenneth E. Jansen!     &                                    form='unformatted', err=996)
227*59599516SKenneth E. Jansen!
228*59599516SKenneth E. Jansen!         write (72) d2wall
229*59599516SKenneth E. Jansen!         close (72)
230*59599516SKenneth E. Jansen
231*59599516SKenneth E. Jansen          call write_d2wall(myrank,numnp,d2wall) !See new_interface.c
232*59599516SKenneth E. Jansen
233*59599516SKenneth E. Jansen!MR CHANGE END
234*59599516SKenneth E. Jansen
235*59599516SKenneth E. Jansenc         write(*,*) "make sure to: echo 0 > distcalc.dat"
236*59599516SKenneth E. Jansenc         call MPI_BARRIER (MPI_COMM_WORLD,ierr)
237*59599516SKenneth E. Jansenc         call error ('distcalc','complete',0)
238*59599516SKenneth E. Jansen      endif
239*59599516SKenneth E. Jansen
240*59599516SKenneth E. Jansen!MR CHANGE
241*59599516SKenneth E. Jansen      call MPI_BARRIER(MPI_COMM_WORLD,ierr)
242*59599516SKenneth E. Jansen      if(myrank.eq.master) then
243*59599516SKenneth E. Jansen        write (*,*) 'leaving initTurb'
244*59599516SKenneth E. Jansen      endif
245*59599516SKenneth E. Jansen!MR CHANGE
246*59599516SKenneth E. Jansen
247*59599516SKenneth E. Jansen      return
248*59599516SKenneth E. Jansen995     call error ('d2wall  ','opening ', 72)
249*59599516SKenneth E. Jansen996     call error ('d2wall  ','opening ', 72)
250*59599516SKenneth E. Jansen
251*59599516SKenneth E. Jansen      end subroutine
252*59599516SKenneth E. Jansen
253*59599516SKenneth E. Jansen
254