module calculos6

! objetivo: calcular solução interpolada

use dados
use calculos
use calculos1
use calculos2
use calculos3
use calculos4
use calculos5

implicit none

contains



!----------------------------------------------------------------------------------------------------------------------
!-- Cálculo das interpolações--------- --------------------------------------------------------------------------------
!----------------------------------------------------------------------------------------------------------------------

  subroutine numerico6
  !--------------------------------------------------------------------------------------------------------------------
  !Busca do extremo do polinômio interpolado
  !Ponto extremo numérico contínuo: interpolação de grau 6, 2D, (polinômio interpolador de Newton)
  !--------------------------------------------------------------------------------------------------------------------
    
    XX0 = [x3,y3];    !Inicializa com localização do ponto extremo da malha (ponto extremo discreto)
    bheta = 0.1q0;    !parâmetro de cálculo
    theta = 2.0q0;    !parâmetro de cálculo
    alfa_bar = 1.0q0; !parâmetro de cálculo  
    t = 1; 
    j=1;
    grad_p = theta; !Inicializa variável: gradiente
    
   do while ((j<5000).and.( qabs(grad_p) > 10.0q0**(-25.0q0) ))  
    
      aux1 = 1.0q0;
      aux2 = aux1 + prob; !aux1 +/- 1.0q0 (min ou max);
      t=0;
      !Gradiente
       grad = [6.0Q0*AA*(XX0(1)**5.0Q0*XX0(2)**6.0Q0) + 6.0Q0*BB*(XX0(1)**5.0Q0*XX0(2)**5.0Q0)  + 5.0Q0*CC*(XX0(1)**4.0Q0*XX0(2)**6.0Q0) + 6.0Q0*DD*(XX0(1)**5.0Q0*XX0(2)**4.0Q0) + 5.0Q0*EE*(XX0(1)**4.0Q0*XX0(2)**5.0Q0) + 4.0Q0*FF*(XX0(1)**3.0Q0*XX0(2)**6.0Q0) + 6.0Q0*GG*(XX0(1)**5.0Q0*XX0(2)**3) +   &
                5.0Q0*HH*(XX0(1)**4.0Q0*XX0(2)**4) + 4.0Q0*II*(XX0(1)**3.0Q0*XX0(2)**5.0Q0)  + 3.0Q0*JJ*(XX0(1)**2*XX0(2)**6) + 6.0Q0*KK*(XX0(1)**5.0Q0*XX0(2)**2.0Q0) + 5.0Q0*LL*(XX0(1)**4.0Q0*XX0(2)**3.0Q0) + 4.0Q0*MM*(XX0(1)**3.0Q0*XX0(2)**4.0Q0) + 3.0Q0*NN*(XX0(1)**2.0Q0*XX0(2)**5.0Q0) +  &
                2.0Q0*OO*(XX0(1)*XX0(2)**6.0Q0) + 6.0Q0*PP*(XX0(1)**5.0Q0*XX0(2))    + 5.0Q0*QQ*(XX0(1)**4.0Q0*XX0(2)**2) + 4.0Q0*RR*(XX0(1)**3.0Q0*XX0(2)**3.0Q0) + 3.0Q0*SS*(XX0(1)**2.0Q0*XX0(2)**4) + 2.0Q0*TT*(XX0(1)*XX0(2)**5.0Q0) + UU*(XX0(2)**6.0Q0)   +                   &
                6.0Q0*VV*(XX0(1)**5.0Q0)   + 5.0Q0*XX*(XX0(1)**4.0Q0*XX0(2))    + 4.0Q0*YY*(XX0(1)**3.0Q0*XX0(2)**2.0Q0) + 3.0Q0*ZZ*(XX0(1)**2.0Q0*XX0(2)**3.0Q0) + 2.0Q0*A1*(XX0(1)*XX0(2)**4.0Q0) + A2*(XX0(2)**5.0Q0)   +                                 &
                5.0Q0*A4*(XX0(1)**4.0Q0)     + 4.0Q0*A5*(XX0(1)**3*XX0(2))    + 3.0Q0*A6*(XX0(1)**2.0Q0*XX0(2)**2.0Q0) + 2.0Q0*A7*(XX0(1)*XX0(2)**3.0Q0) + A8*(XX0(2)**4.0Q0)   +  4.0Q0*A10*(XX0(1)**3.0Q0)    +                                                        &
                3.0Q0*A11*(XX0(1)**2.0Q0*XX0(2))  + 2*A12*(XX0(1)*XX0(2)**2.0Q0) + A13*(XX0(2)**3.0Q0)  +  3.0Q0*A15*(XX0(1)**2.0Q0)    + 2.0Q0*A16*(XX0(1)*XX0(2))  + A17*(XX0(2)**2.0Q0)  +                                                                &
                + 2.0Q0*A19*(XX0(1))     + A20*(XX0(2))    +  A22,                                                                                                                                                               &
                6.0Q0*AA*(XX0(1)**6.0Q0*XX0(2)**5.0Q0) + 5.0Q0*BB*(XX0(1)**6.0Q0*XX0(2)**4.0Q0)  + 6.0Q0*CC*(XX0(1)**5.0Q0*XX0(2)**5.0Q0) + 4.0Q0*DD*(XX0(1)**6.0Q0*XX0(2)**3.0Q0) + 5.0Q0*EE*(XX0(1)**5.0Q0*XX0(2)**4.0Q0) + 6.0Q0*FF*(XX0(1)**4.0Q0*XX0(2)**5.0Q0) + 3.0Q0*GG*(XX0(1)**6.0Q0*XX0(2)**2.0Q0) +  & 
                4.0Q0*HH*(XX0(1)**5.0Q0*XX0(2)**3.0Q0) + 5.0Q0*II*(XX0(1)**4.0Q0*XX0(2)**4.0Q0)  + 6.0Q0*JJ*(XX0(1)**3.0Q0*XX0(2)**5.0Q0) + 2.0Q0*KK*(XX0(1)**6.0Q0*XX0(2)) + 3.0Q0*LL*(XX0(1)**5.0Q0*XX0(2)**2) + 4.0Q0*MM*(XX0(1)**4.0Q0*XX0(2)**3.0Q0) + 5.0Q0*NN*(XX0(1)**3.0Q0*XX0(2)**4.0Q0) +     &
                6.0Q0*OO*(XX0(1)**2.0Q0*XX0(2)**5.0Q0) + PP*(XX0(1)**6.0Q0)    + 2.0Q0*QQ*(XX0(1)**5.0Q0*XX0(2)) + 3.0Q0*RR*(XX0(1)**4.0Q0*XX0(2)**2.0Q0) + 4.0Q0*SS*(XX0(1)**3.0Q0*XX0(2)**3.0Q0) + 5.0Q0*TT*(XX0(1)**2.0Q0*XX0(2)**4.0Q0) + 6.0Q0*UU*(XX0(1)*XX0(2)**5.0Q0)   +                &
                XX*(XX0(1)**5.0Q0)    + 2.0Q0*YY*(XX0(1)**4.0Q0*XX0(2)) + 3.0Q0*ZZ*(XX0(1)**3.0Q0*XX0(2)**2.0Q0) + 4.0Q0*A1*(XX0(1)**2.0Q0*XX0(2)**3.0Q0) + 5.0Q0*A2*(XX0(1)*XX0(2)**4.0Q0)   + 6.0Q0*A3*(XX0(2)**5.0Q0)     +                               &
                + A5*(XX0(1)**4.0Q0)    + 2.0Q0*A6*(XX0(1)**3.0Q0*XX0(2)) + 3.0Q0*A7*(XX0(1)**2.0Q0*XX0(2)**2.0Q0) + 4.0Q0*A8*(XX0(1)*XX0(2)**3.0Q0)   + 5.0Q0*A9*(XX0(2)**4.0Q0)     +                                                                              & 
                A11*(XX0(1)**3.0Q0)  + 2.0Q0*A12*(XX0(1)**2.0Q0*XX0(2)) + 3.0Q0*A13*(XX0(1)*XX0(2)**2.0Q0)  + 4.0Q0*A14*(XX0(2)**3.0Q0)    +  A16*(XX0(1)**2.0Q0)  + 2.0Q0*A17*(XX0(1)*XX0(2))  +                                                                &
                3.0Q0*A18*(XX0(2)**2.0Q0)    +  A20*(XX0(1))    + 2.0Q0*A21*(XX0(2))    + A23]; 
        
      !Produto escalar: crescimento / decrescimento
      grad_p = 1.0q0 * prob *(grad(1)*grad(1)+grad(2)*grad(2)) 
      
      !Busca linear de Armijo
       
      if(prob == 1) then 
        
         do while ( aux1 < aux2 ) 
            XX1(1) = XX0(1) + (alfa_bar / (theta**t)) * (grad(1)); 
            XX1(2) = XX0(2) + (alfa_bar / (theta**t)) * (grad(2)); 
            aux1  = AA*(XX1(1)**6*XX1(2)**6) + BB*(XX1(1)**6*XX1(2)**5)  + CC*(XX1(1)**5*XX1(2)**6) + DD*(XX1(1)**6*XX1(2)**4) + EE*(XX1(1)**5*XX1(2)**5) + FF*(XX1(1)**4*XX1(2)**6) + GG*(XX1(1)**6*XX1(2)**3) +     & 
                    HH*(XX1(1)**5*XX1(2)**4) + II*(XX1(1)**4*XX1(2)**5)  + JJ*(XX1(1)**3*XX1(2)**6) + KK*(XX1(1)**6*XX1(2)**2) + LL*(XX1(1)**5*XX1(2)**3) + MM*(XX1(1)**4*XX1(2)**4) + NN*(XX1(1)**3*XX1(2)**5) +     &
                    OO*(XX1(1)**2*XX1(2)**6) + PP*(XX1(1)**6*XX1(2))    + QQ*(XX1(1)**5*XX1(2)**2) + RR*(XX1(1)**4*XX1(2)**3) + SS*(XX1(1)**3*XX1(2)**4) + TT*(XX1(1)**2*XX1(2)**5) + UU*(XX1(1)*XX1(2)**6)   +       &
                    VV*(XX1(1)**6)     + XX*(XX1(1)**5*XX1(2))    + YY*(XX1(1)**4*XX1(2)**2) + ZZ*(XX1(1)**3*XX1(2)**3) + A1*(XX1(1)**2*XX1(2)**4) + A2*(XX1(1)*XX1(2)**5)   + A3*(XX1(2)**6) +   &
                    A4*(XX1(1)**5)     + A5*(XX1(1)**4*XX1(2))    + A6*(XX1(1)**3*XX1(2)**2) + A7*(XX1(1)**2*XX1(2)**3) + A8*(XX1(1)*XX1(2)**4)   + A9*(XX1(2)**5)     + A10*(XX1(1)**4)    +                         &
                    A11*(XX1(1)**3*XX1(2))  + A12*(XX1(1)**2*XX1(2)**2) + A13*(XX1(1)*XX1(2)**3)  + A14*(XX1(2)**4)    + A15*(XX1(1)**3)    + A16*(XX1(1)**2*XX1(2))  + A17*(XX1(1)*XX1(2)**2)  +                     &
                    A18*(XX1(2)**3)    + A19*(XX1(1)**2)     + A20*(XX1(1)*XX1(2))    + A21*(XX1(2)**2)    + A22*(XX1(1))      + A23*(XX1(2))      + A24;
            aux2  = AA*(XX0(1)**6*XX0(2)**6) + BB*(XX0(1)**6*XX0(2)**5)  + CC*(XX0(1)**5*XX0(2)**6) + DD*(XX0(1)**6*XX0(2)**4) + EE*(XX0(1)**5*XX0(2)**5) + FF*(XX0(1)**4*XX0(2)**6) + GG*(XX0(1)**6*XX0(2)**3) +     & 
                    HH*(XX0(1)**5*XX0(2)**4) + II*(XX0(1)**4*XX0(2)**5)  + JJ*(XX0(1)**3*XX0(2)**6) + KK*(XX0(1)**6*XX0(2)**2) + LL*(XX0(1)**5*XX0(2)**3) + MM*(XX0(1)**4*XX0(2)**4) + NN*(XX0(1)**3*XX0(2)**5) +     &
                    OO*(XX0(1)**2*XX0(2)**6) + PP*(XX0(1)**6*XX0(2))    + QQ*(XX0(1)**5*XX0(2)**2) + RR*(XX0(1)**4*XX0(2)**3) + SS*(XX0(1)**3*XX0(2)**4) + TT*(XX0(1)**2*XX0(2)**5) + UU*(XX0(1)*XX0(2)**6)   +       &
                    VV*(XX0(1)**6)     + XX*(XX0(1)**5*XX0(2))    + YY*(XX0(1)**4*XX0(2)**2) + ZZ*(XX0(1)**3*XX0(2)**3) + A1*(XX0(1)**2*XX0(2)**4) + A2*(XX0(1)*XX0(2)**5)   + A3*(XX0(2)**6) +   &
                    A4*(XX0(1)**5)     + A5*(XX0(1)**4*XX0(2))    + A6*(XX0(1)**3*XX0(2)**2) + A7*(XX0(1)**2*XX0(2)**3) + A8*(XX0(1)*XX0(2)**4)   + A9*(XX0(2)**5)     + A10*(XX0(1)**4)    +                         &
                    A11*(XX0(1)**3*XX0(2))  + A12*(XX0(1)**2*XX0(2)**2) + A13*(XX0(1)*XX0(2)**3)  + A14*(XX0(2)**4)    + A15*(XX0(1)**3)    + A16*(XX0(1)**2*XX0(2))  + A17*(XX0(1)*XX0(2)**2)  +                     &
                    A18*(XX0(2)**3)    + A19*(XX0(1)**2)     + A20*(XX0(1)*XX0(2))    + A21*(XX0(2)**2)    + A22*(XX0(1))      + A23*(XX0(2))      + A24 + bheta * (alfa_bar / (theta**t)) * grad_p; 
            t = t + 1;
          end do
        
        else
        
         do while ( aux1 > aux2 )
            XX1(1) = XX0(1) + (alfa_bar / (theta**t)) * (-grad(1));
            XX1(2) = XX0(2) + (alfa_bar / (theta**t)) * (-grad(2));
           aux1  = AA*(XX1(1)**6*XX1(2)**6) + BB*(XX1(1)**6*XX1(2)**5)  + CC*(XX1(1)**5*XX1(2)**6) + DD*(XX1(1)**6*XX1(2)**4) + EE*(XX1(1)**5*XX1(2)**5) + FF*(XX1(1)**4*XX1(2)**6) + GG*(XX1(1)**6*XX1(2)**3) +     & 
                    HH*(XX1(1)**5*XX1(2)**4) + II*(XX1(1)**4*XX1(2)**5)  + JJ*(XX1(1)**3*XX1(2)**6) + KK*(XX1(1)**6*XX1(2)**2) + LL*(XX1(1)**5*XX1(2)**3) + MM*(XX1(1)**4*XX1(2)**4) + NN*(XX1(1)**3*XX1(2)**5) +     &
                    OO*(XX1(1)**2*XX1(2)**6) + PP*(XX1(1)**6*XX1(2))    + QQ*(XX1(1)**5*XX1(2)**2) + RR*(XX1(1)**4*XX1(2)**3) + SS*(XX1(1)**3*XX1(2)**4) + TT*(XX1(1)**2*XX1(2)**5) + UU*(XX1(1)*XX1(2)**6)   +       &
                    VV*(XX1(1)**6)     + XX*(XX1(1)**5*XX1(2))    + YY*(XX1(1)**4*XX1(2)**2) + ZZ*(XX1(1)**3*XX1(2)**3) + A1*(XX1(1)**2*XX1(2)**4) + A2*(XX1(1)*XX1(2)**5)   + A3*(XX1(2)**6) +   &
                    A4*(XX1(1)**5)     + A5*(XX1(1)**4*XX1(2))    + A6*(XX1(1)**3*XX1(2)**2) + A7*(XX1(1)**2*XX1(2)**3) + A8*(XX1(1)*XX1(2)**4)   + A9*(XX1(2)**5)     + A10*(XX1(1)**4)    +                         &
                    A11*(XX1(1)**3*XX1(2))  + A12*(XX1(1)**2*XX1(2)**2) + A13*(XX1(1)*XX1(2)**3)  + A14*(XX1(2)**4)    + A15*(XX1(1)**3)    + A16*(XX1(1)**2*XX1(2))  + A17*(XX1(1)*XX1(2)**2)  +                     &
                    A18*(XX1(2)**3)    + A19*(XX1(1)**2)     + A20*(XX1(1)*XX1(2))    + A21*(XX1(2)**2)    + A22*(XX1(1))      + A23*(XX1(2))      + A24;
            aux2  = AA*(XX0(1)**6*XX0(2)**6) + BB*(XX0(1)**6*XX0(2)**5)  + CC*(XX0(1)**5*XX0(2)**6) + DD*(XX0(1)**6*XX0(2)**4) + EE*(XX0(1)**5*XX0(2)**5) + FF*(XX0(1)**4*XX0(2)**6) + GG*(XX0(1)**6*XX0(2)**3) +     & 
                    HH*(XX0(1)**5*XX0(2)**4) + II*(XX0(1)**4*XX0(2)**5)  + JJ*(XX0(1)**3*XX0(2)**6) + KK*(XX0(1)**6*XX0(2)**2) + LL*(XX0(1)**5*XX0(2)**3) + MM*(XX0(1)**4*XX0(2)**4) + NN*(XX0(1)**3*XX0(2)**5) +     &
                    OO*(XX0(1)**2*XX0(2)**6) + PP*(XX0(1)**6*XX0(2))    + QQ*(XX0(1)**5*XX0(2)**2) + RR*(XX0(1)**4*XX0(2)**3) + SS*(XX0(1)**3*XX0(2)**4) + TT*(XX0(1)**2*XX0(2)**5) + UU*(XX0(1)*XX0(2)**6)   +       &
                    VV*(XX0(1)**6)     + XX*(XX0(1)**5*XX0(2))    + YY*(XX0(1)**4*XX0(2)**2) + ZZ*(XX0(1)**3*XX0(2)**3) + A1*(XX0(1)**2*XX0(2)**4) + A2*(XX0(1)*XX0(2)**5)   + A3*(XX0(2)**6) +   &
                    A4*(XX0(1)**5)     + A5*(XX0(1)**4*XX0(2))    + A6*(XX0(1)**3*XX0(2)**2) + A7*(XX0(1)**2*XX0(2)**3) + A8*(XX0(1)*XX0(2)**4)   + A9*(XX0(2)**5)     + A10*(XX0(1)**4)    +                         &
                    A11*(XX0(1)**3*XX0(2))  + A12*(XX0(1)**2*XX0(2)**2) + A13*(XX0(1)*XX0(2)**3)  + A14*(XX0(2)**4)    + A15*(XX0(1)**3)    + A16*(XX0(1)**2*XX0(2))  + A17*(XX0(1)*XX0(2)**2)  +                     &
                    A18*(XX0(2)**3)    + A19*(XX0(1)**2)     + A20*(XX0(1)*XX0(2))    + A21*(XX0(2)**2)    + A22*(XX0(1))      + A23*(XX0(2))      + A24 + bheta * (alfa_bar / (theta**t)) * grad_p; 
             t = t + 1;
         end do
        
      end if
        
      XX0 = XX1;
      j = j+1;

   end do   
    
    !Cálculo do valor numérico contínuo com base no polinõmio interpolado
    
    PP6 = AA*(XX0(1)**6*XX0(2)**6) + BB*(XX0(1)**6*XX0(2)**5)  + CC*(XX0(1)**5*XX0(2)**6) + DD*(XX0(1)**6*XX0(2)**4) + EE*(XX0(1)**5*XX0(2)**5) + FF*(XX0(1)**4*XX0(2)**6) + GG*(XX0(1)**6*XX0(2)**3) +     & 
          HH*(XX0(1)**5*XX0(2)**4) + II*(XX0(1)**4*XX0(2)**5)  + JJ*(XX0(1)**3*XX0(2)**6) + KK*(XX0(1)**6*XX0(2)**2) + LL*(XX0(1)**5*XX0(2)**3) + MM*(XX0(1)**4*XX0(2)**4) + NN*(XX0(1)**3*XX0(2)**5) +     &
          OO*(XX0(1)**2*XX0(2)**6) + PP*(XX0(1)**6*XX0(2))    + QQ*(XX0(1)**5*XX0(2)**2) + RR*(XX0(1)**4*XX0(2)**3) + SS*(XX0(1)**3*XX0(2)**4) + TT*(XX0(1)**2*XX0(2)**5) + UU*(XX0(1)*XX0(2)**6)   +       &
          VV*(XX0(1)**6)     + XX*(XX0(1)**5*XX0(2))    + YY*(XX0(1)**4*XX0(2)**2) + ZZ*(XX0(1)**3*XX0(2)**3) + A1*(XX0(1)**2*XX0(2)**4) + A2*(XX0(1)*XX0(2)**5)   + A3*(XX0(2)**6) +   &
          A4*(XX0(1)**5)     + A5*(XX0(1)**4*XX0(2))    + A6*(XX0(1)**3*XX0(2)**2) + A7*(XX0(1)**2*XX0(2)**3) + A8*(XX0(1)*XX0(2)**4)   + A9*(XX0(2)**5)     + A10*(XX0(1)**4)    +                         &
          A11*(XX0(1)**3*XX0(2))  + A12*(XX0(1)**2*XX0(2)**2) + A13*(XX0(1)*XX0(2)**3)  + A14*(XX0(2)**4)    + A15*(XX0(1)**3)    + A16*(XX0(1)**2*XX0(2))  + A17*(XX0(1)*XX0(2)**2)  +                     &
          A18*(XX0(2)**3)    + A19*(XX0(1)**2)     + A20*(XX0(1)*XX0(2))    + A21*(XX0(2)**2)    + A22*(XX0(1))      + A23*(XX0(2))      + A24;
    
  write(*,*) qabs(grad_p)
  write(*,*) j
  
  end subroutine numerico6
  
 !---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

end module calculos6