修改6S Fortran77 代码,建立查找表

 

逐像元大气校正,常预先计算查找表(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:  } 
最后调用该脚本

>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   
  •        ……

转载于:https://www.cnblogs.com/wishmo/p/3429484.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++ 实例

#include "stdafx.h" #include <iostream> using namespace std; int main() { int a; a 4; cout<<a<<endl; return 0; }

VMware虚拟机与宿主无法复制的解决办法

由于工作需要&#xff0c;上网机器使用虚拟机&#xff0c;因此需要经常来回的拷贝文件&#xff0c;而vmware从6.5一直走来到10.0.1&#xff0c;总是有一个问题很让人苦恼---共享粘贴板总是会无故失效。经常实验&#xff0c;发现可以经过以下方法临时解决一下&#xff0c;虽然不…

c++ pat 乙级 --1001 害死人不偿命的(3n+1)猜想

1001 害死人不偿命的(3n1)猜想 &#xff08;15 分&#xff09; 卡拉兹(Callatz)猜想&#xff1a; 对任何一个正整数 n&#xff0c;如果它是偶数&#xff0c;那么把它砍掉一半&#xff1b;如果它是奇数&#xff0c;那么把 (3n1) 砍掉一半。这样一直反复砍下去&#xff0c;最后…

【开源项目之路】jquery的build问题

在刚开始clone了jquery到本地build的时候&#xff0c;就遇到了问题。 “ENORESTARGET No tag found that was able to satisfy ...” 提示为bower install失败&#xff0c;反复查找原因&#xff0c;最后在这儿看到同样类似的问题&#xff0c;貌似是git协议的连接问题&#xff0…

适配ios7

if ([self respondsToSelector:selector(edgesForExtendedLayout)]){self.edgesForExtendedLayout UIRectEdgeNone;self.extendedLayoutIncludesOpaqueBars NO;self.modalPresentationCapturesStatusBarAppearance NO;} 转载于:https://www.cnblogs.com/jiackyan/p/3441378.…

c++ pat 乙级 -------1002 读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

1002 写出这个数 &#xff08;20 分&#xff09; 读入一个正整数 n&#xff0c;计算其各位数字之和&#xff0c;用汉语拼音写出和的每一位数字。 输入格式&#xff1a; 每个测试输入包含 1 个测试用例&#xff0c;即给出自然数 n 的值。这里保证 n 小于 10​100​​。 输出…

USACO SEC.1.3 No.1 Mixing Milk

题意&#xff1a;需要收购总数为N的牛奶&#xff0c;现在有M个牛奶供应商&#xff08;总量足够&#xff09;&#xff0c;给出总数和单价&#xff0c;求最小的花销。 核心&#xff1a;基本的贪心解法&#xff0c;按单价排序逐个选取。 目的在于熟悉基本的贪心法的基本方法和思路…

c++ 获取数组的长度

//获得数组的长度 template<typename T> int count(T& x) { int s1 sizeof(x); int s2 sizeof(x[0]); int result s1 / s2; return result; }

[WPF疑难] 继承自定义窗口

[WPF疑难] 继承自定义窗口 原文 [WPF疑难] 继承自定义窗口 [WPF疑难] 继承自定义窗口 周银辉 项目中有不少的弹出窗口&#xff0c;按照美工的设计其外边框&#xff08;包括最大化&#xff0c;最小化&#xff0c;关闭等按钮&#xff09;自然不同于Window自身的&#xff0c;但每个…

c++ #includecstring

其中包含了众多的函数调用。

单独使用modelsim进行仿真

以例子来说明 我要用testbench lpf_direct_tb.v 来测试文件lpf_direct.v 命令行方式和图形界面两种方式都可以 1 映射库 .在编译源文件之前,创建一个库存放编译的结果. vlib lpf_direct_tb 把库映射到工作目录 vmap work lpf_direct_tb 2编译设计文件 vlog lpf_direct.v lpf_di…

c++ pat 乙级 ---1004 成绩排名

1004 成绩排名 &#xff08;20 分&#xff09; 读入 n&#xff08;>0&#xff09;名学生的姓名、学号、成绩&#xff0c;分别输出成绩最高和成绩最低学生的姓名和学号。 输入格式&#xff1a; 每个测试输入包含 1 个测试用例&#xff0c;格式为 第 1 行&#xff1a;正整…

richTextBoxFontClass

使用 private void button1_Click(object sender, EventArgs e) {RichTextBoxCtrl.richTextBoxFontClass r new RichTextBoxCtrl.richTextBoxFontClass();r.richTextBox richTextBox1;r.ToggleBold(); } using System; using System.Collections.Generic; using System.Linq;…

我感觉我恰似一个呆逼

TicTacToe V2.0。 非要用1-9来输入的结果就是使用二维数组这件事的意义变得非常难找。 留个遗体&#xff0c;我要改回坐标输入了。 1 public class Game {2 String chessBoard;3 String[][] pieces new String[3][3];4 5 /** 初始化棋盘样式和棋子数组。*/6 …

辅助工具栏目

1、推荐一款录像软件: 《EVCapture》 2、图像处理软件&#xff1a;打马赛克&#xff0c;添加水印&#xff0c;《快剪辑》软件

Android启动initlogo.rle制作

步骤如下&#xff1a; rgb2565为out/host/linux-x86/bin/rgb2565 #!/bin/sh convert -depth 8 initlogo.bmp rgb:initlogo.raw ./rgb2565 -rle <initlogo.raw> initlogo.rle 拷贝initlogo.rle至/root目录 转载于:https://www.cnblogs.com/easynote/p/3454088.html

爬虫:提取网页数据的几种方法

爬虫&#xff1a;提取网页数据的几种方法 1、Beautiful Soup 2、Pyquery 3、正则表达式 4、scrapy 自己的数据提取方法 Selector(选择器) Selector 是基于lxml来构建的&#xff0c;支持XPath选择器&#xff0c;CSS选择器&#xff0c;以及正则表达式

[企业化NET]Window Server 2008 R2[3]-SVN 服务端 和 客户端 基本使用

1. 服务器基本安装即问题解决记录 √ 2. SVN环境搭建和客户端使用 2.1 服务端 和 客户端 安装 √ 2.2 项目建立与基本使用 √ 2.3 基本冲突解决,并版&#xff0c;tags 3. 数据库安装 4. 邮件服务器搭建 5. JIRA环境搭建和使用 6. CC.NET项目持续发布工具…

关于爬虫中遇到的问题

1、 ModuleNotFoundError: No module named win32api 在setting中选择安装

关于 mysql.test 数据库

国内私募机构九鼎控股打造APP&#xff0c;来就送 20元现金领取地址&#xff1a;http://jdb.jiudingcapital.com/phone.html内部邀请码&#xff1a;C8E245J &#xff08;不写邀请码&#xff0c;没有现金送&#xff09;国内私募机构九鼎控股打造&#xff0c;九鼎投资是在全国股份…