카테고리 없음

오픈소스 openseespy 설치 및 사용방법, 예제 살펴보기 - Earthquake Analysis(gravity, Eigenvalue)

gomming 2021. 2. 18. 00:39

오픈시스opensees 소개

아래 글을 통해 확인해 보세요

https://blog.naver.com/xenostep/221930137768

 

OpenSeesPy 설치

1)

OpenSeesPy설치방법은 설치 파일을 다운받아서 수동 설치하는 방법이 있습니다.

오프라인 환경에서 사용하는 경우 아래 경로에서 다운 받아 설치할 수 있습니다.

https://pypi.org/project/openseespy/

 

2)

자동 설치하는 방법은 명령 프롬프트 또는 주피터노트북에서

pip install openseespy

위 명령어를 실행하는 방법이 있습니다.

10초 정도 소요되어 설치가 완료 됩니다.

import openseespy

위 코드 통해 정상 설치 되었는지 확인할 수 있습니다.

OpenSeesPy 사용방법은?

OpenSeesPy Doc을 통해 사용 방법과 예제를 한번에 획득할 수 있습니다.

https://openseespydoc.readthedocs.io/en/latest/

위 경로로 들어가면 최신 메뉴얼과 예제들을 모두 다운 받으실 수 있습니다.

메뉴얼은 PDF 또는 html 등 양식으로 다운 받을 수 있어 편리 합니다.

 

openseespy 예제 실행해보기

openseespydoc 메뉴얼의 earthquake 예제 중 2번 째

Reinforced Concrete Frame Earthquake Analysis

내용을 살펴 보겠습니다.

예제 파일 못 찾겠으면 아래 zip 파일을 다운받아 시도해 봅니다.

eq2.zip
0.01MB

 

메인 코드는 아래와 같습니다.

 

메인코드는

RCFrameGravity.py 파일을 먼저 실행하여 자중해석을 하고 그 결과를 받아

지진해석으로 연계하게 됩니다. 그러므로 동일 경로에 위 zip 파일의 데이터를 위치해 두도록 합니다.

ReadRecord.py 파일을 통해 결과 이력을 확인할 수 있습니다.

wipe()
# ----------------------------------------------------
# Start of Model Generation & Initial Gravity Analysis
# ----------------------------------------------------

# Do operations of Example3.1 by sourcing in the tcl file
import RCFrameGravity
print("Gravity Analysis Completed")

# Set the gravity loads to be constant & reset the time in the domain
loadConst('-time', 0.0)

# ----------------------------------------------------
# End of Model Generation & Initial Gravity Analysis
# ----------------------------------------------------

# Define nodal mass in terms of axial load on columns
g = 386.4
m = RCFrameGravity.P/g

mass(3, m, m, 0.0)
mass(4, m, m, 0.0)

# Set some parameters
record = 'elCentro'

# Permform the conversion from SMD record to OpenSees record
dt, nPts = ReadRecord.ReadRecord(record+'.at2', record+'.dat')

# Set time series to be passed to uniform excitation
timeSeries('Path', 2, '-filePath', record+'.dat', '-dt', dt, '-factor', g)

# Create UniformExcitation load pattern
#                         tag dir 
pattern('UniformExcitation',  2,   1,  '-accel', 2)

# set the rayleigh damping factors for nodes & elements
rayleigh(0.0, 0.0, 0.0, 0.000625)

# Delete the old analysis and all it's component objects
wipeAnalysis()

# Create the system of equation, a banded general storage scheme
system('BandGeneral')

# Create the constraint handler, a plain handler as homogeneous boundary
constraints('Plain')

# Create the convergence test, the norm of the residual with a tolerance of 
# 1e-12 and a max number of iterations of 10
test('NormDispIncr', 1.0e-12,  10 )

# Create the solution algorithm, a Newton-Raphson algorithm
algorithm('Newton')

# Create the DOF numberer, the reverse Cuthill-McKee algorithm
numberer('RCM')

# Create the integration scheme, the Newmark with alpha =0.5 and beta =.25
integrator('Newmark',  0.5,  0.25 )

# Create the analysis object
analysis('Transient')

# Perform an eigenvalue analysis
numEigen = 2
eigenValues = eigen(numEigen)
print("eigen values at start of transient:",eigenValues)

# set some variables
tFinal = nPts*dt
tCurrent = getTime()
ok = 0

time = [tCurrent]
u3 = [0.0]

# Perform the transient analysis
while ok == 0 and tCurrent < tFinal:
    
    ok = analyze(1, .01)
    
    # if the analysis fails try initial tangent iteration
    if ok != 0:
        print("regular newton failed .. lets try an initail stiffness for this step")
        test('NormDispIncr', 1.0e-12,  100, 0)
        algorithm('ModifiedNewton', '-initial')
        ok =analyze( 1, .01)
        if ok == 0:
            print("that worked .. back to regular newton")
        test('NormDispIncr', 1.0e-12,  10 )
        algorithm('Newton')
    
    tCurrent = getTime()

    time.append(tCurrent)
    u3.append(nodeDisp(3,1))



# Perform an eigenvalue analysis
eigenValues = eigen(numEigen)
print("eigen values at end of transient:",eigenValues)

results = open('results.out','a+')

if ok == 0:
    results.write('PASSED : RCFrameEarthquake.py\n');
    print("Passed!")
else:
    results.write('FAILED : RCFrameEarthquake.py\n');
    print("Failed!")

results.close()

plt.plot(time, u3)
plt.ylabel('Horizontal Displacement of node 3 (in)')
plt.xlabel('Time (s)')

plt.show()



print("==========================")

코드 간단 설명

간단히 내용을 보면

import RCFrameGravity.py

코드를 통해 자중해석을 실행합니다. 그 결과를 loadConst()를 통해 지진해석과 연계합니다.

모델은 총 4개의 node와 3개의 요소로 구성 되어 있으며

RC 복합재 물성, 특성이 적용되어 있습니다.

그리고 mode 해석이 진행되어 해당 결과를 확인하실 수 있습니다.

해석 후에는 node3의 변위 이력을 그래프로 작성하여 보여줍니다.

예제코드 실행 결과

위와 같이 지진해석 결과를 획득할 수 있습니다.

해석 모델 확인 방법

모델을 시각화 하는 방법은

import openseespy.postprocessing.Get_Rendering as opsplt 
opsplt.plot_model()

위 plot_model() 코드로 볼 수 있습니다.

모드해석 결과는 plot_modeshape()을 통해 확인할 수 있습니다.

opsplt.plot_modeshape(1,100)

1은 모드 넘버, 100은 스케일 입니다.

후기

OpenSeesPy 를 설치하고 간단한 예제를 실행해봤습니다.

더불어 모델 형상과 모드해석 결과를 시각화 하는 방법도 사용해 보았습니다.

다음에는 좀 더 다양한 사례를 살펴 보도록 하겠습니다.

질문, 의견 있으시면 언제든 쪽지, 댓글 남겨 주세요. 감사합니다.