终于拿到奖状了
本次介绍一下关于ASC24题目总的挑战题目——The OpenCAEPoro Challenge
这个问题的目的是使用 OpenCAEPoro 进行三相黑油模拟。模拟涉及三层不同的储层结构,包含一口注入井和一口生产井。天然气注入顶层,石油从底层产出。注入天然气导致石油膨胀,天然气流向生产井。储油层被认为是封闭的,即储油层与外部区域之间没有质量或热量交换为此,需要对代码进行修改和优化。主要重点是 OpenCAEPoro 和 PETSc 求解器中的代码部分。通过修改和优化代码,目的是缩短模拟的运行时间。
具体来说,在 OpenCAEPoro 中,可能需要调整和优化与模拟有关的参数,如时间步长、总模拟时间和输出间隔。这些参数的选择将直接影响模拟的效率和计算时间。
我们使用的系统配置如下:
Operating system | Ubuntu 20.04 |
Compiler | Fortran 4.8.5\GCC 7/9,G++ 7/9\CBLAS\BLAS 3.8.0 |
MPI software | MPICH 4.1.2\lapack-3.11\parmetis-4.0.3\hypre-2.28.0\petsc-3.20.3\petsc_solver\OpenCAEPoro |
在考虑优化过程中,我们给出了多种方法,其中为了优化 Solver::GoOneStepIsoT 函数,我们可以考虑以下几点:
- 频繁的条件判断:ctrl.time.GetCurrentDt() < MIN_TIME_CURSTEP 在每个循环中都要检查。如果这个条件很少为真,可能会造成不必要的性能损失。请考虑是否有办法减少此检查的频率,或在更合适的位置进行判断。等等
1. const OCPNRsuite& Solver::GoOneStepIsoT(Reservoir& rs, OCPControl& ctrl) {
2. // Prepare for time marching
3. IsoTSolver.Prepare(rs, ctrl);
4.
5. // Time marching with adaptive time stepsize
6. while (true) { // improve infinite loop conditions
7. double currentDt = ctrl.time.GetCurrentDt();
8. if (currentDt < MIN_TIME_CURSTEP) {
9. if (CURRENT_RANK == MASTER_PROCESS) {
10. OCP_WARNING("Time stepsize is too small: " + to_string(currentDt) + TIMEUNIT);
11. }
12. ctrl.StopSim = OCP_TRUE;
13. break;
14. }
15.
16. IsoTSolver.AssembleMat(rs, ctrl);
17. IsoTSolver.SolveLinearSystem(rs, ctrl);
18.
19. if (!IsoTSolver.UpdateProperty(rs, ctrl)) {
20. continue;
21. }
22.
23. if (IsoTSolver.FinishNR(rs, ctrl)) {
24. break;
25. }
26. }
27.
28. IsoTSolver.FinishStep(rs, ctrl);
29.
30. return IsoTSolver.GetNRsuite();
31. }