Google

C*******************************************************************
C**
C**    v e m g e n 3 d :
C**
C**  generation of a subdivision of a 3-dimensional domain with
C**  well-known boundaries into hexahedron elements. The program
C**  can easily changed for other problems. The mesh data is read
C**  by vemu02.
C**
C**   by L. Grosz                           Karlsruhe, Oct. 1994
C**
C**
C*******************************************************************
C**                            B4
C**              (0,1,1)     /      (1,1,1)
C**                     *----------*
C**                   / :  B6    / |
C**                 /   :      /   |
C**           B5  *----------*  B3 |
C**             \ |     *----|-----* (1,1,0)
C**               |   /      |   /
C**               | /  B2    | /
C**               *----------*
C**  xi3 ^  xi2         \     (1,0,0)
C**      | /             B1
C**       --xi1
C**
C**  This FORTRAN program generates an order 2 subdivison of a
C**  three dimensional domain into hexahedron elements. The domain
C**  has a parametrical representation whose domain is the unit
C**  cube [0,1]^3 in the variables (xi1,xi2,xi3). There are six
C**  boundary portions numbered from 1 to 6. Boundary 1 is
C**  represented by xi3=0, boundary 2 is represented by xi2=0,
C**  boundary 3 is represented by xi1=1, boundary 4 is represented
C**  by xi2=1, boundary 5 is represented by xi1=0 and boundary 6
C**  is reprsented by xi3=1. The parametrical representation
C**  of the domain is computed from the parametrical representions
C**  F1 and F6 of boundary 1 and 6 by a linear interpolation.
C**  The code can be adapted to other domains by entering suitable
C**  statements for F1 and F6 into the node generation.
C**
C**  The boundaries are subdivied into quadrilateral elements of
C**  order 2 and additionally all boundary nodes are specified as
C**  nodes with Dirichlet conditions. Since the Dirichlet
C**  conditions has the higher priority, the line elements will be
C**  useless in the vecfem application. But if you want to activate
C**  special boundary elements, you can remove the
C**  corresponding boundary nodes from the generation of the
C**  Dirichlet conditions.
C**
      PROGRAM VEMEXM
C**
C**-----------------------------------------------------------------
C**
      IMPLICIT NONE
C**
C**-----------------------------------------------------------------
C**
C**    some parameters which may be chanced:
C**
C**    ELEM1 = number of elements in x1 direction
C**    ELEM2 = number of elements in x2 direction
C**    ELEM3 = number of elements in x3 direction
C**    NK    = number of solution components
C**    MESH  = name of the mesh file
C**
      INTEGER        ELEM1,ELEM2,ELEM3,NK
      CHARACTER*80   MESH
      PARAMETER (NK=4)
C***
      INTEGER          Z1,Z2,Z3,N1,N2,N3,S,ELMID,D,IND
      DOUBLE PRECISION X1,X2,X3,XI1,XI2,XI3,F11,F12,F13,F61,F62,F63,PI,
     &                 ZERO,VALUE
      ZERO=0
      IND=1
C**
C**-----------------------------------------------------------------
C**
      PRINT*,'Enter number of elements in x1- , x2- and x3- direction:'
      READ(5,*) ELEM1,ELEM2,ELEM3
      PRINT*,'Name of the mesh file :'
      READ(5,'(80A)') MESH
C**
C**-----------------------------------------------------------------
C**
C**   open output file :
C**
      OPEN (99,FILE=MESH,STATUS='UNKNOWN',FORM='FORMATTED')
      PRINT*,'opened file : ',MESH
C**
C**-----------------------------------------------------------------
C**
C**** the generation of the geometrical nodes :
C**   ---------------------------------------
C**
C**  The grid is rectangular in the domain [0,1]^3 of the
C**  parametrical representation of the actual domain, where Ni
C**  is the number points in XIi direction (i=1,2,3):
C**
      N1=2*ELEM1+1
      N2=2*ELEM2+1
      N3=2*ELEM3+1

      WRITE(99,*) N1*N2*N3
C**
      DO 10 Z3=1,N3
        DO 10 Z2=1,N2
          DO 10 Z1=1,N1
            XI1=DBLE(Z1-1)/DBLE(N1-1)
            XI2=DBLE(Z2-1)/DBLE(N2-1)
            XI3=DBLE(Z3-1)/DBLE(N3-1)
C**
C**-----------------------------------------------------------------
C**
C**   here you can change the shape of the domain :
C**
C**
C**       F6(0,1) *----------* F6(1,1)
C**             / :  B6    / |
C**           /   :      /   |           if you set :
C** F6(0,0) *----------* F6(1,0)
C**         |     *----|-----* F1(1,1)     F11=XI1 F12=XI2 F13=0
C**         |   /      |   /               F61=XI1 F62=XI2 F63=1
C**         | /        | /
C** F1(0,0) *----------* F1(1,0)         you will get the unit
C**              /                       cube [0,1]^3.
C**            B1
C**
C**   Here we generate a curved channel with the unit square
C**   as sectional area. There are straight inlet and outlet
C**   of length 1. The inner radius of the curved section is
C**   1 and the outer radius is 2.
C**
C**          ------,
C**        /           ,
C**    3 -|----- ,         ,
C**       |          '  ,
C**    2 -|----- . .     , ,
C**                 .    , |
C**    1 --         |    | |
C**        /        |    |/
C**    0 -|    |    ------
C**       0    1    2    3
C**
	  PI=4.*ATAN(1.D0)
	  IF (XI1.LE.1.D0/3) THEN
	    F11=XI1*3
	    F12=XI2
	    F13=2.
	    F61=XI1*3
	    F62=XI2
	    F63=3.
	  ELSEIF (XI1.LE.2.D0/3) THEN
	    F11=1.D0+SIN((XI1*3-1)*PI/2)
	    F12=XI2
	    F13=1.D0+COS((XI1*3-1)*PI/2)
	    F61=1.+2.D0*SIN((XI1*3-1)*PI/2)
	    F62=XI2
	    F63=1.+2.D0*COS((XI1*3-1)*PI/2)
          ELSE
	    F11=2.
	    F12=XI2
	    F13=3*(1.-XI1)
	    F61=3.
	    F62=XI2
	    F63=3*(1.-XI1)
          ENDIF
C**
C**-----------------------------------------------------------------
C**
	  X1=(1.-XI3)*F11+F61*XI3
	  X2=(1.-XI3)*F12+F62*XI3
	  X3=(1.-XI3)*F13+F63*XI3
          WRITE(99,*) Z1+N1*(Z2-1)+N1*N2*(Z3-1),X1,X2,X3
 10   CONTINUE
C**
      PRINT*,'written nodes : ',N1*N2*N3
C**
C**-----------------------------------------------------------------
C**
C**** the generation of the elements :
C**   -------------------------------
C**
C**   The domain is covered by hexahedron elements of order 2
C**   and consequently the boundaries are described by
C**   quadrilateral elements of order 2. The succesion of the
C**   nodes in the element is defined in vemu02 and vembuild(3).
C**   The lowest node id in an element is S.
C**
C**   There are two different element types:
C**
      WRITE(99,*) 2
C**
C**   These are the hexahedron elements:
C**
C**   ELMID is the element id number, which allows to recognize
C**   an element after the distribution to the processors.
C**
      WRITE(99,*) ELEM1*ELEM2*ELEM3,3,8,20

      DO 20 Z3=1,ELEM3
        DO 20 Z2=1,ELEM2
          DO 20 Z1=1,ELEM1

            S=2*(Z1-1)+2*(Z2-1)*N1+2*N1*N2*(Z3-1)+1
  	    ELMID=Z1+ELEM1*(Z2-1)+ELEM1*ELEM2*(Z3-1)

	    WRITE(99,'(22I5)') ELMID,IND,
     &       S,S+2,S+2*N1+2,S+2*N1,
     &       S+2*N1*N2,S+2*N1*N2+2,S+2*N1*N2+2*N1+2,S+2*N1*N2+2*N1,
     &       S+1,S+N1+2,S+2*N1+1,S+N1,
     &       S+N1*N2,S+N1*N2+2,S+N1*N2+2*N1+2,S+N1*N2+2*N1,
     &       S+2*N1*N2+1,S+2*N1*N2+N1+2,S+2*N1*N2+2*N1+1,S+2*N1*N2+N1

 20   CONTINUE
C**
      PRINT*,'written hexahedron elements : ',ELEM1*ELEM2*ELEM3
C**
C**-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
C**
C**   These are the quadrilateral elements:
C**
      WRITE(99,*) 2*(ELEM1*ELEM2+ELEM1*ELEM3+ELEM2*ELEM3),2,4,8
C**
      DO 31 Z2=1,ELEM2
        DO 31 Z1=1,ELEM1
C**
C****  elements on boundary 1:
C**
          S=2*(Z1-1)+2*(Z2-1)*N1+1
          ELMID=Z1+ELEM1*(Z2-1)+ELEM1*ELEM2*ELEM3
          WRITE(99,*) ELMID,IND,
     &     S,S+2*N1,S+2*N1+2,S+2,S+N1,S+2*N1+1,S+N1+2,S+1
C**
C****  elements on boundary 6:
C**
          S=2*(Z1-1)+2*(Z2-1)*N1+2*N1*N2*ELEM3+1
  	  ELMID=Z1+ELEM1*(Z2-1)+ELEM1*ELEM2+ELEM1*ELEM2*ELEM3
	  WRITE(99,*) ELMID,IND,
     &     S,S+2,S+2*N1+2,S+2*N1,S+1,S+N1+2,S+2*N1+1,S+N1

 31   CONTINUE
      DO 32 Z3=1,ELEM3
        DO 32 Z2=1,ELEM2
C**
C****  elements on boundary 5:
C**
          S=2*(Z2-1)*N1+2*N1*N2*(Z3-1)+1
          ELMID=Z2+ELEM2*(Z3-1)+2*ELEM1*ELEM2+ELEM1*ELEM2*ELEM3

	  WRITE(99,*) ELMID,IND,
     &     S,S+2*N1*N2,S+2*N1*N2+2*N1,S+2*N1,
     &     S+N1*N2,S+2*N1*N2+N1,S+N1*N2+2*N1,S+N1
C**
C****  elements on boundary 3:
C**
          S=2*ELEM1+2*(Z2-1)*N1+2*N1*N2*(Z3-1)+1
  	  ELMID=Z2+ELEM2*(Z3-1)+
     &                      ELEM2*ELEM3+2*ELEM1*ELEM2+ELEM1*ELEM2*ELEM3

	  WRITE(99,*) ELMID,IND,
     &     S,S+2*N1,S+2*N1*N2+2*N1,S+2*N1*N2,
     &     S+N1,S+N1*N2+2*N1,S+2*N1*N2+N1,S+N1*N2

 32   CONTINUE
      DO 33 Z3=1,ELEM3
        DO 33 Z1=1,ELEM1

C**
C****  elements on boundary 2:
C**
        S=2*(Z1-1)+2*N1*N2*(Z3-1)+1
  	ELMID=Z3+ELEM3*(Z1-1)+
     &                    2*ELEM2*ELEM3+2*ELEM1*ELEM2+ELEM1*ELEM2*ELEM3

	WRITE(99,*) ELMID,IND,
     &   S,S+2,S+2*N2*N1+2,S+2*N1*N2,
     &   S+1,S+N1*N2+2,S+2*N2*N1+1,S+N1*N2
C**
C****  elements on boundary 4:
C**
        S=2*(Z1-1)+2*ELEM2*N1+2*N1*N2*(Z3-1)+1
  	ELMID=Z3+ELEM3*(Z1-1)+
     &      ELEM1*ELEM3+2*ELEM2*ELEM3+2*ELEM1*ELEM2+ELEM1*ELEM2*ELEM3

	WRITE(99,*) ELMID,IND,
     &   S,S+2*N1*N2,S+2*N1*N2+2,S+2,
     &   S+N1*N2,S+2*N2*N1+1,S+N1*N2+2,S+1
 33   CONTINUE
C**
      PRINT*,'written quadrilateral elements : ',
     &                    2*(ELEM1*ELEM2+ELEM1*ELEM3+ELEM2*ELEM3)
C**
C**-----------------------------------------------------------------
C**
C**   generation of the nodes with Dirichlet conditions :
C**   -------------------------------------------------
C**
C**   Here we generate the Dirichlet conditions for 3D Navier-
C**   Stokes equation. The components 1,2,3 are the velocity
C**   compontents in x1,x2,x3 direction. The velocity is prescribed
C**   on the total boundary. The fourth component is the pressure,
C**   which is set on a single point. The real parameter is used
C**   to specify the velocity at the inlet (v1,v2,v3)=(val,0,0,0)
C**   and the outlet (v1,v2,v3)=(0,val,0), where val is the
C**   parabolic bubble over the sectional area. The program can be
C**   easily adapted to other nodes selections and other input or
C**   output profiles.
C**
      WRITE(99,*) NK
C**
C**   First the velocity components 1,2,3 :
C**
      DO 40 D=1,NK-1
C**
        WRITE(99,*) 2*((N1-1)*(N2-1)+(N1-1)*(N3-1)+(N2-1)*(N3-1)+1)
C**
        DO 41 Z2=1,N2-1
          DO 41 Z1=1,N1-1
            WRITE(99,*) Z1+N1*(Z2-1),ZERO
            WRITE(99,*) N1*N2*N3+1-Z1-N1*(Z2-1),ZERO
   41   CONTINUE
        DO 42 Z3=1,N3-1
          DO 42 Z1=1,N1-1
            WRITE(99,*) N1*N2*(N3-1)-N1*N2*(Z3-1)+Z1,ZERO
            WRITE(99,*) N1*N2*Z3-Z1+1,ZERO
   42   CONTINUE
        DO 43 Z3=1,N3-1
          DO 43 Z2=1,N2-1
            XI2=DBLE(Z2-1)/DBLE(N2-1)
            XI3=DBLE(Z3-1)/DBLE(N3-1)
	    VALUE=XI2*(XI2-1)*XI3*(XI3-1)*16
	    IF (D.EQ.1) THEN
              WRITE(99,*) N1*N2*N3-N1*N2*(Z3-1)-N1*Z2+1,VALUE
              WRITE(99,*) N1*N2*(Z3-1)+N1*Z2,ZERO
	    ELSEIF (D.EQ.3) THEN
              WRITE(99,*) N1*N2*N3-N1*N2*(Z3-1)-N1*Z2+1,ZERO
              WRITE(99,*) N1*N2*(Z3-1)+N1*Z2,-VALUE
            ELSE
              WRITE(99,*) N1*N2*N3-N1*N2*(Z3-1)-N1*Z2+1,ZERO
              WRITE(99,*) N1*N2*(Z3-1)+N1*Z2,ZERO
            ENDIF
   43   CONTINUE
        WRITE(99,*) N1*(N2-1)+1,ZERO
        WRITE(99,*) N1*N2*(N3-1)+N1,ZERO
C**
        PRINT*,2*((N1-1)*(N2-1)+(N1-1)*(N3-1)+(N2-1)*(N3-1)+1),
     &                         ' Dirichlet conditions for component ',d
40    CONTINUE
C**
C**   Only one Dirichlet condition for the fourth component:
C**
      WRITE(99,*) 1
      WRITE(99,*) 2*((ELEM1+1)/2-1)+2*((ELEM2+1)/2-1)*N1+
     &                        2*N1*N2*((ELEM2+1)/2-1)+1,ZERO
        PRINT*,1,' Dirichlet condition for component ',NK
C**
C**-----------------------------------------------------------------
C**
C**** end of calculation
C**   ------------------
C**