逐像元大气校正,常预先计算查找表(LUT,LookUp Tabel),6S大气辐射传输模式也可以用来计算LUT。但6S源程序输出信息多,且浮点数输出精度低,不利于提取关键信息生成LUT,本文描述了怎样修改6S源码以生成LUT。

首先确定LUT内容要素。

       阅读MODIS M?D04 气溶胶产品生成算法文档(NASA相关网页),归纳了以下查找表要素:

  • 1)       太阳天顶角观测天顶角太阳方位角观测方位角之差(相对方位角)散射角
  • 2)       大气模式
  • 3)       气溶胶模式
  • 4)       550nm气溶胶光学厚度
  • 5)       波段号
  • 6)       大气透过率
  • 7)       atm. intrin. ref.(个人理解,这是大气程辐射换算后的反射率,用于校正计算)
  • 8)       total  sca. (总散射,包括rayleigh散射和气溶胶散射,用于校正计算)
  • 9)       表观反射率
  • 10)    校正后的地表反射率
  • 11)    xa xb xc参数(物理意义不明,用于校正计算)

其次,阅读源码,明确LUT各要素在6S源码中的变量名。

6S大气校正计算源码(Excel验证中采用此公式)

         rog=rapp/tgasm
         rog=(rog-ainr(1,1)/tgasm)/sutott/sdtott
         rog=rog/(1.+rog*sast)
     xa=pi*sb/xmus/seb/tgasm/sutott/sdtott
     xb=srotot/sutott/sdtott/tgasm
     xc=sast

       由计算源码确定需输出的变量。下面是输出LUT要素的Fortran77代码示例,建议放在源码main.f中stop一句之前。

      write(*,*) asol,phi0,avis,phiv,adif,phi,idatm,iaer,v,taer55,
     1  iwave,tgasm,ainr(1,1),sutott*sdtott,rapp,rog,xa,xb,xc

  • 其中,asol是太阳天顶角,
  • phi0是太阳方位角,
  • avis是观测天顶角,
  • phiv是观测方位角,
  • adif是散射角,
  • phi是相对方位角,
  • idatm是大气模式号,
  • iaer是气溶胶模式号,
  • v是水平能见度,
  • taer55是550nm气溶胶光学厚度,
  • iwave表示波段号,
  • tgasm表示大气透过率,
  • ainr(1,1)是大气本身的反射率(姑且这么理解),
  • sutott*sdtott表示总散射,
  • rapp是表观反射率,
  • rog是校正后的地表反射率,
  • xa,xb,xc是校正计算参数。

Fortran77每行长度不能超过80个字符,续前行需在特定位置指明(示例中的iwave前的1即表示续行)。

该示例源码没有指定任何输出样式。浮点数会按默认样式输出,小数点后的位数比较多,精度较好。

挑选一个查找表文件用Excel验证后表明,excel公式计算值与6S输出值之间最大误差小于1E-7。说明方法是可行的。

再次,编译源码,编写Shell脚本:

编译环境:OpenSUSE操作系统 g95编译器,版本未知。

编译命令:g95 *.f -o sixs(在BRDF相关代码处可能有几个warning,本文不涉及BRDF,故暂不修改调试。在Windows下用f77编译,无warning,编译通过)

生成LUT的bash脚本getLUT.sh:

       1:  function LUTCalc(){ 
       2:  #{42,44,48,25,27,30} 
       3:  IBand=$1 
       4:  echo "Band ${IBand} is running" 
       5:  for Iref in {0.1,0.5} 
       6:  do 
       7:  fstat=${IBand}"_"${Iref}.res       
       8:  echo "asol,phi0,avis,phiv,adif,phi,idatm,iaer,v,taer55, iwave,tgasm,ainr,tott,rapp,rog,xa,xb,xc" >> ${fstat} 
       9:  for SolarZ in {0,15,30,45,75} 
      10:  do 
      11:    for SolarAz in {0,45,90,135} 
      12:    do 
      13:     for ViewZ in {0,15,30,45,75} 
      14:     do 
      15:      for Iaer in {1,2,3,5,6,7} 
      16:      do 
      17:       for Idatm in {1,2,3,4,5,6} 
      18:       do 
      19:        for IAod in {0.1,0.2,0.5,1.0}; 
      20:        do 
      21:  #   Run sixs and output 
      22:  ./sixs <<EOF | tail -n 1 >> ${fstat} 
      23:  0 
      24:  $SolarZ $SolarAz $ViewZ 0 3 15 
      25:  $Idatm 
      26:  $Iaer 
      27:  0 
      28:  $IAod 
      29:  -0 
      30:  -1000 
      31:  ${IBand} 
      32:  0 
      33:  0 
      34:  0 
      35:  0.0 
      36:  -$Iref 
      37:  EOF 
      38:         done 
      39:        done 
      40:       done 
      41:      done 
      42:     done 
      43:    done 
      44:    done 
      45:  } 
      46:  function getLUT() 
      47:  { 
      48:  echo "LUT is Calcing" 
      49:  for iwave in {42,44,48,25,27,30} 
      50:  { 
      51:    LUTCalc ${iwave} 
      52:  } & 
      53:  } 

    .csharpcode, .csharpcode pre
    {
    font-size: small;
    color: black;
    font-family: consolas, "Courier New", courier, monospace;
    background-color: #ffffff;
    /*white-space: pre;*/
    }
    .csharpcode pre { margin: 0em; }
    .csharpcode .rem { color: #008000; }
    .csharpcode .kwrd { color: #0000ff; }
    .csharpcode .str { color: #006080; }
    .csharpcode .op { color: #0000c0; }
    .csharpcode .preproc { color: #cc6633; }
    .csharpcode .asp { background-color: #ffff00; }
    .csharpcode .html { color: #800000; }
    .csharpcode .attr { color: #ff0000; }
    .csharpcode .alt
    {
    background-color: #f4f4f4;
    width: 100%;
    margin: 0em;
    }
    .csharpcode .lnum { color: #606060; }

  • 最后调用该脚本

>source getLUT.sh

>getLUT

最好晚上计算早晨看结果,如果CPU给力的话,几个小时后就可以得到结果。

下面是生成的LUT示例:

  • asol,phi0,avis,phiv,adif,phi,idatm,iaer,v,taer55, iwave,tgasm,ainr,tott,rapp,rog,xa,xb,xc
  •    0.0000000       0.0000000       0.0000000       0.0000000       180.00000       0.0000000    1   1   63.664398      0.10000000    25  0.98984975      6.89081103E-02  0.80637234      0.10000000      3.87301818E-02  1.98730151E-03  8.71319696E-02  0.14777245   
  •    0.0000000       0.0000000       0.0000000       0.0000000       180.00000       0.0000000    1   1   26.739149      0.20000000    25  0.98984975      7.75793791E-02  0.76532620      0.10000000      2.94530466E-02  2.09388486E-03  0.10336593      0.16389242   
  •    0.0000000       0.0000000       0.0000000       0.0000000       180.00000       0.0000000    1   1   8.4940033      0.50000000    25  0.98984975      0.10173188      0.64870018      0.10000000     -2.69861287E-03  2.47033220E-03  0.15994170      0.20088956   
  •    0.0000000       0.0000000       0.0000000       0.0000000       180.00000       0.0000000    1   1   3.5674956       1.0000000    25  0.98984975      0.13688390      0.48083964      0.10000000     -7.89646432E-02  3.33272247E-03  0.29038188      0.24035060   
  •        ……

修改6S Fortran77 代码,建立查找表的更多相关文章

  1. Quarter square 查找表乘法器,手动建立rom

    建立一个C的范围为0~255,内容是(C)2/4的查表 占用256个存储空间,但可以计算出+-127的两个数之积.传统算法需要至少127×127个存储空间. 查找表模块的建立: module lut_ ...

  2. 算法与数据结构(九) 查找表的顺序查找、折半查找、插值查找以及Fibonacci查找

    今天这篇博客就聊聊几种常见的查找算法,当然本篇博客只是涉及了部分查找算法,接下来的几篇博客中都将会介绍关于查找的相关内容.本篇博客主要介绍查找表的顺序查找.折半查找.插值查找以及Fibonacci查找 ...

  3. OpenCV从入门到放弃系列之——如何扫描图像、利用查找表和计时

    目的 如何遍历图像中的每一个像素? OpenCV的矩阵值是如何存储的? 如何测试我们所实现算法的性能? 查找表是什么?为什么要用它? 测试用例 颜色空间缩减.具体做法就是:将现有颜色空间值除以某个输入 ...

  4. OpenCV学习笔记:如何扫描图像、利用查找表和计时

    目的 我们将探索以下问题的答案: 如何遍历图像中的每一个像素? OpenCV的矩阵值是如何存储的? 如何测试我们所实现算法的性能? 查找表是什么?为什么要用它? 测试用例 这里我们测试的,是一种简单的 ...

  5. 利用Xilinx中的ROM构造查找表来计算sin和cos的方法探讨

    1.使用matlab制作.coe文件 查找表的构造 构造256点的正余弦表 exp(-j*2*pi*(0:255)/256),分别得到 cos和sin的查找表 matlab代码: 求sin fid = ...

  6. 修改一行SQL代码 性能提升了N倍

    在PostgreSQL中修改了一行不明显的代码,把(ANY(ARRAY[...]) 改成 ANY(VALUES(...))),结果查询时间从20s变为0.2s.最初我们学习使用EXPLAN ANALY ...

  7. 【C/C++】查找(一):静态查找表

    {静态查找表 + 动态查找表} 所谓动态,就是,找的时候没有则添加,或者能删除 关键字:primary key:用来表示查找表中的一条记录 {主关键字 + 次关键字} 主关键字是唯一的,用来唯一的标识 ...

  8. 查找->动态查找表->二叉排序树

    文字描述 二叉排序树的定义 又称二叉查找树,英文名为Binary Sort Tree, 简称BST.它是这样一棵树:或者是一棵空树:或者是具有下列性质的二叉树:(1)若它的左子树不空,则左子树上所有结 ...

  9. 修改一行SQL代码 性能提升了100倍

    在PostgreSQL中修改了一行不明显的代码,把(ANY(ARRAY[...]) 改成 ANY(VALUES(...))),结果查询时间从20s变为0.2s.最初我们学习使用 EXPLAN ANAL ...

随机推荐

  1. 第二次冲刺spring会议(第一次会议)

    [例会时间]2014/5/4  21:15 [例会地点]9#446 [例会形式]轮流发言 [例会主持]马翔 [例会记录]兰梦 小组成员:兰梦 ,马翔,李金吉,赵天,胡佳奇 内部测试版发布时间5月11日 ...

  2. tomcat源码分析(二)启动过程

    在Catalina的load方法中,首先初始化Server组件. // Start the new server if (server instanceof Lifecycle) { try { se ...

  3. Python 拆分字符串

    数:split() Python中有split()和os.path.split()两个函数,具体作用如下:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list ...

  4. app测试--稳定性测试

    稳定性测试的概念有2种, 一, 稳定性测试,对应于异常性测试,即发生异常情况时,系统如何反应的测试.包含: 1 交互性测试,被打扰的情况,如来电,短信,低电量等.这些其实在上章的功能测试中有提到. 2 ...

  5. div盒子水平垂直居中的方法

    这个问题比较老,方法比较多,各有优劣,着情使用. 一.盒子没有固定的宽和高 方案1.Transforms 变形 这是最简单的方法,不仅能实现绝对居中同样的效果,也支持联合可变高度方式使用.内容块定义t ...

  6. Activity LauchMode启动模式(转载)

    转载于:http://www.cnblogs.com/plokmju/p/android_ActivityLauncherMode.html 在一个Android应用中,不可避免的会包含多个Activ ...

  7. python基础(三)列表、数组、字典

    列表与元组 列表是最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 1 >>> names = ['wangeq','zlx','jack','rose ...

  8. json 数组 对象 xml 之间转换(待补充)

    json 数组  xml 对象   之间转换(待补充) 1 把对象的类型或者数组转换成字符串类型(或者更确切的说是json类型的). 此处参考链接http://www.jb51.net/article ...

  9. 新任 CEO 致员工公开信:微软下一步做什么?

    在微软宣布纳德拉成为新任 CEO 之后,全体微软员工收到了新掌门人的公开信,我们来看看他在信中都写了些什么?   我是谁?   我今年 46 岁,结婚已经 22 年了,现在有三个孩子.和其他人一样,我 ...

  10. ActionBar更改背景颜色(主题)

    1.默认是黑色的背景, 2.更改主题theme为Theme.AppCompat.Light即可,清单文件主题如下: <application android:name="com.ith ...