| c----------------------------------------------------------------- |
| subroutine mortar |
| c----------------------------------------------------------------- |
| c generate mortar point index number |
| c----------------------------------------------------------------- |
| include 'header.h' |
| |
| integer count, iel, jface, ntemp, i, ii, jj, ntemp1, |
| & iii, jjj, face2, ne, ie, edge_g, ie2, |
| & mor_v(3), cb, cb1, cb2, cb3, cb4, cb5, cb6, |
| & space, sumcb, ij1, ij2, n1, n2, n3, n4, n5 |
| |
| |
| n1=lx1*lx1*6*4*nelt |
| call nr_init(idmo,n1,0) |
| |
| n2=8*nelt |
| call nr_init(nemo,n2,0) |
| call nr_init(vassign,n2,0) |
| |
| n3=2*64*nelt |
| call nr_init(emo,n3,0) |
| |
| n4=12*nelt |
| call l_init(if_1_edge,n4,.false.) |
| |
| n5=2*12*nelt |
| call nr_init(diagn,n5,0) |
| |
| c.....Mortar points indices are generated in two steps: first generate |
| c them for all element vertices (corner points), then for conforming |
| c edge and conforming face interiors. Each time a new mortar index |
| c is generated for a mortar point, it is broadcast to all elements |
| c sharing this mortar point. |
| |
| c.....VERTICES |
| count=0 |
| |
| c.....assign mortar point indices to element vertices |
| |
| do iel=1,nelt |
| |
| c.......first calculate how many new mortar indices will be generated for |
| c each element. |
| |
| c.......For each element, at least one vertex (vertex 8) will be new mortar |
| c point. All possible new mortar points will be on face 2,4 or 6. By |
| c checking the type of these three faces, we are able to tell |
| c how many new mortar vertex points will be generated in each element. |
| |
| cb=cbc(6,iel) |
| cb1=cbc(4,iel) |
| cb2=cbc(2,iel) |
| |
| c.......For different combinations of the type of these three faces, |
| c we group them into 27 configurations. |
| c For different face types we assign the following integers: |
| c 1 for type 2 or 3 |
| c 2 for type 0 |
| c 5 for type 1 |
| c By summing these integers for faces 2,4 and 6, sumcb will have |
| c 10 different numbers indicating 10 different combinations. |
| |
| sumcb=0 |
| if(cb.eq.2.or.cb.eq.3)then |
| sumcb=sumcb+1 |
| elseif(cb.eq.0)then |
| sumcb=sumcb+2 |
| elseif(cb.eq.1)then |
| sumcb=sumcb+5 |
| end if |
| if(cb1.eq.2.or.cb1.eq.3)then |
| sumcb=sumcb+1 |
| elseif(cb1.eq.0)then |
| sumcb=sumcb+2 |
| elseif(cb1.eq.1)then |
| sumcb=sumcb+5 |
| end if |
| if(cb2.eq.2.or.cb2.eq.3)then |
| sumcb=sumcb+1 |
| elseif(cb2.eq.0)then |
| sumcb=sumcb+2 |
| elseif(cb2.eq.1)then |
| sumcb=sumcb+5 |
| end if |
| |
| c.......compute newc(iel) |
| c newc(iel) records how many new mortar indices will be generated |
| c for element iel |
| c vassign(i,iel) records the element vertex of the i'th new mortar |
| c vertex point for element iel. e.g. vassign(2,iel)=8 means |
| c the 2nd new mortar vertex point generated on element |
| c iel is iel's 8th vertex. |
| |
| if(sumcb.eq.3)then |
| c.......the three face types for face 2,4, and 6 are 2 2 2 |
| newc(iel)=1 |
| vassign(1,iel)=8 |
| |
| elseif(sumcb.eq.4)then |
| c.......the three face types for face 2,4 and 6 are 2 2 0 (not |
| c necessarily in this order) |
| newc(iel)=2 |
| if(cb.eq.0)then |
| vassign(1,iel)=4 |
| elseif(cb1.eq.0)then |
| vassign(1,iel)=6 |
| elseif(cb2.eq.0)then |
| vassign(1,iel)=7 |
| end if |
| vassign(2,iel)=8 |
| |
| elseif(sumcb.eq.7)then |
| c.......the three face types for face 2,4 and 6 are 2 2 1 (not |
| c necessarily in this order) |
| if(cb.eq.1)then |
| ij1=ijel(1,6,iel) |
| ij2=ijel(2,6,iel) |
| if(ij1.eq.1.and.ij2.eq.1)then |
| newc(iel)=2 |
| vassign(1,iel)=4 |
| vassign(2,iel)=8 |
| elseif(ij1.eq.1.and.ij2.eq.2)then |
| ntemp=sje(1,1,6,iel) |
| if(cbc(1,ntemp).eq.3.and.sje(1,1,1,ntemp).lt.iel)then |
| newc(iel)=1 |
| vassign(1,iel)=8 |
| else |
| newc(iel)=2 |
| vassign(1,iel)=4 |
| vassign(2,iel)=8 |
| end if |
| elseif(ij1.eq.2.and.ij2.eq.1)then |
| ntemp=sje(1,1,6,iel) |
| if(cbc(3,ntemp).eq.3.and.sje(1,1,3,ntemp).lt.iel)then |
| newc(iel)=1 |
| vassign(1,iel)=8 |
| else |
| newc(iel)=2 |
| vassign(1,iel)=4 |
| vassign(2,iel)=8 |
| endif |
| else |
| newc(iel)=1 |
| vassign(1,iel)=8 |
| end if |
| elseif(cb1.eq.1)then |
| ij1=ijel(1,4,iel) |
| ij2=ijel(2,4,iel) |
| if(ij1.eq.1.and.ij2.eq.1)then |
| newc(iel)=2 |
| vassign(1,iel)=6 |
| vassign(2,iel)=8 |
| elseif(ij1.eq.1.and.ij2.eq.2)then |
| ntemp=sje(1,1,4,iel) |
| if(cbc(1,ntemp).eq.3.and.sje(1,1,1,ntemp).lt.iel)then |
| newc(iel)=1 |
| vassign(1,iel)=8 |
| else |
| newc(iel)=2 |
| vassign(1,iel)=6 |
| vassign(2,iel)=8 |
| endif |
| elseif(ij1.eq.2.and.ij2.eq.1)then |
| ntemp=sje(1,1,4,iel) |
| if(cbc(5,ntemp).eq.3.and.sje(1,1,5,ntemp).lt.iel)then |
| newc(iel)=1 |
| vassign(1,iel)=8 |
| else |
| newc(iel)=2 |
| vassign(1,iel)=6 |
| vassign(2,iel)=8 |
| endif |
| else |
| newc(iel)=1 |
| vassign(1,iel)=8 |
| end if |
| |
| elseif(cb2.eq.1)then |
| ij1=ijel(1,2,iel) |
| ij2=ijel(2,2,iel) |
| if(ij1.eq.1.and.ij2.eq.1)then |
| newc(iel)=2 |
| vassign(1,iel)=7 |
| vassign(2,iel)=8 |
| elseif(ij1.eq.1.and.ij2.eq.2)then |
| ntemp=sje(1,1,2,iel) |
| if(cbc(3,ntemp).eq.3.and.sje(1,1,3,ntemp).lt.iel)then |
| newc(iel)=1 |
| vassign(1,iel)=8 |
| else |
| newc(iel)=2 |
| vassign(1,iel)=7 |
| vassign(2,iel)=8 |
| end if |
| |
| elseif(ij1.eq.2.and.ij2.eq.1)then |
| ntemp=sje(1,1,2,iel) |
| if(cbc(5,ntemp).eq.3.and.sje(1,1,5,ntemp).lt.iel)then |
| newc(iel)=1 |
| vassign(1,iel)=8 |
| else |
| newc(iel)=2 |
| vassign(1,iel)=7 |
| vassign(2,iel)=8 |
| end if |
| else |
| newc(iel)=1 |
| vassign(1,iel)=8 |
| end if |
| end if |
| |
| elseif(sumcb.eq.5)then |
| c.......the three face types for face 2,4 and 6 are 2/3 0 0 (not |
| c necessarily in this order) |
| newc(iel)=4 |
| if(cb.eq.2.or.cb.eq.3)then |
| vassign(1,iel)=5 |
| vassign(2,iel)=6 |
| vassign(3,iel)=7 |
| vassign(4,iel)=8 |
| elseif(cb1.eq.2.or.cb1.eq.3)then |
| vassign(1,iel)=3 |
| vassign(2,iel)=4 |
| vassign(3,iel)=7 |
| vassign(4,iel)=8 |
| elseif(cb2.eq.2.or.cb2.eq.3)then |
| vassign(1,iel)=2 |
| vassign(2,iel)=4 |
| vassign(3,iel)=6 |
| vassign(4,iel)=8 |
| end if |
| |
| elseif(sumcb.eq.8)then |
| c.......the three face types for face 2,4 and 6 are 2 0 1 (not |
| c necessarily in this order) |
| |
| c.........if face 2 of type 1 |
| if(cb.eq.1)then |
| if(cb1.eq.2.or.cb1.eq.3)then |
| ij1=ijel(1,6,iel) |
| if(ij1.eq.1)then |
| newc(iel)=4 |
| vassign(1,iel)=3 |
| vassign(2,iel)=4 |
| vassign(3,iel)=7 |
| vassign(4,iel)=8 |
| else |
| ntemp=sje(1,1,6,iel) |
| if(cbc(3,ntemp).eq.3.and.sje(1,1,3,ntemp).lt.iel)then |
| newc(iel)=2 |
| vassign(1,iel)=7 |
| vassign(2,iel)=8 |
| else |
| newc(iel)=3 |
| vassign(1,iel)=4 |
| vassign(2,iel)=7 |
| vassign(3,iel)=8 |
| end if |
| end if |
| |
| elseif(cb2.eq.2.or.cb2.eq.3)then |
| if(ijel(2,6,iel).eq.1)then |
| newc(iel)=4 |
| vassign(1,iel)=2 |
| vassign(2,iel)=4 |
| vassign(3,iel)=6 |
| vassign(4,iel)=8 |
| else |
| ntemp=sje(1,1,6,iel) |
| if(cbc(1,ntemp).eq.3.and.sje(1,1,1,ntemp).lt.iel)then |
| newc(iel)=2 |
| vassign(1,iel)=6 |
| vassign(2,iel)=8 |
| else |
| newc(iel)=3 |
| vassign(1,iel)=4 |
| vassign(2,iel)=6 |
| vassign(3,iel)=8 |
| end if |
| end if |
| end if |
| |
| c.........if face 4 of type 1 |
| elseif(cb1.eq.1)then |
| if(cb.eq.2.or.cb.eq.3)then |
| ij1=ijel(1,4,iel) |
| ij2=ijel(2,4,iel) |
| |
| if(ij1.eq.1.and.ij2.eq.1)then |
| ntemp=sje(1,1,4,iel) |
| if(cbc(2,ntemp).eq.3.and.sje(1,1,2,ntemp).lt.iel)then |
| newc(iel)=3 |
| vassign(1,iel)=6 |
| vassign(2,iel)=7 |
| vassign(3,iel)=8 |
| else |
| newc(iel)=4 |
| vassign(1,iel)=5 |
| vassign(2,iel)=6 |
| vassign(3,iel)=7 |
| vassign(4,iel)=8 |
| end if |
| elseif(ij1.eq.1.and.ij2.eq.2)then |
| ntemp=sje(1,1,4,iel) |
| if(cbc(1,ntemp).eq.3.and.sje(1,1,1,ntemp).lt.iel)then |
| newc(iel)=3 |
| vassign(1,iel)=5 |
| vassign(2,iel)=7 |
| vassign(3,iel)=8 |
| else |
| newc(iel)=4 |
| vassign(1,iel)=5 |
| vassign(2,iel)=6 |
| vassign(3,iel)=7 |
| vassign(4,iel)=8 |
| end if |
| elseif(ij1.eq.2.and.ij2.eq.1)then |
| ntemp=sje(1,1,4,iel) |
| if(cbc(5,ntemp).eq.3.and.sje(1,1,5,ntemp).lt.iel)then |
| newc(iel)=2 |
| vassign(1,iel)=7 |
| vassign(2,iel)=8 |
| else |
| newc(iel)=3 |
| vassign(1,iel)=6 |
| vassign(2,iel)=7 |
| vassign(3,iel)=8 |
| end if |
| elseif(ij1.eq.2.and.ij2.eq.2)then |
| ntemp=sje(1,1,4,iel) |
| if(cbc(5,ntemp).eq.3.and.sje(1,1,5,ntemp).lt.iel)then |
| newc(iel)=2 |
| vassign(1,iel)=7 |
| vassign(2,iel)=8 |
| else |
| newc(iel)=3 |
| vassign(1,iel)=5 |
| vassign(2,iel)=7 |
| vassign(3,iel)=8 |
| end if |
| end if |
| else |
| if(ijel(2,4,iel).eq.1)then |
| newc(iel)=4 |
| vassign(1,iel)=2 |
| vassign(2,iel)=4 |
| vassign(3,iel)=6 |
| vassign(4,iel)=8 |
| else |
| ntemp=sje(1,1,4,iel) |
| if(cbc(1,ntemp).eq.3.and.sje(1,1,1,ntemp).lt.iel)then |
| newc(iel)=2 |
| vassign(1,iel)=4 |
| vassign(2,iel)=8 |
| else |
| newc(iel)=3 |
| vassign(1,iel)=4 |
| vassign(2,iel)=6 |
| vassign(3,iel)=8 |
| end if |
| end if |
| endif |
| c.........if face 6 of type 1 |
| elseif(cb2.eq.1)then |
| if(cb.eq.2.or.cb.eq.3)then |
| if(ijel(1,2,iel).eq.1)then |
| newc(iel)=4 |
| vassign(1,iel)=5 |
| vassign(2,iel)=6 |
| vassign(3,iel)=7 |
| vassign(4,iel)=8 |
| else |
| ntemp=sje(1,1,2,iel) |
| if(cbc(5,ntemp).eq.3.and.sje(1,1,5,ntemp).lt.iel)then |
| newc(iel)=2 |
| vassign(1,iel)=6 |
| vassign(2,iel)=8 |
| else |
| newc(iel)=3 |
| vassign(1,iel)=6 |
| vassign(2,iel)=7 |
| vassign(3,iel)=8 |
| end if |
| end if |
| else |
| if(ijel(2,2,iel).eq.1)then |
| newc(iel)=4 |
| vassign(1,iel)=3 |
| vassign(2,iel)=4 |
| vassign(3,iel)=7 |
| vassign(4,iel)=8 |
| else |
| ntemp=sje(1,1,2,iel) |
| if(cbc(3,ntemp).eq.3.and.sje(1,1,3,ntemp).lt.iel)then |
| newc(iel)=2 |
| vassign(1,iel)=4 |
| vassign(2,iel)=8 |
| else |
| newc(iel)=3 |
| vassign(1,iel)=4 |
| vassign(2,iel)=7 |
| vassign(3,iel)=8 |
| end if |
| end if |
| end if |
| end if |
| |
| elseif(sumcb.eq.11)then |
| c.......the three face type for face 2,4 and 6 are 2 1 1(not |
| c necessarily in this order) |
| if(cb.eq.2.or.cb.eq.3)then |
| if(ijel(1,4,iel).eq.1)then |
| ntemp=sje(1,1,4,iel) |
| if(cbc(2,ntemp).eq.3.and.sje(1,1,2,ntemp).lt.iel)then |
| newc(iel)=3 |
| vassign(1,iel)=6 |
| vassign(2,iel)=7 |
| vassign(3,iel)=8 |
| else |
| newc(iel)=4 |
| vassign(1,iel)=5 |
| vassign(2,iel)=6 |
| vassign(3,iel)=7 |
| vassign(4,iel)=8 |
| end if |
| |
| c...........if ijel(1,4,iel)=2 |
| else |
| ntemp=sje(1,1,2,iel) |
| if(cbc(5,ntemp).eq.3.and.sje(1,1,5,ntemp).lt.iel)then |
| ntemp1=sje(1,1,4,iel) |
| if(cbc(5,ntemp1).eq.3.and. |
| & sje(1,1,5,ntemp1).lt.iel)then |
| newc(iel)=1 |
| vassign(1,iel)=8 |
| else |
| newc(iel)=2 |
| vassign(1,iel)=6 |
| vassign(2,iel)=8 |
| end if |
| else |
| ntemp1=sje(1,1,4,iel) |
| if(cbc(5,ntemp1).eq.3.and. |
| & sje(1,1,5,ntemp1).lt.iel)then |
| newc(iel)=2 |
| vassign(1,iel)=7 |
| vassign(2,iel)=8 |
| else |
| newc(iel)=3 |
| vassign(1,iel)=6 |
| vassign(2,iel)=7 |
| vassign(3,iel)=8 |
| end if |
| end if |
| end if |
| elseif(cb1.eq.2.or.cb1.eq.3)then |
| if(ijel(2,2,iel).eq.1)then |
| ntemp=sje(1,1,2,iel) |
| if(cbc(6,ntemp).eq.3.and.sje(1,1,6,ntemp).lt.iel)then |
| newc(iel)=3 |
| vassign(1,iel)=4 |
| vassign(2,iel)=7 |
| vassign(3,iel)=8 |
| else |
| newc(iel)=4 |
| vassign(1,iel)=3 |
| vassign(2,iel)=4 |
| vassign(3,iel)=7 |
| vassign(4,iel)=8 |
| end if |
| c...........if ijel(2,2,iel)=2 |
| else |
| ntemp=sje(1,1,2,iel) |
| if(cbc(3,ntemp).eq.3.and.sje(1,1,3,ntemp).lt.iel)then |
| ntemp1=sje(1,1,6,iel) |
| if(cbc(3,ntemp1).eq.3.and. |
| & sje(1,1,3,ntemp1).lt.iel)then |
| newc(iel)=1 |
| vassign(1,iel)=8 |
| else |
| newc(iel)=2 |
| vassign(1,iel)=4 |
| vassign(2,iel)=8 |
| end if |
| else |
| ntemp1=sje(1,1,6,iel) |
| if(cbc(3,ntemp1).eq.3.and. |
| & sje(1,1,3,ntemp1).lt.iel)then |
| newc(iel)=2 |
| vassign(1,iel)=7 |
| vassign(2,iel)=8 |
| else |
| newc(iel)=3 |
| vassign(1,iel)=4 |
| vassign(2,iel)=7 |
| vassign(3,iel)=8 |
| end if |
| end if |
| end if |
| elseif(cb2.eq.2.or.cb2.eq.3)then |
| if(ijel(2,6,iel).eq.1)then |
| ntemp=sje(1,1,4,iel) |
| if(cbc(6,ntemp).eq.3.and.sje(1,1,6,ntemp).lt.iel)then |
| newc(iel)=3 |
| vassign(1,iel)=4 |
| vassign(2,iel)=6 |
| vassign(3,iel)=8 |
| else |
| newc(iel)=4 |
| vassign(1,iel)=2 |
| vassign(2,iel)=4 |
| vassign(3,iel)=6 |
| vassign(4,iel)=8 |
| end if |
| c...........if ijel(2,6,iel)=2 |
| else |
| ntemp=sje(1,1,4,iel) |
| if(cbc(1,ntemp).eq.3.and.sje(1,1,1,ntemp).lt.iel)then |
| ntemp1=sje(1,1,6,iel) |
| if(cbc(1,ntemp1).eq.3.and. |
| & sje(1,1,1,ntemp1).lt.iel)then |
| newc(iel)=1 |
| vassign(1,iel)=8 |
| else |
| newc(iel)=2 |
| vassign(1,iel)=4 |
| vassign(2,iel)=8 |
| end if |
| else |
| ntemp1=sje(1,1,6,iel) |
| if(cbc(1,ntemp1).eq.3.and. |
| & sje(1,1,1,ntemp1).lt.iel)then |
| newc(iel)=2 |
| vassign(1,iel)=6 |
| vassign(2,iel)=8 |
| else |
| newc(iel)=3 |
| vassign(1,iel)=4 |
| vassign(2,iel)=6 |
| vassign(3,iel)=8 |
| end if |
| end if |
| end if |
| |
| end if |
| |
| elseif(sumcb.eq.6)then |
| c.......the three face type for face 2,4 and 6 are 0 0 0(not |
| c necessarily in this order) |
| newc(iel)=8 |
| vassign(1,iel)=1 |
| vassign(2,iel)=2 |
| vassign(3,iel)=3 |
| vassign(4,iel)=4 |
| vassign(5,iel)=5 |
| vassign(6,iel)=6 |
| vassign(7,iel)=7 |
| vassign(8,iel)=8 |
| |
| elseif(sumcb.eq.9)then |
| c.......the three face type for face 2,4 and 6 are 0 0 1(not |
| c necessarily in this order) |
| newc(iel)=7 |
| vassign(1,iel)=2 |
| vassign(2,iel)=3 |
| vassign(3,iel)=4 |
| vassign(4,iel)=5 |
| vassign(5,iel)=6 |
| vassign(6,iel)=7 |
| vassign(7,iel)=8 |
| |
| elseif(sumcb.eq.12)then |
| c.......the three face type for face 2,4 and 6 are 0 1 1(not |
| c necessarily in this order) |
| if(cb.eq.0)then |
| ntemp=sje(1,1,2,iel) |
| if(cbc(4,ntemp).eq.3.and.sje(1,1,4,ntemp).lt.iel)then |
| newc(iel)=6 |
| vassign(1,iel)=2 |
| vassign(2,iel)=3 |
| vassign(3,iel)=4 |
| vassign(4,iel)=6 |
| vassign(5,iel)=7 |
| vassign(6,iel)=8 |
| else |
| newc(iel)=7 |
| vassign(1,iel)=2 |
| vassign(2,iel)=3 |
| vassign(3,iel)=4 |
| vassign(4,iel)=5 |
| vassign(5,iel)=6 |
| vassign(6,iel)=7 |
| vassign(7,iel)=8 |
| end if |
| elseif(cb1.eq.0)then |
| newc(iel)=7 |
| vassign(1,iel)=2 |
| vassign(2,iel)=3 |
| vassign(3,iel)=4 |
| vassign(4,iel)=5 |
| vassign(5,iel)=6 |
| vassign(6,iel)=7 |
| vassign(7,iel)=8 |
| elseif(cb2.eq.0)then |
| ntemp=sje(1,1,4,iel) |
| if(cbc(6,ntemp).eq.3.and.sje(1,1,6,ntemp).lt.iel)then |
| newc(iel)=6 |
| vassign(1,iel)=3 |
| vassign(2,iel)=4 |
| vassign(3,iel)=5 |
| vassign(4,iel)=6 |
| vassign(5,iel)=7 |
| vassign(6,iel)=8 |
| else |
| newc(iel)=7 |
| vassign(1,iel)=2 |
| vassign(2,iel)=3 |
| vassign(3,iel)=4 |
| vassign(4,iel)=5 |
| vassign(5,iel)=6 |
| vassign(6,iel)=7 |
| vassign(7,iel)=8 |
| end if |
| end if |
| |
| elseif(sumcb.eq.15)then |
| c.......the three face type for face 2,4 and 6 are 1 1 1(not |
| c necessarily in this order) |
| ntemp=sje(1,1,4,iel) |
| ntemp1=sje(1,1,2,iel) |
| if(cbc(6,ntemp).eq.3.and.sje(1,1,6,ntemp).lt.iel)then |
| if(cbc(2,ntemp).eq.3.and.sje(1,1,2,ntemp).lt.iel)then |
| if(cbc(6,ntemp1).eq.3.and.sje(1,1,6,ntemp1).lt.iel)then |
| newc(iel)=4 |
| vassign(1,iel)=4 |
| vassign(2,iel)=6 |
| vassign(3,iel)=7 |
| vassign(4,iel)=8 |
| else |
| newc(iel)=5 |
| vassign(1,iel)=3 |
| vassign(2,iel)=4 |
| vassign(3,iel)=6 |
| vassign(4,iel)=7 |
| vassign(5,iel)=8 |
| end if |
| else |
| if(cbc(6,ntemp1).eq.3.and.sje(1,1,6,ntemp1).lt.iel)then |
| newc(iel)=5 |
| vassign(1,iel)=4 |
| vassign(2,iel)=5 |
| vassign(3,iel)=6 |
| vassign(4,iel)=7 |
| vassign(5,iel)=8 |
| else |
| newc(iel)=6 |
| vassign(1,iel)=3 |
| vassign(2,iel)=4 |
| vassign(3,iel)=5 |
| vassign(4,iel)=6 |
| vassign(5,iel)=7 |
| vassign(6,iel)=8 |
| end if |
| end if |
| else |
| if(cbc(2,ntemp).eq.3.and.sje(1,1,2,ntemp).lt.iel)then |
| if(cbc(6,ntemp1).eq.3.and.sje(1,1,6,ntemp1).lt.iel)then |
| newc(iel)=5 |
| vassign(1,iel)=2 |
| vassign(2,iel)=4 |
| vassign(3,iel)=6 |
| vassign(4,iel)=7 |
| vassign(5,iel)=8 |
| else |
| newc(iel)=6 |
| vassign(1,iel)=2 |
| vassign(2,iel)=3 |
| vassign(3,iel)=4 |
| vassign(4,iel)=6 |
| vassign(5,iel)=7 |
| vassign(6,iel)=8 |
| end if |
| else |
| if(cbc(6,ntemp1).eq.3.and.sje(1,1,6,ntemp1).lt.iel)then |
| newc(iel)=6 |
| vassign(1,iel)=2 |
| vassign(2,iel)=4 |
| vassign(3,iel)=5 |
| vassign(4,iel)=6 |
| vassign(5,iel)=7 |
| vassign(6,iel)=8 |
| |
| else |
| newc(iel)=7 |
| vassign(1,iel)=2 |
| vassign(2,iel)=3 |
| vassign(3,iel)=4 |
| vassign(4,iel)=5 |
| vassign(5,iel)=6 |
| vassign(6,iel)=7 |
| vassign(7,iel)=8 |
| end if |
| end if |
| end if |
| end if |
| end do |
| |
| c.....end computing how many new mortar vertex points will be generated |
| c on each element. |
| |
| c.....Compute (potentially in parallel) front(iel), which records how many |
| c new mortar point indices are to be generated from element 1 to iel. |
| c front(iel)=newc(1)+newc(2)+...+newc(iel) |
| |
| call ncopy(front,newc,nelt) |
| |
| call parallel_add(front) |
| |
| c.....On each element, generate new mortar point indices and assign them |
| c to all elements sharing this mortar point. Note, if a mortar point |
| c is shared by several elements, the mortar point index of it will only |
| c be generated on the element with the lowest element index. |
| |
| do iel=1,nelt |
| |
| c.......compute the starting vertex mortar point index in element iel |
| front(iel)=front(iel)-newc(iel) |
| |
| do i=1,newc(iel) |
| c.........count is the new mortar index number, which will be assigned |
| c to a vertex of iel and broadcast to all other elements sharing |
| c this vertex point. |
| count=front(iel)+i |
| call mortar_vertex(vassign(i,iel),iel,count) |
| end do |
| end do |
| |
| c.....nvertex records how many mortar indices are for element vertices. |
| c It is used in the computation of the preconditioner. |
| nvertex=count |
| |
| c.....CONFORMING EDGE AND FACE INTERIOR |
| |
| c.....find out how many new mortar point indices will be assigned to all |
| c.....conforming edges and all conforming face interiors on each element |
| |
| |
| c.....eassign(i,iel)=.true. indicates that the i'th edge on iel will |
| c generate new mortar points. |
| c ncon_edge(i,iel)=.true. indicates that the i'th edge on iel is |
| c nonconforming |
| |
| n1=12*nelt |
| call l_init(ncon_edge,n1,.false.) |
| call l_init(eassign,n1,.false.) |
| |
| c.....fassign(i,iel)=.true. indicates that the i'th face of iel will |
| c generate new mortar points |
| n2=6*nelt |
| call l_init(fassign,n2,.false.) |
| |
| c.....newe records how many new edges are to be assigned |
| c diagn(1,n,iel) records the element index of neighbor element of iel, |
| c that shares edge n of iel |
| c diagn(2,n,iel) records the neighbor element diagn(1,n,iel) shares which |
| c part of edge n of iel. diagn(2,n,iel)=1 refers to left |
| c or bottom half of the edge n, diagn(2,n,iel)=2 refers |
| c to the right or top part of edge n. |
| c if_1_edge(n,iel)=.true. indicates that the size of iel is smaller than |
| c that of its neighbor connected, neighbored by edge n only |
| |
| |
| do iel=1,nelt |
| newc(iel)=0 |
| newe(iel)=0 |
| newi(iel)=0 |
| cb1=cbc(1,iel) |
| cb2=cbc(2,iel) |
| cb3=cbc(3,iel) |
| cb4=cbc(4,iel) |
| cb5=cbc(5,iel) |
| cb6=cbc(6,iel) |
| |
| c.......on face 6 |
| |
| if(cb6.eq.0)then |
| if(cb4.eq.0.or.cb4.eq.1)then |
| c...........if face 6 is of type 0 and face 4 is of type 0 or type 1, the edge |
| c shared by face 4 and 6 (edge 11) will generate new mortar point |
| c indices. |
| newe(iel)=newe(iel)+1 |
| eassign(11,iel)=.true. |
| end if |
| if(cb1.ne.3)then |
| c...........if face 1 is of type 3, the edge shared by face 6 and 1 (edge 1) |
| c will generate new mortar points indices. |
| newe(iel)=newe(iel)+1 |
| eassign(1,iel)=.true. |
| end if |
| if(cb3.ne.3)then |
| newe(iel)=newe(iel)+1 |
| eassign(9,iel)=.true. |
| end if |
| if(cb2.eq.0.or.cb2.eq.1)then |
| newe(iel)=newe(iel)+1 |
| eassign(5,iel)=.true. |
| end if |
| elseif(cb6.eq.1)then |
| if(cb4.eq.0)then |
| newe(iel)=newe(iel)+1 |
| eassign(11,iel)=.true. |
| elseif(cb4.eq.1)then |
| |
| c...........If face 6 and face 4 both are of type 1, ntemp is the neighbor |
| c element on face 4. |
| ntemp=sje(1,1,4,iel) |
| |
| c...........if ntemp's face 6 is not noncoforming or the neighbor element |
| c of ntemp on face 6 has an element index larger than iel, the |
| c edge shared by face 6 and 4 (edge 11) will generate new mortar |
| c point indices. |
| if(cbc(6,ntemp).ne.3.or.sje(1,1,6,ntemp).gt.iel)then |
| |
| newe(iel)=newe(iel)+1 |
| eassign(11,iel)=.true. |
| c.............if the face 6 of ntemp is of type 2 |
| if(cbc(6,ntemp).eq.2)then |
| c...............The neighbor element of iel, neighbored by edge 11, is |
| c sje(1,1,6,ntemp) (the neighbor element of ntemp on ntemp's |
| c face 6). |
| diagn(1,11,iel)=sje(1,1,6,ntemp) |
| c...............The neighbor element of iel, neighbored by edge 11 shares |
| c the ijel(2,6,iel) part of edge 11 of iel |
| diagn(2,11,iel)=ijel(2,6,iel) |
| c...............edge 10 of element sje(1,1,6,ntemp) (the neighbor element of |
| c ntemp on ntemp's face 6) is a nonconforming edge |
| ncon_edge(10,sje(1,1,6,ntemp))=.true. |
| c...............if_1_edge(n,iel)=.true. indicates that iel is of a smaller |
| c size than its neighbor element, neighbored by edge n of iel only. |
| if_1_edge(11,iel)=.true. |
| endif |
| if(cbc(6,ntemp).eq.3.and. |
| & sje(1,1,6,ntemp).gt.iel)then |
| diagn(1,11,iel)=sje(2,ijel(2,6,iel),6,ntemp) |
| endif |
| end if |
| endif |
| |
| if(cb1.eq.0)then |
| newe(iel)=newe(iel)+1 |
| eassign(1,iel)=.true. |
| elseif(cb1.eq.1)then |
| ntemp=sje(1,1,1,iel) |
| if(cbc(6,ntemp).ne.3.or.sje(1,1,6,ntemp).gt.iel)then |
| newe(iel)=newe(iel)+1 |
| eassign(1,iel)=.true. |
| if(cbc(6,ntemp).eq.2)then |
| diagn(1,1,iel)=sje(1,1,6,ntemp) |
| diagn(2,1,iel)=ijel(1,6,iel) |
| ncon_edge(7,sje(1,1,6,ntemp))=.true. |
| if_1_edge(1,iel)=.true. |
| endif |
| if(cbc(6,ntemp).eq.3.and. |
| & sje(1,1,6,ntemp).gt.iel)then |
| diagn(1,1,iel)=sje(ijel(1,6,iel),1,6,ntemp) |
| endif |
| end if |
| elseif(cb1.eq.2)then |
| if(ijel(2,6,iel).eq.2)then |
| ntemp=sje(1,1,1,iel) |
| if(cbc(6,ntemp).eq.1)then |
| newe(iel)=newe(iel)+1 |
| eassign(1,iel)=.true. |
| c.............if cbc(6,ntemp)=2 |
| else |
| if(sje(1,1,6,ntemp).gt.iel)then |
| newe(iel)=newe(iel)+1 |
| eassign(1,iel)=.true. |
| diagn(1,1,iel)=sje(1,1,6,ntemp) |
| end if |
| end if |
| else |
| newe(iel)=newe(iel)+1 |
| eassign(1,iel)=.true. |
| end if |
| end if |
| |
| if(cb3.eq.0)then |
| newe(iel)=newe(iel)+1 |
| eassign(9,iel)=.true. |
| elseif(cb3.eq.1)then |
| ntemp=sje(1,1,3,iel) |
| if(cbc(6,ntemp).ne.3.or.sje(1,1,6,ntemp).gt.iel)then |
| newe(iel)=newe(iel)+1 |
| eassign(9,iel)=.true. |
| if(cbc(6,ntemp).eq.2)then |
| diagn(1,9,iel)=sje(1,1,6,ntemp) |
| diagn(2,9,iel)=ijel(2,6,iel) |
| ncon_edge(12,sje(1,1,6,ntemp))=.true. |
| if_1_edge(9,iel)=.true. |
| endif |
| if(cbc(6,ntemp).eq.3.and. |
| & sje(1,1,6,ntemp).gt.iel)then |
| diagn(1,9,iel)=sje(2,ijel(2,6,iel),6,ntemp) |
| endif |
| end if |
| elseif(cb3.eq.2)then |
| if(ijel(1,6,iel).eq.2)then |
| ntemp=sje(1,1,3,iel) |
| if(cbc(6,ntemp).eq.1)then |
| newe(iel)=newe(iel)+1 |
| eassign(9,iel)=.true. |
| c.............if cbc(6,ntemp)=2 |
| else |
| if(sje(1,1,6,ntemp).gt.iel)then |
| newe(iel)=newe(iel)+1 |
| eassign(9,iel)=.true. |
| diagn(1,9,iel)=sje(1,1,6,ntemp) |
| end if |
| end if |
| else |
| newe(iel)=newe(iel)+1 |
| eassign(9,iel)=.true. |
| end if |
| end if |
| |
| if(cb2.eq.0)then |
| newe(iel)=newe(iel)+1 |
| eassign(5,iel)=.true. |
| elseif(cb2.eq.1)then |
| ntemp=sje(1,1,2,iel) |
| if(cbc(6,ntemp).ne.3.or.sje(1,1,6,ntemp).gt.iel)then |
| newe(iel)=newe(iel)+1 |
| eassign(5,iel)=.true. |
| if(cbc(6,ntemp).eq.2)then |
| diagn(1,5,iel)=sje(1,1,6,ntemp) |
| diagn(2,5,iel)=ijel(1,6,iel) |
| ncon_edge(3,sje(1,1,6,ntemp))=.true. |
| if_1_edge(5,iel)=.true. |
| endif |
| if(cbc(6,ntemp).eq.3.and. |
| & sje(1,1,6,ntemp).gt.iel)then |
| diagn(1,9,iel)=sje(2,ijel(2,6,iel),6,ntemp) |
| endif |
| endif |
| end if |
| end if |
| |
| c.......one face 4 |
| if(cb4.eq.0)then |
| if(cb1.ne.3)then |
| newe(iel)=newe(iel)+1 |
| eassign(4,iel)=.true. |
| endif |
| if(cb5.ne.3)then |
| newe(iel)=newe(iel)+1 |
| eassign(12,iel)=.true. |
| endif |
| if(cb2.eq.0.or.cb2.eq.1)then |
| newe(iel)=newe(iel)+1 |
| eassign(8,iel)=.true. |
| end if |
| |
| elseif(cb4.eq.1)then |
| if(cb1.eq.2)then |
| if(ijel(2,4,iel).eq.1)then |
| newe(iel)=newe(iel)+1 |
| eassign(4,iel)=.true. |
| else |
| ntemp=sje(1,1,4,iel) |
| if(cbc(1,ntemp).ne.3.or.sje(1,1,1,ntemp).gt.iel)then |
| newe(iel)=newe(iel)+1 |
| eassign(4,iel)=.true. |
| if(cbc(1,ntemp).eq.3.and. |
| & sje(1,1,1,ntemp).gt.iel)then |
| diagn(1,4,iel)=sje(ijel(1,4,iel),2,1,ntemp) |
| endif |
| endif |
| end if |
| elseif(cb1.eq.0)then |
| newe(iel)=newe(iel)+1 |
| eassign(4,iel)=.true. |
| elseif(cb1.eq.1)then |
| ntemp=sje(1,1,4,iel) |
| if(cbc(1,ntemp).ne.3.or.sje(1,1,1,ntemp).gt.iel)then |
| newe(iel)=newe(iel)+1 |
| eassign(4,iel)=.true. |
| if(cbc(1,ntemp).eq.2)then |
| diagn(1,4,iel)=sje(1,1,1,ntemp) |
| diagn(2,4,iel)=ijel(1,4,iel) |
| ncon_edge(6,sje(1,1,1,ntemp))=.true. |
| if_1_edge(4,iel)=.true. |
| endif |
| if(cbc(1,ntemp).eq.3.and. |
| & sje(1,1,1,ntemp).gt.iel)then |
| diagn(1,4,iel)=sje(ijel(1,4,iel),2,1,ntemp) |
| endif |
| end if |
| end if |
| if(cb5.eq.2)then |
| if(ijel(1,4,iel).eq.1)then |
| newe(iel)=newe(iel)+1 |
| eassign(12,iel)=.true. |
| else |
| ntemp=sje(1,1,4,iel) |
| if(cbc(5,ntemp).ne.3.or.sje(1,1,5,ntemp).gt.iel)then |
| newe(iel)=newe(iel)+1 |
| eassign(12,iel)=.true. |
| if(cbc(5,ntemp).eq.3.and. |
| & sje(1,1,5,ntemp).gt.iel)then |
| diagn(1,12,iel)=sje(2,ijel(2,4,iel),5,ntemp) |
| endif |
| endif |
| end if |
| elseif(cb5.eq.0)then |
| newe(iel)=newe(iel)+1 |
| eassign(12,iel)=.true. |
| elseif(cb5.eq.1)then |
| ntemp=sje(1,1,4,iel) |
| if(cbc(5,ntemp).ne.3.or.sje(1,1,5,ntemp).gt.iel)then |
| newe(iel)=newe(iel)+1 |
| eassign(12,iel)=.true. |
| if(cbc(5,ntemp).eq.2)then |
| diagn(1,12,iel)=sje(1,1,5,ntemp) |
| diagn(2,12,iel)=ijel(2,4,iel) |
| ncon_edge(9,sje(1,1,5,ntemp))=.true. |
| if_1_edge(12,iel)=.true. |
| endif |
| if(cbc(5,ntemp).eq.3.and. |
| & sje(1,1,5,ntemp).gt.iel)then |
| diagn(1,12,iel)=sje(2,ijel(2,4,iel),5,ntemp) |
| endif |
| end if |
| end if |
| if(cb2.eq.0)then |
| newe(iel)=newe(iel)+1 |
| eassign(8,iel)=.true. |
| elseif(cb2.eq.1)then |
| ntemp=sje(1,1,4,iel) |
| if(cbc(2,ntemp).ne.3.or.sje(1,1,2,ntemp).gt.iel)then |
| newe(iel)=newe(iel)+1 |
| eassign(8,iel)=.true. |
| if(cbc(2,ntemp).eq.2)then |
| diagn(1,8,iel)=sje(1,1,2,ntemp) |
| diagn(2,8,iel)=ijel(1,4,iel) |
| ncon_edge(2,sje(1,1,2,ntemp))=.true. |
| if_1_edge(8,iel)=.true. |
| endif |
| if(cbc(2,ntemp).eq.3.and. |
| & sje(1,1,2,ntemp).gt.iel)then |
| diagn(1,8,iel)=sje(ijel(1,4,iel),2,3,ntemp) |
| endif |
| endif |
| end if |
| end if |
| |
| c.......on face 2 |
| if(cb2.eq.0)then |
| if(cb3.ne.3)then |
| newe(iel)=newe(iel)+1 |
| eassign(6,iel)=.true. |
| endif |
| if(cb5.ne.3)then |
| newe(iel)=newe(iel)+1 |
| eassign(7,iel)=.true. |
| endif |
| elseif(cb2.eq.1)then |
| if(cb3.eq.2)then |
| if(ijel(2,2,iel).eq.1)then |
| newe(iel)=newe(iel)+1 |
| eassign(6,iel)=.true. |
| else |
| ntemp=sje(1,1,2,iel) |
| if(cbc(3,ntemp).ne.3.or. |
| & sje(1,1,3,ntemp).gt.iel)then |
| newe(iel)=newe(iel)+1 |
| eassign(6,iel)=.true. |
| if(cbc(3,ntemp).eq.3.and. |
| & sje(1,1,3,ntemp).gt.iel)then |
| diagn(1,6,iel)=sje(ijel(1,2,iel),2,3,ntemp) |
| endif |
| endif |
| endif |
| elseif(cb3.eq.0)then |
| newe(iel)=newe(iel)+1 |
| eassign(6,iel)=.true. |
| elseif(cb3.eq.1)then |
| ntemp=sje(1,1,2,iel) |
| if(cbc(3,ntemp).ne.3.or.sje(1,1,3,ntemp).gt.iel)then |
| newe(iel)=newe(iel)+1 |
| eassign(6,iel)=.true. |
| if(cbc(3,ntemp).eq.2)then |
| diagn(1,6,iel)=sje(1,1,3,ntemp) |
| diagn(2,6,iel)=ijel(1,2,iel) |
| ncon_edge(4,sje(1,1,3,ntemp))=.true. |
| if_1_edge(6,iel)=.true. |
| endif |
| if(cbc(3,ntemp).eq.3.and. |
| & sje(1,1,3,ntemp).gt.iel)then |
| diagn(1,6,iel)=sje(ijel(1,4,iel),2,3,ntemp) |
| endif |
| endif |
| endif |
| if(cb5.eq.2)then |
| if(ijel(1,2,iel).eq.1)then |
| newe(iel)=newe(iel)+1 |
| eassign(7,iel)=.true. |
| else |
| ntemp=sje(1,1,2,iel) |
| if(cbc(5,ntemp).ne.3.or.sje(1,1,5,ntemp).gt.iel)then |
| newe(iel)=newe(iel)+1 |
| eassign(7,iel)=.true. |
| if(cbc(5,ntemp).eq.3.and. |
| & sje(1,1,5,ntemp).gt.iel)then |
| diagn(1,7,iel)=sje(ijel(2,2,iel),2,5,ntemp) |
| endif |
| endif |
| endif |
| elseif(cb5.eq.0)then |
| newe(iel)=newe(iel)+1 |
| eassign(7,iel)=.true. |
| elseif(cb5.eq.1)then |
| ntemp=sje(1,1,2,iel) |
| if(cbc(5,ntemp).ne.3.or.sje(1,1,5,ntemp).gt.iel)then |
| newe(iel)=newe(iel)+1 |
| eassign(7,iel)=.true. |
| if(cbc(5,ntemp).eq.2)then |
| diagn(1,7,iel)=sje(1,1,5,ntemp) |
| diagn(2,7,iel)=ijel(2,2,iel) |
| ncon_edge(1,sje(1,1,5,ntemp))=.true. |
| if_1_edge(7,iel)=.true. |
| endif |
| if(cbc(5,ntemp).eq.3.and. |
| & sje(1,1,5,ntemp).gt.iel)then |
| diagn(1,7,iel)=sje(2,ijel(2,4,iel),5,ntemp) |
| endif |
| endif |
| endif |
| end if |
| |
| c.......on face 1 |
| if(cb1.eq.1)then |
| newe(iel)=newe(iel)+2 |
| eassign(2,iel)=.true. |
| if(cb3.eq.1)then |
| ntemp=sje(1,1,1,iel) |
| if(cbc(3,ntemp).eq.2)then |
| diagn(1,2,iel)=sje(1,1,3,ntemp) |
| diagn(2,2,iel)=ijel(1,1,iel) |
| ncon_edge(8,sje(1,1,3,ntemp))=.true. |
| if_1_edge(2,iel)=.true. |
| elseif(cbc(3,ntemp).eq.3)then |
| diagn(1,2,iel)=sje(ijel(1,1,iel),1,3,ntemp) |
| endif |
| elseif(cb3.eq.2)then |
| ntemp=sje(1,1,3,iel) |
| if(ijel(2,1,iel).eq.2)then |
| if(cbc(1,ntemp).eq.2)then |
| diagn(1,2,iel)=sje(1,1,1,ntemp) |
| end if |
| endif |
| end if |
| |
| eassign(3,iel)=.true. |
| if(cb5.eq.1)then |
| ntemp=sje(1,1,1,iel) |
| if(cbc(5,ntemp).eq.2)then |
| diagn(1,3,iel)=sje(1,1,5,ntemp) |
| diagn(2,3,iel)=ijel(2,1,iel) |
| ncon_edge(5,sje(1,1,5,ntemp))=.true. |
| if_1_edge(3,iel)=.true. |
| elseif(cbc(5,ntemp).eq.3)then |
| diagn(1,3,iel)=sje(ijel(2,1,iel),1,5,ntemp) |
| endif |
| elseif(cb5.eq.2)then |
| ntemp=sje(1,1,5,iel) |
| if(ijel(1,1,iel).eq.2)then |
| if(cbc(1,ntemp).eq.2)then |
| diagn(1,3,iel)=sje(1,1,1,ntemp) |
| end if |
| endif |
| |
| end if |
| elseif(cb1.eq.2)then |
| if(cb3.eq.2)then |
| ntemp=sje(1,1,1,iel) |
| if(cbc(3,ntemp).ne.3)then |
| newe(iel)=newe(iel)+1 |
| eassign(2,iel)=.true. |
| if(cbc(3,ntemp).eq.2)then |
| diagn(1,2,iel)=sje(1,1,3,ntemp) |
| endif |
| endif |
| elseif(cb3.eq.0.or.cb3.eq.1)then |
| newe(iel)=newe(iel)+1 |
| eassign(2,iel)=.true. |
| if(cb3.eq.1)then |
| ntemp=sje(1,1,1,iel) |
| if(cbc(3,ntemp).eq.2)then |
| diagn(1,2,iel)=sje(1,1,3,ntemp) |
| endif |
| endif |
| end if |
| if(cb5.eq.2)then |
| ntemp=sje(1,1,1,iel) |
| if(cbc(5,ntemp).ne.3)then |
| newe(iel)=newe(iel)+1 |
| eassign(3,iel)=.true. |
| if(cbc(5,ntemp).eq.2)then |
| diagn(1,3,iel)=sje(1,1,5,ntemp) |
| endif |
| endif |
| elseif(cb5.eq.0.or.cb5.eq.1)then |
| newe(iel)=newe(iel)+1 |
| eassign(3,iel)=.true. |
| if(cb5.eq.1)then |
| ntemp=sje(1,1,1,iel) |
| if(cbc(5,ntemp).eq.2)then |
| diagn(1,3,iel)=sje(1,1,5,ntemp) |
| endif |
| endif |
| end if |
| elseif(cb1.eq.0)then |
| if(cb3.ne.3)then |
| newe(iel)=newe(iel)+1 |
| eassign(2,iel)=.true. |
| endif |
| if(cb5.ne.3)then |
| newe(iel)=newe(iel)+1 |
| eassign(3,iel)=.true. |
| endif |
| endif |
| |
| c.......on face 3 |
| if(cb3.eq.1)then |
| newe(iel)=newe(iel)+1 |
| eassign(10,iel)=.true. |
| if(cb5.eq.1)then |
| ntemp=sje(1,1,3,iel) |
| if(cbc(5,ntemp).eq.2)then |
| diagn(1,10,iel)=sje(1,1,5,ntemp) |
| diagn(2,10,iel)=ijel(2,3,iel) |
| ncon_edge(11,sje(1,1,5,ntemp))=.true. |
| if_1_edge(10,iel)=.true. |
| endif |
| endif |
| if(ijel(1,3,iel).eq.2)then |
| ntemp=sje(1,1,3,iel) |
| if(cbc(5,ntemp).eq.3)then |
| diagn(1,10,iel)=sje(1,ijel(2,3,iel),5,ntemp) |
| endif |
| endif |
| elseif(cb3.eq.2)then |
| if(cb5.eq.2)then |
| ntemp=sje(1,1,3,iel) |
| if(cbc(5,ntemp).ne.3)then |
| newe(iel)=newe(iel)+1 |
| eassign(10,iel)=.true. |
| if(cbc(5,ntemp).eq.2)then |
| diagn(1,10,iel)=sje(1,1,5,ntemp) |
| endif |
| endif |
| elseif(cb5.eq.0.or.cb5.eq.1)then |
| newe(iel)=newe(iel)+1 |
| eassign(10,iel)=.true. |
| if(cb5.eq.1)then |
| ntemp=sje(1,1,3,iel) |
| if(cbc(5,ntemp).eq.2)then |
| diagn(1,10,iel)=sje(1,1,5,ntemp) |
| endif |
| endif |
| end if |
| elseif(cb3.eq.0)then |
| if(cb5.ne.3)then |
| newe(iel)=newe(iel)+1 |
| eassign(10,iel)=.true. |
| endif |
| endif |
| |
| c CONFORMING FACE INTERIOR |
| |
| c.......find how many new mortar point indices will be assigned |
| c to face interiors on all faces on each element |
| |
| c.......newi record how many new face interior points will be assigned |
| |
| c.......on face 6 |
| if(cb6.eq.1.or.cb6.eq.0)then |
| newi(iel)=newi(iel)+9 |
| fassign(6,iel)=.true. |
| end if |
| c.......on face 4 |
| if(cb4.eq.1.or.cb4.eq.0)then |
| newi(iel)=newi(iel)+9 |
| fassign(4,iel)=.true. |
| end if |
| c.......on face 2 |
| if(cb2.eq.1.or.cb2.eq.0)then |
| newi(iel)=newi(iel)+9 |
| fassign(2,iel)=.true. |
| end if |
| c.......on face 1 |
| if(cb1.ne.3)then |
| newi(iel)=newi(iel)+9 |
| fassign(1,iel)=.true. |
| end if |
| c.......on face 3 |
| if(cb3.ne.3)then |
| newi(iel)=newi(iel)+9 |
| fassign(3,iel)=.true. |
| endif |
| c.......on face 5 |
| if(cb5.ne.3)then |
| newi(iel)=newi(iel)+9 |
| fassign(5,iel)=.true. |
| endif |
| |
| c.......newc is the total number of new mortar point indices |
| c to be assigned to each element. |
| newc(iel)=newe(iel)*3+newi(iel) |
| end do |
| |
| c.....Compute (potentially in parallel) front(iel), which records how |
| c many new mortar point indices are to be assigned (to conforming |
| c edges and conforming face interiors) from element 1 to iel. |
| c front(iel)=newc(1)+newc(2)+...+newc(iel) |
| |
| call ncopy(front,newc,nelt) |
| |
| call parallel_add(front) |
| |
| c.....nmor is the total number or mortar points |
| nmor=nvertex+front(nelt) |
| |
| c.....Generate (potentially in parallel) new mortar point indices on |
| c each conforming element face. On each face, first visit all |
| c conforming edges, and then the face interior. |
| |
| do iel=1,nelt |
| front(iel)=front(iel)-newc(iel) |
| count=nvertex+front(iel) |
| do i=1,6 |
| cb1=cbc(i,iel) |
| if (i.le.2) then |
| ne=4 |
| space=1 |
| elseif (i.le.4)then |
| ne=3 |
| space=2 |
| |
| c.........i loops over faces. Only 4 faces need to be examed for edge visit. |
| c On face 1, edge 1,2,3 and 4 will be visited. On face 2, edge 5,6,7 |
| c and 8 will be visited. On face 3, edge 9 and 10 will be visited and |
| c on face 4, edge 11 and 12 will be visited. The 12 edges can be |
| c covered by four faces, there is no need to visit edges on face |
| c 5 and 6. So ne is set to be 0. |
| c However, i still needs to loop over 5 and 6, since the interiors |
| c of face 5 and 6 still need to be visited. |
| |
| else |
| ne=0 |
| space=1 |
| end if |
| |
| do ie=1,ne,space |
| edge_g=edgenumber(ie,i) |
| if(eassign(edge_g,iel))then |
| c.............generate the new mortar points index, mor_v |
| call mor_assign(mor_v,count) |
| c.............assign mor_v to local edge ie of face i on element iel |
| call mor_edge(ie,i,iel,mor_v) |
| |
| c.............Since this edge is shared by another face of element |
| c iel, assign mor_v to the corresponding edge on the other |
| c face also. |
| |
| c.............find the other face |
| face2=f_e_ef(ie,i) |
| c.............find the local edge index of this edge on the other face |
| ie2=localedgenumber(face2,edge_g) |
| c.............asssign mor_v to local edge ie2 of face face2 on element iel |
| call mor_edge(ie2,face2,iel,mor_v) |
| |
| c.............There are some neighbor elements also sharing this edge. Assign |
| c mor_v to neighbor element, neighbored by face i. |
| if (cbc(i,iel).eq.2)then |
| ntemp=sje(1,1,i,iel) |
| call mor_edge(ie,jjface(i),ntemp,mor_v) |
| call mor_edge(op(ie2),face2,ntemp,mor_v) |
| end if |
| |
| c.............assign mor_v to neighbor element neighbored by face face2 |
| if (cbc(face2,iel).eq.2)then |
| ntemp=sje(1,1,face2,iel) |
| call mor_edge(ie2,jjface(face2),ntemp,mor_v) |
| call mor_edge(op(ie),i,ntemp,mor_v) |
| end if |
| |
| c.............assign mor_v to neighbor element sharing this edge |
| |
| c.............if the neighbor is of the same size of iel |
| if(.not.if_1_edge(edgenumber(ie,i),iel))then |
| if(diagn(1,edgenumber(ie,i),iel).ne.0)then |
| ntemp=diagn(1,edgenumber(ie,i),iel) |
| call mor_edge(op(ie2),jjface(face2),ntemp,mor_v) |
| call mor_edge(op(ie),jjface(i),ntemp,mor_v) |
| endif |
| |
| c.............if the neighbor has a size larger than iel's |
| else |
| if(diagn(1,edgenumber(ie,i),iel).ne.0)then |
| ntemp=diagn(1,edgenumber(ie,i),iel) |
| call mor_ne(mor_v,diagn(2,edgenumber(ie,i),iel), |
| & ie,i,ie2,face2,iel,ntemp) |
| end if |
| endif |
| |
| endif |
| end do |
| |
| if(fassign(i,iel))then |
| c...........generate new mortar points index in face interior. |
| c if face i is of type 2 or iel doesn't have a neighbor element, |
| c assign new mortar point indices to interior mortar points |
| c of face i of iel. |
| cb=cbc(i,iel) |
| if (cb.eq.1.or.cb.eq.0) then |
| do jj =2,lx1-1 |
| do ii=2,lx1-1 |
| count=count+1 |
| idmo(ii,jj,1,1,i,iel)=count |
| end do |
| end do |
| |
| c...........if face i is of type 2, assign new mortar point indices |
| c to iel as well as to the neighboring element on face i |
| elseif (cb.eq.2) then |
| if (idmo(2,2,1,1,i,iel).eq.0) then |
| ntemp=sje(1,1,i,iel) |
| jface = jjface(i) |
| do jj =2,lx1-1 |
| do ii=2,lx1-1 |
| count=count+1 |
| idmo(ii,jj,1,1,i,iel)=count |
| idmo(ii,jj,1,1,jface,ntemp)=count |
| end do |
| end do |
| end if |
| end if |
| end if |
| end do |
| end do |
| |
| |
| c.....for edges on nonconforming faces, copy the mortar points indices |
| c from neighbors. |
| do iel=1,nelt |
| do i=1,6 |
| cb=cbc(i,iel) |
| if (cb.eq.3) then |
| c...........edges |
| call edgecopy_s(i,iel) |
| end if |
| |
| c.........face interior |
| |
| jface = jjface(i) |
| if (cb.eq.3) then |
| do iii=1,2 |
| do jjj=1,2 |
| ntemp=sje(iii,jjj,i,iel) |
| do jj =1,lx1 |
| do ii=1,lx1 |
| idmo(ii,jj,iii,jjj,i,iel)= |
| & idmo(ii,jj,1,1,jface,ntemp) |
| end do |
| end do |
| idmo(1,1,iii,jjj,i,iel)=idmo(1,1,1,1,jface,ntemp) |
| idmo(lx1,1,iii,jjj,i,iel)=idmo(lx1,1,1,2,jface,ntemp) |
| idmo(1,lx1,iii,jjj,i,iel)=idmo(1,lx1,2,1,jface,ntemp) |
| idmo(lx1,lx1,iii,jjj,i,iel)= |
| & idmo(lx1,lx1,2,2,jface,ntemp) |
| end do |
| end do |
| end if |
| end do |
| end do |
| return |
| end |
| |
| c----------------------------------------------------------------- |
| subroutine get_emo(ie,n,ng) |
| c----------------------------------------------------------------- |
| c This subroutine fills array emo. |
| c emo records all elements sharing the same mortar point |
| c (only applies to element vertices) . |
| c emo(1,i,n) gives the element ID of the i'th element sharing |
| c mortar point n. (emo(1,i,n)=ie), ie is element |
| c index. |
| c emo(2,i,n) gives the vertex index of mortar point n on this |
| c element (emo(2,i,n)=ng), ng is the vertex index. |
| c nemo(n) records the total number of elements sharing mortar |
| c point n. |
| c----------------------------------------------------------------- |
| |
| include 'header.h' |
| |
| integer ie, n, ntemp, i,ng |
| logical L1 |
| |
| L1=.false. |
| do i=1,nemo(n) |
| if (emo(1,i,n).eq.ie) L1=.true. |
| end do |
| if (.not.L1) then |
| ntemp=nemo(n)+1 |
| nemo(n)=ntemp |
| emo(1,ntemp,n)=ie |
| emo(2,ntemp,n)=ng |
| end if |
| |
| return |
| end |
| |
| c----------------------------------------------------------------- |
| logical function ifsame(iel,i,ntemp,j) |
| c----------------------------------------------------------------- |
| c Check whether the i's vertex of element iel is at the same |
| c location as j's vertex of element ntemp. |
| c----------------------------------------------------------------- |
| |
| include 'header.h' |
| integer iel, i, ntemp, j |
| |
| ifsame=.false. |
| if (ntemp.eq.0 .or. iel.eq.0) return |
| if (xc(i,iel).eq.xc(j,ntemp).and. |
| & yc(i,iel).eq.yc(j,ntemp).and. |
| & zc(i,iel).eq.zc(j,ntemp)) then |
| ifsame=.true. |
| end if |
| |
| return |
| end |
| |
| c----------------------------------------------------------------- |
| subroutine mor_assign(mor_v,count) |
| c----------------------------------------------------------------- |
| c Assign three consecutive numbers for mor_v, which will |
| c be assigned to the three interior points of an edge as the |
| c mortar point indices. |
| c----------------------------------------------------------------- |
| |
| implicit none |
| integer mor_v(3),count,i |
| |
| do i=1,3 |
| count=count+1 |
| mor_v(i)=count |
| end do |
| |
| return |
| end |
| |
| c----------------------------------------------------------------- |
| subroutine mor_edge(ie,face,iel,mor_v) |
| c----------------------------------------------------------------- |
| c Copy the mortar points index from mor_v to local |
| c edge ie of the face'th face on element iel. |
| c The edge is conforming. |
| c----------------------------------------------------------------- |
| |
| include 'header.h' |
| |
| integer ie,i,iel,mor_v(3),j,nn,face |
| |
| if (ie.eq.1) then |
| j=1 |
| do nn=2,lx1-1 |
| idmo(nn,j,1,1,face,iel)=mor_v(nn-1) |
| end do |
| elseif (ie.eq.2) then |
| i=lx1 |
| do nn=2,lx1-1 |
| idmo(i,nn,1,1,face,iel)=mor_v(nn-1) |
| end do |
| elseif (ie.eq.3) then |
| j=lx1 |
| do nn=2,lx1-1 |
| idmo(nn,j,1,1,face,iel)=mor_v(nn-1) |
| end do |
| elseif (ie.eq.4) then |
| i=1 |
| do nn=2,lx1-1 |
| idmo(i,nn,1,1,face,iel)=mor_v(nn-1) |
| end do |
| end if |
| |
| return |
| end |
| |
| c------------------------------------------------------------ |
| subroutine edgecopy_s(face,iel) |
| c------------------------------------------------------------ |
| c Copy mortar points index on edges from neighbor elements |
| c to an element face of the 3rd type. |
| c------------------------------------------------------------ |
| |
| include 'header.h' |
| |
| integer face, iel, ntemp1, ntemp2, ntemp3, ntemp4, |
| & edge_g, edge_l, face2, mor_s_v(4,2), i |
| |
| c......find four neighbors on this face (3rd type) |
| ntemp1=sje(1,1,face,iel) |
| ntemp2=sje(1,2,face,iel) |
| ntemp3=sje(2,1,face,iel) |
| ntemp4=sje(2,2,face,iel) |
| |
| c......local edge 1 |
| |
| c......mor_s_v is the array of mortar indices to be copied. |
| call nrzero(mor_s_v,4*2) |
| do i=2,lx1-1 |
| mor_s_v(i-1,1)=idmo(i,1,1,1,jjface(face),ntemp1) |
| end do |
| mor_s_v(lx1-1,1)=idmo(lx1,1,1,2,jjface(face),ntemp1) |
| do i=1,lx1-1 |
| mor_s_v(i,2)=idmo(i,1,1,1,jjface(face),ntemp2) |
| end do |
| |
| c......copy mor_s_v to local edge 1 on this face |
| call mor_s_e(1,face,iel,mor_s_v) |
| |
| c......copy mor_s_v to the corresponding edge on the other face sharing |
| c local edge 1 |
| face2=f_e_ef(1,face) |
| edge_g=edgenumber(1,face) |
| edge_l=localedgenumber(face2,edge_g) |
| call mor_s_e(edge_l,face2,iel,mor_s_v) |
| |
| c......local edge 2 |
| do i=2,lx1-1 |
| mor_s_v(i-1,1)=idmo(lx1,i,1,1,jjface(face),ntemp2) |
| end do |
| mor_s_v(lx1-1,1)=idmo(lx1,lx1,2,2,jjface(face),ntemp2) |
| |
| mor_s_v(1,2)=idmo(lx1,1,1,2,jjface(face),ntemp4) |
| do i=2,lx1-1 |
| mor_s_v(i,2)=idmo(lx1,i,1,1,jjface(face),ntemp4) |
| end do |
| |
| call mor_s_e(2,face,iel,mor_s_v) |
| face2=f_e_ef(2,face) |
| edge_g=edgenumber(2,face) |
| edge_l=localedgenumber(face2,edge_g) |
| call mor_s_e(edge_l,face2,iel,mor_s_v) |
| |
| c......local edge 3 |
| do i=2,lx1-1 |
| mor_s_v(i-1,1)=idmo(i,lx1,1,1,jjface(face),ntemp3) |
| end do |
| mor_s_v(lx1-1,1)=idmo(lx1,lx1,2,2,jjface(face),ntemp3) |
| |
| mor_s_v(1,2)=idmo(1,lx1,2,1,jjface(face),ntemp4) |
| do i=2,lx1-1 |
| mor_s_v(i,2)=idmo(i,lx1,1,1,jjface(face),ntemp4) |
| end do |
| |
| call mor_s_e(3,face,iel,mor_s_v) |
| face2=f_e_ef(3,face) |
| edge_g=edgenumber(3,face) |
| edge_l=localedgenumber(face2,edge_g) |
| call mor_s_e(edge_l,face2,iel,mor_s_v) |
| |
| c......local edge 4 |
| do i=2,lx1-1 |
| mor_s_v(i-1,1)=idmo(1,i,1,1,jjface(face),ntemp1) |
| end do |
| mor_s_v(lx1-1,1)=idmo(1,lx1,2,1,jjface(face),ntemp1) |
| |
| do i=1,lx1-1 |
| mor_s_v(i,2)=idmo(1,i,1,1,jjface(face),ntemp3) |
| end do |
| |
| call mor_s_e(4,face,iel,mor_s_v) |
| face2=f_e_ef(4,face) |
| edge_g=edgenumber(4,face) |
| edge_l=localedgenumber(face2,edge_g) |
| call mor_s_e(edge_l,face2,iel,mor_s_v) |
| |
| return |
| end |
| |
| c------------------------------------------------------------ |
| subroutine mor_s_e(n,face,iel,mor_s_v) |
| c------------------------------------------------------------ |
| c Copy mortar points index from mor_s_v to local edge n |
| c on face "face" of element iel. The edge is nonconforming. |
| c------------------------------------------------------------ |
| |
| include 'header.h' |
| |
| integer n,face,iel,mor_s_v(4,2), i |
| |
| if (n.eq.1) then |
| do i=2,lx1 |
| idmo(i,1,1,1,face,iel)=mor_s_v(i-1,1) |
| end do |
| do i=1,lx1-1 |
| idmo(i,1,1,2,face,iel)=mor_s_v(i,2) |
| end do |
| else if (n.eq.2) then |
| do i=2,lx1 |
| idmo(lx1,i,1,2,face,iel)=mor_s_v(i-1,1) |
| end do |
| do i=1,lx1-1 |
| idmo(lx1,i,2,2,face,iel)=mor_s_v(i,2) |
| end do |
| else if (n.eq.3) then |
| do i=2,lx1 |
| idmo(i,lx1,2,1,face,iel)=mor_s_v(i-1,1) |
| end do |
| do i=1,lx1-1 |
| idmo(i,lx1,2,2,face,iel)=mor_s_v(i,2) |
| end do |
| else if (n.eq.4) then |
| do i=2,lx1 |
| idmo(1,i,1,1,face,iel)=mor_s_v(i-1,1) |
| end do |
| do i=1,lx1-1 |
| idmo(1,i,2,1,face,iel)=mor_s_v(i,2) |
| end do |
| end if |
| return |
| end |
| |
| c------------------------------------------------------------ |
| subroutine mor_s_e_nn(n,face,iel,mor_s_v,nn) |
| c------------------------------------------------------------ |
| c Copy mortar point indices from mor_s_v to local edge n |
| c on face "face" of element iel. nn is the edge mortar index, |
| c which indicates that mor_s_v corresponds to left/bottom or |
| c right/top part of the edge. |
| c------------------------------------------------------------ |
| |
| include 'header.h' |
| |
| integer n,face,iel,mor_s_v(4), i,nn |
| |
| if (n.eq.1) then |
| if(nn.eq.1)then |
| do i=2,lx1 |
| idmo(i,1,1,1,face,iel)=mor_s_v(i-1) |
| end do |
| else |
| do i=1,lx1-1 |
| idmo(i,1,1,2,face,iel)=mor_s_v(i) |
| end do |
| endif |
| else if (n.eq.2) then |
| if(nn.eq.1)then |
| do i=2,lx1 |
| idmo(lx1,i,1,2,face,iel)=mor_s_v(i-1) |
| end do |
| else |
| do i=1,lx1-1 |
| idmo(lx1,i,2,2,face,iel)=mor_s_v(i) |
| end do |
| endif |
| else if (n.eq.3) then |
| if(nn.eq.1)then |
| do i=2,lx1 |
| idmo(i,lx1,2,1,face,iel)=mor_s_v(i-1) |
| end do |
| else |
| do i=1,lx1-1 |
| idmo(i,lx1,2,2,face,iel)=mor_s_v(i) |
| end do |
| endif |
| else if (n.eq.4) then |
| if(nn.eq.1)then |
| do i=2,lx1 |
| idmo(1,i,1,1,face,iel)=mor_s_v(i-1) |
| end do |
| else |
| do i=1,lx1-1 |
| idmo(1,i,2,1,face,iel)=mor_s_v(i) |
| end do |
| endif |
| end if |
| return |
| end |
| |
| |
| c--------------------------------------------------------------- |
| subroutine mortar_vertex(i,iel,count) |
| c--------------------------------------------------------------- |
| c Assign mortar point index "count" to iel's i'th vertex |
| c and also to all elements sharing this vertex. |
| c--------------------------------------------------------------- |
| |
| include 'header.h' |
| |
| integer i,iel,count,ntempx(8),ifntempx(8),lc_a(3),nnb(3), |
| & face_a(3),itemp,ntemp,ii, jj,j(3), |
| & iintempx(3),l,nbe, lc, temp |
| logical ifsame,if_temp |
| |
| do l= 1,8 |
| ntempx(l)=0 |
| ifntempx(l)=0 |
| end do |
| |
| c.....face_a records the three faces sharing this vertex on iel. |
| c lc_a gives the local corner number of this vertex on each |
| c face in face_a. |
| |
| do l=1,3 |
| face_a(l)=f_c(l,i) |
| lc_a(l)=local_corner(i,face_a(l)) |
| end do |
| |
| c.....each vertex is shared by at most 8 elements. |
| c ntempx(j) gives the element index of a POSSIBLE element with its |
| c j'th vertex is iel's i'th vertex |
| c ifntempx(i)=ntempx(i) means ntempx(i) exists |
| c ifntempx(i)=0 means ntempx(i) does not exist. |
| |
| ntempx(9-i)=iel |
| ifntempx(9-i)=iel |
| |
| c.....first find all elements sharing this vertex, ifntempx |
| |
| c.....find the three possible neighbors of iel, neighbored by faces |
| c listed in array face_a |
| |
| do itemp= 1, 3 |
| |
| c.......j(itemp) is the local corner number of this vertex on the |
| c neighbor element on the corresponding face. |
| j(itemp)=c_f(lc_a(itemp),jjface(face_a(itemp))) |
| |
| c.......iitempx(itemp) records the vertex index of i on the |
| c neighbor element, neighborned by face_a(itemp) |
| iintempx(itemp)=cal_intempx(lc_a(itemp),face_a(itemp)) |
| |
| c.......ntemp refers the neighbor element |
| ntemp=0 |
| |
| c.......if the face is nonconforming, find out in which piece of the |
| c mortar the vertex is located |
| ii=cal_iijj(1,lc_a(itemp)) |
| jj=cal_iijj(2,lc_a(itemp)) |
| ntemp=sje(ii,jj,face_a(itemp),iel) |
| |
| c.......if the face is conforming |
| if(ntemp.eq.0)then |
| ntemp=sje(1,1,face_a(itemp),iel) |
| c.........find the possible neighbor |
| ntempx(iintempx(itemp))=ntemp |
| c.........check whether this possible neighbor is a real neighbor or not |
| if(ntemp.ne.0)then |
| if(ifsame(ntemp,j(itemp),iel,i))then |
| ifntempx(iintempx(itemp))=ntemp |
| end if |
| end if |
| |
| c.......if the face is nonconforming |
| else |
| if(ntemp.ne.0)then |
| if(ifsame(ntemp,j(itemp),iel,i))then |
| ifntempx(iintempx(itemp))=ntemp |
| ntempx(iintempx(itemp))=ntemp |
| end if |
| end if |
| end if |
| end do |
| |
| c.....find the possible three neighbors, neighbored by an edge only |
| do l=1,3 |
| |
| c.....find first existing neighbor of any of the faces in array face_a |
| if_temp=.false. |
| if(l.eq.1)then |
| if_temp=.true. |
| elseif(l.eq.2)then |
| if(ifntempx(iintempx(l-1)).eq.0)then |
| if_temp=.true. |
| end if |
| elseif(l.eq.3)then |
| if(ifntempx(iintempx(l-1)).eq.0 |
| & .and.ifntempx(iintempx(l-2)).eq.0) then |
| if_temp=.true. |
| end if |
| end if |
| |
| if(if_temp)then |
| if (ifntempx(iintempx(l)).ne.0) then |
| nbe=ifntempx(iintempx(l)) |
| c...........if 1st neighor exists, check the neighbor's two neighbors in |
| c the other two directions. |
| c e.g. if l=1, check directions 2 and 3,i.e. itemp=2,3,1 |
| c if l=2, itemp=3,1,-2 |
| c if l=3, itemp=1,2,1 |
| c |
| do itemp=face_l1(l),face_l2(l),face_ld(l) |
| c.............lc is the local corner number of this vertex on face face_a(itemp) |
| c on the neighbor element of iel, neighbored by a face face_a(l) |
| lc=local_corner(j(l),face_a(itemp)) |
| c.............temp is the vertex index of this vertex on the neighbor element |
| c neighbored by an edge |
| temp=cal_intempx(lc,face_a(itemp)) |
| ii=cal_iijj(1,lc) |
| jj=cal_iijj(2,lc) |
| ntemp=sje(ii,jj,face_a(itemp),nbe) |
| |
| c.............if the face face_a(itemp) is conforming |
| if(ntemp.eq.0)then |
| ntemp=sje(1,1,face_a(itemp),nbe) |
| if(ntemp.ne.0)then |
| if(ifsame(ntemp,c_f(lc,jjface(face_a(itemp))), |
| & nbe,j(l)))then |
| ntempx(temp)=ntemp |
| ifntempx(temp)=ntemp |
| c...................nnb(itemp) records the neighbor element neighbored by an |
| c edge only |
| nnb(itemp)=ntemp |
| end if |
| end if |
| |
| c.............if the face face_a(itemp) is nonconforming |
| else |
| if(ntemp.ne.0)then |
| if(ifsame(ntemp,c_f(lc,jjface(face_a(itemp))), |
| & nbe,j(l)))then |
| ntempx(temp)=ntemp |
| ifntempx(temp)=ntemp |
| nnb(itemp)=ntemp |
| end if |
| end if |
| end if |
| end do |
| |
| c...........check the last neighbor element, neighbored by an edge |
| |
| c...........ifntempx(iintempx(l)) has been visited in the above, now |
| c check another neighbor element(nbe) neighbored by a face |
| |
| c...........if the neighbor element is neighbored by face |
| c face_a(face_l1(l)) exists |
| if(ifntempx(iintempx(face_l1(l))).ne.0)then |
| nbe=ifntempx(iintempx(face_l1(l))) |
| c.............itemp is the last direction other than l and face_l1(l) |
| itemp=face_l2(l) |
| lc=local_corner(j(face_l1(l)),face_a(itemp)) |
| temp=cal_intempx(lc,face_a(itemp)) |
| ii=cal_iijj(1,lc) |
| jj=cal_iijj(2,lc) |
| |
| c.............ntemp records the last neighbor element neighbored by an edge |
| c with element iel |
| ntemp=sje(ii,jj,face_a(itemp),nbe) |
| c.............if conforming |
| if(ntemp.eq.0)then |
| ntemp=sje(1,1,face_a(itemp),nbe) |
| if(ntemp.ne.0)then |
| if(ifsame(ntemp,c_f(lc,jjface(face_a(itemp))), |
| & nbe,j(face_l1(l))))then |
| ntempx(temp)=ntemp |
| ifntempx(temp)=ntemp |
| nnb(l)=ntemp |
| end if |
| end if |
| c.............if nonconforming |
| else |
| if(ntemp.ne.0)then |
| if(ifsame(ntemp,c_f(lc,jjface(face_a(itemp))), |
| & nbe,j(face_l1(l))))then |
| ntempx(temp)=ntemp |
| ifntempx(temp)=ntemp |
| nnb(l)=ntemp |
| end if |
| end if |
| end if |
| |
| c...........if the neighbor element neighbored by face face_a(face_l2(l)) |
| c does not exist |
| elseif(ifntempx(iintempx(face_l2(l))).ne.0)then |
| nbe=ifntempx(iintempx(face_l2(l))) |
| itemp=face_l1(l) |
| lc=local_corner(j(face_l2(l)),face_a(itemp)) |
| temp=cal_intempx(lc,face_a(itemp)) |
| ii=cal_iijj(1,lc) |
| jj=cal_iijj(2,lc) |
| ntemp=sje(ii,jj,face_a(itemp),nbe) |
| if(ntemp.eq.0)then |
| ntemp=sje(1,1,face_a(itemp),nbe) |
| if(ntemp.ne.0)then |
| if(ifsame(ntemp,c_f(lc,jjface(face_a(itemp))), |
| & nbe,j(face_l2(l))))then |
| ntempx(temp)=ntemp |
| ifntempx(temp)=ntemp |
| nnb(l)=ntemp |
| end if |
| end if |
| else |
| if(ntemp.ne.0)then |
| if(ifsame(ntemp,c_f(lc,jjface(face_a(itemp))), |
| & nbe,j(face_l2(l))))then |
| ntempx(temp)=ntemp |
| ifntempx(temp)=ntemp |
| nnb(l)=ntemp |
| end if |
| end if |
| end if |
| endif |
| endif |
| end if |
| end do |
| |
| c.....check the neighbor element, neighbored by a vertex only |
| |
| c.....nnb are the three possible neighbor elements neighbored by an edge |
| |
| nnb(1)=ifntempx(cal_nnb(1,i)) |
| nnb(2)=ifntempx(cal_nnb(2,i)) |
| nnb(3)=ifntempx(cal_nnb(3,i)) |
| ntemp=0 |
| |
| c.....the neighbor element neighbored by a vertex must be a neighbor of |
| c a valid(nonzero) nnb(i), neighbored by a face |
| |
| if(nnb(1).ne.0)then |
| lc=oplc(local_corner(i,face_a(3))) |
| ii=cal_iijj(1,lc) |
| jj=cal_iijj(2,lc) |
| c.......ntemp records the neighbor of iel, neighbored by vertex i |
| ntemp=sje(ii,jj,face_a(3),nnb(1)) |
| c.......temp is the vertex index of i on ntemp |
| temp=cal_intempx(lc,face_a(3)) |
| if(ntemp.eq.0)then |
| ntemp=sje(1,1,face_a(3),nnb(1)) |
| if(ntemp.ne.0)then |
| if(ifsame(ntemp,c_f(lc,jjface(face_a(3))), |
| & iel,i))then |
| ntempx(temp)=ntemp |
| ifntempx(temp)=ntemp |
| end if |
| end if |
| else |
| if(ntemp.ne.0)then |
| if(ifsame(ntemp,c_f(lc,jjface(face_a(3))), |
| & iel,i))then |
| ntempx(temp)=ntemp |
| ifntempx(temp)=ntemp |
| end if |
| end if |
| end if |
| elseif(nnb(2).ne.0)then |
| lc=oplc(local_corner(i,face_a(1))) |
| ii=cal_iijj(1,lc) |
| jj=cal_iijj(2,lc) |
| ntemp=sje(ii,jj,face_a(1),nnb(2)) |
| temp=cal_intempx(lc,face_a(1)) |
| if(ntemp.eq.0)then |
| ntemp=sje(1,1,face_a(1),nnb(2)) |
| if(ntemp.ne.0)then |
| if(ifsame(ntemp, |
| & c_f(lc,jjface(face_a(1))),iel,i))then |
| ntempx(temp)=ntemp |
| ifntempx(temp)=ntemp |
| end if |
| end if |
| else |
| if(ntemp.ne.0)then |
| if(ifsame(ntemp, |
| & c_f(lc,jjface(face_a(1))),iel,i))then |
| ntempx(temp)=ntemp |
| ifntempx(temp)=ntemp |
| end if |
| end if |
| end if |
| elseif(nnb(3).ne.0)then |
| lc=oplc(local_corner(i,face_a(2))) |
| ii=cal_iijj(1,lc) |
| jj=cal_iijj(2,lc) |
| ntemp=sje(ii,jj,face_a(2),nnb(3)) |
| temp=cal_intempx(lc, face_a(2)) |
| if(ntemp.eq.0)then |
| ntemp=sje(1,1,face_a(2),nnb(3)) |
| if(ntemp.ne.0)then |
| if(ifsame(ntemp, |
| & c_f(lc,jjface(face_a(2))),iel,i))then |
| ifntempx(temp)=ntemp |
| ntempx(temp)=ntemp |
| end if |
| end if |
| else |
| if(ntemp.ne.0)then |
| if(ifsame(ntemp, |
| & c_f(lc,jjface(face_a(2))),iel,i))then |
| ifntempx(temp)=ntemp |
| ntempx(temp)=ntemp |
| end if |
| end if |
| end if |
| end if |
| |
| c.....ifntempx records all elements sharing this vertex, assign count |
| c to all these elements. |
| |
| if (ifntempx(1).ne.0) then |
| idmo(lx1,lx1,2,2,1,ntempx(1))=count |
| idmo(lx1,lx1,2,2,3,ntempx(1))=count |
| idmo(lx1,lx1,2,2,5,ntempx(1))=count |
| call get_emo(ntempx(1),count,8) |
| end if |
| |
| if (ifntempx(2).ne.0) then |
| idmo(lx1,lx1,2,2,2,ntempx(2))=count |
| idmo(1,lx1,2,1,3,ntempx(2))=count |
| idmo(1,lx1,2,1,5,ntempx(2))=count |
| call get_emo(ntempx(2),count,7) |
| end if |
| |
| if (ifntempx(3).ne.0) then |
| idmo(1,lx1,2,1,1,ntempx(3))=count |
| idmo(lx1,lx1,2,2,4,ntempx(3))=count |
| idmo(lx1,1,1,2,5,ntempx(3))=count |
| call get_emo(ntempx(3),count,6) |
| end if |
| if (ifntempx(4).ne.0) then |
| idmo(1,lx1,2,1,2,ntempx(4))=count |
| idmo(1,lx1,2,1,4,ntempx(4))=count |
| idmo(1,1,1,1,5,ntempx(4))=count |
| call get_emo(ntempx(4),count,5) |
| end if |
| |
| if (ifntempx(5).ne.0) then |
| idmo(lx1,1,1,2,1,ntempx(5))=count |
| idmo(lx1,1,1,2,3,ntempx(5))=count |
| idmo(lx1,lx1,2,2,6,ntempx(5))=count |
| call get_emo(ntempx(5),count,4) |
| end if |
| |
| |
| if (ifntempx(6).ne.0) then |
| idmo(lx1,1,1,2,2,ntempx(6))=count |
| idmo(1,1,1,1,3,ntempx(6))=count |
| idmo(1,lx1,2,1,6,ntempx(6))=count |
| call get_emo(ntempx(6),count,3) |
| end if |
| |
| if (ifntempx(7).ne.0) then |
| idmo(1,1,1,1,1,ntempx(7))=count |
| idmo(lx1,1,1,2,4,ntempx(7))=count |
| idmo(lx1,1,1,2,6,ntempx(7))=count |
| call get_emo(ntempx(7),count,2) |
| end if |
| |
| if (ifntempx(8).ne.0) then |
| idmo(1,1,1,1,2,ntempx(8))=count |
| idmo(1,1,1,1,4,ntempx(8))=count |
| idmo(1,1,1,1,6,ntempx(8))=count |
| call get_emo(ntempx(8),count,1) |
| end if |
| |
| return |
| end |
| |
| |
| c--------------------------------------------------------------- |
| subroutine mor_ne(mor_v,nn,edge,face,edge2,face2,ntemp,iel) |
| c--------------------------------------------------------------- |
| c Copy the mortar points index (mor_v + vertex mortar point) from |
| c edge'th local edge on face'th face on element ntemp to iel. |
| c ntemp is iel's neighbor, neighbored by this edge only. |
| c This subroutine is for the situation that iel is of larger |
| c size than ntemp. |
| c face, face2 are face indices |
| c edge and edge2 are local edge numbers of this edge on face and face2 |
| c nn is edge motar index, which indicate whether this edge |
| c corresponds to the left/bottom or right/top part of the edge |
| c on iel. |
| c--------------------------------------------------------------- |
| include 'header.h' |
| |
| integer mor_v(3),nn,edge,face,edge2,face2,ntemp,iel, i, |
| &mor_s_v(4) |
| |
| c.....get mor_s_v which is the mor_v + vertex mortar |
| if (edge.eq.3) then |
| if(nn.eq.1)then |
| do i=2,lx1-1 |
| mor_s_v(i-1)=mor_v(i-1) |
| end do |
| mor_s_v(4)=idmo(lx1,lx1,2,2,face,ntemp) |
| else |
| mor_s_v(1)=idmo(1,lx1,2,1,face,ntemp) |
| do i=2,lx1-1 |
| mor_s_v(i)=mor_v(i-1) |
| end do |
| endif |
| |
| elseif (edge.eq.4) then |
| if(nn.eq.1)then |
| do i=2,lx1-1 |
| mor_s_v(i-1)=mor_v(i-1) |
| end do |
| mor_s_v(4)=idmo(1,lx1,2,1,face,ntemp) |
| else |
| mor_s_v(1)=idmo(1,1,1,1,face,ntemp) |
| do i=2,lx1-1 |
| mor_s_v(i)=mor_v(i-1) |
| end do |
| endif |
| |
| elseif (edge.eq.1) then |
| if(nn.eq.1)then |
| do i=2,lx1-1 |
| mor_s_v(i-1)=mor_v(i-1) |
| end do |
| mor_s_v(4)=idmo(lx1,1,1,2,face,ntemp) |
| else |
| mor_s_v(1)=idmo(1,1,1,1,face,ntemp) |
| do i=2,lx1-1 |
| mor_s_v(i)=mor_v(i-1) |
| end do |
| endif |
| |
| else if (edge.eq.2) then |
| if(nn.eq.1)then |
| do i=2,lx1-1 |
| mor_s_v(i-1)=mor_v(i-1) |
| end do |
| mor_s_v(4)=idmo(lx1,lx1,2,2,face,ntemp) |
| else |
| mor_s_v(1)=idmo(lx1,1,1,2,face,ntemp) |
| do i=2,lx1-1 |
| mor_s_v(i)=mor_v(i-1) |
| end do |
| endif |
| end if |
| |
| c.....copy mor_s_v to iel's local edge(op(edge)), on face jjface(face) |
| call mor_s_e_nn(op(edge),jjface(face),iel,mor_s_v,nn) |
| c.....copy mor_s_v to iel's local edge(op(edge2)), on face jjface(face2) |
| c since this edge is shared by two faces on iel |
| call mor_s_e_nn(op(edge2),jjface(face2),iel,mor_s_v,nn) |
| |
| return |
| end |
| |