2014-09-12 99 views
1

嗯,我现在有这个问题。我有一个(很大)的参数集,我想在矢量中组织。在fortran中定义长参数矢量的整洁方法

当然,我可以这样做:

real, dimension(64)   :: CONST 

CONST(1) = 2.4 
CONST(2) = 1.4 
... 
CONST(n) = CONST(1)*CONST(14)**CONST(7) 
... 
CONST(64) = ABS(CONST(18)) 

(请注意,一些常量都与其他常量)。

但是在这种情况下,我不会在变量中具有parameter属性,我希望拥有该属性。

我能想到的另一个选择是使用属性parameter,在这种情况下,我必须在变量的定义过程中将值赋予向量。喜欢的东西:

real, parameter, dimension(64) :: CONST =[2.4 , 1.4  , & 
               ...  , & 
               1.5412356 , & 
               ...  , & 
               342.5] 

但是,随着一些巨大的同行:

  • 的代码变得难于理解为线的大量的变量的定义中的结果。
  • 我无法将常量定义为其他常量的函数。

所以,

  • 有一个整洁的方式(如在第一代码)来定义与用Fortran属性parameter长向量?
  • (我想这不是)有一种方法来改变变量的属性,一旦我定义了它的值?

谢谢你的时间。

+0

如果你有一些常量可以通过循环计算出来,你可以考虑像CONST = [(i,i = 1,64)]这样的隐式循环...... – 2014-09-12 15:39:36

+0

好主意,但它们是一些生理参数,甚至不能靠某些循环来计算。 – 2014-09-12 15:40:49

+0

顺便说一句:你*可以*定义依赖于其他常量的常量! – 2014-09-12 15:44:47

回答

6

该参数的问题仅在于您无法定义常量数组以取决于其自身。但是,你可以定义的基本量,然后整个阵列包括推导出来的量,像这样:

program foo 
implicit none 

real, dimension(2), parameter :: basic = [2.4, 1.4] 
real, dimension(4), parameter :: all = [basic(1), basic(2),   & 
             basic(1)*basic(2)**basic(1), & 
             abs(basic(1))] 

print *, basic 
print *, all 

end program foo 

和,如果你想一直这样下去,你还不如命名的基本量的事实:

program foo 
implicit none 

real, parameter :: height = 2.4, bodymass = 1.4 
real, dimension(4), parameter :: all = [height, bodymass,  & 
             height*bodymass**2, & 
             abs(height)] 

print *, height, bodymass 
print *, all 

end program foo 

我无法想象身高是你需要采取的绝对值的东西,但你看到我的观点。