2 subroutine hmholtz(name,u,rhs,h1,h2,mask,mult,imsh,tli,maxit,isd)
4 use size_m
, only : lx1, ly1, lz1, nx1, ny1, nz1, nelv, nelt, ndim, nid
6 use fdmh1, only : kfldfdm
7 use input, only : ifsplit, param
8 use geom, only : binvm1, bintm1
9 use tstep, only : istep, nelfld, ifield
13 REAL(DP) :: U (lx1,ly1,lz1,*)
14 REAL(DP) :: RHS (lx1,ly1,lz1,*)
15 REAL(DP) :: H1 (lx1,ly1,lz1,*)
16 REAL(DP) :: H2 (lx1,ly1,lz1,*)
17 REAL(DP) :: MASK (lx1,ly1,lz1,*)
18 REAL(DP) :: MULT (lx1,ly1,lz1,*)
20 integer :: imsh, maxit, isd
32 if (ifsplit) iffdm = .true.
38 ntot = nx1*ny1*nz1*nelfld(ifield)
39 if (imsh == 1) ntot = nx1*ny1*nz1*nelv
40 if (imsh == 2) ntot = nx1*ny1*nz1*nelt
52 if (name ==
'PRES') kfldfdm = ndim+1
56 rhs(:,:,:,1:nelfld(ifield)) = rhs(:,:,:,1:nelfld(ifield)) * mask(:,:,:,1:nelfld(ifield))
57 if (nid == 0 .AND. istep <= 10) &
58 write(6,*) param(22),
' p22 ',istep,imsh
59 if (param(22) == 0 .OR. istep <= 10) &
60 call
chktcg1(tol,rhs,h1,h2,mask,mult,imsh,isd)
64 if (imsh == 1) call
cggo &
65 (u,rhs,h1,h2,mask,mult,imsh,tol,maxit,isd,binvm1,name)
66 if (imsh == 2) call
cggo &
67 (u,rhs,h1,h2,mask,mult,imsh,tol,maxit,isd,bintm1,name)
79 subroutine axhelm (au,u,helm1,helm2,imesh,isd)
81 use size_m
, only : lx1, ly1, lz1
82 use size_m
, only : nx1, ny1, nz1, nelt, nelv, ndim
84 use ctimer, only : axhelm_flop, axhelm_mop
85 use geom, only : g4m1, g5m1, g6m1
86 use dxyz, only : wddx, wddyt, wddzt
87 use input, only : ifaxis
89 use mesh, only : ifsolv
92 real(DP),
intent(out) :: AU (lx1,ly1,lz1,*) !>
93 real(DP),
intent(in) :: U (lx1,ly1,lz1,*) !>
94 real(DP),
intent(in) :: HELM1 (lx1,ly1,lz1,*) !>
95 real(DP),
intent(in) :: HELM2 (lx1,ly1,lz1,*) !>
96 integer,
intent(in) :: imesh !>
97 integer,
intent(in) :: isd !>
100 REAL(DP) :: TM1 (lx1,ly1,lz1)
101 REAL(DP) :: TM2 (lx1,ly1,lz1)
102 REAL(DP) :: TM3 (lx1,ly1,lz1)
104 integer :: nel, nxy, nyz, nxz, nxyz, ntot
109 vector(
real(dp)) :: tm1v, tm2v, tm3v, g4mv, g5mv, g6mv, uv, auv, bm1v, h1v, h2v
113 if (imesh == 1) nel=nelv
121 if (naxhm == 0) taxhm=0.0
124 IF ( .NOT. ifsolv) CALL
setfast(helm1,helm2,imesh)
133 write(*,*)
"Whoops! axhelm"
143 call
mxm(wddx,nx1,u(1,1,1,e),nx1,tm1,nyz)
144 call
mxm(u(1,1,1,e),nx1,wddyt,ny1,tm2,ny1)
145 call col2(tm1,g4m1(1,1,1,e),nxyz)
146 call col2(tm2,g5m1(1,1,1,e),nxyz)
147 call add3(au(1,1,1,e),tm1,tm2,nxyz)
148 call cmult(au(1,1,1,e),h1,nxyz)
154 call
mxm(dxm1,nx1,u(1,1,1,e),nx1,dudr,nyz)
155 call
mxm(u(1,1,1,e),nx1,dytm1,ny1,duds,ny1)
156 call col3(tmp1,dudr,g1m1(1,1,1,e),nxyz)
157 call col3(tmp2,duds,g2m1(1,1,1,e),nxyz)
159 call addcol3(tmp1,duds,g4m1(1,1,1,e),nxyz)
160 call addcol3(tmp2,dudr,g4m1(1,1,1,e),nxyz)
162 call col2(tmp1,helm1(1,1,1,e),nxyz)
163 call col2(tmp2,helm1(1,1,1,e),nxyz)
164 call
mxm(dxtm1,nx1,tmp1,nx1,tm1,nyz)
165 call
mxm(tmp2,nx1,dym1,ny1,tm2,ny1)
166 call add2(au(1,1,1,e),tm1,nxyz)
167 call add2(au(1,1,1,e),tm2,nxyz)
180 axhelm_flop = axhelm_flop + (2*nx1-1)*nx1*nyz
181 axhelm_mop = axhelm_mop + nx1*ny1*nz1
182 axhelm_flop = axhelm_flop + 9*nx1*ny1*nz1
183 axhelm_mop = axhelm_mop + 5*nx1*ny1*nz1
184 axhelm_flop = axhelm_flop + (2*ny1-1)*nx1*ny1*nz1
185 axhelm_flop = axhelm_flop + nxy*(2*nz1-1)*nz1
189 call
mxm(wddx,nx1,u(1,1,1,e),nx1,tm1,nyz)
191 call
mxm(u(1,1,iz,e),nx1,wddyt,ny1,tm2(1,1,iz),ny1)
193 call
mxm(u(1,1,1,e),nxy,wddzt,nz1,tm3,nz1)
195 h1v = vec_splats(helm1(1,1,1,e))
196 h2v = vec_splats(helm2(1,1,1,e))
199 g4mv = vec_ld(0, g4m1(1,iy,iz,e))
200 tm1v = vec_ld(0, tm1(1,iy,iz))
201 tm1v = vec_mul(g4mv,tm1v)
203 g5mv = vec_ld(0, g5m1(1,iy,iz,e))
204 tm2v = vec_ld(0, tm2(1,iy,iz))
205 tm1v = vec_madd(g5mv,tm2v,tm1v)
207 g6mv = vec_ld(0, g6m1(1,iy,iz,e))
208 tm3v = vec_ld(0, tm3(1,iy,iz))
209 tm1v = vec_madd(g6mv,tm3v,tm1v)
211 uv = vec_ld(0, u(1,iy,iz,e))
212 bm1v = vec_ld(0, bm1(1,iy,iz,e))
213 uv = vec_mul(uv,bm1v)
215 auv = vec_madd(h1v, tm1v, uv)
216 call vec_st(auv,0,au(1,iy,iz,e))
218 g4mv = vec_ld(0, g4m1(5,iy,iz,e))
219 tm1v = vec_ld(0, tm1(5,iy,iz))
220 tm1v = vec_mul(g4mv,tm1v)
222 g5mv = vec_ld(0, g5m1(5,iy,iz,e))
223 tm2v = vec_ld(0, tm2(5,iy,iz))
224 tm1v = vec_madd(g5mv,tm2v,tm1v)
226 g6mv = vec_ld(0, g6m1(5,iy,iz,e))
227 tm3v = vec_ld(0, tm3(5,iy,iz))
228 tm1v = vec_madd(g6mv,tm3v,tm1v)
230 uv = vec_ld(0, u(5,iy,iz,e))
231 bm1v = vec_ld(0, bm1(5,iy,iz,e))
232 uv = vec_mul(uv,bm1v)
234 auv = vec_madd(h1v, tm1v, uv)
235 call vec_st(auv,0,au(5,iy,iz,e))
239 au(:,:,:,e) = helm1(1,1,1,e) * ( &
241 + tm2*g5m1(:,:,:,e) &
242 + tm3*g6m1(:,:,:,e) ) &
243 + helm2(1,1,1,1)*bm1(:,:,:,e)*u(:,:,:,e)
246 write(*,*)
"Woops! axhelm"
251 call
mxm(dxm1,nx1,u(1,1,1,e),nx1,dudr,nyz)
253 call
mxm(u(1,1,iz,e),nx1,dytm1,ny1,duds(1,1,iz),ny1)
255 call
mxm(u(1,1,1,e),nxy,dztm1,nz1,dudt,nz1)
256 call col3(tmp1,dudr,g1m1(1,1,1,e),nxyz)
257 call col3(tmp2,duds,g2m1(1,1,1,e),nxyz)
258 call col3(tmp3,dudt,g3m1(1,1,1,e),nxyz)
260 call addcol3(tmp1,duds,g4m1(1,1,1,e),nxyz)
261 call addcol3(tmp1,dudt,g5m1(1,1,1,e),nxyz)
262 call addcol3(tmp2,dudr,g4m1(1,1,1,e),nxyz)
263 call addcol3(tmp2,dudt,g6m1(1,1,1,e),nxyz)
264 call addcol3(tmp3,dudr,g5m1(1,1,1,e),nxyz)
265 call addcol3(tmp3,duds,g6m1(1,1,1,e),nxyz)
267 call col2(tmp1,helm1(1,1,1,e),nxyz)
268 call col2(tmp2,helm1(1,1,1,e),nxyz)
269 call col2(tmp3,helm1(1,1,1,e),nxyz)
270 call
mxm(dxtm1,nx1,tmp1,nx1,tm1,nyz)
272 call
mxm(tmp2(1,1,iz),nx1,dym1,ny1,tm2(1,1,iz),ny1)
274 call
mxm(tmp3,nxy,dzm1,nz1,tm3,nz1)
275 call add2(au(1,1,1,e),tm1,nxyz)
276 call add2(au(1,1,1,e),tm2,nxyz)
277 call add2(au(1,1,1,e),tm3,nxyz)
291 if (ifaxis .AND. (isd == 2))
then
292 write(*,*)
"Whoops! axhelm 3"
297 call
mxm(u(1,1,1,e),nx1,datm1,ny1,duax,1)
298 call
mxm(ym1(1,1,1,e),nx1,datm1,ny1,ysm1,1)
307 term1 = bm1(
i,j,1,e)*u(
i,j,1,e)/ym1(
i,j,1,e)**2
308 term2 = wxm1(
i)*wam1(1)*dam1(1,j)*duax(
i) &
309 *jacm1(
i,1,1,e)/ysm1(
i)
311 term1 = bm1(
i,j,1,e)*u(
i,j,1,e)/ym1(
i,j,1,e)**2
314 au(
i,j,1,e) = au(
i,j,1,e) &
315 + helm1(
i,j,1,e)*(term1+term2)
331 use size_m
, only : nx1, ny1, nz1, nelt, nelv
332 use input, only : ifaxis, ifmodel
333 use mesh, only : iffast, ifdfrm
337 integer,
intent(in) :: imesh
338 REAL(DP),
intent(in) :: HELM1(nx1,ny1,nz1,*), HELM2(nx1,ny1,nz1,*)
340 integer :: nel, nxyz, ntot, ie
341 real(DP) :: delta, x, y, diff, epsm, h1min, h1max, testh1
344 real(DP),
external :: vlamax
347 nsetfast = nsetfast + 1
349 IF (imesh == 1) nel=nelv
350 IF (imesh == 2) nel=nelt
358 IF (diff == 0.0) epsm = 1.e-6
359 IF (diff > 0.0) epsm = 1.e-13
364 IF (ifdfrm(ie) .OR. ifaxis .OR. ifmodel )
THEN
368 h1min = minval(helm1(:,:,:,ie))
369 h1max = maxval(helm1(:,:,:,ie))
370 den = abs(h1max)+abs(h1min)
372 testh1 = abs((h1max-h1min)/(h1max+h1min))
373 IF (testh1 < epsm) iffast(ie) = .true.
379 tsetfast = tsetfast + (
dnekclock() - etime)
389 use size_m
, only : nx1, ny1, nz1, nelt, ndim
390 use dxyz, only : dxm1, dym1, dzm1
391 use dxyz, only : wddx, wddyt, wddzt
392 use geom, only : g1m1, g2m1, g3m1, g4m1, g5m1, g6m1
393 use mesh, only : ifdfrm
394 use wz_m, only : wxm1, wym1, wzm1
397 logical,
save :: IFIRST = .TRUE.
398 integer :: nxx, nyy, nzz
399 integer :: i, j, ip, ie, ix, iy, iz
407 wddx(i,j) = wddx(i,j) + wxm1(ip)*dxm1(ip,i)*dxm1(ip,j)
416 wddyt(j,i) = wddyt(j,i) + wym1(ip)*dym1(ip,i)*dym1(ip,j)
425 wddzt(j,i) = wddzt(j,i) + wzm1(ip)*dzm1(ip,i)*dzm1(ip,j)
434 IF ( .NOT. ifdfrm(ie))
THEN
438 g4m1(ix,iy,iz,ie)=g1m1(ix,iy,iz,ie)/wxm1(ix)
439 g5m1(ix,iy,iz,ie)=g2m1(ix,iy,iz,ie)/wym1(iy)
440 g6m1(ix,iy,iz,ie)=g3m1(ix,iy,iz,ie)/wzm1(iz)
448 IF ( .NOT. ifdfrm(ie))
THEN
451 g4m1(ix,iy,1,ie)=g1m1(ix,iy,1,ie)/wxm1(ix)
452 g5m1(ix,iy,1,ie)=g2m1(ix,iy,1,ie)/wym1(iy)
464 subroutine setprec (dpcm1,helm1,helm2,imsh,isd)
466 use size_m
, only : nx1, ny1, nz1, lx1, ly1, lz1, nelt, nelv, ndim
467 use dxyz, only : dxtm1, dytm1, dztm1, datm1, dam1
468 use geom, only : ifrzer, g1m1, g2m1, g3m1, ym1, jacm1
469 use input, only : ifaxis
471 use mesh, only : ifdfrm
472 use wz_m, only : wxm1, wam1
476 REAL(DP),
intent(out) :: DPCM1 (lx1,ly1,lz1,*)
477 REAL(DP),
intent(in) :: HELM1(nx1,ny1,nz1,*), HELM2(nx1,ny1,nz1,*)
478 integer,
intent(in) :: imsh, isd
480 REAL(DP) :: YSM1(ly1)
482 integer :: nel, ntot, ie, iq, iz, iy, ix, j, i, iel
483 real(DP) :: term1, term2
490 if (imsh == 1) nel=nelv
492 ntot = nel*nx1*ny1*nz1
500 dpcm1(:,:,:,1:nel) = 0._dp
509 dpcm1(ix,iy,iz,ie) = dpcm1(ix,iy,iz,ie) + &
510 g1m1(iq,iy,iz,ie) * dxtm1(ix,iq)**2
519 dpcm1(ix,iy,iz,ie) = dpcm1(ix,iy,iz,ie) + &
520 g2m1(ix,iq,iz,ie) * dytm1(iy,iq)**2
531 dpcm1(ix,iy,iz,ie) = dpcm1(ix,iy,iz,ie) + &
532 g3m1(ix,iy,iq,ie) * dztm1(iz,iq)**2
545 dpcm1(1,iy,iz,ie) = dpcm1(1,iy,iz,ie) &
546 + g4m1(1,iy,iz,ie) * dxtm1(1,1)*dytm1(iy,iy) &
547 + g5m1(1,iy,iz,ie) * dxtm1(1,1)*dztm1(iz,iz)
548 dpcm1(nx1,iy,iz,ie) = dpcm1(nx1,iy,iz,ie) &
549 + g4m1(nx1,iy,iz,ie) * dxtm1(nx1,nx1)*dytm1(iy,iy) &
550 + g5m1(nx1,iy,iz,ie) * dxtm1(nx1,nx1)*dztm1(iz,iz)
554 dpcm1(ix,1,iz,ie) = dpcm1(ix,1,iz,ie) &
555 + g4m1(ix,1,iz,ie) * dytm1(1,1)*dxtm1(ix,ix) &
556 + g6m1(ix,1,iz,ie) * dytm1(1,1)*dztm1(iz,iz)
557 dpcm1(ix,ny1,iz,ie) = dpcm1(ix,ny1,iz,ie) &
558 + g4m1(ix,ny1,iz,ie) * dytm1(ny1,ny1)*dxtm1(ix,ix) &
559 + g6m1(ix,ny1,iz,ie) * dytm1(ny1,ny1)*dztm1(iz,iz)
563 dpcm1(ix,iy,1,ie) = dpcm1(ix,iy,1,ie) &
564 + g5m1(ix,iy,1,ie) * dztm1(1,1)*dxtm1(ix,ix) &
565 + g6m1(ix,iy,1,ie) * dztm1(1,1)*dytm1(iy,iy)
566 dpcm1(ix,iy,nz1,ie) = dpcm1(ix,iy,nz1,ie) &
567 + g5m1(ix,iy,nz1,ie) * dztm1(nz1,nz1)*dxtm1(ix,ix) &
568 + g6m1(ix,iy,nz1,ie) * dztm1(nz1,nz1)*dytm1(iy,iy)
579 dpcm1(1,iy,iz,ie) = dpcm1(1,iy,iz,ie) &
580 + g4m1(1,iy,iz,ie) * dxtm1(1,1)*dytm1(iy,iy)
581 dpcm1(nx1,iy,iz,ie) = dpcm1(nx1,iy,iz,ie) &
582 + g4m1(nx1,iy,iz,ie) * dxtm1(nx1,nx1)*dytm1(iy,iy)
586 dpcm1(ix,1,iz,ie) = dpcm1(ix,1,iz,ie) &
587 + g4m1(ix,1,iz,ie) * dytm1(1,1)*dxtm1(ix,ix)
588 dpcm1(ix,ny1,iz,ie) = dpcm1(ix,ny1,iz,ie) &
589 + g4m1(ix,ny1,iz,ie) * dytm1(ny1,ny1)*dxtm1(ix,ix)
596 dpcm1(:,:,:,1:nel) = dpcm1(:,:,:,1:nel)*helm1(:,:,:,1:nel) + bm1*helm2(:,:,:,1:nel)
600 IF (ifaxis .AND. (isd == 2))
THEN
603 IF (ifrzer(iel))
THEN
604 CALL
mxm(ym1(1,1,1,iel),nx1,datm1,ny1,ysm1,1)
609 IF (ym1(i,j,1,iel) /= 0.)
THEN
610 term1 = bm1(i,j,1,iel)/ym1(i,j,1,iel)**2
611 IF (ifrzer(iel))
THEN
612 term2 = wxm1(i)*wam1(1)*dam1(1,j) &
613 *jacm1(i,1,1,iel)/ysm1(i)
617 dpcm1(i,j,1,iel) = dpcm1(i,j,1,iel) &
618 + helm1(i,j,1,iel)*(term1+term2)
626 dpcm1(:,:,:,1:nel) = 1._dp / dpcm1(:,:,:,1:nel)
637 subroutine chktcg1 (tol,res,h1,h2,mask,mult,imesh,isd)
639 use size_m
, only : lx1, ly1, lz1
640 use size_m
, only : nx1, ny1, nz1, nelv, nelt, nid
641 use eigen, only : eigaa, eigga
642 use input, only : ifprint
643 use geom, only : volvm1, voltm1, binvm1, bintm1, bm1
647 real(DP),
intent(out) :: tol
648 REAL(DP),
intent(in) :: RES (lx1,ly1,lz1,*)
649 REAL(DP),
intent(in) :: H1 (lx1,ly1,lz1,*)
650 REAL(DP),
intent(in) :: H2 (lx1,ly1,lz1,*)
651 REAL(DP),
intent(in) :: MASK (lx1,ly1,lz1,*)
652 REAL(DP),
intent(in) :: MULT (lx1,ly1,lz1,*)
653 integer,
intent(in) :: imesh, isd
655 real(DP),
allocatable :: W1(:,:,:,:), W2(:,:,:,:)
657 real(DP) :: acondno, delta, x, y, diff, eps
658 real(DP) :: vol, rinit, rmin, bcneu1, bcneu2, bctest, bcrob, tolmin
661 real(DP),
external :: glsc3, glsum
666 IF (eigaa /= 0.)
THEN
667 acondno = eigga/eigaa
678 IF (diff == 0.) eps = 1.e-6
679 IF (diff > 0.) eps = 1.e-13
681 IF (diff > 0.) eps = 1.e-16
686 ELSEIF (imesh == 2)
THEN
692 write(*,*)
"Got somewhere bad"
695 allocate(w1(nx1,ny1,nz1,nl), w2(nx1,ny1,nz1,nl))
696 ntot1 = nx1*ny1*nz1*nl
699 w2 = binvm1 * res(:,:,:,1:nl)
700 rinit = sqrt(glsc3(w2,res,mult,ntot1)/volvm1)
702 w2 = bintm1 * res(:,:,:,1:nl)
703 rinit = sqrt(glsc3(w2,res,mult,ntot1)/voltm1)
707 IF (nid == 0 .AND. ifprint) &
708 WRITE (6,*)
'New CG1-tolerance (RINIT*epsm) = ',rmin,tol
713 bcneu1 = glsc3(w1,mask,mult,ntot1)
714 bcneu2 = glsc3(w1,w1 ,mult,ntot1)
715 bctest = abs(bcneu1-bcneu2)
718 CALL
axhelm(w2,w1,h1,h2,imesh,isd)
721 bcrob = sqrt(glsum(w2,ntot1)/vol)
723 IF ((bctest < .1) .AND. (bcrob < (eps*acondno)))
THEN
725 tolmin = rinit*eps*10.
726 IF (tol < tolmin)
THEN
728 IF (nid == 0 .AND. ifprint) &
729 WRITE(6,*)
'New CG1-tolerance (Neumann) = ',tolmin
744 subroutine cggo(x,f,h1,h2,mask,mult,imsh,tin,maxit,isd,binv,name)
746 use size_m
, only : nid, nx1, ny1, nz1, nelt, nelv
747 use size_m
, only : lx1, ly1, lz1, lelt
748 use fdmh1, only : kfldfdm
749 use input, only : ifsplit, param, ifprint
750 use geom, only : volvm1, voltm1
751 use mesh, only : ifsolv, niterhm
752 use tstep, only : istep, imesh
756 real(DP),
intent(out) :: x(lx1*ly1*lz1,*) !>
757 real(DP),
intent(in) :: f(lx1*ly1*lz1,*) !>
758 real(DP),
intent(in) :: h1(lx1*ly1*lz1,*) !>
759 real(DP),
intent(in) :: h2(lx1*ly1*lz1,*) !>
760 real(DP),
intent(in) :: mask(lx1*ly1*lz1,*) !>
761 real(DP),
intent(in) :: mult(lx1*ly1*lz1,*) !>
762 real(DP),
intent(in) :: binv(lx1*ly1*lz1,*) !>
763 integer,
intent(in) :: imsh, isd, maxit
764 real(DP),
intent(in) :: tin !>
767 logical :: ifmcor,ifprint_hmh
769 integer,
parameter :: lxyz = lx1*ly1*lz1
770 real(DP) :: scalar(2)
771 real(DP),
allocatable :: d (:,:)
772 real(DP),
allocatable :: r (:,:) , w (:,:) , p (:,:) , z (:,:)
774 integer :: i, n, iter, nxyz, nel, niter
775 real(DP) :: rho, vol, tol, h2max, skmin
776 real(DP) :: rtz1, rtz2, rbn2, rbn0, beta, rho0, alpha, alphm
777 real(DP),
external :: glmax, glmin, glsum, glsc2, vlsc3, vlsc32, glsc3
780 if (ifsplit .AND. name ==
'PRES' .AND. param(42) == 0)
then
798 IF (imsh == 2) nel=nelt
799 IF (imsh == 2) vol=voltm1
803 if (param(22) /= 0) tol=abs(param(22))
804 if (name ==
'PRES' .AND. param(21) /= 0) tol=abs(param(21))
805 if (tin < 0) tol=abs(tin)
809 if ( .NOT. ifsolv)
then
816 allocate(d(lxyz,lelt)); d = 0_dp
817 if (kfldfdm < 0)
then
819 elseif(param(100) /= 2)
then
824 allocate(r(nxyz,nel))
825 cggo_mop = cggo_mop + 3*n
832 cggo_mop = cggo_mop + 2*n
834 skmin = glmin(mask,n)
835 if (skmin > 0 .AND. h2max == 0)
then
837 write(*,*)
"Oops! ifmcor"
839 if (name ==
'PRES')
then
840 write(*,*)
"Oops! name == PRES"
842 if (kfldfdm >= 0)
then
843 write(*,*)
"Oops! kfldfdm"
846 ifprint_hmh = .false.
847 if (nid == 0 .AND. ifprint .AND. param(74) /= 0) ifprint_hmh= .true.
848 if (nid == 0 .AND. istep == 1) ifprint_hmh= .true.
852 cggo_mop = cggo_mop + n
853 allocate(w(nxyz,nel)); w = 0_dp
854 allocate(p(nxyz,nel))
857 rtz1=1._dp; rtz2 = 1._dp
859 cggo_flop = cggo_flop + 8*n
860 cggo_mop = cggo_mop + 5*n
861 scalar(1) = 0._dp; scalar(2) = 0._dp
863 p(:,i) = r(:,i) * d(:,i)
864 scalar(1) = scalar(1) +
sum(p(:,i) * r(:,i) * mult(:,i))
865 scalar(2) = scalar(2) +
sum(r(:,i) * r(:,i) * mult(:,i) * binv(:,i))
867 call
gop(scalar,w,
'+ ',2)
869 rbn2=sqrt(scalar(2)/vol)
871 if (param(22) < 0) tol=abs(param(22))*rbn0
872 if (tin < 0) tol=abs(tin)*rbn0
875 write(6,3002) istep,iter,name,ifmcor,rbn2,tol,h1(1,1),h2(1,1)
880 call
axhelm(w,p,h1,h2,imsh,isd)
884 cggo_flop = cggo_flop + 4*n
885 cggo_mop = cggo_mop + 5*n
886 rho0 = rho; rho = 0._dp
888 w(:,i) = w(:,i) * mask(:,i)
889 rho = rho +
sum(w(:,i) * p(:,i) * mult(:,i))
891 allocate(z(nxyz,nel))
892 call
gop(rho,z,
'+ ',1)
897 scalar(1) = 0._dp; scalar(2) = 0._dp
899 cggo_flop = cggo_flop + 10*n
900 cggo_mop = cggo_mop + 7*n
902 r(:,i) = r(:,i) + alphm * w(:,i)
903 z(:,i) = r(:,i) * d(:,i)
904 scalar(1) = scalar(1) +
sum(z(:,i) * r(:,i) * mult(:,i))
905 scalar(2) = scalar(2) +
sum(r(:,i) * r(:,i) * mult(:,i) * binv(:,i))
907 call
gop(scalar,w,
'+ ',2)
909 rbn2=sqrt(scalar(2)/vol)
912 write(6,3002) istep,iter,name,ifmcor,rbn2,tol,h1(1,1),h2(1,1)
918 IF (rbn2 <= tol .AND. (iter > 1 .OR. istep <= 5))
THEN
920 iter_max = param(150)
921 if (name ==
'PRES') iter_max = param(151)
922 if (iter > iter_max)
then
925 cggo_flop = cggo_flop + 2*n
926 cggo_mop = cggo_mop + 3*n
927 x(:,1:nel) = x(:,1:nel) + alpha * p
931 write(6,3000) istep,name,niter,rbn2,rbn0,tol
935 cggo_flop = cggo_flop + 4*n
936 cggo_mop = cggo_mop + 5*n
939 x(:,i) = x(:,i) + alpha * p(:,i)
940 p(:,i) = z(:,i) + beta * p(:,i)
943 call
axhelm(w,p,h1,h2,imsh,isd)
947 cggo_flop = cggo_flop + 4*n
948 cggo_mop = cggo_mop + 5*n
949 rho0 = rho; rho = 0._dp
951 w(:,i) = w(:,i) * mask(:,i)
952 rho = rho +
sum(w(:,i) * p(:,i) * mult(:,i))
954 call
gop(rho,z,
'+ ',1)
961 if (nid == 0)
write (6,3001) istep,niter,name,rbn2,rbn0,tol
962 3000
format(4x,i7,4x,
'Hmholtz ',a4,
': ',i6,1p6e13.4)
963 3001
format(2i6,
' **ERROR**: Failed in HMHOLTZ: ',a4,1p6e13.4)
964 3002
format(i3,i6,
' Helmholtz ',a4,1x,l4,
':',1p6e13.4)
977 integer,
intent(in) :: n
978 real(DP),
intent(in) :: r(n),b(n),m(n)
991 use size_m
, only : nx1, ny1, nz1
994 real(DP),
intent(out) :: d (nx1,ny1,nz1,1)
995 real(DP),
intent(in) :: h1(nx1,ny1,nz1,1)
996 real(DP),
intent(in) :: h2(nx1,ny1,nz1,1)
997 integer,
intent(in) :: nel
1010 integer :: nxyz, i1, i2, ie, i3, k1, k2, k3
1011 real(DP) :: h1b, h2b, vol, vl1, vl2, vl3, den
1012 real(DP),
external :: vlsum, vlsc2
1019 h1b = vlsum(h1(1,1,1,ie),nxyz)/nxyz
1020 h2b = vlsum(h2(1,1,1,ie),nxyz)/nxyz
1021 k1 = ktype(ie,1,kfldfdm)
1022 k2 = ktype(ie,2,kfldfdm)
1023 k3 = ktype(ie,3,kfldfdm)
1024 vol = elsize(1,ie)*elsize(2,ie)*elsize(3,ie)
1025 vl1 = elsize(2,ie)*elsize(3,ie)/(elsize(1,ie)+dp_eps)
1026 vl2 = elsize(1,ie)*elsize(3,ie)/(elsize(2,ie)+dp_eps)
1027 vl3 = elsize(1,ie)*elsize(2,ie)/(elsize(3,ie)+dp_eps)
1031 den = h1b*(vl1*dd(i1,k1) + vl2*dd(i2,k2) + vl3*dd(i3,k3)) &
1033 if (ifbhalf) den = den/vol
1035 d(i1,i2,i3,ie) = 1./den
1042 3
format(a4,1p4e12.4,8i8)
1052 h1b = vlsc2(h1(1,1,1,ie),ym1(1,1,1,ie),nxyz)/nxyz
1053 h2b = vlsc2(h2(1,1,1,ie),ym1(1,1,1,ie),nxyz)/nxyz
1055 h1b = vlsum(h1(1,1,1,ie),nxyz)/nxyz
1056 h2b = vlsum(h2(1,1,1,ie),nxyz)/nxyz
1058 k1 = ktype(ie,1,kfldfdm)
1059 k2 = ktype(ie,2,kfldfdm)
1060 vol = elsize(1,ie)*elsize(2,ie)
1061 vl1 = elsize(2,ie)/elsize(1,ie)
1062 vl2 = elsize(1,ie)/elsize(2,ie)
1066 den = h1b*( vl1*dd(i1,k1) + vl2*dd(i2,k2) ) &
1068 if (ifbhalf) den = den/vol
1070 d(i1,i2,i3,ie) = 1./den
1079 2
format(a4,1p3e12.4,8i8)
1102 use kinds, only : dp
1103 use size_m
, only : lx1, ly1, lz1, lelv, nid
1107 integer,
intent(in) :: n
1108 real(DP),
intent(inout) :: a(n,n), b(n,n)
1109 real(DP),
intent(out) :: lam(n)
1110 real(DP),
intent(in) :: w(n,n) !>
1112 real(DP) :: aa(100),bb(100)
1114 integer,
parameter :: lbw=4*lx1*ly1*lz1*lelv
1115 real(DP),
allocatable :: bw(:)
1117 integer :: info, ninf, lw
1128 call dsygv(1,
'V',
'U',n,a,n,b,n,lam,bw,lbw,info)
1130 call ssygv(1,
'V',
'U',n,a,n,b,n,lam,bw,lbw,info)
1138 call
outmat2(lam,1,n,n,
'Deig')
1142 write(6,*)
'Error in generalev, info=',info,n,ninf
1151 use size_m
, only : nid
1152 use kinds, only : dp
1156 character(4) :: name
1160 write(6,2) nid,name,m,n,k
1162 write(6,1) nid,name,(a(i,j),j=1,n2)
1165 1
format(i3,1x,a4,1p8e14.5)
1166 2
format(/,
'Matrix: ',i3,1x,a4,3i8)
static double sum(struct xxt *data, double v, uint n, uint tag)
subroutine set_fdm_prec_h1b(d, h1, h2, nel)
subroutine outmat2(a, m, n, k, name)
subroutine dssum(u)
Direct stiffness sum.
real(dp) function vlsc32(r, b, m, n)
subroutine mxm(a, n1, b, n2, c, n3)
Compute matrix-matrix product C = A*B.
subroutine axhelm(au, u, helm1, helm2, imesh, isd)
Compute the (Helmholtz) matrix-vector product, AU = helm1*[A]u + helm2*[B]u, for NEL elements...
real(dp) function dnekclock()
subroutine sfastax()
For undeformed elements, set up appropriate elemental matrices and geometric factors for fast evaluat...
subroutine setprec(dpcm1, helm1, helm2, imsh, isd)
Generate diagonal preconditioner for the Helmholtz operator.
subroutine generalev(a, b, lam, n, w)
Solve the generalized eigenvalue problem A x = lam B x.
subroutine hmh_gmres(res, h1, h2, wt, iter)
Solve the Helmholtz equation by right-preconditioned GMRES iteration.
subroutine chktcg1(tol, res, h1, h2, mask, mult, imesh, isd)
Check that the tolerances are not too small for the CG-solver. Important when calling the CG-solver (...
subroutine setfast(helm1, helm2, imesh)
Set logicals for fast evaluation of A*x.
subroutine gop(x, w, op, n)
Global vector commutative operation.
subroutine cggo(x, f, h1, h2, mask, mult, imsh, tin, maxit, isd, binv, name)
Solve the Helmholtz equation, H*U = RHS, using preconditioned conjugate gradient iteration. Preconditioner: diag(H).
subroutine chcopy(a, b, n)
subroutine hmholtz(name, u, rhs, h1, h2, mask, mult, imsh, tli, maxit, isd)