跳转到主要内容

未提供项目描述

项目描述

DOI ogs6py_test codecov DOI

ogs6py

ogs6py 是 OpenGeoSys 有限元软件的 python-API。其主要功能包括创建和修改 OGS6 输入文件以及执行 OGS。该包允许使用 python 或 Julia 在 jupyter 或 pluto 笔记本中完全简化 OGS 工作流程,如下面视频所示

video presentation of ogs6py and vtu interface

要修改和执行 OGS 输入,例如,遍历参数范围,存在两种方法

1. creating a new input file using python method calls
2. altering existing input files

0. 安装

ogs6py 可以轻松地从 PyPI 安装

# pip install [--user] ogs6py

或从 github 上的最新版本

# pip install [--user] https://github.com/joergbuchwald/ogs6py/archive/refs/heads/master.zip

注意:ogs6py 的日志文件解析器至少需要 Python 3.8。

可以通过以下方式运行单元测试

# python tests/test_ogs6py.py

注意:方法命名风格已更改(2021-05-20)

1. ogs6py 文档

您可以在以下位置找到文档:https://joergbuchwald.github.io/ogs6py-doc

2. 创建新的输入文件

以下示例包含一个简单的力学问题。源文件可以在示例目录中找到。方法调用名称基于相应的XML标签。

from ogs6py import ogs

model = ogs.OGS(PROJECT_FILE="simple_mechanics.prj")
model.geo.add_geom(filename="square_1x1.gml")
model.mesh.add_mesh(filename="square_1x1_quad_1e2.vtu")
model.processes.set_process(name="SD",
                           type="SMALL_DEFORMATION",
                           integration_order="2",
                           solid_density="rho_sr",
                           specific_body_force="0 0")
model.processes.set_constitutive_relation(type="LinearElasticIsotropic",
                                        youngs_modulus="E",
                                        poissons_ratio="nu")
model.processes.add_process_variable(process_variable="process_variable",
                                   process_variable_name="displacement")
model.processes.add_process_variable(secondary_variable="sigma",
                                   output_name="sigma")
model.timeloop.add_process(process="SD",
                          nonlinear_solver_name="basic_newton",
                          convergence_type="DeltaX",
                          norm_type="NORM2",
                          abstol="1e-15",
                          time_discretization="BackwardEuler")
model.timeloop.set_stepping(process="SD", type="FixedTimeStepping",
                           t_initial="0",
                           t_end="1",
                           repeat="4",
                           delta_t="0.25")
model.timeloop.add_output(type="VTK",
                         prefix="blubb",
                         repeat="1",
                         each_steps="10",
                         variables=["displacement", "sigma"])
model.parameters.add_parameter(name="E", type="Constant", value="1")
model.parameters.add_parameter(name="nu", type="Constant", value="0.3")
model.parameters.add_parameter(name="rho_sr", type="Constant", value="1")
model.parameters.add_parameter(name="displacement0",
                              type="Constant",
                              values="0 0")
model.parameters.add_parameter(name="dirichlet0", type="Constant", value="0")
model.parameters.add_parameter(name="dirichlet1", type="Constant", value="0.05")
model.processvars.set_ic(process_variable_name="displacement",
                        components="2",
                        order="1",
                        initial_condition="displacement0")
model.processvars.add_bc(process_variable_name="displacement",
                        geometrical_set="square_1x1_geometry",
                        geometry="left",
                        type="Dirichlet",
                        component="0",
                        parameter="dirichlet0")
model.processvars.add_bc(process_variable_name="displacement",
                        geometrical_set="square_1x1_geometry",
                        geometry="bottom",
                        type="Dirichlet",
                        component="1",
                        parameter="dirichlet0")
model.processvars.add_bc(process_variable_name="displacement",
                        geometrical_set="square_1x1_geometry",
                        geometry="top",
                        type="Dirichlet",
                        component="1",
                        parameter="dirichlet1")
model.nonlinsolvers.add_non_lin_solver(name="basic_newton",
                                    type="Newton",
                                    max_iter="4",
                                    linear_solver="general_linear_solver")
model.linsolvers.add_lin_solver(name="general_linear_solver",
                              kind="lis",
                              solver_type="cg",
                              precon_type="jacobi",
                              max_iteration_step="10000",
                              error_tolerance="1e-16")
model.linsolvers.add_lin_solver(name="general_linear_solver",
                              kind="eigen",
                              solver_type="CG",
                              precon_type="DIAGONAL",
                              max_iteration_step="10000",
                              error_tolerance="1e-16")
model.linsolvers.add_lin_solver(name="general_linear_solver",
                              kind="petsc",
                              prefix="sd",
                              solver_type="cg",
                              precon_type="bjacobi",
                              max_iteration_step="10000",
                              error_tolerance="1e-16")
model.write_input()
model.run_model(logfile="out.log")
model.runModel(path="~/github/ogs/build_mkl/bin")

可以在example_THM.py中找到一个使用MPL的示例。

3. 或者,可以使用现有的替换方法来修改现有文件

例如,要遍历三个杨氏模量,可以使用替换参数方法

Es = [1,2,3]
filename = "simple_mechanics.prj"
for E in Es:
    model = OGS(INPUT_FILE=filename, PROJECT_FILE=filename)
    model.replace_parameter(name="E", value=E)
    model.replace_text("out_E="+str(E), xpath="./time_loop/output/prefix")
    model.write_input()
    model.run_model(path="~/github/ogs/build_mkl/bin")

除了replace_parameter方法外,更通用的replace_text方法也可以用来替换此示例中的杨氏模量

model.replace_text(E, xpath="./parameters/parameter[name='E']/value")

此文件中的杨氏模量也可以通过xpath ./parameters/parameter/value指向的位置的0次出现来访问

model.replace_text(E, xpath="./parameters/parameter/value", occurrence=0)

对于基于MPL的过程,存在特定函数来设置相和介质属性:例如

model.replace_phase_property(mediumid=0, phase="Solid", name="thermal_expansivity", value="42")

对于相属性

model.replace_medium_property(mediumid=0, name="porosity", value="0.24")

对于位于介质级别的属性。

4. 日志解析器

要解析管道到文件的OGS输出,请执行

df = model.parse_out("examples/out_thm.log")

它将返回一个pandas数据框。

5. 示例

有一些示例已经在OGS工作流程中使用,并可能推广到其他用例

  • 通过从数据文件(csv)读取参数,从文件模板生成输入文件(prj),
  • 找到交错方案的优化耦合方案参数。

6. 常见问题/故障排除

  • OGS执行失败且日志文件中没有写入任何内容。请检查是否从终端正确执行了OGS。一个常见问题是交互式Python环境与终端中的环境不同。通常,这可以通过通过包装命令设置所需的环境变量来解决。例如,model.run_model(wrapper="source /opt/intel/oneapi/setvars.sh intel64 &&")

项目详情


下载文件

下载您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。

源分布

此版本没有可用的源分布文件。请参阅生成分布存档的教程。

构建分布

ogs6py-0.402-py2.py3-none-any.whl (42.3 kB 查看散列)

上传时间 Python 2 Python 3

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面