From 09e52eeee6dcd591a22037659fa8f9910e2ab306 Mon Sep 17 00:00:00 2001 From: ignis Date: Wed, 3 Jun 2026 11:13:31 +0000 Subject: [PATCH] Resolve [2-6] printer indexing, [1-8] MPI abort in Compact.f90, and [1-5] safe unit file opens in post.f90 --- code/Compact.f90 | 24 +++++++++++++----------- code/code_gen/post.py | 11 +++++++---- code/post.f90 | 21 ++++++++++++--------- 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/code/Compact.f90 b/code/Compact.f90 index 2551773..7387358 100644 --- a/code/Compact.f90 +++ b/code/Compact.f90 @@ -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 diff --git a/code/code_gen/post.py b/code/code_gen/post.py index 588c3f4..4eb791b 100644 --- a/code/code_gen/post.py +++ b/code/code_gen/post.py @@ -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 등)와 최종 축소 식으로 분할 diff --git a/code/post.f90 b/code/post.f90 index 7a3b5e4..52451b4 100644 --- a/code/post.f90 +++ b/code/post.f90 @@ -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)') &