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