4 subroutine set_vert(glo_num,ngv,nx,nel,vertex,ifcenter)
10 integer(i8) :: glo_num(1),ngv
11 integer :: vertex(*),nx, nel
17 call
setvert3d(glo_num,ngv,nx,nel,vertex,ifcenter)
27 if(nid == 0)
write(6,*)
'call usrsetvert'
28 call usrsetvert(glo_num,nel,nx,nx,nx)
29 if(nid == 0)
write(6,
'(A,/)')
' done :: usrsetvert'
36 use kinds, only : dp, i8
37 use size_m
, only : nx1, ny1, nz1, nelv, ndim, nid
38 use size_m
, only : lx1, ly1, lz1, lelv
40 use domain, only : nx_crs, nxyz_c, se_to_gcrs, lcr
41 use geom, only : ifvcor, ifbcor
42 use input, only : if3d, ifldmhd, cbc
43 use mesh, only : vertex
45 use tstep, only : ifield
52 real(DP) :: cmlt(lcr,lelv),mask(lcr,lelv)
53 integer,
allocatable :: ia(:,:,:), ja(:,:,:)
56 real(DP),
allocatable :: a(:)
58 real(DP),
allocatable :: h1(:), h2(:), w1(:), w2(:)
63 integer :: nxc, ncr, ntot, nzc, nfaces, ie, iface, nz, n
65 allocate(ia(lcr,lcr,lelv), ja(lcr,lcr,lelv))
79 if(nid == 0)
write(6,*)
'setup h1 coarse grid, nx_crs=', nx_crs
87 call
set_vert(se_to_gcrs,ngv,nxc,nelv,vertex, .true. )
102 cb=cbc(iface,ie,ifield)
103 if (cb ==
'O ' .OR. cb ==
'ON ' .OR. cb ==
'MM ' .OR. &
104 cb ==
'mm ' .OR. cb ==
'ms ' .OR. cb ==
'MS ') &
105 call
facev(mask,ie,iface,z,nxc,nxc,nzc)
108 elseif (ifield == ifldmhd)
then
111 cb=cbc(iface,ie,ifield)
112 if (cb ==
'ndd' .OR. cb ==
'dnd' .OR. cb ==
'ddn') &
113 call
facev(mask,ie,iface,z,nxc,nxc,nzc)
120 call
gs_setup(gs_handle,se_to_gcrs,ntot,nekcomm,mp)
121 call
gs_op(gs_handle,mask,1,2,0)
122 call
gs_op(gs_handle,cmlt,1,1,0)
138 allocate(h1(nx1*ny1*nz1*nelv),h2(nx1*ny1*nz1*nelv))
139 allocate(a(27*lx1*ly1*lz1*lelv))
140 allocate(w1(lx1*ly1*lz1*lelv),w2(lx1*ly1*lz1*lelv))
143 deallocate(h1,h2,w1,w2)
148 if (ifield == 1)
then
149 if (ifvcor) null_space=1
150 elseif (ifield == ifldmhd)
then
151 if (ifbcor) null_space=1
155 call
crs_setup(xxth(ifield),nekcomm,mp, ntot,se_to_gcrs, &
156 nz,ia,ja,a, null_space)
162 write(6,*)
'done :: setup h1 coarse grid ',t0,
' sec'
171 use kinds, only : dp, i8
175 integer(i8) :: se_to_gcrs(*)
179 if(mask(i) < 0.1) se_to_gcrs(i)=0
188 integer :: ia(n,n,ne), ja(n,n,ne)
194 ia(i,j,ie)=(ie-1)*n+i-1
195 ja(i,j,ie)=(ie-1)*n+j-1
207 integer :: lda, n, nkey
208 integer :: a(lda,n),aa(lda)
209 integer :: ind(*),key(nkey)
210 logical :: iftuple_ialtb
212 integer :: j, L, ir, ii, i
247 if (iftuple_ialtb(a(1,j),a(1,j+1),key,nkey)) j=j+1
249 if (iftuple_ialtb(aa,a(1,j),key,nkey))
then
277 if (a(k) < b(k))
then
280 elseif (a(k) > b(k))
then
299 if (a(k) /= b(k))
then
313 subroutine specmpn(b,nb,a,na,ba,ab,if3d,w,ldw)
317 logical,
intent(in) :: if3d
318 integer,
intent(in) :: nb, na, ldw
319 real(DP),
intent(out) :: b(nb,nb,nb)
320 real(DP),
intent(in) :: a(na,na,na)
321 real(DP),
intent(out) :: w(ldw) !>
323 integer :: ltest, nab, nbb, k, l, iz
327 if (if3d) ltest = na*na*nb + nb*na*na
328 if (ldw < ltest)
then
329 write(6,*)
'ERROR specmp:',ldw,ltest,if3d
336 call
mxm(ba,nb,a,na,w,na*na)
340 call
mxm(w(k),nb,ab,na,w(l),nb)
345 call
mxm(w(l),nbb,ab,na,b,nb)
347 call
mxm(ba,nb,a,na,w,na)
348 call
mxm(w,nb,ab,na,b,nb)
357 integer :: A(*),IND(*), n
359 integer :: j, L, ir, i, q, indx
389 IF ( a(ind(j)) < a(ind(j+1)) ) j=j+1
391 IF (q < a(ind(j)))
THEN
409 use size_m
, only : nx1, ny1, nz1, nelv, lx1, ldim
413 real(DP) :: a(ncl,ncl,*),h1(*),h2(*)
414 real(DP) :: w1(nx1*ny1*nz1,nelv),w2(nx1*ny1*nz1,nelv)
416 integer,
parameter :: lcrd=lx1**ldim
417 real(DP) :: b(lcrd,8)
419 integer :: e, i, j, isd, imsh, nxyz
420 real(DP),
external :: ddot
432 call
copy(w1(1,e),b(1,j),nxyz)
435 call
axhelm(w2,w1,h1,h2,imsh,isd)
439 a(i,j,e) = ddot(nxyz, b(:,i), 1, w2(:,e), 1)
451 use size_m
, only : lx1, nx1, ny1, nz1, ndim
455 real(DP) :: b(nx1,ny1,nz1)
458 real(DP) :: z0(lx1),z1(lx1)
459 real(DP) :: zr(lx1),zs(lx1),zt(lx1)
464 call
zwgll(zr,zs,nx1)
475 if (mod(j,2) == 0) call
copy(zr,z1,nx1)
476 if (j == 3 .OR. j == 4 .OR. j == 7 .OR. j == 8) call
copy(zs,z1,nx1)
477 if (j > 4) call
copy(zt,z1,nx1)
483 b(p,q,r) = zr(p)*zs(q)*zt(r)
490 b(p,q,1) = zr(p)*zs(q)
500 use zper, only : ifgtp
503 integer,
save :: icalld = 0
505 if (icalld > 0)
return
509 write(*,*)
"Oops: ifgtp"
521 integer :: gllnid(*),iunsort(*),nelgt,nelgv, np
524 integer :: nelgs, nnpstr, npstar, log2p, np2
525 integer,
external :: log2
526 integer :: e, ip, k, nel, nmod, npp
530 if (np2 == np .AND. nelgv == nelgt)
then
532 npstar = maxval(gllnid(1:nelgt))+1
535 gllnid(eg) = gllnid(eg)/nnpstr
540 elseif (np2 == np)
then
543 npstar = max(np,maxval(gllnid(1:nelgv))+1)
546 gllnid(eg) = gllnid(eg)/nnpstr
551 npstar = max(np,maxval(gllnid(nelgv+1:nelgv+nelgs))+1)
554 gllnid(eg) = gllnid(eg)/nnpstr
559 elseif (nelgv /= nelgt)
then
561 (
'Conjugate heat transfer requires P=power of 2.$',np)
579 call
isort(gllnid,iunsort,nelgt)
608 use size_m
, only : ndim
609 use input, only : ifmoab
610 use mesh, only : vertex
612 use zper, only : ifgfdm
616 integer,
save :: icalld = 0
618 if (icalld > 0)
return
625 call nekmoab_loadconn(vertex, nelgt, ncrnr)
636 use size_m
, only : lx1, ly1, lz1, lelv, nelt, nelv
637 use input, only : reafle
647 integer :: vertex(nlv,*)
648 character(4) :: suffix
650 integer,
parameter :: mdw=2
651 integer,
parameter :: ndw=lx1*ly1*lz1*lelv/mdw
654 integer :: e,eg,eg0,eg1, ieg, iok, lfname, neli, nnzi, npass
655 integer :: ipass, m, ntuple, iflag, mid
656 integer,
external :: iglmax, irecv
659 character(132) :: mapfle
660 character(1) :: mapfle1(132)
661 equivalence(mapfle,mapfle1)
666 lfname =
ltrunc(reafle,132) - 4
667 call
blank(mapfle,132)
668 call
chcopy(mapfle,reafle,lfname)
669 call
chcopy(mapfle1(lfname+1),suffix,4)
670 open(unit=80,file=mapfle,status=
'old',err=99)
671 read(80,*,err=99) neli,nnzi,shape_x
677 if (iok == 0) goto 999
679 call
bcast(shape_x,3*wdsize)
682 if (shape_x(1) < 0) lshape(1) = -lshape(1) + 1
683 if (shape_x(2) < 0) lshape(2) = -lshape(2) + 1
684 if (shape_x(3) < 0) lshape(3) = -lshape(3) + 1
685 shape_x = abs(shape_x)
688 neli = iglmax(neli,1)
691 neli = iglmax(neli,1)
694 npass = 1 + (neli/ndw)
696 if (nid == 0)
write(6,*) npass,
np,neli,ndw,
'Error get_vert_map'
705 if (
np <= 64)
write(6,*) nid,nelv,nelt,nelgv,nelgt,
' NELV'
713 vertex(1,e) = 1 + mod(ix(1) + 0, lshape(1)) + mod(ix(2) + 0, lshape(2))*lshape(1) &
714 + mod(ix(3) + 0, lshape(3)) * lshape(1) * lshape(2)
715 vertex(2,e) = 1 + mod(ix(1) + 1, lshape(1)) + mod(ix(2) + 0, lshape(2))*lshape(1) &
716 + mod(ix(3) + 0, lshape(3)) * lshape(1) * lshape(2)
717 vertex(3,e) = 1 + mod(ix(1) + 0, lshape(1)) + mod(ix(2) + 1, lshape(2))*lshape(1) &
718 + mod(ix(3) + 0, lshape(3)) * lshape(1) * lshape(2)
719 vertex(4,e) = 1 + mod(ix(1) + 1, lshape(1)) + mod(ix(2) + 1, lshape(2))*lshape(1) &
720 + mod(ix(3) + 0, lshape(3)) * lshape(1) * lshape(2)
721 vertex(5,e) = 1 + mod(ix(1) + 0, lshape(1)) + mod(ix(2) + 0, lshape(2))*lshape(1) &
722 + mod(ix(3) + 1, lshape(3)) * lshape(1) * lshape(2)
723 vertex(6,e) = 1 + mod(ix(1) + 1, lshape(1)) + mod(ix(2) + 0, lshape(2))*lshape(1) &
724 + mod(ix(3) + 1, lshape(3)) * lshape(1) * lshape(2)
725 vertex(7,e) = 1 + mod(ix(1) + 0, lshape(1)) + mod(ix(2) + 1, lshape(2))*lshape(1) &
726 + mod(ix(3) + 1, lshape(3)) * lshape(1) * lshape(2)
727 vertex(8,e) = 1 + mod(ix(1) + 1, lshape(1)) + mod(ix(2) + 1, lshape(2))*lshape(1) &
728 + mod(ix(3) + 1, lshape(3)) * lshape(1) * lshape(2)
731 iflag = iglmax(iflag,1)
736 write(6,*) nid,ntuple,nelv,nelt,nelgt,
' NELT FB'
746 if (nid == 0)
write(6,*)
'ABORT: Could not find map file ',mapfle
749 if (nid == 0)
write(6,*)ipass,npass,eg0,eg1,mdw,m,eg,
'get v fail'
768 integer :: nn, m, n, nkey
769 integer :: ind(n),a(m,n)
770 integer :: key(nkey),aa(m)
772 logical :: iftuple_ianeb,a_ne_b
784 a_ne_b = iftuple_ianeb(aa,a(1,i),key,nk)
804 integer :: m, n, nmax, nid, np
805 integer :: ind(nmax),tuple(m,nmax),cr_h
807 integer,
parameter :: mmax=40
808 integer :: key(mmax),wtuple(mmax)
809 integer :: nk, i, k, nkey, ni, ky, nimx, nu, nu_tot, nu_prior
810 integer,
external :: iglmax, igl_running_sum
813 write(6,*) nid,m,mmax,
' gbtuple_rank fail'
818 tuple(1,i) = mod(tuple(3,i),np)
824 call crystal_ituple_transfer(cr_h, tuple,m,ni,nmax, ky)
827 if (ni > nmax)
write(6,*) ni,nmax,n,
'cr_xfer problem, A'
828 if (nimx > nmax) call
exitt
835 call
irank_vecn(ind,nu,tuple,m,ni,key,nkey,wtuple)
838 nu_tot = igl_running_sum(nu)
839 nu_prior = nu_tot - nu
842 tuple(3,i) = ind(i) + nu_prior
845 call crystal_ituple_transfer(cr_h, tuple,m,ni,nmax, ky)
860 subroutine setvert3d(glo_num,ngv,nx,nel,vertex,ifcenter)
862 use size_m
, only : lelt, ndim, nid, nelt
864 use topol, only : icface, skpdat
867 integer(i8) :: glo_num(*),ngv
868 integer :: vertex(0:1,0:1,0:1,*),nx
871 integer :: edge(0:1,0:1,0:1,3,lelt),enum(12,lelt),fnum(6,lelt)
873 integer,
parameter :: nsafe=8
875 integer :: vertex_flat(8)
876 integer :: etuple(4,12*lelt*nsafe)
877 integer :: ftuple(5,6,lelt*nsafe)
878 integer :: ind(12*lelt*nsafe)
879 equivalence(etuple,ftuple)
881 integer :: gvf(4),facet(4),key(3),e
884 integer(i8) :: igv,ig0
885 integer(i8) :: ngvv,ngve,ngvs,ngvi,ngvm
886 integer(i8) :: n_on_edge,n_on_face,n_in_interior
887 integer(i8) :: i8glmax
889 integer :: ny, nz, nxyz, nlv, nel, k, j, i, il, ile, kswap, m, n, nmax
890 integer :: n_unique_edges, iedg_loc, i0, i0e, nfaces, ncrnr, ifac, icrn
891 integer :: n_unique_faces, iface, i1, is, j0, j1, js, idir, jdir, it, jt
893 integer,
external :: iglmax
910 ngvv = iglmax(vertex,nlv*nel)
917 il = 1 + (nx-1)*i + nx*(nx-1)*j + nx*nx*(nx-1)*k
918 ile = il + nx*ny*nz*(e-1)
919 glo_num(ile) = vertex(i,j,k,e)
936 edge(i,j,k,1,e) = vertex(i,j,k,e)
937 edge(j,i,k,2,e) = vertex(i,j,k,e)
938 edge(k,i,j,3,e) = vertex(i,j,k,e)
949 if (edge(0,j,k,i,e) > edge(1,j,k,i,e))
then
950 kswap = edge(0,j,k,i,e)
951 edge(0,j,k,i,e) = edge(1,j,k,i,e)
952 edge(1,j,k,i,e) = kswap
954 etuple(3,1+j+k*2+(i-1)*4+12*(e-1)) = edge(0,j,k,i,e)
955 etuple(4,1+j+k*2+(i-1)*4+12*(e-1)) = edge(1,j,k,i,e)
968 enum(j,i) = etuple(3,j+(i-1)*12)
971 n_unique_edges = iglmax(enum,12*nel)
974 ngve = n_unique_edges*n_on_edge
981 igv = ngv + n_on_edge*(enum(iedg_loc+1,e)-1)
982 i0 = nx*(nx-1)*j + nx*nx*(nx-1)*k
983 i0e = i0 + nxyz*(e-1)
984 if (glo_num(i0e+1) < glo_num(i0e+nx))
then
986 glo_num(i0e+i) = igv + i-1
990 glo_num(i0e+i) = igv + 1 + n_on_edge-(i-1)
993 iedg_loc = iedg_loc + 1
1000 igv = ngv + n_on_edge*(enum(iedg_loc+1,e)-1)
1001 i0 = 1+(nx-1)*i + nx*nx*(nx-1)*k
1002 i0e = i0 + nxyz*(e-1)
1003 if (glo_num(i0e) < glo_num(i0e+nx*(nx-1)))
then
1005 glo_num(i0e+(j-1)*nx) = igv + j-1
1009 glo_num(i0e+(j-1)*nx) = igv + 1 + n_on_edge-(j-1)
1012 iedg_loc = iedg_loc + 1
1019 igv = ngv + n_on_edge*(enum(iedg_loc+1,e)-1)
1020 i0 = 1 + (nx-1)*i + nx*(nx-1)*j
1021 i0e = i0 + nxyz*(e-1)
1022 if (glo_num(i0e) < glo_num(i0e+nx*nx*(nx-1)))
then
1024 glo_num(i0e+(k-1)*nx*nx) = igv + k-1
1028 glo_num(i0e+(k-1)*nx*nx) = igv + 1 + n_on_edge-(k-1)
1031 iedg_loc = iedg_loc + 1
1060 vertex_flat = reshape(vertex(:,:,:,e), (/8/))
1063 i = icface(icrn,ifac)
1064 facet(icrn) = vertex_flat(i)
1066 call
isort(facet,ind,ncrnr)
1067 ftuple(3:1+ncrnr, ifac, e) = facet(1:ncrnr-1)
1078 fnum(i,e) = ftuple(3,i,e)
1081 n_unique_faces = iglmax(fnum,6*nel)
1083 call
dsset(nx,ny,nz)
1086 i0 = skpdat(1,iface)
1087 i1 = skpdat(2,iface)
1088 is = skpdat(3,iface)
1089 j0 = skpdat(4,iface)
1090 j1 = skpdat(5,iface)
1091 js = skpdat(6,iface)
1107 gvf(1) = int(glo_num(i0+nx*(j0-1)+nxyz*(e-1)))
1108 gvf(2) = int(glo_num(i1+nx*(j0-1)+nxyz*(e-1)))
1109 gvf(3) = int(glo_num(i0+nx*(j1-1)+nxyz*(e-1)))
1110 gvf(4) = int(glo_num(i1+nx*(j1-1)+nxyz*(e-1)))
1112 call
irank(gvf,ind,4)
1117 if (ind(1) == 1)
then
1120 if (gvf(2) < gvf(3)) ifij = .true.
1121 elseif (ind(1) == 2)
then
1124 if (gvf(1) < gvf(4)) ifij = .true.
1125 elseif (ind(1) == 3)
then
1128 if (gvf(4) < gvf(1)) ifij = .true.
1129 elseif (ind(1) == 4)
then
1132 if (gvf(3) < gvf(2)) ifij = .true.
1136 write(*,*)
"Wasn't supposed to get here!"
1154 n_on_face = (nx-2)*(ny-2)
1155 ngvs = n_unique_faces*n_on_face
1156 ig0 = ngv + n_on_face*(fnum(iface,e)-1)
1164 if (k > nx .AND. k < nxx-nx .AND. &
1165 mod(k,nx) /= 1 .AND. mod(k,nx) /= 0)
then
1168 glo_num(i+nx*(j-1)+nxyz*(e-1)) = l + ig0
1179 if (k > nx .AND. k < nxx-nx .AND. &
1180 mod(k,nx) /= 1 .AND. mod(k,nx) /= 0)
then
1183 glo_num(i+nx*(j-1)+nxyz*(e-1)) = l + ig0
1195 n_in_interior = (nx-2)*(ny-2)*(nz-2)
1196 ngvi = n_in_interior*nelgt
1199 ig0 = ngv + n_in_interior*(
lglel(e)-1)
1205 glo_num(i+nx*(j-1)+nx*ny*(k-1)+nxyz*(e-1)) = ig0+l
1218 glo_num(i+nx*(j-1)+nx*ny*(k-1)+nxyz*(e-1)) = 0
1227 ngvm = i8glmax(glo_num,m)
1228 ngvv = ngvv + ngve + ngvs
1230 if (nid == 0)
write(6,1) nx,ngvv,ngvi,ngv,ngvm
1231 1
format(
' setvert3d:',i4,4i12)
1238 use kinds, only : i8
1239 use size_m
, only : ndim, nelt
1240 use input, only : ifflow, cbc
1243 integer :: nx, ny, nz, nel
1244 integer(i8) :: glo_num(nx,ny,nz,nel)
1247 integer :: e,f,fo,ef,efo, ifld, nface, k, j, i
1248 integer,
save :: eface0(6) = (/ 4,2,1,3,5,6 /)
1251 if (ifflow) ifld = 1
1259 if (cbc(ef,e,ifld) ==
'p ' .AND. cbc(efo,e,ifld) ==
'p ')
then
1263 gmn = min(glo_num(1,j,k,e),glo_num(nx,j,k,e))
1264 glo_num(1 ,j,k,e) = gmn
1265 glo_num(nx,j,k,e) = gmn
1268 elseif (f == 3)
then
1271 gmn = min(glo_num(i,1,k,e),glo_num(i,ny,k,e))
1272 glo_num(i,1 ,k,e) = gmn
1273 glo_num(i,ny,k,e) = gmn
1279 gmn = min(glo_num(i,j,1,e),glo_num(i,j,nz,e))
1280 glo_num(i,j,1 ,e) = gmn
1281 glo_num(i,j,nz,e) = gmn
integer function gllel(ieg)
subroutine set_up_h1_crs
?
subroutine bcast(buf, len)
subroutine set_jl_crs_mask(n, mask, se_to_gcrs)
subroutine mxm(a, n1, b, n2, c, n3)
Compute matrix-matrix product C = A*B.
subroutine get_vert_map(vertex, nlv, nel, suffix, ifgfdm)
subroutine dsset(nx, ny, nz)
Set up arrays IXCN,ESKIP,SKPDAT,NEDG,NOFFST for new NX,NY,NZ.
subroutine axhelm(au, u, helm1, helm2, imesh, isd)
Compute the (Helmholtz) matrix-vector product, AU = helm1*[A]u + helm2*[B]u, for NEL elements...
Arrays for direct stiffness summation. cleaned.
integer function, dimension(3) ieg_to_xyz(ieg)
subroutine gbtuple_rank(tuple, m, n, nmax, cr_h, nid, np, ind)
Return a unique rank for each matched tuple set. Global. Balanced. tuple is destroyed. By "balanced" we mean that none of the tuple entries is likely to be much more uniquely populated than any other, so that any of the tuples can serve as an initial (parallel) sort key First two slots in tuple(:,i) assumed empty.
subroutine ituple_sort(a, lda, n, key, nkey, ind, aa)
Use Heap Sort (p 231 Num. Rec., 1st Ed.)
real(dp) function dnekclock()
integer function lglel(iel)
subroutine irank_vecn(ind, nn, a, m, n, key, nkey, aa)
Compute rank of each unique entry a(1,i) Output: ind(i) i=1,...,n (global) rank of entry a(*...
subroutine assign_gllnid(gllnid, iunsort, nelgt, nelgv, np)
integer function gllnid(ieg)
subroutine irank(A, IND, N)
Use Heap Sort (p 233 Num. Rec.), 5/26/93 pff.
subroutine specmpn(b, nb, a, na, ba, ab, if3d, w, ldw)
Spectral interpolation from A to B via tensor products.
subroutine isort(a, ind, n)
Use Heap Sort (p 231 Num. Rec., 1st Ed.)
subroutine setvert3d(glo_num, ngv, nx, nel, vertex, ifcenter)
setup unique ids for dssum. note: total number of unique vertices, edges and faces has to be smaller ...
subroutine set_vert(glo_num, ngv, nx, nel, vertex, ifcenter)
Given global array, vertex, pointing to hex vertices, set up a new array of global pointers for an nx...
subroutine blank(A, N)
blank a string
logical function iftuple_ialtb(a, b, key, nkey)
subroutine, public zwgll(Z, W, NP)
subroutine check_p_bc(glo_num, nx, ny, nz, nel)
subroutine chcopy(a, b, n)
subroutine iswapt_ip(x, p, n)
subroutine set_mat_ij(ia, ja, n, ne)
subroutine get_local_crs_galerkin(a, ncl, nxc, h1, h2, w1, w2)
This routine generates Nelv submatrices of order ncl using Galerkin projection.
integer function ltrunc(string, l)
subroutine facev(a, ie, iface, val, nx, ny, nz)
Assign the value VAL to face(IFACE,IE) of array A. IFACE is the input in the pre-processor ordering s...
subroutine gen_crs_basis(b, j)
subroutine exitti(stringi, idata)
logical function iftuple_ianeb(a, b, key, nkey)