This commit is contained in:
yize 2026-02-12 23:22:38 +08:00
parent a44d43c477
commit 7e6bda7a77
3 changed files with 154 additions and 1 deletions

View File

@ -243,4 +243,157 @@ PlatformMotion => y_ED%PlatformPtMesh
### solveoption1 ### solveoption1
```fortran
SubstructureMotion => ED%y%PlatformPtMesh
ELSEIF ( p_FAST%CompMooring == Module_MD ) THEN
CALL MD_CalcOutput( this_time, MD%Input(1), MD%p, MD%x(this_state), MD%xd(this_state), MD%z(this_state), &
MD%OtherSt(this_state), MD%y, MD%m, ErrStat2, ErrMsg2 )
CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
ELSEIF ( p_FAST%SolveOption == Solve_SimplifiedOpt1 ) THEN ! No substructure model
CALL ED_HD_InputOutputSolve( this_time, p_FAST, calcJacobian &
, ED%Input(1), ED%p, ED%x(this_state), ED%xd(this_state), ED%z(this_state), ED%OtherSt(this_state), ED%y, ED%m &
, HD%Input(1), HD%p, HD%x(this_state), HD%xd(this_state), HD%z(this_state), HD%OtherSt(this_state), HD%y, HD%m &
, MAPp%Input(1), MAPp%y, FEAM%Input(1), FEAM%y, MD%Input(1), MD%y, SrvD%Input(1), SrvD%y &
, MeshMapData , ErrStat2, ErrMsg2, WriteThisStep )
CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
```
#### ED_HD_InputOutputSolve
```fortran
CALL ED_CopyOutput( y_ED, y_ED_input, MESH_NEWCOPY, ErrStat2, ErrMsg2)
CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
IF ( calcJacobian ) THEN
CALL ED_CopyInput( u_ED, u_ED_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 )
CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
CALL ED_CopyOutput( y_ED, y_ED_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 )
CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
CALL HydroDyn_CopyInput( u_HD, u_HD_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 )
CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
CALL HydroDyn_CopyOutput( y_HD, y_HD_perturb, MESH_NEWCOPY, ErrStat2, ErrMsg2 )
CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
CALL Transfer_PlatformMotion_to_HD(y_ED_input%PlatformPtMesh, u_HD, MeshMapData, ErrStat2, ErrMsg2 ) ! get u_HD from y_ED_input
CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
u( 1: 3) = u_ED%PlatformPtMesh%Force(:,1) / p_FAST%UJacSclFact
u( 4: 6) = u_ED%PlatformPtMesh%Moment(:,1) / p_FAST%UJacSclFact
u( 7: 9) = y_ED_input%PlatformPtMesh%TranslationAcc(:,1)
u(10:12) = y_ED_input%PlatformPtMesh%RotationAcc(:,1)
K = 0
DO
!-------------------------------------------------------------------------------------------------
! Calculate outputs at this_time, based on inputs at this_time
!-------------------------------------------------------------------------------------------------
CALL ED_CalcOutput( this_time, u_ED, p_ED, x_ED, xd_ED, z_ED, OtherSt_ED, y_ED, m_ED, ErrStat2, ErrMsg2 )
CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
CALL HydroDyn_CalcOutput( this_time, u_HD, p_HD, x_HD, xd_HD, z_HD, OtherSt_HD, y_HD, m_HD, ErrStat2, ErrMsg2 )
CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
IF ( K >= p_FAST%KMax ) EXIT
!-------------------------------------------------------------------------------------------------
! Calculate Jacobian: partial U/partial u:
! (note that we don't want to change u_ED or u_HD here)
!-------------------------------------------------------------------------------------------------
CALL U_ED_HD_Residual(y_ED, y_HD, u, Fn_U_Resid) ! U_ED_HD_Residual checks for error
IF (ErrStat >= AbortErrLev) THEN
CALL CleanUp()
RETURN
END IF
IF ( calcJacobian ) THEN
!...............................
! Get ElastoDyn's contribution:
!...............................
DO i=1,6 !call ED_CalcOutput
CALL ED_CopyInput( u_ED, u_ED_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 )
CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
u_perturb = u
CALL Perturb_u( i, u_perturb, u_ED_perturb=u_ED_perturb, perturb=ThisPerturb ) ! perturb u and u_ED by ThisPerturb [routine sets ThisPerturb]
! calculate outputs with perturbed inputs:
CALL ED_CalcOutput( this_time, u_ED_perturb, p_ED, x_ED, xd_ED, z_ED, OtherSt_ED, y_ED_perturb, m_ED, ErrStat2, ErrMsg2 ) !calculate y_ED_perturb
CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
CALL U_ED_HD_Residual(y_ED_perturb, y_HD, u_perturb, Fn_U_perturb) ! get this perturbation, U_perturb
IF ( ErrStat >= AbortErrLev ) RETURN ! U_ED_HD_Residual checks for error
IF (ErrStat >= AbortErrLev) THEN
CALL CleanUp()
RETURN
END IF
MeshMapData%Jacobian_Opt1(:,i) = (Fn_U_perturb - Fn_U_Resid) / ThisPerturb
END DO ! ElastoDyn contribution ( columns 1-6 )
!...............................
! Get HydroDyn's contribution:
!...............................
DO i=7,12 !call HD_CalcOutput
! we want to perturb u_HD, but we're going to perturb the input y_ED and transfer that to HD to get u_HD
CALL ED_CopyOutput( y_ED_input, y_ED_perturb, MESH_UPDATECOPY, ErrStat2, ErrMsg2 )
CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
u_perturb = u
CALL Perturb_u( i, u_perturb, y_ED_perturb=y_ED_perturb, perturb=ThisPerturb ) ! perturb u and y_ED by ThisPerturb [routine sets ThisPerturb]
CALL Transfer_PlatformMotion_to_HD( y_ED_perturb%PlatformPtMesh, u_HD_perturb, MeshMapData, ErrStat2, ErrMsg2 ) ! get u_HD_perturb
CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
! calculate outputs with perturbed inputs:
CALL HydroDyn_CalcOutput( this_time, u_HD_perturb, p_HD, x_HD, xd_HD, z_HD, OtherSt_HD, y_HD_perturb, m_HD, ErrStat2, ErrMsg2 )
CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
CALL U_ED_HD_Residual(y_ED, y_HD_perturb, u_perturb, Fn_U_perturb) ! get this perturbation ! U_ED_HD_Residual checks for error
IF ( ErrStat >= AbortErrLev ) THEN
CALL CleanUp()
RETURN
END IF
MeshMapData%Jacobian_Opt1(:,i) = (Fn_U_perturb - Fn_U_Resid) / ThisPerturb
END DO ! HydroDyn contribution ( columns 7-12 )
CALL LAPACK_getrf( M=NumInputs, N=NumInputs, A=MeshMapData%Jacobian_Opt1, IPIV=MeshMapData%Jacobian_pivot, ErrStat=ErrStat2, ErrMsg=ErrMsg2 )
CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
u_delta = -Fn_U_Resid
CALL LAPACK_getrs( TRANS='N', N=NumInputs, A=MeshMapData%Jacobian_Opt1, IPIV=MeshMapData%Jacobian_pivot, B=u_delta, &
ErrStat=ErrStat2, ErrMsg=ErrMsg2 )
CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
u = u + u_delta
u_ED%PlatformPtMesh%Force( :,1) = u_ED%PlatformPtMesh%Force( :,1) + u_delta( 1: 3) * p_FAST%UJacSclFact
u_ED%PlatformPtMesh%Moment(:,1) = u_ED%PlatformPtMesh%Moment(:,1) + u_delta( 4: 6) * p_FAST%UJacSclFact
y_ED_input%PlatformPtMesh%TranslationAcc(:,1) = y_ED_input%PlatformPtMesh%TranslationAcc(:,1) + u_delta( 7: 9)
y_ED_input%PlatformPtMesh%RotationAcc( :,1) = y_ED_input%PlatformPtMesh%RotationAcc( :,1) + u_delta(10:12)
CALL Transfer_PlatformMotion_to_HD( y_ED_input%PlatformPtMesh, u_HD, MeshMapData, ErrStat2, ErrMsg2 ) ! get u_HD with u_delta changes
CALL SetErrStat( ErrStat2, ErrMsg2, ErrStat, ErrMsg, RoutineName )
K = K + 1
END DO ! K
```
CALL MD_CalcOutput CALL MD_CalcOutput

View File

@ -6,7 +6,7 @@
{"id":"82708a439812fdc7","type":"text","text":"# 1月已完成\n\n\n\nP1 检查有没有塔筒上所有部件合并计算质量、质心、惯性参数 -- done仅有合并质量\n\nP1 明阳机型验证 \n- 叶片发散 叶片往前位移 原因查找 done -- 刘\n\nP1 明阳机型验证 \n\n- 商业机型模型验证 气动建模有问题\n- 中性轴问题 ED当前不支持预弯叶片计算\n\nP1 机型测试\n- 模型对齐讨论 done\n- 1.4aaa 工况设置问题\n- 明阳、NREL 5MW跑一轮计算\n\nP1 给方方姐回电话 done\n- 商业机型测试有结果后再见面\n- 建议双向了解情况\n\n- 过程+结果,年前 建立信任 现在是副总师了,站位上跟实验室对齐,计划增加王老师从技术角度汇报的渠道\n\nP1 服务器 ing\n- 机架 - 浪潮确定\n- 电源 - 电工给方案,让电工给接线 done\n- 超聚变 - 装系统done\n- 超聚变入网 done\n- 四台服务器组局域网 done\n\nP1 检查误差较大的载荷首先确保与Bladed同坐标系输出\n- 载荷传递方式,叶根、轮毂部件力和力矩计算方法研究\n\nP1 水动联调\n- 组建5mw 多体-水动-系泊耦合openfast算例 done\n- 编写多体-水动-系泊网格点匹配函数 done\n\n","x":-220,"y":134,"width":440,"height":560}, {"id":"82708a439812fdc7","type":"text","text":"# 1月已完成\n\n\n\nP1 检查有没有塔筒上所有部件合并计算质量、质心、惯性参数 -- done仅有合并质量\n\nP1 明阳机型验证 \n- 叶片发散 叶片往前位移 原因查找 done -- 刘\n\nP1 明阳机型验证 \n\n- 商业机型模型验证 气动建模有问题\n- 中性轴问题 ED当前不支持预弯叶片计算\n\nP1 机型测试\n- 模型对齐讨论 done\n- 1.4aaa 工况设置问题\n- 明阳、NREL 5MW跑一轮计算\n\nP1 给方方姐回电话 done\n- 商业机型测试有结果后再见面\n- 建议双向了解情况\n\n- 过程+结果,年前 建立信任 现在是副总师了,站位上跟实验室对齐,计划增加王老师从技术角度汇报的渠道\n\nP1 服务器 ing\n- 机架 - 浪潮确定\n- 电源 - 电工给方案,让电工给接线 done\n- 超聚变 - 装系统done\n- 超聚变入网 done\n- 四台服务器组局域网 done\n\nP1 检查误差较大的载荷首先确保与Bladed同坐标系输出\n- 载荷传递方式,叶根、轮毂部件力和力矩计算方法研究\n\nP1 水动联调\n- 组建5mw 多体-水动-系泊耦合openfast算例 done\n- 编写多体-水动-系泊网格点匹配函数 done\n\n","x":-220,"y":134,"width":440,"height":560},
{"id":"505acb3e6b119076","type":"text","text":"# 12月已完成\n\nP1 明阳机型验证\n\n- 商业机型建模 done\n- 正常发电工况对故障工况支持 故障建模 done\n\t- 超速n4 普通超速 多体设fault结构体 \n\t- 卡桨、 控制设fault结构体\n\n- 故障工况检查 done\n- 批量计算更新配置文件,风文件,程序版本,再计算 done\n\nP1 稳态工况init_with_yaml检查 done\n\nP1 前端\n- 所有simulation功能测试及对接 done\n\nP1 演示ppt补充内容 再补充\n- 补充steady operational loads / steady parked loads 缺结果 done\n- 6个算例的跑通 找一个与bladed对比 缺结果 done \n- 内部控制器 pass\n- batch 并行计算 单个工况是否快 多工况并行 暂时不做\n\nP1 前端\n- steady输出的名字改掉 done\n- 批量计算 改成并行计算 功能界面\n- 瞬态计算更新控制器 测试 done\n- 简单内控\n- 比较Bladed与正常发电工况速度总时间短一点 multicase done\n- 是否需要增加相对路径问题 done\n\nP1 dlc 71 done\n\nP1 输出量更新到Bladed相同命名 done\n\nP1 专利 done\n- 做出solidworks模型写专利\n\n","x":-700,"y":134,"width":440,"height":560}, {"id":"505acb3e6b119076","type":"text","text":"# 12月已完成\n\nP1 明阳机型验证\n\n- 商业机型建模 done\n- 正常发电工况对故障工况支持 故障建模 done\n\t- 超速n4 普通超速 多体设fault结构体 \n\t- 卡桨、 控制设fault结构体\n\n- 故障工况检查 done\n- 批量计算更新配置文件,风文件,程序版本,再计算 done\n\nP1 稳态工况init_with_yaml检查 done\n\nP1 前端\n- 所有simulation功能测试及对接 done\n\nP1 演示ppt补充内容 再补充\n- 补充steady operational loads / steady parked loads 缺结果 done\n- 6个算例的跑通 找一个与bladed对比 缺结果 done \n- 内部控制器 pass\n- batch 并行计算 单个工况是否快 多工况并行 暂时不做\n\nP1 前端\n- steady输出的名字改掉 done\n- 批量计算 改成并行计算 功能界面\n- 瞬态计算更新控制器 测试 done\n- 简单内控\n- 比较Bladed与正常发电工况速度总时间短一点 multicase done\n- 是否需要增加相对路径问题 done\n\nP1 dlc 71 done\n\nP1 输出量更新到Bladed相同命名 done\n\nP1 专利 done\n- 做出solidworks模型写专利\n\n","x":-700,"y":134,"width":440,"height":560},
{"id":"30cb7486dc4e224c","type":"text","text":"# 2月已完成\n\n\n","x":260,"y":134,"width":440,"height":560}, {"id":"30cb7486dc4e224c","type":"text","text":"# 2月已完成\n\n\n","x":260,"y":134,"width":440,"height":560},
{"id":"c18d25521d773705","type":"text","text":"# 计划\n这周要做的3~5件重要的事情这些事情能有效推进实现OKR。\n\nP1 必须做。P2 应该做\n\n\nP2 柔性部件 叶片、塔架变形算法 主线\n- 变形体动力学 简略看看ing\n- 柔性梁弯曲变形振动学习,主线 \n\t- 广义质量 刚度矩阵及含义\n\t\n- 梳理bladed动力学框架\n\t- 子结构文献阅读\n\t- 叶片模型建模 done\n- 共旋方法学习\n- DTU 变形量计算方法学习\n\n\nP1 线性化方法编写 ing\n\n- 开始编写扰动代码\n- 形成系统矩阵-输出矩阵\n\n\n\n\nP1 检查误差较大的载荷首先确保与Bladed同坐标系输出\n- foundation fz - PFrcT0Trb\n- Foundation Fy\n- Foundation Mz\n- Nacelle fore-aft displacement\n- Blade root 1 Mz\n- Blade root 1 Fy\n\n- 机舱、塔顶、塔底力和力矩\n- 叶根、轮毂、机舱、塔底Herowind、Bladed坐标系对比\n\n\n\nP1 叶素、塔架station输出结果\n\n\n\nP1 水动联调\n\n- 控制 网格节点先忽略\n- 梳理多体-水动-系泊耦合方法框架 ing\n- 编写多体-水动-系泊耦合计算函数\n- 稳态求解函数签名更改\n\nP1 叶片高阶模态如何加\n\nP2 初始化方法,找到稳态结果开始\n\nP1 报告更新到0.6版本 ing\n\n\n\nP2 yaw 自由度再bug确认 已知原理了\n","x":-597,"y":-803,"width":453,"height":457}, {"id":"c18d25521d773705","type":"text","text":"# 计划\n这周要做的3~5件重要的事情这些事情能有效推进实现OKR。\n\nP1 必须做。P2 应该做\n\n\nP2 柔性部件 叶片、塔架变形算法 主线\n- 变形体动力学 简略看看ing\n- 柔性梁弯曲变形振动学习,主线 \n\t- 广义质量 刚度矩阵及含义\n\t\n- 梳理bladed动力学框架\n\t- 子结构文献阅读\n\t- 叶片模型建模 done\n- 共旋方法学习\n- DTU 变形量计算方法学习\n\n\nP1 线性化方法编写 ing\n\n- 开始编写扰动代码\n- 形成系统矩阵-输出矩阵\n\n\n\n\nP1 检查误差较大的载荷首先确保与Bladed同坐标系输出\n- foundation fz - PFrcT0Trb\n- Foundation Fy\n- Foundation Mz\n- Nacelle fore-aft displacement\n- Blade root 1 Mz\n- Blade root 1 Fy\n\n- 机舱、塔顶、塔底力和力矩\n- 叶根、轮毂、机舱、塔底Herowind、Bladed坐标系对比\n\n\n\nP1 叶素、塔架station输出结果\n\n\n\nP1 水动联调\n\n- 控制 网格节点先忽略\n- 梳理多体-水动-系泊耦合方法框架 ing\n- 编写多体-水动-系泊耦合计算函数\n- 稳态求解函数签名更改\n- u_jac_scl_fact 写在模型文件,并且赋值\n- p_fast.comp_seastate 更新输入结构体等\n- \n\nP1 叶片高阶模态如何加\n\nP2 初始化方法,找到稳态结果开始\n\nP1 报告更新到0.6版本 ing\n\n\n\nP2 yaw 自由度再bug确认 已知原理了\n","x":-597,"y":-803,"width":453,"height":457},
{"id":"859e6853b7f1b92b","type":"text","text":"年底考核:\n专利\n线性化模块","x":1200,"y":-803,"width":320,"height":110}, {"id":"859e6853b7f1b92b","type":"text","text":"年底考核:\n专利\n线性化模块","x":1200,"y":-803,"width":320,"height":110},
{"id":"a850b2f46fa52de7","type":"text","text":"# 25年开发工作\n\n- 对标bladed中steady calculation开发steady operational loadssteady parked loads任务流程序\n- 设计并开发 YAML 配置文件模块,实现了对 YAML 格式模型文件与配置文件的读取、解析\n- 开发控制模块并与其他模块耦合实现对32位、64位dll文件支持完成变桨与变流器执行器的传递函数模型算法开发\n- 对标bladed中simulations集成控制模块开发正常发电工况、启机、正常停机、紧急停机、空转、停机功能\n- 开发批量计算模块\n\n","x":800,"y":134,"width":440,"height":560}, {"id":"a850b2f46fa52de7","type":"text","text":"# 25年开发工作\n\n- 对标bladed中steady calculation开发steady operational loadssteady parked loads任务流程序\n- 设计并开发 YAML 配置文件模块,实现了对 YAML 格式模型文件与配置文件的读取、解析\n- 开发控制模块并与其他模块耦合实现对32位、64位dll文件支持完成变桨与变流器执行器的传递函数模型算法开发\n- 对标bladed中simulations集成控制模块开发正常发电工况、启机、正常停机、紧急停机、空转、停机功能\n- 开发批量计算模块\n\n","x":800,"y":134,"width":440,"height":560},
{"id":"0f0b9a318a694bb3","x":-1129,"y":-803,"width":449,"height":457,"type":"text","text":"# 封存\n\nP2 bladed对比--稳态运行载荷,产出报告\n- 气动参与模块对比\n- 模态对比 两种描述方法不同bladed方向更多x y z deflection, x y z rotation不好对比\n- 气动对比 aerodynamic info 轴向切向诱导因子,根部,尖部差距较大"} {"id":"0f0b9a318a694bb3","x":-1129,"y":-803,"width":449,"height":457,"type":"text","text":"# 封存\n\nP2 bladed对比--稳态运行载荷,产出报告\n- 气动参与模块对比\n- 模态对比 两种描述方法不同bladed方向更多x y z deflection, x y z rotation不好对比\n- 气动对比 aerodynamic info 轴向切向诱导因子,根部,尖部差距较大"}