The following snippet is a MplWidget class that can be used in PyQt or PySide applications.
It is a QWidget that contains a matplotlib figure and a toolbar.
importmatplotlib.pyplotaspltfrommatplotlib.backends.backend_qtaggimportFigureCanvasQTAggasFigureCanvasfrommatplotlib.backends.backend_qtaggimportNavigationToolbar2QTasNavigationToolbarfrommatplotlib.figureimportFigurefromqtpyimportQtWidgetsclassMplWidget(QtWidgets.QWidget):"""A PyQt/Pyside widget that contains a matplotlib figure"""#: Matplotlib figurefigure:Figure#: Figure canvascanvas:FigureCanvasdef__init__(self,figure:Figure=None,toolbar:bool=True,parent=None,*args,**kwargs):"""Create a new Matplotlib widget Parameters ---------- figure : matplotlib.figure.Figure, optional Figure to use, by default None toolbar : bool, optional Whether to show the toolbar, by default True parent : QtWidgets.QWidget, optional Parent widget, by default None args, kwargs Additional arguments passed to the QWidget constructor """super().__init__(parent,*args,**kwargs)# Figure elementsself.figure=figureorplt.figure()self.canvas=FigureCanvas(self.figure)self.canvas.setParent(self)self.toolbar=NavigationToolbar(self.canvas,self)iftoolbarelseNone# Layoutself.layout=QtWidgets.QVBoxLayout(self)self.layout.setContentsMargins(0,0,0,0)self.layout.addWidget(self.toolbar)self.layout.addWidget(self.canvas)defdraw(self):"""Redraw the figure"""self.canvas.draw()
Go the the Abaqus configuration file abaqus_v6.env or win86_64.env in the Abaqus path, for me, it locates in the following path:
C:\SIMULIA\EstProducts\2021\win_b64\SMA\site
The file is like this:
#-*- mode: python -*-############################################################################## ## Compile and Link commands for ABAQUS on the Windows 64 Platform ## ############################################################################### import os # <-- Debugging# os.environ['GLOBAL_ENABLE_FPE'] = 'TRUE' # <-- Debugging# Location of the /include directory in the ABAQUS installationabaHomeInc=os.path.abspath(os.path.join(os.environ.get('ABA_HOME',''),os.pardir))compile_cpp=['cl','/c','/W0','/MD','/TP','/EHsc','/DNDEBUG','/DWIN32','/DTP_IP','/D_CONSOLE','/DNTI','/DFLT_LIC','/DOL_DOC','/D__LIB__','/DHKS_NT','/D_WINDOWS_SOURCE','/DFAR=','/D_WINDOWS','/DABQ_WIN86_64','%P',# '/O1', # <-- Optimization# '/Zi', # <-- Debug symbols'/I%I','/I'+abaHomeInc]compile_fmu=['win64CmpWrp','-m64','-msvc9','cl','/LD','/D_WINDOWS','/TC','/W0','/I%I','/I'+abaHomeInc]## Fortran compile command for User Subroutinescompile_fortran=['ifort','/c','/fpp','/extend-source','/DABQ_WIN86_64','/DABQ_FORTRAN','/iface:cref','/recursive','/Qauto',# <-- important for thread-safety of parallel user subroutines'/align:array64byte','/Qpc64',# set FPU precision to 53 bit significand'/Qprec-div','/Qprec-sqrt',# improve precision of FP divides and sqrt'/Qfma-',# disable floating point fused multiply-add'/fp:precise',# floating point model: precise'/Qimf-arch-consistency:true',# math library consistent results'/Qfp-speculation:safe',# floating point speculations only when safe'/Qprotect-parens',# honor parenthesis during expression evaluation'/Qfp-stack-check',# enable stack overflow protection checks'/reentrancy:threaded',# important for thread-safety#'/Qinit=zero','/Qinit=arrays', # automatically initialize all arrays to zero#'/Qinit=snan', '/Qinit=arrays', # automatically initialize all arrays to SNAN'/QxSSE3','/QaxAVX',# generate SSE3, SSE2, and SSE instructions# '/Od', '/Ob0', # <-- Disable Optimization for Debugging# '/Zi', # <-- Debugging Information'/include:%I','/include:'+abaHomeInc,'%P']link_sl=['LINK','/nologo','/NOENTRY','/INCREMENTAL:NO','/subsystem:console','/machine:AMD64','/NODEFAULTLIB:LIBC.LIB','/NODEFAULTLIB:LIBCMT.LIB','/DEFAULTLIB:OLDNAMES.LIB','/DEFAULTLIB:LIBIFCOREMD.LIB','/DEFAULTLIB:LIBIFPORTMD.LIB','/DEFAULTLIB:LIBMMD.LIB','/DEFAULTLIB:kernel32.lib','/DEFAULTLIB:user32.lib','/DEFAULTLIB:advapi32.lib','/FIXED:NO','/dll',# '/debug', # <-- Debugging'/def:%E','/out:%U','%F','%A','%L','%B','oldnames.lib','user32.lib','ws2_32.lib','netapi32.lib','advapi32.lib','msvcrt.lib','vcruntime.lib','ucrt.lib']link_exe=['LINK','/nologo','/INCREMENTAL:NO','/subsystem:console','/machine:AMD64','/STACK:20000000','/NODEFAULTLIB:LIBC.LIB','/NODEFAULTLIB:LIBCMT.LIB','/DEFAULTLIB:OLDNAMES.LIB','/DEFAULTLIB:LIBIFCOREMD.LIB','/DEFAULTLIB:LIBIFPORTMD.LIB','/DEFAULTLIB:LIBMMD.LIB','/DEFAULTLIB:kernel32.lib','/DEFAULTLIB:user32.lib','/DEFAULTLIB:advapi32.lib','/FIXED:NO','/LARGEADDRESSAWARE',# '/debug', # <-- Debugging'/out:%J','%F','%M','%L','%B','%O','oldnames.lib','user32.lib','ws2_32.lib','netapi32.lib','advapi32.lib','msvcrt.lib','vcruntime.lib','ucrt.lib']## Link command to be used for ABAQUS/MAKE on machines without the Fortran compiler.## Uncomment it to enable.##link_exe=['LINK', '/nologo', '/INCREMENTAL:NO', '/subsystem:console', '/machine:AMD64', '/NODEFAULTLIB:LIBC.LIB', '/NODEFAULTLIB:LIBCMT.LIB',# '/DEFAULTLIB:OLDNAMES.LIB', '/DEFAULTLIB:MSVCRT.LIB', '/DEFAULTLIB:kernel32.lib', '/DEFAULTLIB:user32.lib', '/DEFAULTLIB:advapi32.lib',# '/FIXED:NO', '/LARGEADDRESSAWARE', '/out:%J', '%F', '%M', '%L', '%B', '%O',# 'oldnames.lib', 'user32.lib', 'ws2_32.lib', 'netapi32.lib',# 'advapi32.lib', 'msvcrt.lib', 'vcruntime.lib', 'ucrt.lib']# Remove the temporary names from the namespacedelabaHomeInc
Uncomment all the lines that end with comment of Debugging.
Add some codes like this to pause at the subroutine after the declaration of variables, like this:
!-------------------------- FOR DEBUGGING ------------------------------------LOGICAL::FIRSTRUN=.TRUE.INTEGER TEMPVARIF(FIRSTRUN==.TRUE.)THEN WRITE(*,*)'PLEASE INPUT A VALUE:'READ(*,*)TEMPVARFIRSTRUN=.FALSE.END IFTEMPVAR=1234
Add a breakpoint in the subroutine file in Visual Studio, resume running the subroutine in the command window, i.e., input the temporary value, the subroutine will stop in Visual Studio, and now you can debug your subroutine in Visual Studio!