语 言与有 限元 程 序 设 计
叶 又
戚 燕
上海交通 大学 国家模具
工程 中心 上海 以刀
上海 大学计算中心 上 海 匹口刀
本 文通过 与 民件以入 语 言的比较 , 说 明利用 语 言开发有 限元 程序 的可行 性 。
摘 要
结果表 明 , 语 言不但 完全 可 以实现
的语 法 功 能 , 拥 有更 强 大 的实用编 程 环 境 ,
同时 由于 提供指针变量 、 动态 内存分 配 函数和结构变量 , 使其编 写 的软 件在维 护 性 、 可读 性和
内存利用 效率方 面具 有 明显 的优势 。 文 章最 后还 将 语 言与最近 出现 的 ’ 召 作 了简
单比较 。
皿
关健词
语 言 有 限元 程 序
民 入
皿认 卯
淤
‘
丫劝
了 从“如“ 旅 侧刀 及砂袱涵呀 ‘旨公叮 , 肠叫加 £人洲份移 更加奴 ”匆尸 , 从叫内葱创泊刃 。
肠叫妞吨 ‘冶留 ,
, 四甲湘 伪自阶勿 , 腼卿‘ 滋 “刃刀
加奴翻
毗 角阳祀
朋详 嗯 袱 印
帅 卜
加
班田
,
卯 招 涌 曰币 服双幻巧 心倪
丘
开 入
班 面 山 , 此目曲
犯“ 幻理
加姗民
如 如
,
切山
甲
即
详解 面 沈
朋 朋 切叨 助叭 面
卿
别网
刊
, 叨
, 比 , 兀 珑
” ,
正山
甲详
即和叻
切邵
叮屹 巧卿朋
件
如
引
言
砰 入 是 最 早 出现 的 高级 编程 语 言之 一 。 国 际标 准化 组 织先 后 推 出了
、
以及 最 近 的 ’川
三种标准版本 , 至 今 已 发展 了 三 十余年 , 在科学计算 领
域有 广泛 的应 用 。 当前有 限元 程 序 的源代码 几 乎 清一 色是 由
件沙入 写成 。 而 语 言 的发
展 仅 有 十几 年 , 但却有 一 种后来 居 上 的趋 势 , 开 始成 为开 发高质量 软件 的主 要 编程 语 言 。 目前
收稿 日期 夕荀 一
一
。 叶又 , 博士 , 主要 研究领域 三 维板料成形有 限元数值模拟 系统 的开 发 。
·
·
在各种机 型 和各种操作系 统上 都运 行 有 语 言的编译 器 , 提 供 了 丰 富 的库 函数 和 实用 程 序 ,
以 改善用 户 一 程 序界 面 , 效率 , 并 简化 编程 。
本文 的 主要 目的是 通 过 与 民 入 的 比较 , 说 明利用 语 言 开 发 有 限元 程 序 的可 行
件认双 刀 的全 部语 法功 能 , 它提供的 指 针 数 据类 型 实现 了真正 意 义
性 。 语言不但包容 了
上 的 内存 动态分配 。 同时 , 合理有效地定义结构数据类型 可大大增加程序可读性 和维护效率 。
八 是
语 言 的最 新 标 准版 本 。 由于 采 用 了新 的计算 机 软件科 学 理论 ,
其 功 能实际上 已超 过 语 言 。 作 者对两 者作 了概要 的 比较 , 从 实用 的角度提供 了一 些 建议 。
语 言与
的 主要语 法 结 构 比较
最 初 出现 是用 作
操 作 系统 的记 述 语言 , 发展 之 初 一 直 作 为“ 较低级 语 言 ”编写 与硬
件关 系密 切 的底层 软件 。 由于 伏 的成 功 和 广泛 使用 , 语 言 开 始 流行 起 来 , 并成 为 一 种普
遍 使用 的程序 设 计语 言 。 由于 两 者产生 的背景 不 同 , 它 们 是存 在 差 异 的 。 主 要 表 现 在 函数 的
调用 和参数 的传递 , 特 别 是 多 维 数组 的 处 理 方 面 不 如 ’ 召 直 观 和 易 于 理解 。
’件 召
从 一 开始就用 于科 学 计算 , 必 须 处 理 诸 如 矩 阵 一 类 的 数 学 问 题 , 多 维 数 组 是 它 的主 要 使用 工
具 , 而 语 言一 开 始 主要 是 面 向 系 统 程 序员 的 , 在 应 用 中很 少 会 涉 及 多 维 数 组 。 但这 并 不 意
味着 在 处 理 多 维 数 组 时会 遇 到很 多 麻烦 。 文【 〕提 供 了利 用 指 针 数据 类 型 处 理 多 维 数组 及 其
在 函数 中传递 的两 种方 法 。 利用 这 些 方法 可 以方便地 将 ’
的数组 操作移植成 语 言
的 。
竹
与
一 样 , 也是 一 种 结 构 化 的 程 序设 计语 言 。 结 构 化程 序 设 计要 求 程 序 的
逻辑 结 构有 顺 序 、 选 择 和 循环 三 种 基 本 结 构 , 提供 了 编 写 结 构 化 程 序所 需 要 的语 句 。 同时 ,
使用 也 便于进 行模 块 化程序设 计 , 程 序 由众 多 的 函数 组 成 , 函 数是进 行模块 化程 序设 计 的
的 子 程 序功 能相 似 。 另 外 , 还 提供 了较 ’ 认入 丰富得 多 的运 算 符
基 本 单位 , 与 印
和 数据类 型 , 甚 至允许 用 户 利 用 基本数据类 型 自己 定义 数据 类型 。
的主 要 可 执行 语句 与 有 明确 的语 句对 应关 系 , 并完成相应 的功 能 , 见 表 。
表
认入 竹 主要句法与 语 育的对应关 系
功功 ,
曰曰石
…
… 竹祝
日日另
】】刃 二 ,
,
洲 二
,
】 】】
此 试 …
试 …
日阳
二
,
,
,
,
二
研阻呢 子程序名 …
类 型 函数名 …
侧
】, 书 , … ……
”
花址
以刃
…
。丫 】
抽比
酗 。 过过
动态 内存分配技术
让我们先来研究一 下 利用
八 编写 的有 限元 程 序所使 用最广 的一 种 内存动态 管
理方法 。 该方 法 在程序一 开 始就在无 名公 共 块 中定 义 一个 大数 组 , 在 程 序不 同运 行 阶段 存
放不 同的内容 。
长心
月
让
口刀 二 众刀
』“
日
月卫妊
月
加 一一矶服
刃 一一
一一一
’
巧
班任飞
下侧汀幻 巴
汀
芜巧
加以
兀
刊 , 刀 , 义
砚卯
刃 关
赞 蹄刃
并 岌
】闻 理
,
,
,
,
,
, 即 · …
二
二
二
二
二
二
刊日刀
州 刃
, 闻荆 , 刀 ,
,
,
, 刃 , …
致印 口叮 卫 ,
一
,
一
压任 〕
亚洲
夕于
, 卜
, 刃
刃 ,
,
,
由于 数组 的大小 必 须事 先 给定 , 为满 足 解 题 规 模 , 会 尽可 能开 得 足 够 大 。 当求解 一 个
较小 问题 时 , 它 同样 占据着很 大 的 内存 , 无 疑 造 成 计 算 机 资 源 的浪 费 , 这 种 情 况 对 于 目前 多任
务 多进 程 的操 作环 境更 为重 要 。 同时 , 为 了求 解 更 大 规 模 的 问题 , 还 必 须 调 整 数组 的 大 小 ,
重新 编译 源 程 序 。
实 际计算 间题 的大 小 是 很难 确定 的 , 利用 上 面 方 法 编写 的 程 序实 际 上 在 生 成 执 行代码 时
就 决定需 要 内存 的数量 。 更一 般 的 情况 是 , 如 果 一 个 变 量 被 指 定 为 全 局 变 量 如 上 面 的 数
组 , 则 它 在整 个 程 序运 行 期 间都 占据存储单 元 。 如 果 是 自动 变 量 和 形 参 , 则 在其所 在 的子 程
序 执行 期 间 , 它 占有 的存储 单元 也 是不 释 放 的 。 这 种 方 法 处 理 问题 , 缺乏 灵 活性 , 往 往 会 浪 费
许 多 内存 , 不 是 真正 意义 上 的动 态 内存 分配 。 人们应该设 想 能否 找到这 样 一 种方法 , 根 据需 要
临 时分配 内存单元 以 存放 有 用 的数 据 , 当数据不 用 时 又 可 以 释 放 存储单元 。 此 后 这 些 存储单
元 又 可用 来 分配 给其 它数据 或程 序使用 , 语 言使 用 指 针 数 据 类 型 和 标 准 的 动态 内存 管理 函
数
可 以 非 常方便地 实 现 这 一想 法 。
。目
,
分配 个 变量 的 内存连 续 空 间 , 每个 变量 字 节 大 小 是 , 吮 。 由于 此 函数类 型 说 明时是
故 在使用 时要 强 制转换 为 所 用类 型 变 量 的指 针 。
,
,
关
帕 补 户
,
‘
,
,
、 的大 小 可 根 据解 题 的规模 在 程序运行 时赋 值 。 数 组 共 占用
个 字 节 内存 , 夕 共
个 字 节 内存 。 当数组 、瞬 不 再 需 要 时 , 它 们 占用 的 空 间 可 简单 地 使用 下 面语 句
占用
释放
触
阮
释放指 针 变 量 、衅 指 向的存储 空 间 , 交 还 给 系 统 分 配 它 用 。 注 意 此 时 、解 不 能 是 任 意 地
址 , 而 只 能是 由 。目
函数 所 返 回 的地 址 , 并 且 不 能 再 被 重 新 赋 值 , 否 则 将 引起 内存 管理 混
乱 。
利 用 结构数据类 型增 加程序 的可 读性
语 言 通 过使 用 结 构 数 据 类 型 把 一 组 不 同类 型 的数 据 同时 又 是在 逻 辑 上 相关 的数 据组 成
一 个 有 机 的整 体 , 以便 于 引用 。 有 助 于提 高程 序 的可读性 和加 快程 序开 发 的效 率 。
鱿
阂以
叨
, 节点序号
压坦 ,
,
‘ 节点坐标 ‘
月朋 山 , 叮 ,
‘山丘 , 听 , ‘
‘ 节点位移 ,
, 节点 约束情况 ,
二 司
二 节点信息
日位
,
司
、
, 单元序号 ,
二 以
山阴浏肠
二 节 点序号指针 二
单元节 点数 ,
沐 翻坦日
,
签 高斯积分点数 朴
二 单元信息 二
功 创 显 然很 难有 效地 管理 以 上例 子 中有关结 点和 单元 等类 型 的数据 , 它 只 能 使
用 一 大堆数组 或 变量 去分别描述 它们 , 过 多 的毫无 规 律 的名 字无 疑 给编 写 和 阅读程 序造 成 了
困难 。
语言与
刀 尤 和
巧
年 ,
仟认 卯 被 国际标 准化组 织
功能 和 先进 性方 面 都有 突破性 进展 , 吸 收 了 巧
认可 , 并正 式公布 。 与 功 八 相 比 , 在
、 语 言 的 长 处 , 提 供 动 态 内存 分 配 功 能
工陀彭 语 句 、指 针 变量 、结 构类 型 , 并允 许用 户 自己定 义 数据类型 , 增 强
了程 序设计 的可 读性和 易维 护 性 。 同时
还 大 大 发展 了 ’ 八 语 言原 有 的数
值计算优势 , 主要 表 现 在对数组 的处 理 上 。 如引进 了数 组 直接运 算 、 数组 取 函 数 、数组 直 接赋
值 、数组 与标量 运算 等概念 。 使数组 的运算从 繁琐 的对 数组 元 素 的运 算 中解 脱 出来 , 大 大 简 化
了程 序 的编 写 , 也 为 以 后 大 型 机 平 行算法 准 备 了条 件 。 如对 、
、 三 个 形 状 相 同的数组 , 一
条 简单 的语 句 二
的 功 能 确
实要 比 语 言强 。
即可 实现 二 个 数 组 的求 和 。 在 数值 计 算方 面 ,
在 程 序设 计语 言 的发 展 过 程 中 ,
皿 创 语 言 被认 为是 科学 计算 的专用 语 言 ,
认
也 不 例 外 。 近 年来 , 随着计算机 软硬 件技 术 的 发 展 , 数 据 结 构 、 数据库 管理 技 术 、 可 视 化 与
计算机 图形 学 、用 户 接 口 、系统集成 以 及 人 工 智 能 等 领 域 的成 果 被 逐 渐应 用 到 有 限元 软 件 中 ,
有 限元 程序设 计并 不 仅仅 局 限 于 单一 的科 学 计算 , 需 要 涉及 众 多 的软件 开 发 领 域 。 毫无 疑 问 ,
如 却很 难 实 现 。 另 一方 面 , 从 软 件
的编程 环 境来 看 , 目前
创 的编译 器极 少 , 只 有在少 数 高性 能 图形 工 作 站 、 大 型机 、 巨
型 机 上 开 发 出 的专用 系统 。 而 语 言 的 编译 系统 相 当普 及 , 可 以 运 行 在 各种 机 型 上 , 便 于 实
现跨平 台的软件 系统集成 。
语 言可 以提 供这 类软件开 发 所 需 的功能 , 而 用
相 比而 言 , 如 果纯 粹考 虑数值计算能力 , 砰丹
更 强 。 但考 虑 到今后 各 种 软 件技 术
与有 限元程 序 的集成 , 语 言是 比较 明智 的选 择 。
算 例 分 析
为 了 比 较 , 我 们 对 文献 〔 提供 的
、内存
一致 的 语 言程 序 。 在
入 程 序进 行 了 翻译修改 , 编制 了结构功能 基 本
的微 机 上 进 行计算 比较 , 见 表
表
与
灿入 万 源代码 、 执行代码和解题规模的比较
源源 代码码
人人入 一
编译器器
幻
玉刀 」记
从月
礴
创
知 一
入 ,
一
’ 入入
由硬 盘大小决定
由公 共 区 数组 的大小决定 。
源文件大小小
执行代码大小小
肠
〔政
解题规模模
日仪】自由度度
无 限制
以力 自由度度
无 限制
分月沪门七匕,翔工
,卜人‘卜
比较 以 上 四种 情况 我们 发 现 , 与
只 在 源 文 件 大 小 基 本相 当时 , 执行 文 件 代 码 却
相 差很 大 , 这 主要 是 因为 用 功
编 程 时 , 必 须 考 虑 到 求 解 问题 的 最 大 规 模 , 预 先 开 好 一
个 大 数组 , 执 行 文 件 的大小 在 很 大 程度上 是 由这 个 数组 的 大 小 决定 的 。 而 语 言提 供 的 指 针
数据类 型 和 动态 内存分配 函数在 程序运 行 时根 据 解题 规 模动态 地 分 配 内存 大小 , 无 须 预 先 留
出空 间 。
在 计算 时 间方 面 , 对 于 同样 的 可 计算 问 题 小 于 以沁 个 自由度 , 四 种 环 境大 致 相 当 , 语
小 , 装 入 内存更
言稍 快 , 与文 献 〔 〕结论基 本 一 致 。 这 可 能 是 由 于 的 执 行 代 码 较
快些 所 致 。
利 用
、
一
编 译生 成 的执行 文 件 , 无 法 突破
的 翻 常规 内存 的限
制 , 解 题规 模较 小 。
认 可 以利 用 硬 盘模 拟 内存 , 大 大提 高 了解题 规模 。
刊日八
环 境 利 用
功 职汀
的 内存 管 理技术 , 解题 可 以直 接 利 用计 算 机 提 供 的 所 有
常规 和 扩 展 内存 进 行 计算 , 同 时 计算 速 度 也 有 明 显 提 高 。 对 于 仪心 个 自由度 以 上 的 问题 , 效
率一 般会 高 出
几倍甚 至 几 十倍 。
州
最 后 对 程 序 的移 植性 作一 点 说 明 , 将
须 作 任 何 改 动 , 而从 一
的大 小 是必 须 变 动 的 。
八 向
源 程序 移植 到
环 境 时 , 程 序 无
认 移 植 时 , 为 了增 大解 题 规 模 , 有 若 干 数 组
盛
由于 目前
的编译 器 主 要 是利用 它 的 数组 并行 处 理 能力 , 多 见 于 大 型 机 、 巨 型
机 系 统 , 不 便进 行 比较 。 故 文 中无算 例 。
结 束 语
语 言作 为一 种优 秀 的程 序 设 计语 言 , 已 广 泛 用 于 开 发 各种实用 程 序 。 然 而 在 数 值计算
领域 , 尤 其 是 对 有 限 元 程 序 的 开 发 使 用 甚 少 。 追 根 求 源 , 这 其 中历 史 的 原 因 是 不 容 忽 视 的 。
只 语 言也 日趋成 熟 。 当时 出 版 的 有 限
七 十 年代是 有 限元 发 展 的 黄金 时 代 , 与 此 同 时
元 名 著 , 如
的
记
的
司
脚 等 。 从 理 论 到程 序 结 构 一 直影 响 了 以 后 的 几 代 学 者 。
名 有 限 元 软 件都是 从七 十年代 用 印
的 角 度 , 我们 不 应 当也 不 可 能 重 新用 语 言 去 改 写 如 此 庞 大 的软 件包 。 最 新 推 出 的
或 砰丹队
、
、 凡引下队 等 著
发 展 起 来 的 。 从 保 护 现 有 投 资
八
版本 虽 然 可 以 完全 实 现 语言 同样 的功 能 , 然 而其 软件 开 发 环 境 和 软 件 的集 成 性 等方 面都
远 不 如 语 言 , 所 以 笔者认 为 语 言仍然是最 好 的选 择 。 九 十年 代兴 起 的 面 向对 象 的编程 技
术无 疑 给软件开发 带来 了新 的方 法 , 语 言的后 继 者
提供 了支持面 向对 象 的程 序设计 所
有 特 征 。 如何利 用
编写 面 向对 象 的有 限元程 序是 作者下 一 步 的主要 工 作 。
参 考 文 献
〔 谭浩强 , 语 言程序设计 , 清华大学 出版社 , 引
〔 油 一 翔即
〔 〕珑
〔 ’‘ 。 词 。珊“ 一 加 加旧 舫司 。 撇触眠
〔 〕沈彬 ,
, 场 呼峨罗
, 币 日
资呀阁 刀
习城 卯 程序员 编程 指南 , 北 京 希望 电脑公 司 , 卯
, 。司 ‘ 溯 ,
尹 ‘ , 伪呷
,
,
一
, 期
巧匆朋耐吧 恤吧月哪 , 伪碑双 加 , 柑 ,
一
, ’