Estoy tratando de leer algún código de Fortran, pero no puedo determinar qué hace el %
(signo de porcentaje).¿Qué significa "%" en Fortran?
Es en una línea como:
x = a%rho * g * (-g*a%sigma + m%gb * m%ca * (1.6 * a%rho+g))
¿Qué hacer?
Estoy tratando de leer algún código de Fortran, pero no puedo determinar qué hace el %
(signo de porcentaje).¿Qué significa "%" en Fortran?
Es en una línea como:
x = a%rho * g * (-g*a%sigma + m%gb * m%ca * (1.6 * a%rho+g))
¿Qué hacer?
En Fortran 90 le permiten crear estructuras como en C++. Básicamente actúa como el operador punto (.).
De http://www.lahey.com/lookat90.htm:
Estructuras (tipos derivados)
Puede agrupar sus datos con tipos derivados. Esto permite a los usuarios combinar tipos intrínsecos (incluidos matrices e indicadores) en nuevos tipos cuyos componentes individuales se pueden acceder utilizando el signo de porcentaje como delimitador. (Los tipos derivados se conocen como registros en VAX Fortran). ! Ejemplo utilizando tipos y módulos derivados.
module pipedef
type pipe ! Define new type 'pipe', which
real diameter ! is made up of two reals, an
real flowrate ! integer, and a character.
integer length
character(len=10) :: flowtype
end type pipe
end module pipedef
program main
use pipedef ! Associate module pipedef with main.
type(pipe) water1, gas1 ! Declare two variables of type 'pipe'.
water1 = pipe(4.5,44.8,1200,"turbulent") ! Assign value to water1.
gas1%diameter = 14.9 ! Assign value to parts
gas1%flowrate = 91.284 ! of gas1.
gas1%length = 2550
gas1%flowtype = 'laminar'
.
.
.
end program
Es un identificador de pieza para un tipo derivado. Mira esto. http://www.lahey.com/lookat90.htm
%
como muestra tiene una serie de usos estrechamente relacionados. A medida que Fortran ha desarrollado esos usos han aumentado en conteo.
Volviendo a Fortran 90, y el uso visto en la pregunta, %
se utiliza para acceder a los componentes de un tipo derivado. Considere el tipo derivado a_t
con objeto a
de ese tipo:
type a_t
real rho, sigma
end type
type(a_t) a
Los componentes rho
y sigma
de a
se puede acceder con a%rho
y a%sigma
. Como se puede ver en la pregunta, estos componentes se pueden usar en expresiones (como a%rho * g
) o pueden ser el lado izquierdo de una tarea (a%rho=1.
).
Un componente de un tipo derivado puede ser él mismo un objeto de tipo derivado:
type b_t
type(a_t) a
end type
type(b_t) b
y lo que puede haber múltiples apariciones de %
en una sola referencia:
b%a%rho = ...
Aquí, el El componente rho
del objeto de tipo derivado a
, que es en sí mismo un componente de b
, es el objetivo de la asignación. Uno puede ver un recuento bastante horrible de %
s en una referencia, pero las referencias de las partes siempre se resuelven de izquierda a derecha.
Llegando a Fortran 2003, uno ve a continuación %
relativa a los tipos derivados en un par de otras maneras:
considerar el tipo derivado
type a_t(n)
integer, len :: n=1
real x(n)
contains
procedure f
end type
type(a_t(2)) a
El objeto a
tiene un único parámetro de tipo longitud y un procedimiento de tipo de ruedas. En una expresión como
x = a%f()
la f
del objeto de tipo derivado de unión se hace referencia.
El parámetro n
de a
puede ser referenciado como
print *, a%n, SIZE(a%x)
tanto como el componente x
puede ser referenciado.
Por último, a partir de Fortran 2008, %
se pueden utilizar para acceder a las partes real e imaginaria de un objeto complejo:
complex x, y(3)
x%im = 1.
x%re = 0.
y = (2., 1.)
print *, y(2)%im+y(3)%re
lo siento, pero ¿cómo puede una respuesta describir algo de otro idioma, lo que si alguien no está familiarizado con operadores C++ o dot? –
Es simplemente una forma de acceder a una variable que es interna a un módulo. Entonces, como en el ejemplo, puede modificar directamente una sola variable del "objeto" 'gas1' sin tener que usar todo el constructor _i.e._ sin usar todas las variables necesarias (' water1 = pipe (4.5,44.8,1200, "turbulento") '). – Garini