Fortran

작업7 : Fortran으로 파장 별 방출에너지 구하기

이석사 중 2022. 10. 26. 04:44
728x90

 

오늘은 온도별 방출 에너지를 구해보겠습니다

 


개념 설명)

태양의 온도를 저희는 흔히 6000도 또는 5777K라고도 합니다

 

이 온도에서 방출하는 복사에너지 덕분에 지구에 빛이 들어오고

 

사람이 살 수 있는 온도가 생기는 겁니다

 

그럼 태양보다 더 뜨거운 항성은 태양과 똑같은 에너지를 방출할까요??

 

아닙니다

 

물체는 온도가 높을수록 방출하는 에너지가 큽니다

 

가지고 있는 열을 방출하는게 복사 에너지이기 때문입니다

 

그럼 첫번째 사실을 하나 알았죠?? 온도가 높으면 복사에너지가 크다

 

두번째는 파장으로 알아보겠습니다

 

복사는 파동의 형태로 전달되기 때문에 파장과 진동수라는 개념이 있습니다

 

파장은 골과 골, 마루와 마루 사이의 길이를 말하고

 

진동수는 이 파장이 1초에 진동하는 횟수를 말합니다

진동한다는 말의 의미는 처음 위치로 돌아오는 것을 말합니다

 

중심에서 중심, 골에서 골, 마루에서 마루까지 이런 거 말이죠

v는 속도, 람다는 파장, f는 진동수를 의미 합니다

 

파동의 세기는 진동수가 클수록 더 강합니다

 

진동수가 크다는 건 물체를 짧은 시간에 더 많이 자극시킨다는 겁니다

 

그럼 진동수가 커야하면 분모에 있는 람다는 반대로 작아야겠죠??

 

그럼 2가지 성질을 중요한 개념을 다 알아봤습니다

 

1) 온도가 높아야 한다

2) 파장이 짧아야한다

 

그럼 포트란으로 직접 계산해 볼까요??

 

먼저 흑체라는 개념을 한 가지 더 알아야합니다

 

흑체는 받은 에너지를 모두 방출하는 가상의 물체를 말합니다

 

이를 방출율로 표현을 하면 방출하는 에너지/받은 에너지 = 1이 됩니다

 

방출율이 1이라는 건 에너지가 손실이 없이 전부 방출된다는 말입니다

 

원래는 방출율을 따로 고려해야 하지만 흑체는 하지 않아도 됩니다

 

어떠한 공식으로 계산된 값이 그 그대로 방출하는 에너지라는 거죠

 

공식을 보겠습니다

 

복잡해 보이지만 상수가 많기 때문에 충분히 할 수 있습니다

 

먼저

C1은 첫 번째 복사 상수로 3.7427 x 10^8 이고

C2는 두 번째 복사 상수로 1.4388 x 10^4 입니다

 

이 값들을 상수기 때문에 그대로 넣으시면 됩니다

 

그리고 나머지는 저희가 확인해야할 값이죠??

 

파장(람다)와 온도(T)에 대해서 확인해보겠습니다


코드 분석)

        REAL :: c1, c2, k
        REAL :: l1, l2, l3, l4
        REAL :: T1, T2, T3, T4
        REAL :: e1, e2, e3, e4

        open(1, file = 'se.csv')
        write(1, *)'lamda',',','T1',',','T2',',','T3',',','T4'

        c1 = 3.7427e8
        c2 = 1.4388e4

        T1 = 5777
        T2 = 3000
        T3 = 1000
        T4 = 373
        
        do l = 1, 2500, 1
          l1 = l * 0.01

        e1 = c1 / (l1**5 * (exp(c2 / (l1 * T1) - 1)))
        e2 = c1 / (l1**5 * (exp(c2 / (l1 * T2) - 1)))
        e3 = c1 / (l1**5 * (exp(c2 / (l1 * T3) - 1)))
        e4 = c1 / (l1**5 * (exp(c2 / (l1 * T4) - 1)))

        write(1, 10) l1,',',e1,',',e2,',',e3,',',e4
10      format(f10.2, a, f15.4, a, f15.4, a, f15.4, a, f15.4)          
        end do
        end
 

오늘 코드는 선언해야 할 변수가 많기 때문에 길어보이지만 어렵지 않습니다

 

하나하나 봅시다

 

변수 선언 및 할당)

        REAL :: c1, c2
        REAL :: l1
        REAL :: T1, T2, T3, T4
        REAL :: e1, e2, e3, e4

        open(1, file = 'se.csv')
        write(1, *)'lamda',',','T1',',','T2',',','T3',',','T4'

        c1 = 3.7427e8
        c2 = 1.4388e4

        T1 = 5777
        T2 = 3000
        T3 = 1000
        T4 = 373
 

이 부분 전체가 변수를 선언하고 값을 주는 부분입니다

 

c1과 c2는 복사 상수, [T1, T2, T3, T4]는 우리가 확인해 볼 온도들

 

l1은 파장, [e1, e2, e3, e4]는 계산결과 입니다

 

저희가 알아볼 온도는 태양의 온도인 5777K와 임의로 설정한 3000K, 1000K, 373K입니다

 

파장대는 0부터 20 마이크로 미터 까지입니다

 

반복문으로 파장대 만들기)

        do l = 1, 2500, 1
          l1 = l * 0.01
 

포트란이 참 다 좋은데 아쉽게도 반복문에는 정수 밖에 사용이 안됩니다

 

그래서 머리를 조금 써서 소수점도 만들어줬습니다

 

보통 파장대는 0.1씩 계산하지만

 

저는 구한 자료를 가지고 그림도 그려볼 것이기 때문에 정교한 그림을 위해 0.01씩 하겠습니다

 

공식 계산)

        e1 = c1 / (l1**5 * (exp(c2 / (l1 * T1) - 1)))
        e2 = c1 / (l1**5 * (exp(c2 / (l1 * T2) - 1)))
        e3 = c1 / (l1**5 * (exp(c2 / (l1 * T3) - 1)))
        e4 = c1 / (l1**5 * (exp(c2 / (l1 * T4) - 1)))
 

이제 공식 계산입니다

 

파장은 반복문을 통해 순서대로 입력이 되기 때문에 l1을 그대로 쓰면 되고

 

T만 1, 2, 3, 4 하나씩 넣어서 값을 구하시면 됩니다

 

출력하기)

        write(1, 10) l1,',',e1,',',e2,',',e3,',',e4
10      format(f10.2, a, f15.4, a, f15.4, a, f15.4, a, f15.4)          
        end do
        end
 

항상 말씀드리지만 저는 그림을 그리기 위해서 항상 csv 형태로 저장하기 때문에

 

중간중간 ,를 넣지만 출력값만 보고 싶으신 분들은 안하셔도 됩니다

 

다만 계산 값이 좀 크기 때문에 f15.4 정도로는 해줘야 값이 전부 출력이 됩니다

 

저렇게 포맷문까지 해주시고 종료해주시면 됩니다


요즘은 시험기간이라 큰 작업들을 하기 힘들었습니다

 

제가 가장 하고 싶은 작업이 포트란과 HTML로 웹 계산기를 만드는 겁니다

 

시험 기간이 끝나면 구상을 해서 만들어보려고 합니다

 

이것도 블로그에 꼭 포스팅 할 예정입니다!

 

제가 내일부터 APCC에서 주관하는 기후정보 사용자 워크숍 참가 때문에 부산에 갑니다!!

 

기후 정보 워크숍 참가 후기도 블로그에 올려보겠습니다

 

다음주 정도부터 웹 계산기를 구상해보겠습니다

 

감사합니다!

 

728x90