Google

C*******************************************************************
C**
C**    v e m e 0 0 e x m 0 9
C**
C**  solution of a 2-dimensional, linear structural analysis
C**  problem with element depending material coefficients. The mesh
C**  is generated by this program.
C**
C**   by L. Grosz                         Karlsruhe, June 1995
C**
C*******************************************************************
C**
C**   Here we give an example for the use of veme00 to solve
C**   a 2D linear structural analysis problems for a curved beam
C**   tracted by a surface load (plane stress, NK=DIM=2). The
C**   components of the solution vector u=(u1,u2) are the
C**   displacements of the body in the directions x1, x2.
C**   The vector of distortions in the global Cartesian
C**   coordinates is defined by
C**
C**    eps1  = u1x1
C**    eps2  = u2x2
C**    eps12 = (u2x1+u1x2)/2
C**
C**   where the notations of equation are used. Corresponding
C**   the stress vector has the form (s1,s2,s12). By Hook's law
C**   the stress and distortion vector corresponds for isotropic
C**   materials by
C**
C**    | s1  |       | C11  C12   0     |   | eps1  |
C**    | s2  |       | C12  C11   0     |   | eps2  |
C**    | s12 |       |  0    0   2*C44  |   | eps12 |
C**
C**   where the C-entries are given by the two values E and NY
C**   called modulus of elasticity and Poisson's number.
C**
C**  If the body is tracted by a suface load p=(p1,p2) the
C**  displacement of the body is the solution of the linear
C**  functional equation L(v,u)=F(v) with
C**
C**   L(v,u)=area{ v1x1 * s1  + v1x2 * s12 +
C**                v2x1 * s12 + v2x2 * s2  }
C**  [1]
C**
C**   F(v)=line{ v1 * p1 + v2 * p2 }.
C**
C**  Additionally u has to fulfill the prescribed Dirichlet
C**  conditions, which gives the restraint conditions for the
C**  displacement of the body, see equation, veme00.
C**
C**  The domain is a curved 2D beam of length L and height H. The
C**  boundaries along the beam are parabolic curve:
C**
C**
C**            p=(p1,p2)=(0,-1)      surface load
C**         |||||||||||||||
C**
C**             / --  \
C**           /         \
C**         /     ---     \   +
C**   +     |    /   \    |   | H0
C** H |     |  /       \  |   |
C**   +      /           \    +
C**
C**         +-------------+
C**                L
C**
C**  The example program generates a subdivision of the beam into
C**  quadrilateral element and the upper edge into line elements,
C**  where the surface load p=(p1,p2) attacks. The modulus of
C**  elasticity and the Poisson's number depend on the element.
C**  They are the average values on this element. The values
C**  will be set by a random sample, which is used in the
C**  simulation of wooden beams. The generated mesh and the
C**  computed displacements and the stresses are written to the
C**  I-DEAS universal files.
C**
      PROGRAM VEMEXM
C**
C**-----------------------------------------------------------------
C**
      IMPLICIT NONE
      include 'bytes.h'
C**
C**-----------------------------------------------------------------
C**
C**  Set the dimensions of the beam:
C**
      DOUBLE PRECISION L,H,H0

      PARAMETER (L=10,H=1,H0=.6)
C**
C**-----------------------------------------------------------------
C**
C**    some parameters which may be chanced:
C**
C**    ELEM1 = number of elements along the beam.
C**    ELEM2 = number of elements along the beam height.
C**    STORE = total storage of process in Mbytes.
C**
      INTEGER       ELEM1,ELEM2,STORE

      PARAMETER (ELEM2=4,
     &           ELEM1=ELEM2*(L/H),
     &           STORE=5)
C**
C**   ELEM1 is selected, so that the elements are nearly
C**   square.
C**
C**-----------------------------------------------------------------
C**
C**    N1 = number of nodes along the beam
C**    N2 = number of nodes in direction beam height
C**
C**    other parameters are explained in mesh.
C**
      INTEGER       N1,N2,NK,DIM,NN,LOUT

      PARAMETER (N1=2*ELEM1+1,
     &           N2=2*ELEM2+1,
     &           NK=2,
     &           DIM=2,
     &           NN=N1*N2,
     &           LOUT=6)
C**
C**-----------------------------------------------------------------
C**
C**   the length of the array for the mesh are set:
C**
      INTEGER       LU,LDISP,LSTRES,LNODN,LNOD,LNOPRM,LNEK,LRPARM,
     &              LIPARM,LDNOD,LIDPRM,LRDPRM,LIVEM,LRVEM,LLVEM,LBIG

      PARAMETER  (LU    =NN*NK,
     &            LDISP =NN*3,
     &            LSTRES=NN*6,
     &            LNODN =NN,
     &            LNOD  =NN*DIM,
     &            LNOPRM=1,

     &            LNEK=(8*(ELEM1*ELEM2+1)+3*(ELEM1+1))*2,
     &            LIPARM=ELEM1*ELEM2+ELEM1+2,
     &            LRPARM=2*(ELEM1*ELEM2+1),

     &            LDNOD =2*NK*2,
     &            LIDPRM=1,
     &            LRDPRM=1,

     &            LIVEM =700+LU+LDNOD/2,
     &            LLVEM =500,
     &            LRVEM =60)
C**
C**-----------------------------------------------------------------
C**
C**   RBIG should be as large as possible: the available
C**   storage STORE is reduced by all allocated array.
C**   the remaining storage is reserved for RBIG.
C**
      PARAMETER ( LBIG=(STORE * 1 000 000)/IREAL
     &               - (LU+LDISP+LSTRES+LNOD+LNOPRM+LRPARM+LRDPRM)
     &               - (LIVEM+LNODN+LNEK+LIPARM+LDNOD+LIDPRM)/RPI )
C**
C**-----------------------------------------------------------------
C**
C**      variables and arrays :
C**      --------------------
C**
      DOUBLE PRECISION T,NOD(LNOD),NOPARM(LNOPRM),RPARM(LRPARM),
     &                 RDPARM(LRDPRM),RBIG(LBIG),U(LU),RVEM(LRVEM),
     &                 GDISP(LDISP),ESTRES(LSTRES)

      INTEGER          IVEM(LIVEM),NODNUM(LNODN),NEK(LNEK),
     &                 IPARM(LIPARM),DNOD(LDNOD),IDPARM(LIDPRM),
     &                 IBIG(RPI*LBIG)

      LOGICAL          MASKL(NK,NK,2),MASKF(NK,2),LVEM(LLVEM)
C***
      INTEGER          INFO,S,NE1,ADNEK1,NE2,ADNEK2,ADIVP2,ADIVP1,NDC1,
     &                 NDC2,ADDCG1,ADDCG2,MYPROC,Z1,Z2,NGROUP,MESH,
     &                 GINFO,GINFO1,DINFO,DINFO1,ELNUM,ADRVP1
      DOUBLE PRECISION E0,NY0,X1,X2
      CHARACTER*80     TEXT1,TEXT2,NAME
C***
      EXTERNAL VEM630,VEM500
      EXTERNAL DUMMY,USERB,USERL,USERF,USERC,DISP,STRESS
C**
C**-----------------------------------------------------------------
C**
C**  The equivalence of RBIG and IBIG is very important :
C**
      EQUIVALENCE (RBIG,IBIG)
C**
C**-----------------------------------------------------------------
C**
C**  set the average value of E-modulus and the Poisson's number:
C**
      E0=1.93D4
      NY0=.3
C**
C**-----------------------------------------------------------------
C**
C**   get task ids :
C**
      NAME='a.out'
      CALL COMBGN(IVEM(200),MYPROC,LIVEM-203,IVEM(204),NAME,INFO)
      IF (INFO.NE.0) GOTO 9999
      IVEM(201)=MYPROC
      IVEM(202)=0
      IVEM(203)=IVEM(204)
      IF (IVEM(200).NE.1) THEN
	PRINT*,'This program does not run on a parallel computer !'
        GOTO 9999
      ENDIF
C**
C**-----------------------------------------------------------------
C**
C**** set some VECFEM parameters for mesh management:
C**   ----------------------------------------------
C**
      MESH  =210
      NGROUP=2
      GINFO =30
      GINFO1=23+2*NK
      DINFO =GINFO+GINFO1*NGROUP
      DINFO1=17
C**
C**-----------------------------------------------------------------
C**
C**** the parameters are copied into IVEM :
C**   -----------------------------------
C**
      IVEM(1)=MESH
      IVEM(MESH+ 1)=N1*N2
      IVEM(MESH+ 2)=NK
      IVEM(MESH+ 3)=DIM
      IVEM(MESH+ 4)=NGROUP
      IVEM(MESH+ 5)=NN
      IVEM(MESH+13)=NN
      IVEM(MESH+14)=0
      IVEM(MESH+15)=0
      IVEM(MESH+18)=0

      IVEM(MESH+21)=GINFO
      IVEM(MESH+22)=GINFO1
      IVEM(MESH+23)=DINFO
      IVEM(MESH+24)=DINFO1
C**
C**-----------------------------------------------------------------
C**
C**** the generation of the geometrical nodes :
C**   ---------------------------------------
C**
      DO 10 Z2=1,N2
        DO 10 Z1=1,N1

          X1=DBLE(Z1-1)/DBLE(N1-1)
          X2=DBLE(Z2-1)/DBLE(N2-1)

          NOD(Z1+N1*(Z2-1)   )= L  * (X1-0.5)
          NOD(Z1+N1*(Z2-1)+NN)= 4. * (1.-X1)*X1 * H0 + H*X2

          NODNUM(Z1+N1*(Z2-1))=Z1+N1*(Z2-1)
 10   CONTINUE
C**
C**-----------------------------------------------------------------
C**
C**** the generation of the elements :
C**   -------------------------------
C**
C**   The domain is covered by quadrilateral elements of order 2
C**   and the upper boundary, where the surface load attacks,
C**   is described by line elments of order 2. The following
C**   picture illustrates the construction of the quadrilateral
C**   element with lower node S:
C**
C**       S+2*N1   S+2*N1+1   S+2*N1+2
C**            4-----7-----3
C**            |           |
C**      S+N1  8           6  S+N1+2
C**            |           |
C**            1-----5-----4
C**            S     S+1      S+2
C**
C**   ADNEK1 defines the start address of the quadrilateral
C**   elements in NEK and ADIVP1 defines the start address of
C**   the element id number assigned to the elements. The element
C**   id number is unique. Since the modulus of elasticity and the
C**   Poisson's number varry with the elements, they are assigned
C**   to the elements as real vector parameter (NRVP=2). ADRVP1
C**   sets the address of the first parameter. NE1 is the number
C**   of quadrilateral elements. ELNUM counts the elements in
C**   group 1:
C**
      ADNEK1=1
      ADIVP1=1
      ADRVP1=1
      NE1=ELEM1*ELEM2

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

          ELNUM=Z1+ELEM1*(Z2-1)
          S   =2*(Z1-1) + 2*(Z2-1) * N1 + 1

          IPARM(ADIVP1-1+ELNUM)=ELNUM

          NEK(ADNEK1-1+ELNUM      )=S
          NEK(ADNEK1-1+ELNUM+  NE1)=S         + 2
          NEK(ADNEK1-1+ELNUM+2*NE1)=S + 2 *N1 + 2
          NEK(ADNEK1-1+ELNUM+3*NE1)=S + 2 *N1
          NEK(ADNEK1-1+ELNUM+4*NE1)=S         + 1
          NEK(ADNEK1-1+ELNUM+5*NE1)=S +    N1 + 2
          NEK(ADNEK1-1+ELNUM+6*NE1)=S + 2 *N1 + 1
          NEK(ADNEK1-1+ELNUM+7*NE1)=S +    N1
C**
C**       The modulus of elasticty and the Poisson's number on
C**       the element is set by a random sample, so that the
C**       average value will be E0 and NY0 with a dispersion of
C**       of 20%. Actually we have only realized an idea of
C**       of this model.
C**
          RPARM(ADRVP1-1+ELNUM    )= E0  * (1.+.2*SIN(FLOAT(Z1**2+Z2)))
          RPARM(ADRVP1-1+ELNUM+NE1)= NY0 * (1.+.2*SIN(FLOAT(Z1+Z2**2)))
 20   CONTINUE
C**
C**   ADNEK2 defines the start address of the line elements
C**   in NEK and ADIVP2 defines the start address of the
C**   element id number assigned to the elements. The entries 1 to
C**   8*NE1 in NEK and 1 to NE1 in IPARM are already used by
C**   the elements in group 1. NE2 is the number of line elements
C**   on the upper boundary.
C**
C**             S    S+1   S+2
C**             2-----3-----1
C**
      ADNEK2=ADNEK1+8*NE1
      ADIVP2=ADIVP1+NE1
      NE2=ELEM1

      DO 34 Z1=1,ELEM1
        S   =2*(Z1-1) + (N2-1) * N1 + 1

        IPARM(ADIVP2-1+Z1)=Z1+ELEM1*ELEM2

        NEK(ADNEK2-1+Z1      )=S + 2
        NEK(ADNEK2-1+Z1+  NE2)=S
        NEK(ADNEK2-1+Z1+2*NE2)=S + 1
 34   CONTINUE
C**
C**-----------------------------------------------------------------
C**
C**   the start addresses, etc are written to IVEM:
C**   --------------------------------------------
C**
C**   group 1: quadrilateral elements
C**
      IVEM(MESH+GINFO   ) = NE1
      IVEM(MESH+GINFO+ 1) = 8
      IVEM(MESH+GINFO+ 2) = 4
      IVEM(MESH+GINFO+ 3) = 2
      IVEM(MESH+GINFO+ 4) = ADNEK1
      IVEM(MESH+GINFO+ 5) = NE1
      IVEM(MESH+GINFO+ 8) = 0
      IVEM(MESH+GINFO+ 9) = ADRVP1
      IVEM(MESH+GINFO+10) = NE1
      IVEM(MESH+GINFO+11) = 2
      IVEM(MESH+GINFO+13) = 0
      IVEM(MESH+GINFO+14) = ADIVP1
      IVEM(MESH+GINFO+15) = NE1
      IVEM(MESH+GINFO+16) = 1
      IVEM(MESH+GINFO+20) = ADNEK1
      IVEM(MESH+GINFO+21) = NE1
      IVEM(MESH+GINFO+23) = 8
C**
C**   group 2: line elements
C**
      IVEM(MESH+GINFO+GINFO1   ) = NE2
      IVEM(MESH+GINFO+GINFO1+ 1) = 3
      IVEM(MESH+GINFO+GINFO1+ 2) = 2
      IVEM(MESH+GINFO+GINFO1+ 3) = 1
      IVEM(MESH+GINFO+GINFO1+ 4) = ADNEK2
      IVEM(MESH+GINFO+GINFO1+ 5) = NE2
      IVEM(MESH+GINFO+GINFO1+ 8) = 0
      IVEM(MESH+GINFO+GINFO1+11) = 0
      IVEM(MESH+GINFO+GINFO1+13) = 0
      IVEM(MESH+GINFO+GINFO1+14) = ADIVP2
      IVEM(MESH+GINFO+GINFO1+15) = NE2
      IVEM(MESH+GINFO+GINFO1+16) = 1
      IVEM(MESH+GINFO+GINFO1+20) = ADNEK2
      IVEM(MESH+GINFO+GINFO1+21) = NE2
      IVEM(MESH+GINFO+GINFO1+23) = 3
C**
C**-----------------------------------------------------------------
C**
C**   generation of the nodes with Dirichlet conditions :
C**   -------------------------------------------------
C**
C**   NDC1/NDC2 counts the Dirichlet condition generated for
C**   component 1/2. ADDCG1/ADDCG2 gives the start address of
C**   node ids in DNOD.
C**
C**   for component 1 the left and the right contact point of the
C**   get Dirichlet conditions:
C**
      NDC1=1
      ADDCG1=1
      DNOD(ADDCG1  )=1
C**
C**   for component 2 the left contact point of the beam get a
C**   Dirichlet condition:
C**
      NDC2=2
      ADDCG2=NDC1+ADDCG1
      DNOD(ADDCG2  )=1
      DNOD(ADDCG2+1)=N1
C**
C**-----------------------------------------------------------------
C**
C**   the start addresses,etc are written to IVEM:
C**
C**   component 1:
C**
      IVEM(MESH+DINFO   ) = NDC1
      IVEM(MESH+DINFO+ 1) = ADDCG1
      IVEM(MESH+DINFO+ 2) = ADDCG1
      IVEM(MESH+DINFO+ 4) = 0
      IVEM(MESH+DINFO+ 7) = 0
      IVEM(MESH+DINFO+ 9) = 0
      IVEM(MESH+DINFO+12) = 0
C**
C**   component 2:
C**
      IVEM(MESH+DINFO+DINFO1   ) = NDC2
      IVEM(MESH+DINFO+DINFO1+ 1) = ADDCG2
      IVEM(MESH+DINFO+DINFO1+ 2) = ADDCG2
      IVEM(MESH+DINFO+DINFO1+ 4) = 0
      IVEM(MESH+DINFO+DINFO1+ 7) = 0
      IVEM(MESH+DINFO+DINFO1+ 9) = 0
      IVEM(MESH+DINFO+DINFO1+12) = 0
C**
C**-----------------------------------------------------------------
C**
C**** print mesh :
C**   ----------
C**
      IVEM(20)=LOUT
      IVEM(21)=1111
      IVEM(22)=2

      CALL VEMU01(LIVEM,IVEM,LNEK,NEK,LRPARM,RPARM,LIPARM,IPARM,
     &            LDNOD,DNOD,LRDPRM,RDPARM,LIDPRM,IDPARM,
     &            LNODN,NODNUM,LNOD,NOD,LNOPRM,NOPARM,LBIG,RBIG,IBIG)
      IF (IVEM(2).NE.0) GOTO 9999
C**
C**-----------------------------------------------------------------
C**
C**** distribute mesh :
C**   ----------------
C**
      IVEM(80)=LOUT
      IVEM(81)=1
      IVEM(51)=2

      CALL VEMDIS (LIVEM,IVEM,LNEK,NEK,LRPARM,RPARM,LIPARM,IPARM ,
     &             LDNOD,DNOD,LRDPRM,RDPARM,LIDPRM,IDPARM,
     &             LNODN,NODNUM,LNOD,NOD,LNOPRM,NOPARM,
     &             LBIG,RBIG,IBIG)
      IF (IVEM(2).NE.0) GOTO 9999
C**
C**-----------------------------------------------------------------
C**
C**** call of VECFEM :
C**   --------------
C**
      OPEN(10,FORM='UNFORMATTED',STATUS='SCRATCH')
      OPEN(11,FORM='UNFORMATTED',STATUS='SCRATCH')

      LVEM(1)=.TRUE.
      LVEM(5)=.FALSE.
      LVEM(9)=.FALSE.
      RVEM(3)=1.D-4
      IVEM(3)=0
      IVEM(10)=10
      IVEM(11)=11
      IVEM(40)=LOUT
      IVEM(41)=100
      IVEM(45)=500
      IVEM(46)=0
      IVEM(52)=1
      IVEM(70)=123
      IVEM(71)=1
      IVEM(72)=10 000

      MASKL(1,1,1)=.TRUE.
      MASKL(1,2,1)=.TRUE.
      MASKL(2,1,1)=.TRUE.
      MASKL(2,2,1)=.TRUE.
      MASKL(1,1,2)=.FALSE.
      MASKL(1,2,2)=.FALSE.
      MASKL(2,1,2)=.FALSE.
      MASKL(2,2,2)=.FALSE.
      MASKF(1,1)=.FALSE.
      MASKF(2,1)=.FALSE.
      MASKF(1,2)=.FALSE.
      MASKF(2,2)=.TRUE.

      CALL VEME00 (T,LU,U,
     &             LIVEM,IVEM,LLVEM,LVEM,LRVEM,RVEM,
     &             LNEK, NEK ,LRPARM ,RPARM ,LIPARM ,IPARM ,
     &             LDNOD,DNOD,LRDPRM,RDPARM,LIDPRM,IDPARM,LNODN,
     &             NODNUM,LNOD,NOD,LNOPRM,NOPARM,LBIG,RBIG,IBIG,
     &             MASKL,MASKF,USERB,USERL,USERF,
     &             VEM500,VEM630)
      IF (IVEM(2).NE.0) GOTO 9999
C**
C**-----------------------------------------------------------------
C**
C**** the displacements are computed at the geometrical nodes :
C**   -------------------------------------------------------
C**
      IVEM(4)=30
      IVEM(30)=LOUT
      IVEM(31)=1
      IVEM(32)=NN
      IVEM(33)=2
      CALL VEMU05 (T,LDISP,GDISP,LU,U,
     &             LIVEM,IVEM,LNEK,NEK,LRPARM,RPARM,LIPARM,IPARM,
     &             LDNOD,DNOD,LRDPRM,RDPARM,LIDPRM,IDPARM,LNODN,
     &             NODNUM,LNOD,NOD,LNOPRM,NOPARM,
     &             LBIG,RBIG,IBIG,DISP)
      IF (IVEM(2).NE.0) GOTO 9999
C**
C**-----------------------------------------------------------------
C**
C**** the stresses are computed at the center points of elements :
C**   ----------------------------------------------------------
C**
      IVEM(30)=LOUT
      IVEM(31)=1
      IVEM(33)=6

      CALL VEMU03 (T,LSTRES,ESTRES,LU,U,
     &             LIVEM,IVEM,LNEK,NEK,LRPARM,RPARM,LIPARM,IPARM,
     &             LDNOD,DNOD,LRDPRM,RDPARM,LIDPRM,IDPARM,LNODN,
     &             NODNUM,LNOD,NOD,LNOPRM,NOPARM,
     &             LBIG,RBIG,IBIG,STRESS)
      IF (IVEM(2).NE.0) GOTO 9999
C**
C**-----------------------------------------------------------------
C**
C**** the displacements are written to the I-DEAS result file :
C**   -------------------------------------------------------
C**
      IVEM(120)=LOUT
      IVEM(121)=1
      IVEM(127)=99
      IVEM(128)=NN
      IVEM(129)=2
      IVEM(130)=1
      IVEM(131)=2
      IVEM(132)=8
      IVEM(137)=1
      IVEM(138)=-1
      TEXT1='displacements'
      TEXT2='veme00exm09'

      OPEN(99,FILE='disp.unv',STATUS= 'UNKNOWN',FORM='FORMATTED')
      CALL VEID97 (TEXT1,TEXT2,T,LDISP,GDISP,
     &             LIVEM,IVEM,LNEK,NEK,LRPARM,RPARM,LIPARM,IPARM,
     &             LDNOD,DNOD,LRDPRM,RDPARM,LIDPRM,IDPARM,LNODN,
     &             NODNUM,LNOD,NOD,LNOPRM,NOPARM,
     &             LBIG,RBIG,IBIG)
      CLOSE(99)
      IF (IVEM(2).NE.0) GOTO 9999
C**
C**-----------------------------------------------------------------
C**
C**** the stresses are written to the I-DEAS element result file :
C**   ----------------------------------------------------------
C**
      IVEM(120)=LOUT
      IVEM(121)=1
      IVEM(133)=99
      IVEM(134)=1
      IVEM(135)=4
      IVEM(136)=2
      IVEM(137)=2
      IVEM(138)=-1
      TEXT1='stresses'
      TEXT2='veme00exm09'

      OPEN(99,FILE='stress.unv',STATUS= 'UNKNOWN',FORM='FORMATTED')
      CALL VEID99 (TEXT1,TEXT2,T,LSTRES,ESTRES,
     &             LIVEM,IVEM,LNEK,NEK,LRPARM,RPARM,LIPARM,IPARM,
     &             LDNOD,DNOD,LRDPRM,RDPARM,LIDPRM,IDPARM,LNODN,
     &             NODNUM,LNOD,NOD,LNOPRM,NOPARM,
     &             LBIG,RBIG,IBIG)
      CLOSE(99)
      IF (IVEM(2).NE.0) GOTO 9999
C**
C**-----------------------------------------------------------------
C**
C**** the mesh arrays written to the I-DEAS universal file :
C**   ----------------------------------------------------
C**
      IVEM(120)=LOUT
      IVEM(121)=1
      IVEM(124)=0
      IVEM(125)=99
      TEXT1='veme00exm09'

      OPEN(99,FILE='mesh.unv',STATUS= 'UNKNOWN',FORM='FORMATTED')
      CALL VEMIDE (TEXT1,
     &             LIVEM,IVEM,LNEK,NEK,LRPARM,RPARM,LIPARM,IPARM,
     &             LDNOD,DNOD,LRDPRM,RDPARM,LIDPRM,IDPARM,
     &             LNODN,NODNUM,LNOD,NOD,LNOPRM,NOPARM,
     &             LBIG,RBIG,IBIG)
      CLOSE(99)
      IF (IVEM(2).NE.0) GOTO 9999
C**
C**-----------------------------------------------------------------
C**
C**** end of calculation
C**   ------------------
C**
9999  CALL COMEND(IVEM(200),INFO)
      E    N    D

      SUBROUTINE DISP(T,GROUP,LAST,NELIS,
     &                 NRSP,RSPARM,NRVP,RVP1,RVPARM,
     &                 NISP,ISPARM,NIVP,IVP1,IVPARM,
     &                 L,DIM,X,NK,U,DUDX,NOP,NOPARM,DNOPDX,N,CU)
      IMPLICIT NONE
C**
C*******************************************************************
C**
C**  The routine DISP copies the input solution to the output
C**  CU. So the calling routine vemu05 interpolates the
C**  displacements from the global nodes onto the geometrical
C**  nodes, see userc, vemu05.
C**
C*******************************************************************
C**
      INTEGER            GROUP,LAST,NELIS,L,DIM,NK,N,
     &                   NRSP,RVP1,NRVP,NISP,IVP1,NIVP,NOP

      DOUBLE PRECISION   T,X(L,DIM),U(L,NK),DUDX(L,NK,DIM),
     &                   RSPARM(NRSP),RVPARM(RVP1,NRVP),
     &                   NOPARM(L,NOP),DNOPDX(L,NOP,DIM),CU(L,N)

      INTEGER            ISPARM(NISP),IVPARM(IVP1,NIVP)
C**
C**-----------------------------------------------------------------
C**
      INTEGER Z
C**
C**-----------------------------------------------------------------
C**
C**** start of calculation :
C**   --------------------
C**
      DO 10 Z=1,NELIS
        CU(Z,1) = U(Z,1)
        CU(Z,2) = U(Z,2)
10    CONTINUE
C**
C**-----------------------------------------------------------------
C**
C**** end of calculation
C**   ------------------
C**
      R E T U R N
C**---end of DISP--------------------------------------------------
      E    N    D

      SUBROUTINE STRESS(T,GROUP,LAST,NELIS,
     &                  NRSP,RSPARM,NRVP,RVP1,RVPARM,
     &                  NISP,ISPARM,NIVP,IVP1,IVPARM,
     &                  L,DIM,X,NK,U,DUDX,NOP,NOPARM,DNOPDX,N,CU)
      IMPLICIT NONE
C**
C*******************************************************************
C**
C**  The routine STRESS evaluates the stress vector for the given
C**  displacement. The succession in the output vector is
C**  prescribed by I-DEAS, see userc, vemu03, veid99.
C**
C*******************************************************************
C**
      INTEGER            GROUP,LAST,NELIS,L,DIM,NK,N,
     &                   NRSP,RVP1,NRVP,NISP,IVP1,NIVP,NOP

      DOUBLE PRECISION   T,X(L,DIM),U(L,NK),DUDX(L,NK,DIM),
     &                   RSPARM(NRSP),RVPARM(RVP1,NRVP),
     &                   NOPARM(L,NOP),DNOPDX(L,NOP,DIM),CU(L,N)

      INTEGER            ISPARM(NISP),IVPARM(IVP1,NIVP)
C**
C**-----------------------------------------------------------------
C**
      INTEGER Z
      DOUBLE PRECISION  EPS1,EPS2,EPS12,E,NY,C11,C44,C12
C**
C**-----------------------------------------------------------------
C**
C**** start of calculation :
C**   --------------------
C**

      DO 100 Z=1,NELIS
	E =RVPARM(LAST+Z,1)
	NY=RVPARM(LAST+Z,2)
        C11=E*(1-NY)/(1+NY)
        C44=E/2/(1+NY)
        C12=E*NY/(1+NY)/(1-NY)

        EPS1 =DUDX(Z,1,1)
        EPS2 =DUDX(Z,2,2)
        EPS12=DUDX(Z,1,2)+DUDX(Z,2,1)

        CU(Z,1)=C11*EPS1+C12*EPS2
        CU(Z,2)=C44*EPS12
        CU(Z,3)=0
        CU(Z,4)=C12*EPS1+C11*EPS2
        CU(Z,5)=0
        CU(Z,6)=0

100   CONTINUE
C**
C**-----------------------------------------------------------------
C**
C**** end of calculation
C**   ------------------
C**
      R E T U R N
C**---end of STRESS-------------------------------------------------
      E    N    D


      SUBROUTINE USERB(T,COMPU,RHS,
     &                 NRSDP,RSDPRM,NRVDP,RVDP1,RVDPRM,
     &                 NISDP,ISDPRM,NIVDP,IVDP1,IVDPRM,
     &                 NDC,DIM,X,NOP,NOPARM,B)
      IMPLICIT NONE
C**
C*******************************************************************
C**
C**  The routine USERB sets the Dirichlet boundary conditions,
C**  see userb. For this application these conditions gives
C**  the restrain conditions for the displacements, which are equal
C**  to zero for both directions. Therefore therfore zeros are the
C**  values of the output vector B for all components.
C**
C*******************************************************************
C**
      INTEGER          COMPU,RHS,NRSDP,NRVDP,RVDP1,NISDP,NIVDP,IVDP1,
     &                 NDC,DIM,NOP

      DOUBLE PRECISION T,RSDPRM(NRSDP),RVDPRM(RVDP1,NRVDP),
     &                 X(NDC,DIM),NOPARM(NDC,NOP),B(NDC)

      INTEGER          ISDPRM(NISDP),IVDPRM(IVDP1,NIVDP)
C**
C**-----------------------------------------------------------------
C**
      INTEGER Z
C**
C**-----------------------------------------------------------------
C**
C**** start of calculation :
C**   --------------------
C**
      IF (COMPU.EQ.1) THEN
        DO 10 Z=1,NDC
          B(Z)=0
10      CONTINUE
      ENDIF

      IF (COMPU.EQ.2) THEN
        DO 20 Z=1,NDC
          B(Z)=0
20      CONTINUE
      ENDIF
C**
C**-----------------------------------------------------------------
C**
C**** end of calculation
C**   ------------------
C**
      R E T U R N
C**---end of USERB--------------------------------------------------
      E    N    D

      SUBROUTINE USERL(T,GROUP,CLASS,COMPV,COMPU,LAST,
     &                 NELIS,L,DIM,X,TAU,NK,U,DUDX,
     &                 LT,UT,DUTDX,NOP,NOPARM,DNOPDX,
     &                 NRSP,RSPARM,NRVP,RVP1,RVPARM,
     &                 NISP,ISPARM,NIVP,IVP1,IVPARM,
     &                 L3,L2,L1,L0)
      IMPLICIT NONE
C**
C*******************************************************************
C**
C**  The routine USERL sets the coefficients of the bilinear form,
C**  see userl. The values of the coefficients L3 (L2=L1=L0=0 !)
C**  is read from the definition [1] of the bilinear form:
C**
C**   L(v,u)=area{ C11*v1x1*u1x1+C44*v1x2*u1x2+
C**                C12*v1x1*u2x2+C44*v1x2*u2x1+
C**                C12*v2x2*u1x1+C44*v2x1*u1x2+
C**                C44*v2x1*u2x1+C11*v2x2*u2x2 }
C**
C*******************************************************************
C**
      INTEGER          GROUP,CLASS,COMPV,COMPU,LAST,NELIS,L,LT,
     &                 DIM,NK,NOP,NRSP,RVP1,NRVP,NISP,IVP1,NIVP

      DOUBLE PRECISION T,X(L,DIM),TAU(L,DIM,CLASS),U(L,NK),UT(LT,NK),
     &                 DUDX(L,NK,CLASS),DUTDX(LT,NK,CLASS),
     &                 NOPARM(L,NOP),DNOPDX(L,NOP,CLASS),
     &                 RSPARM(NRSP),RVPARM(RVP1,NRVP),
     &                 L3(L,CLASS,CLASS),L2(L,CLASS),L1(L,CLASS),L0(L)

      INTEGER          ISPARM(NISP),IVPARM(IVP1,NIVP)
C**
C**-----------------------------------------------------------------
C**
      INTEGER Z
      DOUBLE PRECISION E,NY,C11,C44,C12
C**
C**-----------------------------------------------------------------
C**
C**** start of calculation :
C**   ---------------------
C**
      IF (CLASS.EQ.2) THEN

        IF ((COMPV.EQ.1).AND.(COMPU.EQ.1)) THEN
          DO 10 Z=1,NELIS
	    E =RVPARM(LAST+Z,1)
	    NY=RVPARM(LAST+Z,2)
            C11=E*(1-NY)/(1+NY)
            C44=E/2/(1+NY)

            L3(Z,1,1)=C11
            L3(Z,2,2)=C44
10        CONTINUE
        ENDIF

        IF ((COMPV.EQ.2).AND.(COMPU.EQ.2)) THEN
          DO 20 Z=1,NELIS
  	    E =RVPARM(LAST+Z,1)
	    NY=RVPARM(LAST+Z,2)
            C11=E*(1-NY)/(1+NY)
            C44=E/2/(1+NY)

            L3(Z,1,1)=C44
            L3(Z,2,2)=C11
20        CONTINUE
        ENDIF

        IF  (((COMPV.EQ.1) .AND. (COMPU.EQ.2)) .OR.
     &       ((COMPV.EQ.2) .AND. (COMPU.EQ.1))) THEN
          DO 40 Z=1,NELIS
  	    E =RVPARM(LAST+Z,1)
	    NY=RVPARM(LAST+Z,2)
            C44=E/2/(1+NY)
            C12=E*NY/(1+NY)/(1-NY)
            L3(Z,COMPV,COMPU)=C12
            L3(Z,COMPU,COMPV)=C44
40        CONTINUE
        ENDIF

      ENDIF
C**
C**-----------------------------------------------------------------
C**
C**** end of calculation
C**   ------------------
C**
      R E T U R N
C**---end of USERL--------------------------------------------------
      E    N    D

      SUBROUTINE USERF (T,GROUP,CLASS,COMPV,RHS,LAST,
     &                  NELIS,L,DIM,X,TAU,NK,U,DUDX,
     &                  LT,UT,DUTDX,NOP,NOPARM,DNOPDX,
     &                  NRSP,RSPARM,NRVP,RVP1,RVPARM,
     &                  NISP,ISPARM,NIVP,IVP1,IVPARM,
     &                  F1,F0)
      IMPLICIT NONE
C**
C*******************************************************************
C**
C**  The routine USERF sets the coefficients of the linear form,
C**  see userf. The values of the coefficients F0 (F1=0 !) is
C**  read from the definition [1] of the linear form:
C**
C**   F(v)=line{ - v2 }.
C**
C**  Therefore the output vector F0 for the second component of
C**  the test function is equal to -1.
C**
C*******************************************************************
C**
      INTEGER          GROUP,CLASS,COMPV,RHS,LAST,NELIS,L,LT,DIM,NK,NOP,
     &                 NRSP,RVP1,NRVP,NISP,IVP1,NIVP

      DOUBLE PRECISION T,X(L,DIM),TAU(L,DIM,CLASS),U(L,NK),UT(LT,NK),
     &                 DUDX(L,NK,CLASS),DUTDX(LT,NK,CLASS),
     &                 NOPARM(L,NOP),DNOPDX(L,NOP,CLASS),
     &                 RSPARM(NRSP),RVPARM(RVP1,NRVP),
     &                 F1(L,CLASS),F0(L)

      INTEGER          ISPARM(NISP),IVPARM(IVP1,NIVP)
C**
C**-----------------------------------------------------------------
C**
      INTEGER          Z
C**
C**-----------------------------------------------------------------
C**
C**** start of calculation :
C**   --------------------
C**
      IF (CLASS.EQ.1) THEN
	IF (COMPV.EQ.2) THEN
          DO 10 Z=1,NELIS
            F0(Z)=-1.
10        CONTINUE
	ENDIF
      ENDIF
C**
C**-----------------------------------------------------------------
C**
C**** end of calculation
C**   ------------------
C**
      R E T U R N
C**---end of USERF--------------------------------------------------