SUNTANS模型学习(9)——学习Tidal forcing算例

news2024/11/18 15:29:13

学习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 文件。

  1. 函数GetDZ:对本算例,此函数不重要,略作介绍
    该函数用于确定垂向网格。对于本算例,rstretch=1,所以垂向网格通过水面、最深点和垂向最大网格数推算得出。
  2. 函数ReturnDepth:对本算例,此函数并没有被调用,因为仅当IntDepth=0时此函数才被调用;此处不讲解
  3. 函数ReturnFreeSurface(重要):用于给定水位的初始条件。
    对于本算例,初始水位为0;故设置如下:
    REAL ReturnFreeSurface(REAL x, REAL y, REAL d) {
    	return 0.0;
    }
    
  4. 函数ReturnSalinity和ReturnTemperature:用于确定初始时刻的盐度/温度场(不重要)
    由于state.c中的设置:
    REAL StateEquation(const propT *prop, const REAL s, const REAL T, const REAL p) {
    	return prop->beta*s;
    }
    
    水体密度仅和水体盐度相关。而系数beta=0(suntans.dat中设定),故可认为本例中盐度和温度设置对流动过程没有影响。
  5. 函数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)。
在这里插入图片描述

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

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

相关文章

数据脱敏的几种方案

文章目录 什么是数据脱敏&#xff1f;数据脱敏在生活中的应用静态脱敏与动态脱敏数据脱敏的几种方案sql数据脱敏java代码实现脱敏mybatis-mate实现脱敏springCloud网关拦截响应体实现脱敏openGauss 动态数据脱敏解决方案 什么是数据脱敏&#xff1f; 数据脱敏也叫数据的去隐私…

5款办公必备的好软件,你值得拥有

随着网络信息技术的发展&#xff0c;越来越多的人在办公时需要用到电脑了。如果你想提高办公效率&#xff0c;那么就少不了工具的帮忙&#xff0c;今天给大家分享5款办公必备的好软件。 1.文件管理工具——TagSpaces TagSpaces 是一款开源的文件管理工具,它可以通过标签来组织…

测试20K要什么水平?25岁测试工程师成功斩下offer(附面试题)

年少不懂面试经&#xff0c;读懂已是测试人。 大家好&#xff0c;我是一名历经沧桑&#xff0c;看透互联网行业百态的测试从业者&#xff0c;经过数年的勤学苦练&#xff0c;精钻深研究&#xff0c;终于从初出茅庐的职场新手成长为现在的测试老鸟&#xff0c;早已看透了面试官…

@Test单测方法和main方法的区别

区别1:常量池的符号引用 有所不同 今天在下面链接中 学习并测试 string在不同创建方式下 产生几个对象的问题 流程图详解 new String(“abc“) 创建了几个字符串对象_"new string(\"abc\")创建了几个对象"_程序员囧辉的博客-CSDN博客 看下面例子(取自上…

家居家具行业外贸软件解决方案

家具行业&#xff0c;属于装饰行业范畴&#xff0c;如果出售是零售行业&#xff0c;如果生产属于加工行业&#xff0c;如果是带加工&#xff0c;也可以叫二次加工行业。家居行业&#xff0c;泛指家具、床上用品、厨卫用具、室内配饰及日常生活需要的商品&#xff0c;属于消费产…

Ubuntu 桌面版无网络标识

Ubuntu 配置网络的方式有两种&#xff1a; 通过桌面网络标识直接配置通过编辑配置文件配置&#xff08;很麻烦&#xff0c;而且不方便&#xff09; 因此&#xff0c;下面介绍如何恢复桌面的网络标识&#xff0c;以便于后续的网络配置。 目录 1、修改配置文件 2、删除原本的…

【腾讯云 FinOps Crane 集训营】Crane平台介绍与实践

&#x1f341; 作者&#xff1a;知识浅谈&#xff0c;CSDN博客专家&#xff0c;阿里云签约博主&#xff0c;InfoQ签约博主&#xff0c;华为云云享专家&#xff0c;51CTO明日之星 &#x1f4cc; 擅长领域&#xff1a;全栈工程师、爬虫、ACM算法 &#x1f91e;Crane平台介绍与实践…

腾讯云轻量4核8G12M服务器带宽CPU流量系统盘测评

腾讯云轻量应用服务器4核8G12M带宽&#xff0c;12M公网带宽&#xff0c;下载速度峰值为1536KB/s&#xff0c;即1.5M/秒&#xff0c;2000GB月流量&#xff0c;折合每天66GB流量&#xff0c;系统盘为180GB SSD盘&#xff0c;腾讯云百科来详细说下轻量4核8G12M配置服务器CPU计算性…

【SpringCloud】Eurake注册中心与Ribbon负载均衡原理

目录 一、服务提供者与服务消费者 二、远程调用存在的问题 三、Eureka原理 四、Eureka架构 五、搭建Eureka服务 六、Eureka服务注册 七、Eureka服务发现 八、Ribbon负载均衡流程 九、Ribbon负载均衡源码 十、Ribbon负载均衡策略 十一、Ribbon饥饿加载 一、服务提供者…

【Linux】进程间通信 —— 管道

文章目录 &#x1f4d5; 进程间通信介绍&#x1f4d5; 匿名管道原理使用读写规则特点 &#x1f4d5; 命名管道原理使用匿名管道和命名管道的区别 &#x1f4d5; 进程间通信介绍 进程间通信&#xff0c;顾名思义&#xff0c;就是两个进程之间的 “交流” &#xff0c;我们知道&…

Alibaba开发十年,写出这本“MQ技术手册”,看完我愣住了

前言 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能&#xff0c;成为异步RPC的主要手段之一。虽然说&#xff0c;目前状况是Kafka更为火热&#xff0c;但更为广泛的应该还属老牌的RabbtiMQ和Alibaba自主…

Android WebRtc+SRS/ZLM视频通话(2):安装SRS

Android WebRtcSRS/ZLM视频通话&#xff08;2&#xff09;&#xff1a;安装SRS 来自奔三人员的焦虑日志 接着上一章内容&#xff0c;继续来安装开源流媒体系统&#xff08;SRS&#xff09;&#xff0c;可以按官方教程或者直接问ChatGPT安装教程&#xff0c;又或者百度一下照着大…

别开玩笑了!特种兵式旅游,胆小勿进!

【大学生特种兵旅游】是什么梗&#xff1f; 最近在多御浏览器上看新闻的时候看到一个热梗【大学生特种兵旅游】这又是什么梗&#xff01;&#xff01;&#xff01;老阿姨震惊了&#xff01; 我随即搜索了一下&#xff0c;看到了下面这段介绍&#xff1a; 近日&#xff0c;“特种…

【SpringBoot集成Nacos+Dubbo】企业级项目集成微服务组件,实现RPC远程调用

文章目录 一、需求环境/版本 二、须知2.1、什么是RPC&#xff1f;2.2、什么是Dubbo&#xff1f;2.3、什么是Nacos&#xff1f; 三、普通的SpringBoot项目集成微服务组件方案&#xff08;笔者给出两种&#xff09;方案一&#xff08;推荐&#xff09;1、导入maven依赖&#xff0…

rocketmq4.9.4 docker安装

rocketmq4.9.4 给对应的路径赋权 chmod -R 777 文件名 不然启动可能报错后者看不到容器日志 systemctl status firewalld 查看防火墙状态 https://www.jianshu.com/p/0c1c3c679ef8 Docker部署RocketMQ&#xff08;4.9.4&#xff09;官方镜像和控制台windows、mac、linux全平…

20230508在Ubuntu22.04下使用python3批量转换DOCX文档为TXT

20230508在Ubuntu22.04下使用python3批量转换DOCX文档为TXT 2023/5/8 16:27 在WIN10下请参考本文&#xff0c;在Ubuntu22.04下需要不通的插件&#xff01; https://blog.csdn.net/weixin_46255747/article/details/129961988 python实现批量docx转txt docx文档放到input目录中。…

Origin如何绘制二维图形?

文章目录 0.引言1.函数绘图2.线图3.符号图4.点线符号图5.柱状/条形/饼图6.多面板/多轴图7.面积图8.专业图9.主题绘图 0.引言 因科研等多场景需要绘制专业的图表&#xff0c;笔者对Origin进行了学习&#xff0c;本文通过《Origin 2022科学绘图与数据》及其配套素材结合网上相关资…

stable diffusion模型讲解

AI模型最新展现出的图像生成能力远远超出人们的预期&#xff0c;直接根据文字描述就能创造出具有惊人视觉效果的图像&#xff0c;其背后的运行机制显得十分神秘与神奇&#xff0c;但确实影响了人类创造艺术的方式。 AI模型最新展现出的图像生成能力远远超出人们的预期&#xf…

PyCharm使用 Anaconda安装TensorFlow

1.安装python全家桶Anaconda 1.1 官网 https://www.anaconda.com/ 进入官网后如下图所示&#xff0c;点击Download即可开始下载&#xff08;若无法下载&#xff0c;请转至清华源下载&#xff09; 1.2 清华 https://repo.anaconda.com/archive/ 2.Anaconda安装 点击Next -…