vasp 5.2.2 install by pgi compiler

In the world/컴퓨터 2009. 9. 4. 15:51
vasp 5.2.2 를 pgi compiler를 이용하여 설치하면 실행할 때 이유없이 죽는 기묘한 현상이 발생한다.

특정 변수가 mpi 루틴에서 사용될 때 mpi 프로세스가 이유없이 죽는다.

참고로 intel compiler를 사용하여 설치한 경우는 이 분제가 발생하지 않는다.

이를 해결하기 위해서 paw.F 라는 코드에서 선언되는 일부 변수를 동적으로 메모리에 할당되도록 변경해 주면 된다.

1. Near line 880 (ALLOCATABLE 변수로 선언한다.)
 
      LOGICAL, EXTERNAL :: USEFOCK_CONTRIBUTION, USEFOCK_AE_ONECENTER
      REAL(q) DDLM(LMDIM*LMDIM),RHOLM(LMDIM*LMDIM),RHOLM_(LMDIM*LMDIM,WDES%NCDIJ)
      !OVERLAP CTMP(LMDIM,LMDIM,MAX(2,WDES%NCDIJ)),CSO(LMDIM,LMDIM,WDES%NCDIJ), &
      !        CHF(LMDIM,LMDIM,WDES%NCDIJ)
      !OVERLAP COCC(LMDIM,LMDIM,MAX(2,WDES%NCDIJ)),COCC_IM(LMDIM,LMDIM)
      OVERLAP,ALLOCATABLE:: CTMP(:,:,:),CSO(:,:,:),CHF(:,:,:)
      OVERLAP,ALLOCATABLE:: COCC(:,:,:),COCC_IM(:,:) 
       
      REAL(q),ALLOCATABLE :: POT(:,:,:), RHO(:,:,:), POTAE(:,:,:), RHOAE(:,:,:)
 


2. around Line 958 (ALLOCATE 문으로 메모리에 할당해 준다.)
 
      ALLOCATE (RHOCOL( NDIM, LMMAX, NCDIJ ))
      ALLOCATE (CTMP(LMDIM,LMDIM,MAX(2,WDES%NCDIJ)),CSO(LMDIM,LMDIM,WDES%NCDIJ), &
        CHF(LMDIM,LMDIM,MAX(2,WDES%NCDIJ)))
      ALLOCATE (COCC(LMDIM,LMDIM,MAX(2,WDES%NCDIJ)),COCC_IM(LMDIM,LMDIM)) 
       
 ! allocate kinetic energy density if metagga
 


3. around line 1428 (DEALLOCATE 문으로 메모리에서 제거한다.)
 
      E%PAWAE=DOUBLEC_AE
      E%PAWPS=DOUBLEC_PS
       
      DEALLOCATE (COCC,COCC_IM,CHF)
      DEALLOCATE (CTMP,CSO) 
 
      IF (LUSE_THOMAS_FERMI) CALL POP_XC_TYPE
 
      CALL RELEASE_PAWFOCK
 
    END SUBROUTINE SET_DD_PAW

:

nan(Not a Nunber) 판별법

In the world/컴퓨터 2009. 8. 31. 10:31
컴퓨터에게 0/0 연산을 수행하게 한 후, 그 결과를 출력하면 "nan" 또는 "NaN" 이 출력된다.

간단한 예제(Fortran)를 만들어보면 다음과 같다.

-----------------------------------------------------------------------
real a, b, c
a = 0.0
b = 0.0
c = a/b
print *, a,b,c
-----------------------------------------------------------------------
실행 결과
    0.000000        0.000000                 NaN

여기에서 c가 0/0 꼴이기 때문에 "NaN"으로 출력된다.

직접 출력해보지 않고 내부적으로 변수가 "NaN"인지 판별하는 방법으로 다음과 같이 쓸 수 있다.

if(c .eq. c + 1.0) print*,'c is NaN'

수가 아닌 것에다가 + 연산을 수행하는 것은 수학적으로는 금지(?) 되어 있지만,
컴퓨터는 그 연산의 결과로 "NaN"을 내어 놓게 된다.

기계의 사고 체계는 흥미롭고 신비로운 세계인 것 같다.
:

NumpyTest error

In the world/컴퓨터 2009. 8. 10. 15:00
python module인 numpy와 scipy 버전이 맞지 않으면 다음과 같은 warning이 나온다.

import numpy
import scipy

/usr/lib64/python2.4/site-packages/scipy/misc/__init__.py:25: DeprecationWarning: NumpyTest will be removed in the next release; please update your code to use nose or unittest
  test = NumpyTest().test

warning이 발생하지 않도록 하려면 다음 버전의 사용을 권한다.

numpy(1.2) + scipy(0.7) or numpy(1.1) + scipy(0.6)

어쩔 수 없이 numpy(1.2) + scipy(0.6)을 사용하는 경우라면 일종의 꽁수로 warning을 피할 수 있다.

아래의 파일을 일부 수정하면 warning이 나오지 않게 된다.

/usr/lib64/python2.4/site-packages/scipy/misc/__init__.py

맨 아래쪽에 코드 두 줄을 수정하자.

from numpy.testing import NumpyTest
test = NumpyTest().test

to this:

from numpy.testing import Tester
test = Tester().test

하지만 이건 어디까지나 꽁수!
가능하면 numpy(1.2) + scipy(0.7) 버전을 사용하자.
: