1 实验要求
在指定时间和区域进行改变太阳入射短波辐射的耦合实验。太阳短波辐射在CAM模式中的变量名为SOLIN
float SOLIN(time, lat, lon) ;
SOLIN:Sampling_Sequence = "rad_lwsw" ;
SOLIN:units = "W/m2" ;
SOLIN:long_name = "Solar insolation" ;
SOLIN:cell_methods = "time: mean" ;
2 代码修改
要完成如上实验,只需找到CAM代码中SOLIN
的计算代码并进行修改即可。
SOLIN
的相关代码位于cam/src/physics/rrtmg/radsw.F90
:
real(r8), intent(out) :: solin(pcols) ! Incident solar flux
solin(1:ncol) = 0.0_r8
call CmpDayNite(E_coszrs, coszrs, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
! Define solar incident radiation
do i = 1, Nday
solin(i) = sum(sfac(:)*solar_band_irrad(:)) * eccf * coszrs(i)
end do
为了确定与代码中solin
在当前进程下相对应的时空范围,需要使用cam/src/physics/cam/phys_grid.F90
的get_rlat_all_p
和get_rlon_all_p
以及cam/src/utils/time_manager.F90
的get_curr_date
,具体语法为:
call get_rlat_all_p(lchnk, ncol, clat)
,其中输入变量lchnk,ncol
分别为当前大气物理模块的chunk id
和column number
,在计算SOLIN
的函数rad_rrtmg_sw
是输入,直接使用即可,输出纬度clat
,经度同理;
和call get_curr_date(yr, mon, day, tod, offset)
,前四个输出变量分别为年月日秒,offset
为与当前时刻之差,这里取0
还需要注意的是,clon, clat
的排列顺序与solin
计算中所用的太阳入射角余弦值coszrs
不同,coszrs
经过CmpDayNite
函数被调整为前Nday
个值均为当前有日照的位置。因此,我们也需要将clon, clat
通过CmpDayNite
得到相同排列:
call CmpDayNite(clat, clat_day, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
call CmpDayNite(clon, clon_day, Nday, IdxDay, Nnite, IdxNite, 1, pcols)
这样就可以根据clon_day, clat_day, yr, mon, day, tod
进行条件判断确定solin
如何被修改(注意经纬度均为弧度),例如:
! Define solar incident radiation
do i = 1, Nday
solin(i) = sum(sfac(:)*solar_band_irrad(:)) * eccf * coszrs(i)
if (clat_day(i)/3.1415926*180>30) then
solin(i) = solin(i) + 1000
endif
end do
完整代码位于github
参考:http://people.envsci.rutgers.edu/jlc449/NuclearNino/experiment.html