13 use kinds, only : dp, i8
14 use size_m
, only : nid, ndim, nx1, ny1, nz1, nelv, nelt, nfield
15 use size_m
, only : lx1, ly1, lz1, lelv
16 use input, only : ifflow, ifmvbd, ifheat, param
17 use mesh, only : vertex
19 use parallel, only : nelgv, nelgt, gsh_fld, nelg
20 use soln, only : vmult, tmult
21 use tstep, only : ifield
22 use zper, only : ifgtp
25 integer(i8),
allocatable :: glo_num(:)
27 integer :: nxl, nyl, nzl, mfield, ncrnr, ntotv, ntott
28 real(DP) :: vmltmax, ivmltmax
29 real(DP),
external :: glmax
31 allocate(glo_num(lx1*ly1*lz1*lelv))
33 if(nid == 0)
write(6,*)
'setup mesh topology'
42 call
dsset(nx1,ny1,nz1)
57 if (param(75) < 1) call
verify
63 IF (ifmodel .AND. ifkeps) CALL cbcturb
77 if (nelgv == nelgt)
then
79 write(*,*)
"Oops: ifgtp"
84 call
setupds(gsh_fld(1),nx1,ny1,nz1,nelv,nelgv,vertex,glo_num)
100 call
setupds(gsh_fld(1),nx1,ny1,nz1,nelv,nelgv,vertex,glo_num)
104 call
setupds(gsh_fld(2),nx1,ny1,nz1,nelt,nelgt,vertex,glo_num)
126 ntotv = nx1*ny1*nz1*nelv
127 ntott = nx1*ny1*nz1*nelt
131 allocate(tmult(nx1,ny1,nz1,nelt,1))
132 tmult(:,:,:,:,1) = 1._dp
134 tmult(:,:,:,:,1) = 1._dp / tmult(:,:,:,:,1)
139 vmult => tmult(:,:,:,:,1)
142 allocate(vmult(nx1,ny1,nz1,nelv))
145 vmltmax=glmax(vmult,ntotv)
147 if (nid == 0)
write(6,*) ivmltmax,
' max multiplicity'
148 vmult = 1._dp / vmult
151 if ( .NOT. ifflow) call
copy(vmult,tmult,ntott)
152 if (ifmvbd) call
copy(wmult,vmult,ntott)
154 if (nelg(ifield) == nelgv)
then
155 gsh_fld(ifield) = gsh_fld(1)
156 call
copy(tmult(1,1,1,1,ifield-1),vmult,ntotv)
158 gsh_fld(ifield) = gsh_fld(2)
159 call
copy(tmult(1,1,1,1,ifield-1),tmult,ntott)
164 write(6,*)
'done :: setup mesh topology'
176 use topol, only : group, eface1, eface, nomlis
179 integer :: j, idim, iface
291 use size_m
, only : ndim
292 use topol, only : iedgef, iedge, invedg, skpdat, group
295 integer :: ITMP(3,3,3)
298 integer :: nxl, nyl, nzl, nxy, nxyz, nfaces
299 integer :: i3d, i, i3, iz, i2, iy, i1, ix
300 integer :: j, j1, j2, jskip2
301 integer :: jf2, js2, jskip1, jf1, js1, iface, image, ii
302 integer :: iedgef_flat(48)
326 iedge(i)=ix+nxl*(iy-1)+nxy*(iz-1)
339 iedge(i)=ix+nxl*(iy-1)+nxy*(iz-1)
352 iedge(i)=ix+nxl*(iy-1)+nxy*(iz-1)
366 iedge(i)=ix+nxl*(iy-1)+nxy*(iz-1)
387 itmp = reshape( (/(i,i=1,nxyz)/), (/nxl, nyl, nzl/))
396 DO 500 iface=1,nfaces
397 js1 = skpdat(1,iface)
398 jf1 = skpdat(2,iface)
399 jskip1 = skpdat(3,iface)
400 js2 = skpdat(4,iface)
401 jf2 = skpdat(5,iface)
402 jskip2 = skpdat(6,iface)
406 order = (-1)**(group(iface)+image)
427 DO 100 j1=js1,jf1-jskip1,jskip1
429 iedgef_flat(j+(iface-1)*8)=j1 + 3*(j2-1)
436 DO 200 j2=js2,jf2-jskip2,jskip2
438 iedgef_flat(j+(iface-1)*8)=j1 + 3*(j2-1)
446 DO 300 j1=jf1,js1+jskip1,-jskip1
448 iedgef_flat(j+(iface-1)*8)=j1 + 3*(j2-1)
455 DO 400 j2=jf2,js2+jskip2,-jskip2
457 iedgef_flat(j+(iface-1)*8)=j1 + 3*(j2-1)
460 iedgef(:,:,:,image) = reshape(iedgef_flat, (/2,4,6/))
482 write(*,*) iface, js2, jf2, jskip2, image
483 DO 105 j2=js2,jf2-jskip2,jskip2
485 iedgef_flat(j+(iface-1)*8)=j1 + 3*(j2-1)
492 DO 205 j1=js1,jf1-jskip1,jskip1
494 iedgef_flat(j+(iface-1)*8)=j1 + 3*(j2-1)
501 DO 305 j2=jf2,js2+jskip2,-jskip2
503 iedgef_flat(j+(iface-1)*8)=j1 + 3*(j2-1)
510 DO 405 j1=jf1,js1+jskip1,-jskip1
512 iedgef_flat(j+(iface-1)*8)=j1 + 3*(j2-1)
516 iedgef(:,:,:,image) = reshape(iedgef_flat, (/2,4,6/))
524 iedgef(1,1,1,0) = nxy - nxl + 1
526 iedgef(1,1,2,0) = nxl
527 iedgef(1,2,2,0) = nxy
529 iedgef(1,2,3,0) = nxl
530 iedgef(1,1,4,0) = nxy
531 iedgef(1,2,4,0) = nxy - nxl + 1
534 iedgef(1,2,1,1) = nxy - nxl + 1
535 iedgef(1,1,2,1) = nxy
536 iedgef(1,2,2,1) = nxl
537 iedgef(1,1,3,1) = nxl
539 iedgef(1,1,4,1) = nxy - nxl + 1
540 iedgef(1,2,4,1) = nxy
550 use topol, only : ixcn, skpdat, eskip, nedg
553 integer :: nx, ny, nz
555 INTEGER,
save :: NXO = 0, NYO = 0, NZO = 0
556 integer :: ic, icz, icy, icx, nxy, ied, iedm
559 IF (nxo == nx .AND. nyo == ny .AND. nzo == nz)
RETURN
578 ixcn(ic)= 1 + (nx-1)*icx + nx*(ny-1)*icy + nx*ny*(nz-1)*icz
589 skpdat(2,1)=nx*(ny-1)+1
592 skpdat(5,1)=ny*(nz-1)+1
595 skpdat(1,2)=1 + (nx-1)
596 skpdat(2,2)=nx*(ny-1)+1 + (nx-1)
599 skpdat(5,2)=ny*(nz-1)+1
608 skpdat(5,3)=ny*(nz-1)+1
611 skpdat(1,4)=1 + nx*(ny-1)
612 skpdat(2,4)=nx + nx*(ny-1)
615 skpdat(5,4)=ny*(nz-1)+1
627 skpdat(1,6)=1 + nx*ny*(nz-1)
628 skpdat(2,6)=nx + nx*ny*(nz-1)
644 eskip( 1,1) = ixcn(1) + 1
645 eskip( 1,2) = ixcn(2) - 1
647 eskip( 2,1) = ixcn(3) + 1
648 eskip( 2,2) = ixcn(4) - 1
650 eskip( 3,1) = ixcn(5) + 1
651 eskip( 3,2) = ixcn(6) - 1
653 eskip( 4,1) = ixcn(7) + 1
654 eskip( 4,2) = ixcn(8) - 1
656 eskip( 5,1) = ixcn(1) + nx
657 eskip( 5,2) = ixcn(3) - nx
659 eskip( 6,1) = ixcn(2) + nx
660 eskip( 6,2) = ixcn(4) - nx
662 eskip( 7,1) = ixcn(5) + nx
663 eskip( 7,2) = ixcn(7) - nx
665 eskip( 8,1) = ixcn(6) + nx
666 eskip( 8,2) = ixcn(8) - nx
668 eskip( 9,1) = ixcn(1) + nxy
669 eskip( 9,2) = ixcn(5) - nxy
671 eskip(10,1) = ixcn(2) + nxy
672 eskip(10,2) = ixcn(6) - nxy
674 eskip(11,1) = ixcn(3) + nxy
675 eskip(11,2) = ixcn(7) - nxy
677 eskip(12,1) = ixcn(4) + nxy
678 eskip(12,2) = ixcn(8) - nxy
685 eskip(iedm,1) = eskip(ied,2)
686 eskip(iedm,2) = eskip(ied,1)
687 eskip(iedm,3) = -eskip(ied,3)
714 use size_m
, only : ndim, nelt
715 use input, only : xc, yc, zc
716 use scratch, only : xml, yml, zml
719 real(DP) :: XCB(2,2,2),YCB(2,2,2),ZCB(2,2,2), H(3,3,2)
722 integer :: nxl, nyl, nzl, ntot3
723 integer :: ix, iy, iz, ixt, iyt, izt, ie, ndim2
727 ntot3=nxl*nyl*nzl*nelt
740 h(ix,1,1)=0.5*float(3-ix)
741 h(ix,1,2)=0.5*float(ix-1)
744 h(iy,2,1)=0.5*float(3-iy)
745 h(iy,2,2)=0.5*float(iy-1)
748 h(iz,3,1)=0.5*float(3-iz)
749 h(iz,3,2)=0.5*float(iz-1)
761 xml = 0._dp; yml = 0._dp; zml = 0._dp
762 xcb = 0._dp; ycb = 0._dp; zcb = 0._dp
767 xcb = reshape(xc(indx(1:ndim2), ie), (/2,2,2/))
768 ycb = reshape(yc(indx(1:ndim2), ie), (/2,2,2/))
769 zcb = reshape(zc(indx(1:ndim2), ie), (/2,2,2/))
780 xml(ix,iy,iz,ie)=xml(ix,iy,iz,ie)+ &
781 h(ix,1,ixt)*h(iy,2,iyt)*h(iz,3,izt)*xcb(ixt,iyt,izt)
782 yml(ix,iy,iz,ie)=yml(ix,iy,iz,ie)+ &
783 h(ix,1,ixt)*h(iy,2,iyt)*h(iz,3,izt)*ycb(ixt,iyt,izt)
784 zml(ix,iy,iz,ie)=zml(ix,iy,iz,ie)+ &
785 h(ix,1,ixt)*h(iy,2,iyt)*h(iz,3,izt)*zcb(ixt,iyt,izt)
810 use size_m
, only : nelt, ndim
811 use input, only : if3d, xc, yc, zc
813 use topol, only : indx, icface
816 integer :: ie, j, ivtx, nfaces, ncrnr, icrn, ifac, icr1, ivt1, idim
817 integer,
external :: mod1
841 xyz(1,ivtx,ie) = xc(j,ie)
842 xyz(2,ivtx,ie) = yc(j,ie)
843 xyz(3,ivtx,ie) = zc(j,ie)
853 xyz(1,ivtx,ie) = xc(j,ie)
854 xyz(2,ivtx,ie) = yc(j,ie)
867 ivtx = icface(icrn,ifac)
868 icr1 = ncrnr+(icrn-1)
869 icr1 = mod1(icr1,ncrnr)
870 ivt1 = icface(icr1,ifac)
873 side(idim,ifac,ie)=side(idim,ifac,ie)+xyz(idim,ivtx,ie)
874 side( 4,ifac,ie)=side( 4,ifac,ie)+ &
875 ( xyz(idim,ivtx,ie)-xyz(idim,ivt1,ie) )**2
877 side(4,ifac,ie)=sqrt( side(4,ifac,ie) )
881 avwght=1.0/float(ncrnr)
893 use size_m
, only : nid, nelt
894 use input, only : if3d
900 real(DP) :: v1, v2, v3, v4, v5, v6, v7, v8
902 real(DP),
external :: volum0
905 IF ( .NOT. if3d)
THEN
906 write(*,*)
"Oops: not if3d"
912 c1=crss2d(xyz(1,2,ie),xyz(1,3,ie),xyz(1,1,ie))
913 c2=crss2d(xyz(1,4,ie),xyz(1,1,ie),xyz(1,2,ie))
914 c3=crss2d(xyz(1,1,ie),xyz(1,4,ie),xyz(1,3,ie))
915 c4=crss2d(xyz(1,3,ie),xyz(1,2,ie),xyz(1,4,ie))
917 IF (c1 <= 0.0 .OR. c2 <= 0.0 .OR. &
918 c3 <= 0.0 .OR. c4 <= 0.0 )
THEN
921 WRITE(6,800) ieg,c1,c2,c3,c4
923 800
FORMAT(/,2x,
'WARNINGa: Detected non-right-handed element.', &
924 /,2x,
'Number',i8,
' C1-4:',4e12.4)
937 v1= volum0(xyz(1,2,ie),xyz(1,3,ie),xyz(1,5,ie),xyz(1,1,ie))
938 v2= volum0(xyz(1,4,ie),xyz(1,1,ie),xyz(1,6,ie),xyz(1,2,ie))
939 v3= volum0(xyz(1,1,ie),xyz(1,4,ie),xyz(1,7,ie),xyz(1,3,ie))
940 v4= volum0(xyz(1,3,ie),xyz(1,2,ie),xyz(1,8,ie),xyz(1,4,ie))
941 v5=-volum0(xyz(1,6,ie),xyz(1,7,ie),xyz(1,1,ie),xyz(1,5,ie))
942 v6=-volum0(xyz(1,8,ie),xyz(1,5,ie),xyz(1,2,ie),xyz(1,6,ie))
943 v7=-volum0(xyz(1,5,ie),xyz(1,8,ie),xyz(1,3,ie),xyz(1,7,ie))
944 v8=-volum0(xyz(1,7,ie),xyz(1,6,ie),xyz(1,4,ie),xyz(1,8,ie))
946 IF (v1 <= 0.0 .OR. v2 <= 0.0 .OR. &
947 v3 <= 0.0 .OR. v4 <= 0.0 .OR. &
948 v5 <= 0.0 .OR. v6 <= 0.0 .OR. &
949 v7 <= 0.0 .OR. v8 <= 0.0 )
THEN
952 WRITE(6,1800) ieg,v1,v2,v3,v4,v5,v6,v7,v8
954 1800
FORMAT(/,2x,
'WARNINGb: Detected non-right-handed element.', &
955 /,2x,
'Number',i8,
' V1-8:',4e12.4 &
956 /,2x,
' ',4x,
' ',4e12.4)
964 IF ( .NOT. ifcstt)
WRITE(6,2001)
968 CALL
gllog(ifcstt, .false. )
970 IF ( .NOT. ifcstt)
THEN
971 IF (nid == 0)
WRITE(6,2003) nelgt
974 IF (nid == 0)
WRITE(6,2002) nelgt
977 2001
FORMAT(//,
' Elemental geometry not right-handed, ABORTING' &
978 ,
' in routine VERRHE.')
979 2002
FORMAT(
' Right-handed check complete for',i8,
' elements. OK.')
980 2003
FORMAT(
' Right-handed check failed for',i8,
' elements.' &
981 ,
' Exiting in routine VERRHE.')
994 REAL(DP) :: P1(3),P2(3),P3(3),P0(3)
995 real(DP) :: u1, u2, u3, v1, v2, v3, w1, w2, w3, cross1, cross2, cross3
1008 cross1 = u2*v3-u3*v2
1009 cross2 = u3*v1-u1*v3
1010 cross3 = u1*v2-u2*v1
1012 volum0 = w1*cross1 + w2*cross2 + w3*cross3
1019 subroutine facind (kx1,kx2,ky1,ky2,kz1,kz2,nx,ny,nz,iface)
1021 integer :: kx1, ky1, kz1, kx2, ky2, kz2, nx, ny, nz, iface
1029 IF (iface == 1) ky2=1
1030 IF (iface == 2) kx1=nx
1031 IF (iface == 3) ky1=ny
1032 IF (iface == 4) kx2=1
1033 IF (iface == 5) kz2=1
1034 IF (iface == 6) kz1=nz
1041 subroutine facev(a,ie,iface,val,nx,ny,nz)
1042 use kinds, only : dp
1043 use size_m
, only : lelt
1045 integer :: ie, iface, nx, ny, nz
1046 real(DP) :: a(nx,ny,nz,lelt), val
1048 integer :: kx1, ky1, kz1, kx2, ky2, kz2
1049 integer :: ix, iy, iz
1051 CALL
facind(kx1,kx2,ky1,ky2,kz1,kz2,nx,ny,nz,iface)
1060 end subroutine facev
subroutine verify
Verify right-handedness of elements. .Verify element-to-element reciprocity of BC's ...
subroutine verrhe()
Verify right-handedness of given elements. 8 Mar 1989 21:58:26 PFF.
subroutine dssum(u)
Direct stiffness sum.
subroutine initds
– Direct Stiffness Initialization Routine – Set up required data for packing data on faces of spect...
real(dp) function volum0(P1, P2, P3, P0)
Given four points in R , (P1,P2,P3,P0), VOLUM0 returns the volume enclosed by the parallelagram defin...
subroutine dsset(nx, ny, nz)
Set up arrays IXCN,ESKIP,SKPDAT,NEDG,NOFFST for new NX,NY,NZ.
Arrays for direct stiffness summation. cleaned.
integer function lglel(iel)
subroutine genxyzl()
Generate xyz coordinates.
subroutine setupds(gs_handle, nx, ny, nz, nel, melg, vertex, glo_num)
setup data structures for direct stiffness operations
subroutine setup_topo()
Parallel compatible routine to find connectivity of element structure. On Processor 0: ...
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 gllog(la, lb)
If ANY LA=LB, then ALL LA=LB.
subroutine facind(kx1, kx2, ky1, ky2, kz1, kz2, nx, ny, nz, iface)
ifcase in preprocessor notation
subroutine setedge()
Initialize EDGE arrays for face and edge specific tasks. .NOTE: Sevaral arrays in common are initiali...