xref: /phasta/phSolver/compressible/itrbc.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansen        subroutine itrBC (y,ac, iBC, BC, iper, ilwork)
2*59599516SKenneth E. Jansenc
3*59599516SKenneth E. Jansenc----------------------------------------------------------------------
4*59599516SKenneth E. Jansenc
5*59599516SKenneth E. Jansenc This program satisfies the boundary conditions on the Y-variables.
6*59599516SKenneth E. Jansenc
7*59599516SKenneth E. Jansenc input:
8*59599516SKenneth E. Jansenc  y      (nshg,nflow)   : y variables
9*59599516SKenneth E. Jansenc  iBC    (nshg)        : Boundary Condition Code
10*59599516SKenneth E. Jansenc  BC     (nshg,ndofBC) : boundary condition constraint parameters
11*59599516SKenneth E. Jansenc  ylimit (3,nflow)     : (1,:) limiting flag
12*59599516SKenneth E. Jansenc                         (2,:) lower bound
13*59599516SKenneth E. Jansenc                         (3,:) upper bound
14*59599516SKenneth E. Jansenc output:
15*59599516SKenneth E. Jansenc  y      (nshg,nflow)   : Adjusted V value(s) corresponding to a
16*59599516SKenneth E. Jansenc                           constraint d.o.f.
17*59599516SKenneth E. Jansenc
18*59599516SKenneth E. Jansenc
19*59599516SKenneth E. Jansenc Farzin Shakib, Winter 1987.
20*59599516SKenneth E. Jansenc Zdenek Johan,  Winter 1991.  (Fortran 90)
21*59599516SKenneth E. Jansenc----------------------------------------------------------------------
22*59599516SKenneth E. Jansenc
23*59599516SKenneth E. Jansen        include "common.h"
24*59599516SKenneth E. Jansenc
25*59599516SKenneth E. Jansen        dimension y(nshg,nflow),             iBC(nshg),
26*59599516SKenneth E. Jansen     &            ac(nshg,nflow),            BC(nshg,ndofBC)
27*59599516SKenneth E. Jansen
28*59599516SKenneth E. Jansen        dimension ilwork(nlwork),           iper(nshg)
29*59599516SKenneth E. Jansen
30*59599516SKenneth E. Jansen        real*8 tmp(nshg), y1(nshg),q1(nshg)
31*59599516SKenneth E. Jansen        dimension rn1(nshg), rmagn1(nshg)
32*59599516SKenneth E. Jansen        real*8 limitcount(nflow)
33*59599516SKenneth E. Jansen        integer locmax(1),locmin(1)
34*59599516SKenneth E. Jansenc
35*59599516SKenneth E. Jansenc  limiting...ugly but sometimes the only way
36*59599516SKenneth E. Jansenc
37*59599516SKenneth E. Jansen        limitcount=0
38*59599516SKenneth E. Jansen        do i=1,nflow
39*59599516SKenneth E. Jansen           if(ylimit(1,i).gt.0) then
40*59599516SKenneth E. Jansen              locmax=maxloc(y(:,i))
41*59599516SKenneth E. Jansen              locmin=minloc(y(:,i))
42*59599516SKenneth E. Jansen              ymax=maxval(y(:,i))
43*59599516SKenneth E. Jansen              ymin=minval(y(:,i))
44*59599516SKenneth E. Jansenc              write(33,34)i,ymax,ymin,1.*locmax,1.*locmin
45*59599516SKenneth E. Jansenc          call flush(33)
46*59599516SKenneth E. Jansen              do j=1,numnp      ! only limit linear modes for now
47*59599516SKenneth E. Jansen                 ypc=y(j,i)
48*59599516SKenneth E. Jansen                 y(j,i)=min(ylimit(3,i),max(ylimit(2,i),y(j,i)))
49*59599516SKenneth E. Jansen                 if(ypc.ne.y(j,i) )limitcount(i)=limitcount(i)+one
50*59599516SKenneth E. Jansen              enddo
51*59599516SKenneth E. Jansen           endif
52*59599516SKenneth E. Jansen        enddo
53*59599516SKenneth E. Jansenc        if(maxval(limitcount).gt.0) then
54*59599516SKenneth E. Jansenc           write(33,34)myrank,(limitcount(j)/numnp,j=1,nflow)
55*59599516SKenneth E. Jansenc           call flush(33)
56*59599516SKenneth E. Jansenc        endif
57*59599516SKenneth E. Jansen 34     format(i5,5(2x,e14.7))
58*59599516SKenneth E. Jansenc
59*59599516SKenneth E. Jansenc.... ------------------------>  Temperature  <------------------------
60*59599516SKenneth E. Jansenc.... temperature
61*59599516SKenneth E. Jansenc
62*59599516SKenneth E. Jansen        where (btest(iBC,1))
63*59599516SKenneth E. Jansen          y(:,5) =  BC(:,2)
64*59599516SKenneth E. Jansen        endwhere
65*59599516SKenneth E. Jansenc
66*59599516SKenneth E. Jansenc.... ------------------------->  Velocity  <--------------------------
67*59599516SKenneth E. Jansenc.... 3D
68*59599516SKenneth E. Jansenc
69*59599516SKenneth E. Jansenc.... x1-velocity, 3D
70*59599516SKenneth E. Jansenc
71*59599516SKenneth E. Jansen          where (ibits(iBC,3,3) .eq. 1)
72*59599516SKenneth E. Jansenc$$$            rn1(:)=sqrt(one/(one + BC(:,4)**2+BC(:,4)**2))
73*59599516SKenneth E. Jansenc$$$            rmagn1(:)=rn1(:)**2*(y(:,1)+y(:,2)*BC(:,4)
74*59599516SKenneth E. Jansenc$$$     &                             +y(:,3)*BC(:,5)-BC(:,3))
75*59599516SKenneth E. Jansenc$$$            y(:,1) = y(:,1)-rmagn1(:)
76*59599516SKenneth E. Jansenc$$$            y(:,2) = y(:,2)-rmagn1(:)*BC(:,4)
77*59599516SKenneth E. Jansenc$$$            y(:,3) = y(:,3)-rmagn1(:)*BC(:,5)
78*59599516SKenneth E. Jansen
79*59599516SKenneth E. Jansen            y(:,1) =  BC(:,3)  - BC(:,4) * y(:,2)
80*59599516SKenneth E. Jansen     &                         - BC(:,5) * y(:,3)
81*59599516SKenneth E. Jansen          endwhere
82*59599516SKenneth E. Jansenc
83*59599516SKenneth E. Jansenc.... x2-velocity, 3D
84*59599516SKenneth E. Jansenc
85*59599516SKenneth E. Jansen          where (ibits(iBC,3,3) .eq. 2)
86*59599516SKenneth E. Jansen            y(:,2) = BC(:,3)  - BC(:,4) * y(:,1)
87*59599516SKenneth E. Jansen     &                        - BC(:,5) * y(:,3)
88*59599516SKenneth E. Jansen          endwhere
89*59599516SKenneth E. Jansenc
90*59599516SKenneth E. Jansenc.... x1-velocity and x2-velocity, 3D
91*59599516SKenneth E. Jansenc
92*59599516SKenneth E. Jansen          where (ibits(iBC,3,3) .eq. 3)
93*59599516SKenneth E. Jansen            y(:,1) =  BC(:,3)  - BC(:,4) * y(:,3)
94*59599516SKenneth E. Jansen            y(:,2) =  BC(:,5)  - BC(:,6) * y(:,3)
95*59599516SKenneth E. Jansen          endwhere
96*59599516SKenneth E. Jansenc
97*59599516SKenneth E. Jansenc.... x3-velocity, 3D
98*59599516SKenneth E. Jansenc
99*59599516SKenneth E. Jansen          where (ibits(iBC,3,3) .eq. 4)
100*59599516SKenneth E. Jansen            y(:,3) = BC(:,3) - BC(:,4) * y(:,1)
101*59599516SKenneth E. Jansen     &                       - BC(:,5) * y(:,2)
102*59599516SKenneth E. Jansen          endwhere
103*59599516SKenneth E. Jansenc
104*59599516SKenneth E. Jansenc.... x1-velocity and x3-velocity, 3D
105*59599516SKenneth E. Jansenc
106*59599516SKenneth E. Jansen          where (ibits(iBC,3,3) .eq. 5)
107*59599516SKenneth E. Jansen            y(:,1) = BC(:,3) - BC(:,4) * y(:,2)
108*59599516SKenneth E. Jansen            y(:,3) = BC(:,5) - BC(:,6) * y(:,2)
109*59599516SKenneth E. Jansen          endwhere
110*59599516SKenneth E. Jansenc
111*59599516SKenneth E. Jansenc.... x2-velocity and x3-velocity, 3D
112*59599516SKenneth E. Jansenc
113*59599516SKenneth E. Jansen          where (ibits(iBC,3,3) .eq. 6)
114*59599516SKenneth E. Jansen            y(:,2) = BC(:,3)  - BC(:,4) * y(:,1)
115*59599516SKenneth E. Jansen            y(:,3) = BC(:,5)  - BC(:,6) * y(:,1)
116*59599516SKenneth E. Jansen          endwhere
117*59599516SKenneth E. Jansenc
118*59599516SKenneth E. Jansenc.... x1-velocity, x2-velocity and x3-velocity, 3D
119*59599516SKenneth E. Jansenc
120*59599516SKenneth E. Jansen          where (ibits(iBC,3,3) .eq. 7)
121*59599516SKenneth E. Jansen            y(:,1) =  BC(:,3)
122*59599516SKenneth E. Jansen            y(:,2) =  BC(:,4)
123*59599516SKenneth E. Jansen            y(:,3) =  BC(:,5)
124*59599516SKenneth E. Jansen          endwhere
125*59599516SKenneth E. Jansenc
126*59599516SKenneth E. Jansenc       endif
127*59599516SKenneth E. Jansenc
128*59599516SKenneth E. Jansenc.... end of velocity
129*59599516SKenneth E. Jansenc
130*59599516SKenneth E. Jansenc.... -------------------------->  Density  <--------------------------
131*59599516SKenneth E. Jansenc
132*59599516SKenneth E. Jansen        if (any(btest(iBC,0))) then
133*59599516SKenneth E. Jansenc
134*59599516SKenneth E. Jansenc.... density
135*59599516SKenneth E. Jansenc
136*59599516SKenneth E. Jansen          where (btest(iBC,0))
137*59599516SKenneth E. Jansen            q1 = BC(:,1)  ! density
138*59599516SKenneth E. Jansen          elsewhere
139*59599516SKenneth E. Jansen            q1 = one
140*59599516SKenneth E. Jansen          endwhere
141*59599516SKenneth E. Jansenc
142*59599516SKenneth E. Jansenc
143*59599516SKenneth E. Jansenc
144*59599516SKenneth E. Jansen          npro = nshg
145*59599516SKenneth E. Jansenc
146*59599516SKenneth E. Jansen          ithm = 2  ! get pressure from rho and T
147*59599516SKenneth E. Jansenc...when ithm=2 scalar is not used so tmp is in place
148*59599516SKenneth E. Jansen          call getthm (y1,        y(:,5),      tmp,
149*59599516SKenneth E. Jansen     &                 rk,         q1,         tmp,
150*59599516SKenneth E. Jansen     &                 tmp,        tmp,        tmp,
151*59599516SKenneth E. Jansen     &                 tmp,        tmp,        tmp,
152*59599516SKenneth E. Jansen     &                 tmp,        tmp)
153*59599516SKenneth E. Jansenc
154*59599516SKenneth E. Jansen          where (btest(iBC,0))
155*59599516SKenneth E. Jansen            y(:,1) = y1
156*59599516SKenneth E. Jansen          endwhere
157*59599516SKenneth E. Jansen
158*59599516SKenneth E. Jansenc
159*59599516SKenneth E. Jansen        endif
160*59599516SKenneth E. Jansenc
161*59599516SKenneth E. Jansenc.... ------------------------->  Pressure  <--------------------------
162*59599516SKenneth E. Jansenc
163*59599516SKenneth E. Jansen        if (any(btest(iBC,2))) then
164*59599516SKenneth E. Jansenc
165*59599516SKenneth E. Jansenc.... pressure
166*59599516SKenneth E. Jansenc
167*59599516SKenneth E. Jansen          where (btest(iBC,2))
168*59599516SKenneth E. Jansen            y(:,4) = BC(:,1)  ! pressure here
169*59599516SKenneth E. Jansen          endwhere
170*59599516SKenneth E. Jansenc
171*59599516SKenneth E. Jansen        endif
172*59599516SKenneth E. Jansenc
173*59599516SKenneth E. Jansenc.... local periodic (and axisymmetric) boundary conditions (no communications)
174*59599516SKenneth E. Jansenc
175*59599516SKenneth E. Jansen	do i = 1,nflow
176*59599516SKenneth E. Jansen           y(:,i) = y(iper(:),i)
177*59599516SKenneth E. Jansen           if(ires.ne.2) ac(:,i) = ac(iper(:),i)
178*59599516SKenneth E. Jansen	enddo
179*59599516SKenneth E. Jansenc
180*59599516SKenneth E. Jansenc.... communications
181*59599516SKenneth E. Jansenc
182*59599516SKenneth E. Jansen        if (numpe > 1) then
183*59599516SKenneth E. Jansen           call commu (y, ilwork, nflow, 'out')
184*59599516SKenneth E. Jansen           if(ires.ne.2) call commu (ac, ilwork, nflow, 'out')
185*59599516SKenneth E. Jansen        endif
186*59599516SKenneth E. Jansenc
187*59599516SKenneth E. Jansenc       slave has masters value, for abc we need to rotate it
188*59599516SKenneth E. Jansenc
189*59599516SKenneth E. Jansen        if(iabc==1) then        !are there any axisym bc's
190*59599516SKenneth E. Jansen           call rotabc(y, iBC, 'out')
191*59599516SKenneth E. Jansen           if(ires.ne.2) call rotabc(ac, iBC, 'out')
192*59599516SKenneth E. Jansen        endif
193*59599516SKenneth E. Jansen
194*59599516SKenneth E. Jansenc
195*59599516SKenneth E. Jansenc.... return
196*59599516SKenneth E. Jansenc
197*59599516SKenneth E. Jansen        return
198*59599516SKenneth E. Jansen        end
199*59599516SKenneth E. Jansen
200*59599516SKenneth E. Jansen
201*59599516SKenneth E. Jansen        subroutine itrBCSclr (y, ac, iBC, BC, iper, ilwork)
202*59599516SKenneth E. Jansenc
203*59599516SKenneth E. Jansenc----------------------------------------------------------------------
204*59599516SKenneth E. Jansenc
205*59599516SKenneth E. Jansenc This routine satisfies the boundary conditions on the isclr
206*59599516SKenneth E. Jansenc
207*59599516SKenneth E. Jansenc----------------------------------------------------------------------
208*59599516SKenneth E. Jansenc
209*59599516SKenneth E. Jansen        include "common.h"
210*59599516SKenneth E. Jansenc
211*59599516SKenneth E. Jansen        dimension y(nshg,ndof),             iBC(nshg),
212*59599516SKenneth E. Jansen     &            ac(nshg,ndof),            BC(nshg,ndofBC)
213*59599516SKenneth E. Jansen
214*59599516SKenneth E. Jansen        dimension ilwork(nlwork),            iper(nshg)
215*59599516SKenneth E. Jansen        dimension T(nshg)
216*59599516SKenneth E. Jansen
217*59599516SKenneth E. Jansen        if(isclr.ne.0) then
218*59599516SKenneth E. Jansen           id=5+isclr
219*59599516SKenneth E. Jansen           ibb=6+isclr
220*59599516SKenneth E. Jansen           ib=4+isclr
221*59599516SKenneth E. Jansen        endif
222*59599516SKenneth E. Jansenc
223*59599516SKenneth E. Jansenc  limiting...ugly but sometimes the only way
224*59599516SKenneth E. Jansenc
225*59599516SKenneth E. Jansen           if(ylimit(1,id).gt.0)
226*59599516SKenneth E. Jansen     &          y(:,id)=min(ylimit(3,id),max(ylimit(2,id),y(:,id)))
227*59599516SKenneth E. Jansenc
228*59599516SKenneth E. Jansenc.... ------------------------>  Scalar  <------------------------
229*59599516SKenneth E. Jansenc
230*59599516SKenneth E. Jansenc
231*59599516SKenneth E. Jansen        where (btest(iBC,id))
232*59599516SKenneth E. Jansen          y(:,id) =  BC(:,ibb)
233*59599516SKenneth E. Jansen        endwhere
234*59599516SKenneth E. Jansenc
235*59599516SKenneth E. Jansenc.... local periodic (and axisymmetric) boundary conditions (no communications)
236*59599516SKenneth E. Jansenc
237*59599516SKenneth E. Jansen	do i = 1,nshg
238*59599516SKenneth E. Jansenc           if (btest(iBC(i),10)) then
239*59599516SKenneth E. Jansen              y(i,id) = y(iper(i),id)
240*59599516SKenneth E. Jansen              ac(i,id) = ac(iper(i),id)
241*59599516SKenneth E. Jansenc           end if
242*59599516SKenneth E. Jansen	enddo
243*59599516SKenneth E. Jansenc
244*59599516SKenneth E. Jansenc.... communications
245*59599516SKenneth E. Jansenc
246*59599516SKenneth E. Jansen        if (numpe > 1) then
247*59599516SKenneth E. Jansen           T=y(:,id)
248*59599516SKenneth E. Jansen           call commu (T, ilwork, 1, 'out')
249*59599516SKenneth E. Jansen           y(:,id)=T
250*59599516SKenneth E. Jansen           T=ac(:,id)
251*59599516SKenneth E. Jansen           call commu (T, ilwork, 1, 'out')
252*59599516SKenneth E. Jansen           ac(:,id)=T
253*59599516SKenneth E. Jansen        endif
254*59599516SKenneth E. Jansen
255*59599516SKenneth E. Jansen        ttim(53) = ttim(53) + tmr()
256*59599516SKenneth E. Jansenc
257*59599516SKenneth E. Jansen        return
258*59599516SKenneth E. Jansen        end
259*59599516SKenneth E. Jansen
260*59599516SKenneth E. Jansen
261*59599516SKenneth E. Jansen
262