Resolve [2-6] printer indexing, [1-8] MPI abort in Compact.f90, and [1-5] safe unit file opens in post.f90
This commit is contained in:
parent
fc1231eeab
commit
09e52eeee6
3 changed files with 32 additions and 24 deletions
|
|
@ -57,9 +57,11 @@
|
||||||
!! @param yp Periodic flag for y-direction (0 = periodic, other = non-periodic).
|
!! @param yp Periodic flag for y-direction (0 = periodic, other = non-periodic).
|
||||||
!! @param zp Periodic flag for z-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)
|
SUBROUTINE ludcmp_allocate(nx,ny,nz,xp,yp,zp)
|
||||||
|
include 'mpif.h'
|
||||||
INTEGER, INTENT(IN) :: nx,ny,nz
|
INTEGER, INTENT(IN) :: nx,ny,nz
|
||||||
INTEGER, INTENT(IN) :: xp,yp,zp
|
INTEGER, INTENT(IN) :: xp,yp,zp
|
||||||
INTEGER :: ierr
|
INTEGER :: ierr
|
||||||
|
INTEGER :: mpi_err_abort
|
||||||
|
|
||||||
nxc=nx
|
nxc=nx
|
||||||
nyc=ny
|
nyc=ny
|
||||||
|
|
@ -71,64 +73,64 @@
|
||||||
ALLOCATE(lxf(nxc),STAT=ierr)
|
ALLOCATE(lxf(nxc),STAT=ierr)
|
||||||
IF(ierr /= 0) THEN
|
IF(ierr /= 0) THEN
|
||||||
PRINT*, 'work array for lud allocation failed'
|
PRINT*, 'work array for lud allocation failed'
|
||||||
STOP 1
|
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
|
||||||
ENDIF
|
ENDIF
|
||||||
ALLOCATE(lxs(nxc),STAT=ierr)
|
ALLOCATE(lxs(nxc),STAT=ierr)
|
||||||
IF(ierr /= 0) THEN
|
IF(ierr /= 0) THEN
|
||||||
PRINT*, 'work array for lud allocation failed'
|
PRINT*, 'work array for lud allocation failed'
|
||||||
STOP 1
|
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
|
||||||
ENDIF
|
ENDIF
|
||||||
IF(xp.eq.0) THEN
|
IF(xp.eq.0) THEN
|
||||||
ALLOCATE(wxf(nxc),STAT=ierr)
|
ALLOCATE(wxf(nxc),STAT=ierr)
|
||||||
IF(ierr /= 0) THEN
|
IF(ierr /= 0) THEN
|
||||||
PRINT*, 'work array for lud allocation failed'
|
PRINT*, 'work array for lud allocation failed'
|
||||||
STOP 1
|
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
|
||||||
ENDIF
|
ENDIF
|
||||||
ALLOCATE(wxs(nxc),STAT=ierr)
|
ALLOCATE(wxs(nxc),STAT=ierr)
|
||||||
IF(ierr /= 0) THEN
|
IF(ierr /= 0) THEN
|
||||||
PRINT*, 'work array for lud allocation failed'
|
PRINT*, 'work array for lud allocation failed'
|
||||||
STOP 1
|
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
|
||||||
ENDIF
|
ENDIF
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
ALLOCATE(lyf(nyc),STAT=ierr)
|
ALLOCATE(lyf(nyc),STAT=ierr)
|
||||||
IF(ierr /= 0) THEN
|
IF(ierr /= 0) THEN
|
||||||
PRINT*, 'work array for lud allocation failed'
|
PRINT*, 'work array for lud allocation failed'
|
||||||
STOP 1
|
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
|
||||||
ENDIF
|
ENDIF
|
||||||
ALLOCATE(lys(nyc),STAT=ierr)
|
ALLOCATE(lys(nyc),STAT=ierr)
|
||||||
IF(ierr /= 0) THEN
|
IF(ierr /= 0) THEN
|
||||||
PRINT*, 'work array for lud allocation failed'
|
PRINT*, 'work array for lud allocation failed'
|
||||||
STOP 1
|
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
|
||||||
ENDIF
|
ENDIF
|
||||||
IF(yp.eq.0) THEN
|
IF(yp.eq.0) THEN
|
||||||
ALLOCATE(wyf(nyc),STAT=ierr)
|
ALLOCATE(wyf(nyc),STAT=ierr)
|
||||||
IF(ierr /= 0) THEN
|
IF(ierr /= 0) THEN
|
||||||
PRINT*, 'work array for lud allocation failed'
|
PRINT*, 'work array for lud allocation failed'
|
||||||
STOP 1
|
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
|
||||||
ENDIF
|
ENDIF
|
||||||
ALLOCATE(wys(nyc),STAT=ierr)
|
ALLOCATE(wys(nyc),STAT=ierr)
|
||||||
IF(ierr /= 0) THEN
|
IF(ierr /= 0) THEN
|
||||||
PRINT*, 'work array for lud allocation failed'
|
PRINT*, 'work array for lud allocation failed'
|
||||||
STOP 1
|
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
|
||||||
ENDIF
|
ENDIF
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
ALLOCATE(lzf(nzc),STAT=ierr)
|
ALLOCATE(lzf(nzc),STAT=ierr)
|
||||||
IF(ierr /= 0) THEN
|
IF(ierr /= 0) THEN
|
||||||
PRINT*, 'work array for lud allocation failed'
|
PRINT*, 'work array for lud allocation failed'
|
||||||
STOP 1
|
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
|
||||||
ENDIF
|
ENDIF
|
||||||
ALLOCATE(lzs(nzc),STAT=ierr)
|
ALLOCATE(lzs(nzc),STAT=ierr)
|
||||||
IF(ierr /= 0) THEN
|
IF(ierr /= 0) THEN
|
||||||
PRINT*, 'work array for lud allocation failed'
|
PRINT*, 'work array for lud allocation failed'
|
||||||
STOP 1
|
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
|
||||||
ENDIF
|
ENDIF
|
||||||
IF(zp.eq.0) THEN
|
IF(zp.eq.0) THEN
|
||||||
ALLOCATE(wzf(nzc),STAT=ierr)
|
ALLOCATE(wzf(nzc),STAT=ierr)
|
||||||
IF(ierr /= 0) THEN
|
IF(ierr /= 0) THEN
|
||||||
PRINT*, 'work array for lud allocation failed'
|
PRINT*, 'work array for lud allocation failed'
|
||||||
STOP 1
|
CALL MPI_ABORT(MPI_COMM_WORLD, 1, mpi_err_abort)
|
||||||
ENDIF
|
ENDIF
|
||||||
ALLOCATE(wzs(nzc),STAT=ierr)
|
ALLOCATE(wzs(nzc),STAT=ierr)
|
||||||
IF(ierr /= 0) THEN
|
IF(ierr /= 0) THEN
|
||||||
|
|
|
||||||
|
|
@ -149,13 +149,13 @@ class ArrayFCodePrinter(FCodePrinter):
|
||||||
# 2. X방향(i) 1차원 평균화 변수인 경우 (i) 인덱스 부착
|
# 2. X방향(i) 1차원 평균화 변수인 경우 (i) 인덱스 부착
|
||||||
if name in self.avg_symbols:
|
if name in self.avg_symbols:
|
||||||
return f"{self.avg_symbols[name]}(i)"
|
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))'로 자동 인라인 전개
|
# 3. 변동량 변수(u__prime)인 경우, 원본 격자점 값과 1차원 평균값의 편차식인 '(u(i,j,k) - avg_u(i))'로 자동 인라인 전개
|
||||||
if name.endswith("__prime"):
|
if name.endswith("__prime"):
|
||||||
base = name[:-7]
|
base = name[:-7]
|
||||||
arr = self.array_symbols.get(base, base)
|
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
|
return name
|
||||||
|
|
||||||
def _print_Function(self, expr):
|
def _print_Function(self, expr):
|
||||||
|
|
@ -193,10 +193,12 @@ class SympyOptimizer:
|
||||||
if hasattr(f, 'attr') and f.attr.get('export')
|
if hasattr(f, 'attr') and f.attr.get('export')
|
||||||
) # 디스크로 파일 출력이 설정된 최종 목표 변수 집합
|
) # 디스크로 파일 출력이 설정된 최종 목표 변수 집합
|
||||||
self.averaged_targets = set()
|
self.averaged_targets = set()
|
||||||
|
self.avg_names = set()
|
||||||
|
|
||||||
def set_averaged(self, averaged_dict):
|
def set_averaged(self, averaged_dict):
|
||||||
# 평균화 대상이 되는 변수 집합을 수집
|
# 평균화 대상이 되는 변수 집합을 수집
|
||||||
self.averaged_targets = {a.target for a in averaged_dict.values()}
|
self.averaged_targets = {a.target for a in averaged_dict.values()}
|
||||||
|
self.avg_names = set(averaged_dict.keys())
|
||||||
|
|
||||||
def get_sympy_expr(self, name):
|
def get_sympy_expr(self, name):
|
||||||
"""특정 변수 명칭에 대해 기호적으로 완전히 확장 대입된 SymPy Expression 객체를 빌드하여 캐싱합니다.
|
"""특정 변수 명칭에 대해 기호적으로 완전히 확장 대입된 SymPy Expression 객체를 빌드하여 캐싱합니다.
|
||||||
|
|
@ -351,7 +353,8 @@ class SympyOptimizer:
|
||||||
else:
|
else:
|
||||||
array_symbols[k] = k
|
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) 알고리즘 가동
|
# 2차: 공통 부분식 제거(CSE) 알고리즘 가동
|
||||||
# 복잡하게 중복 사용되는 수식 구조를 서브 트리로 분리하여 임시 기호(x0, x1 등)와 최종 축소 식으로 분할
|
# 복잡하게 중복 사용되는 수식 구조를 서브 트리로 분리하여 임시 기호(x0, x1 등)와 최종 축소 식으로 분할
|
||||||
|
|
|
||||||
|
|
@ -171,38 +171,41 @@ MODULE post
|
||||||
real(real64) :: tmp1,tmp2
|
real(real64) :: tmp1,tmp2
|
||||||
real(real64) :: dt,dummyu
|
real(real64) :: dt,dummyu
|
||||||
INTEGER :: ncyc
|
INTEGER :: ncyc
|
||||||
|
INTEGER :: u_num
|
||||||
|
CHARACTER(len=64) :: filename
|
||||||
|
|
||||||
character(len=30) :: date
|
character(len=30) :: date
|
||||||
integer :: date_values(8)
|
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
|
IF ((nx .ne. nxp) .or. (ny .ne. nyp) .or. (nz .ne. nzp)) THEN
|
||||||
WRITE(0,*) "Array dimension mismatch", nx, ny, nz, " != ", nxp, nyp, nzp
|
WRITE(0,*) "Array dimension mismatch", nx, ny, nz, " != ", nxp, nyp, nzp
|
||||||
STOP -1
|
STOP -1
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
READ (num) ncyc,dt,dummyu
|
READ (u_num) ncyc,dt,dummyu
|
||||||
READ (num) tmpr(1:2)
|
READ (u_num) tmpr(1:2)
|
||||||
READ (num) tmpr(1:2)
|
READ (u_num) tmpr(1:2)
|
||||||
READ (num) tmpr(1:2)
|
READ (u_num) tmpr(1:2)
|
||||||
|
|
||||||
num_=num
|
num_=num
|
||||||
|
|
||||||
IF(num.le.shiftnum) THEN
|
IF(num.le.shiftnum) THEN
|
||||||
! WRITE(*,*) ' with an old fort data from Nueman-0X'
|
! 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,:,:,:)
|
y(:,:,:) = old_scalar(2,:,:,:)
|
||||||
ELSE
|
ELSE
|
||||||
! WRITE(*,*) ' with a new fort data from Comb-Cluster'
|
! 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
|
u = u + dummyu
|
||||||
y = new_scalar(:,:,:,2)
|
y = new_scalar(:,:,:,2)
|
||||||
ENDIF
|
ENDIF
|
||||||
|
|
||||||
CLOSE (num)
|
CLOSE (u_num)
|
||||||
|
|
||||||
call date_and_time(values=date_values)
|
call date_and_time(values=date_values)
|
||||||
write(date, '(I4.4,"-",I2.2,"-",I2.2," ",I2.2,":",I2.2,":",I2.2)') &
|
write(date, '(I4.4,"-",I2.2,"-",I2.2," ",I2.2,":",I2.2,":",I2.2)') &
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue