| 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 |
| |