fluidity详解

fluidity详解

1.fluidity编译过程

1.1.femtools库调用方法

  1. 编译fluidity/femtools目录下所有文件,打包为libfemtools.a静态库文件;
  2. 通过-lfemtools参数,并指定libfemtools.a静态库位置,即可调用 femtools 库内所有函数

2.fluidity主函数位置

fluidity可执行文件有4个,分别为:

  1. fluidity
  2. Burgers_Equation
  3. Hybridized_Helmholtz_Solver
  4. Shallow_Water

其中,Burgers_Equation、Hybridized_Helmholtz_Solver、Shallow_Water主程序源文件都在文件夹./main内,分别为./main/Burgers_Equation.F90./main/Hybridized_Helmholtz_Solver.F90./main/Shallow_Water.F90

fluidity可执行文件源程序为最外层文件./main.cpp,main()函数则通过调用mainfl()函数来进行计算:

 // Start fortran mainif(fl_command_line_options.count("simulation_name")){mainfl();    }else{usage(argv[0]);exit(-1);}

mainfl()源程序位置为./main/mainfl.F90,主要调用fluids()函数:

     !######################################################!      Normal Fluidity Model!######################################################call tic(TICTOC_ID_SIMULATION)ewrite(1, *) "Calling fluids from mainfl"call fluids()ewrite(1, *) "Exited fluids"call toc(TICTOC_ID_SIMULATION)call tictoc_report(2, TICTOC_ID_SIMULATION)

fluids()函数源程序位置为./main/Fluids.F90

编译fluidity可执行文件函数调用顺序为main.cpp =>./main/mainfl.F90 =>./main/Fluids.F90

3.fluidity数据结构

fluidity数据结构层次:

下层数据(quadrature_type、element_type、mesh_type)构成上层数据(element_type、mesh_type、scalar_field、vector_field、tensor_field)类型基本元素,最上层为fluidity使用的标量、矢量、矩阵等数据类型。
下面逐个介绍基本数据类型:

3.1.quadrature_type

  type quadrature_type!!< A data type which describes quadrature information. For most!!< developers, quadrature can be treated as an opaque data type which!!< will only be encountered when creating element_type variables to!!< represent shape functions.  integer :: dim !! Dimension of the elements for which quadrature!!< is required.  integer :: degree !! Degree of accuracy of quadrature. integer :: vertices !! Number of vertices of the element.integer :: ngi !! Number of quadrature points.real, pointer :: weight(:)=>null() !! Quadrature weights.real, pointer :: l(:,:)=>null() !! Locations of quadrature points.character(len=0) :: name !! Fake name for reference counting.!! Reference count to prevent memory leaks.type(refcount_type), pointer :: refcount=>null()integer :: familyend type quadrature_type

quadrature_type包含了基本单元信息,包括

  1. dim 维度
  2. degree 多项式阶数
  3. vertices 节点个数
  4. ngi 正交节点个数
  5. weight(:) 权重
  6. l(:,:) 正交节点位置
  7. name
  8. refcount
  9. family

这些信息都是构成基本单元层面的。

    !!< Given information about a quadrature, return a quad type encoding!!< that quadrature.function make_quadrature(vertices, dim, degree, ngi, family, stat) result (quad)integer :: lfamilyinteger :: wandzura_rule_idx, wandzura_rule_degree, max_wandzura_rule, wandzura_orderreal, dimension(2, 3) :: wandzura_ref_trireal, dimension(3, 3) :: wandzura_ref_mapreal, dimension(:, :), allocatable :: tmp_coordinatesinteger :: giinteger :: gm_rule, gm_order, vertexreal, dimension(:, :), allocatable :: gm_ref_simplexreal, dimension(:, :), allocatable :: gm_ref_mapif (present(family)) thenlfamily = familyelselfamily = FAMILY_COOLSend iffamily_if: if (lfamily == FAMILY_COOLS) then

下面根据lfamily取值对quad进行赋值,lfamily三个值分别为

  1. FAMILY_COOLS = 0
  2. FAMILY_WANDZURA = 1
  3. FAMILY_GM = 2
family_if: else if (lfamily == FAMILY_WANDZURA) then! Make sure we're on triangles.if (dim /= 2 .or. vertices /= 3) thenwrite (quadrature_error_message, '(a,i0,a)') ...end if! OK. First let's figure out which rule we want to use.if (.not. present(degree)) thenwrite (quadrature_error_message, '(a,i0,a)') ...end ifcall wandzura_rule_num(max_wandzura_rule)do wandzura_rule_idx=1,max_wandzura_rulecall wandzura_degree(wandzura_rule_idx, wandzura_rule_degree)  !! degree=idx*5if (wandzura_rule_degree >= degree) exit !! 当Wandzura精度超过指定精度后跳出循环end doif (wandzura_rule_degree < degree) then !! 循环结束后Wandzura最大精度为30,指定精度不能超过30write error message ..end ifcall wandzura_order_num(wandzura_rule_idx, wandzura_order)!! 获得 wandzura_order(三角形单元中节点总个数) = ngicall allocate(quad, vertices, wandzura_order, coords=3)allocate(tmp_coordinates(2, wandzura_order))quad%degree = wandzura_rule_degreequad%dim = 2call wandzura_rule(wandzura_rule_idx, wandzura_order, tmp_coordinates, quad%weight)!! 获得 wandzura 节点坐标 tmp_coordinates;积分权重 quad%weightwandzura_ref_tri(:, 1) = (/0, 0/)wandzura_ref_tri(:, 2) = (/1, 0/)wandzura_ref_tri(:, 3) = (/0, 1/)call local_coords_matrix_positions(wandzura_ref_tri, wandzura_ref_map)do gi=1,wandzura_orderquad%l(gi, 1:2) = tmp_coordinates(:, gi); quad%l(gi, 3) = 1.0quad%l(gi, :) = matmul(wandzura_ref_map, quad%l(gi, :))end do

在这之中有个重要的子函数调用,call allocate(quad, vertices, wandzura_order, coords=3),目的就是为结构体quad申请内存空间。下面检查下子函数allocate的内容,

    interface allocatemodule procedure allocate_quadend interface......subroutine allocate_quad(quad, vertices, ngi, coords, stat)allocate(quad%weight(ngi), quad%l(ngi,coords), stat=lstat)quad%vertices=verticesquad%ngi=nginullify(quad%refcount)call addref(quad)end subroutine allocate_quad

剩下最后一种定义quad方式:FAMILY_GM

    family_if:elseif (lfamily == FAMILY_GM) then......family_if:else......family_if:end if......quad%family = lfamilyend function make_quadrature`

3.2.element_type

  type element_type!!< Type to encode shape and quadrature information for an element.integer :: dim !! 2d or 3d?integer :: loc !! Number of nodes.integer :: ngi !! Number of gauss points.integer :: degree !! Polynomial degree of element.!! Shape functions: n is for the primitive function, dn is for partial derivatives, dn_s is for partial derivatives on surfaces. !! n is loc x ngi, dn is loc x ngi x dim!! dn_s is loc x ngi x face x dim real, pointer :: n(:,:)=>null(), dn(:,:,:)=>null()real, pointer :: n_s(:,:,:)=>null(), dn_s(:,:,:,:)=>null()!! Polynomials defining shape functions and their derivatives.type(polynomial), dimension(:,:), pointer :: spoly=>null(), dspoly=>null()!! Link back to the node numbering used for this element.type(ele_numbering_type), pointer :: numbering=>null()!! Link back to the quadrature used for this element.type(quadrature_type) :: quadraturetype(quadrature_type), pointer :: surface_quadrature=>null()!! Pointer to the superconvergence data for this element.type(superconvergence_type), pointer :: superconvergence=>null()!! Pointer to constraints data for this elementtype(constraints_type), pointer :: constraints=>null()!! Reference count to prevent memory leaks.type(refcount_type), pointer :: refcount=>null()!! Dummy name to satisfy reference countingcharacter(len=0) :: nameend type element_type

相较而言element_type就复杂了一点,

自定义类型:ele_numbering_type,与 polynomial

  type ele_numbering_type! Type to record element numbering details.! Differentiate tets from other elements.integer :: faces, vertices, edges, boundariesinteger :: degree ! Degree of polynomials.integer :: dimension ! 2D or 3Dinteger :: nodesinteger :: type=ELEMENT_LAGRANGIANinteger :: family! Map local count coordinates to local number.integer, dimension(:,:,:), pointer :: count2number! Map local number to local count coordinates.integer, dimension(:,:), pointer :: number2count! Count coordinate which is held constant for each element boundary.integer, dimension(:), pointer :: boundary_coord! Value of that count coordinate on the element boundary.integer, dimension(:), pointer :: boundary_valend type ele_numbering_type
    type polynomialreal, dimension(:), pointer :: coefs=>null()integer :: degree=-1end type polynomial

3.3.mesh_type

  type mesh_type!!< Mesh information for (among other things) fields.integer, dimension(:), pointer :: ndglno!! Flag for whether ndglno is allocatedlogical :: wrapped=.true.type(element_type) :: shapeinteger :: elementsinteger :: nodescharacter(len=FIELD_NAME_LEN) :: name!! path to options in the options tree
#ifdef DDEBUGcharacter(len=OPTION_PATH_LEN) :: option_path="/uninitialised_path/"
#elsecharacter(len=OPTION_PATH_LEN) :: option_path
#endif!! Degree of continuity of the field. 0 is for the conventional C0!! discretisation. -1 for DG.integer :: continuity=0!! Reference count for meshtype(refcount_type), pointer :: refcount=>null()!! Mesh face information for those meshes (eg discontinuous) which need it.type(mesh_faces), pointer :: faces=>null()!! Information on subdomain_ mesh, for partially prognostic solves:type(mesh_subdomain_mesh), pointer :: subdomain_mesh=>null()type(adjacency_cache), pointer :: adj_lists => null()!! array that for each node tells which column it is in!! (column numbers usually correspond to a node number in a surface mesh)integer, dimension(:), pointer :: columns => null()!! if this mesh is extruded this array says which horizontal mesh element each element is belowinteger, dimension(:), pointer :: element_columns => null()!! A list of ids marking different parts of the mesh!! so that initial conditions can be associated with it.integer, dimension(:), pointer :: region_ids=>null()!! Halo information for parallel simulations.type(halo_type), dimension(:), pointer :: halos=>null()type(halo_type), dimension(:), pointer :: element_halos=>null()type(integer_set_vector), dimension(:), pointer :: colourings=>null()!! A logical indicating if this mesh is periodic or not!! (does not tell you how periodic it is... i.e. true if!! any surface is periodic)logical :: periodic=.false.end type mesh_type

3.4.一维例子

test_1d.F90

    function read_triangle_simple(filename, quad_degree, quad_ngi, no_faces, quad_family, mdim) result (field)

转载于:https://www.cnblogs.com/li12242/p/4177175.html

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

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

相关文章

mysql读书笔记---if语句

IF(expr1,expr2,expr3) 如果expr1是TRUE(expr1<>0 and expr1<>NULL)&#xff0c;则IF()的返回值为expr2;否则返回值则为expr3。IF()的返回值为数字值或字符串值&#xff0c;具体情况视其所在语境而定。 mysql>SELECT?IF(1>2,2,3); ->3 mysql>SELECT I…

C语言 将整数写入内存指定的连续字节单元中

将整数数组写入0x40003000开始的连续10个字节内存单元中&#xff0c;注意unsigned char *指向一个字节&#xff0c;而int *指向1个字&#xff08;4个字&#xff09;&#xff0c;但是可以把字中存储的整数放入字节单元中&#xff0c;只要不超过表示的范围&#xff0c;注意虽然un…

mysql读书笔记----时间函数

1.获得当前时间&#xff1a;时间格式yyyy-MM-dd curdate();2.DAYOFWEEK(date) 3.WEEKDAY(date) 4.DAYOFMONTH(date) 5.DAYOFYEAR(date) 6.MONTH(date) 7.DAYNAME(date) 8.MONTHNAME(date) 9.QUARTER(date) 10.WEEK(date) WEEK(date,first) 11.YEAR(date) 12.HOUR(time) 13.MINU…

企业数据1

1. 企业数据 1.1. 全局 1.1.1. 货币 CNY Chinese Yuan Renminbi &#xffe5; 6.825020 ARS Argentine Peso $ 3.791090 BOB Bolivian Boliviano $b 7.570800 BRL Brazilian Real R$ 1.766500 CAD Canadian Dollar $ 1.037570 CLP Chilean Peso $ …

sql判断语句

方法一&#xff1a; <if test"null ! orderType and 0 orderType"> order by amountTimes desc </if><if test"null ! orderType and 1 orderType">order by amountTimes asc </if><if test"null ! orderType and 2 …

Thinkphp 整合tcpdf

网上查了些关于tcpdf 使用教程&#xff0c;整合到TP的话&#xff0c;会有些小问题&#xff0c;由于基础还不是很扎实&#xff0c;花了点时间终于整合OK了。下面介绍步骤&#xff1a; 环境&#xff1a; TP版本&#xff1a;TP3.2.2 tcpdf:tcpdf_6_2_3 1. 将tcpdf_6_2_3.zip解压在…

多项目开发下的dll文件管理

阅读目录&#xff1a;DS01&#xff1a;为什么要对生成的dll文件进行管理&#xff1f;DS02&#xff1a;首先介绍以下两个DOS命令DS03&#xff1a;第一种实现方法&#xff08;xcopy&#xff09;DS04&#xff1a;第二种实现方法&#xff08;attrib&#xff09;DS05&#xff1a;分享…

关于Java中的随机数产生

对比两种写法&#xff1a; 第一种&#xff1a; public static void main(String args[]){Random random new Random(System.currentTimeMillis());for(int i0; i<20; i){int sindex random.nextInt(2);System.out.println(sindex);}}第二种&#xff1a; public static voi…

视图

视图是虚表&#xff0c;是从一个或几个基本表&#xff08;或视图&#xff09;中导出的表&#xff0c;在系统的数据字典中仅存放了视图的定义&#xff0c;不存放视图对应的数据。视图是原始数据库数据的一种变换&#xff0c;是查看表中数据的另外一种方式。可以将视图看成是一个…

选择器的并发性

4.3.4 并发性 选择器对象是线程安全的&#xff0c;但它们包含的键集合不是。通过keys( )和selectKeys( )返回的键的集合是Selector对象内部的私有的Set对象集合的直接引用。这些集合可能在任意时间被改变。已注册的键的集合是只读的。如果您试图修改它&#xff0c;那么您得到的…

mysql 自定义函数之判断

DELIMITER $$CREATE DEFINERrootlocalhost FUNCTION getMin(a int,b int) RETURNS int(11)BEGINdeclare min int;if(a>b)then set min b;elseif(b>a)then set min a;else set min 0;#end if;end if;RETURN min;END 调用该函数可以如下方式 select getMin(1,2); 返回值…

C/C++的数组名

数组名相当于指向数组第一个元素的地址。数组名不是变量&#xff0c;是地址常量&#xff0c;不能为其赋值。如下&#xff1a;1&#xff09;一维数组中对于数组 a[5] {1, 2, 3, 4, 5};数组名a相当于指向第一个元素a[0]的指针。即 a 与 &a[0] 等价。2&#xff09;二维数组中…

mysql的运算法

一、算术运算符1、加 www.2cto.com mysql> select 12;-----| 12 |-----| 3 |-----2、减mysql> select 1-2;-----| 1-2 |-----| -1 |-----3、乘mysql> select 2*3;-----| 2*3 |-----| 6 |-----4、除mysql> select 2/3;--------| 2/3 |--------| 0.6667 |-…

转-- iOS 30多个iOS常用动画,带详细注释

// // CoreAnimationEffect.h // CoreAnimationEffect // // Created by VincentXue on 13-1-19. // Copyright (c) 2013年 VincentXue. All rights reserved. //#import <Foundation/Foundation.h>/**! 导入QuartzCore.framework** Example:** Step.1** #imp…

Java中abstract与interface

抽象类&#xff08;abstract class&#xff09;的特点&#xff1a; 1.抽象类、抽象方法都必须使用abstract修饰。 2.抽象类中&#xff0c;可以有非抽象方法&#xff0c;甚至可以是没有任何方法或变量的空类。 对于抽象类中不定义抽象方法的用意在于&#xff1a;使该类不能被创建…

按位与、或、异或等运算方法

按位与运算符&#xff08;&&#xff09; 参加运算的两个数据&#xff0c;按二进制位进行“与”运算。 运算规则&#xff1a;0&00; 0&10; 1&00; 1&11; 即&#xff1a;两位同时为“1”&#xff0c;结果才为“1”&#xff0c;否则为0 例如&#xff1…

JavaScript验证

<script type"text/javascript"> /*密码*/ function password() { var password document.getElementById("password").value; var ts document.getElementById("tsPassword"); if (password.length >…

mysql数据库根据上传的经纬度计算距离

select 6371.393*ACOS(COS(RADIANS(latitude))*COS(RADIANS(47.02))*COS(RADIANS(longitude)-RADIANS(114.100))SIN(RADIANS(latitude))*SIN(RADIANS(47.02))) as distancefrom location

emacs配置

; 指针颜色设置为白色(set-cursor-color "white");; 鼠标颜色设置为白色(set-mouse-color "white") ;; 从color-theme中获取;; 网上下载color-theme.el&#xff0c;放到加载路径(&#xff0f;usr/share/emacs/site-lisp )下;; M-x color-theme-select,鼠标…

自然连接(NATURAL JOIN)

自然连接&#xff08;NATURAL JOIN&#xff09;是一种特殊的等价连接&#xff0c;它将表中具有相同名称的列自动进行记录匹配。自然连接不必指定任何同等连接条件。图9.9给出了典型的自然连接示意图。 图9.9 自然连接 自然连接自动判断相同名称的列&#xff0c;而后形成匹配。…