OpenFOAM中梯度场的复用(caching)和生命期管理

文章目录

    • OpenFOAM中梯度场的复用(caching)和生命期管理
      • 一、缓存机制的目标
      • 二、如何实现缓存(以 `fvc::grad` 为例)
        • 1. 使用 `IOobject::AUTO_WRITE` 和注册名
        • 2. 示例:`fvc::grad` 的缓存实现(简化逻辑)
      • 三、生命期管理是如何实现的?
        • 1. `regIOobject` 的作用
        • 2. 缓存对象的依赖关系
        • 3. 手动控制缓存生命周期
      • 四、底层实现机制总结
      • 五、实际使用建议
      • 六、扩展:自定义智能缓存(带依赖监听)
      • 结论
    • OpenFOAM中场和场梯度对象的生命期管理
      • 一、OpenFOAM 中的“场”是什么?
      • 二、场的生命期管理
        • 1. **对象存储在 Time 或对象注册表(objectRegistry)中**
        • 2. **自动内存管理机制**
        • 3. **析构与自动释放**
      • 三、场梯度(如 `fvc::grad(U)`)的生命期管理
        • 1. **临时对象(Temporary Field)**
        • 2. `tmp<T>` 的作用
        • 3. 示例:梯度计算的生命周期
      • 四、底层实现机制
        • 1. `GeometricField` 的内存布局
        • 2. `tmp<T>` 的实现细节
        • 3. 延迟求值与表达式模板(可选优化)
      • 五、总结:生命期管理的关键点
      • 六、最佳实践建议
      • 参考源码路径(OpenFOAM 源码)
      • 结论
    • OpenFOAM中对象注册机制实现
    • 一、objectRegistry 简介
      • 主要功能:
    • 二、类继承结构
    • 三、核心机制详解
      • 1. 注册过程
        • 示例:创建一个场变量
      • 2. 注册与反注册(checkIn / checkOut)
      • 3. 查找对象
    • 四、嵌套注册表结构
    • 五、I/O 机制集成
    • 六、实际代码示例:手动注册一个对象
    • 七、高级特性
      • 1. 监听对象事件(事件驱动)
      • 2. 动态创建对象
      • 3. 引用计数
    • 八、常见问题与调试
    • 九、总结
    • 十、参考源码路径(OpenFOAM-9)

OpenFOAM中梯度场的复用(caching)和生命期管理

在 OpenFOAM 中,对于场(如 surfaceScalarField 类型的 phi)的梯度或其他导出场(如 fvc::grad(phi))进行缓存(caching),并实现其生命期管理,是通过 OpenFOAM 的 “自动缓存机制”对象注册系统(object registry)实现的。这种机制允许在需要时自动计算并缓存导出场,避免重复计算,同时确保缓存对象的生命期与相关场一致。

下面详细解释如何实现对 phi 梯度场的缓存与生命期管理,以及底层实现机制。


一、缓存机制的目标

在 OpenFOAM 中,fvc::grad(phi) 是一个常见的操作,用于计算体积场 phi 的梯度。如果在多个地方调用 fvc::grad(phi),默认情况下每次都会重新计算,造成性能浪费。

缓存机制的目标是:

  • 第一次调用 fvc::grad(phi) 时计算梯度;
  • 将结果缓存到与 phi 关联的 对象注册表objectRegistry)中;
  • 后续调用时直接复用缓存结果;
  • phi 被销毁或更新时,自动清理或更新缓存。

二、如何实现缓存(以 fvc::grad 为例)

OpenFOAM 使用 tmp<GeometricField<Type, ...>>IOobject 的注册机制来实现缓存。

1. 使用 IOobject::AUTO_WRITE 和注册名

缓存的导出场(如 grad(phi))通常被注册为临时场,使用特定命名规则,例如:

word gradName = "grad(" + phi.name() + ")";

然后尝试从 objectRegistry 中查找是否已有该名称的场存在。

2. 示例:fvc::grad 的缓存实现(简化逻辑)
template<class Type>
tmp<GeometricField<Type, fvPatchField, volMesh>>
grad(const GeometricField<Type, fvsPatchField, surfaceMesh>& ssf)
{const word gradName = "grad(" + ssf.name() + ")";// 查看 registry 中是否已有缓存if (isObjectRegistry && ssf.db().foundObject<GeometricField<Type, fvPatchField, volMesh>>(gradName)){// 返回缓存的场(引用计数管理)return ssf.db().lookupObject<GeometricField<Type, fvPatchField, volMesh>>(gradName);}else{// 计算梯度tmp<GeometricField<Type, fvPatchField, volMesh>> tgrad = fvc::calculateGrad(ssf);// 设置 IO 属性以便缓存tgrad.ref().rename(gradName);tgrad.ref().store();  // 将其注册到数据库中,实现缓存return tgrad;}
}

关键点:

  • store() 方法会将 tmp 内部的对象通过 regIOobject::store() 注册到 objectRegistry
  • 下次调用时可通过 foundObjectlookupObject 查找。

三、生命期管理是如何实现的?

OpenFOAM 使用 regIOobject 类作为所有可注册对象的基类,实现自动生命期管理。

1. regIOobject 的作用
  • 继承自 IOobject,支持读写、命名、注册。
  • 提供 store() 方法将对象注册到 objectRegistry
  • 支持 引用计数(reference counting)事件通知(如父对象销毁时自动删除子对象)。
2. 缓存对象的依赖关系

grad(phi) 被缓存时,可以通过设置依赖关系,使得当 phi 被修改或销毁时,grad(phi) 自动失效或被删除。

虽然 OpenFOAM 默认的 fvc::grad 并不总是自动监听 phi 的变化,但可以通过以下方式实现更智能的缓存:

  • 在创建 grad(phi) 时,将其设置为依赖于 phi
  • 利用 eventNo() 或自定义监听机制,在 phi 修改时触发缓存失效。

但标准 OpenFOAM 中,缓存不会自动失效,除非手动清除或程序重启。因此,缓存通常用于“不变场”或在时间步开始前清除。

3. 手动控制缓存生命周期

可以通过以下方式管理:

// 手动清除缓存
if (mesh.foundObject<volVectorField>("grad(phi)"))
{mesh.checkOut("grad(phi)"); // 从 registry 移除,触发析构
}

或者在每个时间步开始前清除梯度缓存:

mesh.clearOut(); // 清除所有临时缓存对象

四、底层实现机制总结

机制说明
objectRegistry所有场和对象的注册中心,支持按名称查找。
IOobject提供对象命名、读写、注册能力。
regIOobject可注册对象基类,支持 store()checkOut()
tmp<T>临时对象包装器,支持延迟求值和自动内存管理。
store()将对象注册到 registry,实现缓存。
引用计数tmp 使用引用计数,避免重复拷贝。
生命周期缓存对象生命期由 registry 管理,直到被 checkOut() 或 registry 析构。

五、实际使用建议

  1. 启用缓存:确保 IOobject 创建时使用 IOobject::NO_READIOobject::NO_WRITE,但通过 store() 注册。
  2. 命名规范:使用如 grad(phi) 的命名避免冲突。
  3. 手动清理:在时间步或迭代中适当调用 clearOut()checkOut() 避免内存泄漏。
  4. 注意一致性:缓存不会自动感知 phi 的变化,需在 phi 更新后手动清除 grad(phi)

六、扩展:自定义智能缓存(带依赖监听)

若需更高级的缓存(如自动失效),可继承 regIOobject 并重写 updated(), upToDate() 方法,或使用 fieldDependence 机制(如 functionObject 中的做法),但这在标准 fvc 中未默认实现。


结论

OpenFOAM 中对 phi 梯度的缓存是通过:

  • grad(phi) 作为命名对象注册到 objectRegistry
  • 使用 tmpstore() 实现复用;
  • 依赖 regIOobject 的注册与析构机制管理生命期。

生命期由 objectRegistry 控制,缓存对象在注册后持续存在,直到被显式移除或 registry 销毁。虽然高效,但需用户注意缓存一致性,必要时手动清理。

⚠️ 注意:OpenFOAM 版本不同(如 v2006、v2212、v2312)在 fvc::grad 是否默认缓存上可能有差异,建议查阅对应版本源码(src/finiteVolume/finiteVolume/divSchemes/gradScheme/gradScheme.C)确认行为。


OpenFOAM中场和场梯度对象的生命期管理

在 OpenFOAM 中,场(Field)场梯度(Gradient of Field) 的生命期管理是通过 C++ 的对象生命周期机制与 OpenFOAM 特有的内存管理策略结合实现的。理解其底层机制需要从 OpenFOAM 的类结构、对象存储方式以及自动内存管理等方面入手。


一、OpenFOAM 中的“场”是什么?

在 OpenFOAM 中,场(Field)是表示在网格点(如体心、面心、节点等)上定义的物理量(如压力 p、速度 U、温度 T 等)的数据结构。主要类型包括:

  • volScalarField:体心标量场(如压力)
  • volVectorField:体心矢量场(如速度)
  • surfaceScalarField:面心标量场(如通量)
  • 等等

这些场本质上是继承自模板类 GeometricField<Type, PatchField, Mesh>,并封装了值、维度、边界条件、时间信息等。


二、场的生命期管理

1. 对象存储在 Time 或对象注册表(objectRegistry)中

OpenFOAM 使用 objectRegistry(通常是 TimefvMesh 的成员)来管理所有场的生命周期。每个场在创建时都会被注册到一个 objectRegistry 中。

例如:

volScalarField p
(IOobject("p",runTime.timeName(),mesh,IOobject::MUST_READ,IOobject::AUTO_WRITE),mesh
);
  • IOobject 是关键:它定义了场的名称、读写策略、是否自动写入等。
  • p 被构造时,它会自动注册到 meshrunTimeobjectRegistry 中。
2. 自动内存管理机制
  • 场对象一旦注册到 objectRegistry,其生命周期由该注册表管理。
  • 在时间步进过程中,如果创建了新的场(如 grad(U)),它们可能不会自动注册,除非显式指定 IOobject
  • 但大多数求解器中,主变量(如 U, p)是持久的,存在于整个模拟过程中。
3. 析构与自动释放
  • objectRegistry 被销毁(如程序结束、时间步切换、网格重构),它会自动调用注册对象的析构函数。
  • C++ 的 RAII(Resource Acquisition Is Initialization)机制确保资源(内存)在对象析构时被释放。
  • 场内部的数据(如 Field<Type>)使用动态数组(List<Type>)存储,其内存由 new/delete 或 STL 容器管理。

三、场梯度(如 fvc::grad(U))的生命期管理

1. 临时对象(Temporary Field)

fvc::grad(U) 返回的是一个临时的 tmp<GeometricField<vector, fvPatchField, volMesh>> 对象

tmp<volVectorField> tgradU = fvc::grad(U);
  • tmp<T> 是 OpenFOAM 提供的智能指针类,用于管理临时对象的生命周期。
  • 它类似于 std::unique_ptrstd::shared_ptr,但更轻量,专为性能优化设计。
2. tmp<T> 的作用
  • tmp<T> 封装了一个指针,可以是“拥有”或“引用”模式。
  • tmp<T> 被赋值或传递时,OpenFOAM 会判断是否需要复制或转移所有权。
  • tmp<T> 超出作用域时,若其拥有对象,则自动删除。
3. 示例:梯度计算的生命周期
solve(fvm::ddt(U) + fvm::div(phi, U) - fvm::laplacian(nu, U) == -fvc::grad(p));
  • fvc::grad(p) 返回 tmp<volVectorField>
  • 该临时场在表达式求值完成后,其 tmp 对象析构,内部场被自动释放。
  • OpenFOAM 的矩阵组装完成后,不再需要梯度场,因此立即释放。

四、底层实现机制

1. GeometricField 的内存布局
  • 数据存储在 Field<Type> 中,本质是 List<Type>,使用动态内存(malloc/new)。
  • 边界字段(BoundaryField)也类似。
  • 内存分配由 List 类管理,析构时自动 delete[]
2. tmp<T> 的实现细节
template<class T>
class tmp
{T* ptr_;           // 指向对象bool isPtr_;       // 是否拥有指针
public:tmp(T* t) : ptr_(t), isPtr_(true) {}tmp(const tmp& t) : ptr_(t.ptr_), isPtr_(t.isPtr_) { t.isPtr_ = false; }~tmp() { if (isPtr_) delete ptr_; }T& operator()() const { return *ptr_; }
};
  • 所有权转移:拷贝构造后原对象不再拥有指针(避免双重释放)。
  • 高效:避免不必要的复制,尤其对大型场对象至关重要。
3. 延迟求值与表达式模板(可选优化)

OpenFOAM 还使用表达式模板(如 fvMatrix 的操作)来延迟计算,避免生成中间场,进一步减少临时对象数量。


五、总结:生命期管理的关键点

机制说明
objectRegistry持久场(如 U, p)注册其中,由时间或网格控制生命周期
IOobject控制读写、自动注册、持久性
tmp<T>管理临时场(如梯度、散度)的自动释放
RAIIC++ 析构函数自动释放内存
Field/List底层动态数组,析构时释放内存

六、最佳实践建议

  • 主变量(求解变量)应定义在 createFields.H 中,注册到 objectRegistry
  • 临时计算尽量使用 tmp 返回类型(OpenFOAM 内部函数已封装)。
  • 避免手动 new/delete,依赖 RAII 和 tmp
  • 若需保存梯度场,应显式创建并注册:
volVectorField gradU
(IOobject("gradU", runTime.timeName(), mesh, IOobject::AUTO_WRITE),fvc::grad(U)
);

参考源码路径(OpenFOAM 源码)

  • src/OpenFOAM/primitives/tmp/tmp.Htmp<T> 定义
  • src/finiteVolume/fields/fvPatchFields/basic/grad/:梯度计算
  • src/OpenFOAM/fields/GeometricFields/GeometricField.H:场类定义
  • src/OpenFOAM/db/objectRegistry/:对象注册机制

结论

OpenFOAM 通过 objectRegistry + IOobject + tmp<T> + RAII 的组合,实现了高效且安全的场与场梯度的生命期管理。持久场由注册表管理,临时场通过 tmp 自动释放,底层依赖 C++ 的构造/析构机制,避免内存泄漏,同时兼顾高性能计算需求。


OpenFOAM中对象注册机制实现

在 OpenFOAM 中,objectRegistry 是一个非常核心的类,它实现了对象的注册与管理机制,是 OpenFOAM 运行时系统(Runtime System)的基础之一。理解 objectRegistry 的工作机制对于深入掌握 OpenFOAM 架构至关重要。


一、objectRegistry 简介

objectRegistry 是 OpenFOAM 中用于管理所有可命名对象(如 volScalarField, volVectorField, IOdictionary, fvMesh 等)的容器。它本质上是一个命名对象的注册表(registry),支持按名称查找、存储、创建和销毁对象。

主要功能:

  • 存储和管理运行时创建的对象(如场、字典、边界条件等)。
  • 支持对象的自动命名与查找。
  • 支持对象的生命周期管理(通过引用计数)。
  • 提供 I/O 功能(与 IOobject 配合)。
  • 支持嵌套注册表结构(如 Time 包含 fvMeshfvMesh 又包含 volField)。

二、类继承结构

class objectRegistry: public regIOobject, public HashTable<regIOobject*, word, string::hash>
  • 继承自 regIOobject:表示它本身也是一个可注册的 I/O 对象(可以被其他 registry 管理)。
  • 继承自 HashTable<regIOobject*, word, string::hash>:使用哈希表存储对象指针,键为对象名称(word 类型)。

三、核心机制详解

1. 注册过程

当一个对象(如 volScalarField)被创建时,它通常会继承自 regIOobject,并在构造函数中自动注册到某个 objectRegistry(如 meshtime)中。

示例:创建一个场变量
volScalarField p
(IOobject("p",                    // 名称runTime.timeName(),     // 时间目录mesh,                   // objectRegistry(通常是 mesh)IOobject::MUST_READ,    // 读取方式IOobject::AUTO_WRITE    // 写入方式),mesh                      // 构造所需网格
);

在这个构造过程中:

  1. IOobject 构造时会检查 objectRegistry(这里是 mesh)中是否已有名为 "p" 的对象。
  2. volScalarField 构造完成后,会调用 regIOobject::checkIn(),将自己注册到 meshobjectRegistry 中。
  3. 注册本质是将 (name, pointer) 插入哈希表。

2. 注册与反注册(checkIn / checkOut)

  • checkIn():将对象注册到其指定的 objectRegistry
  • checkOut():从注册表中移除对象(通常在析构时自动调用)。
bool regIOobject::checkIn()
{return ownedByRegistry_ ? false : registry_->insert(name(), this);
}

注意:ownedByRegistry_ 表示是否已注册,防止重复注册。

3. 查找对象

const volScalarField& p = mesh.lookupObject<volScalarField>("p");

lookupObjectobjectRegistry 提供的模板方法,通过名称查找对象。

内部实现:

template<class Type>
const Type& objectRegistry::lookupObject(const word& name) const
{const regIOobject* obj = this->find(name);if (!obj){FatalErrorInFunction<< "Cannot find object " << name << " in registry " << this->name();}return dynamic_cast<const Type&>(*obj);
}

四、嵌套注册表结构

OpenFOAM 使用树状结构组织 objectRegistry

Time (rootRegistry)
└── fvMesh├── volScalarField "p"├── volVectorField "U"└── surfaceScalarField "phi"
  • Time 是顶级注册表,管理所有时间步相关的对象。
  • fvMeshTime 的子注册表,管理所有与网格相关的对象。
  • 每个场变量注册到 fvMesh 中。

这种结构支持模块化和作用域管理。


五、I/O 机制集成

objectRegistryIOobject 配合实现自动读写:

  • 当调用 runTime.write() 时,objectRegistry 会遍历所有对象,调用其 write() 方法。
  • 每个 regIOobject 可设置 WRITE_ALWAYSAUTO_WRITE 等写入策略。
// 写入所有可写对象
mesh.objectRegistry::write();

六、实际代码示例:手动注册一个对象

#include "objectRegistry.H"
#include "IOdictionary.H"// 假设 mesh 已经创建
IOdictionary transportProperties
(IOobject("transportProperties",mesh.time().constant(),   // constant 目录mesh,                     // registryIOobject::MUST_READ,IOobject::NO_WRITE)
);// 此时 transportProperties 已自动注册到 mesh 中// 查找并使用
const dictionary& muDict = mesh.lookupObject<IOdictionary>("transportProperties");
dimensionedScalar mu("mu", dimViscosity, muDict);

七、高级特性

1. 监听对象事件(事件驱动)

objectRegistry 支持监听对象的注册/注销事件,用于实现插件机制或后处理触发。

2. 动态创建对象

可通过 objectRegistry::store() 存储临时对象:

mesh.store(new volScalarField(...));  // 自动注册并管理内存

store() 会调用 checkIn() 并将所有权交给 registry。

3. 引用计数

regIOobject 使用引用计数管理内存,避免悬空指针。


八、常见问题与调试

  • 重复注册:确保对象未被多次 checkIn
  • 找不到对象:检查 IOobjectregistry 是否正确设置。
  • 内存泄漏:使用 store() 而非裸 new,确保自动管理。

九、总结

特性说明
核心作用管理 OpenFOAM 中所有命名对象
数据结构哈希表(名称 → 对象指针)
生命周期通过 checkIn/checkOut 管理
I/O 支持IOobject 协同实现自动读写
层次结构支持嵌套注册表(Time → mesh → fields)
查找机制lookupObject<type>(name)

十、参考源码路径(OpenFOAM-9)

  • src/IOObjects/IOobject/IOobject.H
  • src/IOobjects/IOobject/IOobject.C
  • src/OpenFOAM/db/objectRegistry/objectRegistry.H
  • src/OpenFOAM/db/regIOobject/regIOobject.H

通过理解 objectRegistry,你可以更好地掌握 OpenFOAM 如何管理场变量、字典、网格等对象,为开发自定义求解器或库打下坚实基础。

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

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

相关文章

【Hot100】贪心算法

系列文章目录 【Hot100】二分查找 文章目录系列文章目录方法论Hot100 之贪心算法121. 买卖股票的最佳时机55. 跳跃游戏45. 跳跃游戏 II763. 划分字母区间方法论 Hot100 之贪心算法 121. 买卖股票的最佳时机 121. 买卖股票的最佳时机&#xff1a;给定一个数组 prices &#…

电子电气架构 --- 软件项目复杂性的驾驭思路

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

SSE实时通信与前端联调实战

1.SSE 原理机制 sse 类似websocket,但是sse是单向的&#xff0c;不可逆的&#xff0c;只能服务端向客户端发送数据流 2.解决跨域问题 Access to XMLHttpRequest at http://127.0.0.1:8090/sse/doChat from origin http://127.0.0.1:3000 has been blocked by CORS policy: Re…

从传统到创新:用报表插件重塑数据分析平台

一、传统 BI 平台面临的挑战 在当今数字化时代&#xff0c;数据已成为企业决策的重要依据。传统的商业智能&#xff08;BI&#xff09;平台在数据处理和分析方面发挥了重要作用&#xff0c;但随着数据量的爆炸式增长和用户需求的日益多样化&#xff0c;其局限性也逐渐显现。 …

MySQL--MySQL中的DECIMAL 与 Java中的BigDecimal

1. 为什么需要 DECIMAL在数据库中&#xff0c;常见的数值类型有&#xff1a;INT、BIGINT → 整数&#xff0c;存储容量有限。FLOAT、DOUBLE → 浮点数&#xff0c;存储效率高&#xff0c;但存在精度丢失问题。DECIMAL(M, D) → 定点数&#xff0c;存储精确值。例子&#xff1a;…

低空无人机系统关键技术与应用前景:SmartMediaKit视频链路的基石价值

引言&#xff1a;低空经济的新兴格局 低空经济作为“新质生产力”的代表&#xff0c;正在从政策驱动、技术突破和市场需求的共振中走向产业化。2023年&#xff0c;中国低空经济的市场规模已超过 5000 亿元人民币&#xff0c;同比增长超过 30%。无人机&#xff08;UAV&#xff…

在Windows系统上升级Node.js和npm

在Windows系统上升级Node.js和npm&#xff0c;我推荐以下几种方法&#xff1a; 方法1&#xff1a;使用官网安装包&#xff08;最简单&#xff09; 访问 nodejs.org 下载Windows安装包&#xff08;.msi文件&#xff09; 运行安装包&#xff0c;选择"修复"或直接安装新…

【Jetson】基于llama.cpp部署gpt-oss-20b(推理与GUI交互)

前言 本文在jetson设备上使用llama.cpp完成gpt-oss 20b的部署&#xff0c;包括后端推理和GUI的可视化交互。 使用的设备为orin nx 16g&#xff08;super&#xff09;&#xff0c;这个显存大小推理20b的模型完全没有问题。 使用硬件如下&#xff0c;支持开启super模式。&#…

Matplotlib 可视化大师系列(一):plt.plot() - 绘制折线图的利刃

目录Matplotlib 可视化大师系列博客总览Matplotlib 可视化大师系列&#xff08;一&#xff09;&#xff1a;plt.plot() - 绘制折线图的利刃一、 plt.plot() 是什么&#xff1f;二、 函数原型与核心参数核心参数详解三、 从入门到精通&#xff1a;代码示例示例 1&#xff1a;最基…

第二阶段Winfrom-8:特性和反射,加密和解密,单例模式

1_预处理指令 &#xff08;1&#xff09;源代码指定了程序的定义&#xff0c;预处理指令&#xff08;preprocessor directive&#xff09;指示编译器如何处理源代码。例如&#xff0c;在某些情况下&#xff0c;我们希望编译器能够忽略一部分代码&#xff0c;而在其他情况下&am…

【开题答辩全过程】以 微信小程序的医院挂号预约系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

鸿蒙ArkUI 基础篇-06-组件基础语法-Column/Row/Text

目录 掌握组件写法&#xff0c;使用组件布局界面 ArkUI与组件 先布局再内容 DevEco Studio代码实战 预览效果 总结 练习 掌握组件写法&#xff0c;使用组件布局界面 ArkUI与组件 ArkUI&#xff08;方舟开发框架&#xff09;&#xff1a;构建 鸿蒙 应用 界面 的框架 组件…

8.27 网格memo

lc329计算矩阵中最长递增路径长度尝试从矩阵每个位置出发&#xff0c;int dfs() 往上下左右四个方向找严格递增的路径retmax(ret,dfs(x,y)1);return memo[i][j]ret;返回所有路径里的最长长度 class Solution {public:int dx[4]{0,0,1,-1};int dy[4]{1,-1,0,0};int m,n;vector&l…

flume监控文件写入 Kafka 实战:解耦应用与消息队列的最佳实践

flume监控文件写入 Kafka 实战&#xff1a;解耦应用与消息队列的最佳实践 在日志采集场景中&#xff0c;直接让应用程序通过 log4j2 写入 Kafka 会导致应用与 Kafka 强耦合&#xff08;如 Kafka 故障可能影响应用运行&#xff09;。更优的方案是&#xff1a;应用程序将日志写入…

从浏览器无法访问到Docker容器的 FastAPI 服务地址【宿主机浏览器和容器不在同一个网络层面:端口映射】

文章目录1. 问题根源&#xff1a;Docker 网络模型2. 解决方案&#xff1a;端口映射&#xff08;Port Mapping&#xff09;方法 1&#xff1a;重新运行容器并添加端口映射&#xff08;推荐&#xff09;方法 2&#xff1a;获取宿主机的 IP 进行访问&#xff08;特定情况&#xff…

线性代数中矩阵等价与离散数学中关系的闭包之间的关联

最近在重温线性代数时&#xff0c;学到矩阵的等价的定义及其性质&#xff0c;发现其性质与离散数学中关系的闭包所要满足的性质非常相似&#xff0c;不由的让人不怀疑这二者之间存在某种关联&#xff0c;从而引发以下的思考&#xff1a;从deepseek的回答中我明白了矩阵的等价其…

从MyJUnit反思Java项目的工程实践(版本控制篇)

从 MyJUnit 反思Java项目的工程实践(版本控制篇) 参考资料 deepseekgithub copilotCSDN-Git代码管理工作流程&#xff1a;GitFlow详解Conventional Commits手册封面来自 qwen-image 遵循 git flow 分支管理模型 Git Flow 是一种围绕项目发布的核心分支模型, 它规定了不同的开发…

小工具推荐

小工具 ​ 平时不太喜欢去搜罗一些好用的工具&#xff0c;但是看到自己感兴趣的还是会记下来&#xff0c;有的是github上的开源项目&#xff0c;有的是一些直接在线的工具。主要是除了工作时间也不知道去干点什么&#xff0c;或者是和朋友玩玩游戏&#xff0c;或者是city walk…

【js】加密库sha.js 严重漏洞速查

前言sha.js 是 JavaScript 生态里最常用的轻量级加密库。它由 Browserify 社区维护&#xff0c;体积不足 20 KB&#xff0c;却实现了 SHA-1、SHA-224、SHA-256、SHA-384、SHA-512 全系列算法&#xff0c;是 crypto-browserify、webpack、web3.js 等数百个流行包的“根依赖”。而…

FPGA入门学习路径

FPGA入门学习路径 专业基础 数电&#xff08;数字电路基础-CSDN博客&#xff09; 语法 Verilog&#xff08;Verilog硬件描述语言-CSDN博客&#xff09; VHDL&#xff08;VHDL硬件描述语言-CSDN博客&#xff09; FPGA开发流程 常用接口设计 学习目的&#xff1a;通过简单…