C-study(五).2

C语言逻辑与条件运算

逻辑运算符

连接两个完整的关系表达式。
&& 逻辑与,ab都为真时,a&&b的值真,其余时候假。
|| 逻辑或,ab都为假时,a||b的值假,其余时候真。
! 逻辑非、只需要一个运算对象,a真,!a假,a真,!a假。

逻辑表达式求值顺序:从左往右

&&和II 都是序列点,到&&或||之前副作用都会生效

一旦发现有使整个表达式为假的因素,会立即停止求值
第一个条件不成立时 && 之后的语句都直接跳过

#include <ctype.h>   //为isspace ()函数提供原型
#include <stdbool.h> //为bool、 true、 false提供定义
#define PERIOD '.'
#define STOP '|'         // 标记输入结束
    /*
    if(range>=90 &&range<=100) //不可以用90<=range<=100

    (ch != '"' | | ch != '\'') // 使用 || 两个条件有一个为真时为真,都为假时为假

    if (!(ch != '"')) // 使用 ! 条件为假时为真,为真时为假
    6 > 2 && 3 == 3 为真。 !(6 > 2 && 3 == 3) 为假。

    a>b&&b>c||b>d 相当于 ((a>b)&&(b>c))||(b>d)

    if(num!=0&&12/num==2)//&& 第一个表达式为假(num==0)时,会直接跳过后面的表达式,所以不会出现 除以0的情况
    x != 0 && 20 / x < 5只有在x是非零时才会对第2个表达式求值。

    while(x++<10&&x+y<20) //&&是序列点,可以保证在x+y的时候已经完成了自增操作*/

    char ch;
    int charcount = 0;
    while ((ch = getchar()) != PERIOD) // 读字符并检查是不是.
    {
        if (ch != '"' && ch != '\'') // &&:两个条件都为真时为真,不是"和'时记数
            charcount++;
    }
    printf("There are %d non-quote characters.\n", charcount);

    char c;              // 读入字符
    char prev;           // 读入的前一个字符
    long n_chars = 0L;   // 字符数
    int n_lines = 0;     // 行数
    int n_words = 0;     // 单词数
    int p_lines = 0;     // 不完整的行数
    bool inword = false; // 如果c在单词中,inword 等于true

    printf("Enter text to be analyzed (| to terminate) : \n");
    prev = '\n';                    // 用于识别完整的行
    while ((c = getchar()) != STOP) // getchar便于统计字符 读到|结束循环
    {
        n_chars++; // 统计字符

        if (c == '\n')
            n_lines++; // 统计行

        if (!isspace(c) && !inword) // 不是空格,不在单词内,则在单词开头标记inword,相当于inword==false
        {
            inword = true; // 开始一个新的单词
            n_words++;     // 统计单词
        }

        if (isspace(c) && inword) // 是空格,在单词内,说明一个单词结束,标记inword为false不在单词内
            inword = false;       // 打到单词的末尾

        prev = c; // 保存字符的值
    }
    if (prev != '\n')
        p_lines = 1; // 不完整的一行
    printf("characters = %ld,words = %d,lines = %d,", n_chars, n_words, n_lines);
    printf("partial lines = %d\n", p_lines);

条件运算符 ?: lambda表达式

唯一的三元运算符,每个运算对象都是一个表达式
expression1 ? expression2 :expression3

expression1为真(非0),表达式的值为expression2,否则为expression3

if else语句的便捷方式

#define COVERAGE 350        // 每罐油漆可刷的面积(单位:平方英尺)
//max=(a>b)?a:b; 取最大值
//(5>3)?1:2的值为 1。
//(3>5)?1:2的值为 2。
    int sq_feet;
    int cans;

    printf("Enter number of square feet to be painted : \n");
    while (scanf("%d", &sq_feet) == 1)
    {
        cans = sq_feet / COVERAGE;                   // int除法会被截断
        cans += ((sq_feet % COVERAGE == 0)) ? 0 : 1; // 取余等于0说明刚刚好,不等于0说明多一桶

        printf("You need %d %s of paint . \n", cans, cans == 1 ? "can" : "cans"); // 如果值是1则打印can,否则打印cans
        printf("Enter next value (q to quit) : \n");
    }

按位运算符

~ :按位取反,一元运算符。
& :按位与运算符
| :按位或运算符
^ :按位异或运算符
<<:左移运算符,num<<n,num左移n位(*2n)。左边丢掉右边补0。
>> :右移运算符,num>>n,num右移n位(/2n)。右边丢掉左边补0。
在这里插入图片描述

int x = 2;   // 010
int y = 3;   // 011
// x & y = 2;   // 010
// y << x = 12; // 1100

其他运算符

sizeof运算符和size_t类型

sizeof:返回运算对象的字节大小,一元运算符
返回size_t类型的值,是语言定义的标准类型
%zd 或者%u %lu

// 使用C99新增的%zd转换说明--如果编译器不支持%zd, 请将其改成%u或%lu
int n = 0;
size_t intsize;// sizeof返回值,是无符号整型(的typedef别名),相当于 typedef unsigned int size_t
intsize = sizeof(int);//运算对象可以是类型或具体数据对象,是类型时必须加()
printf("n = %d,n has %zd bytes; all ints have %zd bytes. \n",
       n, sizeof n, intsize);//是具体对象()可以省略

() 强制类型转换运算符

(目标类型)

mice = 1.6+1.7;//3.3->3 先计算,在转换
mice = (int)1.6+(int)1.7;//先转换1+1

强制转换超出范围时依然会出错
显示选择合适的类型,强制类型转换指明转换类型,避免出现不正确的自动转换

逗号运算符 ,

性质:
保证从左往右求值,
是一个序列点,逗号左侧的副作用会在执行逗号右侧之前发生

逗号表达式的值是右侧项的值

const int FIRST_OZ = 46; // 2013邮资
const int NEXT_OZ = 20;  // 2013邮资
int ounces, cost;
printf(" ounces   cost\n");
/*
* 初始化表达式的逗号是两个值都可进行初始化
* 更新表达式的初始化可使两个值每次迭代都变化
* 
* x=(y=3,(z= ++y +2)+5)先给y赋3,y++为4,4+2为6赋给z,6+5赋给x
* i=5,500;相当于i=5;500;
* i=(5,500);相当于i=500;
*/
for (ounces = 1, cost = FIRST_OZ; ounces <= 16; ounces++, cost += NEXT_OZ)
    printf("%5d $%4.2f\n", ounces, cost / 100.0);

类型转换

在语句和表达式中应使用类型相同的变量和常量

基本转换规则

1、升级
unsigned和signed的char和short会被自动转换为int
如果short和int的大小相同,unsigned short 比int大时会自动转换为unsigned int
float会自动转换为double

2、涉及两种类型的运算,两个值会被分别转为两个类型的更高级别

3、级别从高到低:
long double
double
float
unsigned long long
long long
unsigned long
long
unsigned int(当long=int,unsigned int >long)
int
当long和int大小相同时,unsigned int比long级别高

4、赋值时计算的最终结果会被转换成被赋值变量的类型,包括升级和降级

5、函数参数传递,char和short被转换为int,float被转换为double,函数原型会覆盖升级

降级可能会导致放不下整个数字
整型转换为无符号整型,额外的位被忽略,eg:目标类型是8位无符号整型,原始值求256模

char ch;
int i;
float fl;
fl = i = ch = 'C';
/*
1字节的ASCII存储在ch中
转换为ASCII中C对应的整数67,四字节存储在i中
67转换为浮点数存储在fl中
*/
printf("ch=%c,i=%d,fl=%2.2f\n", ch, i, fl);
ch = ch + 1;       /*转换成整数67+1,结果是4字节整数68然后截断1字节存在ch*/
i = fl + 2 * ch;   /*ch转换为4字节整数68,乘以2,转换为浮点数和fl相加,转换为int存储在i*/
fl = 2.0 * ch + i; /*ch转换为浮点数,乘以2,把i转换为浮点数,相加存在fl*/
printf("ch=%c,i=%d,fl=%2.2f\n", ch, i, fl);
ch = 1107; /*超出范围取256模*/
printf("Now ch = %c\n", ch);
ch = 80.89; /*截断*/
printf("Now ch = %c\n", ch);

带参函数

void pound(int n); // ANSI函数原型声明,表明该函数接受一个 int 类型的参数 ,且没有返回值

const int S_PER_M = 60;         // 1分钟的秒数
const int S_PER_H = 3600;       // 1小时的秒数
const double M_PER_K = 0.62137; // 1公里的英里数
	int times = 5;
    char ch = '!'; // ASCII码是33
    float f = 6.0f;
    pound(times); // int 类型的参数,把实参5传递给函数,把5赋值给形参,即把times的值拷贝给函数中的新变量n
    pound(ch);    // 和pound((int)ch);相同,根据函数声明自动转换
    pound(f);     // 和pound((int)f);相同,如果函数声明没提供参数类型,则不会转换,只会自动升级为double,使用时错误

    double distk, distm; // 跑过的距离(分别以公里和英里为单位 )
    double rate;         // 平均速度(以英里/小时为单位)
    int min, sec;        // 跑步用时(以分钟和秒为单位 )
    int time;            // 跑步用时(以秒为单位)
    double mtime;        // 跑1英里需要的时间,以秒为单位
    int mmin,msec;       // 跑1英里需要的时间,以分钟和秒为单位
    printf("This program converts your time for a metric race\n");
    printf("to a time for running a mile and to your average\n");
    printf("speed in miles per hour.\n");
    printf("Please enter, in kilometers, the distance run, \n");
    scanf("%lf", &distk); // %lf 表示读取一个 double 类型的值
    printf("Next enter the time in minutes and seconds,\n");
    printf("Begin by entering the minutes.\n");
    scanf("%d", &min);
    printf("Now enter the seconds,\n");
    scanf("%d", &sec);
    time = S_PER_M * min + sec;    // 把时间转换成秒
    distm = M_PER_K * distk;       // 把公里转换成英里
    rate = distm / time * S_PER_H; // 英里/秒X秒/小时=英里/小时
    mtime = (double)time / distm;  // 时间/距离 =跑1英里所用的时间
    mmin = (int)mtime / S_PER_M;   // 求出分钟数
    msec = (int)mtime % S_PER_M;   // 求出剩余的秒数
    printf("You ran %1.2f km (%1.2f miles) in %d min,%d sec.\n", distk, distm, min, sec);
    printf("That pace corresponds to running a mile in %d min,", mmin);
    printf("%d sec.\nYour average speed was %1.2f mph,\n", msec, rate);

void pound(int n)
/*ANSI 风格函数头
返回值类型 函数名(返回值类型 形参名) ,不需要参数或返回值时用void,
括号内就包括形参变量的声明,形参的变量名是函数私有的,不会和其他处相同名称发生冲突
实际函数调用传递的值为实参*/
{ 
    while (n-- > 0)
        printf("#");
    printf("\n");
}
! A. Stagni, C. Cavallotti, S. Arunthanayothin, Y. Song, ! O. Herbinet, F. Battin-Leclerc, T. Faravelli ! "An experimental, theoretical and kinetic-modeling study of the gas-phase oxidation of ammonia" ! Reaction Chemistry and Engineering (submitted) (2020). ! ! Submitted to Reaction Chemistry and Engineering (November 2019) ! ! Thermodynamic properties ! ! CHEMKIN format ! !VERSION: 17_03 !AUTHORS: C1-C3 Burcat !NOTE: SPECIES RE-ARRANGED AS THE SAME ORDER IN MECH ! !VERSION: 17_05 !Following species are updated from ATcT's Database: ! H H2 O O2 HE ! OH H2O N2 HO2 HCO ! H2O2 AR CO CO2 THERMO 300. 1000. 4000. ! ---------ARAMCO 2.0 ------------------- HE ATcT3EHe 1 0 0 0G 200.00 6000.00 1000.00 1 ! [Ghobad] He <g> ATcT ver. 1.122, DHf298 = 0.000 \B1 0.000 kJ/mol - fit MAR17 2.49985609E+00 2.19365392E-07-1.07525085E-10 2.07198041E-14-1.39358612E-18 2 -7.45309155E+02 9.29535014E-01 2.49976293E+00 1.01013432E-06-8.24578465E-10 3 -6.85983306E-13 7.24751856E-16-7.45340917E+02 9.29800315E-01 0.00000000E+00 4 AR ATcT3EAr 1 0 0 0G 200.00 6000.00 1000.00 1 ! [Ghobad] Ar <g> ATcT ver. 1.122, DHf298 = 0.000 \B1 0.000 kJ/mol - fit MAR17 2.49989176E+00 1.56134837E-07-7.76108557E-11 1.52928085E-14-1.05304493E-18 2 -7.45328403E+02 4.38029835E+00 2.49988611E+00 2.13037960E-07 8.97320772E-10 3 -2.31395752E-12 1.30201393E-15-7.45354481E+02 4.38024367E+00 0.00000000E+00 4 N2 ATcT3EN 2 0 0 0G 200.00 6000.00 1000.00 1 ! [Ghobad] N2 <g> ATcT ver. 1.122, DHf298 = 0.000 \B1 0.000 kJ/mol - fit MAR17 2.93802970E+00 1.41838030E-03-5.03281045E-07 8.07555464E-11-4.76064275E-15 2 -9.17180990E+02 5.95521985E+00 3.53603521E+00-1.58270944E-04-4.26984251E-07 3 2.37542590E-09-1.39708206E-12-1.04749645E+03 2.94603724E+00 0.00000000E+00 4 O2 ATcT3EO 2 0 0 0G 200.00 6000.00 1000.00 1 ! [Ghobad] O2 <g> ATcT ver. 1.122, DHf298 = 0.000 \B1 0.000 kJ/mol - fit MAR17 3.65980488E+00 6.59877372E-04-1.44158172E-07 2.14656037E-11-1.36503784E-15 2 -1.21603048E+03 3.42074148E+00 3.78498258E+00-3.02002233E-03 9.92029171E-06 3 -9.77840434E-09 3.28877702E-12-1.06413589E+03 3.64780709E+00 0.00000000E+00 4 H2 ATcT3EH 2 0 0 0G 200.00 6000.00 1000.00 1 ! [Ghobad] H2 <g> ATcT ver. 1.122, DHf298 = 0.000 \B1 0.000 kJ/mol - fit MAR17 2.90207649E+00 8.68992581E-04-1.65864430E-07 1.90851899E-11-9.31121789E-16 2 -7.97948726E+02-8.45591320E-01 2.37694204E+00 7.73916922E-03-1.88735073E-05 3 1.95517114E-08-7.17095663E-12-9.21173081E+02 5.47184736E-01 0.00000000E+00 4 H2O ATcT3EH 2O 1 0 0G 200.00 6000.00 1000.00 1 ! [Ghobad] H2O <g> ATcT ver. 1.122, DHf298 = -241.833 \B1 0.027 kJ/mol - fit MAR17 2.73117512E+00 2.95136995E-03-8.35359785E-07 1.26088593E-10-8.40531676E-15 2 -2.99169082E+04 6.55183000E+00 4.20147551E+00-2.05583546E-03 6.56547207E-06 3 -5.52906960E-09 1.78282605E-12-3.02950066E+04-8.60610906E-01-2.90858262E+04 4 H2O2 ATcT3EH 2O 2 0 0G 200.00 6000.00 1000.00 1 ! [Ghobad] H2O2 <g> ATcT ver. 1.122, DHf298 = -135.457 \B1 0.064 kJ/mol - fit MAR17 4.54017480E+00 4.15970971E-03-1.30876777E-06 2.00823615E-10-1.15509243E-14 2 -1.79514029E+04 8.55881745E-01 4.23854160E+00-2.49610911E-04 1.59857901E-05 3 -2.06919945E-08 8.29766320E-12-1.76486003E+04 3.58850097E+00-1.62917334E+04 4 O ATcT3EO 1 0 0 0G 200.00 6000.00 1000.00 1 ! [Ghobad] O <g> ATcT ver. 1.122, DHf298 = 249.229 \B1 0.002 kJ/mol - fit MAR17 2.55160087E+00-3.83085457E-05 8.43197478E-10 4.01267136E-12-4.17476574E-16 2 2.92287628E+04 4.87617014E+00 3.15906526E+00-3.21509999E-03 6.49255543E-06 3 -5.98755115E-09 2.06876117E-12 2.91298453E+04 2.09078344E+00 2.99753606E+04 4 H ATcT3EH 1 0 0 0G 200.00 6000.00 1000.00 1 ! [Ghobad] H <g> ATcT ver. 1.122, DHf298 = 217.998 \B1 0.000 kJ/mol - fit MAR17 2.49985211E+00 2.34582548E-07-1.16171641E-10 2.25708298E-14-1.52992005E-18 2 2.54738024E+04-4.45864645E-01 2.49975925E+00 6.73824499E-07 1.11807261E-09 3 -3.70192126E-12 2.14233822E-15 2.54737665E+04-4.45574009E-01 2.62191345E+04 4 OH ATcT3EH 1O 1 0 0G 200.00 6000.00 1000.00 1 ! [Ghobad] OH <g> ATcT ver. 1.122, DHf298 = 37.490 \B1 0.027 kJ/mol - fit MAR17 2.84581721E+00 1.09723818E-03-2.89121101E-07 4.09099910E-11-2.31382258E-15 2 3.71706610E+03 5.80339915E+00 3.97585165E+00-2.28555291E-03 4.33442882E-06 3 -3.59926640E-09 1.26706930E-12 3.39341137E+03-3.55397262E-02 4.50901087E+03 4 HO2 ATcT3EH 1O 2 0 0G 200.00 6000.00 1000.00 1 ! [Ghobad] HO2 <g> ATcT ver. 1.122, DHf298 = 12.26 \B1 0.16 kJ/mol - fit MAR17 4.10564010E+00 2.04046836E-03-3.65877562E-07 1.85973044E-11 4.98818315E-16 2 4.32898769E+01 3.30808126E+00 4.26251250E+00-4.45642032E-03 2.05164934E-05 3 -2.35794011E-08 9.05614257E-12 2.62442356E+02 3.88223684E+00 1.47417835E+03 4 !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ !NOx MODULE (from Burcat http://garfield.chem.elte.hu/Burcat/THERM.DAT) !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ NO RUS 89N 1O 1 0 0G 200.000 6000.000 1000. 1 ! E. Goos, A. Burcat and B. Ruscic http://garfield.chem.elte.hu/Burcat/THERM.DAT 3.26071234E+00 1.19101135E-03-4.29122646E-07 6.94481463E-11-4.03295681E-15 2 9.92143132E+03 6.36900518E+00 4.21859896E+00-4.63988124E-03 1.10443049E-05 3 -9.34055507E-09 2.80554874E-12 9.84509964E+03 2.28061001E+00 1.09770882E+04 4 N2O L 7/88N 2O 1 0 0G 200.000 6000.000 1000. 1 ! E. Goos, A. Burcat and B. Ruscic http://garfield.chem.elte.hu/Burcat/THERM.DAT 0.48230729E+01 0.26270251E-02-0.95850872E-06 0.16000712E-09-0.97752302E-14 2 0.80734047E+04-0.22017208E+01 0.22571502E+01 0.11304728E-01-0.13671319E-04 3 0.96819803E-08-0.29307182E-11 0.87417746E+04 0.10757992E+02 0.98141682E+04 4 NO2 L 7/88N 1O 2 0 0G 200.000 6000.000 1000. 1 ! E. Goos, A. Burcat and B. Ruscic http://garfield.chem.elte.hu/Burcat/THERM.DAT 0.48847540E+01 0.21723955E-02-0.82806909E-06 0.15747510E-09-0.10510895E-13 2 0.23164982E+04-0.11741695E+00 0.39440312E+01-0.15854290E-02 0.16657812E-04 3 -0.20475426E-07 0.78350564E-11 0.28966180E+04 0.63119919E+01 0.41124701E+04 4 HNO ATcT/AH 1.N 1.O 1. 0.G 200.000 6000.000 1000. 1 ! E. Goos, A. Burcat and B. Ruscic http://garfield.chem.elte.hu/Burcat/THERM.DAT 3.16598124E+00 2.99958892E-03-3.94376786E-07-3.85344089E-11 7.07602668E-15 2 1.17726311E+04 7.64511172E+00 4.53525574E+00-5.68543377E-03 1.85198540E-05 3 -1.71881225E-08 5.55818157E-12 1.16183003E+04 1.74315886E+00 1.28500657E+04 4 HNO2 ATcT3EH 1N 1O 2 0G 200.00 6000.00 1000.00 1 ! Glarborg, P. et al. Progr Energy Combust Sci, 67, 31-68. (2018) 4.66358504E+00 4.89854351E-03-1.79694193E-06 2.94420361E-10-1.78235577E-14 2 -7.25216334E+03-3.06053640E-02 4.03779347E+00-4.46123109E-03 3.19440815E-05 3 -3.79359490E-08 1.44570885E-11-6.53088236E+03 5.90620097E+00-5.31122753E+03 4 HONO ATcT3EH 1N 1O 2 0G 200.00 6000.00 1000.00 1 ! Glarborg, P. et al. Progr Energy Combust Sci, 67, 31-68. (2018) 5.79144641E+00 3.64630732E-03-1.29112765E-06 2.06498233E-10-1.22138679E-14 2 -1.15974343E+04-4.07145349E+00 3.16416438E+00 8.50517773E-03 5.48561573E-07 3 -8.27656474E-09 4.39957151E-12-1.07744086E+04 1.00231941E+01-9.46242812E+03 4 HONO2 T 8/03H 1.N 1.O 3. 0.G 200.000 6000.000 1000. 1 ! HNO3 in Burcat database http://garfield.chem.elte.hu/Burcat/THERM.DAT 8.03098942E+00 4.46958589E-03-1.72459491E-06 2.91556153E-10-1.80102702E-14 2 -1.93138183E+04-1.62616537E+01 1.69329154E+00 1.90167702E-02-8.25176697E-06 3 -6.06113827E-09 4.65236978E-12-1.74198909E+04 1.71839838E+01-1.61524852E+04 4 N2H2 2/13/19 N 2H 2 G 300.000 5000.000 1380.000 1 ! Dean AM Bozzelli JW (Gardiner WC) Gas Phase Combustion Chemistry, Springer 2000. 4.14686796E+00 4.81612315E-03-1.62748817E-06 2.50556098E-10-1.44494188E-14 2 2.33444055E+04 5.34122740E-01 2.55589425E+00 6.54339081E-03-8.81947855E-07 3 -1.15971304E-09 3.97442230E-13 2.41085081E+04 9.80504705E+00 4 H2NN Isodiazene T 9/11N 2.H 2. 0. 0.G 200.000 6000.000 1000. 1 ! Is 'N2H2 Isodiazene' in Burcat database 3.05903670E+00 6.18382347E-03-2.22171165E-06 3.58539206E-10-2.14532905E-14 2 3.48530149E+04 6.69893515E+00 4.53204001E+00-7.32418578E-03 3.00803713E-05 3 -3.04000551E-08 1.04700639E-11 3.49580003E+04 1.51074195E+00 3.61943157E+04 4 HNNO 5/30/18 THERM N 2.H 1.O 1 0.G 300.000 5000.000 1790.000 61 ! Dean AM Bozzelli JW (Gardiner WC) Gas Phase Combustion Chemistry, Springer 2000. 2.15594002E+06-4.13111192E+03 2.65627771E+00-6.70395293E-04 5.57827338E-08 2 -8.03468100E+08-1.18702032E+07-8.96779017E-01 3.69714359E-02-4.80099825E-05 3 2.62274393E-08-5.11382966E-12 2.68675048E+04 2.64521806E+01 4 NH2NO 5/30/18 THERM N 2.H 2.O 1 0.G 300.000 5000.000 1371.000 61 ! Dean AM Bozzelli JW (Gardiner WC) Gas Phase Combustion Chemistry, Springer 2000. 7.93898100E+00 5.21842622E-03-2.12493130E-06 3.53331059E-10-2.12447889E-14 2 5.42322972E+03-1.84299492E+01 1.85914077E+00 1.68525394E-02-9.37240888E-06 3 1.71380329E-09 4.84625807E-14 7.78108234E+03 1.51172833E+01 4 HNOH trans & Equ T11/11H 2.N 1.O 1. 0.G 200.000 6000.000 1000. 1 ! E. Goos, A. Burcat and B. Ruscic http://garfield.chem.elte.hu/Burcat/THERM.DAT 3.98321933E+00 4.88846374E-03-1.65086637E-06 2.55371446E-10-1.48308561E-14 2 1.05780106E+04 3.62582838E+00 3.95608248E+00-3.02611020E-03 2.56874396E-05 3 -3.15645120E-08 1.24084574E-11 1.09199790E+04 5.55950983E+00 1.21354115E+04 4 NH2OH ATcT/AN 1.H 3.O 1. 0.G 200.000 6000.000 1000. 1 ! E. Goos, A. Burcat and B. Ruscic http://garfield.chem.elte.hu/Burcat/THERM.DAT 3.88112502E+00 8.15708448E-03-2.82615576E-06 4.37930933E-10-2.52724604E-14 2 -6.86018419E+03 3.79156136E+00 3.21016092E+00 6.19671676E-03 1.10594948E-05 3 -1.96668262E-08 8.82516590E-12-6.58148481E+03 7.93293571E+00-5.28593988E+03 4 NH3 ATcT3EH 3N 1 0 0G 200.00 4000.00 1000.00 1 ! Glarborg, P. et al. Progr Energy Combust Sci, 67, 31-68. (2018) 2.36074311E+00 6.31850146E-03-2.28966806E-06 4.11767411E-10-2.90836787E-14 2 -6.41596473E+03 8.02154329E+00 4.14027871E+00-3.58489142E-03 1.89475904E-05 3 -1.98833970E-08 7.15267961E-12-6.68545158E+03-1.66754883E-02-5.47888720E+03 4 N2H4 HYDRAZINE L 5/90N 2H 4 0 0G 200.000 6000.000 1000. 1 ! E. Goos, A. Burcat and B. Ruscic http://garfield.chem.elte.hu/Burcat/THERM.DAT 4.93957357E+00 8.75017187E-03-2.99399058E-06 4.67278418E-10-2.73068599E-14 2 9.28265548E+03-2.69439772E+00 3.83472149E+00-6.49129555E-04 3.76848463E-05 3 -5.00709182E-08 2.03362064E-11 1.00893925E+04 5.75272030E+00 1.14474575E+04 4 N L 6/88N 1 0 0 0G 200.000 6000.000 1000. 1 ! E. Goos, A. Burcat and B. Ruscic http://garfield.chem.elte.hu/Burcat/THERM.DAT 0.24159429E+01 0.17489065E-03-0.11902369E-06 0.30226244E-10-0.20360983E-14 2 0.56133775E+05 0.46496095E+01 0.25000000E+01 0.00000000E+00 0.00000000E+00 3 0.00000000E+00 0.00000000E+00 0.56104638E+05 0.41939088E+01 0.56850013E+05 4 NO3 ATcT/AN 1.O 3. 0. 0.G 200.000 6000.000 1000. 1 ! E. Goos, A. Burcat and B. Ruscic http://garfield.chem.elte.hu/Burcat/THERM.DAT 7.48347702E+00 2.57772064E-03-1.00945831E-06 1.72314063E-10-1.07154008E-14 2 6.12990474E+03-1.41618136E+01 2.17359330E+00 1.04902685E-02 1.10472669E-05 3 -2.81561867E-08 1.36583960E-11 7.81290905E+03 1.46022090E+01 8.97563416E+03 4 NH ATcT/AN 1.H 1. 0. 0.G 200.000 6000.000 1000. 1 ! E. Goos, A. Burcat and B. Ruscic http://garfield.chem.elte.hu/Burcat/THERM.DAT 2.78372644E+00 1.32985888E-03-4.24785573E-07 7.83494442E-11-5.50451310E-15 2 4.23461945E+04 5.74084863E+00 3.49295037E+00 3.11795720E-04-1.48906628E-06 3 2.48167402E-09-1.03570916E-12 4.21059722E+04 1.84834973E+00 4.31525130E+04 4 NNH T 8/11N 2.H 1. 0. 0.G 200.000 6000.000 1000. 1 ! N2H in Burcat database http://garfield.chem.elte.hu/Burcat/THERM.DAT 3.42744423E+00 3.23295234E-03-1.17296299E-06 1.90508356E-10-1.14491506E-14 2 2.87676026E+04 6.39209233E+00 4.25474632E+00-3.45098298E-03 1.37788699E-05 3 -1.33263744E-08 4.41023397E-12 2.87932080E+04 3.28551762E+00 3.00058572E+04 4 NH2 AMIDOGEN RAD IU3/03N 1.H 2. 0. 0.G 200.000 3000.000 1000. 1 ! E. Goos, A. Burcat and B. Ruscic http://garfield.chem.elte.hu/Burcat/THERM.DAT 2.59263049E+00 3.47683597E-03-1.08271624E-06 1.49342558E-10-5.75241187E-15 2 2.15737320E+04 7.90565351E+00 4.19198016E+00-2.04602827E-03 6.67756134E-06 3 -5.24907235E-09 1.55589948E-12 2.11863286E+04-9.04785244E-02 2.23945849E+04 4 H2NO RADICAL T09/09N 1.H 2.O 1. 0.G 200.000 6000.000 1000. 1 ! Glarborg, P. et al. Progr Energy Combust Sci, 67, 31-68. (2018) 3.75555914E+00 5.16219354E-03-1.76387387E-06 2.75052692E-10-1.60643143E-14 2 6.51826177E+03 4.30933053E+00 3.93201139E+00-1.64028165E-04 1.39161409E-05 3 -1.62747853E-08 6.00352834E-12 6.71178975E+03 4.58837038E+00 7.97044877E+03 4 N2H3 Rad. T 7/11N 2.H 3. 0. 0.G 200.000 6000.000 1000. 1 ! E. Goos, A. Burcat and B. Ruscic http://garfield.chem.elte.hu/Burcat/THERM.DAT 4.04483566E+00 7.31130186E-03-2.47625799E-06 3.83733021E-10-2.23107573E-14 2 2.53241420E+04 2.88423392E+00 3.42125505E+00 1.34901590E-03 2.23459071E-05 3 -2.99727732E-08 1.20978970E-11 2.58198956E+04 7.83176309E+00 2.70438066E+04 4 END 以上是我的therm文件,设置应当正确,而我的初始条件设定均为300k,为什么还会出现问题,还有什么地方设置了所谓的common temperature吗
11-02
<think>我们正在处理CONVERGE模拟中出现的FATAL_ERROR: "The common temperature is higher or equal to the highest temperature",尽管用户确认: - therm.dat文件来自专业文献且设置正确 - 初始条件设定均为300K 然而,错误提示中的“common temperature”除了初始温度外,还可能指向其他设置。我们需要全面分析CONVERGE中所有可能定义“common temperature”的位置。 根据CONVERGE的工作机制[^1],以下位置可能设置了温度值并被软件识别为“common temperature”: 1. **初始条件(Initial Conditions)**: 用户已明确初始温度设置为300K,但需注意: - 可能存在多个区域(zones)或相(phases)的初始温度设置,需检查所有区域的设置。 - 如果使用非均匀初始化(如通过用户函数定义初始温度场),则局部区域的温度值可能超出范围。 2. **边界条件(Boundary Conditions)**: - 边界类型如温度壁面(wall)或入口边界(inlet)可能设定了温度值。例如: - 恒温壁面(isothermal wall)的温度设置。 - 入口边界(如质量流量入口)的温度设置。 - 如果任何边界温度高于或等于therm.dat中的最高温度,则可能触发此错误。 3. **环境条件(Ambient Conditions)**: - 在CONVERGE中,环境温度(用于热损失模型、开放边界等)通常通过`ambient_temperature`参数设置。此值若未明确指定,有时会默认采用初始温度,但若单独设定过高则会导致错误。 4. **热源(Heat Sources)**: - 如果模型中包含热源(如火花塞点火、化学反应源项),其激活时的局部温度可能直接被设置为一个高值(例如2000K)。虽然热源通常在计算过程中激活,但在初始化阶段如果热源模型预设了高温值,也可能导致冲突。 5. **用户自定义函数(User-Defined Functions, UDFs)**: - 通过UDF设置的任何温度(如初始温度场、边界条件、源项)若未正确处理单位或范围,可能引入异常高温值。 6. **化学反应模型(Chemistry Models)**: - 如果使用详细化学反应,反应机理文件(如CHEMKIN格式)中的温度范围需与therm.dat一致。若反应机理的最高温度低于therm.dat的最高温度,但高于当前设置,则可能不直接导致此错误。但若反应机理中的初始物种温度设置过高,仍可能引发问题。 7. **求解器内部设置(Solver Internals)**: - 某些求解器参数(如参考温度)可能被定义为“common temperature”。这些参数通常在输入文件的数值设置部分(如`&numerics`)定义,但较少见。 8. **热力学数据库引用方式**: - 用户可能为不同物质指定了不同的therm.dat文件。若某个物质的therm.dat文件最高温度设置过低(如1000K),而其他设置均为300K,但该物质的温度范围不足,也会报错。 9. **单位系统一致性**: - 检查所有温度相关参数的单位是否统一(CONVERGE默认使用K)。例如,若therm.dat中的温度范围以K为单位,而某边界条件误用°C(如设置1000°C而非1000K),则1000°C=1273K可能超出范围。 ### 诊断步骤: 尽管用户已设置初始条件为300K,仍需按以下流程排除其他因素: 1. **检查所有边界条件**: 在CONVERGE输入文件(.con或.input)中搜索以下关键字: ``` temperature, temp, isothermal, thermal_bc, heat_flux ``` 确认所有边界温度均低于therm.dat的最高温度(例如,若therm.dat中$T_{\text{max}}=1000\,K$,则边界温度必须满足$T < 1000\,K$)。 2. **确认环境温度**: 在输入文件中搜索`ambient`,例如: ```plaintext &ambient ambient_temperature = 300.0 ! 确保此值合理 / ``` 3. **检查热源模型**: 搜索`ignition`、`heat_source`等关键词,确认是否有预设高温值。 4. **验证多区域/相设置**: 如果模拟包含多区域(如流体和固体)或多相(如燃烧中的液滴),检查每个区域/相的初始和边界条件。 5. **审查UDFs**: 若有UDF,检查其中温度赋值部分的代码逻辑(如Fortran/C函数)。重点排查: - 是否硬编码了固定温度值(如`temp=2000.0`)。 - 单位转换错误(如误将摄氏温度当作开尔文使用)。 6. **查看therm.dat具体内容**: 尽管文件源自文献,仍需验证实际内容: - 用文本编辑器打开therm.dat,确保最高温度值(如$T_{\text{max}}$)明显高于模拟中任何位置的温度(建议$T_{\text{max}} \geq 1.2 \times T_{\text{max,sim}}$)。 - 检查物质数量:确保所有模拟中涉及的物种都在therm.dat中定义。 7. **运行最小化测试**: 创建一个简化案例: - 移除所有边界条件(使用周期性边界)。 - 移除热源和化学反应。 - 仅保留一个区域和一种物质。 若错误消失,则逐步添加组件直至复现错误,从而定位冲突源。 ### 示例场景: 假设therm.dat中某物种定义为: ``` ! Species: O2 ! T_min = 300.0, T_max = 1000.0 ``` 而某边界的质量流量入口条件为: ``` &boundary type = 'mass_inlet' mass_flux = 1.2 temperature = 1200.0 ! 1200K > 1000K → 触发错误 / ``` 此时需降低入口温度或修改therm.dat的温度范围。 ### 解决方案: 1. **调整温度范围**: 若确认是边界/环境温度超出范围,降低这些温度值至$T < T_{\text{max}}$。 或谨慎提高therm.dat中的$T_{\text{max}}$(需确保有可靠的高温外推数据支持)。 2. **统一单位**: 将所有温度相关参数转换为开尔文(K)。 3. **更新模型**: 若问题源于热源或UDF,修改预设温度值。 若上述步骤无法解决,请提供以下信息进一步分析: - therm.dat文件的前20行(不含敏感数据)。 - 输入文件中与温度相关的设置片段(边界、初始条件、环境等)。 §§相关问题§§ 1. CONVERGE中如何正确设置多区域初始温度? 2. 如何检查CONVERGE边界条件的温度设置? 3. 在CONVERGE中如何通过UDF设定温度场? </think>### CONVERGE中导致“common temperature”过高的潜在原因分析 尽管您已确认therm.dat文件正确且初始条件设为300K,但CONVERGE中的“common temperature”可能来自多个隐藏设置。以下是需要排查的关键位置(按优先级排序): #### 1. **环境温度设置(Ambient Conditions)** - 在`&ambient`参数组中,`ambient_temperature`可能被设为过高值 - 示例代码段: ```plaintext &ambient ambient_temperature = 300.0 ! 确保此值 < therm.dat的最高温度 / ``` - **诊断建议**:在输入文件中搜索`ambient_temperature`,确认其值满足 $T_{\text{amb}} < T_{\text{max}}$ [^1] #### 2. **化学反应模型中的参考温度** - 若使用化学求解器(如SAGE),机理文件中的`REFERENCE TEMPERATURE`可能冲突 - 示例(CHEMKIN格式): ```plaintext ELEMENTS H O C END SPECIES H2 O2 H2O REACTIONS REFT 300 ! 检查此参考温度 ``` - **诊断建议**:检查chem.inp或类似化学机理文件中的温度设置 #### 3. **边界条件隐含温度** - 特定边界类型会自动设置温度: - `wall_temperature`(等温壁面) - `pressure_outlet`中的背压温度 - `mass_inlet/mass_flow_inlet`中的流入气体温度 - **关键点**:即使初始温度为300K,边界温度过高也会被识别为“common temperature” #### 4. **热交换模型参数** - 热交换器模型(如`&heat_exchanger`)中的`reference_temperature` - 散热器模型中的冷却介质温度设定值 - **排查位置**:输入文件中搜索`temperature`或`temp`关键字 #### 5. **多相流设置** - 若存在离散相(液滴/颗粒): - 液滴初始温度 (`droplet_temperature`) - 蒸发模型的参考温度 (`vaporization_reference_temp`) - **影响**:相变温度可能被全局识别为“common temperature” #### 6. **求解器控制参数** - 高级数值设置中的参考温度: ```plaintext &numerics reference_temperature = 300.0 ! 可能被忽略的设置 / ``` - **特别提示**:此参数常用于非等温流动的数值稳定性控制 ### 诊断流程图 ```mermaid graph TD A[出现FATAL_ERROR] --> B{检查ambient_temperature} B -->|过高| C[降低环境温度] B -->|正常| D{检查边界条件} D -->|壁面/入口温度过高| E[调整边界温度] D -->|正常| F{检查化学机理文件} F -->|REFERENCE TEMPERATURE过高| G[修改化学参考温度] F -->|正常| H{检查多相模型} H -->|液滴/颗粒温度过高| I[调整相变参数] H -->|正常| J[检查热交换器设置] ``` ### 紧急解决方案 1. **强制覆盖全局温度**(调试用): ```plaintext &override temperature = 300.0 ! 强制所有区域温度 / ``` 2. **Verbose模式运行**: 在命令行添加`-verbose 2`参数,定位温度初始化位置 3. **温度范围检查工具**: 使用CONVERGE预处理器命令检查冲突: ```shell converge_thermcheck -f therm.dat -tmax 5000 # 显式指定最高温度 ``` ### 预防措施 - **温度安全裕度**:始终设置 $T_{\text{max, therm}} \geq 1.5 \times T_{\text{max, sim}}$ - **单位一致性检查**: ```python # 简易验证脚本示例 therm_max = 3000 # therm.dat最高温度(K) sim_params = [ambient_temp, wall_temp, chem_ref_temp] if any(t >= therm_max for t in sim_params): print("温度冲突警告!") ``` > **关键洞察**:CONVERGE将模拟中所有**非计算生成的初始温度值**均视为“common temperature”,包括环境参数、边界条件、参考温度等隐含设置[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值