blob: 79a1044c28f2eb848b35da145ee740b1eb2ab844 [file] [log] [blame]
c---------------------------------------------------------
subroutine convect(ifmortar)
c---------------------------------------------------------
c Advance the convection term using 4th order RK
c 1.ta1 is solution from last time step
c 2.the heat source is considered part of d/dx
c 3.trhs is right hand side for the diffusion equation
c 4.tmor is solution on mortar points, which will be used
c as the initial guess when advancing the diffusion term
c---------------------------------------------------------
include 'header.h'
double precision alpha2, tempa(lx1,lx1,lx1),
& rdtime, pidivalpha, sixth,
& dtx1, dtx2, dtx3, src, rk1(lx1,lx1,lx1), rk2(lx1,lx1,lx1),
& rk3(lx1,lx1,lx1), rk4(lx1,lx1,lx1), temp(lx1,lx1,lx1),
& subtime(3), xx0(3), yy0(3), zz0(3), dtime2, r2, sum,
& xloc(lx1), yloc(lx1), zloc(lx1)
integer k,iel,i,j,iside,isize, substep, ip
logical ifmortar
parameter (sixth=1.d0/6.d0)
if (timeron) call timer_start(t_convect)
pidivalpha = dacos(-1.d0)/alpha
alpha2 = alpha*alpha
dtime2 = dtime/2.d0
rdtime = 1.d0/dtime
subtime(1) = time
subtime(2) = time+dtime2
subtime(3) = time+dtime
do substep = 1, 3
xx0(substep) = x00+velx*subtime(substep)
yy0(substep) = y00+vely*subtime(substep)
zz0(substep) = z00+velz*subtime(substep)
end do
c$OMP PARALLEL DO DEFAULT(SHARED) PRIVATE(rk4,rk3,rk2,temp,rk1,dtx3,
c$OMP$ dtx2,dtx1,iside,ip,sum,src,r2,i,j,k,isize,iel,tempa,
c$OMP$ xloc,yloc,zloc)
do iel = 1, nelt
isize=size_e(iel)
c.......xloc(i) is the location of i'th collocation in x direction in an element.
c yloc(i) is the location of j'th collocation in y direction in an element.
c zloc(i) is the location of k'th collocation in z direction in an element.
do i = 1, lx1
xloc(i) = xfrac(i)*(xc(2,iel)-xc(1,iel))+xc(1,iel)
end do
do j = 1, lx1
yloc(j) = xfrac(j)*(yc(4,iel)-yc(1,iel))+yc(1,iel)
end do
do k = 1, lx1
zloc(k) = xfrac(k)*(zc(5,iel)-zc(1,iel))+zc(1,iel)
end do
do k = 1, lx1
do j = 1, lx1
do i = 1, lx1
r2 = (xloc(i)-xx0(1))**2+(yloc(j)-yy0(1))**2+
& (zloc(k)-zz0(1))**2
if (r2.le.alpha2) then
src = dcos(dsqrt(r2)*pidivalpha)+1.d0
else
src = 0.d0
endif
sum = 0.d0
do ip = 1, lx1
sum = sum + dxm1(i,ip) * ta1(ip,j,k,iel)
end do
dtx1 = -velx*sum*xrm1_s(i,j,k,isize)
sum = 0.d0
do ip = 1, lx1
sum = sum + dxm1(j,ip) * ta1(i,ip,k,iel)
end do
dtx2=-vely*sum*xrm1_s(i,j,k,isize)
sum = 0.d0
do ip = 1, lx1
sum = sum + dxm1(k,ip) * ta1(i,j,ip,iel)
end do
dtx3=-velz*sum*xrm1_s(i,j,k,isize)
rk1(i,j,k)= dtx1 + dtx2 + dtx3 + src
temp(i,j,k)=ta1(i,j,k,iel)+dtime2*rk1(i,j,k)
end do
end do
end do
do k = 1, lx1
do j = 1, lx1
do i = 1, lx1
r2 = (xloc(i)-xx0(2))**2 + (yloc(j)-yy0(2))**2 +
& (zloc(k)-zz0(2))**2
if (r2.le.alpha2) then
src = dcos(dsqrt(r2)*pidivalpha)+1.d0
else
src = 0.d0
endif
sum = 0.d0
do ip = 1, lx1
sum = sum + dxm1(i,ip) * temp(ip,j,k)
end do
dtx1 =-velx*sum*xrm1_s(i,j,k,isize)
sum = 0.d0
do ip = 1, lx1
sum = sum + dxm1(j,ip) * temp(i,ip,k)
end do
dtx2 =-vely*sum*xrm1_s(i,j,k,isize)
sum = 0.d0
do ip = 1, lx1
sum = sum + dxm1(k,ip) * temp(i,j,ip)
end do
dtx3 =-velz*sum*xrm1_s(i,j,k,isize)
rk2(i,j,k)= dtx1 + dtx2 + dtx3 + src
tempa(i,j,k)=ta1(i,j,k,iel)+dtime2*rk2(i,j,k)
end do
end do
end do
do k = 1, lx1
do j = 1, lx1
do i = 1, lx1
r2 = (xloc(i)-xx0(2))**2 + (yloc(j)-yy0(2))**2 +
& (zloc(k)-zz0(2))**2
if (r2.le.alpha2) then
src = dcos(dsqrt(r2)*pidivalpha)+1.d0
else
src = 0.d0
endif
sum = 0.d0
do ip = 1, lx1
sum = sum + dxm1(i,ip) * tempa(ip,j,k)
end do
dtx1 =-velx*sum*xrm1_s(i,j,k,isize)
sum = 0.d0
do ip = 1, lx1
sum = sum + dxm1(j,ip) * tempa(i,ip,k)
end do
dtx2 =-vely*sum*xrm1_s(i,j,k,isize)
sum = 0.d0
do ip = 1, lx1
sum = sum + dxm1(k,ip) * tempa(i,j,ip)
end do
dtx3 =-velz*sum*xrm1_s(i,j,k,isize)
rk3(i,j,k)= dtx1 + dtx2 + dtx3 + src
temp(i,j,k)=ta1(i,j,k,iel)+dtime*rk3(i,j,k)
end do
end do
end do
do k = 1, lx1
do j = 1, lx1
do i = 1, lx1
r2 = (xloc(i)-xx0(3))**2 + (yloc(j)-yy0(3))**2 +
& (zloc(k)-zz0(3))**2
if (r2.le.alpha2) then
src = dcos(dsqrt(r2)*pidivalpha)+1.d0
else
src = 0.d0
endif
sum = 0.d0
do ip = 1, lx1
sum = sum + dxm1(i,ip) * temp(ip,j,k)
end do
dtx1 =-velx*sum*xrm1_s(i,j,k,isize)
sum = 0.d0
do ip = 1, lx1
sum = sum + dxm1(j,ip) * temp(i,ip,k)
end do
dtx2 =-vely*sum*xrm1_s(i,j,k,isize)
sum = 0.d0
do ip = 1, lx1
sum = sum + dxm1(k,ip) * temp(i,j,ip)
end do
dtx3 =-velz*sum*xrm1_s(i,j,k,isize)
rk4(i,j,k)= dtx1 + dtx2 + dtx3 + src
tempa(i,j,k)=sixth*(rk1(i,j,k)+2.d0*
& rk2(i,j,k)+2.d0*rk3(i,j,k)+rk4(i,j,k))
end do
end do
end do
c.......apply boundary condition
do iside=1,nsides
if(cbc(iside,iel).eq.0)then
call facev(tempa,iside,0.0d0)
end if
end do
do k=1,lx1
do j=1,lx1
do i=1,lx1
trhs(i,j,k,iel)=bm1_s(i,j,k,isize)*(ta1(i,j,k,iel)*rdtime+
& tempa(i,j,k))
ta1(i,j,k,iel)=ta1(i,j,k,iel)+tempa(i,j,k)*dtime
end do
end do
end do
end do
c$OMP END PARALLEL DO
c.....get mortar for intial guess for CG
if (timeron) call timer_start(t_transfb_c)
if(ifmortar)then
call transfb_c_2(ta1)
else
call transfb_c(ta1)
end if
if (timeron) call timer_stop(t_transfb_c)
c$OMP PARALLEL DO DEFAULT(SHARED) PRIVATE(i)
do i=1,nmor
tmort(i)=tmort(i)/mormult(i)
end do
c$OMP END PARALLEL DO
if (timeron) call timer_stop(t_convect)
return
end