def Solve_F90(XBINPUT,XBOPTS): """@brief Nonlinear static structural solver using f90 solve routine.""" "Check correct solution code" assert XBOPTS.Solution.value == 112, ('NonlinearStatic (F90) requested' +\ ' with wrong solution code') "Initialise beam" XBINPUT, XBOPTS, NumNodes_tot, XBELEM, PosIni, PsiIni, XBNODE, NumDof \ = BeamInit.Static(XBINPUT,XBOPTS) "Set initial conditions as undef config" PosDefor = PosIni.copy(order='F') PsiDefor = PsiIni.copy(order='F') if XBOPTS.PrintInfo.value==True: sys.stdout.write('Solve nonlinear static case (using .f90 routines) ... \n') BeamLib.Cbeam3_Solv_NonlinearStatic(XBINPUT, XBOPTS, NumNodes_tot, XBELEM,\ PosIni, PsiIni, XBNODE, NumDof,\ PosDefor, PsiDefor) if XBOPTS.PrintInfo.value==True: sys.stdout.write(' ... done\n') "Write deformed configuration to file" ofile = Settings.OutputDir + Settings.OutputFileRoot + '_SOL112_def.dat' if XBOPTS.PrintInfo.value==True: sys.stdout.write('Writing file %s ... ' %(ofile)) fp = open(ofile,'w') fp.write('TITLE="Non-linear static solution: deformed geometry"\n') fp.write('VARIABLES="iElem" "iNode" "Px" "Py" "Pz" "Rx" "Ry" "Rz"\n') fp.close() if XBOPTS.PrintInfo.value==True: sys.stdout.write('done\n') WriteMode = 'a' BeamIO.OutputElems(XBINPUT.NumElems, NumNodes_tot.value, XBELEM, \ PosDefor, PsiDefor, ofile, WriteMode) "Print deformed configuration" if XBOPTS.PrintInfo.value==True: sys.stdout.write('--------------------------------------\n') sys.stdout.write('NONLINEAR STATIC SOLUTION\n') sys.stdout.write('%10s %10s %10s\n' %('X','Y','Z')) for inodi in range(NumNodes_tot.value): sys.stdout.write(' ') for inodj in range(3): sys.stdout.write('%12.5e' %(PosDefor[inodi,inodj])) sys.stdout.write('\n') sys.stdout.write('--------------------------------------\n') "Return solution as optional output argument" return PosDefor, PsiDefor
def Solve_F90(XBINPUT, XBOPTS): """@brief Nonlinear dynamic structural solver using f90 solve routine.""" "Check correct solution code" assert XBOPTS.Solution.value == 312, ('NonlinearDynamic (F90) requested' +\ ' with wrong solution code') "Initialise variables for static analysis" XBINPUT, XBOPTS, NumNodes_tot, XBELEM, PosIni, PsiIni, XBNODE, NumDof \ = BeamInit.Static(XBINPUT, XBOPTS) "Change solution code to NonlinearStatic" XBOPTS.Solution.value = 112 "Set initial conditions as undef config" PosDefor = PosIni.copy(order='F') PsiDefor = PsiIni.copy(order='F') "Solve static" BeamLib.Cbeam3_Solv_NonlinearStatic(XBINPUT, XBOPTS, NumNodes_tot, XBELEM,\ PosIni, PsiIni, XBNODE, NumDof,\ PosDefor, PsiDefor) "Change solution code back to NonlinearDynamic" XBOPTS.Solution.value = 312 "Write deformed configuration to file" ofile = Settings.OutputDir + Settings.OutputFileRoot + '_SOL312_def.dat' if XBOPTS.PrintInfo == True: sys.stdout.write('Writing file %s ... ' % (ofile)) fp = open(ofile, 'w') fp.write('TITLE="Non-linear static solution: deformed geometry"\n') fp.write('VARIABLES="iElem" "iNode" "Px" "Py" "Pz" "Rx" "Ry" "Rz"\n') fp.close() if XBOPTS.PrintInfo == True: sys.stdout.write('done\n') WriteMode = 'a' BeamIO.OutputElems(XBINPUT.NumElems, NumNodes_tot.value, XBELEM, \ PosDefor, PsiDefor, ofile, WriteMode) "Change solution code to NonlinearDynamic" XBOPTS.Solution.value = 312 "Initialise variables for dynamic analysis" Time, NumSteps, ForceTime, ForcedVel, ForcedVelDot,\ PosDotDef, PsiDotDef,\ OutGrids, PosPsiTime, VelocTime, DynOut\ = BeamInit.Dynamic(XBINPUT,XBOPTS) "Write _force file" ofile = Settings.OutputDir + Settings.OutputFileRoot + '_SOL312_force.dat' fp = open(ofile, 'w') BeamIO.Write_force_File(fp, Time, ForceTime, ForcedVel, ForcedVelDot) fp.close() "Write _vel file" #TODO: write _vel file "Write .mrb file" #TODO: write .mrb file "Solve dynamic using f90 solver" BeamLib.Cbeam3_Solv_NonlinearDynamic(XBINPUT, XBOPTS, NumNodes_tot, XBELEM,\ PosIni, PsiIni, XBNODE, NumDof,\ PosDefor, PsiDefor,\ NumSteps, Time, ForceTime, ForcedVel, ForcedVelDot,\ PosDotDef, PsiDotDef,\ PosPsiTime, VelocTime, DynOut, OutGrids) "Write _dyn file" ofile = Settings.OutputDir + Settings.OutputFileRoot + '_SOL312_dyn.dat' fp = open(ofile, 'w') BeamIO.Write_dyn_File(fp, Time, PosPsiTime) fp.close() "Write _shape file" ofile = Settings.OutputDir + Settings.OutputFileRoot + '_SOL312_shape.dat' fp = open(ofile, 'w') BeamIO.Write_shape_File(fp, len(Time), NumNodes_tot.value, Time, DynOut) fp.close()
def Solve_F90_steps(XBINPUT, XBOPTS): """@brief Nonlinear dynamic structural solver with time-steps controlled in Python but solved using F90 routines at each time-step.""" "Check correct solution code" assert XBOPTS.Solution.value == 312, ('NonlinearDynamic (F90) requested' +\ ' with wrong solution code') "Initialise variables for static analysis" XBINPUT, XBOPTS, NumNodes_tot, XBELEM, PosIni, PsiIni, XBNODE, NumDof \ = BeamInit.Static(XBINPUT, XBOPTS) "Change solution code to NonlinearStatic" XBOPTS.Solution.value = 112 "Set initial conditions as undef config" PosDefor = PosIni.copy(order='F') PsiDefor = PsiIni.copy(order='F') "Solve static" BeamLib.Cbeam3_Solv_NonlinearStatic(XBINPUT, XBOPTS, NumNodes_tot, XBELEM,\ PosIni, PsiIni, XBNODE, NumDof,\ PosDefor, PsiDefor) "Write deformed configuration to file" ofile = Settings.OutputDir + Settings.OutputFileRoot + '_SOL312_def.dat' if XBOPTS.PrintInfo == True: sys.stdout.write('Writing file %s ... ' % (ofile)) fp = open(ofile, 'w') fp.write('TITLE="Non-linear static solution: deformed geometry"\n') fp.write('VARIABLES="iElem" "iNode" "Px" "Py" "Pz" "Rx" "Ry" "Rz"\n') fp.close() if XBOPTS.PrintInfo == True: sys.stdout.write('done\n') WriteMode = 'a' BeamIO.OutputElems(XBINPUT.NumElems, NumNodes_tot.value, XBELEM, \ PosDefor, PsiDefor, ofile, WriteMode) "Change solution code to NonlinearDynamic" XBOPTS.Solution.value = 312 "Initialise variables for dynamic analysis" Time, NumSteps, ForceTime, ForcedVel, ForcedVelDot,\ PosDotDef, PsiDotDef,\ OutGrids, PosPsiTime, VelocTime, DynOut\ = BeamInit.Dynamic(XBINPUT,XBOPTS) "Write _force file" ofile = Settings.OutputDir + Settings.OutputFileRoot + '_SOL312_force.dat' fp = open(ofile, 'w') BeamIO.Write_force_File(fp, Time, ForceTime, ForcedVel, ForcedVelDot) fp.close() "Write _vel file" #TODO: write _vel file "Write .mrb file" #TODO: write .mrb file "Save time-dependant variables with only one time step (2 time-steps)" TimeElements = Time[0:2].copy('F') Ftime = ForceTime[0:2].copy('F') Fvel = ForcedVel[0:2, :].copy('F') FvelDot = ForcedVelDot[0:2, :].copy('F') "Create Output vectors, one for each time-step" PosPsiTimeStep = PosPsiTime[0:2, :].copy('F') VelocTimeStep = VelocTime[0:2, :].copy('F') DynOutStep = DynOut[0:2 * NumNodes_tot.value, :].copy('F') "Initialise and approximate initial accelerations as zero arrays" PosDotDotDef = np.zeros((NumNodes_tot.value, 3), ct.c_double, 'F') PsiDotDotDef = np.zeros((XBINPUT.NumElems,Settings.MaxElNod,3),\ ct.c_double, 'F') "Start Time-loop" for TimeStep in range(0, NumSteps.value): "Update 2-step time arrays" TimeElements = Time[TimeStep:TimeStep + 2] Ftime = ForceTime[TimeStep:TimeStep + 2] Fvel[:, :] = ForcedVel[TimeStep:TimeStep + 2, :] FvelDot[:, :] = ForcedVelDot[TimeStep:TimeStep + 2, :] "Solve dynamic step using f90 solver" BeamLib.Cbeam3_Solv_NonlinearDynamicAccel(XBINPUT, XBOPTS, NumNodes_tot,\ XBELEM,PosIni, PsiIni, XBNODE, NumDof,\ PosDefor, PsiDefor,\ ct.c_int(1), TimeElements, Ftime, Fvel, FvelDot,\ PosDotDef, PsiDotDef,\ PosDotDotDef, PsiDotDotDef,\ PosPsiTimeStep, VelocTimeStep, DynOutStep, OutGrids) "Append output information" PosPsiTime[TimeStep + 1, :] = PosPsiTimeStep[1, :] VelocTime[TimeStep + 1, :] = VelocTimeStep[1, :] DynOut[(TimeStep)*NumNodes_tot.value:(TimeStep+1)*NumNodes_tot.value-1,\ : ] = DynOutStep[NumNodes_tot.value:2*NumNodes_tot.value-1] "END Time-loop" "Write _dyn file" ofile = Settings.OutputDir + Settings.OutputFileRoot + '_SOL312_dyn.dat' fp = open(ofile, 'w') BeamIO.Write_dyn_File(fp, Time, PosPsiTime) fp.close() "Write _shape file" ofile = Settings.OutputDir + Settings.OutputFileRoot + '_SOL312_shape.dat' fp = open(ofile, 'w') BeamIO.Write_shape_File(fp, len(Time), NumNodes_tot.value, Time, DynOut) fp.close()
def Solve_F90(XBINPUT, XBOPTS): """@brief Nonlinear dynamic structural solver using f90 solve routine.""" #Check correct solution code assert XBOPTS.Solution.value == 912, ('NonlinearDynamic (F90) requested' +\ ' with wrong solution code') #Initialise variables for static analysis XBINPUT, XBOPTS, NumNodes_tot, XBELEM, PosIni, PsiIni, XBNODE, NumDof \ = BeamInit.Static(XBINPUT, XBOPTS) #Change solution code to NonlinearStatic XBOPTS.Solution.value = 112 #Set initial conditions as undef config PosDefor = PosIni.copy(order='F') PsiDefor = PsiIni.copy(order='F') #Solve static BeamLib.Cbeam3_Solv_NonlinearStatic(XBINPUT, XBOPTS, NumNodes_tot, XBELEM,\ PosIni, PsiIni, XBNODE, NumDof,\ PosDefor, PsiDefor) #Change solution code back to NonlinearDynamic XBOPTS.Solution.value = 912 #Write deformed configuration to file ofile = Settings.OutputDir + Settings.OutputFileRoot + '_SOL912_def.dat' if XBOPTS.PrintInfo == True: sys.stdout.write('Writing file %s ... ' % (ofile)) fp = open(ofile, 'w') fp.write('TITLE="Non-linear static solution: deformed geometry"\n') fp.write('VARIABLES="iElem" "iNode" "Px" "Py" "Pz" "Rx" "Ry" "Rz"\n') fp.close() if XBOPTS.PrintInfo == True: sys.stdout.write('done\n') WriteMode = 'a' BeamIO.OutputElems(XBINPUT.NumElems, NumNodes_tot.value, XBELEM, \ PosDefor, PsiDefor, ofile, WriteMode) #Initialise variables for dynamic analysis Time, NumSteps, ForceTime, ForcedVel, ForcedVelDot,\ PosDotDef, PsiDotDef,\ OutGrids, PosPsiTime, VelocTime, DynOut\ = BeamInit.Dynamic(XBINPUT,XBOPTS, NumNodes_tot) # Delete unused variables. del PosPsiTime, VelocTime #Initialise quaternions for rigid-body dynamics Quat = np.zeros(4, ct.c_double, 'F') Quat[0] = 1.0 #Write _force file ofile = Settings.OutputDir + Settings.OutputFileRoot + '_SOL912_force.dat' fp = open(ofile, 'w') BeamIO.Write_force_File(fp, Time, ForceTime, ForcedVel, ForcedVelDot) fp.close() #Solve dynamic using f90 solver BeamLib.Xbeam_Solv_FreeNonlinDynamic(XBINPUT, XBOPTS, NumNodes_tot, XBELEM,\ PosIni, PsiIni, XBNODE, NumDof,\ PosDefor, PsiDefor, Quat,\ NumSteps, Time, ForceTime, ForcedVel, ForcedVelDot,\ PosDotDef, PsiDotDef, DynOut, OutGrids) #Write _shape file ofile = Settings.OutputDir + Settings.OutputFileRoot + '_SOL912_shape.dat' fp = open(ofile, 'w') BeamIO.Write_shape_File(fp, len(Time), NumNodes_tot.value, Time, DynOut) fp.close() #Write rigid-body velocities ofile = Settings.OutputDir + Settings.OutputFileRoot + '_SOL912_rigid.dat' fp = open(ofile, 'w') BeamIO.Write_rigid_File(fp, Time, ForcedVel, ForcedVelDot) fp.close()
def Solve_F90_steps(XBINPUT,XBOPTS): """@brief Nonlinear static structural solver using f90 solve routine called once per load-step.""" "Check correct solution code" assert XBOPTS.Solution.value == 112, ('NonlinearStatic (F90) requested' +\ ' with wrong solution code') "Initialise beam" XBINPUT, XBOPTS, NumNodes_tot, XBELEM, PosIni, PsiIni, XBNODE, NumDof \ = BeamInit.Static(XBINPUT,XBOPTS) "Set initial conditions as undef config" PosDefor = PosIni.copy(order='F') PsiDefor = PsiIni.copy(order='F') if XBOPTS.PrintInfo.value==True: sys.stdout.write('Solve nonlinear static case (using .f90 routine at' +\ ' each load-step) ... \n') "Initialise load increments and set F90 load-step to 1" LoadSteps = XBOPTS.NumLoadSteps.value LoadIncrement = XBINPUT.ForceStatic/LoadSteps XBOPTS.NumLoadSteps.value = 1 "Start loading loop" for step in range(1,LoadSteps+1): "Current load to be applied" XBINPUT.ForceStatic = step*LoadIncrement "Print load step" if XBOPTS.PrintInfo.value == True: print(' Python-based outer load step %d' %(step)) "Solve with one load step" BeamLib.Cbeam3_Solv_NonlinearStatic(XBINPUT, XBOPTS, NumNodes_tot, XBELEM,\ PosIni, PsiIni, XBNODE, NumDof,\ PosDefor, PsiDefor) if XBOPTS.PrintInfo.value==True: sys.stdout.write(' ... done\n') "Write deformed configuration to file" ofile = Settings.OutputDir + Settings.OutputFileRoot + '_SOL112_def.dat' if XBOPTS.PrintInfo.value==True: sys.stdout.write('Writing file %s ... ' %(ofile)) fp = open(ofile,'w') fp.write('TITLE="Non-linear static solution: deformed geometry"\n') fp.write('VARIABLES="iElem" "iNode" "Px" "Py" "Pz" "Rx" "Ry" "Rz"\n') fp.close() if XBOPTS.PrintInfo.value==True: sys.stdout.write('done\n') WriteMode = 'a' BeamIO.OutputElems(XBINPUT.NumElems, NumNodes_tot.value, XBELEM, \ PosDefor, PsiDefor, ofile, WriteMode) "Print deformed configuration" if XBOPTS.PrintInfo.value==True: sys.stdout.write('--------------------------------------\n') sys.stdout.write('NONLINEAR STATIC SOLUTION\n') sys.stdout.write('%10s %10s %10s\n' %('X','Y','Z')) for inodi in range(NumNodes_tot.value): sys.stdout.write(' ') for inodj in range(3): sys.stdout.write('%12.5e' %(PosDefor[inodi,inodj])) sys.stdout.write('\n') sys.stdout.write('--------------------------------------\n') "Return solution as optional output argument" return PosDefor, PsiDefor
def Solve_Py(XBINPUT, XBOPTS): """Nonlinear dynamic structural solver in Python. Assembly of matrices is carried out with Fortran subroutines.""" "Check correct solution code" assert XBOPTS.Solution.value == 312, ('NonlinearDynamic requested' +\ ' with wrong solution code') "Initialise beam" XBINPUT, XBOPTS, NumNodes_tot, XBELEM, PosIni, PsiIni, XBNODE, NumDof \ = BeamInit.Static(XBINPUT,XBOPTS) "Set initial conditions as undef config" PosDefor = PosIni.copy(order='F') PsiDefor = PsiIni.copy(order='F') "Solve static" BeamLib.Cbeam3_Solv_NonlinearStatic(XBINPUT, XBOPTS, NumNodes_tot, XBELEM,\ PosIni, PsiIni, XBNODE, NumDof,\ PosDefor, PsiDefor) "Write deformed configuration to file" ofile = Settings.OutputDir + Settings.OutputFileRoot + '_SOL312_def.dat' if XBOPTS.PrintInfo == True: sys.stdout.write('Writing file %s ... ' % (ofile)) fp = open(ofile, 'w') fp.write('TITLE="Non-linear static solution: deformed geometry"\n') fp.write('VARIABLES="iElem" "iNode" "Px" "Py" "Pz" "Rx" "Ry" "Rz"\n') fp.close() if XBOPTS.PrintInfo == True: sys.stdout.write('done\n') WriteMode = 'a' BeamIO.OutputElems(XBINPUT.NumElems, NumNodes_tot.value, XBELEM, \ PosDefor, PsiDefor, ofile, WriteMode) "Initialise variables for dynamic analysis" Time, NumSteps, ForceTime, ForcedVel, ForcedVelDot,\ PosDotDef, PsiDotDef,\ OutGrids, PosPsiTime, VelocTime, DynOut\ = BeamInit.Dynamic(XBINPUT,XBOPTS) "Write _force file" ofile = Settings.OutputDir + Settings.OutputFileRoot + '_SOL312_force.dat' fp = open(ofile, 'w') BeamIO.Write_force_File(fp, Time, ForceTime, ForcedVel, ForcedVelDot) fp.close() "Write _vel file" #TODO: write _vel file "Write .mrb file" #TODO: write .mrb file if XBOPTS.PrintInfo.value == True: sys.stdout.write('Solve nonlinear dynamic case in Python ... \n') "Initialise structural system tensors" MglobalFull = np.zeros((NumDof.value, NumDof.value), ct.c_double, 'F') CglobalFull = np.zeros((NumDof.value, NumDof.value), ct.c_double, 'F') KglobalFull = np.zeros((NumDof.value, NumDof.value), ct.c_double, 'F') FglobalFull = np.zeros((NumDof.value, NumDof.value), ct.c_double, 'F') Asys = np.zeros((NumDof.value, NumDof.value), ct.c_double, 'F') ms = ct.c_int() cs = ct.c_int() ks = ct.c_int() fs = ct.c_int() Mvel = np.zeros((NumDof.value, 6), ct.c_double, 'F') Cvel = np.zeros((NumDof.value, 6), ct.c_double, 'F') X0 = np.zeros(NumDof.value, ct.c_double, 'F') X = np.zeros(NumDof.value, ct.c_double, 'F') DX = np.zeros(NumDof.value, ct.c_double, 'F') dXdt = np.zeros(NumDof.value, ct.c_double, 'F') dXddt = np.zeros(NumDof.value, ct.c_double, 'F') Force_Dof = np.zeros(NumDof.value, ct.c_double, 'F') Qglobal = np.zeros(NumDof.value, ct.c_double, 'F') "Initialise rotation operators" Unit = np.zeros((3, 3), ct.c_double, 'F') for i in range(3): Unit[i, i] = 1.0 Unit4 = np.zeros((4, 4), ct.c_double, 'F') for i in range(4): Unit4[i, i] = 1.0 Cao = Unit.copy('F') Temp = Unit4.copy('F') Quat = np.zeros(4, ct.c_double, 'F') Quat[0] = 1.0 "Extract initial displacements and velocities" BeamLib.Cbeam_Solv_Disp2State(NumNodes_tot, NumDof, XBINPUT, XBNODE,\ PosDefor, PsiDefor, PosDotDef, PsiDotDef, X, dXdt) "Approximate initial accelerations" "Initialise accelerations as zero arrays" PosDotDotDef = np.zeros((NumNodes_tot.value, 3), ct.c_double, 'F') PsiDotDotDef = np.zeros((XBINPUT.NumElems,Settings.MaxElNod,3),\ ct.c_double, 'F') "Force at the first time-step" Force = (XBINPUT.ForceStatic + XBINPUT.ForceDyn * ForceTime[0]).copy('F') "Assemble matrices for dynamic analysis" BeamLib.Cbeam3_Asbly_Dynamic(XBINPUT, NumNodes_tot, XBELEM, XBNODE,\ PosIni, PsiIni, PosDefor, PsiDefor,\ PosDotDef, PsiDotDef, PosDotDotDef, PsiDotDotDef,\ Force, ForcedVel[0,:], ForcedVelDot[0,:],\ NumDof, Settings.DimMat,\ ms, MglobalFull, Mvel,\ cs, CglobalFull, Cvel,\ ks, KglobalFull, fs, FglobalFull,\ Qglobal, XBOPTS, Cao) "Get force vector for unconstrained nodes (Force_Dof)" BeamLib.f_fem_m2v(ct.byref(NumNodes_tot),\ ct.byref(ct.c_int(6)),\ Force.ctypes.data_as(ct.POINTER(ct.c_double)),\ ct.byref(NumDof),\ Force_Dof.ctypes.data_as(ct.POINTER(ct.c_double)),\ XBNODE.Vdof.ctypes.data_as(ct.POINTER(ct.c_int)) ) "Get RHS at initial condition" Qglobal += -np.dot(FglobalFull, Force_Dof) "Initial Accel" dXddt[:] = np.dot(np.linalg.inv(MglobalFull), -Qglobal) "Record position of all grid points in global FoR at initial time step" DynOut[0:NumNodes_tot.value, :] = PosDefor "Position/rotation of the selected node in initial deformed configuration" PosPsiTime[0, :3] = PosDefor[-1, :] PosPsiTime[0, 3:] = PsiDefor[-1, XBELEM.NumNodes[-1] - 1, :] "Get gamma and beta for Newmark scheme" gamma = 0.5 + XBOPTS.NewmarkDamp.value beta = 0.25 * (gamma + 0.5)**2 "Time loop" for iStep in range(NumSteps.value): if XBOPTS.PrintInfo.value == True: sys.stdout.write(' Time: %-10.4e\n' % (Time[iStep + 1])) sys.stdout.write(' SubIter DeltaF DeltaX ResLog10\n') "calculate dt" dt = Time[iStep + 1] - Time[iStep] "Update transformation matrix for given angular velocity" Temp = np.linalg.inv(Unit4 + 0.25 * XbeamLib.QuadSkew(ForcedVel[iStep + 1, 3:]) * dt) Quat = np.dot( Temp, np.dot(Unit4 - 0.25 * XbeamLib.QuadSkew(ForcedVel[iStep, 3:]) * dt, Quat)) Quat = Quat / np.linalg.norm(Quat) Cao = XbeamLib.Rot(Quat) "Predictor step" X += dt * dXdt + (0.5 - beta) * dXddt * dt**2 dXdt += (1.0 - gamma) * dXddt * dt dXddt[:] = 0.0 "Force at current time-step" Force = (XBINPUT.ForceStatic + \ XBINPUT.ForceDyn*ForceTime[iStep+1]).copy('F') "Reset convergence parameters" Iter = 0 ResLog10 = 0.0 "Newton-Raphson loop" while ( (ResLog10 > np.log10(XBOPTS.MinDelta.value)) \ & (Iter < XBOPTS.MaxIterations.value) ): "set tensors to zero" Qglobal[:] = 0.0 Mvel[:, :] = 0.0 Cvel[:, :] = 0.0 MglobalFull[:, :] = 0.0 CglobalFull[:, :] = 0.0 KglobalFull[:, :] = 0.0 FglobalFull[:, :] = 0.0 "Update counter" Iter += 1 if XBOPTS.PrintInfo.value == True: sys.stdout.write(' %-7d ' % (Iter)) "nodal diplacements and velocities from state vector" BeamLib.Cbeam3_Solv_State2Disp(XBINPUT, NumNodes_tot, XBELEM, XBNODE, PosIni, PsiIni, NumDof, X, dXdt,\ PosDefor, PsiDefor, PosDotDef, PsiDotDef) "update matrices" BeamLib.Cbeam3_Asbly_Dynamic(XBINPUT, NumNodes_tot, XBELEM, XBNODE,\ PosIni, PsiIni, PosDefor, PsiDefor,\ PosDotDef, PsiDotDef, PosDotDotDef, PsiDotDotDef,\ Force, ForcedVel[iStep+1,:], ForcedVelDot[iStep+1,:],\ NumDof, Settings.DimMat,\ ms, MglobalFull, Mvel,\ cs, CglobalFull, Cvel,\ ks, KglobalFull, fs, FglobalFull,\ Qglobal, XBOPTS, Cao) "Get force vector for unconstrained nodes (Force_Dof)" BeamLib.f_fem_m2v(ct.byref(NumNodes_tot),\ ct.byref(ct.c_int(6)),\ Force.ctypes.data_as(ct.POINTER(ct.c_double)),\ ct.byref(NumDof),\ Force_Dof.ctypes.data_as(ct.POINTER(ct.c_double)),\ XBNODE.Vdof.ctypes.data_as(ct.POINTER(ct.c_int)) ) "Solve for update vector" "Residual" Qglobal += np.dot(MglobalFull, dXddt) \ + np.dot(Mvel,ForcedVelDot[iStep+1,:]) \ - np.dot(FglobalFull, Force_Dof) if XBOPTS.PrintInfo.value == True: sys.stdout.write('%-10.4e ' % (max(abs(Qglobal)))) "Calculate system matrix for update calculation" Asys = KglobalFull + \ CglobalFull*gamma/(beta*dt) + \ MglobalFull/(beta*dt**2) "Solve for update" DX[:] = np.dot(np.linalg.inv(Asys), -Qglobal) "Corrector step" X += DX dXdt += DX * gamma / (beta * dt) dXddt += DX / (beta * dt**2) "Residual at first iteration" if (Iter == 1): Res0_Qglobal = max(abs(Qglobal)) + 1.e-16 Res0_DeltaX = max(abs(DX)) + 1.e-16 "Update residual and compute log10" Res_Qglobal = max(abs(Qglobal)) + 1.e-16 Res_DeltaX = max(abs(DX)) + 1.e-16 ResLog10 = max([np.log10(Res_Qglobal/Res0_Qglobal),\ np.log10(Res_DeltaX/Res0_DeltaX)]) if XBOPTS.PrintInfo.value == True: sys.stdout.write('%-10.4e %8.4f\n' % (max(abs(DX)), ResLog10)) "END Netwon-Raphson" "update to converged nodal displacements and velocities" BeamLib.Cbeam3_Solv_State2Disp(XBINPUT, NumNodes_tot, XBELEM, XBNODE, PosIni, PsiIni, NumDof, X, dXdt,\ PosDefor, PsiDefor, PosDotDef, PsiDotDef) PosPsiTime[iStep + 1, :3] = PosDefor[-1, :] PosPsiTime[iStep + 1, 3:] = PsiDefor[-1, XBELEM.NumNodes[-1] - 1, :] "Position of all grid points in global FoR" i1 = (iStep + 1) * NumNodes_tot.value i2 = (iStep + 2) * NumNodes_tot.value DynOut[i1:i2, :] = PosDefor "END Time loop" "Write _dyn file" ofile = Settings.OutputDir + Settings.OutputFileRoot + '_SOL312_dyn.dat' fp = open(ofile, 'w') BeamIO.Write_dyn_File(fp, Time, PosPsiTime) fp.close() "Write _shape file" ofile = Settings.OutputDir + Settings.OutputFileRoot + '_SOL312_shape.dat' fp = open(ofile, 'w') BeamIO.Write_shape_File(fp, len(Time), NumNodes_tot.value, Time, DynOut) fp.close() if XBOPTS.PrintInfo.value == True: sys.stdout.write(' ... done\n')