6월, 2017의 게시물 표시

FORTRAN에서 출력하기

FORTRAN에는 두가지 방식의 출력 방식이 있습니다. 첫번째는 PRINT 이고 나머지 하나는 WRITE 입니다. 간단하게 콘솔창에 출력하려면 PRINT를 쓰면 되고, 콘솔창 또는 파일로 출력하려면 WRITE를 씁니다. 먼저 PRINT 는 다음과 같이 쓰여집니다. PRINT *, '1', 1, 1D0 <OUT PUT> 1           1   1.00000000000000 PRINT 다음에 나오는 "*" 으로 출력 포맷을 정해 줄 수 있습니다. 문자 포맷은 'A' , 'I' 는 정수 그리고 ' F'는 실수 포멧을 정의하는 데 이용됩니다. 예를 들어 다음과 같이 사용됩니다. PRINT '("TEST", A3, I3, F3.0)', '1', 1, 1D0 <OUT PUT> TEST  1  1 1. 위 기능들은 모두 WRITE 루틴에서 지원가능하며, WRITE 를 이용하여 콘솔에 출력을 원하면, 첫번째 변수에 '*' 을 입력하여서 자동으로 콘솔에 출력합니다. WRITE(*,*)  '1', 1, 1D0 WRITE(*,  '("TEST", A3, I3, F3.0)')  '1', 1, 1D0 WRITE의 첫번째 변수는 출력되어지는 파일을 지정해주는 곳입니다. 정의되지 않으면 자동으로 콘솔에서 출력이 되지만, 열려있는 파일변수를 넣어주면 그 파일에 출력을 합니다. 만약에 자주 쓰는 포멧이 있다면, 포멧을 선언해 주고 쓰는 방식도 있습니다.         WRITE(*, 100)  '1', 1, 1D0 100  FORMAT("TEST:", A3, I3, F3.0) 만약에 자주 쓰는 포멧이 있다면, 먼저 출력 포멧을 설정해 주는 방법이 보다 편리할 것입니다. 마

Windows 설치시 파티션오류

Windows 재설치에 따라서 이전에 나눠놨던 파티션들이 적절하지 않은 경우 다시 설정해줘야 오류없이 설치할 수 있습니다. 그렇지 않으면 다음과 같은 경고문이 나옵니다. The partitions on the disk selected for installation are not in the recommended order for additional information about installing to GPT disk go to the Microsoft website and search for GPT Do you want to proceed with installation 위와 같은 경고문을 무시하고 설치가 가능은 하지만, 제대로 설치되지 않을 수 있어서 파티션 설정을 초기화하는 것이 추천됩니다. 먼저 파티션 초기화를 위해서, 윈도우 설치시 나오는 파티션 설정창으로 이동합니다. 그리고 파티션 초기화는 다음과 같은 단계로 진행할 수 있습니다.  Press  Shift+F10 a t the Windows 10 Setup Partition Screen. A DOS prompt will open. Type  diskpart . Type  List Disk . Type  Select Disk=0  to activate your disk. Type  List Partition . Type  Clean . Type  List Partitions . Type  exit , closing DiskPart. Type  exit , closing the command window. Click  Refresh . Click  new  and then  Apply . Click  OK  on T o ensure Windows features work correctly, Windows might create additional partitions . 이 단계들을 거치면 파티션이 초기설정으로 돌아갑니다. 이후 Windows를 설치

FORTRAN 으로 CSV 파일 불러오기

CSV 형식은  Comma-Seperated Values 의 줄임말로서 데이터를 "," 로서 구분하는 포멧입니다. 여러가지로 엑셀파일 형식과 비슷하지만, 가볍고 널리쓰여지고 있습니다. 전체적인 전략은 먼저 파일을 불러온뒤, ROW와 COLUMN의 갯수를 세어서 행렬을 생성한후, 이 행렬에 데이터를 넣어주는 방식입니다. 이와 같은 방식으로 CSV 파일을 읽어오는 코드는 다음과 같습니다.     ! Variables     CHARACTER(128) :: BUFFER     CHARACTER(32), ALLOCATABLE :: BUFFER_ARR(:)         INTEGER STRLEN, ROWS, COLS, IDS     REAL, ALLOCATABLE :: TABLE(:,:)     INTEGER, ALLOCATABLE :: IDS(:), NIDS(:)         OPEN(1, FILE='TwoCom8.CSV', STATUS='OLD', ACTION='READ')     !COUNT THE NUMBER OF COLUMNS     READ(1,'(A)') BUFFER !READ FIRST LINE WITH SPACES INCLUDED         STRLEN = LEN(BUFFER) !FIND THE LENGTH OF THE FIRST LINE STRING         COLS = 1     DO I=1, STRLEN         IF (BUFFER(I:I)==',') THEN             COLS = COLS + 1         END IF     END DO         ROWS = 1 !COUNT THE NUMBER OF LINES IN A FILE         DO         READ(1, *, IOSTAT=IO)         IF(IO/=0) EXIT         ROWS = ROWS + 1     END DO        

LU 분해로 DETERMINANT 구하기

행렬연산에서 표준적으로 쓰이는 라이브러리는 BLAS와 LAPACK입니다. BLAS는 행렬의 덧셈, 곱셈 등 기본적인 연산에 관한 라이브러리이고, LAPACK은 행렬의 분해나 역행렬 등을 구하는 좀 더 상위의 연산에 대한 라이브러리 입니다. 하지만 LAPACK에는 DETERMINANT 를 구해주는 함수가 없어서 유저가 만들어 주거나 다른 라이브러리를 참고해서 만들어야 합니다. 이 글에서는 LAPACK을 이용하여 DETERMINANT 를 구하는 방법을 다룹니다. 먼저 행렬 A를 LU 분해를 하면 다음과 같이 분해됩니다. A = P * L * U 여기에서 L 은 하삼각행렬이며, 대각성분은 모두 1입니다. U는 상삼각행렬을 나타내며, P 는 PERMUTATION 행렬입니다. PERMUTATION 행렬은 곱해줬을때, 행을 바꿔주는 작용을 해줍니다. 그러므로 I 행렬에서 바꿔주고 싶은 행들에 맞게 행들을 바꿔준 모양입니다. DETERMINANT 성질에 의해서 PERMUTATION 행렬은 1 또는 -1 입니다. 짝수번을 바꿔줬다면 1 홀수번을 바꿔줬다면 -1 입니다. 이점을 고려하면 A의 DETERMINANT 는 다음과 같습니다. det(A) = det(P) * det(U) = sign(P) * det(U) 위 사실을 이용해서 LU분해로 DETERMINANT 를 구할 수 있습니다. 먼저 LAPACK포트란에서 LU 분해는 다음과 같습니다.     ! LU decomposition     M = DIM     N = DIM     LDA = DIM     ALLOCATE(IPIV(DIM))     CALL DGETRF(M, N, A, LDA, IPIV, INFO) A는 입력과 동시에 출력값을 주는데, 대각선을 기준으로 위쪽은 U 행렬을 아래쪽은 L 행렬을 나타냅니다. 당연히 대각선 부분은 U 의 원소를 나타냅니다. 또한 IPIV에 PERMUTATION 행렬의 정보가 저장되어 있는데요. LU 분해를 하는 동안 바뀌어진 행을 나타냅니다. 그러므로