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