Note: For the definition of several blocks, solutions defined on mesh nodes, must be identical in each block.
A structured block is defined by a matrix of points:
parameter (ndimax=3, idimax=2, jdimax=2, kdimax=2) integer unit1 real coor1(ndimax,idimax,jdimax,kdimax) real q(idimax, jdimax, kdimax, 1) c unit1 = 20 nblock = 1 rewind(unit1) write (unit1) nblock itype = 1 nnu = 1 nnufr = 0 npatch = 0 idim = 2 jdim = 2 kdim = 2 ndim = 3 c dx = 2./(idim-1) dy = 2./(jdim-1) dz = 2./(kdim-1) do 100 i=1,idim x = (i-1)*dx do 100 j=1,jdim y = (j-1)*dy do 100 k=1,kdim z = (k-1)*dz coor1(1,i,j,k) = x coor1(2,i,j,k) = y coor1(3,i,j,k) = z c evaluation of q(i,j,k,1) 100 continue write (unit1) itype, nnu, nnufr, npatch write (unit1) idim, jdim, kdim, ndim write (unit1) ((((coor1(l,i,j,k),l=1,ndim), * i=1,idim),j=1,jdim),k=1,kdim) write (unit1) ((((q(i,j,k,nu),i=1,idim),j=1,jdim), * k=1,kdim), nu=1,nnu) c stop end
c c c NOTE In this example, there are only two variables (named q c and qfr hereafter). q contains the set of variable in c the whole field, it has nnu unknown for each grid point. c The variable qfr contains other variable on specific c surface S of the mesh (inflow, outflow, wall,etc~...). c It contains nnufr variables to be stored at the grid c points of the surface S. c The unit number(s) below (unit1 and unit2) are arbitrary c and to be selected by the participant. c c ************************************************************** c real coor1(ndimax,idimax,jdimmax,kdimax),coor2(ndimax,nnodesmax) real q1(idimax,jdimax,kdimax,nnumax),q2(nnodesmax,nnumax) real q1fr(idifrmax,jdifrmax,kdifrmax,nnufrmax),q2fr(6, &nnufrmax,nfacmax) integer nnperlement(6),ietyp(nelemax),iconnec(6*nelemax) integer iconnecp(nelemax) ,ibegfr(npatchmax),iendfr(npatchmax) & ,jbegfr(npatchmax),jendfr(npatchmax), & kbegfr(npatchmax),kendfr(npatchmax) character*30 name(100) integer npoint(npointmax) real curv(npointmax,ncurvmax) c c parameters c ---------- c c ndimax : space dimension (1,2 or 3) c idimax,jdimax,kdimax : maximum of indices in the i,j,k direction, c structured meshes c idifrmax,jdifrmax, c kdifrmax : maximum of indices in the ifr,jfr,kfr direction, c : structured mesh for S c nnodesmax : maximum number of nodes, unstructured meshes c nnodesfrmax : maximum number of nodes on S, unstructured c meshes c nelemax : maximum number of element, ustructured meshes c nnumax, c nnufrmax : maximum number of variables c nfacmax : maximum number of elements on S c npatchmax : maximum number of patches (structured meshes) c c arrays c ------ c coor1,coor2 : x,y,z coordinates c q1,q2,q1fr,q2fr : array of variables c nnperlement : number of nodes per element c ietyp : define for a given element its type c iconnec : connectivity table c iconnecp(nelemax) : connectivity table pointer c iconnecpfac(nfacmax) : connectivity table pointer for the frontier c nufac(6,nfacmax) : connectivity table for the frontier c logfac(nfacmax) : logic type of the frontier elements c name : name of the variables in file unit2 c curv : values of variables in file unit2 c npoint : number of value on the curves curv(*,*) c ibegfr,...kendfr : extreme indices of surfaces where surface c values are asked for. c c note : the dimension 6*nelemax for iconnec has to be related to the c size of nnperlement. c c *************************************************************** c open (unit1,file='soldata',form='unformatted') c c Number of blocks. Note that blocks should be either structured c or unstructured, but one database file can contain both c structured and unstructured blocks c c read (unit1) nblock c do 103 nb=1,nblock c c Read type of block, and number of unknowns stored for this block c c itype = 0: Unstructured mesh c 1: Structured mesh c nnu = number of unknowns stored c nnufr = number of unknown stored on the frontier c read (unit1) itype,nnu,nnufr,npatch c c ****************************************************************** c Structured mesh c ****************************************************************** c c idim,jdim,kdim : indexes for the nodes c ndim : dimension of the problem c ibegfr,jbegfr, kbegfr : first indexes of the nodes of the frontier c iendfr,jendfr,kendfr : last indexes of the nodes of the frontier c c Assumed : npatch number of frontier per block c******** c may be done ibegfr(ntypefr),jbegfr(ntypefr), kbegfr(ntypfr) c iendfr(ntypefr),jendfr(ntypefr), kendfr(ntypfr) c where ntypefr : nbre of frontier of interest c if (itype .eq. 1) then read (unit1) idim,jdim,kdim,ndim read (unit1) ((((coor1(l,i,j,k),l=1,ndim) * i=1,idim),j=1,jdim),k=1,kdim) read (unit1) ((((q(i,j,k,nu),i=1,idim),j=1,jdim), * k=1,kdim),nu=1,nnu) do 2 np=1,npatch read (unit1) ibegfr(np),iendfr(np), jbegfr(np), * jendfr(np),kbegfr(np),kendfr(np) read (unit1) ((((q1fr(i,j,k,nu),i=ibegfr(np),iendfr(np)), * j=jbegfr(np),jendfr(np)), * k=kbegfr(np),kendfr(np)),nu=1,nnufr) 2 continue c c c ****************************************************************** c Unstructured mesh c ****************************************************************** c else c c nelemtypes = number of element types c nelem = number of elements c nnodes = number of nodes c nfac = number of facets on the frontier c nnodesfr = number of nodes on the frontier where data is stored c they correspond to type of frontiers that are given c by the next paragraph, problem per problem c remark : only on frontier is assumed to be of interest c same remarks as for structured c read (unit1) nnodes,nelem,nelemtypes,nfac,nnodesfr,ndim c read (unit1) ((coor(l,i),l=1,ndim),i=1,nnodes) read (unit1) ((q(i,nu),i=1,nnodes),nu=1,nnu) C MODIFICATION C read(unit1) ((q2fr(i,nu),i=1,nnodesfr),nu=1,nnufr) c c Element names implicitly define the element characteristics: c c HE8 8-noded (linear) 3D hex-cube cell c TE4 4-noded (linear) 3D tetrahedral cell c T3 3-noded triangular 2D cell c Q4 4-noded quadrilateral 2D cell c P5 5-noded pyramid element c P6 6-noded prismatic element c c itypel = element type number in table c (order is 1=HE8, 2=TE4, 3=T3, 4=Q4, 5=P5, 6=P6) c The ordering of the nodes are defined implicitely, so that c the faces of the element itypel are known at priory (see figure) c nnperelement(1)=8 nnperelement(2)=4 nnperelement(3)=3 nnperelement(4)=4 nnperelement(5)=5 nnperelement(6)=6 c c read the connectivity table c iptr=0 do 203 iel=1,nelem read (unit1) itypel ietype(iel) =itypel iconnecp(iel) =iptr+1 read (unit1) (iconnec(iptr+i),i=1,nnperelement(itypel) iptr = iptr + nnperelement(itypel) 203 continue c c logic of facet c c logfac= 1 : entrance facet c logfac=-1 : symmetry facet c logfac= 2 : outflow facet c logfac= 3 : freestream facet c logfac= 4 : wall nodes (no slip condition) c logfac= 5 : wall nodes (velocity=0) c iptr=0 do 204 ifac=1,nfac read(unit1) itypel ietypfac(ifac)=itypel iconnecpfac(ifac)=iptr+1 read(unit1) logfac(ifac) read(unit1)((nufac(l,ifac),l=1,nnperelement(itypel)) 204 continue c c values on frontiers MODIFICATIONS c do 205 ifac=1,nfac itypel=ietypfac(ifac) read(unit1)((q2fr(l,nn,ifac),l=1,nnperelement(itypel)),nn=1,nnufr) 205 continue end if c 103 continue close(unit1) c c Quality control data sets (residu curves, lift, drag, etc, as c function of the time step), for the whole simulation on the c ASCII file unit2 c c ncurves : number of different variables c c open (unit2,file='history',form='formatted') c read (unit2,'(i4)') ncurves do 303 ncurv=1,ncurves read (unit2,'(i6,a30)') npoint(ncurv),name(ncurv) read (unit2,'(5e15.8)') (curv(i,ncurv),i=1,npoint) 303 continue c close(unit2) c