C MTCLDD    SOURCE    PV        22/04/19    16:18:07     11344          
CCC
C **********************************************************************
CCC
      SUBROUTINE MTC_LS_DPRAL_DENSI(EKMAT,NDIMK,X,NDIMX,LAM,
     .                              xdensi,xmat,
     .                              nmodel,nescri,ues,nnumer,deltax)

      IMPLICIT INTEGER(I-N)
      IMPLICIT REAL*8 (a-h,o-z)
      integer ndimk,ndimx,nmodel,nescri,ues,nnumer
      integer i,j,k,ndims,ndimv
      real*8  EKmat(ndimk,ndimk),x(ndimx),lam,deltax
      real*8  amat(16),aamat(16),eemat(16),vecm(4),vecnaux(4),vecn(4),
     .        gmat(16),Avecm(4),vecntA(4),kmat(4,4),g,void(1),sig(3)
      real*8  xdensi,dxdensi,xdensi2,xmat(*),resu,resuaux
      real*8  Mmat(4,3),kmat2(4,4),kmat3(4,4),ekmat2(3,3),ekmat3(3,3),
     .        vecmaux(4)

      call zzero(amat ,16)
      call zzero(aamat,16)
      call zzero(eemat,16)
      call zzero(gmat ,16)
      call zzero(kmat ,16)
      call zzero(vecm,4)
      call zzero(vecn,4)
      call zzero(vecnaux,4)
      call zzero(vecn,4)
      call zzero(Avecm,4)
      call zzero(vecntA,4)
      call zzero(sig,3)

      call zzero(mmat,12)
      call zzero(kmat2,16)
      call zzero(kmat3,16)
      call zzero(ekmat2,9)
      call zzero(ekmat3,9)
      call zzero(vecmaux,4)

      void(1)=0.D0
      ndimv=1
      ndims=3
      call der_enerelas_dpral(x,sig,nmodel)
c m,n,A
      if (ndimx.eq.3) then
       call yieldd(sig,ndims,void,ndimv,resu,nmodel)
       call vflsig(sig,ndims,void,ndimv,vecm,nmodel)
       call vyisig(sig,ndims,void,ndimv,vecnaux,nmodel)
       call HessFlsig(sig,ndims,void,ndimv,amat,ndimx,nmodel)
      else if (ndimx.eq.4) then
       call yieldd(sig,ndims,x(ndimx),ndimv,resu,nmodel)
       call vflsig(sig,ndims,x(ndimx),ndimv,vecm,nmodel)
       call vflvar(sig,ndims,x(ndimx),ndimv,vecm(ndimx),nmodel)
       call vyisig(sig,ndims,x(ndimx),ndimv,vecnaux,nmodel)
       call vyivar(sig,ndims,x(ndimx),ndimv,vecnaux(ndimx),nmodel)
       call HessFlsig(sig,ndims,x(ndimx),ndimv,amat,ndimx,nmodel)
      endif
c E=d2_ener (ampliada de 3 a ndimx con 1 en la diagonal)
      call der2_enerelas_dpral(x,eemat,ndimx,nmodel)
c n^T=n^T*E
c AA=A*E
      do i=1,ndimx
       vecn(i)=0.D0
       do j=1,ndimx
         vecn(i)=vecn(i)+vecnaux(j)*eemat(j+(i-1)*ndimx)
         aamat(i+(j-1)*ndimx)=0.D0
         do k=1,ndimx
           aamat(i+(j-1)*ndimx)=aamat(i+(j-1)*ndimx)+
     .                         amat(i+(k-1)*ndimx)*eemat(k+(j-1)*ndimx)
         enddo
       enddo
      enddo
      call zzero(amat,16 )
c A=I+l*AA
      do i=1,ndimx
       amat(i+(i-1)*ndimx)=1.D0
       do j=1,ndimx
         amat(i+(j-1)*ndimx)=amat(i+(j-1)*ndimx)+
     .                       lam*aamat(i+(j-1)*ndimx)
       enddo
      enddo
c G = A-1
      call DescLU(Amat,ndimx)
      call LUinv(Amat,Gmat,ndimx)
c g = nt*A-1*m
      g=0.D0
      do i=1,ndimx
       do j=1,ndimx
          g=g+vecn(i)*Gmat(i+ndimx*(j-1))*vecm(j)
       enddo
      enddo
c G*m; nt*G
      do i=1,ndimx
       do j=1,ndimx
         Avecm(i)=Avecm(i)+Gmat(i+ndimx*(j-1))*vecm(j)
         vecntA(i)=vecntA(i)+vecn(j)*Gmat(j+ndimx*(i-1))
       enddo
      enddo
c K = G-(G*m * nt*G)/g
      do i=1,ndimx
       do j=1,ndimx
          Kmat(i,j)=Gmat((j-1)*ndimx+i)-Avecm(i)*vecntA(j)/g
       enddo
      enddo
CCCC
C densi
CCCC
c Vecm y f perturbados

c      write(399,*)
c      dxrel = 0.1
c      do i = 1,10
c      dx = xdensi * (dxrel**i)
c      xdensi2 = xdensi + dx
c      call carac_mate_rhmc_densi(XMAT,xdensi2)
c      call yieldd(sig,ndims,void,ndimv,resuaux,nmodel)
c      call vflsig(sig,ndims,void,ndimv,vecmaux,nmodel)
c      write(399,*)dxrel**i,(resuaux-resu)/dx
c      write(399,*)'  ',((vecmaux(j)-vecm(j))/dx,j=1,3)
c      call carac_mate_rhmc_densi(XMAT,xdensi)
c      enddo
c      do i = 1,10
c      dx = - xdensi * (dxrel**i)
c      xdensi2 = xdensi + dx
c      call carac_mate_rhmc_densi(XMAT,xdensi2)
c      call yieldd(sig,ndims,void,ndimv,resuaux,nmodel)
c      call vflsig(sig,ndims,void,ndimv,vecmaux,nmodel)
c      write(399,*)-dxrel**i,(resuaux-resu)/dx
c      write(399,*)'  ',((vecmaux(j)-vecm(j))/dx,j=1,3)
c      call carac_mate_rhmc_densi(XMAT,xdensi)
c      enddo
CC
      dxrel = 0.1D0
      dx = (1.D0 + xdensi) * (dxrel**6)
      xdensi2 = xdensi + dx
c      call carac_mate_rhmc_densi(XMAT,xdensi2)
      call carac_mate_densi(XMAT,xdensi2,nmodel)
      if (ndimx.eq.3) then
       call yieldd(sig,ndims,void,ndimv,resuaux,nmodel)
       call vflsig(sig,ndims,void,ndimv,vecmaux,nmodel)
      else if (ndimx.eq.4) then
       call yieldd(sig,ndims,x(ndimx),ndimv,resuaux,nmodel)
       call vflsig(sig,ndims,x(ndimx),ndimv,vecmaux,nmodel)
       call vflvar(sig,ndims,x(ndimx),ndimv,vecmaux(ndimx),nmodel)
      endif
      xdensi2 = xdensi - dx
c      call carac_mate_rhmc_densi(XMAT,xdensi2)
      call carac_mate_densi(XMAT,xdensi2,nmodel)
      if (ndimx.eq.3) then
       call yieldd(sig,ndims,void,ndimv,resu,nmodel)
       call vflsig(sig,ndims,void,ndimv,vecm,nmodel)
      else if (ndimx.eq.4) then
       call yieldd(sig,ndims,x(ndimx),ndimv,resu,nmodel)
       call vflsig(sig,ndims,x(ndimx),ndimv,vecm,nmodel)
       call vflvar(sig,ndims,x(ndimx),ndimv,vecm(ndimx),nmodel)
      endif
      dx = dx * 2.D0
c      call carac_mate_rhmc_densi(XMAT,xdensi)
      call carac_mate_densi(XMAT,xdensi,nmodel)
c Mmat = derivada de vecm (3 veces)
      do i=1,ndimx
          Mmat(i,1)=(vecmaux(i)-vecm(i))/dx
          Mmat(i,2)=Mmat(i,1)
          Mmat(i,3)=Mmat(i,1)
      enddo
c Kmat2 = Kmat * Mmat
c Kmat3 = Avecm/g (3 veces)
      do i=1,ndimx
       do j=1,3
         do k=1,ndimx
          Kmat2(i,j)=Kmat2(i,j)+Kmat(i,k)*Mmat(k,j)
         enddo
         Kmat3(i,j)=Avecm(i)/g
       enddo
      enddo
c auxiliares
      aux1= xdensi*lam
      aux2= xdensi*(resuaux-resu)/dx
c EKmat  = E*Kmat ; EKmat2 = E*Kmat2 ; EKmat3 = E*Kmat3
c EKmat  = EKmat + aux1*EKmat2 + aux2*EKmat3
      call zzero(ekmat,ndimk**2)
      do i=1,3
       do j=1,3
         do k=1,ndimx
          ekmat(i,j) =ekmat(i,j)+
     .                eemat(i+(k-1)*ndimx)*kmat(k,j)
          ekmat2(i,j)=ekmat2(i,j)+
     .                eemat(i+(k-1)*ndimx)*kmat2(k,j)
          ekmat3(i,j)=ekmat3(i,j)+
     .                eemat(i+(k-1)*ndimx)*kmat3(k,j)
         enddo
         ekmat(i,j)=ekmat(i,j)+aux1*ekmat2(i,j)+aux2*ekmat3(i,j)
       enddo
      enddo

      if (nescri.eq.1)
     .   write(ues,999)' EKmat_dp ',((ekmat(i,j),j=1,3),i=1,3)
999   format(2x,A12,/,3(3(1x,E12.6),/))
      return
      end




 
