Resolve [2-6] printer indexing, [1-8] MPI abort in Compact.f90, and [1-5] safe unit file opens in post.f90
All checks were successful
CI Test Suite / run-tests (push) Successful in 1m13s
Deploy Documentation / build-and-deploy (push) Successful in 52s

This commit is contained in:
ignis 2026-06-03 11:13:31 +00:00
parent fc1231eeab
commit 09e52eeee6
3 changed files with 32 additions and 24 deletions

View file

@ -57,9 +57,11 @@
!! @param yp Periodic flag for y-direction (0 = periodic, other = non-periodic).
!! @param zp Periodic flag for z-direction (0 = periodic, other = non-periodic).
SUBROUTINE ludcmp_allocate(nx,ny,nz,xp,yp,zp)
include 'mpif.h'
INTEGER, INTENT(IN) :: nx,ny,nz
INTEGER, INTENT(IN) :: xp,yp,zp
INTEGER :: ierr
INTEGER :: mpi_err_abort
nxc=nx
nyc=ny
@ -71,64 +73,64 @@
ALLOCATE(lxf(nxc),STAT=ierr)
IF(ierr /= 0) THEN
PRINT*, 'work array for lud allocation failed'
STOP 1
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
ENDIF
ALLOCATE(lxs(nxc),STAT=ierr)
IF(ierr /= 0) THEN
PRINT*, 'work array for lud allocation failed'
STOP 1
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
ENDIF
IF(xp.eq.0) THEN
ALLOCATE(wxf(nxc),STAT=ierr)
IF(ierr /= 0) THEN
PRINT*, 'work array for lud allocation failed'
STOP 1
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
ENDIF
ALLOCATE(wxs(nxc),STAT=ierr)
IF(ierr /= 0) THEN
PRINT*, 'work array for lud allocation failed'
STOP 1
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
ENDIF
ENDIF
ALLOCATE(lyf(nyc),STAT=ierr)
IF(ierr /= 0) THEN
PRINT*, 'work array for lud allocation failed'
STOP 1
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
ENDIF
ALLOCATE(lys(nyc),STAT=ierr)
IF(ierr /= 0) THEN
PRINT*, 'work array for lud allocation failed'
STOP 1
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
ENDIF
IF(yp.eq.0) THEN
ALLOCATE(wyf(nyc),STAT=ierr)
IF(ierr /= 0) THEN
PRINT*, 'work array for lud allocation failed'
STOP 1
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
ENDIF
ALLOCATE(wys(nyc),STAT=ierr)
IF(ierr /= 0) THEN
PRINT*, 'work array for lud allocation failed'
STOP 1
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
ENDIF
ENDIF
ALLOCATE(lzf(nzc),STAT=ierr)
IF(ierr /= 0) THEN
PRINT*, 'work array for lud allocation failed'
STOP 1
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
ENDIF
ALLOCATE(lzs(nzc),STAT=ierr)
IF(ierr /= 0) THEN
PRINT*, 'work array for lud allocation failed'
STOP 1
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
ENDIF
IF(zp.eq.0) THEN
ALLOCATE(wzf(nzc),STAT=ierr)
IF(ierr /= 0) THEN
PRINT*, 'work array for lud allocation failed'
STOP 1
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
ENDIF
ALLOCATE(wzs(nzc),STAT=ierr)
IF(ierr /= 0) THEN

View file

@ -149,13 +149,13 @@ class ArrayFCodePrinter(FCodePrinter):
# 2. X방향(i) 1차원 평균화 변수인 경우 (i) 인덱스 부착
if name in self.avg_symbols:
return f"{self.avg_symbols[name]}(i)"
if name.startswith("avg_") or "_avg_" in name or name.endswith("_avg"):
return f"{name}(i)"
# 3. 변동량 변수(u__prime)인 경우, 원본 격자점 값과 1차원 평균값의 편차식인 '(u(i,j,k) - avg_u(i))'로 자동 인라인 전개
if name.endswith("__prime"):
base = name[:-7]
arr = self.array_symbols.get(base, base)
return f"({arr}(i,j,k) - {{0}}avg_{base}(i))"
avg_name = f"avg_{base}"
printed_avg = f"{self.avg_symbols.get(avg_name, avg_name)}(i)"
return f"({arr}(i,j,k) - {printed_avg})"
return name
def _print_Function(self, expr):
@ -193,10 +193,12 @@ class SympyOptimizer:
if hasattr(f, 'attr') and f.attr.get('export')
) # 디스크로 파일 출력이 설정된 최종 목표 변수 집합
self.averaged_targets = set()
self.avg_names = set()
def set_averaged(self, averaged_dict):
# 평균화 대상이 되는 변수 집합을 수집
self.averaged_targets = {a.target for a in averaged_dict.values()}
self.avg_names = set(averaged_dict.keys())
def get_sympy_expr(self, name):
"""특정 변수 명칭에 대해 기호적으로 완전히 확장 대입된 SymPy Expression 객체를 빌드하여 캐싱합니다.
@ -351,7 +353,8 @@ class SympyOptimizer:
else:
array_symbols[k] = k
printer = ArrayFCodePrinter(array_symbols=array_symbols)
avg_symbols = {k: k for k in getattr(self, 'avg_names', [])}
printer = ArrayFCodePrinter(array_symbols=array_symbols, avg_symbols=avg_symbols)
# 2차: 공통 부분식 제거(CSE) 알고리즘 가동
# 복잡하게 중복 사용되는 수식 구조를 서브 트리로 분리하여 임시 기호(x0, x1 등)와 최종 축소 식으로 분할

View file

@ -171,38 +171,41 @@ MODULE post
real(real64) :: tmp1,tmp2
real(real64) :: dt,dummyu
INTEGER :: ncyc
INTEGER :: u_num
CHARACTER(len=64) :: filename
character(len=30) :: date
integer :: date_values(8)
OPEN(num,FORM='unformatted',STATUS='unknown')
WRITE(filename, '(A,I0)') 'fort.', num
OPEN(newunit=u_num, FILE=trim(filename), FORM='unformatted', STATUS='unknown')
READ (num) tnow,nx,ny,nz,tmp1,tmp2
READ (u_num) tnow,nx,ny,nz,tmp1,tmp2
IF ((nx .ne. nxp) .or. (ny .ne. nyp) .or. (nz .ne. nzp)) THEN
WRITE(0,*) "Array dimension mismatch", nx, ny, nz, " != ", nxp, nyp, nzp
STOP -1
ENDIF
READ (num) ncyc,dt,dummyu
READ (num) tmpr(1:2)
READ (num) tmpr(1:2)
READ (num) tmpr(1:2)
READ (u_num) ncyc,dt,dummyu
READ (u_num) tmpr(1:2)
READ (u_num) tmpr(1:2)
READ (u_num) tmpr(1:2)
num_=num
IF(num.le.shiftnum) THEN
! WRITE(*,*) ' with an old fort data from Nueman-0X'
READ (num) u,v,w,old_scalar
READ (u_num) u,v,w,old_scalar
y(:,:,:) = old_scalar(2,:,:,:)
ELSE
! WRITE(*,*) ' with a new fort data from Comb-Cluster'
READ (num) u,v,w,new_scalar
READ (u_num) u,v,w,new_scalar
u = u + dummyu
y = new_scalar(:,:,:,2)
ENDIF
CLOSE (num)
CLOSE (u_num)
call date_and_time(values=date_values)
write(date, '(I4.4,"-",I2.2,"-",I2.2," ",I2.2,":",I2.2,":",I2.2)') &