2011-11-11 17 views
11

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?

Respuesta

23

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 
+0

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? –

+0

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

1

% 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:

  • referencia a una unión de un objeto;
  • preguntando por los parámetros de un tipo parametrizado.

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