159599516SKenneth E. Jansen subroutine genblk (IBKSZ) 259599516SKenneth E. Jansenc 359599516SKenneth E. Jansenc---------------------------------------------------------------------- 459599516SKenneth E. Jansenc 559599516SKenneth E. Jansenc This routine reads the interior elements and generates the 659599516SKenneth E. Jansenc appropriate blocks. 759599516SKenneth E. Jansenc 859599516SKenneth E. Jansenc Zdenek Johan, Fall 1991. 959599516SKenneth E. Jansenc---------------------------------------------------------------------- 1059599516SKenneth E. Jansenc 1159599516SKenneth E. Jansen use pointer_data 12e5afe575SCameron Smith use phio 13e5afe575SCameron Smith use iso_c_binding 1459599516SKenneth E. Jansen include "common.h" 1559599516SKenneth E. Jansen include "mpif.h" !Required to determine the max for itpblk 163aa841a8SCameron Smith 179a6935e5SKenneth E. Jansen integer, target, allocatable :: ientp(:,:) 1859599516SKenneth E. Jansen integer mater(ibksz) 199a6935e5SKenneth E. Jansen integer, target :: intfromfile(50) ! integers read from headers 2059599516SKenneth E. Jansen character*255 fname1 21fcf561c1SCameron Smith integer :: descriptor, descriptorG, GPID, color 2259599516SKenneth E. Jansen integer :: numparts, writeLock 232efdc748SKenneth E. Jansen integer :: ierr_io, numprocs 249a6935e5SKenneth E. Jansen integer, target :: itpblktot,ierr,iseven 252efdc748SKenneth E. Jansen character*255 fname2 26e5afe575SCameron Smith character(len=30) :: dataInt 27d5d2f64dSCameron Smith dataInt = c_char_'integer'//c_null_char 2859599516SKenneth E. Jansen numparts = numpe !This is the common settings. Beware if you try to compute several parts per process 2959599516SKenneth E. Jansen ione=1 3059599516SKenneth E. Jansen itwo=2 3159599516SKenneth E. Jansen iseven=7 3259599516SKenneth E. Jansen ieleven=11 3359599516SKenneth E. Jansen iel=1 3459599516SKenneth E. Jansen itpblk=nelblk 3559599516SKenneth E. Jansen 3659599516SKenneth E. Jansen ! Get the total number of different interior topologies in the whole domain. 3759599516SKenneth E. Jansen ! Try to read from a field. If the field does not exist, scan the geombc file. 382efdc748SKenneth E. Jansen itpblktot=1 ! hardwired to montopology for now 39d5d2f64dSCameron Smith call phio_readheader(fhandle, 40e5afe575SCameron Smith & c_char_'total number of interior tpblocks' // char(0), 41e5afe575SCameron Smith & c_loc(itpblktot), ione, dataInt, iotype) 4259599516SKenneth E. Jansen 4359599516SKenneth E. Jansen if (itpblktot == -1) then 4459599516SKenneth E. Jansen ! The field 'total number of different interior tpblocks' was not found in the geombc file. 4559599516SKenneth E. Jansen ! Scan all the geombc file for the 'connectivity interior' fields to get this information. 4659599516SKenneth E. Jansen iblk=0 4759599516SKenneth E. Jansen neltp=0 4859599516SKenneth E. Jansen do while(neltp .ne. -1) 4959599516SKenneth E. Jansen 5059599516SKenneth E. Jansen ! intfromfile is reinitialized to -1 every time. 5159599516SKenneth E. Jansen ! If connectivity interior@xxx is not found, then 5259599516SKenneth E. Jansen ! readheader will return intfromfile unchanged 5359599516SKenneth E. Jansen 5459599516SKenneth E. Jansen intfromfile(:)=-1 5559599516SKenneth E. Jansen iblk = iblk+1 56*5b7f36ccSCameron Smith if(input_mode.ge.1) then 57aa9d7345SCameron Smith write (fname2,"('connectivity interior',i1)") iblk 582efdc748SKenneth E. Jansen else 592efdc748SKenneth E. Jansen write (fname2,"('connectivity interior linear tetrahedron')") 602efdc748SKenneth E. Jansen endif 6159599516SKenneth E. Jansen 6259599516SKenneth E. Jansen !write(*,*) 'rank, fname2',myrank, trim(adjustl(fname2)) 63d5d2f64dSCameron Smith call phio_readheader(fhandle, fname2 // char(0), 64e5afe575SCameron Smith & c_loc(intfromfile), iseven, dataInt, iotype) 6559599516SKenneth E. Jansen neltp = intfromfile(1) ! -1 if fname2 was not found, >=0 otherwise 6659599516SKenneth E. Jansen end do 6759599516SKenneth E. Jansen itpblktot = iblk-1 6859599516SKenneth E. Jansen end if 6959599516SKenneth E. Jansen 7059599516SKenneth E. Jansen if (myrank == 0) then 7159599516SKenneth E. Jansen write(*,*) 'Number of interior topologies: ',itpblktot 7259599516SKenneth E. Jansen endif 7359599516SKenneth E. Jansen 7459599516SKenneth E. Jansen nelblk=0 7559599516SKenneth E. Jansen mattyp = 0 7659599516SKenneth E. Jansen ndofl = ndof 7759599516SKenneth E. Jansen nsymdl = nsymdf 7859599516SKenneth E. Jansen 7959599516SKenneth E. Jansen do iblk = 1, itpblktot 8059599516SKenneth E. Jansen writeLock=0; 81*5b7f36ccSCameron Smith if(input_mode.ge.1) then 82aa9d7345SCameron Smith write (fname2,"('connectivity interior',i1)") iblk 832efdc748SKenneth E. Jansen else 842efdc748SKenneth E. Jansen write (fname2,"('connectivity interior linear tetrahedron')") 852efdc748SKenneth E. Jansen endif 8659599516SKenneth E. Jansen 8759599516SKenneth E. Jansen ! Synchronization for performance monitoring, as some parts do not include some topologies 8859599516SKenneth E. Jansen call MPI_Barrier(MPI_COMM_WORLD,ierr) 89d5d2f64dSCameron Smith call phio_readheader(fhandle, fname2 // char(0), 90e5afe575SCameron Smith & c_loc(intfromfile), iseven, dataInt, iotype) 9159599516SKenneth E. Jansen neltp =intfromfile(1) 9259599516SKenneth E. Jansen nenl =intfromfile(2) 9359599516SKenneth E. Jansen ipordl =intfromfile(3) 9459599516SKenneth E. Jansen nshl =intfromfile(4) 9559599516SKenneth E. Jansen ijunk =intfromfile(5) 9659599516SKenneth E. Jansen ijunk =intfromfile(6) 9759599516SKenneth E. Jansen lcsyst =intfromfile(7) 9859599516SKenneth E. Jansen allocate (ientp(neltp,nshl)) 9959599516SKenneth E. Jansen iientpsiz=neltp*nshl 10059599516SKenneth E. Jansen 10159599516SKenneth E. Jansen if (neltp==0) then 10259599516SKenneth E. Jansen writeLock=1; 10359599516SKenneth E. Jansen endif 10459599516SKenneth E. Jansen 105d5d2f64dSCameron Smith call phio_readdatablock(fhandle,fname2 // char(0), 106bc62cfd4SCameron Smith & c_loc(ientp), iientpsiz, dataInt, iotype) 10759599516SKenneth E. Jansen 10859599516SKenneth E. Jansen if(writeLock==0) then 10959599516SKenneth E. Jansen do n=1,neltp,ibksz 11059599516SKenneth E. Jansen nelblk=nelblk+1 11159599516SKenneth E. Jansen npro= min(IBKSZ, neltp - n + 1) 11259599516SKenneth E. Jansen lcblk(1,nelblk) = iel 11359599516SKenneth E. Jansen lcblk(3,nelblk) = lcsyst 11459599516SKenneth E. Jansen lcblk(4,nelblk) = ipordl 11559599516SKenneth E. Jansen lcblk(5,nelblk) = nenl 11659599516SKenneth E. Jansen lcblk(6,nelblk) = nfacel 11759599516SKenneth E. Jansen lcblk(7,nelblk) = mattyp 11859599516SKenneth E. Jansen lcblk(8,nelblk) = ndofl 11959599516SKenneth E. Jansen lcblk(9,nelblk) = nsymdl 12059599516SKenneth E. Jansen lcblk(10,nelblk) = nshl ! # of shape functions per elt 12159599516SKenneth E. Jansenc 12259599516SKenneth E. Jansenc.... allocate memory for stack arrays 12359599516SKenneth E. Jansenc 12459599516SKenneth E. Jansen allocate (mmat(nelblk)%p(npro)) 12559599516SKenneth E. Jansenc 12659599516SKenneth E. Jansen allocate (mien(nelblk)%p(npro,nshl)) 12759599516SKenneth E. Jansen allocate (mxmudmi(nelblk)%p(npro,maxsh)) 12859599516SKenneth E. Jansenc 12959599516SKenneth E. Jansenc.... save the element block 13059599516SKenneth E. Jansenc 13159599516SKenneth E. Jansen n1=n 13259599516SKenneth E. Jansen n2=n+npro-1 13359599516SKenneth E. Jansen mater=1 ! all one material for now 13459599516SKenneth E. Jansen call gensav (ientp(n1:n2,1:nshl), 13559599516SKenneth E. Jansen & mater, mien(nelblk)%p, 13659599516SKenneth E. Jansen & mmat(nelblk)%p) 13759599516SKenneth E. Jansen iel=iel+npro 13859599516SKenneth E. Jansen enddo 13959599516SKenneth E. Jansen endif 14059599516SKenneth E. Jansen deallocate(ientp) 14159599516SKenneth E. Jansen enddo 14259599516SKenneth E. Jansen 14359599516SKenneth E. Jansen lcblk(1,nelblk+1) = iel 14459599516SKenneth E. Jansen return 14559599516SKenneth E. Jansen1000 format(a80,//, 14659599516SKenneth E. Jansen & ' N o d a l C o n n e c t i v i t y',//, 14759599516SKenneth E. Jansen & ' Elem ',/, 14859599516SKenneth E. Jansen & ' Number ',7x,27('Node',i2,:,2x)) 14959599516SKenneth E. Jansen1100 format(2x,i5,6x,27i8) 15059599516SKenneth E. Jansen end 151