!This program calculates the distance from each element !to its nearest grain boundary Program GeomGenPost ! ! Parameters parameter(max_nodes=1000000,max_elements=1000000,max_node_in_elem=8) parameter(max_cells=1000,max_elem_in_cell=10000,max_neigh_per_elem=6) parameter(max_faces_in_cell=100) ! ! Declare Variables character*256 input,input2(2) integer elements(max_elements,max_node_in_elem) integer active(max_elements) integer num_elements(max_cells) integer elem_label(max_cells,max_elem_in_cell) integer num_neighbours(max_cells,max_elem_in_cell) integer elem_neighbours(max_cells,max_elem_in_cell,max_neigh_per_elem) integer num_faces(max_cells) integer fstatus(max_cells,max_faces_in_cell) real nodes(max_nodes,3) real fnorm(max_cells,max_faces_in_cell,3) real fpoint(max_cells,max_faces_in_cell,3) real dotprod(max_node_in_elem,max_faces_in_cell) real average(max_faces_in_cell) real distance(max_cells,max_elem_in_cell) ! ! Initialise Variables nodes=0. fnorm=0. fpoint=0. dotprod=0. average=0. distance=0. elements=0 active=0 num_elements=0 elem_label=0 num_neighbours=0 elem_neighbours=0 num_faces=0 fstatus=0 ! ! Open Input File and read node and element co-ordinates open(unit=10,file='GeomGenTemp.inp',status='unknown') do while (index(input,'*Node')==0) read(10,'(a)')input end do nn=0 do while(1==1) read(10,'(a)')input if(index(input,'*')==0)then backspace(10) nn=nn+1 read(10,*)dummy,nodes(nn,1),nodes(nn,2),nodes(nn,3) else if(index(input,'C3D8')/=0)nele_type=8 if(index(input,'C3D4')/=0)nele_type=4 exit endif end do ne=0 do while(1==1) read(10,'(a)')input if(index(input,'*')==0)then backspace(10) ne=ne+1 if(nele_type==8)then read(10,*)dummy,elements(ne,1),elements(ne,2),elements(ne,3),elements(ne,4)& & ,elements(ne,5),elements(ne,6),elements(ne,7),elements(ne,8) elseif(nele_type==4)then read(10,*)dummy,elements(ne,1),elements(ne,2),elements(ne,3),elements(ne,4) endif else exit endif end do ! ! Open GeomGen output file and read element connectivity, cell, face and ! vertice data. open(unit=11,file='vertout.dat',status='old') read(11,*)idimension read(11,*)num_cells do i=1,num_cells read(11,*)num_elements(i) do j=1,num_elements(i) read(11,*)elem_label(i,j) read(11,*)num_neighbours(i,j) do k=1,num_neighbours(i,j) read(11,*)elem_neighbours(i,j,k) enddo enddo read(11,*)num_faces(i) do j=1,num_faces(i) read(11,*)vert1x,vert1y,vert1z read(11,*)vert2x,vert2y,vert2z read(11,*)vert3x,vert3y,vert3z v1v2i=vert1x-vert2x v1v2j=vert1y-vert2y v1v2k=vert1z-vert2z v1v3i=vert1x-vert3x v1v3j=vert1y-vert3y v1v3k=vert1z-vert3z crossi=v1v2j*v1v3k-v1v2k*v1v3j crossj=v1v2k*v1v3i-v1v2i*v1v3k crossk=v1v2i*v1v3j-v1v2j*v1v3i cmag=sqrt(crossi*crossi+crossj*crossj+crossk*crossk) fnorm(i,j,1)=crossi/cmag fnorm(i,j,2)=crossj/cmag fnorm(i,j,3)=crossk/cmag fpoint(i,j,1)=vert1x fpoint(i,j,2)=vert1y fpoint(i,j,3)=vert1z if(idimension==2)then if(int(fnorm(i,j,1))==0.and.int(fnorm(i,j,2))==0.and.int(abs(fnorm(i,j,3)))==1)then fstatus(i,j)=1 endif endif enddo enddo ! ! Determine normal distance between element centroid and closest face do i=1,num_cells do j=1,num_elements(i) do k=1,nele_type rnodex=nodes(elements(elem_label(i,j),k),1) rnodey=nodes(elements(elem_label(i,j),k),2) rnodez=nodes(elements(elem_label(i,j),k),3) do m=1,num_faces(i) if(fstatus(i,m)/=1)then v1ni=fpoint(i,m,1)-rnodex v1nj=fpoint(i,m,2)-rnodey v1nk=fpoint(i,m,3)-rnodez dotprod(k,m)=v1ni*fnorm(i,m,1)+v1nj*fnorm(i,m,2)+v1nk*fnorm(i,m,3) endif enddo enddo rmin_average=1000. do m=1,num_faces(i) if(fstatus(i,m)/=1)then average(m)=0. do k=1,nele_type average(m)=average(m)+abs(dotprod(k,m)) enddo average(m)=average(m)/float(nele_type) if(average(m)