我无法理解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不兼容答案 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)))
sin
,cos
和acos
等数学函数是元素(函数在数组的每个元素上执行),返回值取提供的参数的形状,例如,sin(Rank(2)) = Rank(2)
。当您尝试计算cos(SolarAzimuthAngle_rad(T) - Aspect_rad)
时会出现问题,因为SolarAzimuthAngle_rad(T) - Aspect_rad = Rank(1) - Rank(2)
会导致不一致的排名错误。
首先使用循环编写这些表达式并手动执行每个元素的操作,然后验证代码是否正常工作,最后将其重构为更紧凑的数组操作形式可能会有所帮助。