C ECOMRS    SOURCE    CHAT      05/01/12    23:25:07     5004
CCC
C **********************************************************************
CCC
      SUBROUTINE ECO_MRSMAC (SIGINI,VARINI,DSIGTR,SIGFIN,VARFIN,
     .                      ddefpl,iplast,ndims,xmat,kerre,
     .                      precis,nitmax,nescri,ues,nnumer,deltax,
     .                      iterlocal)
CCC
C      kerre   control de errores                      'KERRE
C          = 0  integracion correcta
C          = 1  sobrepasado el num max de iteraciones/no conv. local
C          = 102  apex
CCC
      IMPLICIT INTEGER(I-N)
      integer ndims,kerre,nitmax,nescri,nnumer,ues,kdummy,ndimv
      integer iplast,kerr,i,iplcon,iplcap,iplapex,ndimx,nmodel
      integer iplcon2,iplcap2,iplapex2,iterlocal
      real*8    sigini(ndims),varini(4),ddefpl(ndims),
     .          dsigtr(ndims),sigfin(ndims),varfin(ndims),
     .          xmat(*),precis,deltax,void
      real*8    sigtri(6),xtri(8),xini(8),lini,siginv(3)
      real*8    exm,qaa,pcc,eww,xk1,xk2,etb,exv,xep,paa,cco,
     .          exl,xnn,aaa,bbb,pc0,exr,cca,phi,alp,pcc2,paa2,qaa2,
     .          exm2,eww2,cpr,cpm,cfr,you,xnu
      common /elasdata/ you,xnu
      common /MRScone/ exm,qaa,pcc,eww,xk1,xk2,etb,exv,xep,paa,cco,
     .                 exl,xnn,aaa,bbb
      common /MRScapp/ pc0,exr,cca,phi,alp,pcc2,paa2,qaa2,exm2,eww2,
     .                 cpr,cpm,cfr
      do i=1,3
          siginv(i)=0.D0
        enddo
        do i=1,6
          sigtri(i)=0.D0
        enddo
        do i=1,8
          xtri(i)=0.D0
          xini(i)=0.D0
        enddo
      kerre=0
      iplast=1
      call CaracmateMAC(xmat)
      nmodel=20
      do i=1,ndims
         sigtri(i)=sigini(i)+dsigtr(i)
      enddo
      if (nescri.eq.1) then
         call InvariantesPQT(sigtri,ndims,siginv)
         write(ues,*)'  Sigma trial invari'
         write(ues,'(1x,3(E24.16,1x))')(siginv(i),i=1,3)
      endif
      kdummy=0
      call DeterzonaMAC(sigtri,ndims,varini,iplcon,iplcap,iplapex,
     .                  kdummy,ues)
c ELASTICO
10    continue
      if (iplapex.ne.0) goto 900
      if ((iplcon.eq.0).and.(iplcap.eq.0)) then
        if (nescri.eq.1) write(*,*)' Paso elastico'
        iplast=0
        do i=1,ndims
          sigfin(i) = sigtri(i)
        enddo
        varfin(1)=varini(1)
        varfin(2)=varini(2)
        varfin(3)=-1.D0
        varfin(4)=-1.D0
        iterlocal=0
        return
      endif
c PLASTICO
         do i=1,ndims
          xtri(i)=sigtri(i)
          xini(i)=sigtri(i)
         enddo
         lini  =0.D0
         if (nescri.eq.1) write(ues,*)' Modelo MAC: cone-cap harde'
         ndimx=ndims+2
         xtri(ndims+1)=varini(1)
         xini(ndims+1)=varini(1)
         xtri(ndims+2)=varini(2)
         xini(ndims+2)=varini(2)
c        prediccion para la var interna del cone:
c        se trata de esquivar una zona de no convergencia del n-r local
c         if ((xini(ndims+1).gt.1.D0).and.(xini(ndims+1).lt.5.D0))
c     .     xini(ndims+1)=5.D0
         if ((iplcon.eq.1).and.(iplcap.eq.0)) then
           if (nescri.eq.1) write(*,*)' Paso plastico: CONE'
           kdummy=21
         elseif ((iplcon.eq.0).and.(iplcap.eq.1)) then
           if (nescri.eq.1) write(*,*)' Paso plastico: CAP'
           kdummy=22
         else
           write(*,*)' Paso plastico: CONE-CAP',iplcon,iplcap
           kerre=1
           return
         endif
         call Integra21(xtri,xini,ndimx,lini,ddefpl,ndims,
     .                   kdummy,precis,nitmax,nescri,ues,nnumer,
     .                   deltax,kerre,iterlocal)
         varfin(1)=xini(ndims+1)
         varfin(2)=xini(ndims+2)
         do i=1,ndims
           sigfin(i)=xini(i)
         enddo
         kdummy=0
         call DeterzonaMAC(xtri,ndims,varfin,iplcon2,iplcap2,iplapex2,
     .                    kdummy,ues)
         if ((iplcon.eq.0).and.(iplcon2.eq.1)) then
            if (nescri.eq.1)
     .         write(*,*)' Cambio de zona de CAP a CONE'
            iplcap=0
            iplcon=1
            goto 10
         endif
         if (kerre.eq.1) return
         if ((iplcon.eq.1).and.(iplcap.eq.0)) then
           varfin(3)=lini
           varfin(4)=-1.D0
         elseif ((iplcon.eq.0).and.(iplcap.eq.1)) then
           varfin(3)=-1.D0
           varfin(4)=lini
         endif
         return
c APEX
  900 continue
      if (nescri.eq.1) write(*,*)' Paso plastico: APEX'
      write(*,*)' Paso plastico: APEX'
      do i=1,3
        sigfin(i)=-xmat(5)
      enddo
      do i=4,ndims
        sigfin(i)=0.d0
      enddo
      varfin(1)=varini(1)
      varfin(2)=varini(2)
      varfin(3)=-2.D0
      varfin(4)=-2.D0
      kerre=1
      return
 1000 continue
      return
      return
      end



