在(1)的任务中不相容的等级0和2

时间:2017-04-05 21:52:58

标签: arrays fortran gfortran

我无法理解gfortran中的数组和标量。所以当试图运行这三个方程时

REAL(8), DIMENSION(1:NI, 1:NJ) :: Slope_rad, Aspect_rad

REAL(8) :: clearsky,theta,theta_PyrStat, &
    Transmissivity,I0,Pressure

REAL(8), DIMENSION(runl) :: SolarZenithAngleCorr_rad, &
                       SolarAzimuthAngle_rad, rm_r2, PRESS_in, Hillshade, P

theta = acos(cos(Slope_rad)) *cos(SolarZenithAngleCorr_rad(T)) & 
            +sin(Slope_rad)*sin(SolarZenithAngleCorr_rad(T)) & 
            *cos(SolarAzimuthAngle_rad(T)-Aspect_rad)           

clearsky = I0*rm_r2(T)*Transmissivity**(P/(Press_IN(T)*cos(SolarZenithAngleCorr_rad(T))))*cos(theta);

Hillshade(T) = 255*((cos(SolarZenithAngleCorr_rad(T))*cos(Slope_rad)) &
            +(sin(SolarZenithAngleCorr_rad(T)) * sin(Slope_rad)) &
            *cos(SolarAzimuthAngle_rad(T) - Aspect_rad))

我收到以下错误

main.f90:406:3:

theta = acos(cos(Slope_rad)) *cos(SolarZenithAngleCorr_rad(T)) & 

1 错误:在(1)的分配中,排名0和2不兼容 main.f90时:411:3:

clearsky = I0*rm_r2(T)*Transmissivity**(P/(Press_IN(T)*cos(SolarZenithAngleCorr_rad(T))))*cos(theta);

1 错误:在(1)的赋值中不匹配排名0和1 main.f90时:417:3:

Hillshade(T) = 255*((cos(SolarZenithAngleCorr_rad(T))*cos(Slope_rad)) &

1 错误:在(1)

的赋值中,排名0和2不兼容

2 个答案:

答案 0 :(得分:0)

您的Slope_rad是一个数组。因此cos(Slope_rad)仍然是一个数组。您无法将数组分配到标量theta

首先确定Slope_rad的含义,如果它应该是数组或标量,值是什么意思,然后研究什么

theta = acos(cos(Slope_rad)) *cos(SolarZenithAngleCorr_rad(T)) & 
            +sin(Slope_rad)*sin(SolarZenithAngleCorr_rad(T)) & 
            *cos(SolarAzimuthAngle_rad(T)-Aspect_rad)   

应该意味着。

史蒂夫斯注意到,acos(cos(Slope_rad))无论如何都是一件奇怪的事情,无论Slope_rad是什么。

答案 1 :(得分:0)

让我们通过查看每个变量的排名来区分这一点,从theta的分配工作:

Rank(2, (1:NI, 1:NJ)) :: Slope_rad, Aspect_rad

Rank(0) :: clearsky, theta, theta_PyrStat, Transmissivity, I0,Pressure

Rank(1, (runl)) :: SolarZenithAngleCorr_rad, SolarAzimuthAngle_rad, &
                   rm_r2, PRESS_in, Hillshade, P

请注意,我在这里发明了排名符号 - Rank(N [, (D1, D2, ..., D<N>)]),其中N是数组排名(标量为0),(D1, D2, ..., D<N>)是可选的维度列表(为标量空了。)

所以看theta(根据弗拉基米尔F评论调整)并假设T是数组索引(与函数参数对比):

theta = acos(cos(Slope_rad) * cos(SolarZenithAngleCorr_rad(T))   & 
             + sin(Slope_rad) * sin(SolarZenithAngleCorr_rad(T)) & 
             * cos(SolarAzimuthAngle_rad(T) - Aspect_rad))

我们应该看到“等级保护”。如果我们关注每个变量和函数的形状:

Rank(0) =? acos(cos(Rank(2)) * cos(Rank(1))        & 
              + sin(Rank(2)) * sin(Rank(1))        & 
              * cos(Rank(1) - Rank(2)))

sincosacos等数学函数是元素(函数在数组的每个元素上执行),返回值取提供的参数的形状,例如,sin(Rank(2)) = Rank(2)。当您尝试计算cos(SolarAzimuthAngle_rad(T) - Aspect_rad)时会出现问题,因为SolarAzimuthAngle_rad(T) - Aspect_rad = Rank(1) - Rank(2)会导致不一致的排名错误。

首先使用循环编写这些表达式并手动执行每个元素的操作,然后验证代码是否正常工作,最后将其重构为更紧凑的数组操作形式可能会有所帮助。