SUNTANS模型学习(9)——学习Tidal forcing算例
学习Tidal forcing算例
- 简介
- 网格配置与地形
- 定解条件设置
- 初始条件设置
- 边界条件设置
- 开边界处的通量计算(OpenBoundaryFluxes)
- 开边处的速度、水位(BoundaryVelocities)
- 其它参数配置
- 模拟结果
简介
SUNTANS中 tidal forcing 算例的全称是 Example tidal forcing in Monterey Bay。该算例模拟了 Monterey Bay 地区在潮汐作用下的水流;但由于模型网格的水平分辨率较粗,该模型只能模拟正压流动,而无法模拟该区域的内波。通过该算例,我们可以学习SUNTANS模型中tide模块的应用及潮汐边界条件的设置。
该算例的网格和参数文件位于 /examples/tides,其中还包含一个简单的说明文件 README。
网格配置与地形
本例采用一个三维网格。从水平面上看,计算域如下图所示,其网格均为三角形。从垂向看,网格被分为了10层(suntans.dat: Nkmax=10, rstretch=1)。
注意,下图所示网格仅是输入时候的网格;在模型中,网格的 Voronoi 点需要被校正,之后才会进行模拟。当要对网格的 Voronoi 点进行校正时,suntans.dat 文件中的 CorrectVoronoi 要被设置成 -1,校正参数 VoronoiRatio 需要被指定。在本算例中, VoronoiRatio = 85,即对于任何最大角大于85°的三角形网格,其 Voronoi 点需要被校正。

注意,上图中不同颜色的计算域边界线表示了不同类型的边界。其中,紫红色线的编号为1(marker=1),表示陆地边界(闭边界);绿色线的编号为2(marker=2),表示受潮汐作用的开边界;
计算域的地形数据存储在 /examples/tides/rundata/mbay_bathy.dat 文件中。在运行SUNTANS时,该文件中的数据将被插值到每个网格的 Voronoi 点上。因为这个过程可能会花费相当长的时间,所以最好只在必要时运行它,并在之后的运行中使用预插值的水深测量(/examples/tides/rundata/mbay_bathy-voro)。
如果在模型运行过程中进行了地形数据插值,一个名为 mbay_bathy.dat-voro 将会被输出,并出现在结果文件夹 /examples/tides/data 中。是否进行地形插值计算可通过设置输入文件中 suntans.dat 来实现。当 suntans.dat 中的 IntDepth 被设置为1时,插值过程将会进行,即模型将在 rundata 文件夹中读取 mbay_bathy.dat 文件,并输出插值后的数据文件 mbay_bathy.dat-voro;若 IntDepth 被设置为2,模型则会直接读取 mbay_bathy.dat-voro 的数据,即不进行插值计算。由于自带算例文件中已经包含 mbay_bathy.dat-voro 文件,故本算例的 IntDepth 被设置为2。
请注意,若Voronoi点发生改变,地形数据都应该被重新插值。
插值后的静水深如下图所示。

定解条件设置
初始条件设置
在本算例中,初始的水位和流速值需要设定。初始条件的相关设置参见 initialization.c 文件。
- 函数GetDZ:对本算例,此函数不重要,略作介绍
该函数用于确定垂向网格。对于本算例,rstretch=1,所以垂向网格通过水面、最深点和垂向最大网格数推算得出。 - 函数ReturnDepth:对本算例,此函数并没有被调用,因为仅当IntDepth=0时此函数才被调用;此处不讲解
- 函数ReturnFreeSurface(重要):用于给定水位的初始条件。
对于本算例,初始水位为0;故设置如下:REAL ReturnFreeSurface(REAL x, REAL y, REAL d) {return 0.0; } - 函数ReturnSalinity和ReturnTemperature:用于确定初始时刻的盐度/温度场(不重要)
由于state.c中的设置:
水体密度仅和水体盐度相关。而系数beta=0(suntans.dat中设定),故可认为本例中盐度和温度设置对流动过程没有影响。REAL StateEquation(const propT *prop, const REAL s, const REAL T, const REAL p) {return prop->beta*s; } - 函数ReturnHorizontalVelocity:设定了初始时的水平流速场
REAL ReturnHorizontalVelocity(REAL x, REAL y, REAL n1, REAL n2, REAL z) {return 0.0; }
边界条件设置
在本算例中,需要设定的边界条件有两部分.一是陆地边界(marker=1),二是受潮汐驱动的开边界(marker=2)。相关设置都在 initialization.c 文件中。
开边界处的通量计算(OpenBoundaryFluxes)
void OpenBoundaryFluxes(REAL **q, REAL **ub, REAL **ubn, gridT *grid, physT *phys, propT *prop) {int j, jptr, ib, k, forced;REAL **uc = phys->uc, **vc = phys->vc, **ucold = phys->uold, **vcold = phys->vold;REAL z, c0, c1, C0, C1, dt=prop->dt, u0, u0new, uc0, vc0, uc0old, vc0old, ub0;for(jptr=grid->edgedist[2];jptr<grid->edgedist[3];jptr++) {j = grid->edgep[jptr];ib = grid->grad[2*j];for(k=grid->etop[j];k<grid->Nke[j];k++) { ub[j][k] = phys->boundary_u[jptr-grid->edgedist[2]][k]*grid->n1[j] + phys->boundary_v[jptr-grid->edgedist[2]][k]*grid->n2[j]; }}
}
上面的代码指定了,在所有marker=2的边上(grid->edgedist[2]),速度ub为是 (boundary_u, boundary_v) 在边界法相量 (n1, n2)上的投影:
ub[j][k] = phys->boundary_u[jptr-grid->edgedist[2]][k]*grid->n1[j] + phys->boundary_v[jptr-grid->edgedist[2]][k]*grid->n2[j];
(boundary_u, boundary_v) 将在函数BoundaryVelocities中设定。
开边处的速度、水位(BoundaryVelocities)
void BoundaryVelocities(gridT *grid, physT *phys, propT *prop, int myproc, MPI_Comm comm) {int i, j, jind, iptr, jptr, n, k;REAL h, u, v, toffSet, secondsPerDay = 86400.0;if(prop->n==prop->nstart+1) SetTideComponents(grid,myproc);// Tidal data is from the start of a particular year, so an offset // needs to be used to start the simulation on a particular date.// Note that the offset time is in days, and must be converted to seconds// using the secondsPerDay variable.toffSet = MPI_GetValue(DATAFILE,"toffSet","BoundaryVelocities",myproc)*secondsPerDay;for(jptr=grid->edgedist[2];jptr<grid->edgedist[3];jptr++) {jind = jptr-grid->edgedist[2];j = grid->edgep[jptr];u=v=h=0;for(n=0;n<numtides;n++) {h = h + h_amp[jind][n]*cos(omegas[n]*(toffSet+prop->rtime) + h_phase[jind][n]);u = u + u_amp[jind][n]*cos(omegas[n]*(toffSet+prop->rtime) + u_phase[jind][n]);v = v + v_amp[jind][n]*cos(omegas[n]*(toffSet+prop->rtime) + v_phase[jind][n]);}// Velocities from tides.c are in cm/s and h is in cm!phys->boundary_h[jind]=h*(1-exp(-prop->rtime/prop->thetaramptime))/100.0;for(k=grid->etop[j];k<grid->Nke[j];k++) {phys->boundary_u[jind][k]=u*(1-exp(-prop->rtime/prop->thetaramptime))/100.0;phys->boundary_v[jind][k]=v*(1-exp(-prop->rtime/prop->thetaramptime))/100.0;phys->boundary_w[jind][k]=0;}}for(iptr=grid->celldist[1];iptr<grid->celldist[2];iptr++) {jind = iptr-grid->celldist[1]+grid->edgedist[3]-grid->edgedist[2];i = grid->cellp[iptr];u=v=h=0;for(n=0;n<numtides;n++) {h = h + h_amp[jind][n]*cos(omegas[n]*(toffSet+prop->rtime) + h_phase[jind][n]);u = u + u_amp[jind][n]*cos(omegas[n]*(toffSet+prop->rtime) + u_phase[jind][n]);v = v + v_amp[jind][n]*cos(omegas[n]*(toffSet+prop->rtime) + v_phase[jind][n]);}// Velocities from tides.c are in cm/s and h is in cm!phys->h[i]=h*(1-exp(-prop->rtime/prop->thetaramptime))/100.0;for(k=grid->ctop[i];k<grid->Nk[i];k++) {phys->uc[i][k]=u*(1-exp(-prop->rtime/prop->thetaramptime))/100.0;phys->vc[i][k]=v*(1-exp(-prop->rtime/prop->thetaramptime))/100.0;phys->w[i][k]=0;}}
}
首先,调用tide.c中的SetTideComponents函数。该函数会读取输入文件夹中的潮汐参数文件,该参数文件的名字在suntans.dat中被指定:
TideInput tidecomponents.dat
TideOutput tidexy.dat
即潮汐参数文件的文件名为tidecomponents.dat。该数据文件是二进制格式,包含了分潮数 numtides、开边界的edges数 numboundaryedges,以及对应的各个分潮的角频率 omega,水平流速、水位振幅 amp 和相位角 phase。

此外,BoundaryVelocities还会读取 suntans.dat 中的一个数据 toffSet。这个数据表示模拟起始时间与tidecomponents.dat起始时间的偏移量,单位为天。在本算例中,toffSet=7。
prop->nctime = prop->toffSet*86400.0 + prop->nstart*prop->dt;
随后,第一个循环 for(jptr=grid->edgedist[2];jptr< grid->edgedist[3];jptr++) 中根据不同分潮的参数,求出了水位h和水平流速u、v的值;并用这些值确定了开边界的boundary_u、boundary_v、boundary_w。同时,为了避免潮汐边界条件在脉冲启动时的瞬态振荡,潮汐边界的添加还涉及了“缓坡启动”,设置的启动时间 thetaramptime=86400s (suntans.dat)。
在第二个循环 for(iptr=grid->celldist[1];iptr< grid->celldist[2];iptr++) 中,设定边界处的网格中心的流速uc、vc和w与边界处相等,即 uc = boundary_u、vc = boundary_v、wc = boundary_w。
其它参数配置
该算例采用静压模拟(suntans.dat: nonhydrostatic = 0),时间步长为Δt=90s (suntans.dat: dt = 90),总共运行3000个时间步(suntans.dat: nstep = 13440),并每隔120步输出一次结果(suntans.dat: ntout = 1344)。
水体的分子粘度采用 0.1 m2/s,垂向粘度通过求解MY-2.5紊流模型得到。
动量平流项采用中心差分格式(suntans.dat: nonlinear = 2)。
此外,模拟考虑了科氏力效应,设置科氏力系数Coriolis_f = 8.7e-5。
模拟结果
以下展示水位的模拟结果(TStep=13440; T=14days)。

相关文章:
SUNTANS模型学习(9)——学习Tidal forcing算例
学习Tidal forcing算例 简介网格配置与地形定解条件设置初始条件设置边界条件设置开边界处的通量计算(OpenBoundaryFluxes)开边处的速度、水位(BoundaryVelocities) 其它参数配置模拟结果 简介 SUNTANS中 tidal forcing 算例的全…...
力扣解法汇总1010. 总持续时间可被 60 整除的歌曲
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接: 力扣 描述: 在歌曲列表中,第 i 首歌曲的持续时间为 time[i] 秒。 返回其总持…...
利用老毛桃pe启动U盘启动ubuntu.iso,完成ubuntu系统的安装
1.双U盘,一个是老毛桃pe启动盘,可以启动grub4dos,加载了run模块,很好用(尤其是对不熟悉grub的小白) 2.大容量U盘存放ubuntu-desktop-i386.iso,U盘的格式是ntfs格式(其实这个不好&am…...
分享2个教学视频录制的方法!
案例:如何录制教学视频? 【我是一名老师,我想录制一些教学视频发布在网络平台上,但是我不知道如何操作。有没有人知道录制教学视频需要什么工具?如何录制?】 随着在线教育的普及,越来越多的教…...
「SQL面试题库」 No_63 报告的记录 II
🍅 1、专栏介绍 「SQL面试题库」是由 不是西红柿 发起,全员免费参与的SQL学习活动。我每天发布1道SQL面试真题,从简单到困难,涵盖所有SQL知识点,我敢保证只要做完这100道题,不仅能轻松搞定面试࿰…...
【事务】怎么去理解事务?
1、什么是事务? 事务是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做,要么全不做,是一个不可分割的工作单元。 2、事务具有哪些特性? 一个逻辑工作单元要成为事务,在关系型数据库管理系统中…...
camunda流程变量如何使用
Camunda是一个流程引擎,它支持在流程执行期间存储和操作流程变量。流程变量是一个值或对象,可以与Camunda中的流程实例、任务或执行相关联。 流程变量在Camunda中有很多用途。以下是一些常见的用途: 1、传递数据:流程变量可以用于…...
CMIP6:WRF模式动力降尺度、单点降尺度、统计方法区域降尺度
专题一 CMIP6中的模式比较计划 1.1 GCM介绍 1.2 相关比较计划介绍 专题二数据下载 2.1方法一:手动人工 利用官方网站 2.2方法二:自动 利用Python的命令行工具 2.3方法三:半自动购物车 利用官方网站 2.4 裁剪netCDF文件 …...
2023建筑设计师们有哪些好用的AI设计工具?
目前,建筑师要么单独工作,要么团队合作来完成设计过程,这可能需要数月甚至数年的时间。设计和准备用于开发的建筑物可能需要很长时间,有时甚至数年。一些比较繁琐的步骤可以自动化,但整个过程仍然需要大量的人工和时间…...
mysql主从复制与读写分离
mysql主从复制与读写分离 MySQL主从复制是一种常见的数据复制技术,用于将一个MySQL数据库服务器的数据复制到其他服务器上。 单台mysql在安全性,高并发方面都无法满足实际需求 配置多台主从数据库服务器以实现读写分离 读写分离,主数据库的…...
技术控,看这里,一款支持断点调试的数据科学工具
数据科学是一门利用统计学、机器学习、数据挖掘、数据可视化等技术和方法,从数据中提取知识和信息的交叉学科。自上世纪60年代,统计学家John W.Tukey首次提出“数据分析”(Data Analysis)的概念起,数据科学已历经了几十…...
论文导读 | 大语言模型上的精调策略
随着预训练语言模型规模的快速增长,在下游任务上精调模型的成本也随之快速增加。这种成本主要体现在两方面上:一,计算开销。以大语言模型作为基座,精调的显存占用和时间成本都成倍增加。随着模型规模扩大到10B以上,几乎…...
进阶自动化测试,这3点你一定要知道的...
自动化测试指软件测试的自动化,在预设状态下运行应用程序或系统,预设条件包括正常和异常,最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。 自动化测试框架一般可以分为两个层次,上层是管理整个自动化测试的开发&a…...
网络编程套接字API
一. linux平台 1.创建套接字 成功返回文件描述符,失败返回-1 int socket (int __domain, int __type, int __protocol) ;2.套接字绑定IP地址和端口号 成功返回0,失败返回-1 int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len);3.开启…...
数字藏品的价值和意义
2022年以来,数字藏品概念在国内火热起来。从年初的《关于防范 NFT相关金融风险的倡议》到8月份央行数字货币 DCEP的正式面世,从中国香港首个“NFT”艺术品在香港拍卖市场成交到国内多家互联网大厂推出数字藏品平台,越来越多的企业开始试水数字…...
Unity物理系统脚本编程(上)
一、获取刚体组件Rigidbody 当一个物体挂载了刚体时,即可在脚本中获取该物体的刚体组件,代码如下 Rigidbody rigid; void Start() { rigidGetComponent<Rigidbody>(); } 一般将刚体变量命名为rigid并定义为一个字段,方便复用. 二、施…...
Java基础(十七)File类与IO流
1. java.io.File类的使用 1.1 概述 File类及本章下的各种流,都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录(俗称文件夹),与平台无关。(体会万事万物皆对象)File 能新…...
跑步课程导入能力,助力科学训练
HUAWEI Health Kit为开发者提供用户自定义的跑步课程导入接口,便于用户在华为运动健康App和华为智能穿戴设备上查看来自生态应用的训练课表,开启科学、适度的运动训练。 跑步课程导入能力支持生态应用在获取用户的华为帐号授权后,将跑步课程…...
MySQL---8、创建和管理表
1、基础知识 1.1 一条数据存储的过程 创建数据库-->确认字段-->创建数据表-->插入数据1.2 标识符的命名规则 1、数据库名、表名不得超过30个字符,变量名限制为29个 2、必须只能包含A-Z、a-z、0-9,、_共63个字符 3、数据库名、表名、字段名等对象名中间不…...
图像分类简单介绍
文章目录 图像分类简单介绍什么是图像分类图像分类的背景和意义传统的图像分类方法基于深度学习的图像分类方法总结 图像分类简单介绍 图像分类是计算机视觉领域的一个基本任务,其目标是将输入的图像分配给某个预定义的类别(即标签)。在本教…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
