물리학자를 위한 포트란 90

Save this PDF as:
 WORD  PNG  TXT  JPG

Size: px
Start display at page:

Download "물리학자를 위한 포트란 90"

Transcription

1 물리학자를 위한 FORTRAN90 이인호 한국표준과학연구원 2003년 2월 23일 출발 FORTRAN (FORmula TRANslation, 포트란)이란 무엇인가? 포트란은 엔지니어, 이공학자 및 기타 다른 과학적 알고리즘의 제작자나 사용자들을 위해 설계된 3세대 프로 그래밍 언어이다. 1950년대 말에 IBM의 John Backus에 의해 기획/설계되었으며, 매우 간결하고 엄격한 구문 형식을 가지고 있으며 배우기 쉬운 것이 특징이다. 포트란의 가장 유명한 두 개의 버전은 FORTRAN IV와 FORTRAN77을 꼽을 수 있다. FORTRAN IV는 1966년에 USASI 표준으로 승인되었으며, FORTRAN77은 1978년에 ANSI에 의해 승인된 버전이다. ISO와 ANSI에 의해 포트란의 표준으로 새로 인정받은 것을 FORTRAN90이라고 부르며, 1990년 초에 개발되 었다. 포트란90은 상당한 수준의 기능을 갖춘 현대화된 언어이다. 이것은 기본적으로 프로그래밍 언어 C++ 에서 지원하는 객체지향 (object-oriented) 프로그래밍 기능들과 병렬 배열 문법을 포트란77 언어에 추가한 것 이다. 오늘날에는, C (C++) 또는 자바 언어가 포트란을 대부분 대체하였지만, 그러나 아직도 (?) 포트란 사용자들 이 많이 있다. 그 이유는 전산 물리학 계산에서 사용해오는 전산 소프트웨어들이 다세대에 걸쳐서 계속 사용 되기 때문이다. 또한 누구나 쉽게 배울 수 있다는 언어의 특징이 있다. 특정 연구그룹에서 이미 검정을 거친 루틴들이 있다. 물론, 공공적인 공간에서도 이러한 프로그램들은 존재한다. 이들을 사용하기 위해서는 포트 란 언어를 알아두는 것이 필요하다는 것을 깨닫게 되는 것이다. 실제로 응용이 많이 되는 루틴들은 저 마다 오랜 역사를 가지고 있으며 포트란으로 구현되어 있는 것들이 많이 있다. 이러한 루틴들은 적극적으로 사용 되어야 우리가 원하는 더 많은 일들을 할 수 있을 것이다. 포트란을 사용하지 않는 사람들도 이미 개발된 포 트란 프로그램들을 읽을 수 있으면 자신들의 일에 어떠한 형태로 이든지 도움이 될 수 있다. FORTRAN90의 특징 1. 문법이 매우 간단하여 배우기가 쉽다. (고수준 언어이다; 본질적으로 기계보다 사람에게 더 가깝 게 설계되어 있다.) 2. 과학 기술 계산용 전문 언어이다. (미리 정의된 함수들 다수 보유, 113, 다양한 수치 계산 프로그래 밍 모듈 지원) 3. 수식과 여러 종류의 계산등을 간단히 공식화할 수 있다. (감각적인 간결성, 묵시적 상황 판단, 추상 적 자료형 지원) 4. 대상중심적이다. (동적인 메모리 관리, 모듈화의 장점을 살릴 수 있다, 확실한 데이터 처리와 보완 성 확보) 5. 기종간의 호환성이 있다. (이미 검증된 많은 포트란77 프로그램과 쉽게 연동된다.) (1 of 114) 오전 10:21:34

2 객체지향(대상중심)이란?: 특정한 응용을 위한 객체 (object)를 기술하는 높은 수준의 데이터 형, 데이 터 형 처리 방법들을 정의 함으로써 프로그램을 단독으로 작성하는 것 (개발 후에 있게 되는 수정/보 완 시에도 단독으로...). 프로그램 전체에서 다른 부분 사이가 독립되어 있기 때문에 이해하기 쉽고 확 장과 변경이 용이한 코드를 얻을 수 있는 장점이 있다. 객체는 데이타와 함수의 모음으로 표현된다. 아 래에 나타낸 것이 포트란90과 관련된 객체지향성이다. 이들은 모듈의 작성과 깊이 연관되어 있다. 객 체지향이라는 말보다는 대상중심이라는 말이 더 적합하다고 생각합니다.특정 대상을 전문으로 취급 하는 데이터와 부 프로그램들을 설계하고 필요에 따라서 개발 기간동안 쉽게 계속 추가하는 것을 목 표로 한다. 1. data abstraction -- user-defined types 2. data hiding -- private and public attributes 3. encapsulation -- modules and data hiding facilities 4. inheritance and extensibility -- generic procedures 5. polymorphism -- generic overloading 6. reusability -- modules 참고 웹자료: Introduction to object-oriented concepts using fortran90 현대적 의미로서의 포트란은 새로 만들어지는 코드는 포트란90으로 작성하며, 기존의 포트란77로 작성된 코 드들은 철저히 재 활용 (recycling)한다는 의미이다. 즉, 검정이 완전히 끝난 코드들 (www.netlib.org)을 다시 포트란90으로 재 작성할 필요는 없으며 그러한 일들은 많은 경우 무의미할 뿐만 아니라 오히려 위험할 수 있 다. 프로그램의 테스트와 안정성을 유지하는 것이 그만큼 어려운 것이라는 것을 의미한다. 현대의 컴퓨터 언 어를 기술할 때 다음의 사항들이 중점적으로 거론된다. reusability, maintainability, readability, reliability, testability. 본 웹 페이지에서는 포트란90의 강력한 기능인 포트란 모듈의 작성에 관해서 서술하기로 한다. 현존하는 포 트란77로 작성된 코드도 사용자의 편의를 위해서 또는 사용자의 목적에 알맞게 포트란90의 모듈로 재설계/ 작성하면 보다 일반적이고도 안전한 모듈이 될 수 있다. 이러한 일들은 모듈 개념을 적용하면 아주 쉽게 할 수 있다. 최소한, 현존하는 포트란77 코드를 읽을 수 있어야 한다. 소위 엔지니어링과 사이언스를 하면서 프 로그램의 신주류를 찾고 깊이 이해하여 활용하기란 매우 어렵고 또한 그러한 것들이 최고의 상황이 아닐지 도 모른다. 이러한 의미에서 검정된 언어의 우수한 기능들을 점진적으로 연습하는 것이 상당히 합리적이라 할 수 있다. John Backus; 포트란의 아버지 (2 of 114) 오전 10:21:34

3 왜 모듈인가? FORTRAN77에서는 찾아 볼 수 없는 기능이다. 대상중심 (객체지향 프로그래밍; object-oriented programming; "대상중심이라는 말이 더 어울림.) 프로그램에서만 나오는 개념이다. 모듈을 사용하면 변수와 변수 관련 함 수(서브루틴 포함의 일괄적이고 보다 안전한 관리를 조장한다. 사실 FORTRAN77은 소위 "Structured Program"을 지향했다. 쉽게 비유하면, 단 한 번에 거대한 집을 설계하는 것이다, 그 다음, 그 설계도에 맞추어 서 충실히 집의 구석구석을 열심히 만들어 나가는 것이다. 물론, 이러한 아이디어 자체가 나쁘다는 것이 결 코 아니다. 아주 이성적인 선택이며 분명히 좋은 방법임에 틀림없다. 하지만, 객체지향적 프로그래밍이 훨씬 프로그래밍 효율면에서 우위를 점한다는 것이 경험적으로 알려지기 시작했다. 소위 프로그램 단위의 '재사용 (reusability)'과 변형 (modification)이 아주 쉽게, 안전하게 진행될 수 있다. 프로 그램은 새로운 환경과 아이디어에 의해서 쉽게 변형되어져야 한다. 왜냐하면 프로그램은 우리의 아이디어 를 적용하고 테스트하는 방법이기 때문이다. 프로그래밍이 우리의 아이디어 창출에 장애가 되면 결코 안된 다. 이러한 의미에서 대상중심의 프로그래밍이 구조적 프로그래밍 보다 매우 유리하다. 특별한 아이디어를 빨리 구현하는 것이 얼마나 중요한가는 지난 컴퓨터 프로그램의 역사를 통해서 증명되었다. 속도는 차후에 개선할 수 있지만, 독창적인 아이디어의 발표는 그렇지 못하다. "Structured Program"에서는 작성하는 프로그램이 커질수록, 다양한 전체 프로그램의 시도가 있을수록, 여러 사람과 공동으로 일할수록, 시간이 지나서 버전이 올라 갈수록, 무슨 작업들이 어디에서 일어나는지, 어떠한 계산이 진행되는지 또한 변수들에 어떠한 변화들이 일어나는지 추적하기가 점점 어려워진다. 다시 말해서, 점점 더 암호화되고 복잡해지고 그에 따른 관리가 힘들어진다는 것이다. 따라서, 새로운 프로젝트를 위한 생 산성이 상당한 수준에서 위협받을 수 있다. 모듈을 사용하면 프로그램에 전체적인 변화가 분명히 있음에도 불구하고 구체적인 소스코드 상에서는 국소 적인 코드 변화로 종결되는 것을 조장한다. (위에서 기술한 내용은 다소 추상적이라고 평가받을 수 있다. 보 다 냉정하고 엄밀히 이야기하면 프로그래머의 습관에 관한 사항이다. 특히, 모듈을 사용하지 않는 사람들에 게는 대부분 이해가 되지 않을 뿐만 아니라 언급된 대부분의 항목에 대해서 하나 하나 변론할 수도 있다는 것 을 잘 알고 있다. 이것은 명백한 현실이다. 지난 세월, 사실, 세상의 프로그램들 모듈 없이도 잘 되어 왔다. 결 국, 위에서 언급한 모듈의 진정한 의미는 실제 모듈을 사용해 본 다음에 평가가 내려져야 마땅할 것이다. 모 듈들을 잘 설계하고 잘 사용하고 나면 그 유명한 "순서도" 조차도 특별한 의미와 필요가 없어진다면 믿어지 겠는가? 주 함수에는 정말 '말하듯' 주요 명령들만이 줄지어 나타나게 된다는 것이다. 이 때 부터는 정말 프로 그래머에게서 아이디어가 살아나도록 프로그램이 유도하는 수준이라고 하면 너무 심한 비약일까?) FORTRAN90 모듈은 무엇인가? 프로그래밍 언어 C++의 class와 비슷한 것이다. 포트란77의 common, include, block data를 대치할 수 있다. 물 론, 이것이 다는 아니다. 각종 형태의 데이터와 이들 데이터와 관련된 함수들의 연합체가 모듈이다. 다시 말 해서 객체를 나타내는 수단으로 모듈이 있을 수 있다. 여기서 데이터는 미리 정해진 사이즈의 배열일 필요가 없다. 배열의 크기를 정하는 함수를 모듈 속에 하나 만들어 두고 사용할 수 있다. FORTRAN77에서는 공통으로 사용하는 변수들을 모아 두고 사용하는 common 문이라는 것이 있었다. common 문은 FORTRAN77에서의 인수를 제외할 경우 유일한 global 변수의 접근 통로로 사용되었다. 소위 named common 문을 사용하여 몇 가지로 그 global 변수들을 편의상 분류하기도 했다. 하지만, 불안정한 프로 (3 of 114) 오전 10:21:34

4 그래밍의 이유가 된다고 하여 그것의 사용이 과도하게 느낄 정도로 엄청나게 천대와 탄압을 받아왔다. 하지 만, FORTRAN90에서는 보다 안전하게 모듈을 사용하여 common 문 그 고유의 장점을 살릴 수 있다. 또한 제 도적으로 보다 안전하게 (save, use, public, only, => 키워드를 사용함으로써) 프로그램할 수 있게 되었다. 굳이 변명하자면 common 문 속의 변수들을 사용하는 함수들은 거의 정해져있다. 따라서, 이들 변수들과 이 를 이용하는 함수들은 붙어서 다니는 것이 좋겠다. 이것이 모듈이다. 저장된 변수들의 접근이 명시될 수 가 있기 때문에 공통으로 사용되는 변수들의 사용에서 그 투명성이 증대된다. 여러 명이 프로그램을 개발하여 합칠 때에도 각 모듈들 간의 있을지도 모를 충돌을 제도적으로 방지할 수 있게 했다. 사실상 신경을 곤두세워 서 보아야 할 변수들을 키워드 public을 이용해 목록해 두도록 되어있다. 이어지는 프로그램 수정과 확장에서 도 그 탁월한 유용성이 보장된다. 자주 일어나는 일이지만, 특정 데이터를 생성하는 곳과 그 데이터를 참조하여 사용하는 곳이 멀리 (인수로 통해서 접근한다고 생각할 때) 떨어져 있으면, common 문을 사용하면 쉽게 필요로 하는 정보를 공유할 수 있 다. 구차하게 필요한 정보들을 전달하고 또 전달하는 귀찮은 작업들을 할 필요가 없다. 문제는 너무 많은 작 업들을 이런 식으로 하는 것은 결국 그러한 정보 관리상의 어려움을 유발하고 만다. 동적으로 크기가 변화하는 변수들도 포트란90에서 지원되기 때문에 정확히 그 크기와 순서가 일괄적으로 정 해져있는 포트란77에서의 common문 한계를 쉽게, 확실하게 극복할 수 있다. 사실, 이러한 위험성 때문에, 포 트란77에서는 include문을 사용하여 완벽하게 똑같은 common문들을 사용했었다. (예, common문을 필요로 하는 서브루틴마다, include 'file_common_statements'를 선언하고, 해당파일만 다루는 문제마다 바꿈으로서, 일괄적으로 관리할 수 있었다.) 어떻게 해야 모듈을 잘 만들고 잘 사용할 수 있는가? 모듈을 작성할 때는 save, public (또는 private)기능들을 확실히 사용하고, 모듈을 이용할 때는 이들을 꼭 확인 한다. 각각의 루틴을 작성할 때 implicit none을 항상 사용한다. 남이 만든 모듈과 내가 만든 프로그램 상에서 우연히 서로 다른 변수를 의미함에도 불구하고 변수 이름이 동등할 수 있다. 이 경우 그 숫자가 너무 많지 않 고 오해의 소지가 없다면 간단히 변수이름을 재명명함으로써 슬기롭게 문제를 피해갈수 있다. 이것 또한 포 트란90의 장점이다. 위에서 지적한 implicit none은 모든 변수들의 속성이 반드시 선언되어야 한다는 의미이 다. 즉, 뒤 따르는 줄에서 실수형, 문자형, 배열형, 정수형, 논리형 등이 구체적으로 정의되어야만 한다는 의미 이다. 그렇지 않은 변수들의 리스트를 컴파일 시 보여주고 더 이상의 컴파일을 진행하지 않는다. 포트란에서 는 컴파일할 때 보통 -C 옵션을 이용하면 배열의 한도를 넘는 배열 참조에 관련된 에러발생 위치를 실행할 때 보여주고 실행이 중단된다. 프로그램 개발 단계에서 필요한 옵션이다. USE stack, local_use_pop => pop pop가 특정 함수에서 국소적으로 사용될 때, stack 모듈 속의 pop는 local_pop로 재명명되었다. USE stack, ONLY: pos, local_pop=> pop 모듈 stack속의 pos와 pop만이 사용 가능하다. 다만, 이 경우 모듈 속 pop의 경우 local_pop로 이름이 다시 만들 어졌다. 모든 모듈들은 그것을 사용하는 프로그램 단위 보다 먼저 컴파일되어야 한다. 이렇게 되기 위해서는 makefile (4 of 114) 오전 10:21:34

5 에서 아래와 같은 프로그램들간의 의존성이 필요하기도 하다. 즉, 프로그램 ximage_lbfgs.f90은 모듈 timpose. f90를 사용하게 되어있다. 이 때 이 모듈은 다른 파일 속에 있는 것이며 이전에 만들어진 것이다. USE aaa USE bbb 모듈 bbb에서 public한 모든 변수, 배열, 또는 부 프로그램(function, subroutine)들은 모두 사용할 수 있다. USE ccc USE ddd, ONLY: qqq,ppp 모듈 ddd에서 사용하고자하는 변수, 배열, 또는 부 프로그램 (subroutine, function) 이름들을 적어둔다. 특정 모듈을 사용할 때, "USE 모듈이름은 아주 앞 쪽에 선언된다. 즉, 그 모듈을 사용하는 서브루틴에서 모든 변수들 보다 앞서서 선언된다. 결국, implicit none 보다 앞서서 그 바로 윗줄에서 정의된다. 즉, 컴파일할 때 먼 저 불러져서 컴파일이 될 수밖에 없다. USE lll, ONLY: sss 등과 같이 ONLY를 많이 사용할수록 프로그램의 readability는 당연히 높아지게 된다. 보다 더 확실하게 변수들을 사용한다는 것이다. 일반적으로 ONLY를 사 용하는 것이 사용하지 않는 것보다 유리하다. 구조적으로 많은 것들을 체크할 수 있다. ximage_lbfgs.o:ximage_lbfgs.f90 timpose.o $(cmpl) $(Ocft) ximage_lbfgs.f90 ximage_lbfgs.o를 만들기 위해서는 timpose.o가 먼저 필요하게 된다는 것입니다. 또는 timpose.f90이 수정되었 다면 다시 컴파일되어야 합니다. 이러한 변화에 발 맞추어서 ximage_lbfgs.o도 반드시 다시 컴파일되어야 한 다는 의미입니다. 여기에서, 재미있는 것을 얻을 수 있습니다. 프로그램의 버전이 올라갈 때마다 (또는 프로 그램 개발 중에), 변화가 상당히 국소적으로 일어남을 알 수 있습니다. 즉, 프로그램의 전체적인 변화가 분명 히 있음에도 불구하고 구체적인 소스코드 상에서의 변화는 상당히 국소적인 변화로 종결될 수 있음을 보여 주고 있습니다. 이것이 바로 대상중심 프로그램의 장점 중의 하나입니다. 즉, 전체 설계도를 보지 않아도 된 다는 것입니다. 프로그램이 크게 바뀔 때마다 모듈의 형태로 추가될 수 있다면 이 또한 보기 좋을 것입니다. 한 가지 재미있는 것은 아래와 같다. 여러 모듈 속의 변수들을 이제는 너무 쉽게 접근하고 바꿀 수 있어지니 까 '모듈 사용의 도'를 넘어 오히려 전체 프로그램을 못 읽어 버리게 만들 수 있다는 사실이다. 찬찬히 생각하 면서 모듈의 기능과 전체 프로그램의 흐름을 다시 생각해 볼 필요가 있다. 이러한 경우 새로운 모듈들의 재정 립이 필요하다. IMPLICIT NONE에 관해서: 어떠한 것도 묵시적이지 않다고 선언하는 것이다. 즉, 모든 변수들이 구체적인 형을 선언해 주어야 한다는 것이다. 이렇게 선언한 이상. REAL*8, INTEGER, CHARACTER*3, LOGICAL, COMPLEX*16 과 같이 모든 변수에 그 해당 변수형을 선언해야 한다. 이러한 것은 프로그램 작성시 발생한 TYPO들을 잡아주는 기능을 한다. 조금 귀찮지만 안전한 코드 생성에 일조한다. 더욱이, 모듈 개념을 사용할 때는 꼭 있어야 한다는 생각이 든다. 왜냐하면, USE를 사용하는 경우, 사용하는 모듈 속에 변수들이 존재하 는지를 컴파일하는 단계에서 강제로 확인 시켜준다. 이전에 많이 사용했던 IMPLICIT REAL*8 (A-H,O-Z) 즉, 시작하는 변수들이 A-H 또는 O-Z로 시작하면 실수 형임을 선언하는 어찌 보면 너무나도 광범위한 선언은 프로그램 작성과 관리차원에서 그렇게 좋은 선택은 아니다. 복잡한 프로그램을 만들다 보면, 항상 사용하는 변수들이 선언되게 하는 implicit none의 힘을 느낀 다. 뻔한 내용의 실수들을 줄일 수 있도록 도와주는 힘. 뻔한 실수들을 잡아내기가 더욱 어려울 때가 종종있 다. 전혀 예측하지 않은 형태의 착오이기 때문이다. 변수 선언은 INTEGER, DIMENSION(:), ALLOCATABLE, SAVE, PRIVATE :: ivari_name 처럼 사용될 수 있다. 너무 길어 (5 of 114) 오전 10:21:34

6 지는 면이 있지만, 변수하나의 특성을 표현하기 위해선 어쩔 수 없다. 실제로는 이와같이 하지 않는 경우가 많다. INTEGER, ALLOCATABLE :: ivari_name(:) 정도로 해두고 private와 save는 보통, 상당히 앞 쪽에서 미 리 따로 선언하는 경우가 많다. 또한 재 선언을 통해서 public 또는 private를 확인해 줄 수 있다. implicit none private save integer... real*8... logical... public ::...(부)함수이름, 변수이름, (가변)배열처럼 되는 경우가 많이 있다. USE를 사용할 때에도 USE xmodulex, ONLY: ivari,jvari,isubp,ifunc 처럼 ONLY를 사용해서 구체적으로 함수와 변수들을 명시해주 는 것이 보기에 좋고 프로그래밍에서 실수할 확률을 줄일 수 있도록 도와 준다. 프로그램 시작과 함께 변수값 이 할당될 수도 있다. 이 경우는 integer :: iiijjj=10, kkklll=100 logical :: on=.true., off=.false. real*8 :: qqq=1.10d0, ttt=2.20d0 real*8 :: aaa(-1:1)=(/ -1.d0, 0.0d0, 1.d0 /) 통상의 구조는 어떠한가? (제법 많을 일들을 수행하는 경우) = (특정 데이터의 크기를 모듈 외부와의 통신을 통하여 정하고, 필요하면 디스크로부터 정보를 읽어 들이고, 또는 생성하고, 연관된 계산들을 수행하고, 주 요 데이터들을 모듈 외부로 보내고/받고, 특정 배열을 소멸시키고, 주요 정보를 디스크에 저장하고, 프린트하 고,...) module common_data implicit none private save integer iii1,jjj1 real*, allocatable :: aa1(:,:),bb1(:) logical first_call 첫 번째로 모듈이 사용되는 경우가 중요한 경우가 있다. 이를 위해서 전역변수로 선언해 둘 수 있다. 초기화를.true.로 해두고, 나중에.false.로 바꿀 수 있다. character*2, allocatable :: ccc1(:)... public :: aa1,bb1,iii1 end module common_data module common_data2 implicit none private save... public ::... end module common_data2 program abcd implicit none (6 of 114) 오전 10:21:34

7 contains subroutine aaa USE common_data implicit none... end subroutine aaa subroutine bbb USE common_data2, ONLY : w,y,z implicit none... end subroutine bbb subroutine ccc USE common_data implicit none... end subroutine ccc subroutine ddd USE common_data2, ONLY : x,y,z implicit none... end subroutine ddd subroutine eee implicit none... end subroutine eee function fff implicit none... end function fff end program abcd implicit none 뒤에는 각종 변수, (가변) 배열들이 선언될 수 있다. 상당히 짧은 프로그램의 경우 위와 같은 형 식으로 해결될 수 있다. 일반으로, 사용되는 모듈들의 숫자가 많아 질수록 대부분의 경우 여러 개의 파일들 을 사용한다. 보통 한 파일 속에 모듈 하나를 넣어 두는 경우가 많다. 위의 경우에는 모듈들은 데이터 저장 창 고로 사용된 예이다. 하지만, 모듈은 특정 데이터들을 보관할 뿐만 아니라 관련된 데이터 처리를 할 수 있도 록 설계되었다. 즉, 모듈= {데이터들}+{데이터 처리 부함수들}이기 때문이다. 모듈이 변수들 없이 함수들만 포함(contain)할 수도 있다. 반대로 변수들만 가질 수도 있다. program ssss USE xxx, ONLY : aa1,bb1,pbc USE yyy, ONLY : qq,pp,ssq USE www implicit none (7 of 114) 오전 10:21:34

8 REAL*8 ss REAL*4 t_s INTEGER itemp,itemq,irate CHARACTER*8 fnnd ; CHARACTER*10 fnnt real*8, allocatable :: vector(:) integer ierr CALL DATE_AND_TIME(date=fnnd,time=fnnt) write(6,'(1x,a10,2x,a8,2x,a10)') 'date,time ', fnnd,fnnt CALL SYSTEM_CLOCK(itemp,irate) write(6,*) epsilon(ss),' epsilon for real*8' write(6,*) epsilon(t_s),' epsilon for real*4' E-016 epsilon for real* E-07 epsilon for real*4 write(6,*) floor(4.8d0) write(6,*) floor(-4.8d0) 4-5 write(6,*) huge(ss) write(6,*) huge(t_s) E E+38 write(6,*) minexponent(ss) write(6,*) minexponent(t_s) write(6,*) nint( ) write(6,*) nint( ) -7-6 가장 큰 수를 찾고자 할 때 max0(j,k,l,...) amax0(a,b,c,d...) ifix(aa)버림을 실행하여 정수로 반환 min0(i,j,k,...) amin0(a,b,c,...) sign(x,y) 는 abs(x)*(y 값의 부호)를 반환한다. mod() MOD (3.0, 2.0) 1.0 (8 of 114) 오전 10:21:34

9 MOD (8, 5) 3. MOD (-8, 5) -3. MOD (8, -5) 3. MOD (-8, -5) -3. int() 정수로 변환 INT (-3.7) -3. nint() Nearest integer. NINT (2.789) --> 3. NINT (2.123) --> 2. aint() (n/2)*2 n=11 8 n=11 10 n=-9-8 포트란90에서의 수학 DOT_PRODUCT(vector1,vector2) MATMUL(matrix1,matrix2) MAXVAL() MINVAL() SUM() ==.eq. /=.ne. 비교: C 언어, 파이썬에서는 =을 사용한다. >=.ge. <=.le. 위의 경우처럼 '='이 관련된 경우에서 =이 항상 뒤쪽에 위치한다. >.gt. <.lt. 논리연산에는.not.,.and.,.or.가 있다..not. ( (la == lb).and. (.not.(lc /= ld) ) ) 처럼 논리 연산에 직접 사용될 수 있다. if(.not. allocated(vector))then allocate(vector(100000), stat=ierr) if(ierr /= 0) then write(6,*) 'problem' stop endif endif allocate(vector(-89:100)) 처럼 정의될 수 있다. -89, -88, -87,...98, 99, 100. 즉, allocate(vector(100)) 는 크기가 100인 vector가 생성됨을 의미한다. 물론, 1부터 시작하여 100까지 간다는 말이다. allocate(vector(1:100))과 동 (9 of 114) 오전 10:21:34

10 등한 표현이다. 디폴트가 1부터 시작한다는 이야기입니다.... if(allocated(vector)) deallocate(vector) CALL SYSTEM_CLOCK(itemq) write(6,'(2e15.4,2x,a9)') float(itemq-itemp)/float(irate)/60.,float(itemq-itemp)/float(irate)/3600.,' min or h' end program ssss module xxx implicit none private save 모듈 내에서 공통으로 사용되고 저장될 변수들...global object 선언 (전역 객체 선언) 이곳에, 모듈 내에서 정의되는 함수 이름(real*8, integer, logical 등을 선언할 필요는 없다. 모듈 내에서 각자 정의될 때만 필요하다. logocal first_call... public ::...변수, 가변 배열, 부함수 (subroutine, function) 이름들... contains subroutine xxx_initialize(...) implicit none first_call=.true....지역 변수들 local variables end subroutine xxx_finalize subroutine xxx_finalize(...) implicit none...지역 변수들 end subroutine xxx_finalize subroutine xxx_do_something(...) USE xxx, ONLY : xxx1,yyy1,sub_name,fn_name implicit none...지역 변수들 주의할 점: 지역변수들을 선언할 때, 전역변수와 이름이 같은 것을 사용해 버리면 어떻게 될까? 답은 간단하 다. 이름이 같은 것조차 의미없는, 진정한 의미로, 한번 지역 변수는 그 지역에서 지역변수이다. 하지만, 이렇 게 복잡하게 프로그래밍할 필요가 없다. 혼돈을 피하기 위해서, 지역변수들은 될 수 있는 한 전역변수와 같 은 이름을 사용하지 않도록 하는 것이 바람직하다. 모듈 속의 서브루틴에서 이 모듈 속에 속하지 않는 외부의 서브루틴, 함수들도 당연히 사용할 수 있다. 독립 적으로 선언된 모듈 속의 내용(변수들, 부함수들)이라면 당연히 USE를 사용해야 한다. 예전에 만들어진 포트 란77 프로그램과 함께 연동될 경우, 특히, common문이 있는 경우에도 common문을 그냥 사용해도 된다. 왜냐 하면 포트란90은 포트란77을 다 이해하기 때문이다. end subroutine xxx_do_something subroutine xxx_print USE www USE zzz, ONLY : sfa 모듈 속의 부함수들은 인수를 가지지 않을 수도 있다. 또 다른 모듈의 변수,함수를 사용할 수 있다. 또 다른 모듈의 변수,함수를 사용할 수 있다. (10 of 114) 오전 10:21:34

11 implicit none... end subroutine xxx_print function x_test() implicit none real*8 x_test 모듈 속의 함수 선언 :이곳에서 함수 선언하는 것만으로 충분하다. 다만, 전역 변수 선언 공간에 서, 이 친구가 private, public이라는 것만 밝혀두면 된다. end function x_test end module xxx 마찬가지로 module yyy도 고유의 모듈 형식을 가질 수 있다. module www, zzz등도 있어야 컴파일이 된다. 모듈 내부에서만 저장되거나 생성되는 변수, 내부에서만 이용되는 부함수 모듈 외부에서 (USE 명령을 통해서 사용) 참조가능한 변수, 부함수 등에 유의하여 작성한다. MODULE x_mo_du_le IMPLICIT NONE PRIVATE 디폴트를 어떻게 잡느냐의 문제; 기본이 private이고 public에 해당하는 것들은 표식적으로 명시해야 함을 나타내고 있다. SAVE INTEGER :: ia,ib,ic,id,ie,if... REAL*8, ALLOCATABLE :: arr(:,:), brr(:,:), crr(:,:)...(특정한 순간에 크기가 할당될 배열들이다.)(계산/저장 후) (특정 순간에 할당된 정보가 없어질 수 있다.) PUBLIC :: abc_initial, abc_final,variable_1,array_1,ia,ib,...필요한 것만 직접 적어둔다. 이 영역에서는 공통으로 사용되는 변수,배열,가변배열들을 선언해준다. 아래에 선언될 함수, 서브루틴들에 의해서 참 조될 뿐만 아니라 변화될 수 있다. 물론, 외부에서 참조되고 변화될 수 있다. 외부에서 사용하는 경우 USE라는 명령을 사용하여 그곳에서 특정 모듈 내용을 사용하게 된다. 여기서 주목할 것은 private 과 public이다. 처음에 private으로 시 작했기 때문에 이 영역에서 선언된 것들은 이 모듈이 사적으로 사용한다는 뜻이다. 즉, 이 모듈 밖에서는 이 변수가 보 이질 않는다. 따라서 예기치 않은 상황의 연출로부터 바뀔 염려가 없다. 완전히 보전된다. 다만, 뒤에 마음이 바뀌어 서 구체적으로 public (즉, 밖에서 사용할 수 있는 subroutine 이름이나 배열, 정수, 실수 등을 )을 이용하여 선언해준다. 즉, 기본 사적사용에 공적사용 명시인 것이다. 위에서 선언된 save는 기본적으로 모든 변수들이 이 모듈이 사용되는 동안 그 값이 계속 저장된다는 것이다. 연이어서 이 모듈을 사용할 때 이전 값들이 그대로 유지되어야 한다고 선언하 는 것이다. private, public을 사용하지 않으면 public으로 간주된다. 따라서 첫 줄에 private를 사용하지 않았다면,마지막 에 private를 이용하여 현 모듈에 있어서 사적인 것들의 리스트를 만들어 두면 좋다. 예를 들면, 아래와 같다. public :: aa, bb, cc public :: aa_subroutine, bb_subroutine, cc_function 이렇게 public으로 선언된 것들은 원하는 모듈 또는 부 함수들에서 USE, ONLY들을 이용하여 선택적으로 사용할 수 있다. CONTAINS 뒤에 따르는 함수들을 나열하기 전에...;물론, 서브루틴, 함수들은 위에서 선언된 변수들을 중점적으 로 관리할 서브프로그램들일 것이다. 즉, 특정 대상 중심의 서비스. 국소 변수들로 argument형식으로 외부와 통신할 수 있다. 하지만 주요 정보들은 이곳에서 계산되고, 이곳에 저장되면 될 것이다. 일반으로, 본 모듈 내에서만 정의되고, 사용되는 변수들과 부함수들도 있다. (이들을 private이라 고... ) 모듈 외부에서 접근/사용 가능한 변수들과 부함수들===>public이라고... 외부와 통신하는 부함수들은 자체적으로 인수들을 가질 수 있다. 국소적인 인수들이다. 위에서 선언된 모듈 내의 변수들과는 명목적으로 상관이 없는 변수들을 인수로 가지고 있다. 인수들을 가지지 않는 부함수들도 있다. 이 경우 이미 주요한 변수들이 위에서와 같이 정의된 경우, 원하는계산만 수행할 경우 특별 (11 of 114) 오전 10:21:34

12 히 인수가 없을 수도 있다. 통상 외부 함수 (주 프로그램,서브루틴, 함수에서 접근 가능한 subroutine들이 예를 들어 3개 정도는 있을 수 있다. 물 론, 충분히 많은 수 일 수 있다.; 모듈 내부에서 만 사용되는 변수/부함수들도 있을 수 있다. 필요한 일들을 충분히 분업 화 시킬 수 있다는 의미이다. 위에 선언된 모듈 내에서만 정의되어 보호되는 변수들을 전문으로 취급하는 부 함수들 을 많이 만들 수 있다. 특정한 데이터들만을 전문으로 다루기 때문에 이러한 부 프로그램들은 통상 private형식인 것 이 자연스러운 일일 것이다. 이와는 반대로, 외부와 직접 정보를 교환하는 부프로그램은 당연히 public 형식일 것이고 (다시 말해서, 외부에서 접근가능한 부 프로그램임을 의미한다.) 필요에 따라서, 용도에 따라서, 인수들 (변수, 배열을 가질 수 있다. SUBROUTINE abc_initial(n_problem_size,...) IMPLICIT NONE 통상 main함수로부터 불려지면서 (따라서 public이어야 한다.) 현 모듈과 관련하여 필요한 메모 리를 확보한다. 또는 변수 초기화를 시도한다. INTEGER n_problem_size 일반적으로 주 (main) 프로그램에서 인수들을 통해서 문제의 크기를 정해줄 수 있 다. 직접 필요한 정보를 읽어들여도 됨. INTEGER i1_local,i2_local REAL(8) r1_local,r2_local... 일반적으로 총체적인 입력들을 정리해 줄 수 있다. 실질적으로 풀려는 문제가 구체화되고, 정의된다. 사실, 관련 모듈 의 특성화가 시작된다. ALLOCATE(aa(n_problem_size)) ALLOCATE(bb(n_problem_size)) 모듈 내에서 언제든지 접근가능하다. 물론, public이면 외부에서도 접근가능 함.... END SUBROUTINE abc_initial SUBROUTINE abc_final() IMPLICIT NONE INTEGER i1_local... main함수로부터 불려지면서 (따라서 public이어야 한다.) 불 필요한 메모리를 지운다. REAL*8 r1_local,r2_local... 일반적으로 이 모듈과 관련된 일들을 종료하기 전 총체적인 출력 정리를 해 줄 수 있다. 필요한 정보들 출력, 예를 들 면. DEALLOCATE(aaa) DEALLOCATE(bbb)... END SUBROUTINE abc_final SUBROUTINE aaaaa1() 서브루틴, 함수의 인수가 하나도 없을 경우도 있을 수 있다. IMPLICIT NONE INTEGER i1_local,i2_local REAL*8 r1_local,r2_local...구체적으로 이 모듈 내에서 할 일 들과 연관이 있는 일을 최대한 분업화할 수 있도록 한다. 여러 개의 서브루틴과 함수를 정의한다. 모듈 내에서는 많은 인수들이 필요하지 않다. 왜냐하면 모듈 내에서 대부분 의 변수들이 접근가능하기때문이다. 인수가 하나도 없는 함수도 물론 가능하다. 즉, subroutine unaaa, 부를 때 call unaaa 형식이 가능하다. argument를 이용 하여 외부와 최소한의 통신은 가능하도록 하는 것이 일반적이다. 모듈 내에서 사용되는 다양한 변수들은 외부 모듈 들 속의 변수들 또는 다른 모듈들과의 접촉을 차단한 채 그들만을 위하여 특별히 만들어진 부 프로그램들에 의해서 (12 of 114) 오전 10:21:34

13 다루어진다. 모듈의 개념을 도입하면 앞서 이야기한 특정 대상을 중심으로 프로그램들이 쉽게 만들어진다. 상황이 이 러하니 인수들을 많이 가지지 않는 것이 당연하다. END SUBROUTINE aaaaa1 SUBROUTINE internal_use1 IMPLICIT NONE INTEGER i1_local,i2_local REAL*8 r1_local,r2_local 현 모듈 내에서만 사용되는 부함수가 일반으로 많이 있을 수 있다. 인수가 있을 수도 없을 수도 있다. 물론, 목 적과 설계에 따라서 달라질 수 있다. 모듈 속에서 선언된 전역변수들만 집중적으로 취급하는 경우는 모듈 속 서브루틴, 함수들은 인수의 숫자가 적어질 수밖에 없다. 물론, 모듈 외부와 통하는 경우에는 일반으로 인수들 의 숫자가 증가할 가능성이 많을 것이다. END SUBROUTINE internal_use1 FUNCTION qqq() 서브루틴, 함수의 인수가 하나도 없을 경우도 있을 수 있다. IMPLICIT NONE REAL*8 qqq INTEGER iq_local, REAL(8) qx_local... RETURN 없어도 된다. subroutine의 경우에도 return없어도 된다. END FUNCTION qqq 이 영역은 필요한 함수나 서브루틴들을 만들어서 두는 곳이다. 통상의 인수 (arguments)들은 최소화되어 몇 개밖에 되 질 않을 것이다. 왜냐하면 이 모듈 내에서 공통으로 사용되면서 계속 저장되는 (save) 변수들은 이미 모듈 전역 변수들 로 정의되어 있기 때문이다. 또한 필요에 따라서 데이터들을 저장하는 배열들을 생성시킬 수 있다. 이 경우에는, 모듈 내의 함수들은 외부에서 집중적으로 불려지는 것(주요 함수)과 한 번 정도 불려지는 것들 (_initial, _final) 등으로 분류될 수 있다. 또한 현 모듈 내에서만 불려지면서 사용되는 서브 프로그램들이 있 다. 모듈 속에 선언된 전역 변수들도 마찬가지이다. 모듈 내에서만 사용되는 변수들도 일반적으로 있을 수 있다. END MODULE x_mo_du_le 이 모듈을 사용하려면 사용하고자 하는 함수, 주 프로그램, 또는 서브루틴 내에 USE x_mo_du_le (물론, USE x_mo_du_le, ONLY : xxx 처럼 선언하는 것이 더 강력한 프로그래밍 습관이다.)이라고 선언해 준다. 하지만, 그 선언되는 위치는 주의해야 한다. 보통 implicit none 위에서 선언한다. 엄청나게 앞에서 선언되는 것이다. 현 함수에서 선언되는 변수들 보다 항상 앞선다는 것이다. 여러 개의 모듈들은 동시에 사용할 경우 연속해서 한 줄 단위로 추가하여 적어두면 될 것이다. 이렇게 하면 앞서 이야기한 public이 허용하는 부함수들 또는 (가변) 변수들이 현 함수 내에서 접근/조작이 가능해지는 것이다. 물론, 각 모듈들 내에서 private변수들은 현 함수에서 볼 수가 없다. 만약, 현 함수에서 implicit none을 사용했다면, 프로그램들을 컴파일할 때 즉시, 잘못 사용되고 있는 변수들을 찾아낼 확률이 상당히 높아지는 것이다. (물론, 이것이 프로그래밍에서 함정이 될 수 도 있다. 우연히 지역변수를 선언하고 사용하고 있는데, 이것이 다른 모듈 속에서 온 것으로 착각하고 프 로그램을 하는 경우이다.) 이러한 자체 체크 기능은 상당히 중요한 의미를 부여한다. 여러 명이 동시에 일을 하다보면 뜻하지 않은 일들이 많이 발생하게 된다. 혼자 프로그램을 만들어도 마찬가지이다. 항상 그 내용과 이름을 다 기억하고 있을 수는 없을 것이다. 시간이 지나고 다음에 다시 조금 수정할 때에도 마찬가지이다. 안전사고의 미연 방지는 아무리 강조해도 지나치지 않다. 포트란 프로그램에서 `시스템 콜하기`; 파이썬과의 결합?포트란 프로그램에서 CALL SYSTEM('application. (13 of 114) 오전 10:21:34

14 py')처럼 파이썬 스크립트를 직접 불러서 사용할 수도 있다. 이러한 경우 call system이전에 필요한 자료들을 파일로 정리해둔 다음 시스템으로 잠시 나간 다음 시스템에서 준비된 파이썬 스크립트가 자료를 사용할 수 있게 설계할 수 있다. 물론 외부의 프로그램들 (스크립트에서 준비) 등으로 자료처리 또는 계산을 수행한 다 음 다시 포트란 프로그램으로 되돌아 오는 방법이 있다. 물론 돌아오기 전에 포트란 프로그램에서 자료를 읽 어들일 수 있도록 파일들을 미리 만들어주면 좋겠다, 물론 파이썬 스크립트가 관리를 해야 할 것이다. 마지막 으로 포트란 프로그램에서 준비된 자료들을 읽어들여서 계속하여 포트란 프로그램으로 계산을 수행할 수 있 다. 자료 적어두기: 파일열기/적기 ==포트란 명령으로 수행 call system('python_driver.py') ==포트란에서 빠져 나와서 파이썬 스크립트 실행하기. 자료 읽어들이기: 파일 열기/읽기 ==포트란 명령으로 수행 유닉스 프롬프트 상에서 아래와 같이 abc.exe라는 실행화일을 실행시키면 nohup abc.exe >output_file_name & 사용자 계정에서 로그아웃해도 프로그램 실행이 죽지 않는다. derived-type statement type sphere real*8 :: cx,cy,cz,radius end type sphere type (sphere) :: a_ball, b_ball 인터넷에 공개된 포트란90 관련 자료들 lapack, blas, atlas (14 of 114) 오전 10:21:34

15 간단한 모형들 프로그램 분석을 위해서 프로그램을 프린터할 때 a2ps -o output.ps <input.f90 처럼 a2ps프로그램을 이용하면 보기 좋은 PS파일이 생긴다. 모형 (1) 하나의 간단한 변수 저장 창고, globy라고 이름 붙여진 정보 저장창고이다. 접근 가능한 모든 부 프 로그램들에 의해서 참조 및 변수값의 변화가 가능하다. save로 저장되기 때문에 계속적으로 변화가 업데이 트 된다. 이러한 데이터 창고가 여러 개 있을 수도 있다. 이 정도는 FORTRAN77의 named common 정도로 해 석될 수 있다. {common /aaa/ ig1,ig2,ag1,ag2,ag3} 물론, 크기가 정해진 배열이 포함될 수도 있다. 배열의 크기 가 미리 정해지지 않은 경우는 아래에 있는 예제들에서 다룬다. 실행할 때 그 크기를 정하고 계속사용한다. MODULE globy implicit none real*8, save :: global_variable1,global_variable2 이러한 경우 default를 따라서 모두 다 public하다. integer, save :: iglobal1,iglobal2 END MODULE globy 하나의 데이터 저장 창고이다. 가장 간단한 예이다. 필요에 따라서 아래의 예에서와 같이 각종 형태의 가변 배열도 선언할 수 있다. integer, allocatable :: ijk(:) MODULE globy implicit none PUBLIC SAVE real*8 global_variable1,global_variable2 integer iglobal1,iglobal2 END MODULE globy PROGRAM main1 USE globy implicit none보다 위에 위치한다. 컴파일할 때도 마찬가지이다. "globy"를 가지고 있는 상황에서 컴파일 이 진행될 수 있다. USE globy, ONLY : iglobal1 IMPLICIT NONE REAL*8 a1,a2,a3 INTEGER ia1,ia2,ia3 READ(5,*) igloval1, iglobal2 READ(5,*) global_variable1,global_variable2...중략... END PROGRAM main1 위와 같은 형식의 여러 가지 모듈들을 사용하여 필요한 프로그램 단위들에 걸쳐서 사용할 수 있다. 즉, 필요 한 프로그램 단위에 USE를 사용하여 데이터를 공유하고 변화시킨다. (15 of 114) 오전 10:21:34

16 MODULE v_globy arrays to be shared... IMPLICIT NONE PUBLIC SAVE REAL(8), ALLOCATABLE :: v_global(:,:) INTEGER, ALLOCATABLE :: i_global(:) INTEGER ii,jj,kk REAL(8) aa,bb,cc, ddd(100,10) END MODULE v_globy 가변 배열을 포함하는 형식이다. 포트란77과 비교하면 상당한 수준의 발전을 느낀 다. 프로그래머가 필요한 메모리 할당량을 구체적 프로그램 실행 시에 조절할 수 있게 해 준다. 더 이상 필요 하지 않을 경우 소멸시킬 수 있다. 사용하는 입장에서는 가변 배열의 길이가 할당되었는지를 확인하고 사용 하면 된다. 예를 들어, 아래와 같이. if(.not. allocated(v_global)) then allocate(v_global(ii,jj)) endif 마찬가지로 필요가 없을 때 해당 모듈을 사용하는 적절한 프로그램 단위에서 deallocate(v_global)할 수 있다. 물론, 할당된 배열인지 구분을 위해서 allocated()함수를 사용할 수 있다. 여기에 제시된 모듈의 형식은 아주 단편적인 것이다. 보다 전문적으로 사용되는 모듈의 형태를 알아 둘 필요가 있다. 할당되었는지를 확인하고 또한 필요없을 경우 할당량을 없애 버리는 작업: if(allocated(v_globy)) deallocate(v_globy) 모형 (2) MODULE xmodule IMPLICIT NONE PUBLIC 이번엔 기본 public입니다. SAVE REAL*8, allocatable :: ak(:,:,:),qq(:,:,:),gradix(:,:,:) "::" 가 반드시 있어야 한다. REAL*8, allocatable :: force(:,:,:),vofqj(:),xmass1(:) REAL*8, allocatable :: eksq(:,:,:),fk(:,:,:) REAL*8 :: tau,xmu,xmass,onma,object,etarget,detar,amp,fdeltak,xnu,ttarget REAL*8 penalty0,penalty1,penalty2,penalty3 CHARACTER*2, allocatable :: isymbol(:) INTEGER np,nk,natom,itang,iprint,itmax_relax INTEGER :: iatom_1,iatom_2,iatom_3 INTEGER iatom_1 처럼 선언해도 된다. 즉, :: 없이 선언할 수 있다. LOGICAL lfirst_xim,llast_xim LOGICAL :: lneb,lcho,lpar,lclimb,lkntar LOGICAL :: lperpath REAL*8 :: aperc,pamp PRIVATE :: qq,gradix,force,eksq,fk 기본 public인데, 이들은 private임을 명시하고 있다. 이들은 현재의 모듈 내에서만 사용될 수 있다는 뜻이다. 다른 곳에서는 보이지 않는다. 부 프로그램 이름, 변수 이름등이 private라는 특성 을 가질 수 있다. CONTAINS SUBROUTINE alphaomega(nvar,xarray) USE impose_mod 또 다른 모듈을 사용할 때, 제일 앞 쪽에서 선언한다. implicit none보다 더 앞서서... IMPLICIT NONE INTEGER nvar REAL*8 xarray(nvar) REAL*8 pi,tmv(3),uu,us,uf,du,del REAL*8 tmp,ej,vofqj_max,vofqj_min REAL*8, ALLOCATABLE :: work1(:),work2(:) INTEGER, ALLOCATABLE :: ind1(:),ind2(:) REAL*8 rmsvalue REAL*8, ALLOCATABLE :: xtmp(:),ytmp(:),ztmp(:) REAL*8, ALLOCATABLE :: xtmq(:),ytmq(:),ztmq(:) (16 of 114) 오전 10:21:34

17 INTEGER k,j,kp,iatom,natomold,nkold LOGICAL lexist CHARACTER*2 ichar,jchar LOGICAL latomic_a,latomic_b REAL ranmar...중략... 첫 번째 call인지 마지막 call인지를 판단하여 각각 allocate,deallocation을 실행하고 입력/출력 정리를 행한다. RETURN END SUBROUTINE alphaomega SUBROUTINE genthetax(theta,posi,grad,nn) IMPLICIT NONE INTEGER nn REAL*8 theta REAL*8 posi(nn),grad(nn) 외부와 직접 통신하는 변수들입니다. 명목적으로는, 형식상 모듈 내의 변수들과 전혀 상관 없습니다. REAL*8, allocatable :: works(:) REAL*8, allocatable :: workt(:) REAL*8 tmv(3),tmw(3),tang(3),tnu(3),tangp(3),tangm(3) 3-d problem REAL*8 cc,ac,uu,us,uf,du REAL*8 tmr,tmq,ej,pi,del,tmp,fphi,e_ref,e_max INTEGER iatom,j,k,kp REAL*8 tjaver,zz 이들은 국소 변수들 (local variables)이다. 모듈 내의 다른 함수들/전역변수들과는 전혀 상관없다. 설 사 이름이 같다고 하더라도 전혀 상관없다. decoding ---[ DO iatom=1,natom kp=3*nk*(iatom-1) DO k=1,nk ak(iatom,1,k)=posi(kp+3*(k-1)+1) ak(iatom,2,k)=posi(kp+3*(k-1)+2) ak(iatom,3,k)=posi(kp+3*(k-1)+3) ENDDO ENDDO 중략 posi,grad는 주 함수에서만 정의된 일차원 변수이다. 사실 상 이 변수들이 현 모듈에서는 2차원 배열등이 될 수도 있 다. 예를 들면, 동적인 변수 최적화의 경우 lbfgs같은 루틴들은 1차원 배열을 입출력으로 요구하는 반면, 현 모듈 내에 서는 이것이 원자의 위치를 나타내는 변수로서 2차원 배열일 수 있다. 이럴 경우 적절한 이들의 관계를 잘 정의하여 사용할 수 있다. decoding과 encoding을 본 루틴의 맨 앞 부분과 맨 뒤 부분에 정의해 두면 아주 편리하다. END SUBROUTINE genthetax 중략 (17 of 114) 오전 10:21:34

18 END MODULE xmodule 하나의 전형적인 모듈 모형을 아래에 표시했다. module xxx implicit none private save... public :: yy,zz,...얼로케이터블 배열명, 변수명, 함수명, 부함수명,...: 이 모듈 밖에서 USE를 사용해서 사 용할 수 있고, 변화시킬 수 있는 것들. contains subroutine xxx_initial(...) implicit none 지역 변수 선언 (가변배열, 배열, 실수, 정수,...) 이곳에서 독립적으로 선언문을 만들 수 있다. 선언문 형식으로 배열, 가변 배열, 실수, 정수등을 선언할 수 있 다. 따라서, 이 들은 이 부 프로그램에서만 사용되는 지역변수들이다. 예를 들면, 특정한 인수들을 이용하여 현 모듈에서 필요로 하는 객체들을 준비한다. allocate(...,...)... end subroutine xxx_initial subroutine xxx_final implicit none 지역 변수 선언 (가변배열, 배열, 실수, 정수,...) 모듈을 종료하는 프로그램 deallocate(..,..)... end subroutine xxx_final subroutine xxx_maijor implicit none 지역 변수 선언 (가변배열, 배열, 실수, 정수,...) 현 모듈이 추구하는 주된 계산들을 행한다.... end subroutine xxx_major subroutine xxx_subs1 현 모듈 밖에서 결코 사용되질 않는다면, 모듈에서, 전역변수 선언하는 곳에서, private라고 명시해줄 필요가 있다. implicit none 지역 변수 선언 (가변배열, 배열, 실수, 정수,...) 몇 가지의 보조 프로그램들이 필요할 수 있다.... end subroutine xxx_sub1 (18 of 114) 오전 10:21:34

19 subroutine xxx_subs2 implicit none 지역 변수 선언 (가변배열, 배열, 실수, 정수,...) 현 모듈 내에서만 사용될 수도 있다. 모듈 속에서 공통으로 사용가능한 정보들은 그냥 접근할 수 있다. 변화 시킬 수도 있다. 전역변수이기 때문에.... end subroutine xxx_sub2 function ss 현 모듈 밖에서 결코 사용되질 않는다면, 모듈에서, 전역변수 선언하는 곳에서, private라고 명 시해줄 필요가 있다. implicit none 지역 변수 선언 (가변배열, 배열, 실수, 정수,...)... end function ss end module xxx 모형 (3) MODULE example1 IMPLICIT NONE PRIVATE 기본적으로 사적인 변수들만 있다. 예외는 아래에서와 같이 public으로 확실히 명시한다. SAVE 아래에 표시될 모든 변수들은 본 모듈 속에 안전하게 저장될 것이다. PUBLIC :: ex_action, ex_initial,ex_final INTEGER :: ia,ib,ic,ions 중략 FUNCTION dist(v1,v2) REAL*8 :: V1(3,ions),V2(3,ions),V12(3,ions),dist V12=V2-V1 ; dist=sqrt(sum(v12**2)) END FUNCTION dist FUNCTION unit(v1) REAL*8 :: V1(3,ions) REAL*8, dimension(3,ions) :: unit unit=v1*(1.0d0/sqrt(sum(v1*v1))) END FUNCTION unit 중략 모형 (4) lbfgs 알고리즘을 불러서 사용자 정의 함수 최소화하기: 사용자가 정의한 모듈 속 에서 사용자 정의 서브루틴 (genthetax)과 같이 아래에 있는 서브루틴이 나란히 정의되면 된다. (함수를 최소 화할 때 lbfgs는 상당히 유용한 루틴이다. 현실적으로 가장 빨리 함수를 최적화하는 루틴 중 하나로 보인다. SUBROUTINE lbfgs_header(theta,posi,grad,nn) written by In-Ho Lee, KRISS, Jan (19 of 114) 오전 10:21:34

20 IMPLICIT NONE INTEGER nn REAL*8 theta,posi(nn),grad(nn) integer n_local,m,msave real*8, allocatable :: diag(:),w(:) real*8 eps,xtol,gtol,t1,t2,stpmin,stpmax integer iprint(2),iflag,icall,mp,lp,j,nwork logical diagco The driver for LBFGS must always declare LB2 as EXTERNAL external lb2 common /lb3/mp,lp,gtol,stpmin,stpmax LBFGS는 포트란77로 만들어진 프로그램입니다. 바꾸고 싶은 생각이 전 혀 없습니다. 그냥 사용하는 것이 목표. 함수값과 gradient를 이용해서 함수 최소화시키는 루틴입니다. quasi Newton 방법으로 알려져 있습니다. n_local=nn m=5 ; msave=7 ; nwork=n_local*(2*msave+1)+2*msave allocate(diag(n_local),w(nwork)) iprint(1)= 1 ; iprint(2)= 0 We do not wish to provide the diagonal matrices Hk0, an therefore set DIAGCO to FALSE. diagco=.false. ; eps= 1.0d-3 ; xtol= 1.0d-16 ; icall=0 ; iflag=0 eps 가 작을수록 더욱더 정확한 함수 최소화를 실행한다. 20 continue call genthetax(theta,posi,grad,nn) 함수값과 gradient를 계속 계산하도록 되어있습니다. 함수 최소화와 관련된 작 업은 20 번 루프와 lbfgs루틴이 알아서 수행함. write(6,'(4e14.7,1x,e10.4,2x,e11.5)') theta,penalty0,penalty1,penalty2,onma,etarget grad의 부호가 -grad로 되면 계산이 안된다. 즉, lbfgs루틴은 정확히 gradient를 요구한다. -gradient, 즉, force를 사용하 면 안된다. call lbfgs(n_local,m,posi,theta,grad,diagco,diag,iprint,eps,xtol,w,iflag) if(iflag.le.0) go to 50 icall=icall + 1 We allow at most 2000 evaluations of Function and Gradient if(icall > 2000) go to 50 go to continue deallocate(diag,w) END SUBROUTINE lbfgs_header 모형 (5) program prime 솟수 (prime number) 찾기 프로그램 implicit none integer k,kk,m do k=101,999,2 kk=k/2 do m=3,kk,2 3부터 시작하여 kk까지 변하지만, 각 단계마다 2씩 증가한다. if(k == (k/m)*m ) cycle enddo (20 of 114) 오전 10:21:34

21 write(6,*) k enddo end program prime 모형 (6) program area implicit none real*8 a,b,c,s,p,aaa read(5,*) a,b,c p=a+b+c s=p/2.0d0 aaa=sqrt(s*(s-a)*(s-b)*(s-c)) write(6,*) aaa stop end program area 모형 (7) implicit none integer n,k read(5,*) n k=2 30 if (n/k*k == n) goto 70 매우 직설적인 표현 k=k+1 if(k <= n/2) goto 30 아주 직설적으로 갈 곳을 정해주는 경우 write(6,*) n,' is a prime' stop 70 continue write(6,*) n, ' is not a prime' stop end 모형 (8) implicit none real*8 a,b,c real*8 d read(5,*) a,b,c d=b**2-4.d0*a*c if(d < 0.0d0)then write(6,*) 'NO REAL ROOTS' endif if(d == 0.0d0)then write(6,*) 'two identical roots' write(6,*) -b/(2.d0*a) endif if(d> 0.0d0)then write(6,*) 'two distinct roots' write(6,*) (-b+sqrt(d))/(2.0d0*a) (21 of 114) 오전 10:21:34

22 write(6,*) (-b-sqrt(d))/(2.0d0*a) endif stop end 모형 (9) implicit none integer n,nn real*8 a,b real(8) x,f,area,h,s integer k f(x)=((3.0d0*x-4.0d0)*x+6.0d0)*x+5.0d0 read(5,*) a,b,n h=(b-a)/float(n) nn=n-1 s=f(a)+f(b) do k=1,nn s=s+2.0d0*f(a+float(k)*h) enddo area=h*s/2.0d0 write(6,*) a,b,area stop end 모형 (10) 모형 (11) 예제 (1) 간결하면서도 강력한 포트란90의 자료처리 기법들을 맛 보시죠. 감각적이면서도 효과적인 자료처리, 마치 상대수비수들 사이로 보이는 아군에게 찔러주는 정확한 전진패스같은 시원한 맛이 나는데요. 내가 너무 오 버를 하는군요. 간결한 함수들은 컴파일러에 의해서 좀더 좋은 식 (해당 기계에 적합한 형식으로 계산이 될 것입니다. program conjugate_gradient implicit none integer iters, its, n logical :: converged real*8 :: tol, up, alpha, beta real*8, allocatable :: a(:,:), b(:), x(:), r(:), u(:), p(:), xnew(:) read(5,*) n, tol, its (22 of 114) 오전 10:21:34

23 allocate( a(n,n), b(n), x(n), r(n), u(n), p(n), xnew(n) ) 적절한 메모리 확보 open(10, file='data') read(10,*) a read(10,*) b close(10) x=1.d0 모든 컴포넌트가 1.d0로 초기화됩니다. r=b-matmul(a,x) 군더더기가 하나도 없군요. 당연히 매트릭스 곱하기 벡터죠. p=r 벡터가 복사됩니다. iters=0 do do loop 형식입니다. iters=iters+1 u=matmul(a,p) up=dot_product(r,r) 당연히 내적(inner product)이죠. alpha=up/dot_product(p,u) xnew=x+p*alpha r=r-u*alpha 여기서 알파는 숫자입니다. beta=dot_product(r,r)/up p=r+p*beta beta는 숫자입니다. converged=(maxval(abs(xnew-x))/maxval(abs(x)) < tol) 컴포넌트들 다 조사하면서 가장 큰 컴포넌트를 찾습 니다. x=xnew 당연히 벡터의 복사이지요. if( converged.or. iters == its) exit do 루프의 탈출 신호입니다. enddo write(6,*) iters write(6,*) x deallocate( a,b,x,r,u,p,xnew ) end program conjugate_gradient 이제는 필요없어요. 토사구팽 real*8 avec(10),bvec(10), avalue=sum(avec*bvec) 는 결국, avec(1)*bvec(1)+avec(2)*bvec(2)+...와 같다. 또는, avalue=dot_product(avec,bvec) 처럼 표현할 수 있다. complex 양일 경우 sum(conjg(avec)*bvec) 와 같은 응용도 가능하다. 만약, logical avec(3),bvec(3)인 경우, (avec(1).and. bvec(1)).or. (avec(2).and. bvec(2)).or...를 의미 한다. 한 가지 주의할 점: matmul(amat,bmat)는 amat*bmat와 같지 않다. 행렬 곱합기가 정의될 때, 곱한 행렬 의 ij 원소는 sum(amat(i,:)*bmat(:,j)) 와 같다. 이와 같이 어떠한 일들을 할 때 우리는 procedure를 만든다. 하지 만, 많은 경우 이미 전문가들에 의해서 잘 개발된 procedure들이 있다. 이를 이용하는 것은 매우 효율적 (일반 으로 상당히 빠른 계산을 보장한다.), 경제적일 뿐만 아니라 안정적이다. 포트란90은 113가지 instrinsic procedure가 있다. 이들을 적극 이용하는 것이 좋겠다. 뿐만 아니라, 전문가들이 개발해둔 것들도 많이 있다. BLAS (Basic Linear Algebra Subroutines) : vector, matrix-vector, matrix-matrix 계산들. LaPACK (linear algebra package) : 이들은 아주 최적화된 것이다. ATLAS, FFTW, NAG, IMSL : 참조: Python을 위 하여 개발된 모듈 Numeric python은 ATLAS를 사용한다. 예제 (2) hermitian matrix diagonalization implicit none integer nm,n,matz,ierr real*8, allocatable :: ar(:,:),ai(:,:),w(:),zr(:,:),zi(:,:),fv1(:),fv2(:),fm1(:,:) real*8 tmp integer i,j,k (23 of 114) 오전 10:21:34

24 matz=0 matz=1 nm=3 n=nm open(1,file='input',form='formatted') read(1,*) n close(1) write(6,*) n,' n' allocate(ar(nm,n),ai(nm,n),w(n),zr(nm,n),zi(nm,n),fv1(n),fv2(n),fm1(2,n)) do i=1,n do j=1,i 소위 lower-triangular-form으로 저장하고 있습니다 [ set up the hermitian matrix : lower triangular form ar(i,j)=dfloat(i+j)**2 ai(i,j)=1.d0/dfloat(i-j) ] if(i == j) ai(i,j)=0.0d0 hermitian 이기 때문에 반드시 만족해야 함 enddo enddo do i=1,n do j=1,i ar(j,i)=ar(i,j) ai(j,i)=-ai(i,j) enddo enddo call ch(nm,n,ar,ai,w,matz,zr,zi,fv1,fv2,fm1,ierr) write(6,*) 'eigenvalues' do i=1,n write(6,*) w(i) enddo write(6,*) 'eigenvectors' do j=1,n write(6,*) (dcmplx(zr(k,j),zi(k,j)),k=1,n) enddo do i=1,n do j=1,n tmp=0.0d0 do k=1,n tmp=tmp+dcmplx(zr(k,i),-zi(k,i))*dcmplx(zr(k,j),zi(k,j)) enddo write(6,*) i,j,tmp enddo enddo deallocate(ar,ai,w,zr,zi,fv1,fv2,fm1) stop end 더 이상 필요하지 않은 배열들의 메모리 할당을 풀어줍니다. (24 of 114) 오전 10:21:34

25 다운받은 ch.f 프로그램사용 (eispack) 입력 3 출력 3 n eigenvalues eigenvectors ( , ) ( , ) ( , ) ( , ) ( , ) ( , ) ( , E-002) ( , E-002) ( , ) E E E E E E 예제 (3) LBFGS루틴을 이용하여 함수를 국소 최적화하기입니다. local optimization 방법입니다. subroutine lbfgs_mini(object,posi,grad,nn) Written by In-Ho Lee, KRISS, March 3 (2003). USE sma, ONLY : sma_energy_force,tolatx,tocarx,l_pbc implicit none integer nn real*8 object,posi(nn),grad(nn) integer n_local,m,msave real*8, allocatable :: diag(:),w(:) real*8 eps,xtol,gtol,t1,t2,stpmin,stpmax integer iprint(2),iflag,icall,mp,lp,nwork integer jnatom,j logical diagco real*8, allocatable :: xyz(:,:),fxyz(:,:) real*8, allocatable :: xyz_car(:,:) The driver for LBFGS must always declare LB2 as EXTERNAL external lb2 (25 of 114) 오전 10:21:35

26 common /lb3/mp,lp,gtol,stpmin,stpmax n_local=nn m=5 ; msave=7 ; nwork=n_local*(2*msave+1)+2*msave allocate(diag(n_local),w(nwork)) iprint(1)= 1 ; iprint(2)= 0 We do not wish to provide the diagonal matrices Hk0, and therefore set DIAGCO to FALSE. diagco=.false. ; eps= 1.0d-4 ; xtol= 1.0d-16 ; icall=0 ; iflag=0 For a tight convergence : eps=1.d-7 jnatom=nn/3 allocate(xyz(jnatom,3),fxyz(jnatom,3)) allocate(xyz_car(jnatom,3)) if(l_pbc)then do j=1,jnatom xyz(j,1)=posi(3*(j-1)+1) xyz(j,2)=posi(3*(j-1)+2) xyz(j,3)=posi(3*(j-1)+3) enddo call tocarx(xyz,xyz_car) do j=1,jnatom posi(3*(j-1)+1)=xyz_car(j,1) posi(3*(j-1)+2)=xyz_car(j,2) posi(3*(j-1)+3)=xyz_car(j,3) enddo endif 20 continue do j=1,jnatom xyz_car(j,1)=posi(3*(j-1)+1) xyz_car(j,2)=posi(3*(j-1)+2) xyz_car(j,3)=posi(3*(j-1)+3) enddo if(l_pbc)then call tolatx(xyz_car,xyz) else xyz=xyz_car endif call sma_energy_force(xyz,fxyz,object) write(6,'(e14.7)') object do j=1,jnatom grad(3*(j-1)+1)=-fxyz(j,1) grad(3*(j-1)+2)=-fxyz(j,2) grad(3*(j-1)+3)=-fxyz(j,3) enddo lbfgs requires a gradient, not a force call lbfgs(n_local,m,posi,object,grad,diagco,diag,iprint,eps,xtol,w,iflag) if(iflag.le.0) go to 50 icall=icall + 1 We allow at most 2000 evaluations of Function and Gradient if(icall > 2000) go to 50 go to continue deallocate(diag,w) (26 of 114) 오전 10:21:35

27 if(l_pbc)then do j=1,jnatom xyz_car(j,1)=posi(3*(j-1)+1) xyz_car(j,2)=posi(3*(j-1)+2) xyz_car(j,3)=posi(3*(j-1)+3) enddo call tolatx(xyz_car,xyz) do j=1,jnatom posi(3*(j-1)+1)=xyz(j,1) posi(3*(j-1)+2)=xyz(j,2) posi(3*(j-1)+3)=xyz(j,3) enddo endif deallocate(xyz,fxyz) deallocate(xyz_car) return end subroutine lbfgs_header(energy,posi,grad,nn,itype) written by In-Ho Lee, KRISS, Jan USE sma, ONLY : sma_energy_force IMPLICIT NONE INTEGER nn CHARACTER*2 itype(1) REAL*8 energy,posi(1),grad(1) INTEGER n_local,m,msave REAL*8, allocatable :: diag(:),w(:) REAL*8 eps,xtol,gtol,t1,t2,stpmin,stpmax INTEGER iprint(2),iflag,icall,mp,lp,j,nwork LOGICAL diagco INTEGER iatom The driver for LBFGS must always declare LB2 as EXTERNAL external lb2 common /lb3/mp,lp,gtol,stpmin,stpmax n_local=nn m=5 ; msave=7 ; nwork=n_local*(2*msave+1)+2*msave allocate(diag(n_local),w(nwork)) iprint(1)= 1 ; iprint(2)= 0 We do not wish to provide the diagonal matrices Hk0, and therefore set DIAGCO to FALSE. diagco=.false. ; eps= 1.0d-3 ; xtol= 1.0d-16 ; icall=0 ; iflag=0 for a tight convergence : eps=1.d-7 diagco=.false. ; eps= 1.0d-7 ; xtol= 1.0d-16 ; icall=0 ; iflag=0 20 continue call sma_energy_force(itype,posi,grad,energy) do iatom=1,nn grad(iatom)=-grad(iatom) grad(iatom)=-grad(iatom) grad(iatom)=-grad(iatom) enddo write(6,'(e22.12,2x,a6)') energy,'energy' (27 of 114) 오전 10:21:35

28 call lbfgs(n_local,m,posi,energy,grad,diagco,diag,iprint,eps,xtol,w,iflag) if(iflag.le.0) go to 50 icall=icall + 1 We allow at most 2000 evaluations of Function and Gradient if(icall > 2000) go to 50 go to continue deallocate(diag,w) end subroutine lbfgs_header 예제 (4) dihedral angle 계산과 4개 원자위치에 대한 dihedral angle의 미분 module dihedral_angle Written by In-Ho Lee, KRISS, October 4 (2003). implicit none private save real*8 diangle,dadi(3),dadj(3),dadk(3),dadl(3) public :: mk_diangle,diangle,dadi,dadj,dadk,dadl contains subroutine mk_diangle(ri,rj,rk,rl) implicit none real*8 ri(3),rj(3),rk(3),rl(3) real*8 rij(3),rkj(3),rkl(3),xnorm_ij_kj,xnorm_kj_kl real*8 rij_kj(3),rkj_kl(3),rtmp(3),xnorm_kj,xnorm_mj,xnorm_nk real*8 rmj(3),rnk(3),xxr,xxi real*8 argu,qsign rij=ri-rj ; rkj=rk-rj ; rkl=rk-rl call cross(rij,rkj,rij_kj) call cross(rkj,rkl,rkj_kl) call cross(rij_kj,rkj_kl,rtmp) xnorm_ij_kj=sqrt(dot_product(rij_kj,rij_kj)) xnorm_kj_kl=sqrt(dot_product(rkj_kl,rkj_kl)) argu=dot_product(rij_kj,rkj_kl)/(xnorm_ij_kj*xnorm_kj_kl) ; argu=min(1.0d0,max(-1.0d0,argu)) qsign=1.0d0 ; if(dot_product(rkj,rtmp) < 0.0d0) qsign=-1.0d0 diangle=qsign*acos(argu) call cross(rij,rkj,rmj) call cross(rkj,rkl,rnk) xnorm_kj=sqrt(dot_product(rkj,rkj)) xnorm_mj=sqrt(dot_product(rmj,rmj)) xnorm_nk=sqrt(dot_product(rnk,rnk)) dadi(:)=rmj(:)*xnorm_kj/xnorm_mj**2 dadl(:)=-rnk(:)*xnorm_kj/xnorm_nk**2 xxr=dot_product(rij,rkj)/xnorm_kj**2-1.0d0 xxi=dot_product(rkl,rkj)/xnorm_kj**2 dadj(:)=xxr*dadi(:)-xxi*dadl(:) xxr=dot_product(rkl,rkj)/xnorm_kj**2-1.0d0 (28 of 114) 오전 10:21:35

29 xxi=dot_product(rij,rkj)/xnorm_kj**2 dadk(:)=xxr*dadl(:)-xxi*dadi(:) dadi=dadi*qsign dadj=dadj*qsign dadk=dadk*qsign dadl=dadl*qsign end subroutine mk_diangle subroutine cross(r1,r2,r3) implicit none real*8 r1(3),r2(3),r3(3) r3(1) = r1(2)*r2(3)-r1(3)*r2(2) r3(2) = r1(3)*r2(1)-r1(1)*r2(3) r3(3) = r1(1)*r2(2)-r1(2)*r2(1) end subroutine cross end module dihedral_angle =================================================================================== =================================================================================== 포트란90에서의 배열들과 관련된 메모리 관리: 결국 프로그램을 실행할 때 시스템의 메모리가 허용하는 한 프로그램을 다시 컴파일할 필요가 없도록 만들어 줍니다. integer m,n real*8, allocatable :: a(:,:) allocate(a(n,m)) a=0.0d0 생성된 배열 a는 당연히 다른 부 프로그램들에서 불려질 수 있다. 서브루틴, 함수의 인수로 사용될 수 있다. 특히, 여러 번 반복해서 불리어질 경우 해당하는 배열들의 메모리 할당여부가 불려지는 상황에 따라 달라질 수 있다. 즉, 처음 불려질 경우에는 메모리 할당이 되어있지 않는 상황이다. 이 경우 해당 배열의 allocation이 필요하다. 그 다음번 부터는 그 내용이 달라지기 때문에 메모리 할당부분은 필요가 없다. 이러한 상황을 대비 해서 프로그램할 필요가 있다. 또는 if(.not. allocated(a)) allocate(a(n,m)) 마찬가지로, 배열 a에 대한 메모리 할당이 되었었는지, 잘 모를 때는 그냥 아래와 같이 질문하고 행동을 취할 수 있다. deallocate(a) 또는 if(allocated(a)) deallocated(a) 아래의 프로그램에서는 기본적으로 사용되는 구문들을 나열했습니다. 한 번 눈으로만 확인하면 그냥 그 의 미를 알아차릴 수 있는 것들입니다. 물론, 정확한 의미의 파악을 위해서 책을 보는 것도 좋습니다 느낌표부터는 주석이 됩니다. PROGRAM xxx_1 IMPLICIT NONE INTEGER, PARAMETER :: idp=kind(0.d0) 파라미터는 프로그램 실행 중에 바뀌지 않는다는 의미입 (29 of 114) 오전 10:21:35

30 니다. CHARACTER*8 fnnd ; CHARACTER*10 fnnt 아래의 것과 같은 것입니다. CHARACTER(8) fnnd ; CHARACTER(10) fnnt LOGICAL ll1,ll2 INTEGER ii,jj,i,nn INTEGER :: kk,npt REAL*8 aa,pi REAL(8) bb,dx,xx REAL(idp) cc REAL(KIND=idp) dd REAL(KIND=idp) :: ee REAL(8) ff COMPLEX(idp) zz1,zz2,zz3 COMPLEX(idp) :: zz4 REAL(8), ALLOCATABLE :: xvector(:),xmatrix(:,:) REAL(8), ALLOCATABLE :: yvector(:) REAL(8), ALLOCATABLE :: ymatrix(:,:) REAL(8), ALLOCATABLE :: qvector(:) REAL(8) :: sma(3) REAL(8) smb(3) CALL DATE_AND_TIME(DATE=fnnd,TIME=fnnt) WRITE(6,*) ' ',' date ',fnnd,' time ',fnnt,' ' 파일이름이 input_file인 파일이 존재하는지 안 하는지를 판단한다. 즉, 아래의 명령이 실행되고 난 다음에 ll1이. true. 또는.false.인 지에 따라서 존재 여부가 알려지게 된다. INQUIRE(FILE='input_file',EXIST=ll1) pi=4.0d0*atan(1.0d0) WRITE(6,*) 'pi ',pi pi=acos(-1.0d0) WRITE(6,*) 'pi ',pi IF(ll1)THEN WRITE(6,*) 'file is present' ELSE WRITE(6,*) 'file is absent' ENDIF WRITE(6,*) idp,' idp' ll1=.true. ll2=.false. WRITE(6,*) ll1,' ll1' WRITE(6,*) ll2,' ll2' ii=0 jj=1 kk=-1 ll1= (1 == 2) ll2= (1 /= 2) IF(ii >= jj) ll1=.true. IF(ii == jj) ll2=.false. WRITE(6,*) ii,' ii' WRITE(6,*) jj,' jj' aa=0.0_idp note bb=0.0d0 cc=0.0d0 dd=0.0d0 zz1=0.0_idp zz2=cmplx(1.0_idp,2.0_idp) note (30 of 114) 오전 10:21:35

31 zz3=zz1+zz2 zz3=zz1-zz2 zz3=zz1*zz2 zz3=zz1/zz2 zz3=zz1**2 aa=real(zz3) bb=imag(zz3) cc=abs(zz3) zz4=conjg(zz3) WRITE(6,*) aa,' aa' WRITE(6,*) bb,' bb' WRITE(6,*) cc,' cc' WRITE(6,*) dd,' dd' WRITE(6,*) zz1,' zz1' WRITE(6,*) zz2,' zz2' 파일 단위 5번은 기본 입력 단위로 사용되고 파일 단위 6은 기본 출력 단위로 사용된다. 그 이외의 단위 1,,,,,,99는 아 래와 같이 사용되면 된다. 입/출력 모두 다 같은 방식으로 사용됨. OPEN(1,FILE='output1',FORM='FORMATTED') WRITE(1,'(i8)') ii WRITE(1,'(2i8)') ii,jj WRITE(1,'(i8,2x,i8)') ii,jj WRITE(1,'(i8,2x,i8,3x,a5)') ii,jj,'ii,jj' WRITE(1,*) aa,' aa' WRITE(1,*) bb,' bb' WRITE(1,*) cc,' cc' WRITE(1,*) dd,' dd' WRITE(1,*) zz1,' zz1' WRITE(1,*) zz2,' zz2' CLOSE(1) OPEN(2,FILE='output2',FORM='FORMATTED') WRITE(2,'(i8)') ii WRITE(2,'(2i8)') ii,jj CLOSE(2) sma=0.0d0 smb=1.0d0 ii=10 jj=10 nn=ii ALLOCATE(xvector(nn)) ; ALLOCATE(yvector(nn)) ALLOCATE(xmatrix(nn,nn)) ALLOCATE(ymatrix(nn,nn)) ALLOCATE(qvector(0:nn)) 0부터 시작하여 nn까지 index를 가지는 경우입니다. IF(ALLOCATED(xvector))THEN WRITE(6,*) 'xvector is allocated' WRITE(6,*) 'size ', SIZE(xvector) DO i=1,nn xvector(i)=float(i) ENDDO yvector=-xvector ENDIF WRITE(6,*) 'sum ', SUM(xvector) WRITE(6,*) 'sum ', SUM(yvector) yvector=sqrt(abs(xvector)) 다. 할당되어 있으면 작업들어 갑니다. 왠 '작업' 각 항목을 절대값으로 취한다음 그 항목에 0.5승을 취하라는 명령입니 IF(ALLOCATED(xmatrix))THEN WRITE(6,*) 'xmatrix is allocated' (31 of 114) 오전 10:21:35

32 WRITE(6,*) 'size ', SIZE(xmatrix) ENDIF xvector=0.0d0 yvector=0.0d0 xmatrix=0.0d0 ymatrix=transpose(xmatrix) ymatrix(:,1)=yvector(:) yvector=matmul(xmatrix,xvector) dd=dot_product(xvector,yvector) 매트릭스 와 벡터의 곱을 실행하라는 명령입니다. 내적입니다. inner product dd=maxval(xvector) ee=minval(yvector) dd=maxval(abs(xvector)) dd=maxval(abs(xvector-yvector))/(maxval(abs(xvector))+maxval(abs(yvector))+1.0d-8) aa=sum(xvector)/float(size(xvector)) bb=product(yvector) DEALLOCATE(xvector) ; DEALLOCATE(yvector) DEALLOCATE(xmatrix) DEALLOCATE(ymatrix) DEALLOCATE(qvector) 파일이 존재하면 지우라는 명령입니다. INQUIRE(FILE='del',EXIST=ll1) IF(LL1)THEN WRITE(6,*) 'del is present' OPEN(11,FILE='del') CLOSE(11,STATUS='DELETE') 즉, 파일이 존재한다는 것을 확인하고 지워 버리는 작업을 하고 있습니다. ENDIF aa=0.0d0 bb=1.0d0 npt= dx=(bb-aa)/float(npt-1) cc=0.0d0 DO i=1,npt xx=aa+float(i-1)*dx cc=cc+ff(xx) ENDDO cc=cc*dx write(6,*) cc,' cc' STOP END PROGRAM xxx_1 FUNCTION ff(x) REAL(8) ff 결과물로서 반환되는 자료형태를 표시하고 있슴. REAL(8) x ff=x*x RETURN END FUNCTION ff do i=1,n,1 read(5,*) aaa(i) enddo read(5,*) (aaa(i),i=1,n,1) (32 of 114) 오전 10:21:35

33 read(5,*) ((f(i,j),i=1,3),j=1,2) i=1,2,3이 먼저 실행되고 주어진 j=1상태에서 그 다음 j=2상태에서 i=1,2,3순서로 실행이 된다. -C 배열에서 허용된 인덱스의 범위를 벗어날 때 프로그램이 중단되도록 하는 옵션 real*8 a(3,2),yone(6) 은 3*2=6 개의 실수를 가리키는 이차원 배열을 정의한다. 처음 숫자는 열(row)를 가리키는 숫자로 두번째는 행(column)을 가리키는 숫자이다. 이를 굳이 1차원형태의 자료로 생각할 경우 포트란에서는 아래의 경우처 럼 취급한다. a(1,1) a(2,1) a(3,1) a(1,2) a(2,2) a(3,2) ij=3*(j-1)+i a(i,j)로 표시할 때 일차원 인덱싱(yone이라는 일차원 배열, 물론, 이 배열의 크기는 6이다.)은 결국 위와 같이 될 수 있습니다. do i=1,3 do j=1,2 ij=3*(j-1)+i yone(ij)=a(i,j) enddo enddo akvector(natom,3,nk)와 같은 배열을 특정한 형식의 1차원 배열로 바꾸는(사용자 정한 형식) 예를 아래에 표시 했다. do iatom=1,natom kp=3*nk*(iatom-1) do k=1,nk xone(kp+3*(k-1)+1)=akvector(iatom,1,k) xone(kp+3*(k-1)+2)=akvector(iatom,2,k) xone(kp+3*(k-1)+3)=akvector(iatom,3,k) enddo enddo 이러한 배열의 차원 변경은 실제 응용프로그램 작성에서 중요한 의미를 가진다. 일반으로 물리량은 다차원 배열일 때 이해하기가 쉽다. 하지만, 전산물리학에서는 이 양들이 단순한 변수일뿐이라면, 전산학에서 제시 하는 루틴들은 동등하게 취급하는 특정 1차원 배열일 가능성이 농후하다. 이 때 결국 위와 같은 조작이 유용 하다. 메인 함수에서 A(3,2)로 선언되어 사용되다가 서브루틴으로 전송될 때. subroutine abc1(a) implicit none real*8 a(3,1) subroutine abc2(a) implicit none real*8 a(3,2) 위의 둘다 정당한 선언이 된다. 물론, 두 번째가 더 정확한 선언이다. 하지만, 첫 번째 선언도 정당하다. 하지 만, 아래의 경우는 거의 에러를 포함한 코드일 것이다. (데이터의 구조를 파괴하고 있기 때문이다.) subroutine abc3(a) implicit none real*8 a(1,2) (33 of 114) 오전 10:21:35

34 가장 많이 사용될 수 있는 형태 (포트란77에서) subroutine abc4(a,lda) implicit none integer lda real*8 a(lda,1) written by In-Ho Lee, School of Physics, KIAS, March 17, 1999 implicit real*8 (a-h,o-z) integer seed(1),old(1) character*8 d_ch character*10 t_ch character*5 zonechars integer values(8) integer, external :: time call date_and_time(date=d_ch, time=t_ch) write(6,'(a8,3x,a10)') d_ch,t_ch call date_and_time(d_ch,t_ch,zonechars,values) write(6,'(a8,3x,a10,3x,a5,3x)') d_ch,t_ch,zonechars write(6,'(8i5)') values call system_clock(istime) iiss=time(itemp) write(6,*) 'seed(1)' read(5,*) seed(1) call random_seed call random_seed(size=k) write(6,*) k,' k' call random_seed(put=seed(1:k)) call random_seed(get=old(1:k)) write(6,*) seed(1),' seed(1)' write(6,*) old(1),' old(1)' sum=0.0 do ji=1,1 do ii=1,10000 call random_number(tmp) sum=sum+sin(tmp) enddo enddo write(6,*) sum,' sum' call system_clock(iftime,irate) iiff=time(itemp) write(6,*) (iiff-iiss),' sec by time' write(6,*) (iftime-istime)/float(irate),' sec by system_clock' stop end 아래의 서브루틴은 정수를 정해진 자리수하에서 문자로 변환시키는 일을 수행한다. 예를 들어 정수 10을 '0010'과 같이 변환시킨다. 4자리를 확보하여 문자로 변환된 경우이다. ################################################### ## COPYRIGHT (C) 1992 by Jay William Ponder ## ## All Rights Reserved ## (34 of 114) 오전 10:21:35

35 ################################################### ############################################################# ## ## ## subroutine numeral -- convert number to text string ## ## ## ############################################################# "numeral" converts an input integer number into the corresponding right- or left-justified text numeral number integer value of the number to be transformed string text string to be filled with corresponding numeral size on input, the minimal acceptable numeral length, if zero then output will be right justified, if nonzero then numeral is left-justified and padded with leading zeros as necessary; upon output, the number of non-blank characters in the numeral subroutine numeral (number,string,size) implicit none integer i,number,size,multi,pos integer length,minsize,len integer million,hunthou,tenthou integer thousand,hundred,tens,ones character*1 digit(0:9) character*(*) string logical right,negative data digit / '0','1','2','3','4','5','6','7','8','9' / set justification and size bounds for numeral string if (size.eq. 0) then right =.true. size = 1 else right =.false. end if minsize = size length = len(string) test the sign of the original number if (number.ge. 0) then negative =.false. else negative =.true. number = -number end if use modulo arithmetic to find place-holding digits million = number / multi = * million hunthou = (number-multi) / (35 of 114) 오전 10:21:35

<C6F7C6AEB6F5B1B3C0E72E687770> 1-1. 포트란 언어의 역사 1 1-2. 포트란 언어의 실행 단계 1 1-3. 문제해결의 순서 2 1-4. Overview of Fortran 2 1-5. Use of Columns in Fortran 3 1-6. INTEGER, REAL, and CHARACTER Data Types 4 1-7. Arithmetic Expressions 4 1-8. 포트란에서의

More information

Computer Programming I, II, and III

Computer Programming I, II, and III FORTRAN 90 and Python KRISS http://ihlee.kriss.re.kr/compphys/f90module.htm http://ihlee.kriss.re.kr/compphys/pfphysics.htm Stay hungry, stay foolish. Language is the house of the truth of Being. -Martin

More information

<342EBAAFBCF620B9D720B9D9C0CEB5F92E687770>

<342EBAAFBCF620B9D720B9D9C0CEB5F92E687770> 예약어(reserved word) : 프로그래밍 언어에서 특별한 용도로 사용하고자 미리 지정한 단어 - 프로그램의 구성요소를 구별하게 해주는 역할 => 라벨, 서브 프로그램 이름, 변수에 연관되어 다른 변수나 서브 프로그램 등과 구별 - 식별자의 최대길이는 언어마다 각각 다르며 허용길이를 넘어서면 나머지 문자열은 무시됨 - FORTRAN, COBOL, HTML

More information

C 프로그래밍 언어 입문 C 프로그래밍 언어 입문 김명호저 숭실대학교 출판국 머리말..... C, C++, Java, Fortran, Python, Ruby,.. C. C 1972. 40 C.. C. 1999 C99. C99. C. C. C., kmh ssu.ac.kr.. ,. 2013 12 Contents 1장 프로그래밍 시작 1.1 C 10 1.2 12

More information

해양모델링 2장5~18 2012.7.27 12:26 AM 페이지6 6 오픈소스 소프트웨어를 이용한 해양 모델링 2.1.2 물리적 해석 식 (2.1)의 좌변은 어떤 물질의 단위 시간당 변화율을 나타내며, 우변은 그 양을 나타낸 다. k 5 0이면 C는 처음 값 그대로 농

해양모델링 2장5~18 2012.7.27 12:26 AM 페이지6 6 오픈소스 소프트웨어를 이용한 해양 모델링 2.1.2 물리적 해석 식 (2.1)의 좌변은 어떤 물질의 단위 시간당 변화율을 나타내며, 우변은 그 양을 나타낸 다. k 5 0이면 C는 처음 값 그대로 농 해양모델링 2장5~18 2012.7.27 12:26 AM 페이지5 02 모델의 시작 요약 이 장에서는 감쇠 문제를 이용하여 여러분을 수치 모델링 세계로 인도한다. 유한 차분법 의 양해법과 음해법 그리고 일관성, 정확도, 안정도, 효율성 등을 설명한다. 첫 번째 수치 모델의 작성과 결과를 그림으로 보기 위해 FORTRAN 프로그램과 SciLab 스크립트가 사용된다.

More information

Microsoft PowerPoint - PL_03-04.pptx

Microsoft PowerPoint - PL_03-04.pptx Copyright, 2011 H. Y. Kwak, Jeju National University. Kwak, Ho-Young http://cybertec.cheju.ac.kr Contents 1 프로그래밍 언어 소개 2 언어의 변천 3 프로그래밍 언어 설계 4 프로그래밍 언어의 구문과 구현 기법 5 6 7 컴파일러 개요 변수, 바인딩, 식 및 제어문 자료형 8

More information

금안13(10)01-도비라및목차1~13

금안13(10)01-도비라및목차1~13 ISSN 1975-667 13. 1 13. 1 1 1 8 8 6 6 5 5 1, 3.8 8 6 1.7 1.9 5 3.8 1 1 5-5 -1-1 5-5 6 3 67.7 3 1 8 65. 96.1 96.9 1 8 5 5 188.5 15 17.7 15-1 -.1 -.3 -.9-1 - -1.7 - -3-3 - - -5-5 -6-5.5-6

More information

Chapter ...

Chapter ... Chapter 4 프로세서 (4.9절, 4.12절, 4.13절) Contents 4.1 소개 4.2 논리 설계 기초 4.3 데이터패스 설계 4.4 단순한 구현 방법 4.5 파이프라이닝 개요*** 4.6 파이프라이닝 데이터패스 및 제어*** 4.7 데이터 해저드: 포워딩 vs. 스톨링*** 4.8 제어 해저드*** 4.9 예외 처리*** 4.10 명령어 수준

More information

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2

학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2 학습목표 함수프로시저, 서브프로시저의의미를안다. 매개변수전달방식을학습한다. 함수를이용한프로그래밍한다. 2 6.1 함수프로시저 6.2 서브프로시저 6.3 매개변수의전달방식 6.4 함수를이용한프로그래밍 3 프로시저 (Procedure) 프로시저 (Procedure) 란무엇인가? 논리적으로묶여있는하나의처리단위 내장프로시저 이벤트프로시저, 속성프로시저, 메서드, 비주얼베이직내장함수등

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 KeyPad Device Control - Device driver Jo, Heeseung HBE-SM5-S4210 에는 16 개의 Tack Switch 를사용하여 4 행 4 열의 Keypad 가장착 4x4 Keypad 2 KeyPad 를제어하기위하여 FPGA 내부에 KeyPad controller 가구현 KeyPad controller 16bit 로구성된

More information

<B3EDB9AEC0DBBCBAB9FD2E687770> (1) 주제 의식의 원칙 논문은 주제 의식이 잘 드러나야 한다. 주제 의식은 논문을 쓰는 사람의 의도나 글의 목적 과 밀접한 관련이 있다. (2) 협력의 원칙 독자는 필자를 이해하려고 마음먹은 사람이다. 따라서 필자는 독자가 이해할 수 있는 말이 나 표현을 사용하여 독자의 노력에 협력해야 한다는 것이다. (3) 논리적 엄격성의 원칙 감정이나 독단적인 선언이

More information

untitled

untitled Step Motor Device Driver Embedded System Lab. II Step Motor Step Motor Step Motor source Embedded System Lab. II 2 open loop, : : Pulse, 1 Pulse,, -, 1 +5%, step Step Motor (2),, Embedded System Lab. II

More information

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상

아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상 Android 용 Brother Image Viewer 설명서 버전 0 KOR 아이콘의 정의 본 사용자 설명서에서는 다음 아이콘을 사용합니다. 참고 참고는 발생할 수 있는 상황에 대처하는 방법을 알려 주거나 다른 기능과 함께 작동하는 방법에 대한 요령을 제공합니다. 상표 Brother 로고는 Brother Industries, Ltd.의 등록 상표입니다. Android는

More information

자바 프로그래밍

자바 프로그래밍 5 (kkman@mail.sangji.ac.kr) (Class), (template) (Object) public, final, abstract [modifier] class ClassName { // // (, ) Class Circle { int radius, color ; int x, y ; float getarea() { return 3.14159

More information

SIGIL 완벽입문

SIGIL 완벽입문 누구나 만드는 전자책 SIGIL 을 이용해 전자책을 만들기 EPUB 전자책이 가지는 단점 EPUB이라는 포맷과 제일 많이 비교되는 포맷은 PDF라는 포맷 입니다. EPUB이 나오기 전까지 전 세계에서 가장 많이 사용되던 전자책 포맷이고, 아직도 많이 사 용되기 때문이기도 한며, 또한 PDF는 종이책 출력을 위해서도 사용되기 때문에 종이책 VS

More information

BMP 파일 처리

BMP 파일 처리 BMP 파일처리 김성영교수 금오공과대학교 컴퓨터공학과 학습내용 영상반전프로그램제작 2 Inverting images out = 255 - in 3 /* 이프로그램은 8bit gray-scale 영상을입력으로사용하여반전한후동일포맷의영상으로저장한다. */ #include #include #define WIDTHBYTES(bytes)

More information

Microsoft Word - FunctionCall

Microsoft Word - FunctionCall Function all Mechanism /* Simple Program */ #define get_int() IN KEYOARD #define put_int(val) LD A val \ OUT MONITOR int add_two(int a, int b) { int tmp; tmp = a+b; return tmp; } local auto variable stack

More information

ActFax 4.31 Local Privilege Escalation Exploit

ActFax 4.31 Local Privilege Escalation Exploit NSHC 2013. 05. 23 악성코드 분석 보고서 [ Ransomware 악성코드 ] 사용자의 컴퓨터를 강제로 잠그고 돈을 요구하는 형태의 공격이 기승을 부리고 있 습니다. 이러한 형태의 공격에 이용되는 악성코드는 Ransomware로 불리는 악성코 드 입니다. 한번 감염 시 치료절차가 복잡하며, 보고서 작성 시점을 기준으로 지속 적인 피해자가 발생되고

More information

슬라이드 1

슬라이드 1 마이크로컨트롤러 2 (MicroController2) 2 강 ATmega128 의 external interrupt 이귀형교수님 학습목표 interrupt 란무엇인가? 기본개념을알아본다. interrupt 중에서가장사용하기쉬운 external interrupt 의사용방법을학습한다. 1. Interrupt 는왜필요할까? 함수동작을추가하여실행시키려면? //***

More information

»ê¾÷¿¬±¸¿øÇ¥Áö

»ê¾÷¿¬±¸¿øÇ¥Áö Contents Contents Contents Contents Contents Contents Contents 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Z = X i - X S S, X 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

More information

PL10

PL10 assert(p!=null); *p = 10; assert(0

More information

Microsoft PowerPoint - 04-UDP Programming.ppt

Microsoft PowerPoint - 04-UDP Programming.ppt Chapter 4. UDP Dongwon Jeong djeong@kunsan.ac.kr http://ist.kunsan.ac.kr/ Dept. of Informatics & Statistics 목차 UDP 1 1 UDP 개념 자바 UDP 프로그램작성 클라이언트와서버모두 DatagramSocket 클래스로생성 상호간통신은 DatagramPacket 클래스를이용하여

More information

Microsoft PowerPoint - AC3.pptx

Microsoft PowerPoint - AC3.pptx Chapter 3 Block Diagrams and Signal Flow Graphs Automatic Control Systems, 9th Edition Farid Golnaraghi, Simon Fraser University Benjamin C. Kuo, University of Illinois 1 Introduction In this chapter,

More information

컴파일러

컴파일러 YACC 응용예 Desktop Calculator 7/23 Lex 입력 수식문법을위한 lex 입력 : calc.l %{ #include calc.tab.h" %} %% [0-9]+ return(number) [ \t] \n return(0) \+ return('+') \* return('*'). { printf("'%c': illegal character\n",

More information

특목고 8-나 해설Ⅰ(001~024)OK

특목고 8-나 해설Ⅰ(001~024)OK I II III I Step - - - - - - - - 8 - - 0 - - - 9 - - 9 - - 00-8 - 90 - - 80-0 8-0 - - - - - 0 0 0-0 - - 8 - - - 00 8-00 8-0 0 8 - ( 8) ( ) ( ) ( ) ( ) ( ) ( ) ( ) 8 a a b b aabb bbaa abba baab abab baba

More information

MySQL-.. 1

MySQL-.. 1 MySQL- 기초 1 Jinseog Kim Dongguk University jinseog.kim@gmail.com 2017-08-25 Jinseog Kim Dongguk University jinseog.kim@gmail.com MySQL-기초 1 2017-08-25 1 / 18 SQL의 기초 SQL은 아래의 용도로 구성됨 데이터정의 언어(Data definition

More information

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어 개나리 연구소 C 언어 노트 (tyback.egloos.com) 프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어먹고 하더라구요. 그래서,

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Verilog: Finite State Machines CSED311 Lab03 Joonsung Kim, joonsung90@postech.ac.kr Finite State Machines Digital system design 시간에배운것과같습니다. Moore / Mealy machines Verilog 를이용해서어떻게구현할까? 2 Finite State

More information

04 Çмú_±â¼ú±â»ç

04 Çмú_±â¼ú±â»ç 42 s p x f p (x) f (x) VOL. 46 NO. 12 2013. 12 43 p j (x) r j n c f max f min v max, j j c j (x) j f (x) v j (x) f (x) v(x) f d (x) f (x) f (x) v(x) v(x) r f 44 r f X(x) Y (x) (x, y) (x, y) f (x, y) VOL.

More information

K&R2 Reference Manual 번역본

K&R2 Reference Manual 번역본 typewriter structunion struct union if-else if if else if if else if if if if else else ; auto register static extern typedef void char short int long float double signed unsigned const volatile { } struct

More information

수리 영역 가 형 5. 다음 그림과 같이 크기가 같은 정육면체 개가 한 모서리씩을 공유하 면서 각 면이 평행 또는 수직 관계를 유지한 채로 한 평면 위에 놓여있 다. 그림의 세 꼭짓점 A, B, C에 대한 두 벡터 BA 와 BC 가 이루는 각 의 크기를 h라 할 때,

수리 영역 가 형 5. 다음 그림과 같이 크기가 같은 정육면체 개가 한 모서리씩을 공유하 면서 각 면이 평행 또는 수직 관계를 유지한 채로 한 평면 위에 놓여있 다. 그림의 세 꼭짓점 A, B, C에 대한 두 벡터 BA 와 BC 가 이루는 각 의 크기를 h라 할 때, 제``교시 수리 영역( 가 형) 시간:00분 점수:00점 성명 수험 번호 쭚 반드시 본인이 선택한 유형( 가 형 또는 나 형)의 문제인지 확인하시오. 쭚 문제지와 답안지에 성명과 수험 번호를 정확히 기입하시오. 쭚 MR 답안지에 성명, 수험 번호, 응시 유형 및 선택 과목, 답 등을 표기할 때에는 반드시 수험생이 지켜야 할 사항 에 따라 표기하시오. 쭚 문항에

More information

XSS Attack - Real-World XSS Attacks, Chaining XSS and Other Attacks, Payloads for XSS Attacks

XSS Attack - Real-World XSS Attacks, Chaining XSS and Other Attacks, Payloads for XSS Attacks XSS s XSS, s, May 25, 2010 XSS s 1 2 s 3 XSS s MySpace 사건. Samy (JS.Spacehero) 프로필 페이지에 자바스크립트 삽입. 스크립트 동작방식 방문자를 친구로 추가. 방문자의 프로필에 자바스크립트를 복사. 1시간 만에 백만 명이 친구등록. s XSS s 위험도가 낮은 xss 취약점을 다른 취약점과 연계하여

More information

152*220

152*220 152*220 2011.2.16 5:53 PM ` 3 여는 글 교육주체들을 위한 교육 교양지 신경림 잠시 휴간했던 우리교육 을 비록 계간으로이지만 다시 내게 되었다는 소식을 들으니 우 선 반갑다. 하지만 월간으로 계속할 수 없다는 현실이 못내 아쉽다. 솔직히 나는 우리교 육 의 부지런한 독자는 못 되었다. 하지만 비록 어깨너머로 읽으면서도 이런 잡지는 우 리

More information

Microsoft PowerPoint - 기계공학실험1-1MATLAB_개요2D.pptx

Microsoft PowerPoint - 기계공학실험1-1MATLAB_개요2D.pptx 1. MATLAB 개요와 활용 기계공학실험 I 2013년 2학기 MATLAB 시작하기 이장의내용 MATLAB의여러창(window)들의 특성과 목적 기술 스칼라의 산술연산 및 기본 수학함수의 사용. 스칼라 변수들(할당 연산자)의 정의 및 변수들의 사용 방법 스크립트(script) 파일에 대한 소개와 간단한 MATLAB 프로그램의 작성, 저장 및 실행 MATLAB의특징

More information

Microsoft Word - ExecutionStack

Microsoft Word - ExecutionStack Lecture 15: LM code from high level language /* Simple Program */ external int get_int(); external void put_int(); int sum; clear_sum() { sum=0; int step=2; main() { register int i; static int count; clear_sum();

More information

0 000., 000 0., 000-0., 000 0.666, 0 0.H6 0 0 0.0H8 0 06 07 08 9 09 6 00 0.H 0.H8 000 0.87, 0006-0.66, 0007 0.8, 0008 0.097, 0009 6, 0.H6 000,.HH 0 00

0 000., 000 0., 000-0., 000 0.666, 0 0.H6 0 0 0.0H8 0 06 07 08 9 09 6 00 0.H 0.H8 000 0.87, 0006-0.66, 0007 0.8, 0008 0.097, 0009 6, 0.H6 000,.HH 0 00 ~9 0~6 0 0 0 7 0 0 0 06 6 07 6 08 69 09 78 0 8 9 0 0 0 000., 000 0., 000-0., 000 0.666, 0 0.H6 0 0 0.0H8 0 06 07 08 9 09 6 00 0.H 0.H8 000 0.87, 0006-0.66, 0007 0.8, 0008 0.097, 0009 6, 0.H6 000,.HH 0

More information

À̵¿·Îº¿ÀÇ ÀÎÅͳݱâ¹Ý ¿ø°ÝÁ¦¾î½Ã ½Ã°£Áö¿¬¿¡_.hwp

À̵¿·Îº¿ÀÇ ÀÎÅͳݱâ¹Ý ¿ø°ÝÁ¦¾î½Ã ½Ã°£Áö¿¬¿¡_.hwp l Y ( X g, Y g ) r v L v v R L θ X ( X c, Yc) W (a) (b) DC 12V 9A Battery 전원부 DC-DC Converter +12V, -12V DC-DC Converter 5V DC-AC Inverter AC 220V DC-DC Converter 3.3V Motor Driver 80196kc,PWM Main

More information

1) 음운 체계상의 특징 음운이란 언어를 구조적으로 분석할 때, 가장 작은 언어 단위이다. 즉 의미분화 를 가져오는 최소의 단위인데, 일반적으로 자음, 모음, 반모음 등의 분절음과 음장 (소리의 길이), 성조(소리의 높낮이) 등의 비분절음들이 있다. 금산방언에서는 중앙

1) 음운 체계상의 특징 음운이란 언어를 구조적으로 분석할 때, 가장 작은 언어 단위이다. 즉 의미분화 를 가져오는 최소의 단위인데, 일반적으로 자음, 모음, 반모음 등의 분절음과 음장 (소리의 길이), 성조(소리의 높낮이) 등의 비분절음들이 있다. 금산방언에서는 중앙 금산 은 상위의 중부방언에 속한다. 충청남도의 핵방언권 중 (A)지역, 즉 충청 남도의 남부이며 전라북도와 주로 접경을 이루는 방언권이다. 그중 충청남도의 최 남단에서 전라북도와 경계를 이루고 있는 지역이 금산 이라는 점은 주목할 만하 다. 금산 지역이 전라북도와 지리적으로 인접해 있어 문화 등 제반 교류의 가능성 을 엿볼 수 있고, 이는 곧 금산과 전북방언과의

More information

5장. JSP와 Servlet 프로그래밍을 위한 기본 문법(완성-0421).hwp

5장. JSP와 Servlet 프로그래밍을 위한 기본 문법(완성-0421).hwp 1 0 1.7 6 5 'A ' '/ u 4 4 2 2 ' " JS P 프로그래밍 " A ', 'b ', ' 한 ', 9, \ u d 6 5 4 ' c h a r a = 'A '; 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 < % @ p a g e c o n te n

More information

<4D6963726F736F667420576F7264202D20323031323034313720B5B6C0DABDC5BFEBB5EEB1DE20B5B5C0D4B0FA20B1E2BEF720BDC5BFEBC0A7C7E820BBF3BDC320C6F2B0A120B5EEC0C720BFB5C7E2C0BA2E646F63>

<4D6963726F736F667420576F7264202D20323031323034313720B5B6C0DABDC5BFEBB5EEB1DE20B5B5C0D4B0FA20B1E2BEF720BDC5BFEBC0A7C7E820BBF3BDC320C6F2B0A120B5EEC0C720BFB5C7E2C0BA2E646F63> Credit Analysis 독자신용등급 도입과 기업 신용위험 상시 평가 등의 영향은 A등급 그룹의 취약 섹터 자회사에 집중 Tel. 2004-9566 kim.se-yong@shinyoung.com 독자신용등급 도입으로 증자 등을 통해 자체 펀더멘탈의 개선 요구 전망 이르면 7월부터 신용평가시장 선진화 방안으로 독자신용등급이 도입될 예정이다. 독자신용등급 은

More information

ch3.hwp

ch3.hwp 미디어정보처리 (c) -4 한남대 정보통신멀티미디어학부 MCCLab. - -...... (linear filtering). Z k = n i = Σn m Σ j = m M ij I ji 컨볼루션 영역창 I I I I 3 I 4 I 5 I 6 I 7 I 8 x 컨볼루션 마스크 M M M M 3 M 4 M 5 M 6 M 7 M 8 I 입력 영상 Z 4 = 8 k

More information

Week5

Week5 Week 05 Iterators, More Methods and Classes Hash, Regex, File I/O Joonhwan Lee human-computer interaction + design lab. Iterators Writing Methods Classes & Objects Hash File I/O Quiz 4 1. Iterators Array

More information

6자료집최종(6.8))

6자료집최종(6.8)) Chapter 1 05 Chapter 2 51 Chapter 3 99 Chapter 4 151 Chapter 1 Chapter 6 7 Chapter 8 9 Chapter 10 11 Chapter 12 13 Chapter 14 15 Chapter 16 17 Chapter 18 Chapter 19 Chapter 20 21 Chapter 22 23 Chapter

More information

vi 사용법

vi 사용법 네트워크프로그래밍 6 장과제샘플코드 - 1:1 채팅 (udp 버전 ) 과제 서버에서먼저 bind 하고그포트를다른사람에게알려줄것 클라이언트에서알려준포트로접속 서로간에키보드입력을받아상대방에게메시지전송 2 Makefile 1 SRC_DIR =../../common 2 COM_OBJS = $(SRC_DIR)/addressUtility.o $(SRC_DIR)/dieWithMessage.o

More information

중등수학2팀-지도서7

중등수학2팀-지도서7 3 6~7 8~3 3 ª 33~37 4-38~39 40~45 4 46~53 5 54~58 3 59-60 ~6 6~63 64 VII. 4 9 (Klein F849~95) (rlangen Program) (group of transformation) ' O' =k O ' O k O ' O ' O ' ' ' ' (topology) = = O O' =k O ' '

More information

Microsoft Word - igiari-1(KOREAN)_2.doc

Microsoft Word - igiari-1(KOREAN)_2.doc 학력의 국제비교에 이의 있음 - 과학교육의 바람직한 모습을 찾아 - (제1권) 핀란드 교육의 비판적 검토 -- version 3. 5-- http://www1.rsp.fukuoka-u.ac.jp/kototoi/igi-ari-1.pdf 후쿠오카대학 이학부 응용수학과 교수 시바타 가스유키( 柴 田 勝 征 )(사이타마대학 명예교수) 특별기고 핀란드의 수학 학력에

More information

특징 찾아보기 열쇠 없이 문을 열 수 있어요! 비밀번호 및 RF카드로도 문을 열 수 있습니다. 또한 비밀번호가 외부인에게 알려질 위험에 대비, 통제번호까지 입력해 둘 수 있어 더욱 안심하고 사용할 수 있습니다. 나만의 비밀번호 및 RF카드를 가질 수 있어요! 다수의 가

특징 찾아보기 열쇠 없이 문을 열 수 있어요! 비밀번호 및 RF카드로도 문을 열 수 있습니다. 또한 비밀번호가 외부인에게 알려질 위험에 대비, 통제번호까지 입력해 둘 수 있어 더욱 안심하고 사용할 수 있습니다. 나만의 비밀번호 및 RF카드를 가질 수 있어요! 다수의 가 www.kdnetwork.com 특징 찾아보기 열쇠 없이 문을 열 수 있어요! 비밀번호 및 RF카드로도 문을 열 수 있습니다. 또한 비밀번호가 외부인에게 알려질 위험에 대비, 통제번호까지 입력해 둘 수 있어 더욱 안심하고 사용할 수 있습니다. 나만의 비밀번호 및 RF카드를 가질 수 있어요! 다수의 가능할 삭제할 건전지 사용자를 위한 개별 비밀번호 및 RF카드

More information

A 001~A 036

A 001~A 036 4 3 2 0 8 91 0 1 2 3 4 5 6 08 09 00 01 02 03 04 18 19 10 29 20 22 23 39 30 31 32 33 48 49 40 41 59 50 69 1 2 3 4 1 2 3 4 1 4 7 10 13 1 2 3 4 5 6 rev. C C r C a f h f h L h h nrpm f h f n L C 3 P L

More information

HWP Document

HWP Document 만델브로트 집합은 이주 간단한 복소수 점화식 (정확히 표현하면 이나 프로그래밍 편의상 간단히 로 표현하는 것으로 한다)에서 출발한다. 에서 의 초기값을 로 하여 점화식을 계속 반복하여 계산한다. 그 결과 는 값에 따라 하나의 값으로 수렴하기도 하고, 여러 값 사이를 순환적으로 왔다 갔다 하기도 하고 카오스적인 값이 반복되기도 한다. 만델브로트 집합에서도 기본

More information

HWP Document

HWP Document CODE A00-B99 A00-A09 A00 KOR_TITLE 특정 감염성 및 기생충성 질환 창자 감염 질환 콜레라 A00.0 비브리오 콜레리 01 전형균에 의한 콜레라 A00.0 전형균에 의한 콜레라 A00.1 비브리오 콜레리 01 엘토르형균에 의한 콜레라 A00.1 엘토르형균에 의한 콜레라 A00.9 상세불명의 콜레라 A01 A01.0 장티푸스 장티푸스

More information

4.18.국가직 9급_전산직_컴퓨터일반_손경희_ver.1.hwp

4.18.국가직 9급_전산직_컴퓨터일반_손경희_ver.1.hwp 2015년도 국가직 9급 컴퓨터 일반 문 1. 시스템 소프트웨어에 포함되지 않는 것은? 1 1 스프레드시트(spreadsheet) 2 로더(loader) 3 링커(linker) 4 운영체제(operating system) - 시스템 소프트웨어 : 운영체제, 데이터베이스관리 프로그램,, 컴파일러, 링커, 로더, 유틸리티 소프트웨 어 등 - 스프레드시트 : 일상

More information

2힉년미술

2힉년미술 제 회 Final Test 문항 수 배점 시간 개 00 점 분 다음 밑줄 친 부분의 금속 공예 가공 기법이 바르게 연결된 것은? 금, 은, 동, 알루미늄 등의 금속을 ᄀ불에 녹여 틀에 붓거나 금속판을 ᄂ구부리거나 망치로 ᄃ두들겨서 여러 가지 형태의 쓸모 있는 물건을 만들 수 있다. ᄀ ᄂ ᄃ ᄀ ᄂ ᄃ 조금 단금 주금 주금 판금 단금 단금 판금 주금 판금 단금

More information

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션 Translation Song 1 Finger Family 한글 해석 p.3 아빠 손가락, 아빠 손가락. p.4 p.5 엄마 손가락, 엄마 손가락. p.6 p.7 오빠 손가락, 오빠 손가락. p.8 p.9 언니 손가락, 언니 손가락. p.10 p.11 아기 손가락, 아기 손가락. p.12 p.13 p.14-15 재미있게 부르기 (Sing and Play Time)

More information

11 템플릿적용 - Java Program Performance Tuning (김명호기술이사)

11 템플릿적용 - Java Program Performance Tuning (김명호기술이사) Java Program Performance Tuning ( ) n (Primes0) static List primes(int n) { List primes = new ArrayList(n); outer: for (int candidate = 2; n > 0; candidate++) { Iterator iter = primes.iterator(); while

More information

윈도우즈프로그래밍(1)

윈도우즈프로그래밍(1) 제어문 (2) For~Next 문 윈도우즈프로그래밍 (1) ( 신흥대학교컴퓨터정보계열 ) 2/17 Contents 학습목표 프로그램에서주어진특정문장을부분을일정횟수만큼반복해서실행하는문장으로 For~Next 문등의구조를이해하고활용할수있다. 내용 For~Next 문 다중 For 문 3/17 제어문 - FOR 문 반복문 : 프로그램에서주어진특정문장들을일정한횟수만큼반복해서실행하는문장

More information

이 장에서 사용되는 MATLAB 명령어들은 비교적 복잡하므로 MATLAB 창에서 명령어를 직접 입력하지 않고 확장자가 m 인 text 파일을 작성하여 실행을 한다

이 장에서 사용되는 MATLAB 명령어들은 비교적 복잡하므로 MATLAB 창에서 명령어를 직접 입력하지 않고 확장자가 m 인 text 파일을 작성하여 실행을 한다 이장에서사용되는 MATLAB 명령어들은비교적복잡하므로 MATLAB 창에서명령어를직접입력하지않고확장자가 m 인 text 파일을작성하여실행을한다. 즉, test.m 과같은 text 파일을만들어서 MATLAB 프로그램을작성한후실행을한다. 이와같이하면길고복잡한 MATLAB 프로그램을작성하여실행할수있고, 오류가발생하거나수정이필요한경우손쉽게수정하여실행할수있는장점이있으며,

More information

untitled

untitled - -, (insert) (delete) - - (insert) (delete) (top ) - - (insert) (rear) (delete) (front) A A B top A B C top push(a) push(b) push(c) A B top pop() top A B D push(d) top #define MAX_STACK_SIZE 100 int

More information

iOS5_1±³

iOS5_1±³ IDG Deep Dive ios 5 2 3 4 5 6 7 8 9 10 11 12 ios 5 토어 버튼이 상단 좌측에 추가되어 아이튠즈 스토 어의 적합한 영역으로 연결해 준다. 또한 블루투스의 원격제어 기능인 AVRCP(AV Remote Control Profile)가 1.3 버전으로 업데이 트되어 음악을 블루투스로 스트리밍할 때 트랙과 아티스트, 앨범 정보를

More information

1

1 2/33 3/33 4/33 5/33 6/33 7/33 8/33 9/33 10/33 11/33 12/33 13/33 14/33 15/33 16/33 17/33 5) 입력을 다 했으면 확인 버튼을 클릭합니다. 6) 시작 페이지가 제대로 설정이 되었는지 살펴볼까요. 익스플로러를 종료하고 다시 실행시켜 보세요. 시작화면에 야후! 코리아 화면이 뜬다면 설정 완료..^^

More information

hlogin2

hlogin2 0x02. Stack Corruption off-limit Kernel Stack libc Heap BSS Data Code off-limit Kernel Kernel : OS Stack libc Heap BSS Data Code Stack : libc : Heap : BSS, Data : bss Code : off-limit Kernel Kernel : OS

More information

07 자바의 다양한 클래스.key

07 자바의 다양한 클래스.key [ 07 ] . java.lang Object, Math, String, StringBuffer Byte, Short, Integer, Long, Float, Double, Boolean, Character. java.util Random, StringTokenizer Calendar, GregorianCalendar, Date. Collection, List,

More information

Introduction to Geotechnical Engineering II

Introduction to  Geotechnical Engineering II Fundamentals of Computer System - chapter 9. Functions 민기복 Ki-Bok Min, PhD 서울대학교에너지자원공학과조교수 Assistant Professor, Energy Resources Engineering Last week Chapter 7. C control statements: Branching and Jumps

More information

Chapter_06

Chapter_06 프로그래밍 1 1 Chapter 6. Functions and Program Structure April, 2016 Dept. of software Dankook University http://embedded.dankook.ac.kr/~baeksj 이장의강의목표 2 문자의입력방법을이해한다. 중첩된 if문을이해한다. while 반복문의사용법을익힌다. do 반복문의사용법을익힌다.

More information

Page 2 of 5 아니다 means to not be, and is therefore the opposite of 이다. While English simply turns words like to be or to exist negative by adding not,

Page 2 of 5 아니다 means to not be, and is therefore the opposite of 이다. While English simply turns words like to be or to exist negative by adding not, Page 1 of 5 Learn Korean Ep. 4: To be and To exist Of course to be and to exist are different verbs, but they re often confused by beginning students when learning Korean. In English we sometimes use the

More information

ePapyrus PDF Document

ePapyrus PDF Document 프로그래밍 콘테스트 챌린징 for GCJ, TopCoder, ACM/ICPC, KOI/IOI 지은이 Takuya Akiba, Yoichi Iwata, Mastoshi Kitagawa 옮긴이 박건태, 김승엽 1판 1쇄 발행일 201 1년 10월 24일 펴낸이 장미경 펴낸곳 로드북 편집 임성춘 디자인 이호용(표지), 박진희(본문) 주소 서울시 관악구 신림동 1451-15

More information

OR MS와 응용-03장

OR MS와 응용-03장 o R M s graphical solution algebraic method ellipsoid algorithm Karmarkar 97 George B Dantzig 979 Khachian Karmarkar 98 Karmarkar interior-point algorithm o R 08 gallon 000 000 00 60 g 0g X : : X : : Ms

More information

Microsoft Word - windows server 2003 수동설치_non pro support_.doc

Microsoft Word - windows server 2003 수동설치_non pro support_.doc Windows Server 2003 수동 설치 가이드 INDEX 운영체제 설치 준비과정 1 드라이버를 위한 플로피 디스크 작성 2 드라이버를 위한 USB 메모리 작성 7 운영체제 설치 과정 14 Boot Sequence 변경 14 컨트롤러 드라이버 수동 설치 15 운영체제 설치 17 운영체제 설치 준비 과정 Windows Server 2003 에는 기본적으로

More information

01-OOPConcepts(2).PDF

01-OOPConcepts(2).PDF Object-Oriented Programming Concepts Tel: 02-824-5768 E-mail: hhcho@selabsoongsilackr? OOP (Object) (Encapsulation) (Message) (Class) (Inheritance) (Polymorphism) (Abstract Class) (Interface) 2 1 + = (Dependency)

More information

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600 균형이진탐색트리 -VL Tree delson, Velskii, Landis에의해 1962년에제안됨 VL trees are balanced n VL Tree is a binary search tree such that for every internal node v of T, the heights of the children of v can differ by at

More information

4 5 4. Hi-MO 애프터케어 시스템 편 5. 오비맥주 카스 카스 후레쉬 테이블 맥주는 천연식품이다 편 처음 스타일 그대로, 부탁 케어~ Hi-MO 애프터케어 시스템 지속적인 모발 관리로 끝까지 스타일이 유지되도록 독보적이다! 근데 그거 아세요? 맥주도 인공첨가물이

4 5 4. Hi-MO 애프터케어 시스템 편 5. 오비맥주 카스 카스 후레쉬 테이블 맥주는 천연식품이다 편 처음 스타일 그대로, 부탁 케어~ Hi-MO 애프터케어 시스템 지속적인 모발 관리로 끝까지 스타일이 유지되도록 독보적이다! 근데 그거 아세요? 맥주도 인공첨가물이 1 2 On-air 3 1. 이베이코리아 G마켓 용평리조트 슈퍼브랜드딜 편 2. 아모레퍼시픽 헤라 루즈 홀릭 리퀴드 편 인쇄 광고 올해도 겨울이 왔어요. 당신에게 꼭 해주고 싶은 말이 있어요. G마켓에선 용평리조트 스페셜 패키지가 2만 6900원! 역시 G마켓이죠? G마켓과 함께하는 용평리조트 스페셜 패키지. G마켓의 슈퍼브랜드딜은 계속된다. 모바일 쇼핑 히어로

More information

View Licenses and Services (customer)

View Licenses and Services (customer) 빠른 빠른 시작: 시작: 라이선스, 라이선스, 서비스 서비스 및 주문 주문 이력 이력 보기 보기 고객 가이드 Microsoft 비즈니스 센터의 라이선스, 서비스 및 혜택 섹션을 통해 라이선스, 온라인 서비스, 구매 기록 (주문 기록)을 볼 수 있습니다. 시작하려면, 비즈니스 센터에 로그인하여 상단 메뉴에서 재고를 선택한 후 내 재고 관리를 선택하십시오. 목차

More information

ilist.add(new Integer(1))과 같이 사용하지 않고 ilist.add(1)과 같이 사용한 것은 자바 5.0에 추가된 기본 자료형과 해당 객체 자료 형과의 오토박싱/언박싱 기능을 사용한 것으로 오토박싱이란 자바 컴파일러가 객체를 요구하는 곳에 기본 자료형

ilist.add(new Integer(1))과 같이 사용하지 않고 ilist.add(1)과 같이 사용한 것은 자바 5.0에 추가된 기본 자료형과 해당 객체 자료 형과의 오토박싱/언박싱 기능을 사용한 것으로 오토박싱이란 자바 컴파일러가 객체를 요구하는 곳에 기본 자료형 바에 제네릭스(generics)를 도입하기 위한 연구는 이미 8년 전인 1996년부터라고 한다. 실제로 자바에 제네릭스를 도입하 는 몇 가지 방안들이 논문으로 나오기 시작한 것이 1998년 초임을 감 안하면 무려 8년이 지난 후에야 자바 5.0에 전격 채택되었다는 것은 이것이 얼마나 어려운 일이었나 하는 것을 보여준다. 자바의 스펙을 결정하는 표준화 절차인

More information

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1"); void method() 2"); void method1() public class Test 3"); args) A

예제 2) Test.java class A intvar= 10; void method() class B extends A intvar= 20; 1); void method() 2); void method1() public class Test 3); args) A 제 10 장상속 예제 1) ConstructorTest.java class Parent public Parent() super - default"); public Parent(int i) this("hello"); super(int) constructor" + i); public Parent(char c) this(); super(char) constructor

More information

212.

212. ISSN 1975-667 212. 212. 3 1 1, 8 8 6 6 2 2 8 8 - - 5 3 2 16 1 12 1-8 -8 1 6 8 1 1 5 5 1 1-5 -5 8 8-1 -1 6 6 2 2 8 8 - - 1 8 6 1 8 6-8 -8 2 2-2 -2 5 3 2 2 38 1 3 2 5 1 1 3 3-1 -2-5 1 8 6 2

More information

2 PX-8000과 RM-8000/LM-8000등의 관련 제품은 시스템의 간편한 설치와 쉬운 운영에 대한 고급 기술을 제공합니다. 또한 뛰어난 확장성으로 사용자가 요구하는 시스템을 손쉽게 구현할 수 있습니다. 메인컨트롤러인 PX-8000의 BGM입력소스를 8개의 로컬지

2 PX-8000과 RM-8000/LM-8000등의 관련 제품은 시스템의 간편한 설치와 쉬운 운영에 대한 고급 기술을 제공합니다. 또한 뛰어난 확장성으로 사용자가 요구하는 시스템을 손쉽게 구현할 수 있습니다. 메인컨트롤러인 PX-8000의 BGM입력소스를 8개의 로컬지 PX-8000 SYSTEM 8 x 8 Audio Matrix with Local Control 2 PX-8000과 RM-8000/LM-8000등의 관련 제품은 시스템의 간편한 설치와 쉬운 운영에 대한 고급 기술을 제공합니다. 또한 뛰어난 확장성으로 사용자가 요구하는 시스템을 손쉽게 구현할 수 있습니다. 메인컨트롤러인 PX-8000의 BGM입력소스를 8개의 로컬지역에

More information

041~084 ¹®È�Çö»óÀбâ

041~084 ¹®È�Çö»óÀбâ 1998 60 1 1 200 2 6 4 7 29 1975 30 2 78 35 1 4 2001 2009 79 2 9 2 200 3 1 6 1 600 13 6 2 8 21 6 7 1 9 1 7 4 1 2 2 80 4 300 2 200 8 22 200 2140 2 195 3 1 2 1 2 52 3 7 400 60 81 80 80 12 34 4 4 7 12 80 50

More information

[NO_11] 의과대학 소식지_OK(P)

[NO_11] 의과대학 소식지_OK(P) 진 의학 지식과 매칭이 되어, 인류의 의학지식의 수준을 높 여가는 것이다. 하지만 딥러닝은 블랙박스와 같은 속성을 가지고 있어서, 우리는 단지 결과만을 알 수 있기 때문에 이런 식의 의학지 식의 확장으로 이어지기는 힘들 수 있다는 것을 의미한다. 이것은 실제로 의학에서는 인공지능을 사용하게 될 때 여러 가지 문제를 만들 수 있다. 뿐만 아니라, 인간이 이해

More information

2 KAIST 1988,,KAIST MathLetter, 3,,, 3,, 3, 3,

2 KAIST 1988,,KAIST MathLetter, 3,,, 3,, 3, 3, (M 2 ) 2 KAIST 1988,,KAIST MathLetter, 3,,, 3,, 3, 3, 3,,, 2003 8, 4 1 7 11 8 12 26 2 39 21 40 22 54 23 67 24 80 3 93 31 n! 94 32 101 33 115 4 131 41 132 6 42 146 5 163 51 164 52 180 1 8 11 4 4?!,? 2??,?

More information

Level 학습 성과 내용 1수준 (이해) 1. 기본적인 Unix 이용법(명령어 또는 tool 활용)을 습득한다. 2. Unix 운영체계 설치을 익힌다. 모듈 학습성과 2수준 (응용) 1. Unix 가상화 및 이중화 개념을 이해한다. 2. 하드디스크의 논리적 구성 능력

Level 학습 성과 내용 1수준 (이해) 1. 기본적인 Unix 이용법(명령어 또는 tool 활용)을 습득한다. 2. Unix 운영체계 설치을 익힌다. 모듈 학습성과 2수준 (응용) 1. Unix 가상화 및 이중화 개념을 이해한다. 2. 하드디스크의 논리적 구성 능력 CLD 모듈 계획서 Unix Systems 운영관리기법 교과목 코드 모듈명 Unix Systems Administration 코디네이터 김두연 개설 시기 2015. 5 th term 학점/시수 3 수강 대상 1~3학년 분반 POL Type TOL Type SOS Type 유형 소프트웨어 개발 컴퓨팅 플랫폼 관리 개발 역량 분석/설계 프로그래밍

More information

H122_E.book

H122_E.book 2 이 기기는 가정용 (B급) 전자파적합기기로서 주로 가정에서 사용하는 것을 목적으로 하며, 모든 지역에서 사용할 수 있습니다. + + 3 4 6 5 9 0 0978 3 M z 1 5 1 k k 3 k B 6 2 3 7 8 9 B 10 B O U B i 6 9 0 Q 5 9 A p S 11 V Q A W o h p A S z 12 M B Y x H u J/K

More information

<31342D3034C0E5C7FDBFB52E687770>

<31342D3034C0E5C7FDBFB52E687770> 아카데미 토론 평가에 대한 재고찰 - 토론승패와 설득은 일치하는가 - 장혜영 (명지대) 1. 들어가는 말 토론이란 무엇일까? 토론에 대한 정의는 매우 다양하다. 안재현 과 오창훈은 토론에 대한 여러 정의들을 검토한 후 이들을 종합하 여 다음과 같이 설명하고 있다. 토론이란 주어진 주제에 대해 형 식과 절차에 따라 각자 자신의 의견을 합리적으로 주장하여 상대

More information

수-적분2-1(126~153)eps교

수-적분2-1(126~153)eps교 .. 0 0 6 03 04 (+x)«05 7 06 84~93 «P ~5 94~96 «H 6~7 97 8 98~0 03 04~05 06 07 9 ~0 ~3 07 6~7/3 94~96 «H 3 8 08 8 64 6 Brahmagupta598670 n n(n-)(n-) y BhaskaraA485 n k n(n-)(n-) y (n-k+) k(k-)(k-) y 7 Pascal

More information

3232 편집본(5.15).hwp

3232 편집본(5.15).hwp 정태제 묘 출토 사초 사진 정태제 묘 출토 사초 상권 정태제 묘 출토 사초 상권 45 정태제 묘 출토 사초 하권(표지) 정태제 묘 출토 사초 하권 46 2 중기( 重 記 ) 중기( 重 記 )란 호조에서 각 관청의 회계를 감독하거나 경외( 京 外 )의 각 관청이 보유하고 있 는 국가 재산의 누수를 막기 위하여 정기적으로 작성하도록 규정한 회계장부나 물품조사서

More information

슬라이드 1

슬라이드 1 한국산업기술대학교 제 5 강스케일링및회전 이대현교수 학습안내 학습목표 3D 오브젝트의확대, 축소및회전방법을이해한다. 학습내용 3D 오브젝트의확대및축소 (Scaling) 3D 오브젝트의회전 (Rotation) 변홖공갂 (Transform Space) SceneNode 의크기변홖 (Scale) void setscale ( Real x, Real y, Real z)

More information

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100 2015-1 프로그래밍언어 9. 연결형리스트, Stack, Queue 2015 년 5 월 4 일 교수김영탁 영남대학교공과대학정보통신공학과 (Tel : +82-53-810-2497; Fax : +82-53-810-4742 http://antl.yu.ac.kr/; E-mail : ytkim@yu.ac.kr) 연결리스트 (Linked List) 연결리스트연산 Stack

More information

lecture4(6.범용IO).hwp

lecture4(6.범용IO).hwp 제 2 부 C-언어를 사용한 마이크로컨트롤러 활용기초 66 C-언어는 수학계산을 위해 개발된 FORTRAN 같은 고급언어들과는 달 리 Unix 운영체제를 개발하면서 같이 개발된 고급언어이다. 운영체제의 특성상 C-언어는 다른 고급언어에 비해 컴퓨터의 하드웨어를 직접 제어할 수 있는 능력이 탁월하여 마이크로프로세서의 프로그램에 있어서 어셈블 리와 더불어 가장

More information

example code are examined in this stage The low pressure pressurizer reactor trip module of the Plant Protection System was programmed as subject for

example code are examined in this stage The low pressure pressurizer reactor trip module of the Plant Protection System was programmed as subject for 2003 Development of the Software Generation Method using Model Driven Software Engineering Tool,,,,, Hoon-Seon Chang, Jae-Cheon Jung, Jae-Hack Kim Hee-Hwan Han, Do-Yeon Kim, Young-Woo Chang Wang Sik, Moon

More information

신림프로그래머_클린코드.key

신림프로그래머_클린코드.key CLEAN CODE 6 11st Front Dev. Team 6 1. 2. 3. checked exception 4. 5. 6. 11 : 2 4 : java (50%), javascript (35%), SQL/PL-SQL (15%) : Spring, ibatis, Oracle, jquery ? , (, ) ( ) 클린코드를 무시한다면 . 6 1. ,,,!

More information

휠세미나3 ver0.4

휠세미나3 ver0.4 andromeda@sparcs:/$ ls -al dev/sda* brw-rw---- 1 root disk 8, 0 2014-06-09 18:43 dev/sda brw-rw---- 1 root disk 8, 1 2014-06-09 18:43 dev/sda1 brw-rw---- 1 root disk 8, 2 2014-06-09 18:43 dev/sda2 andromeda@sparcs:/$

More information

<494352503131335FC1F8B9E6B1B3C0B02E687770>

<494352503131335FC1F8B9E6B1B3C0B02E687770> ICRP 간행물 113 진단 및 중재 절차를 위한 방사선방호 교육훈련 Education and Training in Radiological Protection for Diagnostic and Interventional Procedures 대한방사선방어학회 이 번역본 발간은 2011년도 원자력안전위원회 방사선안전기술 개 발사업 과제 지원(한국동위원소협회로 부터

More information

비긴쿡-자바 00앞부속

비긴쿡-자바 00앞부속 IT COOKBOOK 14 Java P r e f a c e Stay HungryStay Foolish 3D 15 C 3 16 Stay HungryStay Foolish CEO 2005 L e c t u r e S c h e d u l e 1 14 PPT API C A b o u t T h i s B o o k IT CookBook for Beginner Chapter

More information

Drucker Innovation_CEO과정

Drucker Innovation_CEO과정 ! 피터드러커의 혁신과 기업가정신 허연 경희대학교 경영대학원 Doing Better Problem Solving Doing Different Opportunity ! Drucker, Management Challenges for the 21st Century, 1999! Drucker, Management: Tasks, Responsibilities,

More information

Java ...

Java ... 컴퓨터언어 1 Java 제어문 조성일 조건문 : if, switch 어떠한조건을조사하여각기다른명령을실행 if 문, switch 문 if 문 if - else 문형식 if 문형식 if ( 조건식 ) { 명령문 1; 명령문 2;... if ( 조건식 ) { 명령문 1; 명령문 2;... else { 명령문 a; 명령문 b;... 예제 1 정수를입력받아짝수와홀수를판별하는프로그램을작성하시오.

More information

I. 현대적 명승의 개념 및 관련 법규 01. 문화재보호법과 명승 한국전통문화대학교 문화재관광학과 대학원장 김창규 - -------........... 7 02. 명승의 개넘과 용어해설 흔μ국전통문화대학교문화재관광학과대학원장 - 김호딴 ----- ---- --- -----------------...... 13 03. 명승관련법규의 적용과 해석 한국전통문화대학교문화재관광학과대학원장

More information

FD¾ØÅÍÇÁ¶óÀÌÁî(Àå¹Ù²Þ)-ÀÛ¾÷Áß

FD¾ØÅÍÇÁ¶óÀÌÁî(Àå¹Ù²Þ)-ÀÛ¾÷Áß Copyright (c) 1999-2002 FINAL DATA INC. All right reserved Table of Contents 6 Enterprise for Windows 7 8 Enterprise for Windows 10 Enterprise for Windows 11 12 Enterprise for Windows 13 14 Enterprise

More information

목 차 1. 드라이버 설치...3 1.1 설치환경...3 1.2 드라이버 설치 시 주의사항...3 1.3 USB 드라이버 파일...3 1.4 Windows XP에서 설치...4 1.5 Windows Vista / Windows 7에서 설치...7 1.6 Windows

목 차 1. 드라이버 설치...3 1.1 설치환경...3 1.2 드라이버 설치 시 주의사항...3 1.3 USB 드라이버 파일...3 1.4 Windows XP에서 설치...4 1.5 Windows Vista / Windows 7에서 설치...7 1.6 Windows 삼성SDS 하이패스 USB 드라이버 설치 매뉴얼 삼성SDS(주) 목 차 1. 드라이버 설치...3 1.1 설치환경...3 1.2 드라이버 설치 시 주의사항...3 1.3 USB 드라이버 파일...3 1.4 Windows XP에서 설치...4 1.5 Windows Vista / Windows 7에서 설치...7 1.6 Windows 8에서 설치...9 2. 드라이버

More information

삼성955_965_09

삼성955_965_09 판매원-삼성전자주식회사 본 사 : 경기도 수원시 영통구 매탄 3동 416번지 제조원 : (주)아이젠 삼성 디지털 비데 순간온수 세정기 사용설명서 본 제품은 국내(대한민국)용 입니다. 전원, 전압이 다른 해외에서는 품질을 보증하지 않습니다. (FOR KOREA UNIT STANDARD ONLY) 이 사용설명서에는 제품보증서가 포함되어 있습니다. 분실되지 않도록

More information