xref: /phasta/phSolver/compressible/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-----------------------------------------------------------------------
6*59599516SKenneth E. Jansen      subroutine itrSetup ( y,  acold )
7*59599516SKenneth E. Jansen
8*59599516SKenneth E. Jansen      include "common.h"
9*59599516SKenneth E. Jansen
10*59599516SKenneth E. Jansen      real*8     y(nshg,ndof),  acold(nshg,ndof)
11*59599516SKenneth E. Jansen
12*59599516SKenneth E. Jansenc
13*59599516SKenneth E. Jansenc  Define the Hulbert parameters
14*59599516SKenneth E. Jansenc  second order if between (and including) 0 and 1 otherwise backward Euler
15*59599516SKenneth E. Jansenc
16*59599516SKenneth E. Jansen      if( rhoinf(itseq).lt.0.or.rhoinf(itseq).gt.1) then ! backward Euler
17*59599516SKenneth E. Jansen         almi   = one
18*59599516SKenneth E. Jansen         alfi   = one
19*59599516SKenneth E. Jansen         gami   = one
20*59599516SKenneth E. Jansen         ipred  = 1
21*59599516SKenneth E. Jansen      else           !second order family
22*59599516SKenneth E. Jansen         almi   = (three-rhoinf(itseq))/(one+rhoinf(itseq))/two
23*59599516SKenneth E. Jansen         alfi   = one/(one+rhoinf(itseq))
24*59599516SKenneth E. Jansen         gami   = pt5+almi-alfi
25*59599516SKenneth E. Jansen      endif
26*59599516SKenneth E. Jansenc
27*59599516SKenneth E. Jansenc.... set the jacobian type
28*59599516SKenneth E. Jansenc
29*59599516SKenneth E. Jansen      Jactyp=0
30*59599516SKenneth E. Jansenc
31*59599516SKenneth E. Jansen      if(ipred.eq.4 .and. itseq .eq. 1 )
32*59599516SKenneth E. Jansen     &           y=y-(one-alfi)*Delt(1)*CFLfl(1)*acold
33*59599516SKenneth E. Jansen
34*59599516SKenneth E. Jansenc
35*59599516SKenneth E. Jansenc protect from ipred=4 and rhoi=0
36*59599516SKenneth E. Jansenc
37*59599516SKenneth E. Jansen      if(ipred.eq.4 .and. rhoinf(itseq) .eq. 0.0 ) ipred=3
38*59599516SKenneth E. Jansen
39*59599516SKenneth E. Jansenc
40*59599516SKenneth E. Jansenc.... set the global time increment and the CFL data
41*59599516SKenneth E. Jansenc
42*59599516SKenneth E. Jansen      Dtgl   = one / Delt(itseq)  ! caution: inverse of time step
43*59599516SKenneth E. Jansen      CFLfld = CFLfl(itseq)
44*59599516SKenneth E. Jansen      CFLsld = CFLsl(itseq)
45*59599516SKenneth E. Jansen
46*59599516SKenneth E. Jansen      Dtgl   = Dtgl / 1.0      ! check CFLfld
47*59599516SKenneth E. Jansen      return
48*59599516SKenneth E. Jansen      end
49*59599516SKenneth E. Jansen
50*59599516SKenneth E. Jansen
51*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
52*59599516SKenneth E. Jansenc
53*59599516SKenneth E. Jansenc    Predict solution at time n+1
54*59599516SKenneth E. Jansenc
55*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
56*59599516SKenneth E. Jansen      subroutine itrPredict ( yold,          acold,
57*59599516SKenneth E. Jansen     &                        y,             ac   )
58*59599516SKenneth E. Jansen
59*59599516SKenneth E. Jansen      include "common.h"
60*59599516SKenneth E. Jansen
61*59599516SKenneth E. Jansen      real*8        yold(nshg,ndof),            acold(nshg,ndof),
62*59599516SKenneth E. Jansen     &              y(nshg,ndof),               ac(nshg,ndof)
63*59599516SKenneth E. Jansen
64*59599516SKenneth E. Jansenc
65*59599516SKenneth E. Jansenc.... set the solution at t_{n+alfi) and the acceleration at t_{n+almi)
66*59599516SKenneth E. Jansenc
67*59599516SKenneth E. Jansen       if(ipred.eq.1) then
68*59599516SKenneth E. Jansenc
69*59599516SKenneth E. Jansenc   yn+1_pred=yn
70*59599516SKenneth E. Jansenc
71*59599516SKenneth E. Jansen        y  = yold
72*59599516SKenneth E. Jansen        ac = acold*(one-almi/gami)
73*59599516SKenneth E. Jansen       endif
74*59599516SKenneth E. Jansenc
75*59599516SKenneth E. Jansen       if(ipred.eq.2) then
76*59599516SKenneth E. Jansenc
77*59599516SKenneth E. Jansenc   an+1_pred=0
78*59599516SKenneth E. Jansenc
79*59599516SKenneth E. Jansen        y  = yold+alfi/Dtgl*acold*(one-gami)
80*59599516SKenneth E. Jansen        call itrBC (y, ac,  iBC,  BC,  iper,ilwork)
81*59599516SKenneth E. Jansenc Elaine-SPEBC
82*59599516SKenneth E. Jansen        if((irscale.ge.0).and.(myrank.eq.master)) then
83*59599516SKenneth E. Jansen           call genscale(y, x, iBC)
84*59599516SKenneth E. Jansen        endif
85*59599516SKenneth E. Jansen        ac = acold*(one-almi)
86*59599516SKenneth E. Jansen       endif
87*59599516SKenneth E. Jansenc
88*59599516SKenneth E. Jansen       if(ipred.eq.3 ) then
89*59599516SKenneth E. Jansenc
90*59599516SKenneth E. Jansenc   an+1_pred=an
91*59599516SKenneth E. Jansenc
92*59599516SKenneth E. Jansen        y  = yold+alfi/Dtgl*acold
93*59599516SKenneth E. Jansen        call itrBC (y, ac,  iBC,  BC, iper,ilwork)
94*59599516SKenneth E. Jansenc Elaine-SPEBC
95*59599516SKenneth E. Jansen        if((irscale.ge.0).and.(myrank.eq.master)) then
96*59599516SKenneth E. Jansen           call genscale(y, x, iBC)
97*59599516SKenneth E. Jansen        endif
98*59599516SKenneth E. Jansen        ac = acold
99*59599516SKenneth E. Jansen       endif
100*59599516SKenneth E. Jansenc
101*59599516SKenneth E. Jansen       if(ipred.eq.4 ) then ! protect from DC=4 rho=0
102*59599516SKenneth E. Jansenc
103*59599516SKenneth E. Jansenc  same dV
104*59599516SKenneth E. Jansenc
105*59599516SKenneth E. Jansen        fct1=alfi/(one-alfi)
106*59599516SKenneth E. Jansen        fct2=one-almi/gami
107*59599516SKenneth E. Jansen        fct3=almi/gami/alfi*Dtgl
108*59599516SKenneth E. Jansen        y  = yold+fct1*(yold-y)
109*59599516SKenneth E. Jansen        call itrBC (y, ac,  iBC,  BC,  iper,ilwork)
110*59599516SKenneth E. Jansenc Elaine-SPEBC
111*59599516SKenneth E. Jansen        if((irscale.ge.0).and.(myrank.eq.master)) then
112*59599516SKenneth E. Jansen           call genscale(y, x, iBC)
113*59599516SKenneth E. Jansen        endif
114*59599516SKenneth E. Jansen        ac = acold*fct2+(y-yold)*fct3
115*59599516SKenneth E. Jansen       endif
116*59599516SKenneth E. Jansen
117*59599516SKenneth E. Jansenc
118*59599516SKenneth E. Jansen        if (LCtime .eq. 0) time = time + Delt(itseq)
119*59599516SKenneth E. Jansenc
120*59599516SKenneth E. Jansen      return
121*59599516SKenneth E. Jansen      end
122*59599516SKenneth E. Jansen
123*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
124*59599516SKenneth E. Jansenc
125*59599516SKenneth E. Jansenc    Correct solution at time n+1
126*59599516SKenneth E. Jansenc
127*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
128*59599516SKenneth E. Jansen      subroutine itrCorrect ( y, ac,yold, acold,Dy)
129*59599516SKenneth E. Jansen
130*59599516SKenneth E. Jansen      include "common.h"
131*59599516SKenneth E. Jansen
132*59599516SKenneth E. Jansen      real*8   y(nshg,ndof), ac(nshg,ndof), Dy(nshg,nflow)
133*59599516SKenneth E. Jansen      real*8   yold(nshg,ndof), acold(nshg,ndof)
134*59599516SKenneth E. Jansenc
135*59599516SKenneth E. Jansenc
136*59599516SKenneth E. Jansenc     What we actually solved for here was delta y_{n+alpha_f).
137*59599516SKenneth E. Jansenc     This is the variable that we work with in the iteration loop
138*59599516SKenneth E. Jansenc     but we have another variable that must be updated
139*59599516SKenneth E. Jansenc
140*59599516SKenneth E. Jansen      y(:,1:3) = y(:,1:3) - Dy(:,2:4)
141*59599516SKenneth E. Jansen      y(:,4)   = y(:,4)   - Dy(:,1)
142*59599516SKenneth E. Jansen      y(:,5)   = y(:,5)   - Dy(:,5)
143*59599516SKenneth E. Jansenc
144*59599516SKenneth E. Jansen      fct1= (one-almi/gami)
145*59599516SKenneth E. Jansen      fct2= almi*Dtgl/gami/alfi ! don't be confused by inverse dt=Dtgl
146*59599516SKenneth E. Jansen      ac= acold*fct1+(y-yold)*fct2
147*59599516SKenneth E. Jansen      return
148*59599516SKenneth E. Jansen      end
149*59599516SKenneth E. Jansen
150*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
151*59599516SKenneth E. Jansenc
152*59599516SKenneth E. Jansenc    Correct solution at time n+1
153*59599516SKenneth E. Jansenc
154*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
155*59599516SKenneth E. Jansen      subroutine itrCorrectSclr (y, ac, yold, acold, Dyt)
156*59599516SKenneth E. Jansen
157*59599516SKenneth E. Jansen      include "common.h"
158*59599516SKenneth E. Jansen
159*59599516SKenneth E. Jansen      real*8   y(nshg,ndof), ac(nshg,ndof), Dyt(nshg)
160*59599516SKenneth E. Jansen      real*8   yold(nshg,ndof), acold(nshg,ndof)
161*59599516SKenneth E. Jansenc
162*59599516SKenneth E. Jansen      is=5+isclr
163*59599516SKenneth E. Jansen      y(:,is)  = y(:,is) - Dyt(:)
164*59599516SKenneth E. Jansenc
165*59599516SKenneth E. Jansen      fct1= (one-almi/gami)
166*59599516SKenneth E. Jansen      fct2= almi*Dtgl/gami/alfi ! don't be confused by inverse dt=Dtgl
167*59599516SKenneth E. Jansen      ac(:,is)= acold(:,is)*fct1+(y(:,is)-yold(:,is))*fct2
168*59599516SKenneth E. Jansenc
169*59599516SKenneth E. Jansen      return
170*59599516SKenneth E. Jansen      end
171*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
172*59599516SKenneth E. Jansenc
173*59599516SKenneth E. Jansenc    Update solution at end of time step
174*59599516SKenneth E. Jansenc
175*59599516SKenneth E. Jansenc-----------------------------------------------------------------------
176*59599516SKenneth E. Jansen      subroutine itrUpdate( yold,          acold,
177*59599516SKenneth E. Jansen     &                      y,             ac )
178*59599516SKenneth E. Jansen
179*59599516SKenneth E. Jansen      include "common.h"
180*59599516SKenneth E. Jansen
181*59599516SKenneth E. Jansen      real*8        yold(nshg,ndof),            acold(nshg,ndof),
182*59599516SKenneth E. Jansen     &              y(nshg,ndof),               ac(nshg,ndof)
183*59599516SKenneth E. Jansen
184*59599516SKenneth E. Jansen
185*59599516SKenneth E. Jansen      if(iLset.eq.2 .and. isclr.eq.2) then
186*59599516SKenneth E. Jansenc ... assigning the redistanced scalar to the first scalar
187*59599516SKenneth E. Jansenc
188*59599516SKenneth E. Jansen         y(:,6)    = y(:,7)
189*59599516SKenneth E. Jansenc
190*59599516SKenneth E. Jansenc ... to calculate the right acceleration based on the updated value of the
191*59599516SKenneth E. Jansenc ... scalar, Ref: Eq.25 in generalised alpha method paper by Prof.Jansen
192*59599516SKenneth E. Jansenc
193*59599516SKenneth E. Jansen         acold(:,6)= acold(:,6)*(1-1/gami)
194*59599516SKenneth E. Jansen     &             + (y(:,6)-yold(:,6))*Dtgl/gami
195*59599516SKenneth E. Jansen         fct2=one/almi
196*59599516SKenneth E. Jansen         fct3=one/alfi
197*59599516SKenneth E. Jansen         acold(:,1:nflow) = acold(:,1:nflow)
198*59599516SKenneth E. Jansen     &                    + (ac(:,1:nflow)-acold(:,1:nflow))*fct2
199*59599516SKenneth E. Jansen         yold(:,1:nflow)  = yold(:,1:nflow)
200*59599516SKenneth E. Jansen     &                    + (y(:,1:nflow)-yold(:,1:nflow))*fct3
201*59599516SKenneth E. Jansen         yold(:,6) = y(:,7)
202*59599516SKenneth E. Jansen         acold(:,7)= zero
203*59599516SKenneth E. Jansen      else
204*59599516SKenneth E. Jansen         fct2=one/almi
205*59599516SKenneth E. Jansen         fct3=one/alfi
206*59599516SKenneth E. Jansen         acold = acold + (ac-acold)*fct2
207*59599516SKenneth E. Jansen         yold  = yold  + (y-yold)*fct3
208*59599516SKenneth E. Jansen      endif
209*59599516SKenneth E. Jansenc
210*59599516SKenneth E. Jansen      return
211*59599516SKenneth E. Jansen      end
212*59599516SKenneth E. Jansen
213*59599516SKenneth E. Jansen
214*59599516SKenneth E. Jansen
215*59599516SKenneth E. Jansen
216*59599516SKenneth E. Jansen
217*59599516SKenneth E. Jansen
218*59599516SKenneth E. Jansen
219