program intrinsicProcedures

!/////////////////////////////////////////////////////////////////////
!/ programa para ejemplificar el uso de "Procedimientos Intrinsecos" /
!/ Un procedimiento intrinseco es una funcion interna de fortran que /
!/ recibe uno o mas argumentos y devulve un resultado.               /
!/////////////////////////////////////////////////////////////////////


! Declaro algunas variables
integer     :: int1= 8 , int2= 15
real        :: real1 = 7.2 , real2 = 8.6
complex     :: complx1 , complx2= (1.0,3.0)


!============= FUNCIONES ELEMENTALES =================

print*,"========= FUNCIONES ELEMENTALES =============";print*
print*,"--------- Funciones Elementales Numericas --------";print*

print*,"cos(x)      x es real/complejo"
print*,"sin(x)      x es real/complejo"
print*,"tan(x)      x es real"
print*,"exp(x)      x es real/complejo"
print*,"log(x)      x es real/complejo"
print*,"log10(x)    x es real/complejo  -- Logaritmo en base 10"
print*,"sqrt(x)     x es real/complejo"
print*,"acos(x)     x es real           -- Devuelve el resultado en radianes"
print*,"asin(x)     x es real           -- Devuelve el resultado en radianes"
print*,"atan(x)     x es real           -- Devuelve el resultado en radianes"
print*,"sinh(x)     x es real           -- Seno Hiperbolico"
print*,"cosh(x)     x es real           -- Seno Hiperbolico"
print*,"tanh(x)     x es real           -- Tangente Hiperbolica"

print*;print*,"------- Otras funciones elementales ---------";print*

print*,"abs(x)      x es entero/real/complejo      -- Devuelve el valor absoluto"
print*,"aimg(z)     z es complejo       -- Devuelve la parte imaginaria de z"
print*,"aimg(z)     z es complejo       -- Devuelve la parte imaginaria de z"
print*,"cmplx(x[,y]) x,y son enteros/reales        -- Crea el complejo, dados x y/o y"
print*,"ceiling(x)  x es real           -- Devuelve el entero mayor y mas cercano a x"
print*,"floor(x)    x es real           -- Devuelve el entero menor y mas cercano a x"
print*,"int(x)      x es real/complejo  -- Convierte x a integer, trunca hacia cero"
print*,"real(x)     x es entero/complejo-- Convierte x a real"
print*,"conjg(z)    z es complejo       -- Devuelve el conjugado de z"
print*,"min(a1,a2,..) a1,a2,.. son enteros/reales   -- Devuelve el minimo de todos los ai"
print*,"max(a1,a2,..) a1,a2,.. son enteros/reales   -- Devuelve el minimo de todos los ai"
print*,"mod(n,m)    m,n son enteros     -- Devuelve el resto de la division entera entre n y m"

print*;print*,"------- Funciones elementales para Strings ---------";print*

print*,"lge(stringA,stringB) stringA,stringB son de tipo character -- Devuelve true si stringA >= stringB "
print*,'     Ejemplo: lge("computacion","introduccion") devuelve:',lge("computacion","introduccion")
print*,"llt(stringA,stringB) stringA,stringB son de tipo character -- Devuelve true si stringA < stringB "
print*,'     Ejemplo: llt("aabbc","aabbhh") devuelve:',llt("aabbc","aabbhh")

print*;print*,"------- Funciones elementales para Arrays ---------";print*

print*,"dot_product(vectorA,vectorB)  vectorA,vectorB son arrays enteros/reales/complejos -- Devuelve el producto escalar"
print*,'     Ejemplo: dot_product((/1,2/),(/2,4/)) da',dot_product((/1,2/),(/2,4/))
print*,"matmul(matA,matB)  matA,matB son arrays de (n,k) y (k,m) respectivamente -- Devuelve el producto matricial"
print*,"sum(array)  array es de tipo array     -- Devuelve la suma de los elementos del array"
print*,"product(array) array es de tipo array  -- Devuelve el producto de los elementos del array"



end program intrinsicProcedures