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