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