namelist 확장

namelist 확장

namelist I/O를 쓸 때 GNU Fortran이 표준 위에 더해주는 편의 기능들을 설명할게요. 기본적인 namelist 읽기/쓰기는 물론이고, $를 쓴 옛 방식이나 ?를 이용한 대화형 질의 같은 확장도 지원돼요.

출처: Extensions to namelist (The GNU Fortran Compiler)

본문

GNU Fortran은 배열 한정자(array qualifier), 부분 문자열(substring), 완전히 한정된 파생 타입을 포함해 Fortran 95 표준의 namelist I/O를 완전히 지원해요. namelist 쓰기(write)의 출력은 namelist 읽기(read)와 호환돼요. 출력은 모든 이름을 대문자로 쓰고 namelist 이름 뒤에 1열로 들여쓰기를 해요. 다음과 같은 확장이 허용돼요:

  • '&' 대신 '$'를 쓰는 옛 방식:

    $MYNML
     X(:)%Y(2) = 1.0 2.0 3.0
     CH(1:4) = "abcd"
    $END
    

    참고로 기본 종결자(terminator)는 '&END'가 아니라 '/'예요.

  • stdin에서 입력할 때 namelist 질의하기. 공백 하나 이상 뒤에 '?'를 입력하면 namelist 이름과 namelist에 있는 변수들의 이름을 stdout으로 보내줘요:

     ?
    &mynml
     x
     x%y
     ch
    &end
    

    '=?'를 입력하면 WRITE(*,NML = mynml)이 호출된 것처럼 namelist를 stdout으로 출력해요:

    =?
    &MYNML
     X(1)%Y=  0.000000    ,  1.000000    ,  0.000000    ,
     X(2)%Y=  0.000000    ,  2.000000    ,  0.000000    ,
     X(3)%Y=  0.000000    ,  3.000000    ,  0.000000    ,
     CH=abcd,  /
    

    이 대화를 돕기 위해, 입력이 stdin에서 올 때는 에러 메시지를 stderr로 보내고 IOSTAT가 설정돼 있어도 실행을 계속해요.

  • PRINT namelist가 허용돼요. -std=f95를 쓰면 이건 에러가 돼요.

    PROGRAM test_print
      REAL, dimension (4)  ::  x = (/1.0, 2.0, 3.0, 4.0/)
      NAMELIST /mynml/ x
      PRINT mynml
    END PROGRAM test_print
    
  • 확장된 namelist 읽기가 허용돼요. -std=f95를 쓰면 이건 에러가 돼요. 다음 예에서 배열의 첫 요소는 0.00, 뒤따르는 두 요소는 각각 1.002.00 값을 받아요.

    &MYNML
      X(1,1) = 0.00 , 1.00 , 2.00
    /
    

namelist를 쓸 때 DELIM=이 지정되지 않으면, 기본적으로 문자 문자열을 구분하는 데 큰따옴표가 사용돼요. -std=f95 이상에서는 delim 상태가 'none'으로 설정돼요. 기본적으로 따옴표를 쓰는 것은 문자 문자열이 있는 namelist를 나중에 정확하게 다시 읽어들일 수 있게 보장해요.

더 알아보기