1*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 2*59599516SKenneth E. Jansenc 3*59599516SKenneth E. Jansenc Natural pressure boundary condition can be calculated with p, the pressure, 4*59599516SKenneth E. Jansenc related (in some prescribed manner) to Q, the flow rate, through the same 5*59599516SKenneth E. Jansenc boundary. To do this efficiently requires us to precompute the integral 6*59599516SKenneth E. Jansenc of N_A over the boundary for each node A and store it in a vector of length 7*59599516SKenneth E. Jansenc nshg (a bit wasteful since only the nodes on the boundary will be non zero 8*59599516SKenneth E. Jansenc in this vector but it is probably slower to index it than to multiply and 9*59599516SKenneth E. Jansenc add the extra zeros....check later). 10*59599516SKenneth E. Jansenc 11*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 12*59599516SKenneth E. Jansen module pvsQbi 13*59599516SKenneth E. Jansen 14*59599516SKenneth E. Jansen real*8, allocatable :: NABI(:,:) 15*59599516SKenneth E. Jansen real*8, allocatable :: NASC(:) 16*59599516SKenneth E. Jansen integer, allocatable :: ndsurf(:) 17*59599516SKenneth E. Jansen 18*59599516SKenneth E. Jansen end module 19*59599516SKenneth E. Jansen 20*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 21*59599516SKenneth E. Jansenc 22*59599516SKenneth E. Jansenc Initialize: 23*59599516SKenneth E. Jansenc 24*59599516SKenneth E. Jansenc----------------------------------------------------------------------- 25*59599516SKenneth E. Jansen subroutine initNABI( x, shpb ) 26*59599516SKenneth E. Jansen 27*59599516SKenneth E. Jansen use pointer_data 28*59599516SKenneth E. Jansen use pvsQbi 29*59599516SKenneth E. Jansen include "common.h" 30*59599516SKenneth E. Jansen 31*59599516SKenneth E. Jansen real*8 x(numnp,nsd) 32*59599516SKenneth E. Jansenc 33*59599516SKenneth E. Jansenc use is like 34*59599516SKenneth E. Jansenc 35*59599516SKenneth E. Jansenc NABI=pvsQbi -> NABI 36*59599516SKenneth E. Jansenc 37*59599516SKenneth E. Jansen dimension shpb(MAXTOP,maxsh,MAXQPT) 38*59599516SKenneth E. Jansen real*8, allocatable :: tmpshpb(:,:) 39*59599516SKenneth E. Jansen allocate ( NABI(nshg,3) ) 40*59599516SKenneth E. Jansen allocate ( NASC(nshg) ) 41*59599516SKenneth E. Jansen allocate ( ndsurf(nshg) ) 42*59599516SKenneth E. Jansen 43*59599516SKenneth E. Jansenc 44*59599516SKenneth E. Jansenc.... calculate NABI 45*59599516SKenneth E. Jansenc 46*59599516SKenneth E. Jansen NABI=zero 47*59599516SKenneth E. Jansen NASC=zero 48*59599516SKenneth E. Jansen ndsurf=0 49*59599516SKenneth E. Jansenc 50*59599516SKenneth E. Jansenc.... --------------------> boundary elements <-------------------- 51*59599516SKenneth E. Jansenc 52*59599516SKenneth E. Jansenc.... set up parameters 53*59599516SKenneth E. Jansenc 54*59599516SKenneth E. Jansenc intrul = intg (2,itseq) 55*59599516SKenneth E. Jansenc intind = intptb (intrul) 56*59599516SKenneth E. Jansenc 57*59599516SKenneth E. Jansenc.... loop over the boundary elements 58*59599516SKenneth E. Jansenc 59*59599516SKenneth E. Jansen do iblk = 1, nelblb 60*59599516SKenneth E. Jansenc 61*59599516SKenneth E. Jansenc.... set up the parameters 62*59599516SKenneth E. Jansenc 63*59599516SKenneth E. Jansen iel = lcblkb(1,iblk) 64*59599516SKenneth E. Jansen lelCat = lcblkb(2,iblk) 65*59599516SKenneth E. Jansen lcsyst = lcblkb(3,iblk) 66*59599516SKenneth E. Jansen iorder = lcblkb(4,iblk) 67*59599516SKenneth E. Jansen nenl = lcblkb(5,iblk) ! no. of vertices per element 68*59599516SKenneth E. Jansen nenbl = lcblkb(6,iblk) ! no. of vertices per bdry. face 69*59599516SKenneth E. Jansen nshl = lcblkb(9,iblk) 70*59599516SKenneth E. Jansen nshlb = lcblkb(10,iblk) 71*59599516SKenneth E. Jansen mattyp = lcblkb(7,iblk) 72*59599516SKenneth E. Jansen ndofl = lcblkb(8,iblk) 73*59599516SKenneth E. Jansen npro = lcblkb(1,iblk+1) - iel 74*59599516SKenneth E. Jansen 75*59599516SKenneth E. Jansen 76*59599516SKenneth E. Jansen if(lcsyst.eq.3) lcsyst=nenbl 77*59599516SKenneth E. Jansenc 78*59599516SKenneth E. Jansen if(lcsyst.eq.3 .or. lcsyst.eq.4) then 79*59599516SKenneth E. Jansen ngaussb = nintb(lcsyst) 80*59599516SKenneth E. Jansen else 81*59599516SKenneth E. Jansen ngaussb = nintb(lcsyst) 82*59599516SKenneth E. Jansen endif 83*59599516SKenneth E. Jansen 84*59599516SKenneth E. Jansenc 85*59599516SKenneth E. Jansenc.... compute and assemble the residuals corresponding to the 86*59599516SKenneth E. Jansenc boundary integral 87*59599516SKenneth E. Jansenc 88*59599516SKenneth E. Jansen allocate (tmpshpb(nshl,MAXQPT)) 89*59599516SKenneth E. Jansen 90*59599516SKenneth E. Jansen tmpshpb(1:nshl,:) = shpb(lcsyst,1:nshl,:) 91*59599516SKenneth E. Jansen 92*59599516SKenneth E. Jansen call AsBNABI ( x, 93*59599516SKenneth E. Jansen & tmpshpb, 94*59599516SKenneth E. Jansen & mienb(iblk)%p, 95*59599516SKenneth E. Jansen & miBCB(iblk)%p) 96*59599516SKenneth E. Jansen 97*59599516SKenneth E. Jansen call AsBNASC( x, 98*59599516SKenneth E. Jansen & tmpshpb, 99*59599516SKenneth E. Jansen & mienb(iblk)%p, 100*59599516SKenneth E. Jansen & miBCB(iblk)%p) 101*59599516SKenneth E. Jansen 102*59599516SKenneth E. Jansen deallocate (tmpshpb) 103*59599516SKenneth E. Jansen 104*59599516SKenneth E. Jansen enddo 105*59599516SKenneth E. Jansen 106*59599516SKenneth E. Jansenc 107*59599516SKenneth E. Jansenc note that NABI has NOT been communicated. It 108*59599516SKenneth E. JansenC is the on processor contribution to this vector. It will used to 109*59599516SKenneth E. JansenC build the on processor contribution to res that will then be made 110*59599516SKenneth E. JansenC complete via a call to commu. Similarly the LHS usage will create 111*59599516SKenneth E. JansenC the on-processor contribution to the lhsK. Same for NASC 112*59599516SKenneth E. Jansenc 113*59599516SKenneth E. Jansen return 114*59599516SKenneth E. Jansen end 115*59599516SKenneth E. Jansen 116*59599516SKenneth E. Jansen 117