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 565b7f36ccSCameron 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')") 60ae8d68e4SKenneth E. Jansen! write (fname2,"('connectivity interior?')") 612efdc748SKenneth E. Jansen endif 6259599516SKenneth E. Jansen 6359599516SKenneth E. Jansen !write(*,*) 'rank, fname2',myrank, trim(adjustl(fname2)) 64d5d2f64dSCameron Smith call phio_readheader(fhandle, fname2 // char(0), 65e5afe575SCameron Smith & c_loc(intfromfile), iseven, dataInt, iotype) 6659599516SKenneth E. Jansen neltp = intfromfile(1) ! -1 if fname2 was not found, >=0 otherwise 6759599516SKenneth E. Jansen end do 6859599516SKenneth E. Jansen itpblktot = iblk-1 6959599516SKenneth E. Jansen end if 7059599516SKenneth E. Jansen 7159599516SKenneth E. Jansen if (myrank == 0) then 7259599516SKenneth E. Jansen write(*,*) 'Number of interior topologies: ',itpblktot 7359599516SKenneth E. Jansen endif 7459599516SKenneth E. Jansen 7559599516SKenneth E. Jansen nelblk=0 7659599516SKenneth E. Jansen mattyp = 0 7759599516SKenneth E. Jansen ndofl = ndof 7859599516SKenneth E. Jansen nsymdl = nsymdf 7959599516SKenneth E. Jansen 8059599516SKenneth E. Jansen do iblk = 1, itpblktot 8159599516SKenneth E. Jansen writeLock=0; 825b7f36ccSCameron Smith if(input_mode.ge.1) then 83aa9d7345SCameron Smith write (fname2,"('connectivity interior',i1)") iblk 842efdc748SKenneth E. Jansen else 852efdc748SKenneth E. Jansen write (fname2,"('connectivity interior linear tetrahedron')") 86ae8d68e4SKenneth E. Jansen! write (fname2,"('connectivity interior?')") 872efdc748SKenneth E. Jansen endif 8859599516SKenneth E. Jansen 8959599516SKenneth E. Jansen ! Synchronization for performance monitoring, as some parts do not include some topologies 9059599516SKenneth E. Jansen call MPI_Barrier(MPI_COMM_WORLD,ierr) 91d5d2f64dSCameron Smith call phio_readheader(fhandle, fname2 // char(0), 92e5afe575SCameron Smith & c_loc(intfromfile), iseven, dataInt, iotype) 9359599516SKenneth E. Jansen neltp =intfromfile(1) 9459599516SKenneth E. Jansen nenl =intfromfile(2) 9559599516SKenneth E. Jansen ipordl =intfromfile(3) 9659599516SKenneth E. Jansen nshl =intfromfile(4) 9759599516SKenneth E. Jansen ijunk =intfromfile(5) 9859599516SKenneth E. Jansen ijunk =intfromfile(6) 9959599516SKenneth E. Jansen lcsyst =intfromfile(7) 10059599516SKenneth E. Jansen allocate (ientp(neltp,nshl)) 10159599516SKenneth E. Jansen iientpsiz=neltp*nshl 10259599516SKenneth E. Jansen 10359599516SKenneth E. Jansen if (neltp==0) then 10459599516SKenneth E. Jansen writeLock=1; 10559599516SKenneth E. Jansen endif 10659599516SKenneth E. Jansen 107d5d2f64dSCameron Smith call phio_readdatablock(fhandle,fname2 // char(0), 108bc62cfd4SCameron Smith & c_loc(ientp), iientpsiz, dataInt, iotype) 10959599516SKenneth E. Jansen 11059599516SKenneth E. Jansen if(writeLock==0) then 11159599516SKenneth E. Jansen do n=1,neltp,ibksz 11259599516SKenneth E. Jansen nelblk=nelblk+1 11359599516SKenneth E. Jansen npro= min(IBKSZ, neltp - n + 1) 11459599516SKenneth E. Jansen lcblk(1,nelblk) = iel 11559599516SKenneth E. Jansen lcblk(3,nelblk) = lcsyst 11659599516SKenneth E. Jansen lcblk(4,nelblk) = ipordl 11759599516SKenneth E. Jansen lcblk(5,nelblk) = nenl 11859599516SKenneth E. Jansen lcblk(6,nelblk) = nfacel 11959599516SKenneth E. Jansen lcblk(7,nelblk) = mattyp 12059599516SKenneth E. Jansen lcblk(8,nelblk) = ndofl 12159599516SKenneth E. Jansen lcblk(9,nelblk) = nsymdl 12259599516SKenneth E. Jansen lcblk(10,nelblk) = nshl ! # of shape functions per elt 12359599516SKenneth E. Jansenc 12459599516SKenneth E. Jansenc.... allocate memory for stack arrays 12559599516SKenneth E. Jansenc 12659599516SKenneth E. Jansen allocate (mmat(nelblk)%p(npro)) 12759599516SKenneth E. Jansenc 12859599516SKenneth E. Jansen allocate (mien(nelblk)%p(npro,nshl)) 12959599516SKenneth E. Jansen allocate (mxmudmi(nelblk)%p(npro,maxsh)) 130*513954efSKenneth E. Jansen if(usingpetsc.eq.0) then 131*513954efSKenneth E. Jansen allocate (mienG(nelblk)%p(1,1)) 132*513954efSKenneth E. Jansen else 133*513954efSKenneth E. Jansen allocate (mienG(nelblk)%p(npro,nshl)) 134*513954efSKenneth E. Jansen endif 135*513954efSKenneth E. Jansen ! note mienG will be passed to gensav but nothing filled if not 136*513954efSKenneth E. Jansen ! using PETSc so this is safe 13759599516SKenneth E. Jansenc 13859599516SKenneth E. Jansenc.... save the element block 13959599516SKenneth E. Jansenc 14059599516SKenneth E. Jansen n1=n 14159599516SKenneth E. Jansen n2=n+npro-1 14259599516SKenneth E. Jansen mater=1 ! all one material for now 14359599516SKenneth E. Jansen call gensav (ientp(n1:n2,1:nshl), 14459599516SKenneth E. Jansen & mater, mien(nelblk)%p, 145*513954efSKenneth E. Jansen & mienG(nelblk)%p, 14659599516SKenneth E. Jansen & mmat(nelblk)%p) 14759599516SKenneth E. Jansen iel=iel+npro 14859599516SKenneth E. Jansen enddo 14959599516SKenneth E. Jansen endif 15059599516SKenneth E. Jansen deallocate(ientp) 15159599516SKenneth E. Jansen enddo 15259599516SKenneth E. Jansen 15359599516SKenneth E. Jansen lcblk(1,nelblk+1) = iel 15459599516SKenneth E. Jansen return 15559599516SKenneth E. Jansen1000 format(a80,//, 15659599516SKenneth E. Jansen & ' N o d a l C o n n e c t i v i t y',//, 15759599516SKenneth E. Jansen & ' Elem ',/, 15859599516SKenneth E. Jansen & ' Number ',7x,27('Node',i2,:,2x)) 15959599516SKenneth E. Jansen1100 format(2x,i5,6x,27i8) 16059599516SKenneth E. Jansen end 161