159599516SKenneth E. Jansen subroutine gendat (y, ac, x, iBC, BC, 259599516SKenneth E. Jansen & iper, ilwork, 359599516SKenneth E. Jansen & shp, shgl, shpb, shglb, 459599516SKenneth E. Jansen & ifath, velbar, nsons ) 559599516SKenneth E. Jansenc 659599516SKenneth E. Jansenc---------------------------------------------------------------------- 759599516SKenneth E. Jansenc 859599516SKenneth E. Jansenc This routine inputs the geometry and the boundary conditions. 959599516SKenneth E. Jansenc 1059599516SKenneth E. Jansenc 1159599516SKenneth E. Jansenc Zdenek Johan, Winter 1991. (Fortran 90) 1259599516SKenneth E. Jansenc---------------------------------------------------------------------- 1359599516SKenneth E. Jansenc 1459599516SKenneth E. Jansen 1559599516SKenneth E. Jansen use readarrays ! used to acess nBC 1659599516SKenneth E. Jansen use dtnmod 1759599516SKenneth E. Jansen use pointer_data 18*513954efSKenneth E. Jansen use wallData ! give access to wnorm, findWallNOrm 1959599516SKenneth E. Jansen include "common.h" 2059599516SKenneth E. Jansen include "mpif.h" 2159599516SKenneth E. Jansen 2259599516SKenneth E. Jansenc 2359599516SKenneth E. Jansenc arrays in the following line are now dimensioned in readnblk 2459599516SKenneth E. Jansenc dimension nBC(nshg) 2559599516SKenneth E. Jansenc 2659599516SKenneth E. Jansen dimension y(nshg,ndof), ac(nshg,ndof), 2759599516SKenneth E. Jansen & x(numnp,nsd), iBC(nshg), 2859599516SKenneth E. Jansen & BC(nshg,ndofBC), 2959599516SKenneth E. Jansen & nodflx(numflx), ilwork(nlwork), 3059599516SKenneth E. Jansen & iper(nshg) 3159599516SKenneth E. Jansenc 3259599516SKenneth E. Jansenc.... shape function declarations 3359599516SKenneth E. Jansenc 3459599516SKenneth E. Jansen dimension shp(MAXTOP,maxsh,MAXQPT), 3559599516SKenneth E. Jansen & shgl(MAXTOP,nsd,maxsh,MAXQPT), 3659599516SKenneth E. Jansen & shpb(MAXTOP,maxsh,MAXQPT), 3759599516SKenneth E. Jansen & shglb(MAXTOP,nsd,maxsh,MAXQPT) 3859599516SKenneth E. Jansenc 3959599516SKenneth E. Jansenc stuff for dynamic model s.w.avg and wall model 4059599516SKenneth E. Jansenc 4159599516SKenneth E. Jansen dimension ifath(numnp), velbar(nfath,nflow), nsons(nfath) 42*513954efSKenneth E. Jansen 43*513954efSKenneth E. Jansen! Hack to get suction right on part boundaries 44*513954efSKenneth E. Jansen! dimension BC3(numnp,5) 45*513954efSKenneth E. Jansen 46*513954efSKenneth E. Jansenc... Duct 47*513954efSKenneth E. Jansen integer iTurbWall(nshg) 48*513954efSKenneth E. Jansen integer nTopNodes 49*513954efSKenneth E. Jansen integer TopSurface(nshg) 50*513954efSKenneth E. Jansen 51*513954efSKenneth E. Jansenc... 52*513954efSKenneth E. Jansen 5359599516SKenneth E. Jansenc.... start the timer 5459599516SKenneth E. Jansenc 5559599516SKenneth E. Jansen 5659599516SKenneth E. JansenCAD call timer ('PrProces') 5759599516SKenneth E. Jansen 5859599516SKenneth E. Jansenc 5959599516SKenneth E. Jansenc put a barrier here so that all of the files are done reading 6059599516SKenneth E. Jansenc This SHOULD shield any mpi_profile information from io bottlenecks 6159599516SKenneth E. Jansenc 6259599516SKenneth E. Jansen call MPI_BARRIER (MPI_COMM_WORLD,ierr) 6359599516SKenneth E. Jansen 64*513954efSKenneth E. Jansenc... updated, truly useful things for Duct......... 65*513954efSKenneth E. Jansen if(isetInitial_Duct.gt.0)then 66*513954efSKenneth E. Jansen call setInitial_Duct(x) ! in INIprofile.f 67*513954efSKenneth E. Jansen endif 68*513954efSKenneth E. Jansen 6959599516SKenneth E. Jansenc 7059599516SKenneth E. Jansenc.... ----------------------------> Nodes <-------------------------- 7159599516SKenneth E. Jansenc 7259599516SKenneth E. Jansenc.... compute length scales 7359599516SKenneth E. Jansenc 7459599516SKenneth E. Jansen call xyzbound(x) 7559599516SKenneth E. Jansenc 7659599516SKenneth E. Jansenc.... echo the coordinates 7759599516SKenneth E. Jansenc 7859599516SKenneth E. Jansen if ((necho .lt. 2).and.(myrank.eq.master)) then 7959599516SKenneth E. Jansen do n = 1, numnp 8059599516SKenneth E. Jansen if (mod(n,50) .eq. 1) write (iecho,1000) ititle,(i,i=1,nsd) 8159599516SKenneth E. Jansen write (iecho,1100) n, (x(n,i),i=1,nsd) 8259599516SKenneth E. Jansen enddo 8359599516SKenneth E. Jansen endif 8459599516SKenneth E. Jansenc 8559599516SKenneth E. Jansenc.... prepare periodic boundary conditions 8659599516SKenneth E. Jansenc 8759599516SKenneth E. Jansen do i = 1,nshg 8859599516SKenneth E. Jansen if (iper(i) .ne. 0) then 8959599516SKenneth E. Jansen nshg0 = nshg0 - 1 9059599516SKenneth E. Jansen else 9159599516SKenneth E. Jansen iper(i) = i 9259599516SKenneth E. Jansen endif 9359599516SKenneth E. Jansen enddo 9459599516SKenneth E. Jansenc 9559599516SKenneth E. Jansenc.... ----------------------> Interior Elements <-------------------- 9659599516SKenneth E. Jansenc 9759599516SKenneth E. Jansen ibound = 0 9859599516SKenneth E. Jansenc 9959599516SKenneth E. Jansenc.... generate the interior nodal mapping 10059599516SKenneth E. Jansenc 10159599516SKenneth E. Jansen call genshp ( shp, shgl, nshape, nelblk) 10259599516SKenneth E. Jansenc 10359599516SKenneth E. Jansenc.... ---------------------> Boundary Conditions <------------------- 10459599516SKenneth E. Jansenc 10559599516SKenneth E. Jansenc.... read and generate the boundary condition codes (iBC array) 10659599516SKenneth E. Jansenc 10759599516SKenneth E. Jansen call geniBC (iBC) 10859599516SKenneth E. Jansenc 10959599516SKenneth E. Jansenc.... read and generate the essential boundary conditions (BC array) 11059599516SKenneth E. Jansenc 11159599516SKenneth E. Jansen call genBC (iBC, BC, point2x, 11259599516SKenneth E. Jansen & point2ilwork, point2iper) 11359599516SKenneth E. Jansen deallocate(nBC) 114*513954efSKenneth E. Jansen 115*513954efSKenneth E. Jansenc========================================================================================= 116*513954efSKenneth E. Jansenc Yi Chen 117*513954efSKenneth E. Jansenc Duct geometry8 118*513954efSKenneth E. Jansenc... updated, truly useful things......... 119*513954efSKenneth E. Jansen 120*513954efSKenneth E. Jansen 121*513954efSKenneth E. Jansenc===== specify outlet pressure 122*513954efSKenneth E. Jansen if(isetOutletID .gt. 0)then 123*513954efSKenneth E. Jansen call SetUniOutPres(BC) ! in BCprofile2.f 124*513954efSKenneth E. Jansen endif 125*513954efSKenneth E. Jansen 126*513954efSKenneth E. Jansenc==== specify inlet boundary conditions 127*513954efSKenneth E. Jansenc if(isetInlet_Duct.gt.0)then 128*513954efSKenneth E. Jansenc call setInlet_Duct(x,BC,iTurbWall) ! in BCprofile2.f 129*513954efSKenneth E. Jansenc endif 130*513954efSKenneth E. Jansen 131*513954efSKenneth E. Jansenc==== specify blowing conditions 132*513954efSKenneth E. Jansen if(isetBlowing_Duct.gt.0)then 133*513954efSKenneth E. Jansen if (ifixBlowingVel_Duct.eq.0)then 134*513954efSKenneth E. Jansen call setBlowing_Duct(BC,iTurbWall) 135*513954efSKenneth E. Jansen else 136*513954efSKenneth E. Jansen call setBlowing_Duct3(x,BC,iTurbWall) ! in setBlowing_Duct3.f, fixed jet inlet velocity 137*513954efSKenneth E. Jansen endif 138*513954efSKenneth E. Jansen endif 139*513954efSKenneth E. Jansen 140*513954efSKenneth E. Jansenc====== specify wall conditions 141*513954efSKenneth E. Jansen call findTurbWall(iTurbWall) 142*513954efSKenneth E. Jansen 143*513954efSKenneth E. Jansenc==== apply suction patch on sides 144*513954efSKenneth E. Jansenc suction is applied at the end so it will overwrite the velocity at any nodes shared by the no-slip walls 145*513954efSKenneth E. Jansen call findWallNorm(x,iBC,ilwork,iper) 146*513954efSKenneth E. Jansen if(isetSuctionID_Duct.gt.0)then 147*513954efSKenneth E. Jansen call setSuction_Duct3(x, BC, y, ilwork) 148*513954efSKenneth E. Jansen endif 149*513954efSKenneth E. Jansen 150*513954efSKenneth E. Jansenc==== 151*513954efSKenneth E. Jansen call MPI_BARRIER(MPI_COMM_WORLD,ierr) 152*513954efSKenneth E. Jansenc.... Yi Chen 153*513954efSKenneth E. Jansenc========================================================================================== 15459599516SKenneth E. Jansenc 15559599516SKenneth E. Jansenc.... ----------------------> Boundary Elements <-------------------- 15659599516SKenneth E. Jansenc 15759599516SKenneth E. Jansen ibound = 1 15859599516SKenneth E. Jansen call gtnods 15959599516SKenneth E. Jansenc 16059599516SKenneth E. Jansenc We now take care of Direchlet to Neumann BC's. It had to move here 16159599516SKenneth E. Jansenc so that the IBC array was of size nshg and ready to be marked. 16259599516SKenneth E. Jansenc 16359599516SKenneth E. Jansen 16459599516SKenneth E. Jansen if(nsclr.gt.0) then 16559599516SKenneth E. Jansen call initDtN ! Dirichlet to Neumann module: 16659599516SKenneth E. Jansen ! initialize this once only 16759599516SKenneth E. Jansen do iblk = 1, nelblb ! number of blocks 16859599516SKenneth E. Jansen iel = lcblkb(1,iblk) 16959599516SKenneth E. Jansen npro = lcblkb(1,iblk+1) - iel 17059599516SKenneth E. Jansenc 17159599516SKenneth E. Jansenc for the DtN BC we need to mark all of the nodes that are involved. 17259599516SKenneth E. Jansenc 17359599516SKenneth E. Jansen do i=1,npro 17459599516SKenneth E. Jansenc 17559599516SKenneth E. Jansenc if this element has the BCB AND it has not been found yet then mark it 17659599516SKenneth E. Jansenc 17759599516SKenneth E. Jansen if(miBCB(iblk)%p(i,2).lt.0) then 17859599516SKenneth E. Jansen idtn = 1 !set the flag for dtn bc's 17959599516SKenneth E. Jansen do j=1,nshapeb 18059599516SKenneth E. Jansen do isclr=1,nsclr 18159599516SKenneth E. Jansen ignd=mienb(iblk)%p(i,j) 18259599516SKenneth E. Jansen ifeature(ignd) = abs(miBCB(iblk)%p(i,2)) 18359599516SKenneth E. Jansen iBC(ignd)=ior(iBC(ignd),2**13) 18459599516SKenneth E. Jansen ! must mark this as a Neumann BC now 18559599516SKenneth E. Jansen miBCB(iblk)%p(i,1)= 18659599516SKenneth E. Jansen & ior(miBCB(iblk)%p(i,1),2**(4+isclr)) 18759599516SKenneth E. Jansen end do 18859599516SKenneth E. Jansen end do 18959599516SKenneth E. Jansen endif 19059599516SKenneth E. Jansen end do 19159599516SKenneth E. Jansen end do 19259599516SKenneth E. Jansen endif 19359599516SKenneth E. Jansenc 19459599516SKenneth E. Jansenc.... generate the boundary element shape functions 19559599516SKenneth E. Jansenc 19659599516SKenneth E. Jansen call genshpb ( shpb, shglb, nshapeb, nelblb) 19759599516SKenneth E. Jansenc.... Evaluate the shape funcs. and their gradients at the desired quadrature 19859599516SKenneth E. Jansenc.... for filtering. Save these evaluations using a module 19959599516SKenneth E. Jansenc 20059599516SKenneth E. Jansenc KEJ moved them to this point because cdelsq now passed with module 20159599516SKenneth E. Jansenc and it is read in with velb.<stepnum>.<proc#> now 20259599516SKenneth E. Jansenc 20359599516SKenneth E. Jansen if (iLES .gt. 0) then 20459599516SKenneth E. Jansen 20559599516SKenneth E. Jansen call setfilt ! For setting quad. rule to use for integrating 20659599516SKenneth E. Jansen call filtprep ! the hat filter. 20759599516SKenneth E. Jansen if(iLES/10 .eq. 2) then 20859599516SKenneth E. Jansen call setave ! For averaging cdelsq computed at quad pts 20959599516SKenneth E. Jansen call aveprep(shp,x) 21059599516SKenneth E. Jansen endif 21159599516SKenneth E. Jansen endif 21259599516SKenneth E. Jansenc 21359599516SKenneth E. Jansenc User sets request pzero in solver.inp now 21459599516SKenneth E. Jansenc 21559599516SKenneth E. Jansenc call genpzero(iBC,iper) 21659599516SKenneth E. Jansenc 21759599516SKenneth E. Jansen if((myrank.eq.master).and.(irscale.ge.0)) then 21859599516SKenneth E. Jansen call setSPEBC(numnp,nsd) 21959599516SKenneth E. Jansen call eqn_plane(point2x, iBC) 22059599516SKenneth E. Jansen endif 22159599516SKenneth E. Jansenc 22259599516SKenneth E. Jansenc.... ---------------------> Initial Conditions <-------------------- 22359599516SKenneth E. Jansenc 22459599516SKenneth E. Jansenc.... generate the initial conditions and initialize time varying BC 22559599516SKenneth E. Jansenc 22659599516SKenneth E. Jansen call genini (iBC, BC, y, 22759599516SKenneth E. Jansen & ac, iper, 22859599516SKenneth E. Jansen & ilwork, ifath, velbar, 22959599516SKenneth E. Jansen & nsons, x, 23059599516SKenneth E. Jansen & shp, shgl, shpb, shglb) 23159599516SKenneth E. Jansenc 23259599516SKenneth E. Jansenc.... close the geometry, boundary condition and material files 23359599516SKenneth E. Jansenc 23459599516SKenneth E. Jansen!MR CHANGE 23559599516SKenneth E. Jansen! close (igeom) 23659599516SKenneth E. Jansen!MR CHANGE END 23759599516SKenneth E. Jansen close (ibndc) 23859599516SKenneth E. Jansen if (mexist) close (imat) 23959599516SKenneth E. Jansenc 24059599516SKenneth E. Jansenc.... return 24159599516SKenneth E. Jansenc 24259599516SKenneth E. JansenCAD call timer ('Back ') 24359599516SKenneth E. Jansen return 24459599516SKenneth E. Jansenc 24559599516SKenneth E. Jansenc.... end of file error handling 24659599516SKenneth E. Jansenc 24759599516SKenneth E. Jansen999 call error ('gendat ','end file',igeom) 24859599516SKenneth E. Jansenc 24959599516SKenneth E. Jansen1000 format(a80,//, 25059599516SKenneth E. Jansen & ' N o d a l C o o r d i n a t e s ',//, 25159599516SKenneth E. Jansen & ' Node ',12x,3('x',i1,:,17x)) 25259599516SKenneth E. Jansen1100 format(1p,2x,i5,13x,3(1e12.5,7x)) 25359599516SKenneth E. Jansen2000 format(a80,//, 25459599516SKenneth E. Jansen & ' B o u n d a r y F l u x N o d e s '//, 25559599516SKenneth E. Jansen & ' index Node ') 25659599516SKenneth E. Jansen2100 format(1x,i5,5x,i10) 25759599516SKenneth E. Jansenc 25859599516SKenneth E. Jansen end 25959599516SKenneth E. Jansen 26059599516SKenneth E. Jansen 26159599516SKenneth E. Jansen subroutine xyzbound(x) 26259599516SKenneth E. Jansen 26359599516SKenneth E. Jansen include "common.h" 26459599516SKenneth E. Jansen include "mpif.h" 26559599516SKenneth E. Jansen include "auxmpi.h" 26659599516SKenneth E. Jansen 26759599516SKenneth E. Jansen dimension x(numnp,3) 26859599516SKenneth E. Jansen 26959599516SKenneth E. Jansen real*8 Forout(3), Forin(3) 27059599516SKenneth E. Jansen 27159599516SKenneth E. Jansen xlngth=maxval(x(:,1)) 27259599516SKenneth E. Jansen ylngth=maxval(x(:,2)) 27359599516SKenneth E. Jansen zlngth=maxval(x(:,3)) 27459599516SKenneth E. Jansen if(numpe. gt. 1) then 27559599516SKenneth E. Jansen Forin=(/xlngth,ylngth,zlngth/) 27659599516SKenneth E. Jansen call MPI_ALLREDUCE (Forin, Forout, 3, 27759599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_MAX, MPI_COMM_WORLD,ierr) 27859599516SKenneth E. Jansen xmax = Forout(1) 27959599516SKenneth E. Jansen ymax = Forout(2) 28059599516SKenneth E. Jansen zmax = Forout(3) 28159599516SKenneth E. Jansen else 28259599516SKenneth E. Jansen xmax = xlngth 28359599516SKenneth E. Jansen ymax = ylngth 28459599516SKenneth E. Jansen zmax = zlngth 28559599516SKenneth E. Jansen endif 28659599516SKenneth E. Jansen xlngth=minval(x(:,1)) 28759599516SKenneth E. Jansen ylngth=minval(x(:,2)) 28859599516SKenneth E. Jansen zlngth=minval(x(:,3)) 28959599516SKenneth E. Jansen if(numpe .gt. 1) then 29059599516SKenneth E. Jansen Forin=(/xlngth,ylngth,zlngth/) 29159599516SKenneth E. Jansen call MPI_ALLREDUCE (Forin, Forout, 3, 29259599516SKenneth E. Jansen & MPI_DOUBLE_PRECISION,MPI_MIN, MPI_COMM_WORLD,ierr) 29359599516SKenneth E. Jansen else 29459599516SKenneth E. Jansen Forout(1) = xlngth 29559599516SKenneth E. Jansen Forout(2) = ylngth 29659599516SKenneth E. Jansen Forout(3) = zlngth 29759599516SKenneth E. Jansen endif 29859599516SKenneth E. Jansen 29959599516SKenneth E. Jansen xlngth = xmax-Forout(1) 30059599516SKenneth E. Jansen ylngth = ymax-Forout(2) 30159599516SKenneth E. Jansen zlngth = zmax-Forout(3) 30259599516SKenneth E. Jansen 30359599516SKenneth E. Jansen if(myrank.eq.master) then 30459599516SKenneth E. Jansen print 108, xlngth,ylngth,zlngth 30559599516SKenneth E. Jansen endif 30659599516SKenneth E. Jansen 108 format(' Domain size (x,y,z):',2x,3f15.10) 30759599516SKenneth E. Jansen return 30859599516SKenneth E. Jansen end 309