2. The Model-PEST Interface

2. The Model-PEST Interface ..................................................................................................12

2.1 PEST Input Files...........................................................................................................12

2.2 Template Files...............................................................................................................12

2.2.1 Model Input Files ..................................................................................................12

2.2.2 An Example...........................................................................................................13

2.2.3 The Parameter Delimiter.......................................................................................14

2.2.4 Parameter Names...................................................................................................15

2.2.5 Setting the Parameter Space Width.......................................................................15

2.2.6 How PEST Fills a Parameter Space with a Number .............................................17

2.2.7 Multiple Occurrences of the Same Parameter.......................................................19

2.2.8 Preparing a Template File .....................................................................................20

2.3 Instruction Files.............................................................................................................20

2.3.1 Precision in Model Output Files............................................................................20

2.3.2 How PEST Reads a Model Output File ................................................................21

2.3.3 An Example Instruction File .................................................................................21

2.3.4 The Marker Delimiter............................................................................................22

2.3.5 Observation Names ...............................................................................................23

2.3.6 The Instruction Set ................................................................................................23

2.3.7 Making an Instruction File ....................................................................................34

2. 模型- pest接口

2.1 PEST输入文件

PEST需要三种类型的输入文件。这些是模板文件,每个模型输入文件一个,其中定义了参数;•一个控制文件,为PEST提供所有模板和指令文件的名称,相应的模型输入和输出文件的名称,问题大小,控制变量,初始参数值,测量值和权重等。


本章详细描述了前两种文件类型;本手册稍后将讨论模板文件和指令文件,可以使用通用的文本编辑器按照本章列出的规范编写。或者,它们可以使用特定于特定建模应用程序的专用软件来编写。一旦构建完成,就可以使用本手册第二部分中记录的实用程序TEMPCHEK、INSCHEK和PESTCHEK检查它们的正确性和一致性。


请注意,在本手册的本章和其他章节中,“observation”一词用于表示从模型输出文件中读取的数字。字段测量可能对应于此数字,在这种情况下,该数字是此测量的模型生成的对应物。如果是这样的话,PEST的任务就是减少这两者之间的差异(即残差),同时减少其他观测值与其模型生成的对应值之间的差异。在其他情况下,从模型输出文件中提取的数字可能被赋予0的权重。在这种情况下,它只是一个感兴趣的模型输出,可能是一个模型预测。然而,为方便起见,在本手册中仍将其称为“观察”。


2.2模板文件

2.2.1模型输入文件

每当PEST运行模型时,就像它在填充雅可比矩阵或求解逆问题时必须多次执行的那样,它必须首先将参数值写入保存它们的模型输入文件。无论运行模型是为了计算由用户提供的初始参数值产生的目标函数,还是为了测试参数升级,还是为了计算关于特定参数的观测值的导数,PEST都提供了一组参数值,它希望模型在该特定运行中使用这些参数值。模型访问这些值的唯一方法是从它的输入文件中读取它们。

有些模型从终端读取部分或全部数据,用户需要根据模型提示提供这些数据项。这也可以通过文件完成。如果您将通常通过终端提供给模型的响应写入文件,则可以使用模型命令行上的“<”符号将这些响应“重定向”到模型。因此,如果您的模型使用命令“model”运行,并且您提前将响应输入到文件文件中。inp,那么您(和PEST)就可以运行模型,而不必使用命令model < file提供终端输入。inp If文件。inp包含PEST必须优化的参数,可以为它构建模板,就像它是任何其他模型输入文件一样。


一个模型可以读取许多输入文件;然而,只有那些包含需要估计的参数的输入文件才需要模板。PEST不需要知道任何其他模型输入文件。


PEST只能将参数写入ASCII(即文本)输入文件。如果一个模型需要一个二进制输入文件,你必须编写一个程序,将写入ASCII文件的数据转换为模型所期望的二进制形式。翻译程序,然后是模型,可以通过将它们列在批处理文件中来依次运行,PEST将其作为“模型”运行。然后,翻译程序的ASCII输入文件将成为模型输入文件,为此需要一个模板。


模型输入文件可以是任意长度。然而,PEST坚持它的宽度不超过2000个字符。这同样适用于模板文件。建议模板文件的扩展名为"。Tpl”,以区别于其他类型的文件。

2.2.2举例


模板文件的名字来源于这样一个事实:它只是模型输入文件的一个副本,只是后一个文件中每个参数所占用的空间被一个字符序列所取代,这些字符序列标识了属于该参数的空间。


考虑图2.1所示的模型输入文件;该文件为程序提供数据,该程序计算不同表面电极配置的分层半空间表面的“视电阻率”。假设我们希望使用该程序(即模型)从半空间表面收集的视电阻率数据估计三个半空间层的性质。我们想要估计的参数是上面两层的电阻率和厚度以及第三层的电阻率(其厚度是无限的)。合适的模板文件如图2.2所示。

2.2.3参数分隔符

如图2.2所示,模板文件的第一行必须包含字母“ptf”,后跟一个空格,再后跟一个字符(“ptf”代表“PEST模板文件”)。空格后面的字符是“参数分隔符”。在模板文件中,“参数空间”被标识为介于并包括一对参数分隔符之间的一组字符。当PEST基于模板文件写入模型输入文件时,它用一个表示拥有该空间的参数的当前值的数字替换这些参数分隔符之间和包括这些参数分隔符的所有字符;该参数在参数空间内的参数分隔符之间按名称标识。


必须自己选择参数分隔符;但是,您的选择受到限制,因为字符[a-z], [a-z]和[0-9]是无效的。参数分隔符字符必须在模板文件中任何地方出现,除非作为参数分隔符,因为每当PEST在模板文件中遇到该字符时,它就假定它正在定义一个参数空间。

2.2.4参数名称

所有参数都按名称引用。模板文件(标识参数在模型输入文件上的位置)、PEST控制文件(提供参数初始值、下上界等信息)以及PEST套件中承担各种参数处理任务的实用程序的输入文件中都需要参数引用。参数名的长度可以是1到12个字符,除了空格字符和参数分隔符字符外,任何字符都是合法的。参数名不区分大小写。


每个参数空间由两个参数分隔符定义;空格所属的参数名称必须写在两个分隔符之间。


如果模型输入文件中用于写入某个参数的可用空间有限,则参数名称可能需要大大少于12个字符,以便在有限的可用空间内写入名称和左右分隔符。因此,允许的最小参数空间宽度是三个字符,左右分隔符各一个字符,参数名称各一个字符。

2.2.5设置参数空间宽度

一般来说,参数空间越宽(达到一定限度-见下文),PEST就越喜欢它,因为数字在更宽的空间中比在更窄的空间中更精确地表示。然而,与模型生成观测的情况不同,模型生成观测的最大精度对获得可用的导数至关重要,PEST可以调整到模型输入文件中参数表示的有限精度,只要使用足够的精度,使得参数值可以与用于导数计算的相同参数的增量值区分开来。因此,超过一定数量的字符,确切的数字取决于参数值和参数增量的大小和类型,额外的精度并不重要。尽管如此,按照模型能够读取的精度赋予参数值是一个很好的做法,这样它们就可以以与PEST计算它们的精度相同的精度提供给模型。


通常,模型以两种方式从终端或从输入文件中读取数字,即从指定的字段读取数字,或作为数字序列读取数字,每个数字可以是任意长度;后一种方法通常被称为“自由字段”输入或“列表定向”输入。如果模型使用前一种方法,那么在模型的某个地方编程格式(即。


为必须以这种方式读取的每个数字定义了数据输入的字段规范(Field specification)。

图2.3中的FORTRAN代码指示程序读取五个实数。前三个使用格式说明符读取,而后两个以自由字段的方式读取。

请注意,使用字段说明符读取的数字之间不需要空格或逗号。图2.3中标记为“100”的格式语句指示从该行的前10个位置读取变量A,从接下来的10个位置读取变量B,从之后的10个位置读取变量C。当程序读取这些数字中的任何一个时,它并不关心当前关注的字段之外的字符是什么。然而,要读入变量D和E的数字必须用空格或逗号分隔,以便程序知道一个数字的结束位置和下一个数字的开始位置。


假设所有的变量A到E都是模型参数,并且PEST被分配了估计它们的任务。为方便起见,我们为这些参数提供了与模型代码使用的相同的名称(当然,通常不是这样)。然后,图2.4对应的模板片段可以如图2.5所示。请注意,参数A、B和C的参数空间都是10个字符宽,并且参数空间之间的相互关系符合通过图2.3的格式说明符定义的模型期望。如果这些参数中的任何一个参数空间的宽度大于10个字符,那么PEST在用当前参数值替换每个参数空间时,将构造一个模型输入文件,该文件将被模型错误地读取。(如果您愿意,您可以设计小于10个字符宽的参数空间,只要您在每个参数空间之间放置足够的空白,以便在PEST写入模型输入文件时替换每个这样的空间的数字落在模型期望的字段内。然而,以这种方式定义参数空间将一无所获,因为使用少于模型允许的完整10个字符将没有任何优势。)

参数D和E与参数A、B和c的处理方式非常不同。如图2.3所示,模型简单地期望两个连续的数字。如果将图2.5中出现的参数D和E的空格替换为两个数字(每个数字都是13个字符长),则满足了模型对由空格或逗号分隔的连续两个数字的要求,也满足了PEST对最大精度的偏好。


比较图2.4和图2.5,可以明显看出,参数D和E的空格

对比图2.4和图2.5可以明显看出,参数D和E在模板文件上的空间大于构建模板文件的模型输入文件上对应数字所占的空间;这同样适用于图2.2中定义的与图2.1的模型输入文件相关的参数空间。在模板文件构造的大多数情况下,将使用模型输入文件作为起点。在这样的文件中,使用自由字段输入读取的数字通常会省略后面的零。在构建模板文件时,您应该识别使用自由字段输入读取的数字,并相应地在原始数字之外扩展参数空间(向右),确保在连续空格之间或参数空间与相邻字符或数字之间留下空白或逗号。

同样,通过字段指定格式语句读取的数字可能不会占用模板文件中模型输入文件的整个字段宽度(例如图2.4中的变量a)。在这种情况下,您应该再次将参数空间扩展到数字的范围之外(通常仅扩展到数字的左侧),直到该空间与模型读取数字时使用的格式说明符中定义的字段一致。(如果你不确定这个字段,因为模型手册没有告诉你,或者你没有模型的源代码,你将经常,然而,能够做出一个很好的猜测字段的宽度是多少。只要您定义的参数空间不超出格式指定字段的边界,并且空间足够宽,可以区分参数值和增量变化的参数值,这就足够了。)

2.2.6 PEST如何用数字填充参数空间

PEST将尽可能多的有效数字写入参数空间。这样,即使为了满足模型的输入域要求,参数空间必须很小,仍然有机会将参数值与其增量变化的对应值区分开来,从而允许对该参数进行适当的导数计算。此外,正如已经讨论过的那样,即使PEST调整其参数值的内部表示,使其达到模型可以读取的精度,以便PEST和模型使用相同的数字,但通常精度越高越好。


两个用户提供的控制变量PRECIS和DPOINT影响PEST将参数值写入参数空间的方式。这两个变量都是通过PEST控制文件提供给PEST的。PRECIS是一个字符变量,必须以“single”或“double”的形式提供。它决定在写入参数值时是遵循单精度协议还是双精度协议;除非参数空间的宽度大于13个字符,否则它与将参数值写入模型输入文件的精度无关,因为这是由参数空间的宽度决定的。如果PRECIS设置为“single”,则指数由字母“e”表示;此外,如果参数空间的宽度大于13个字符,则只使用最后13个空格来写入表示参数值的数字,参数空间内的任何其余字符都留空。对于“double”选项,最多可以使用23个字符来表示一个数字,字母“d”用于表示指数;此外,还可以表示极大和极小的数。

如果模型的输入数据字段很小,并且您对此无能为力,则必须尽一切努力将尽可能多的精度“压缩”到有限的可用参数空间中。无论如何,PEST都会这样做,但是如果小数点是冗余的,则不需要在数字中包含小数点,则它可能能够获得一个或多个额外的有效数字。因此,如果参数空间为5个字符宽,并且该字段所属参数的当前值为10234.345,则PEST将根据是否必须包含小数点将该数字写入“1.0e4”或“10234”。类似地,如果参数空间为6个字符宽,则数字106857.34可以表示为" 1.07e5 "或" 1069e2 ",具体取决于是否必须包含小数点。

通过将字符串“nopoint”赋值给PEST控制变量DPOINT,您可以指示PEST在可能的情况下省略数字表示中的小数点。然而,这样做应该非常谨慎。如果用FORTRAN编写模型,并且使用自由字段输入读取数字,或者使用字段宽度说明符(如“(F6.0)”或“(E8.0)”),则不需要小数点。然而,在其他情况下,格式说明符将插入自己的小数点(例如对于诸如“(F6.2)”之类的说明符),或者如果输入数字中没有小数点,则强制执行10的幂次缩放(例如对于诸如“(E8.2)”之类的说明符)。因此,如果你不确定该怎么做,将字符串" point "赋值给控制变量DPOINT;这将确保写入模型输入文件的所有数字都包含一个小数点,从而覆盖一些FORTRAN格式说明符中隐含的点定位或缩放约定。


请注意,如果参数空间的宽度为13个字符或更大,并且PRECIS设置为“single”,则无论“DPOINT”设置如何,PEST都将包括小数点,因为忽略它不会在精度上获得任何收益。类似地,如果PRECIS设置为" double ",则如果参数空间的宽度为23个字符或更多,则不会尝试省略小数点。


表2.1显示了DPOINT的设置如何影响数字12345.67的表示。在检查该表时,请记住,PEST以这样一种方式写入数字,即将最大可能的精度“压缩”到每个参数空间中。

表2.1数字12345.67的表示

如下所述,模板文件可以为同一个参数包含多个空格。在这种情况下,PEST将使用为该特定参数指定的最小参数空间宽度将参数值写入所有这些空间;对于较宽的空格,该数字将右对齐,并在左侧填充空格。通过这种方式,将一致的参数值写入属于该参数的所有空格中。

2.2.7同一参数多次出现

计算某些标量或矢量在二维或三维空间上的变化的大型数值模型可能需要在其输入文件中以二维或三维数组的形式写入大量的系统属性数据。例如,有限差分地下水模型可以读取表示模拟区域上的水力传导性、储存系数和其他含水层属性分布的数组,每个数组中的每个元素都属于一个矩形有限差分“单元”。用于模拟矿体上的地球物理遍历结果的有限元模型可能需要包含矿体和周围地球被细分成的各种元素的电导率值的数组。对于用于空间离散的二维或三维非均匀系统的大型网格或网络,可能需要数百甚至数千个数字来表示分布式系统属性。


如果需要使用现场测量来推断系统属性(使用诸如此类的模型将这些属性与系统响应联系起来),则必须对分布参数的空间变化做出某些假设。一个常见的假设是模型域是“分区的”。根据这一假设,系统被细分为若干区域或体积,其中每个区域或体积都有一定的物理性质是恒定的。因此,虽然输入数组仍然包含数百甚至数千个元素,但每个元素将仅是n个不同数字中的一个,其中n是模型域被细分为的区域的数量。


为这样的模型构造一个PEST模板文件是一件很简单的事情。首先以通常的方式为模型运行做准备。使用模型预处理器,为n个不同的模型区域中的每一个分配n个特定属性的不同值,以通常的方式将模型输入数组写入模型输入文件。然后,使用文本编辑器的“搜索和替换”功能,编辑模型输入文件,使得在表示某一区域的属性的数字的特定数组中的每一个出现被更改为参数空间标识符(例如“# ro1 #”);记住要使参数空间尽可能宽的模型将允许,以确保最大的精度。如果对数组中出现的n个不同的数字依次执行此操作,并使用不同的参数名称代替每个不同的数字,则数字数组将被参数空间数组替换。当PEST写入模型输入文件时,它会像往常一样将每个这样的参数空间替换为对应的当前参数值;因此,它将重建一个包含数百甚至数千个元素的数组,但其中只表示n个不同的数字。


同一参数的多次发生不局限于一个文件。


如果模型有多个输入文件,并且如果您想要估计的特定参数出现在多个这些文件中,那么该参数的至少一个空间将出现在多个模板文件中。PEST不会对模板文件内或跨模板文件的参数的出现作出判断。但是,它确实要求在PEST控制文件中引用的每个参数至少在至少一个模板文件中出现一次,并且在PEST控制文件中为模板文件中引用的每个参数提供边界和初始值。

(请注意,比分段恒定区提供的更复杂的空间分布参数化方法可以通过诸如PLPROC之类的程序获得,这些程序可从PEST网页下载。在其他设备中,PLPROC支持使用导频点。在撰写本文时,可以使用kriging,距离逆幂插值和径向基函数实现从这些点到模型网格或网格的插值。

2.2.8制作模板文件

模板文件的准备是一个简单的过程。对于大多数模型,使用文本编辑器将典型模型输入文件中的参数值替换为它们各自的参数空间标识符,可以在很短的时间内完成。


一旦模板文件准备好了,就可以使用实用程序TEMPCHEK检查它的正确性;见本手册第二部分。TEMPCHEK还具有在模板文件和用户提供的参数值列表的基础上编写模型输入文件的能力。如果您随后运行您的模型,为它提供这样一个tempcheck准备的输入文件,您可以验证模型在读取PEST准备的输入文件时没有任何困难。

2.3指令文件

在模型可能写入其输出文件的大量信息中,PEST只对几个数字感兴趣。这些数字可以是相应的现场或实验室数据,并且模型输出和测量值之间的差异必须在加权最小二乘意义上减少到最小。或者,它们可以是特别感兴趣的模型预测,或者它们可以仅仅是需要参数敏感性的模型输出。


在接下来的讨论中,这些特定的模型生成的数字被称为“观测值”或“模型生成的观测值”。同时,作为模型生成对应的现场或实验室测量称为“测量”。


对于每个包含观察结果的模型输出文件,您必须提供一个指令文件,其中包含PEST必须遵循的指示,以便读取该文件。请注意,如果模型输出文件的宽度超过2000个字符,PEST将无法读取它;然而,模型输出文件可以是任意长度的。


有些型号将部分或全部输出数据写入终端。您可以使用“>”符号将这个屏幕输出重定向到一个文件,并教PEST如何以通常的方式使用匹配的指令文件读取这个文件。


建议指令文件的扩展名为“”。为了将它们与其他类型的文件区分开来。

2.3.1模型输出文件的精度

如果有任何控制变量允许您改变模型输出数据写入的精度,则应该调整这些控制变量,以便由PEST读取的模型输出被模型以最大可用精度记录。与参数值不同,精度很重要,但不是必需的,模型生成观测的表示精度是至关重要的。正如在引言中提到的,以及Doherty(2015)中广泛讨论的那样,PEST实现的反演和不确定性量化方法要求模型输出相对于模型参数的导数计算的完整性。PEST使用有限差分技术计算这些导数,其中模型生成的相似量级的数字彼此相减。如果差很小,减法会损失精度。除非PEST从模型输出文件中读取的数字在这些文件中以最大精度表示,否则通过减法产生的精度损失可能足以使这样计算的导数无效。就PEST而言,这是一个数字灾难的配方。

2.3.2 PEST如何读取模型输出文件

必须教PEST如何读取模型输出文件并确定它必须从该文件中提取的数字。为此,PEST读取的模型输出文件必须是文本文件;PEST不能读取二进制文件。如果你的模型只产生二进制文件,你将需要编写一个简单的程序来读取这些二进制数据并将其重写为ASCII格式;然后,PEST可以在ASCII文件中搜索所需的数字。


不幸的是,不能使用模板概念从模型输出文件中读取数字。


这是因为不能依赖许多模型在每次模型运行时生成具有相同结构的输出文件。例如,计算隧道附近地下应力状态的模型可能采用迭代数值解方案,根据特定运行的边界条件和材料特性,需要不同的迭代次数来实现数值收敛。如果模型在它的输出文件中记录了求解过程的收敛历史,并且它的应力计算的结果被记录在下面的行中,那么根据计算它们所需的迭代次数,后者可能会向下偏移。


因此,您不能使用输出文件模板,而是必须向PEST提供关于如何查找输出文件上的观察结果的一系列说明。基本上,PEST以与人相同的方式查找模型输出文件上的观察结果。一个人通过他/她的眼睛在文件中寻找他/她认识的东西——一个“标记”;如果正确选择这个标记,通常可以用一种简单的方式将观察结果与它联系起来。例如,如果您正在寻找上述应力模型在经过100天的时间后的审议结果,您可以指示PEST读取其输出文件,寻找标记应力计算在有限元节点:然后,您可以找到相应字段测量的特定结果,例如,在上述标记后面的第4行字符位置23和30之间,或标记后面的第3行第5项,等等。请注意,对于简单的模型,特别是“自制的”、单一用途的模型,在高度描述性的输出文件中投入的开发时间很少,可能不需要任何标记,默认的初始标记是文件的顶部。


标记可以是主要类型或次要类型。PEST在逐行扫描模型输出文件时使用主要标记,为后续观察识别或进一步扫描寻找参考点。当从左到右检查单线时,二级标记用于参考点。

2.3.3指令文件示例

图2.6显示了模型编写的输出文件,其输入文件如图2.1所示。


假设我们希望通过比较模型产生的视电阻率和现场测量提供的一组视电阻率来估计图2.2模板文件中出现的参数(即三个半空间层的电阻率和上面两个半空间层的厚度)。然后,我们需要向PEST提供有关如何读取图2.6中出现的每个视电阻率的说明。一个合适的指令文件如图2.7所示。

2.3.4标记分隔符

一个PEST指令文件的第一行必须以三个字母“pif”开头,这三个字母代表“PEST指令文件”。然后,在单个空格之后,必须跟着单个字符,即标记分隔符。标记分隔符在指令文件中的作用与模板文件中的参数分隔符没有什么不同。它的作用是定义一个标记的范围;必须将标记分隔符放置在包含标记的文本字符串的第一个字符之前,并紧接在标记字符串的最后一个字符之后。在将标记分隔符对之间的文本视为标记时,PEST不会试图将该文本解释为指令列表。


您可以自己选择标记分隔符;然而,你的选择是有限的。标记分隔符不能是字符A - Z、A - Z、0 - 9、!、[,]、(,)、:、空格或制表符或&;选择这些字符中的任何一个都可能导致混淆,因为它们可能出现在指令文件中的其他地方,而不是作为标记分隔符。注意,选择作为标记分隔符的字符不应出现在任何标记的文本中,因为这也会引起混淆。

2.3.5观测名称

就像每个参数必须有一个唯一的名称一样,每个观察值也必须有一个唯一的名称。观测名称的长度不超过20个字符。这20个字符可以是除[,],(,)或标记分隔符以外的任何ASCII字符。


如上所述,参数名可以在参数模板文件中出现多次;PEST只是用相关参数的当前值替换出现名称的每个参数空间。然而,同样的情况并不适用于观测名称。


每个观测值都是唯一的,并且必须有一个唯一的观测值名称。在图2.6中,观测值被命名为“ar1”、“ar2”等。这些相同的观测名称也必须在PEST控制文件中引用,其中提供了测量值和权重。


但是,有一个观测名称不适用于这些规则,即哑观测名称“dum”。如果需要,这个名称可以在指令文件中出现多次;这对PEST来说意味着,虽然观测值要像正常观测值一样进行定位,但模型输出文件上与虚拟观测值对应的数字实际上与任何实验室或现场测量值都不匹配。因此,在提供测量值和分配观测权重的PEST控制文件中,不能出现名为“dum”的观测值。如下所示,虚拟观察点只是用于模型输出文件导航的设备。

2.3.6指令集

现在详细描述每个可用的PEST指令。在创建自己的指令文件时,必须严格遵守为每个指令提供的语法。如果多个指令项出现在指令文件的一行上,则这些项之间必须至少间隔一个空格。与模型输出文件中的单行有关的指令被写在PEST指令文件的单行上。因此,新指令行的开始表示PEST必须读取至少一个新的模型输出文件行;它需要读取多少行取决于新指令行的第一条指令。


但是,请注意,如果新行上的第一条指令是字符“&”,则新指令行只是旧指令行的延续。与所有其他指令项一样,在此上下文中使用的“&”字符必须与其后面的指令项至少间隔一个空格。

PEST按照向前(从上到下)的方向读取模型输出文件,查看指令文件中的指令来告诉它下一步该做什么。在编写说明书时应牢记这一点;指令不能指示PEST“回溯”到模型输出文件上的前一行。另外,由于PEST处理模型输出文件行是从左到右的,因此一条指令不能将PEST引导到模型输出文件行的较早部分,而不是由于前一条指令而使它的注意力当前集中在行的部分。

主标记除非它是前一行的延续,否则每条指令行必须以两个指令项之一开始,即主标记或行前项。主要的标记已经简要地讨论过了。它是一个字符串,两端用标记分隔符括起来。如果一个标记是指令行的第一项,那么它是主标记;如果它出现在一行的后面,在其他指令项之后,它是一个次要标记,其操作将在下面讨论。


在指令文件中遇到主标记时,PEST逐行读取模型输出文件,在标记分隔符之间搜索字符串。当它找到字符串时,它将“光标”放置在字符串的最后一个字符上。(注意,PEST用户实际上永远不会看到这个游标;它只是标记了PEST在处理模型输出文件时所处的位置。)这意味着,如果与主标记相同的指令行上的任何进一步的指令指示PEST对该行进行进一步的处理,那么该处理必须属于模型输出文件行中标识为主标记的字符串后面的部分。


请注意,如果主(或辅助)标记中有空白字符,则在模型输出文件的匹配字符串中应该有完全相同数量的空白字符。


通常,如图2.7所示,主标记符将是某种标题或标签的一部分或全部;这样的标题或标签通常在模型的计算结果列表之前,从而为搜索后者提供了方便的参考点。然而,应该注意的是,搜索主标记是一个耗时的过程,因为模型输出文件的每一行都必须单独读取和扫描标记。因此,如果总是将相同的观察结果写入模型输出文件的相同行(这些行从模型运行到模型运行是不变的),则应该优先使用行提前项,而不是主要标记。


主标记可以是PEST指令行上的唯一项,或者它可以在许多其他项之前指导对包含该标记的行进行进一步处理。在前一种情况下,主要标记的目的只是建立一个参考点,以便在随后的指令行中设置的模型输出文件中进一步向下移动。


主标记可以提供导航模型输出文件的有用方法。考虑图2.8中所示的模型输出文件的摘录(为了节省空间,这些点替换了示例中未显示的一行或多行)。图2.9所示的指令文件摘录提供了一种读取包含第三个解向量的数字的方法。


请注意,“SOLUTION VECTOR”主标记是如何在“PERIOD NO”之前出现的。


3”主标记。后一种标记纯粹用于建立一个参考点,从中可以搜索“解决向量”标记;如果这个参考点没有建立(使用一个主要的标记或行推进项目),PEST将读取与前一个时间段相关的解决方案向量。

直线前进

行推进项的语法是" ln ",其中n是要推进的行数;注意“l”是“el”,字母表中的第12个字母,而不是“one”。行前项必须是指令行的第一项;它和主标记是仅有的两个可以占用这个初始位置的指令项。正如上面所解释的,指令行中的初始项总是一个指令,要求PEST在模型输出文件中至少再移动一行(除非它是一个延续字符)。在主标记的情况下,PEST在找到相关的文本字符串时停止读取新行。然而,在实现行推进时,PEST不需要在推进时检查模型输出文件行。它只是向前移动n行,将其处理游标放置在新行开头的位置,该点成为模型输出文件进一步处理的新参考点。


通常,一行预支项目后面跟着其他指示。但是,如果行推进项是指令行上的唯一项,则不会违反任何语法规则。


在图2.6中,模型计算的视电阻率写在连续的线条上。因此,在读取每个观测值之前,指示PEST使用“l1”行推进项移动到新行的开头;如图2.7所示。

如果一个行推进项目在一个PEST指令文件的第一个指令行之前,行推进的参考点就被当作模型输出文件的第一行上面的一个“虚拟”行。因此,如果第一条指令行以“l1”开头,则模型输出文件的处理从其第一行开始;类似地,如果第一个指令行以“18”开头,则模型输出文件的处理从第8行开始。

二次标记

二级标记是不占用PEST指令行的第一位置的标记。因此,它不会指示PEST向下移动模型输出文件(尽管它可以在这方面发挥作用-见下文);相反,它指示PEST沿着当前模型输出文件行移动光标,直到找到第二个标记字符串,并将光标放置在该字符串的最后一个字符上,为该行的后续处理做好准备。


图2.10显示了模型输出文件的摘录,而图2.11显示了从该输出文件读取钾浓度所需的指令。一个主要标记用于将PEST光标放置在我们感兴趣的距离上的计算浓度记录的直线上。然后指示PEST向前移动一行,读取“K:”字符串后面的数字,以找到一个名为“kc”的观测值;“kc”周围的感叹号将很快讨论。

图2.12和图2.13分别表示模型输出文件提取和相应的指令文件提取,说明了二级标记的一个有用特征。


如果某二级标志是之前只有其他标记(包括,也许,一个或一些辅助标记当然主要标志),和相对应的文本字符串,二级标志没有找到以前的模型输出文件行标记的字符串位于,害虫会以为它尚未找到正确的模型输出线并重新搜索一个拥有从所有三个标记的文本。因此,指令“%TIME STEP 10%”将导致PEST在图2.12所示的模型输出文件的第一行暂停向下的旅程。


然而,当它没有在同一行上找到字符串“STRAIN”时,它重新开始阅读模型输出文件,再次寻找字符串“TIME STEP 10”。最后,它找到包含主标记和辅助标记的一行,这样做之后,开始执行下一条指令行。

重要的是要注意,如果除标记之外的任何指令项位于不匹配的辅助标记之前,PEST将假定不匹配是一个错误条件,并使用适当的错误消息停止执行。还请注意,二级标记可以依次使用。例如,如果STRAIN变量总是在位置2,那么图2.13的指令文件中的相关行可以替换为“l1 %=% %=% !str1!”这对于以逗号分隔的输出文件很方便。

空格

空白指令类似于辅助标记,因为它允许用户在读取非固定观察值之前浏览模型输出文件行(见下文)。它指示PEST将光标从当前位置向前移动,直到遇到下一个空白字符。然后,PEST再次向前移动光标,直到找到一个非空白字符,最后将光标放在该非空白字符前面的空白字符上(即空白字符序列中的最后一个空白字符上),为下一个指令做好准备。空白指令是一个简单的“w”,与相邻指令之间至少间隔一个空格。

考虑如下所示的模型输出文件行。

模型输出:2.89988 4.487892 -4.59098 8.394843下面的指令行指示PEST读取上面行的第四个数字。

%模型输出:% w w w !obs1!指令行以一个主标记开始,允许PEST在模型输出文件中定位上面的行。处理完这个标记后,PEST光标停留在“OUTPUTS:”的“:”字符上,即停留在标记字符串的最后一个字符上。作为对第一个空白指令的响应,PEST查找下一个空白,然后将光标移动到该空白的末尾,即在上述模型输出文件行的第一个数字的“2”之前。第二个空白指令将光标移动到上述行中第二个数字的第一个“4”前面的空白字符;第三条空白指令的处理导致PEST将光标移动到负号前面的空白字符上。执行第四条空白指令后,光标停留在最后一个数字前面的空白字符上;后者可以被解读为非固定观测值(见下文)。

Tab

制表符指令将PEST光标放置在PEST当前正在处理的模型输出文件行上用户指定的字符位置(即列号)。指令语法是“tn”,其中n是列号。列号是通过从任何一行的左侧开始计算字符位置(包括空白字符)来获得的,从1开始。


与空白指令一样,tab指令可用于在定位和读取非固定观察值之前导航模型输出文件行。例如,考虑模型输出文件中的以下行:TIME(1): a = 1.34564E-04, TIME(2): a = 1.45654E-04, TIME(3): a = 1.54982E-04可以使用指令行读取TIME(3)处a的值:l4 t60 %=% !a3!这里假设PEST先前在模型输出文件中处理第4行之前;假定标记分隔符为“%”。


" t60 "指令的实现将光标放置在" TIME(3) "字符串后面的":"上,因为冒号位于上述行的第60个字符位置。然后指示PEST查找下一个“=”字符。从那里,它可以读取上面一行的最后一个数字作为一个非固定的观察值(见下文)。

Fixed Observations

观察引用永远不能是指令行的第一项;为了将PEST的光标放置在一个或多个观测值可能所在的行上,必须首先出现主标记或行推进项。如果在模型输出文件的某一行上有多个观测值,则必须从左到右读取这些观测值,不允许沿任何一行向后移动。


观察结果可以用三种方法之一来识别。第一种方法是告诉PEST,可以在模型输出文件行的n1和n2列之间找到一个特定的观测值,并且包括它的游标当前所在的列n1和n2。这是迄今为止读取观测值最有效的方法,因为PEST不需要进行任何搜索;它只是从标识的空格中读取一个数字。以这种方式读取的观测值称为“固定观测值”。


图2.14显示了如何将图2.8的第三个解向量中列出的数字解读为固定观测值。通知PEST如何读取固定观察值的指令项由两部分组成。第一部分包括括在方括号内的观测值名称,而第二部分包括用于读取观测值的第一列和最后一列。注意,观察指令的这两个部分必须没有空间分隔;PEST总是在指令文件中构造一个空格,作为标记一个指令项的结束和另一个指令项的开始(除非空格位于标记分隔符之间)。

当模型使用固定字段宽度说明符以表格形式写入输出时,将数字读取为固定观测值是有用的。但是,在指定要从中读取数字的列号时,必须非常小心。由这些列号定义的空间必须足够宽,以容纳在PEST将读取模型输出文件的许多模型运行中该数字所占的最大长度;如果它不够宽,PEST可能只读取数字的截断部分或省略数字前面的负号。然而,空间不能太宽,以至于它包含了另一个数字的一部分;在这种情况下,将出现一个运行时错误,PEST将使用一个适当的错误消息终止执行。


当模型以数字数组的形式写入其结果时,这些数字相互关联的情况并不罕见。例如,考虑下面的FORTRAN代码片段。

在这种情况下,除了将这些数字视为固定的观测值外,别无选择。(读取观察值的两种替代方法都要求观察值被空白或字符串包围,该字符串在不同的模型运行中是不变的,因此可以用作标记。)因此,要将上述三个数字读取为观测值A, B和C,可以使用以下指令行。

如果一条指令行只包含固定的观察值,则不需要包含任何空格或制表符;也不需要辅助标记(除非辅助标记与主要标记一起使用,以确定PEST光标应该停留在哪个模型输出文件行上——见上文)。这是因为这些项通常用于在读取非固定观察值之前导航模型输出文件行(见下文);定位固定观测不需要这样的导航,因为它在模型输出文件行的位置是由固定观测指令中包含的列号明确定义的。

Semi-Fixed Observations

图2.9演示了半固定观测值的使用。半固定观测值与固定观测值类似,在相关指令项中提供两个数字,这些数字的目的是通过模型输出文件上的列号来定位观测值的位置。然而,与固定的观测值相比,这些数字并不能准确地定位观测值。当PEST遇到半固定的观察指令时,它继续到两个指定的列号中的第一个,然后,如果该列没有被非空白字符占用,它从左到右从该列号开始搜索输出文件行,直到它到达第二个确定的列或非空白字符。如果在找到非空白字符之前到达第二列,则会出现错误条件。但是,如果它在两个列号的第一个位置找到一个非空白字符,它就会在字符的两侧找到最近的空白;通过这种方式,它识别夹在空白之间的一个或多个非空白字符(“空白”包括模型输出文件行的开头和/或结尾)。它试图将这些字符读取为一个数字,这个数字就是在半固定观察指令中指定的观察值。显然,这个数字的宽度可以大于半固定观察指令中引用的列数之间的差值。

与固定观测值一样,读取半固定观测值的指令由两部分组成,即观测值名称后面跟着两个列号,列号之间用冒号分隔;列号必须按升序排列。然而,对于半固定观测值,观测值名称用圆括号而不是方括号括起来。再次,半固定观察指令的两部分之间必须没有空间分隔。


如果您不确定在害虫控制的模型运行中,随着数值的增长和/或减少,该数值在模型输出文件上的表示可以扩展到多大,则将数字读取为半固定观察值是有用的;如果您不知道数字是左对齐还是右对齐,它也很有用。但是,必须确保数字的至少一部分始终位于(并包括)两个指定列之间,并且无论何时写入数字,无论其大小如何,它都将被空白或由模型输出文件行的开头或结尾包围。如果在读取模型输出文件时,PEST只遇到两个指定列号之间的空白,或者遇到由空白分隔的非数字字符或两个数字片段,则会出现错误条件,PEST将使用适当的错误消息终止执行。


对于固定观测值,通常不需要在同一行上与半固定观测值有二次标记、空白和制表符,因为半固定观测指令所提供的列号决定了观测值在该行上的位置。和往常一样,在任何一条指令行上必须从左到右读取观察值;因此,如果在一条PEST指令行上提供了一条以上的半固定观察指令,则与这些观察有关的列号必须从左到右增加。


对于图2.6和2.7所示的情况,所有固定观测值都可以被读取为半固定观测值,列数之间的差值要么保持不变,要么缩小到比图2.7所示的差值小得多。然而,应该注意的是,对于PEST来说,读取半固定的观测值比读取固定的观测值需要更多的努力,因为PEST必须为自己确定必须读取的数字的范围。

在PEST读取半固定观察值之后,它的游标驻留在它刚刚读取的数字的末尾。对该线的任何进一步加工都必须在该位置的右侧进行。

Non-Fixed Observations

图2.11和2.13演示了非固定观测值的使用。非固定观察指令不包括任何列号,因为PEST必须读取的数字是使用辅助标记和/或其他导航辅助工具(如空白和制表符)在指令行上的非固定观察之前找到的。


如果您不知道特定模型输出文件行中模型将在哪里写入与特定观测值对应的数字,但您确实知道该行的结构,那么您可以使用此知识导航到该数字。在PEST指令文件中,一个非固定的观测值简单地用用感叹号包围的观测值的名称来表示;像往常一样,感叹号和观察名称之间不应该有空格分隔,因为PEST将指令文件中的空格解释为表示一个指令项的结束和另一个指令项的开始。


当PEST遇到非固定观察指令时,它首先从当前光标位置向前搜索,直到找到一个非空白字符;PEST假定这个字符是表示非固定观测值的数字的开头。然后,PEST再次向前搜索,直到找到空白字符、行尾或指令文件中跟随非固定观察指令的次要标记的第一个字符;PEST假设表示非固定观测值的数字在前一个字符位置结束。通过这种方式,它识别一个字符串,并试图将其读取为数字;如果由于存在非数字字符或其他问题而无法读取数字,则PEST将终止执行,并显示一条运行时错误消息。如果PEST在寻找非固定观察值的开始时遇到一行的末尾,也会出现运行时错误消息。


考虑图2.15所示的输出文件片段。不同时间的物种种群不能被解读为固定或半固定观测值,因为代表这些种群的数字不能保证落在模型输出文件的某一列数范围内,因为在计算任何此类种群时可能需要“迭代调整”。因此,我们必须用另一种方法找到这个数字;图2.16说明了一种这样的方法。

主标记用于将PEST光标移动到图2.15中所示的第一行。然后,注意到代表物种种群的数字总是跟在“=”字符后面,“=”字符被用作次要标记。在处理二级标记之后,PEST游标始终驻留在该标记的最后一个字符上,在本例中是“=”字符本身。因此,在读取" = "字符之后,PEST能够处理!sp1!指令,以上述方式隔离字符串" 1.23498E5 "。


在读取模型计算的观测值“sp1”后,PEST移动到下一条指令行。根据“l1”指令,PEST将模型输出文件的下一行读入其内存。然后,它搜索一个“=”字符,并将该字符后面的数字读取为观测值“sp2”。然后对“sp3”和“sp4”观测重复此过程。


成功地识别非固定观测取决于它前面的指令。


在这方面,次要标记、制表符和空白指令将是最有用的,尽管固定和半固定观察也可能在非固定观察之前;请记住,在所有这些情况下,PEST都将光标放在它在模型输出文件中与指令项相对应的字符串或数字的最后一个字符上,然后再继续执行下一条指令。


考虑下面所示的模型输出文件行,作为使用非固定观测值的进一步说明。

如果我们对这些数字中的第四个感兴趣,但我们不确定在某些模型运行中,它之前的数字是否可能写得更精确(因此将我们感兴趣的数字推到右边),那么我们别无选择,只能将该数字视为非固定观察值。但是,如果之前的数字因模型运行而异,我们也不能使用二次标记;也不能使用TAB。


幸运的是,空白来拯救,下面的指令行将PEST带到第四个数字:

这里假设在读取此指令之前,PEST游标位于模型输出文件的前10行。只要我们能够确保第一个数字前面没有空格,那么我们感兴趣的数字前面总是会出现三次空格。但是,如果在某些情况下第一个数字前面可能有空格,而在其他情况下可能没有,那么我们可以将第一个数字读取为虚拟观察值,如下所示:

正如前面所解释的,模型输出文件中与名为“dum”的观测值相对应的数字实际上并没有使用;也不能在PEST控制文件的“观测数据”部分出现“dum”名称。这个名称的使用是为像本例这样的实例保留的,在这种情况下,为了方便沿着模型输出文件的特定行导航,必须读取一个数字。这个数字是根据非固定观测协议读取的,因为只有这种类型的观测才能是虚拟观测。

在上述示例中,在定位观测值“obs1”时使用空白的替代方法可能涉及多次使用虚拟观测值。因此,下面的指令行也将使表示“obs1”的数字能够被定位和读取。


l10 dum !dum !dum !obs1 !但是,如果上面示例中的数字是用逗号而不是空白分隔的,那么逗号应该被用作辅助标记,以便找到“obs1”。


如果选择适当的辅助标记,没有被空白包围的数字仍然可以被读取为非固定观察值。考虑如下所示的模型输出文件行。


土壤含水量(无校正)=21.345634%由于“(无校正)”字符串在任何特定模型运行后可能存在,也可能不存在,因此可能无法将土壤含水量作为固定观测值读取。将其作为非固定观察值读取似乎很麻烦,因为数字之前和之后都没有空格。然而,一个合适的指令行是15 *=* !sws!注意次要标记(即*%*)是如何被引用的,即使它发生在我们希望读取的观察之后。如果这个标记不存在,则在PEST尝试读取土壤含水量时将发生运行时错误,因为它将观测字符串定义为包含“%”字符,并且自然无法从包含非数字字符的字符串中读取数字。但是,通过在表示观测值“sws”的数字之后包含“%”字符作为辅助标记,指示PEST在尝试读取数字之前将字符从字符串中分离出来。但请注意,如果这种类型的观测后辅助标记以数字字符开头,如果没有空格将观测值与观测值分开,则不能保证PEST不将该字符与表示观测值的数字一起包含。


事实上,在“=”字符和我们希望读取的数字之间没有空格,这也不会导致PEST出现问题。在将“=”字符作为次要标记处理之后,PEST处理游标落在“=”字符本身上。搜索第一个非空白字符由!sws!指令在" = "之后的下一个字符处终止,即" 2 "字符。然后,PEST接受该字符作为字符串的左边界,它必须从中读取土壤水分含量,并按照通常的方式向前搜索字符串的右边界。


当PEST读取了一个非固定的观测值后,它将光标放在观测值号的最后一个字符上。然后,它可以对模型输出文件行进行进一步处理,以读取进一步的非固定、固定或半固定的观察结果,或者按照指示处理导航指令。

Continuation

您可以通过使用延续字符“&”在任意两个指令之间中断指令行,以通知PEST某个指令行实际上是前一行的延续。因此指令文件片段

对于这两个片段,假定标记分隔符为“%”。注意,延续字符必须与它后面的指令至少间隔一个空格。

2.3.7制作指令文件

可以使用文本编辑器构建指令文件。或者,它可以由专门用于此目的的软件编写,例如支持PEST的模型图形用户界面,或者从PEST网页上下载地下水和地表水公用事业公司的成员。


在构建读取模型输出文件的指令集时,必须始终保持谨慎,特别是在使用标记、空白、制表符和虚拟观察等导航指令时。PEST总是会严格按照你的指示去做,但是如果你的指示错了,它可能不会读到你想读的数字。如果PEST试图读取一个观察值,但没有在预期的位置找到一个数字,则会发生运行时错误。PEST将通知您它遇到错误的位置,以及错误发生时它正在执行的指令;这应该可以让您找到问题所在。然而,如果PEST实际上从模型输出文件中读取了错误的数字,那么只有在产生异常高的目标函数时,或者在连续的优化迭代中PEST无法降低目标函数时,这才会变得明显。或者,如果指示PEST读取的数字是模型预测,或者如果要求PEST纯粹计算该数字对模型参数的敏感性,则错误可能永远不会明显。如果有疑问,请检查PEST生成的文件,查看PEST从模型输出文件中读取的数字,以确保它们符合预期。


PEST套件中包含两个程序,可用于验证指令文件是否已正确构建。程序PESTCHEK在运行PEST之前检查所有PEST输入数据的错误和不一致时,读取PEST控制文件中引用的所有指令文件,确保这些文件中没有语法错误。另一方面,INSCHEK程序检查单个PEST指令文件是否有语法错误。如果指令文件没有错误,INSCHEK就可以使用该指令文件读取模型输出文件,打印出从该文件读取的观察值列表。通过这种方式,您可以确保您的指令集在实际被PEST使用之前“工作”。

  • 22
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

___Y1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值