xref: /phasta/phSolver/incompressible/itrPC.f (revision 595995161822a203c8467e0e4a253d7bd7d6df32)
1*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
2*59599516SKenneth E. Jansenc
3*59599516SKenneth E. Jansenc    Initialize the predictor multicorrector (set up parameters)
4*59599516SKenneth E. Jansenc
5*59599516SKenneth E. Jansenc    Modified by Alberto Figueroa.  Winter 2004
6*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
7*59599516SKenneth E. Jansen      subroutine itrSetup ( y,  acold )
8*59599516SKenneth E. Jansen
9*59599516SKenneth E. Jansen      include "common.h"
10*59599516SKenneth E. Jansen
11*59599516SKenneth E. Jansen      real*8     y(nshg,ndof),     acold(nshg,ndof)
12*59599516SKenneth E. Jansen
13*59599516SKenneth E. Jansenc
14*59599516SKenneth E. Jansenc  Define the Hulbert parameters
15*59599516SKenneth E. Jansenc  second order if between (and including) 0 and 1 otherwise backward Euler
16*59599516SKenneth E. Jansenc
17*59599516SKenneth E. Jansen      if( rhoinf(itseq).lt.0.or.rhoinf(itseq).gt.1) then ! backward Euler
18*59599516SKenneth E. Jansen         almi   = one
19*59599516SKenneth E. Jansen         alfi   = one
20*59599516SKenneth E. Jansen         gami   = one
21*59599516SKenneth E. Jansen         ipred  = 1
22*59599516SKenneth E. Jansen      else           !second order family
23*59599516SKenneth E. Jansen         almi   = (three-rhoinf(itseq))/(one+rhoinf(itseq))/two
24*59599516SKenneth E. Jansen         alfi   = one/(one+rhoinf(itseq))
25*59599516SKenneth E. Jansen         gami   = pt5+almi-alfi
26*59599516SKenneth E. Jansen         if(ideformwall.eq.1) then
27*59599516SKenneth E. Jansen            betai=1.0
28*59599516SKenneth E. Jansen         else
29*59599516SKenneth E. Jansen            betai=0.0
30*59599516SKenneth E. Jansen         endif
31*59599516SKenneth E. Jansen      endif
32*59599516SKenneth E. Jansenc
33*59599516SKenneth E. Jansenc.... set the jacobian type
34*59599516SKenneth E. Jansenc
35*59599516SKenneth E. Jansen      Jactyp=0
36*59599516SKenneth E. Jansen      if (impl(itseq) .eq. 3) then
37*59599516SKenneth E. Jansen         Jactyp = 1
38*59599516SKenneth E. Jansen         impl(itseq) = 2
39*59599516SKenneth E. Jansen      endif
40*59599516SKenneth E. Jansenc
41*59599516SKenneth E. Jansenc.... same_Dy predictor special case
42*59599516SKenneth E. Jansenc
43*59599516SKenneth E. Jansen      if (ipred.eq.4 .and. itseq .eq. 1 ) then
44*59599516SKenneth E. Jansen         y=y-(one-alfi)*Delt(1)*acold
45*59599516SKenneth E. Jansen         if ( rhoinf(itseq) .eq. 0.0 ) then
46*59599516SKenneth E. Jansen            ipred = 3
47*59599516SKenneth E. Jansen         endif
48*59599516SKenneth E. Jansen      endif
49*59599516SKenneth E. Jansenc
50*59599516SKenneth E. Jansenc.... set the global time increment and the CFL data
51*59599516SKenneth E. Jansenc
52*59599516SKenneth E. Jansen      Dtgl   = one / Delt(itseq)  ! caution: inverse of time step
53*59599516SKenneth E. Jansen      CFLfld = CFLfl(itseq)
54*59599516SKenneth E. Jansen      CFLsld = CFLsl(itseq)
55*59599516SKenneth E. Jansen
56*59599516SKenneth E. Jansen      return
57*59599516SKenneth E. Jansen      end
58*59599516SKenneth E. Jansen
59*59599516SKenneth E. Jansen
60*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
61*59599516SKenneth E. Jansenc
62*59599516SKenneth E. Jansenc    Predict solution at time n+1
63*59599516SKenneth E. Jansenc
64*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
65*59599516SKenneth E. Jansen      subroutine itrPredict (yold,  y,  acold,   ac,   uold,   u, iBC)
66*59599516SKenneth E. Jansen
67*59599516SKenneth E. Jansen      include "common.h"
68*59599516SKenneth E. Jansen
69*59599516SKenneth E. Jansen      real*8        y(nshg,ndof),               ac(nshg,ndof),
70*59599516SKenneth E. Jansen     &              u(nshg,nsd),                yold(nshg,ndof),
71*59599516SKenneth E. Jansen     &              acold(nshg,ndof),           uold(nshg,nsd)
72*59599516SKenneth E. Jansen      dimension     iBC(nshg)
73*59599516SKenneth E. Jansen
74*59599516SKenneth E. Jansen
75*59599516SKenneth E. Jansen      if ( ipred.eq.1) then     ! yn+1_pred=yn
76*59599516SKenneth E. Jansen         fct = (gami-one)/gami
77*59599516SKenneth E. Jansen         y  = yold
78*59599516SKenneth E. Jansen         ac = acold * fct
79*59599516SKenneth E. Jansen         if(ideformwall.eq.1) then
80*59599516SKenneth E. Jansen            do isd = 1, nsd
81*59599516SKenneth E. Jansen               where(btest(iBC,13))
82*59599516SKenneth E. Jansen                  u(:,isd) = uold(:,isd) + Delt(itseq)*yold(:,isd) +
83*59599516SKenneth E. Jansen     &                 pt5*((gami-two*betai)/gami)*
84*59599516SKenneth E. Jansen     &                 Delt(itseq)*Delt(itseq)*acold(:,isd)
85*59599516SKenneth E. Jansen               endwhere
86*59599516SKenneth E. Jansen            enddo
87*59599516SKenneth E. Jansen         endif
88*59599516SKenneth E. Jansen      endif
89*59599516SKenneth E. Jansenc
90*59599516SKenneth E. Jansen      if ( ipred.eq.2) then     ! an+1_pred=0
91*59599516SKenneth E. Jansen         y  = yold + (one - gami)/Dtgl * acold
92*59599516SKenneth E. Jansen         ac = 0.0
93*59599516SKenneth E. Jansen      endif
94*59599516SKenneth E. Jansenc
95*59599516SKenneth E. Jansen      if(ipred.eq.3 ) then      ! an+1_pred=an
96*59599516SKenneth E. Jansen         y  = yold+alfi*Delt(itseq)*acold
97*59599516SKenneth E. Jansen         ac = acold
98*59599516SKenneth E. Jansen      endif
99*59599516SKenneth E. Jansenc
100*59599516SKenneth E. Jansen      if ( ipred.eq.4 ) then    ! protect from DC=4 rho=0, same dV
101*59599516SKenneth E. Jansen         fct1 = alfi/(one-alfi)
102*59599516SKenneth E. Jansen         fct2 = one-almi/gami
103*59599516SKenneth E. Jansen         fct3 = almi/gami/alfi*Dtgl
104*59599516SKenneth E. Jansen         y    = yold+fct1*(yold-y)
105*59599516SKenneth E. Jansen         ac   = acold*fct2+(y-yold)*fct3
106*59599516SKenneth E. Jansen      endif
107*59599516SKenneth E. Jansenc
108*59599516SKenneth E. Jansen
109*59599516SKenneth E. Jansen      return
110*59599516SKenneth E. Jansen      end
111*59599516SKenneth E. Jansen
112*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
113*59599516SKenneth E. Jansenc
114*59599516SKenneth E. Jansenc    Correct solution at time n+1
115*59599516SKenneth E. Jansenc
116*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
117*59599516SKenneth E. Jansen      subroutine itrCorrect ( y,     ac,   u,   solinc ,iBC)
118*59599516SKenneth E. Jansen
119*59599516SKenneth E. Jansen      include "common.h"
120*59599516SKenneth E. Jansen
121*59599516SKenneth E. Jansen      real*8      y(nshg,ndof),               ac(nshg,ndof),
122*59599516SKenneth E. Jansen     &            u(nshg,nsd),                solinc(nshg,4)
123*59599516SKenneth E. Jansen      dimension   iBC(nshg)
124*59599516SKenneth E. Jansen
125*59599516SKenneth E. Jansen      fct1 = gami*Delt(itseq)
126*59599516SKenneth E. Jansen      fct2 = gami*alfi*Delt(itseq)
127*59599516SKenneth E. Jansen
128*59599516SKenneth E. Jansen      y(:,1:3)  = y(:,1:3)  + fct1 * solinc(:,1:3)
129*59599516SKenneth E. Jansen      y(:,4  )  = y(:,4  )  + fct2 * solinc(:,4  )
130*59599516SKenneth E. Jansen      ac(:,1:3) = ac(:,1:3) + solinc(:,1:3)
131*59599516SKenneth E. Jansen      if(ideformwall.eq.1) then
132*59599516SKenneth E. Jansen         do isd = 1,nsd
133*59599516SKenneth E. Jansen            where (btest(iBC,13))
134*59599516SKenneth E. Jansen               u(:,isd)  = u(:,isd)  +
135*59599516SKenneth E. Jansen     &              Delt(itseq)*Delt(itseq)*betai*solinc(:,isd)
136*59599516SKenneth E. Jansen            endwhere
137*59599516SKenneth E. Jansen         enddo
138*59599516SKenneth E. Jansen      endif
139*59599516SKenneth E. Jansenc
140*59599516SKenneth E. Jansen      return
141*59599516SKenneth E. Jansen      end
142*59599516SKenneth E. Jansen
143*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
144*59599516SKenneth E. Jansenc
145*59599516SKenneth E. Jansenc    Correct solution at time n+1
146*59599516SKenneth E. Jansenc
147*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
148*59599516SKenneth E. Jansen      subroutine itrCorrectSclr ( y,     ac,   solinc )
149*59599516SKenneth E. Jansen
150*59599516SKenneth E. Jansen      include "common.h"
151*59599516SKenneth E. Jansen
152*59599516SKenneth E. Jansen      real*8      y(nshg,ndof),               ac(nshg,ndof),
153*59599516SKenneth E. Jansen     &            solinc(nshg)
154*59599516SKenneth E. Jansen
155*59599516SKenneth E. Jansen      fct1 = gami*Delt(itseq)
156*59599516SKenneth E. Jansen      is=5+isclr
157*59599516SKenneth E. Jansen      y(:,is)  = y(:,is)  + fct1 * solinc(:)
158*59599516SKenneth E. Jansen      ac(:,is) = ac(:,is) + solinc(:)
159*59599516SKenneth E. Jansenc
160*59599516SKenneth E. Jansen      return
161*59599516SKenneth E. Jansen      end
162*59599516SKenneth E. Jansen
163*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
164*59599516SKenneth E. Jansenc
165*59599516SKenneth E. Jansenc    Correct solution at time n+1, protecting against negative values
166*59599516SKenneth E. Jansenc
167*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
168*59599516SKenneth E. Jansen      subroutine itrCorrectSclrPos ( y,     ac,   solinc )
169*59599516SKenneth E. Jansen
170*59599516SKenneth E. Jansen      include "common.h"
171*59599516SKenneth E. Jansen
172*59599516SKenneth E. Jansen      real*8      y(nshg,ndof),               ac(nshg,ndof),
173*59599516SKenneth E. Jansen     &            solinc(nshg),               posinc(nshg)
174*59599516SKenneth E. Jansen
175*59599516SKenneth E. Jansen      fct1 = gami*Delt(itseq)
176*59599516SKenneth E. Jansen      if(fct1.eq.0) then
177*59599516SKenneth E. Jansen         call itrCorrectSclr( y, ac, solinc)
178*59599516SKenneth E. Jansen      else
179*59599516SKenneth E. Jansen         turbUpdFct = 1.0
180*59599516SKenneth E. Jansen         updFct = turbUpdFct
181*59599516SKenneth E. Jansen         updFct2 = 1.0
182*59599516SKenneth E. Jansenc         if(topHdTscFlag.and.PRM_TCS_PARTIAL_UPDATE)then
183*59599516SKenneth E. Jansenc            updFct2 = max(MTH_SQRT_EPS,min(topHdUpdFct,1.0))
184*59599516SKenneth E. Jansenc         endif
185*59599516SKenneth E. Jansen         fctCr = fct1*updFct*updFct2
186*59599516SKenneth E. Jansen         c0 = 0.01
187*59599516SKenneth E. Jansen         c1 = -(1.0-c0)/fctCr
188*59599516SKenneth E. Jansen         is=5+isclr
189*59599516SKenneth E. Jansenc         if(any(updFct*updFct2*solinc(:).lt.c1*y(:,is))) then
190*59599516SKenneth E. Jansenc            write(*,*) 'INSTEAD OF GETTING NEGATIVE FIELD'
191*59599516SKenneth E. Jansenc            write(*,*) 'BROUGHT FIELD DOWN TO 1 PERCENT'
192*59599516SKenneth E. Jansenc            write(*,*) 'FOR SCALAR NUMBER ',isclr
193*59599516SKenneth E. Jansenc            write(*,*) '(SEE itrCorrectSclr in itrPC.f)'
194*59599516SKenneth E. Jansenc         endif
195*59599516SKenneth E. Jansen         posinc = max(updFct*updFct2*solinc,c1*y(:,is))
196*59599516SKenneth E. Jansen         y(:,is)  = y(:,is)  + fct1 * posinc(:)
197*59599516SKenneth E. Jansen         ac(:,is) = ac(:,is) + posinc(:)
198*59599516SKenneth E. Jansen      endif
199*59599516SKenneth E. Jansenc
200*59599516SKenneth E. Jansen      return
201*59599516SKenneth E. Jansen      end
202*59599516SKenneth E. Jansen
203*59599516SKenneth E. Jansen
204*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
205*59599516SKenneth E. Jansenc
206*59599516SKenneth E. Jansenc    Compute solution and acceleration at n+alpha
207*59599516SKenneth E. Jansenc
208*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
209*59599516SKenneth E. Jansen      subroutine itrYAlpha ( uold,        yold,        acold,
210*59599516SKenneth E. Jansen     &                       u,           y,           ac,
211*59599516SKenneth E. Jansen     &                       uAlpha,      yAlpha,      acAlpha )
212*59599516SKenneth E. Jansen
213*59599516SKenneth E. Jansenc      use readarrays       !reads in uold and acold
214*59599516SKenneth E. Jansen      include "common.h"
215*59599516SKenneth E. Jansen
216*59599516SKenneth E. Jansen      real*8        yold(nshg,ndof),            acold(nshg,ndof),
217*59599516SKenneth E. Jansen     &              y(nshg,ndof),               ac(nshg,ndof),
218*59599516SKenneth E. Jansen     &              yAlpha(nshg,ndof),          acAlpha(nshg,ndof),
219*59599516SKenneth E. Jansen     &              u(nshg,nsd),                uold(nshg,nsd),
220*59599516SKenneth E. Jansen     &              uAlpha(nshg,nsd)
221*59599516SKenneth E. Jansen
222*59599516SKenneth E. Jansen      acAlpha(:,4) = zero  !pressure acceleration is never used but....
223*59599516SKenneth E. Jansen
224*59599516SKenneth E. Jansen      yAlpha (:,1:3) = yold(:,1:3)
225*59599516SKenneth E. Jansen     &                  + alfi * (y(:,1:3) - yold(:,1:3))
226*59599516SKenneth E. Jansen
227*59599516SKenneth E. Jansen      acAlpha(:,1:3) = acold(:,1:3)
228*59599516SKenneth E. Jansen     &                  + almi * (ac(:,1:3) - acold(:,1:3))
229*59599516SKenneth E. Jansen
230*59599516SKenneth E. Jansen      yAlpha (:,4  ) = y(:,4)
231*59599516SKenneth E. Jansen
232*59599516SKenneth E. Jansen      if(ideformwall.eq.1) uAlpha (:,1:3) = uold(:,1:3)
233*59599516SKenneth E. Jansen     &                  + alfi * (u(:,1:3) - uold(:,1:3))
234*59599516SKenneth E. Jansen
235*59599516SKenneth E. Jansen      if(ndof.ge.5) then
236*59599516SKenneth E. Jansenc
237*59599516SKenneth E. Jansenc  Now take care of temperature, turbulence, what have you
238*59599516SKenneth E. Jansenc
239*59599516SKenneth E. Jansen
240*59599516SKenneth E. Jansen
241*59599516SKenneth E. Jansen         yAlpha (:,5:ndof  ) = yold(:,5:ndof)
242*59599516SKenneth E. Jansen     &                       + alfi * (y(:,5:ndof) - yold(:,5:ndof))
243*59599516SKenneth E. Jansen         acAlpha(:,5:ndof  ) = acold(:,5:ndof)
244*59599516SKenneth E. Jansen     &                       + almi * (ac(:,5:ndof) - acold(:,5:ndof))
245*59599516SKenneth E. Jansen
246*59599516SKenneth E. Jansen      endif
247*59599516SKenneth E. Jansen      return
248*59599516SKenneth E. Jansen      end
249*59599516SKenneth E. Jansen
250*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
251*59599516SKenneth E. Jansenc
252*59599516SKenneth E. Jansenc    Update solution at end of time step
253*59599516SKenneth E. Jansenc
254*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
255*59599516SKenneth E. Jansen      subroutine itrUpdate( yold,          acold,        uold,
256*59599516SKenneth E. Jansen     &                      y,             ac,           u )
257*59599516SKenneth E. Jansen
258*59599516SKenneth E. Jansenc      use readarrays            !reads in uold and acold
259*59599516SKenneth E. Jansen
260*59599516SKenneth E. Jansen      include "common.h"
261*59599516SKenneth E. Jansen
262*59599516SKenneth E. Jansen      real*8        yold(nshg,ndof),            acold(nshg,ndof),
263*59599516SKenneth E. Jansen     &              y(nshg,ndof),               ac(nshg,ndof),
264*59599516SKenneth E. Jansen     &              u(nshg,nsd),                uold(nshg,nsd)
265*59599516SKenneth E. Jansen
266*59599516SKenneth E. Jansen
267*59599516SKenneth E. Jansen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
268*59599516SKenneth E. Jansen!	Allow for redistance of the level set function, AD 5/8/00
269*59599516SKenneth E. Jansen!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
270*59599516SKenneth E. Jansen
271*59599516SKenneth E. Jansen!      if we are re-distancing the levelset function the we need
272*59599516SKenneth E. Jansen!      to update the levelset variable with the corrected value
273*59599516SKenneth E. Jansen!      stored in the "next" scalar position.
274*59599516SKenneth E. Jansen
275*59599516SKenneth E. Jansen        if(iLSet .eq.2 .and. isclr .eq. 2) then
276*59599516SKenneth E. Jansen
277*59599516SKenneth E. Jansen           y(:,6) = y(:,7) ! will need to also fix the yold ac etc.?????
278*59599516SKenneth E. Jansen     	   ac(:,7)=zero
279*59599516SKenneth E. Jansen        endif
280*59599516SKenneth E. Jansen
281*59599516SKenneth E. Jansen
282*59599516SKenneth E. Jansen
283*59599516SKenneth E. Jansen      yold  = y
284*59599516SKenneth E. Jansen      acold = ac
285*59599516SKenneth E. Jansen      if(ideformwall.eq.1)  uold  = u
286*59599516SKenneth E. Jansen
287*59599516SKenneth E. Jansen      return
288*59599516SKenneth E. Jansen      end
289*59599516SKenneth E. Jansen
290